SQL笔记


1. Sql语句的动词:

       功能                  动词
     数据查询             select
     数据定义             create、drop、alter                //alter 修改表名或字段名
     数据操纵             insert、update、delete
     数据控制             grant、revoke                      //grant 授予权限    revoke 收回权限
     
---------------------------------------------------------------------------------------------------------------------------------
2. Sql的数据类型:
    char(n)、character(n)                      长度为n的字符串
    varchar(n)、charactervarying(n)            最大长度为n的变长字符串
    clob                                       字符串大对象
    blob                                       二进制大对象
    int、integer                               长整数(4字节)
    smallint                                   短整数(2字节)
    bigint                                     大整数(8字节)
    number(p,d)、decimal(p,d),dec(p,d)         定点数,一共有p位数字(不包括符号、小数点),小数点后面有d位数字
    real                                       取决于机器精度的单精度浮点数
    double precision                           取决于机器精度的双精度浮点数
    float(n)                                   精度至少为n位数字的浮点数
    boolean                                    逻辑bool量
    date                                       日期,包含年月日,格式:YYYY-MM-DD
    time                                       时间,包含时分秒,格式:HH:MM:SS
    timestamp                                  时间戳类型
    interval                                   时间间隔类型
    
---------------------------------------------------------------------------------------------------------------------------------
3.一个关系型数据库管理系统的实例可以建立多个数据库,一个数据库可以建立多个模式,一个模式下通常包括多个表、视图、索引等数据库对象。

    (1)模式的定义和删除
        
        定义模式:create schema <模式名> authorization <用户名>;
    
                    eg: create schema "S-T" authorization wang;              //为用户wang创建一个模式,名为S-T
                    
                    注:
                        创建模式需要提前获得Create schema权限;
                        未指定模式名时,模式名默认和用户名相同;
                        
        删除模式:drop schema <模式名> <cascade | restrict>;
        
                  cascade 和 restrict 二者必选其一; 
                  cascade 表示删除当前模式时连同模式下的所有对象一起删除;
                  restrict 表示如果当前模式下有其他对象,则不执行删除模式语句,直到该模式下没有任何对象时才能删除;
                  
                  eg: drop schema zhang cascade;              //删除模式zhang以及模式zhang下的所有对象
    (2)基本表的定义、删除、修改
        
        定义表:create table <模式名>.<表名> (<列名> <数据类型> [列级完整性约束条件],
                                      <列名> <数据类型> [列级完整性约束条件],
                                      ... ,
                                      <表级完整性约束条件>);
                eg;create table student (Sno char(9) primary key,    /* 列级完整性约束条件,Sno是主码 */
                                          Sname char(20) unique,      /* Sname取唯一值 */
                                          Ssex char(2),
                                          Sage smallint,
                                          Sdept char(20)
                                         );
                    create table course (Cno char(4) primary key,     /* 列级完整性约束条件,Cno是主码 */
                                         Cname char(40) not null,     /* 列级完整性约束条件,Cname不能取空值 */
                                         Cpno char(4),
                                         Ccredit smallint,
                                         foreign key (Cpno) references course(Cno)  /* 表级完整性约束条件,Cpno是外码,被参照表是Course,被参照列是Cno */
                                         );
                    create table sc (Sno char(9),
                                     Cno char(4),
                                     Cgrade smallint,
                                     primary key(Sno,Cno),   /* 主码由两个属性组成,必须作为表级完整性进行定义 */
                                     foreign key(Sno) references Student(Sno), /*表级完整性约束条件,Sno是外码,被参照表是Student */
                                     foreign key(Cno) references Course(Cno)   /*表级完整性约束条件,Cno是外码,被参照表是Course */
                                     );
                    create table "S-T".Student(...);        //再S-T模式下创建表Student
                    
        删除表:drop table <表名> [restrict | cascade];    
                
                restrict表示该表的删除有限制条件,如果当前表被其他表所引用(如check、foreign key等约束),有视图、触发器或者有存储过程或函数等,均不能被删除;
                cascade表示该表的删除没有限制条件,删除当前表时连同依赖对象,如视图都将一起被删除;
                默认情况是restrict;
                
        修改表:alter table <表名> 
                    [add <新列名> <数据类型> [完整性约束]]                    //新增一列
                    [add <表级完整性约束>]                                     //新增标记完整性约束条件
                    [drop <列名> [restrict | cascade]]                         //删除一列
                    [drop constraint <完整性约束名> [restrict | cascade]]      //删除完整性约束条件
                    [alter column <列名> <数据类型>];                         //修改(列名或数据类型)
            
            eg: alter table Student add S_entrance date;                //向Student表新增一列S_entrance,数据类型为日期型
                alter table Student alter column Sage int;              //将Student表中的Sage列的数据类型改为int型
                alter table Course add unique(Cname);                   //给Course表的Cname列增加取唯一值的约束条件

