一、基本表的操作:

1、基本表创建:

       CREATE TABLE <基本表名>

         (  <列名      数据类型>,

              ....  ....

              <    完整性约束   >,

          PRIMARY  KEY  (列名 ),

          FOREIGN  KEY  (列名 )   REFENRENCES < 表名> (列名));

         备注:PRIMARY  KEY  (列名 ) 设置主键;FOREIGN  KEY  (列名 )设置外键;REFENRENCES < 表名> (列名)外键与哪个表对应


2、基本表修改:

       ALTER TABLE < 基本表名 > ADD <列名> < 类型>   向表中添加新的列

ALTER TABLE < 基本表名 > DROP <列名> < 类型> [ CASCADE | RESTRTCT ]     删除某列

ALTER TABLE < 基本表名 >  ALTER  column   [列名]   [列类型]    修改表的字段类型

3、删除基本表:

       DROP TABLE < 基本表名>[ CASCADE | RESTRTCT ]   

4、创建表的索引:

CREATE  [ UNIQUE ]  INDEX  < 索引名>  ON  <基本表名>  ( <列名序列 > )

备注:UNIQUE表示每个索引值对应卫衣的数据记录

二、基础查询语句:

(一)语句格式:

 1、关系代数表达式:πA1,A2,...An( δF ( R1×R2×...Rn )  )

     对应SELECT语句:SELECT  A1,A2,...An

                                            FROM   R1×R2×...Rn 

                                            WHERE    F

        备注:A1,A2,...An表示:要查询的内容

                    F   表示:查询的条件

R1×R2×...Rn  表示:与查询相关的基本表

 2、SELECT完整句法:

       SELECT  <  目标表的列名或列表达序列 >

        FROM  < 基本表名和(或)视图序列 >

        [ WHERE < 行条件表达式 >  ]

        [ GROUP  BY < 列名序列  >  ]

组条件表达式

        [  ORDER  BY < 列名 [ ASE | DESC ]  >  ,...]

     备注:[  ]  :括号的内容视情况而定,不必须有。

表示升序排列;DESC :表示降序排列。


