跨越彩虹's profile╰☆跨越彩虹,.-~*'¨¯¨'*·~-.¸PhotosBlogLists Tools Help

Blog


    3/19/2005

    听课笔记(四)

     

      今天上了第四次,也是最后一次的SQL的培训。说实话没太听懂,感觉脑袋像浆糊一样,晕晕的,好多东西也都没记下来,笔记需要在头脑清晰且思维比较敏捷的时候来整理,呵呵,不知道还能不能整理出来了~~~

     

    3/12/2005

    听课笔记(三)

     

          今天上完了第三堂SQL的课,改天整理笔记上来。

     

     

    varchar与char的差别:varchar是按链表式开辟空间。char是按内存开辟空间,无论是否存储数据都开辟空间。

    delete与drop table的差别:

    delete from 表 where 条件      删除表中内容

    drop table 表      将表从内存中删除

    insert into 表(字段) value(值)      插入一条记录

    批处理增加:

    insert 表(字段)
    select 字段
    unionAll select 字段
    unionAll select 字段
    ……

    将表1的数据复制到表2:(两个表中的字段类型必须一样)

    insert 表1(字段)
    select 字段 from 表2
    update 表 set 字段=值 from 表2 where 条件

    多表关系查询:1.内连   2.外连   3.全连   4.合并   5.嵌套

    嵌套:通过另一个表的条件显示本表的信息。

    例1:查询60分以下的学生姓名

          学生表:学号,姓名    成绩表:学号,课号,成绩

    select 姓名
    from 学生表
    where 学号 in(select 学号
                        from 成绩表
                        where 成绩<60);

    例2:

    读者表:借书证号,姓名,身份证号,性别,年龄,工作单位,照片

    罚款:借书证号,书号,罚款日期,罚款金额,过期天数

    还书:书号,借书证号,还书日期

    借阅:书号,借书证号,借阅日期

    图书:书号,书名,作者,出版社,数量,单价

    1)查询借阅时间为2003年1月1日以前的读者姓名、年龄和工作单位

    select 姓名,年龄,工作单位
    from dbo.读者
    where 借书证号 in(select 借书证号
                              from dbo.借阅
                              where 借阅日期<‘2003-01-01’);

    2)罚款金额小于200的书名

    select 书名
    from dbo.书名
    where 书号 in(select 书号
                        from dbo.罚款
                        where 罚款金额<200);

    3)借C++的读者姓名、年龄、工作单位

    select 姓名,工作单位,年龄
    from dbo.读者
    where 借书证号 in(select 借书证号
                              from dbo.借阅
                              where 书号 in(select 书号
                                                  from dbo.图书
                                                  where 书名='C++'));

    内连:通过两个表共同的关系,显示两个表的信息。(内连包含嵌套)

    1)select * from 表1 inner join 表2 on 关系 where 条件
       select * from 表1 a inner join 表2 b on 关系 where 条件(将来可用a代替表1,b代替表2)

    例1:select * from 学生表 inner join 成绩表 on 学生表.学号=成绩表.学号
            或   select * from 学生表,成绩表 where 学生表.学号=成绩表.学号

    例2:select *
            from dbo.图书,dbo.借阅
            where dbo.借阅.书号=dbo.图书.书号

    显示读者姓名、借阅时间

    select dbo.读者.姓名,dbo.借阅.借阅时间
    from dbo.读者
    inner join dbo.借阅
    on dbo.读者.借书证号=dbo.借阅.借书证号

    三个表关联:

    select dbo.读者.姓名,dbo.借阅.借阅日期,dbo.图书.书名
    from dbo.读者
    inner join dbo.借阅
    on dbo.读者.借书证号=dbo.借阅.借书证号
    inner dbo.图书
    on dbo.借阅.书号=dbo.图书.书号

    外连(最常用,包含内连)

    左连:left join

    select * from 表1 left join 表2 on 表1.字段=表2.字段

    表1的所有信息全部显示,表2只显示和表1共有的信息。如:

    表a:               表b:             左连后:

    a       b             c       d          a       b       c       d

    1      11            1      11         1      11      1      11
    2      22            4      44         2      22      Null   Null
    3      33            5      55         3      33      Null   Null

    ※左连后显示的表为虚拟表,内存中并不存在。

    新建表a,b(SQL语句)

    drop table a,b

    create table a(a.int,b.int)
    insert a
    select 1,11
    unionAll select 2,22
    unionAll select 3,33

    create table b(c.int,d.int)
    insert b
    select 1,11
    unionAll select 4,44
    unionAll select 5,55

    显示表a,b中内容

    select * from a
    select * from b

    将a,b左连

    select * from a left join b on a.a=b.c

    右连:right join

    全连(两表罗列): full join

    a,b全连后:

    a        b        c        d

    1       11       1       11
    2       22       Null    Null
    3       33       Null    Null
    Null    Null      4       44
    Null    Null      5       55

    select * from a full join b on a.a=b.c

    注:a full join b与b full join a显示结果不一样。

    合并:记录罗列在一起

    select 字段1 from 表1
    union
    select 字段2 from 表2

    注:1)表1,表2字段个数相同且对应的类型一样
          2)字段1,字段2相同

    对库的操作:数据备份,导入、导出

    热备份:

    控制台根目录下,在库上单击右键------->所有任务------->备份数据库,

    SQL Server备份------->库名------->常规------->添加------->文件名,起一个备份文件名,扩展名为.bak,选择备份文件存放的文件夹,确定。

    冷备份:

    把“服务管理器”停了,打开文件夹“Program Files------->MS SQL Server------->MSSQL------->Data”,选择要备份的库文件(*.MDF,*.LDF),复制到别处。

    还原:

    新建库,在库名上点右键------->所有任务------->还原数据库------->从设备,

    单击“选择设备”------->添加,找到备份的文件(*.bak),确定。

    注:1)在“选项”中,应将“物理文件名”,改为备份文件名。
          2)在“选项”中,应将“在现在数据库上强制还原”一项选中。

    导入、导出:

    在库文件上单击右键------->所有任务------->导入(导出)数据------->下一步。

    选择数据源,

    服务器:local为本地服务器,

    在“数据库”中选择要导入(导出)的库,下一步。

    目的:选择一个,如果选择的是Excel或文本文件,应新建一个文件。

    服务器:选择要导入(导出)的服务器,下一步。

    3/6/2005

    听课笔记(二)

     

          今天的课听得有点晕晕的,现在好累,改天再把笔记整理上来吧~~~

     

     

    条件:

    1)字段可以使用运算符 = , > , < , >= , <= , <>
    如 select * from dbo.student where age=30
    2)字段 in (  ,  ,  )
    如 select * from dbo.student where age in (30,27.29)
    3)字段 between   and 
    如 select * from dbo.student where age between 25 and 28
    4)使用通配符
    a.字段 like ‘%b’
    如:查询name字段中最后一位是b的
    select * from dbo.student where name like ‘%b’
    “%”代表若干个字符:
    name like ‘b%’、name like ‘%b%’、name like ‘%b%q’
    b.字段 like ‘_b’
    “_”为下划线,代表一个字符
    5)上堂课讲到的字段的各种变化均可与前四种变化结合使用。
    如 select * from dbo.student where len(name)>=3
    6)使用关系运算符
    [条件] and [条件]
    条件的组合,前四种变化均可使用,如:
    select * from dbo.student where age>31 and name like ‘%b’

    [条件] or [条件]
    and 与 or 均可多个并列使用,也可组合使用:
    [条件] and [条件] or [条件]

    not([条件])
    前面讲到的所有条件均可被not否定。

    2.删除
    delete from [表名] where [条件]
    删除语句中的条件与查询语句中的使用方法一样,如:
    delete from dbo.student where age=30
    delete from dbo.student where name like ‘b%’

    3.更改
    update 表名 set 字段,字段
    update 表名 where 条件
    如:删掉所有大四的学生,其他年级的加1
    delete from dbo.student where grade=4
    update dbo.student set grade=grade+1

    4.插入
    insert into 表名 values(  ,  ,  ),如:
    insert into dbo.student values(520,Felix,12,02)

    表名后面可以列出字段,但要求省略的字段是在数据库设计时可以为空的
    insert into dbo.student(id,name,grade) value(520,Felix,02)


    范式分析
    范式(NF),指导我们在数据库调研中,拆表的工具和规则。
    例:给师大做一个数据库
    学号,姓名,性别,年龄,学生来自哪个省,系,系主任,系主任工资,基本工资,补贴,奖金,课程,教材

    原则:

    1.简单字段(简单域):不允许表内包含表
        所以,系主任工资与基本工资,补贴,奖金不可同时存在于一个表,要单独建立一个工资表。
        而工资表里要是只有基本工资,补贴,奖金这三项,还要知道是给谁的工资,所以,要加上主任的名字。
    第一次拆分结果:
    1)学号,姓名,性别,年龄,省,系,系主任,课程,教材
    2)工资表:基本工资,补贴,奖金,主任名(不用再拆)

    2.唯一依赖
    字段A、B,决定了A即确定了B,叫做B依赖于A。如:A为学号,B为姓名。
    如果一个字段能唯一的决定其他字段(其他字段都能从它推断出来),那么就将此字段设置为主键。
    第二次拆分结果:
    1)学号,姓名,性别,年龄,省,系,系主任
    2)课程基本情况表:课程,教材,课程描述

    3.无传递依赖
    传递依赖:若A---->B,B---->C,则A------------->C
    表中不允许有传递依赖,A---->B,B---->C要分成2个表。
        学号---->系,系---->系主任
    第三次拆分结果:
    1)学生基本情况表:学号,姓名,性别,年龄,省,系
    2)系基本情况表:系,系主任

    4.无多对多
    多对多,如学生与课程之间,一个学生,可以选修多门课,而一门课也可以被多个学生学。
    这种情况下,就要在两个表(学生基本情况表,课程基本情况表)建立一个中间表:选课表
    中间表一般要先把两个表的主键写上,所以,
    选课表:课程,学号,成绩

    5.代码表
    有一些字段的记录种类确定,而且记录容易输入错误,这种情况要建立代码表,如:
    省:省号,省名
    课程:课程号,课程名
    系主任:主任编号,主任名
    代码表原则
    1)易记(编号往往用字符串,如:黑龙江,HLG)
    2)易扩展(位数多些)
    代码表的另一个好处就是,如果记录名字更改,则只改代码表即可。如:要是一万个学生来自黑龙江,若是有一天黑龙江改名为白龙江,那只要在“省”代码表里,将省名改过来就可以,而无须在“学生基本情况”表里,将每一个黑龙江都改为白龙江。
    最后的结果
    学生基本情况表:学号,姓名,年龄,省号,系
    系基本情况表:系,系主任名,主任编号
    工资表:主任编号,主任名,基本工资,补贴,奖金
    课程基本情况表:课程号,课程名,课程描述
    选课表:课程号,学号,成绩
    省:省号,省名
    课程:课程号,课程名
    系主任:主任编号,主任名


    拆分例子:

    给一个酒店做一套管理系统,假设职工只在一个酒店工作。
    职工编号,职工姓名,职工岗位,年龄,工资,加班费,基本工资,奖金,酒店号,酒店老板,老板年龄,员工出生地

    1.简单字段
    工资表:职工号,基本工资,加班费,奖金

    2.唯一依赖
    员工基本情况表:职工号,职工名,年龄,酒店号,省号

    3.无传递依赖
    酒店基本情况:酒店号,酒店名,地址,老板号
    企业经营者基本情况:老板号,老板名

    4.无多对多

    任职情况表:员工号,岗位号
    岗位表:岗位号,岗位名,岗位描述

    2/27/2005

    听课笔记(一)

     

    一.熟悉SQL Sever 平台环境

    1.服务管理器

     启动:开始 ------->程序 ------->SQL Sever ------->服务管理器

     服务器名:建议先接到自己的机器上。(我的电脑 ------->属性 ------->网络标识)

    2.企业管理器

     新建库(库名:school)

     新建表(表名:student)

     字段:          类型:          长度:          可否为空:

        id                 int      4      

       name          varchar            8

       age               int                4       √

     gradeint         int                4

    将“id”字段设置为主键(在该字段上单击右键 ------->设置主键)。

    主键:不可重复的字段,并且不可为空。

    录入数据:在表上单击右键 -------> 打开表------->返回所有行。

    二.SQL语句

    1.查询

    启动“查询分析器”:在“企业管理器”窗口,“工具”------>“SQL查询分析器”

    查询语句:

    select  字段名 from 表名 where 条件

    例:

    select  age  from  dbo.student  where  age=25

    select  name  from  dbo.student  where  grade=4

    (库名要选择shcool,dbo指权限,dbo.student可以从左边窗口的“树”中拖拽)

    字段名:

    1) * 选择所有字段  例:select  *  from  dbo.student

    2) 选择某个字段,如 name。例:select  name  from  dbo.student

    3) 选择多个字段,如 id,name (逗号为英文状态下)。可包含*,可以重复。

     上机实验,看看下面两条语句的输出结果有何不同:

     select  id,name  from  dbo.student

       select  name,id  from  dbo.student

    4) 字段重命名,如 id  as  iidd 。支持中文。例:select  id  as  学号  from  dbo.student

      可与3)结合使用:

      select  id  as 学号,name  as  姓名,age  as  年龄,grade  as  年级  from  dbo.student

    5) 运算,如 age-grade+1。例:select  name  as  姓名,age-grade+1  as  入学年龄  from  dbo.student

        select  3500*12*(1-0.15)  as  年薪
      (不涉及表的操作,可以去掉from,只显示一行,相当于计算器。)

    6) 在字段名前加 distinct ,如 distinct grade 。distinct 表示“唯一的”,如果有重复的记录,则只显示一个。

    7) top n * ,显示前n条记录。

    8) 表名.字段 ,多个表时使用。

    9) 函数(字段)

      各函数的用法,可参考帮助。(查询分析器里,帮助------>目录与索引------>索引,然后输入函数名,回车后即可看到用法。)

    一些常用的函数:

    len( )

    select  len(name)  from  dbo.student

    left( )

    select  left(name,1)  from  dbo.student

    select  distinct  left(name,1)  from  dbo.student

    select  left(name,1)+'先生'  from  dbo.student

    right( )

    select  right(name,1)+'先生'

    lower( )upper( )substring( )cast( )get data()convert( )ltrim( )stuff( )charindex( )dateadd( )dateiff( )

    10) 聚组函数

        max( )

      select  max(age)  as  最大年龄  from  dbo.student

        min( )

        select  min(age)  as  最小年龄  from  dbo.student

        avg( )

        select  avg(age)  as  平均年龄  from  dbo.student

        sum(  )

        select  sum(age)  as  年龄总和  from  dbo.student

     以上四个函数的参数要求为数值型!

        count(*)  

      求记录总数, * 指可为任意型