---------------------------------------------------------------------------------------------------------------------------------
4、索引:当表的数据量较大时,查询操作会比较费时,建立索引是加快查询速度的有效手段。

    (1) 建立索引
            create [unique] [cluster] index <索引名> on <表名> (<列名> [<次序>],<列名> [<次序>], ...);

        unique: 表示此索引的每一个索引值之对应唯一的数据记录;
        cluster: 表示要建立的索引是聚簇索引;
        次序:(desc  ->   降序)、(asc  ->  升序)默认是升序
    (2) 修改索引
            alter index <旧索引名> rename to <新索引名>;
    (3) 删除索引
            drop index <索引名>;
            
----------------------------------------------------------------------------------------------------------------------------------
5、数据查询
    
    (1) 一般格式为:
    
            select [all | distinct] <目标列表达式>,[,<目标列表达式>, ...]              //all:保留结果中重复行;   distinct:消除结果中重复行
            from <表名或视图名> [,<表名或视图名>, ...] | <select语句> [as] <别名>
            [where <条件表达式>]
            [group by <列名1> [having <条件表达式>]]                                    //分组
            [order by <列名2> [asc | desc]];                                            //排序,默认升序
        
    (2) 选择表中若干列:
    
            select Sno,Sname from student;    //Sno和Sname的顺序可以与表中的顺序不同,先写哪个结果就先显示哪个
            select Sname,Sno from student;
            select * from student;           //* 代表所有列
            
    (3) 查询经过计算的值:
    
            select Sname Name,'year of birth:' Birth,2014-Sage Birthday,lower(Sdept) Department from student;
            
        上面语句中:Name是Sname的别名,结果中的列名会是Name,而不是Sname,Birth、Birthday、Department同理;
                    Sql语句中字符串用单引号'';
                    select 子句中的<目标列表达式>不仅可以是表中的属性列,也可以是表达式,比如上面的2014-Sage;
                    lower 的作用是大写转小写
                    
    (4) 常用的查询条件
    
        ----------------------------------------------------------------------------------------------
                查询条件                                       谓词
        ----------------------------------------------------------------------------------------------
                  比较             =,>,<,>=,<=,!=,<>,!>,!<       ("<>"也是不等于)
                确定范围           between and , not between and          (between and 是闭区间)
                确定集合           in , not in 
                字符匹配           like , not like
                  空值             is null , is not null 
            多重条件(逻辑运算)     and , or , not
        ----------------------------------------------------------------------------------------------
        
     eg:
        select Sname from student where Sage between 20 and 23;            //查询年龄在20~23岁之间的学生姓名
        select Sname from student where Sage not between 20 and 23;        //查询年龄不在再20~23岁之间的学生姓名

        select Sname from student where Sdept in ('CS','MA','IS');         //查询CS、MA、IS系所有学生姓名
        select Sname from student where Sdept not in ('CS','MA','IS');     //查询除CS、MA、IS系以外的所有学生姓名
        
        select Sno,Cno from SC where Grade is null;         //注意这里的 is 不能用 = 代替
        select Sno,Cno from SC where Grade is not null;
        
        select Sname from student where Sdept='CS' and Sage<20;
        select Sname from student where Sdept='CS' or Sdept='MA';
        
    (5) 字符串匹配
    
            [not] like '<匹配串>' [escape '<换码字符>']
        含义是查找指定的属性列值与<匹配串>相匹配的元组,<匹配串>可含有通配符 % 和 _ ;
            % : 任意长度字符
            _ : 任意单个字符      // 数据库字符集为ASCII时一个汉字需要两个 _ ; 字符集为GBK时只需要一个 _ ;
        
        如果用户用户要查询的字符串本身就含有通配符 % 或 _ ,这时就要使用[escape '<换码字符>']短语对通配符进行转义了;
        eg:
            select Cno,Ccredit from Course where Ccname like 'DB\_Design' escape '\';
        escape '\'表示'\'为换码字符。这样匹配串中紧跟在'\'后面的字符'_'不再具有通配符的含义,转义为普通的'_'字符;
        
    (6) order by子句 
    
        作用:对查询结果按照一个或多个属性列的升序或降序排列,默认升序;
        eg:
            select * from Student order by Sdept,Sage desc;         //查询结果按系号升序,同一系按年龄降序排列
        
        注:对于空值排序时的次序由具体系统实现决定,各个系统的实现可以不同,只要保持一致就行
        
    (7) 聚集函数
    
            count(*)                                     统计元组个数
            count([distinct | all] <列名>)               统计一列中值的个数
            sum([distinct | all] <列名>)                 计算一列值的总和(此列必须是数值类型)
            avg([distinct | all] <列名>)                 计算一列值的平均值(此列必须是数值类型)
            max([distinct | all] <列名>)                 求一列值中的最大值
            min([distinct | all] <列名>)                 求一列值中的最小值
        
        注意:
            当聚集函数遇到空值时(count(*)除外),都跳过空值而只处理非空值;
            where 子句中是不能用聚集函数作为条件表达式的,聚集函数只能用于select子句和group by中的having 子句;
            
    (8) group by子句
    
        作用:将查询结果按某一列或多列进行分组,值相等的为一组;
        目的:细化聚集函数的作用对象;
              如果未分组,聚集函数将作用于整个查询结果;
              分组后聚集函数将作用于每一个组,即每一组都有一个函数值。
        eg:
            select Sno,avg(Grade) from SC group by Sno having avg(Grade)>=90;         //查询平均成绩大于90分的所有学生学号和平均成绩
        
        where子句和having短语的区别:
            作用对象不同,where子句作用于基本表或视图,从中选择满足条件的元组;having短语作用于组,从中选择满足条件的组。
    