(二)举例说明:

           先给出一个小型的数据库(包含几个关系模式)

            教师关系T(T#,TName,T)

            课程关系C(C#,CNAME,T#)

            学生关系S(S#,SNAME,AGE,SEX)

            选课关系SC(S#,C#,SCORE)

1、检索学习课程号为C2 课程的学生学号和姓名

 连接查询:SELECTS.S#,SNAME

                          FROM   S, SC

                          WHERE  S.S# = SC.S#  AND   C# = ' C2 ' ;

 备注: S.S# 为了区别要查询的是S表中的S#。

                       S.S# = SC.S#  表示 S表的主键S#对应SC表的外键S#,从而把两个表联系起来。

嵌套查询:SELECT S#,SNAME

                          FROM   S

                          WHERE  S#  IN ( SELECT S# 

                                                        FROM  SC 

                                                         WHERE  C# = ' C2 ' ) ;


2、检索学习课程为C2的学生学号与成绩   

S#,SCORE

         FROM    SC

         WHERE   C# = ' C2 ' ;

3、检索至少选修刘老师的所授课程一门课程的学生学号与姓名

      SELECT   S.S# , SNAME 

       FROM   S ,SC ,C , T

       WHERE  S.S3 = SC.S#  AND  SC. C# = C.C# 

                        AND    C.T# = T.T#  

4、检索选修课程为C2或者C4课程的学生学号  

         SELECT   S#

         FROM      SC

         WHERE    C# = ' C2 '  OR C# = ' C4 '  ;

5、检索至少选修课程号为C2和C4课程的学生学号    

         SELECT  X. S#

 AS X , SC  AS  Y

         WHERE   X.S# = Y.S#   AND  X.C# = ' C2 '  AND   Y.C# = ' C4 '

备注:同一个基本表SC在同一层中出现两次,为加以区别,引入别名 X 和 Y 。也可以看成是定义了两个元组变量X和Y。在语句中对列名加以限定,譬如X.S#。As关键字可省略,直接写成 SC X, SC Y。

6、检索不学C2课程的学生学号

         SELECT  SNAME ,AGE
         FROM    S 
         WHERE   S#  NOT  IN (SELECT S# 

                                                    FROM  SC

                                                    WHERE  C#= ' C2 ');

    或者:

SELECT  SNAME ,AGE
         FROM    S 
         WHERE    NOT  EXISTS (SELECT  ❈

                                                        FROM   SC

                                                        WHERE  SC.S# = S.S#   AND  C# = ' C2 ');



备注:这个查询不能使用连接查询。      

(三)包含函数的举例说明:

           SQL 提供以下聚合函数:

            COUNT( ❈)  计算元组个数

            COUNT( <列名>)    对一列的值计算个数

<列名>)          求和 (列的值必须是数值型)

<列名>)          求平均值 (列的值必须是数值型)

<列名>)          求某一列最大值

<列名>)           求某一列最小值

       备注: 在聚合函数遇到空值时,除了COUNT(*)外,都跳过空值去处理非空值。

1、  求男同学总人数和平均年龄

       FROM  S 

       WHERE   SEX = ' M' ;    

2、  统计选修了课程的学生人数

        SELECT  COUNT ( DISTINCT  S#  )  

        FROM  SC ;

备注:DISTINCT 去除重复的

3、算数比较操作:

        在基本表S中检索18~20岁的学生姓名

         SELECT   SNAME 

         FROM   S

         WHERE   AGE >= 18 AND  <= 20 ;

         (还可以写成:WHERE AGE BETWEEN  18  AND  20 )

备注:类似的,不在某个范围用 "NOT   BETWWEEN ... AND ..."。

4、在基本表S中检索年龄为空值的学生姓名

       SELECT   SNAME

       FROM  S

       WHERE   AGE   IS  NULL ;

备注:“ IS NULL ” 是测试列值是否为空值。如果测试非空值,可用“ IS  NOT  NULL ”。

   

  三、数据插入语句:  

 1、 单元组的插入:

        INSERT  INTO  < 基本表名  > [ ( < 列名序列 > ) ]

              VALUES  ( <  元组值  >  )  

2、多元组的插入:  


        INSERT  INTO  < 基本表名  > [ ( < 列名序列 > ) ]

              VALUES  ( <  元组值  >  )  ,( <  元组值  >  ) ......( <  元组值  >  ) 


3、查询结果的插入:     


       INSERT  INTO  < 基本表名  > [ ( < 列名序列 > ) ]

             < SELECT 查询语句  >

4、表的插入:


[ ( < 列名序列 > ) ]

              TABLE  < 基本表名 2  > 

 例1:往基本表S 中插入一个元组(S36,GU,20,M)

           INSERT  INTO  S (  S# , SNNAME , AGE , SEX )

                    VALUES ( 'S36','GU',20,' M ' ) ;

备注:如果插入的是一个完整的序列,那么基本表后面的 [ ( < 列名序列 > ) ] 可省略。

四、数据修改语句:  

           数据修改语法格式:

          UPDATE  < 基本表名>

           SET < 列名 > = < 值表达式 > [ , < 列名 > = < 值表达式 > ... ] | ROW = (< 元组 >)

           [ WHERE < 条件表达式 > ]

  例1:把C5的课程名改为DB

          UPDATE C

           SET CNAME = ' DB '

          WHERE  C# =  ' C5 ' ;

例2: 把女同学的成绩提高 5%

          UPDATE  SC

          SET SCORE = SCORE * 1.05

          WHERE S# IN ( SELECT  S# 

                                      FROM   S 

                                       WHERE  SEX  = ' F ' ) ;

例3:当C4课的成绩低于该门课程的平均成绩时,提高5%        


          UPDATE  SC

          SET  SCORE = SCORE * 1.05

          WHERE C# = ' C4 ' AND SCORE < ( SELECT  AVG ( SCORE )

                                                                          FROM  SC 

                                                                           WHERE  C# = 'C4' ) ;

例4:在C中,把课程号为C5 的元组修改为(C5,DB,T3)

           UPDATE   C

            FROM   ROW  =  ('C5', 'DB', 'T3' )

            WHERE  C# = ' C5 ' ;

五、视图

 1、创建视图  

         CREATE VIEW < 视图名> ( < 列名序列 > )

          AS  < SELECT 查询语句 > 

例1: 根据S,SC,C基本表创建名为STUDENT_SCORE 包含S#、SNAME、CNAME、SCORE等列的视图。

          CREATE VIEW   STUDENT_SCORE (S#、SNAME、CNAME、SCORE)

             AS  SELECT  S. S#、SNAME、CNAME、SCORE

                     FROM     S, SC, C

                     WHERE   S.S# = SC.S#    AND   SC.C# = C.C# ;

2、  撤销视图:

        DROP    VIEW   < 视图名 >


小结:以上这些SQL语句是最基础的,最常用的,也是必须掌握的。只有掌握了这些语句,才能学习更加复杂的和深层次的SQL语言。