---------------------------------------------------------------------------------------------------------------------------------
6、连接查询
    (1) 等值与非等值连接查询
    
        连接查询的where子句中用来连接两个表的条件成为连接条件或连接谓词,其一般格式为:
            [<表名1>.]<列名1><比较运算符>[<表名2>.]<列名2>
            
        注:    
            比较运算符为 = 时,称为  等值连接 ;其他称为  非等值连接 ;
            连接谓词中的列名称为连接字段,连接条件中的各连接字段类型必须是可比的。但名字不必相同。
            若在等值连接中把目标列中重复的属性列去掉则称为  自然连接。
        eg:
            select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade             //查询每个学生及其选修课程的情况
            from Student,SC 
            where Student.Sno=SC.Sno;
    
    (2) 自身连接(一个表与自己进行连接)
        eg:
            查询先修课的先修课,要为表取两个别名,一个First,另一个是Second
            select First.Cno,Second.Cpno
            from Course First,Course Second
            where First.Cpno=Second.Cno;
        
    (3) 外连接(outer join)
        定义:
            外连接:如果把悬浮元组也保存在结果关系中,而在其他属性上填上空值null,那么这种连接叫做外连接; outer join
            左外连接:如果只想保留左边关系中的悬浮元组叫做左外连接;left out join;
            右外连接:如果只想保留右边关系中的悬浮元组叫做右外连接;right out join;
        eg1:
                   R                       S
            ----------------          ------------
             A     B     C                B     E
            ----------------          ------------
            a1    b1     5              b1    3
            a1    b2     6              b2    7
            a2    b3     8              b3    10
            a2    b4     12            b3    2
            ----------------              b5    2
                                            ------------

                      外连接                                  左外连接                                  右外连接
            -------------------------                -------------------------                 -------------------------
              A      B      C      E                   A      B      C      E                    A      B      C      E
            -------------------------                -------------------------                 -------------------------
              a1     b1     5      3                   a1     b1     5      3                    a1     b1     5      3
              a1     b2     6      7                   a1     b2     6      7                    a1     b2     6      7 
              a2     b3     8      10                 a2     b3     8      10                  a2     b3     8      10
              a2     b3     8      2                   a2     b3     8      2                    a2     b3     8      2
              a2     b4     12    NULL            a2     b4     12    NULL            NULL   b5     NULL   2      
              NULL   b5     NULL   2           --------------------------                ------------------------- 
            -------------------------
        eg2:查询每个学生及其选修课程的情况;
            
            select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
            from Student left outer join SC on(Student.Sno=Sc.Sno);           
            //也可以使用using来去掉结果中的重复值:from Student left outer join SC using(Sno);
            //from <表名1> [left | right] outer join <表名2> [on <连接条件> | using <列名>];

    (4) 多表连接:两个表及以上的表进行连接
            
        eg:查询每个学生的学号、姓名、选修课程名称及成绩
            select Student.Sno,Sname,Cname,Grade
            from Student,Course,SC
            where Student.Sno=SC.Sno and SC.Cno=Course.Cno;
            
---------------------------------------------------------------------------------------------------------------------------------
7、嵌套查询 (实际应用中能用连接运算表达的查询尽可能采用连接运算。)
    在Sql语言中,一个select-from-where语句称为一个查询块,将一个查询块嵌套在另一个查询块的where子句或having短语的条件中的查询称为嵌套查询。
    例如:
        select Sname from Student where Sno in     //外层查询,也叫父查询
        (select Sno from SC where Cno='2');        //内层查询,也叫子查询  
 
    (1) 带有IN谓词的子查询
        eg:查询与"刘晨"在同一个系的学生
            select Snow,Sname,Sdept
            from Student
            where Sdept in                          //子查询结果只有一个值时,可以用 = 代替in;
                (select Sdept 
                 from Student 
                 where Sname=‘刘晨’);
                 
          本例中的查询也可以用自身连接完成:
            select S1.Sno,S1.Sname,S1.Sdept
            from Student S1,Student S2
            where S1.Sdept=S2.Sdept and S2.Sname='刘晨';

        可见,实现同一个查询请求可以有多种方法,不同的方法执行效率也会不同,甚至会差别很大,这就是数据库编程人员应该掌握的数据库性能调优技术;
        有些嵌套查询可以用连接运算替代,有些是不能替代的,实际应用中能用连接运算表达的查询尽可能采用连接运算。

        相关子查询:子查询的查询条件依赖于父查询;
        不相关子查询:子查询的查询条件不依赖于父查询;
    (2) 带有比较运算符的子查询
        eg:找出每个学生超过自己平均成绩的课程的课程号
            select Cno 
            from SC x 
            where Grade >= 
                (select avg(Grade)             //这是个相关子查询
                from SC y 
                where y.Sno=x.Sno);

    (3) 带有ANY(SOME)或 ALL谓词的子查询(使用ANY或ALL谓词时必须同时使用比较运算符)
        
        子查询返回单值可以用比较运算符,但返回多值时要用ANY(有的系统用SOME)或ALL谓词修饰符。
        ANY代表某一个,ALL代表所有
        
        eg:查询非计算机系中比计算机系所有学生年龄都小的学生姓名及年龄
            select Sname,Sage
            from Student
            where Sage < all
                (select Sage
                from Student
                where Sdept='CS');
    (4) 带有EXISTS谓词的子查询(不返回任何数据,只产生逻辑真true或逻辑假false)
        
        eg: 查询所有选修了1号课程的学生姓名
            select Sname 
            from Student
            where exists
                (select *
                 from SC
                 where Sno=Student.Sno and Cno='1'
                );
            这个SQL语句的处理过程是:先取外层查询Student表中的第一个元组,根据它与内层查询相关的属性值(Sno)处理内层查询,
        如果where子句的返回值是真true,则取外层查询中该元组的Sname放入结果表;然后再取下一个元组,重复这一过程,直到外层
        Student表全部检查完为止。

----------------------------------------------------------------------------------------------------------------------------------
8、集合查询
    
    select语句的查询结果也是元组的集合,所以多个select语句的结果可进行集合操作;
    集合操作主要包括union(并操作)、intersect(交操作)、except(差操作);
    注意:
        参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同;

    eg:查询计算机科学系的学生及年龄不大于19岁的学生。
        select * from Student where Sdept='CS'
        union                                    //使用union执行并操作时,系统会自动去掉重复元组,想要保留使用union all操作符
        select * from Student where Sage<=19;
        
---------------------------------------------------------------------------------------------------------------------------------
9、基于派生表的查询

    子查询不仅可以出现在where子句中,还可以出现在from子句中,这时子查询生成的临时派生表成为主查询的查询对象。
    
    eg:
        select Sno,Cno
        from SC,(select Sno,avg(grade) from SC group by Sno) as Avg_sc(avg_sno,avg_grade)
        where SC.sno=Avg_sc.avg_sno and SC.grade >= Avg_sc.avg_grade;
        //这里from子句的子查询将生成一个派生表Acg_sc,该表由avg_sno和avg_grade两个属性组成,主查询将SC表与Avg_sc按学号相等进行连接;
        
    需要说明的是,通过from子句生成派生表时,as 关键字可以省略,但必须为派生关系指定一个别名。而对于基本表,别名是可选择项。

----------------------------------------------------------------------------------------------------------------------------------
10、插入数据
    (1)插入元组
        
        insert into <表名> ([<属性列1>,<属性列2>, ...])
        values(<常量1>,<常量2>, ...);                  //字符串常量用单引号''
        
        eg:
            insert into Student(Sno,Sname,Ssex,Sdept,Ssge)
            values('20121528','陈冬','男','IS',18);    
            
            insert into SC(Sno,Cno) values('20121538','1');  //属性列于常量要一一对应,系统会自动给Grade列补上空值NULL
            insert into SC values('20121538','1',NULL);      //如果省略属性列,values需要按顺序全部列出,空值写NUll
            
    (2)插入子查询结果
        
         insert into <表名> ([<属性列1>,<属性列2>, ...]) 
         <子查询语句>

        eg:对每一个系,求学生的平均年龄,并把结果存入数据库
            create table Dept_age(Sdept char(5),Avg_age smallint);   
            insert into Dept_age(Sdept,Avg_age) 
                select Sdept,avg(Sage) from Studnet group by Sdept;

---------------------------------------------------------------------------------------------------------------------------------
11、修改数据
    
    一般格式:
        update <表名> set <列名>=<表达式> [,<列名>=<表达式>, ...] [where <条件>];
        
    (1) 修改某一个元组的值
        eg: 将学生20121521的年龄改为22岁
            update Student set Sage=22 where Sno='20121521';
    (2) 修改多个元组的值
        eg: 将所有学生的年龄都增加一岁
            update Student set Sage=Sage+1;
    (3) 带子查询的修改语句
        eg: 将计算机科学系所有学生的成绩置零
            update SC set Grade=0 where Sno in(select Sno from Student where Sdept='CS');

---------------------------------------------------------------------------------------------------------------------------------
12、删除数据
    
    一般格式:
        delete from <表名> [where <条件>];         //delete 删除的是表中的数据而不是表的定义;

    (1) 删除某一个元组的值
        eg: 删除学号为201215128的学生记录
            delete from Student where Sno='201215128';
    (2) 删除多个元组的值
        eg: 删除所有学生的选课记录
            delete from SC;
    (3) 带子查询的删除语句
        eg: 删除计算机系所有学生的选课记录
            delete from SC where Sno in (select Sno from Student where Sdept='CS');
            
----------------------------------------------------------------------------------------------------------------------------------        
13、空值的处理,以下几种情况可能产生空值:
    (1) 该属性应该有一个值,但目前不知道它的具体值;
    (2) 该属性不应该有值;
    (3) 由于某种原因不方便填写;
    
    空值的判断:判断一个属性是不是空值,用 is null 和 is not null来表示;
        eg: 找出年龄未知的学生信息
            select * from student where Sage is null;
            
    空值的约束条件:
        属性定义(或者域定义)中有 not null 约束条件的不能取空值,加了unique限制的属性不能取空值,码属性不能取空值。
        
    空值的算术运算、比较运算和逻辑运算
        空值与另一个值的算数运算结果为空值,比较运算结果为unknown。有了unknown后,传统的逻辑运算中的二值逻辑(true、false)逻辑就扩展成了三值逻辑。
    查询语句中,只有where和having子句中的选择条件为true的元组才被选出作为输出结果。
            
----------------------------------------------------------------------------------------------------------------------------------    
14、视图        
    
    (1) 概念
        视图是一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库中值存放视图的定义,而不存放视图中对应的数据,这些数据仍存放在
    原来的基本表中。所以一旦基本表中的数据发生变化,从视图中查询的数据也就随之改变了。从这个意义上将,视图就像一个窗口,透过它可以看到数据库中自
    己感兴趣的数据及其变化。视图一经定义,就可以和基本表一样被查询、删除,也可以在一个视图上再定义新的视图,但对视图的更新(增、删、改)操作则有
    一定的限制。
    
    (2) 建立视图
        
        一般格式: create view <视图> [(<列名> [<列名>] ...)]       //视图中的属性列名要么全写,要么全省略
                   as <子查询>
                  [with check option];
            
        其中,子查询可以是任意的select语句,是否可以含有order by子句和distinct短语则要取决于具体系统的实现。
        with check option表示对视图进行update、insert、delete操作时要保证更新、插入和删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)
        如果省略了视图的各个属性列名,则隐含该视图由子查询中select子句目标列中的字段组成;
        下列三种情况下必须指明组成视图的所有列名:
            1、某个目标列不是单纯的属性名,而是聚集函数或列表达式;
            2、多表连接时选出来几个列名作为视图的字段;
            3、需要在视图中为某个列启用新的名字。
        
        eg1:建立信息系学生视图
            create view IS_Student as select Sno,Sname,Sage from student where Sdept='IS';     //本例省略了视图属性名,隐含由子查询中的Sno,Sname,Sage构成
        
        eg2:建立信息系学生视图,并要求进行修改和插入操作时仍然需要保证该视图只为信息系的学生
            create view IS_Student as select Sno,Sname,Sage from student where Sdept='IS' with check option; 
            //由于在定义IS_Student视图时加上了with check option子句,以后对该视图操作时,关系数据库管理系统会自动加上Sdept='IS'的条件。
            
        视图不仅可以建立在一个或多个基本表上,也可以建立在一个或多个已定义的视图上,或建立在基本表与视图上。
        
    (3) 删除视图
            
            格式:drop view <视图名> [cascade];
            
        视图删除后视图的定义将从数据字典中删除。如果该视图上还导出了其他视图,则使用cascade级联删除语句把该视图和由它导出的视图一起删除。
        基本表删除后,由该基本表导出的所有视图均无法使用了,但是视图的定义没有从字典中清除。删除这些视图定义需要显式地使用drop view语句。
        
    (4) 查询、更新视图    
        
        操作同基本表,关键字select、insert、update、delete
        
    (5) 视图的作用
    
            1.简化用户操作
            2.使用户能以多种角度看待同一数据
            3.视图对重构数据库提供了一定程度的逻辑独立性
            4.视图能对机密数据提供安全保护
            5.适当利用视图可以更清晰地表达查询
        
---------------------------------------------------------------------------------------------------------------------------------

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值