SQL基本语法-表

来源:互联网 发布:java hashmap stream 编辑:程序博客网 时间:2024/06/06 08:55

一、列级完整性约束条件

         NOT NULL:限制列取值非空。

         DEFAULT:给定列的默认值。

         UNIQUE:限制列取值不重复。

         CHECK:限制列的取值范围。

         PRIMARY KEY:指定本列为主码。

         FOREIGN KEY:定义本列为引用其他表的外码。

        使用形式为:[FOREIGN KEY(<外码列名>)REFERENCES <外表>(<外表列名>)

      二、基本表的定义、删除与修改

     语法:

          CREATE TABLE <表名><列名> <数据类型>[ <列级完整性约束条>]<列名> <数据类型>[ <列级完整性约束条件>] ] …,<表级完整性约束条件> ] );

          ALTER TABLE <表名>[ ALTER COLUMN <列名> <新数据类>]|[ ADD <列名> <数据类型>| [ DROP COLUMN <列名> ] 

          DROP TABLE <表名>RESTRICT|CASCADE];

          RESTRICT:删除表是有限制的。欲删除的基本表不能被其他表的约束所引用,如果存在依赖该表的对象,则此表不能被删除

          CASCADE:删除该表没有限制。在删除基本表的同时,相关的依赖对象一起删除

    示例:

           1)、创建Student表:

              CREATE TABLE Student        

                 ( Sno   CHAR(9) PRIMARY KEY,  //列级完整性约束条件                 

                  Sname  CHAR(20) UNIQUE,     // Sname取唯一值

                  Ssex    CHAR(2) Default '',

                  Sage   SMALLINT,

                  Sdept  CHAR(20)

                 );

            (2)、修改Student表:

                Student表增加“入学时间”列,其数据类型为日期型。

                  ALTER TABLE Student ADD S_entrance DateTime

                 注:不论基本表中原来是否已有数据,新增加的列一律为空值 

                将年龄的数据类型由字符型改为整数。

                     ALTER TABLE Student ALTER COLUMN Sage INT

                删除所在系。

                     ALTER TABLE drop column Sdept;

三、索引的建立与删除

   语法:

         (1)、建立索引

               CREATE [UNIQUE|CLUSTER] INDEX <索引名>ON<表名><>[<次序>],<列名>[<次序>];

          (2)、删除索引

              DROP INDEX <表名>.<索引名>;

          注解:

            UNIQUE表明此索引的每一个索引值只对应唯一的数据记录。

            CLUSTER表示要建立的索引是聚簇索引。所谓聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引组织。一个表只能建立一个聚簇索引

            ASC 升序,DESC降序。缺省值为ASC

           (3)、删除Student

                    DROP TABLE  Student  CASCADE ;

                   DROP TABLE  Student  RESTRICT ;

   示例:

        (1)、建立索引

             create unique index num on Student (Sno DESC) ;

         (2)、删除索引

             drop index Student.num;

  四、数据查询

       语法:

         SELECT [ALL|DISTINCT] <目标列表达式>[<目标列表达式>] 

         FROM <表名或视图名>[ <表名或视图名> ] 

[ WHERE <条件表达式> ]

[ GROUP BY <列名1> [ HAVING <条件表达式1> ] ]

[ ORDER BY <列名2> [ ASC|DESC ] ]

注解:

 ALL查询选择表中所有符合要求的元祖。

 DISTINCT取消取值重复的行。两个本来并不完全相同的元祖,投影到指定的某些列上后,可能变成相同的行,可以用DISTINCT取消它们。

若有GROUP BY子句,则将结果按列名1分组,该属性列值相等的元祖为一个组。  

GROUP BY子句带有HAVING短语,则只有满足条件组输出;

若有ORDER BY子句,则结果表还要按列名2来升或降序排列输出。

分类:

         (1)、单表查询

          I、选择表中的若干列

              查询指定列

               select Sno,Sdept from Student;

              查询全部列

                 select Sno,Sname,Sage,Ssex,Sdept from Student;

              select * from Student;

            查询经过计算的值

              1、查全体学生的姓名及其出生年份。

                    select Sno,2015-Sage from Student;

                    select Sno,YEAR(GETDATE())-Sage from Student;

               2、查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名

                    select Sname,year(getDate())-Sage,Lower(Sdept) from Student;

               3、使用列别名改变查询结果的列标题:

                    select Sname 姓名,year(getDate())-Sage 出生年,Lower(Sdept) 系别 from Student;

                   select Sname as 姓名,year(getDate())-Sage as 出生年,Lower(Sdept) as 系别 from Student;

            注:2015-Sage中的2015不具有普遍性,而YEAR(GETDATE())动态变化(获得系统时间)。

             II选择表中的若干元组

                     消除取值重复的行

                    注:若没有指定DISTINCT关键词,则缺省为ALL

                    1select distinct Cno from SC;

                  查询满足条件的元组

                     (1)、比较大小

                     语法:

                               =(等于),>(大于),<</span>(小雨),>=(大于等于),<=(小于等于),!=<>(不等于),!>(不大于),!<</span>(不小于)                                                   示例:

                      1、查询计算机科学系全体学生的名单。

                            select * from Student where Sdept = 'CS';

                      2、查询所有年龄在20岁以下的学生姓名及其年龄。

                           select Sname,Sage from Student where Sage<</span>'20';

                      3、查询考试成绩有不及格的学生的学号。

                           select Sno from SC where Grade <</span> '60';

                    2)、确定范围(BETWEEN...AND...;NOT BETWEEN...AND...

                      语法:

                         谓词BETWEEN...AND...NOTBETWEEN...AND...可以用来查询属性在(或不在)确定范围内的元组,其中BETWEEN后是范围的下限

                       (即低值),AND后是范围的上限(即高值);包括上下限

                      示例:

                        1、查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄

                             select Sname,Sage,Sdept from Student where Sage between 20 and 23;

                            select Sname,Sage,Sdept from Student where Sage>=20 and Sage<=23;

                         2、查询年龄不在20~23岁之间的学生姓名、系别和年

                             select Sname,Sage,Sdept from Student where Sage not between 20 and 23;

           3)、确定集合(IN;NOT IN)

                      语法:

                        谓词IN可以用来查找属性值等于指定集合的元组谓词NOT IN可以用来查找不属性值等于指定集合的元组

                      示例:

                         1、查询信息系(IS)、数学系(MA)和计算机科学系CS)学生的姓名和性别。

                              select Sname,Ssex from Student where Sdept in('IS','MA','CS');

                             select Sname,Ssex from Student where Sdept='IS'or Sdept='MA'or Sdept'CS';

                        2、查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。

                             select Sname,Ssex from Student where Sdept not in('IS','MA','CS');

           4)、字符匹配(LIKE;NOT LIKE

                      语法:

                         谓词: [NOT] LIKE<匹配串>[ESCAPE <码字符>]

                         式中:<匹配串可是固定字符串或通配符 %’ _’。

                         其中:%(百分号)代表任意长度(长度可为0)的字符串, _(下横线)代表任意单个字符。

                      示例:

                         1、查询学号为'200215121'的学生的详细情况。

                              select * from Student where Sno like 200215121;

                         2、查询所有姓刘学生的姓名、学号和性别。

                              select Sno,Sname,Ssex from Student where Sname like '%';

                         3、查询姓"欧阳"且全名为三个汉字的学生的姓名。

                              select Sname from Student where Sname like '欧阳_';

                         4、查询名字中第2个字为""字的学生的姓名和学号。

                              select Sno,Sname,Ssex from Student where Sname like '_%';

                         5、查询所有不姓刘的学生姓名。

                              select Sno,Sname,Ssex from Student where Sname not like '%';

                         6、查询DB_Design课程的课程号和学分。

                              select Cno,Ccrediy from Course where Cname like 'DB\_Design' escape '\';

                          7、查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。

                             select Cno,Ccrediy from Course where Cname like 'DB\_%i__' escape '\';

          (5)、涉及空值的查询(IS NULL;IS NOT NULL

                       1、某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。

                             select Sno,Cno from SC where Grade is null;

                       2、查所有有成绩的学生学号和课程号。

                            select Sno,Cno from SC where Grade is not null;

                 6)、多重条件查询

                      1、查询计算机系年龄在20岁以下的学生姓名。

                           select Sname from Student where Sdept  = 'CS' and Sage <</span> 20;

                      2、查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。

                           select Sname,Ssex from Student where Sdept in('CS','MA','IS');

        (2)、连接查询

                       1)等值与非等值连接查询

                     语法:

                        当运算连接符为=时,成为等值连接,使用其他运算符成为非等值连接

                          示例:

                              1、查询每个学生及其选修课程的情况

                                    select Student.*,SC.* from Student,SC where SC.Sno=Student.Sno;

                        2、自然连接(去掉连接中的重复列)

                            select Student.*,Cno,Grade from Student,SC where SC.Sno=Student.Sno;

                  (2) 自身连接

                     示例:        

                       1、查询每一门课的间接先修课(即先修课的先修课)

                            select First.Cno,Second.Cpno from Course First,Course Second where First.Cpno=Second.Cno;

                 (3)外连接

                     示例:

                       1、左外连接

                            select Student.*,Cno,Grade from Student LEFT JOIN SC on(Student.Sno=SC.Cno);

                       2、右外连接

                            select Student.*,Cno,Grade from Student RIGHT JOIN SC on(Student.Sno=SC.Cno);

                     注:在SQL server left out join...on中的out不写

              3)、嵌套查询

             4)、集合查询

         (1)、并操作UNION

                   语法:

                            UNION将多个查询结果合并起来,系统会自动去掉重复元组,若要保留重复的元组则用UNION  ALL操作符   

                       示例:   

                          1、查询计算机科学系的学生及年龄不大于19岁的学生。

                               select * from Student where Sage <=19 or Sdept = 'CS';

                        select * from Student where Sage <=19 UNION select from Student where Sdept='CS';

                 2)、交操作INTERSECT

                 示例:

                          1、查询计算机科学系的学生与年龄不大于19岁的学生信息

                              select * from Student where Sage <=19 and Sdept 'CS';

                        select * from Student where Sage <=19 INTERSECT select * from Student where Sdept='CS';

                 3)、差操作EXCEPT

                 示例:

                        1、查询计算机科学系的学生与年龄不大于19岁的学生的信

                              select * from Student where Sage <=19 EXCEPT select * from Student where Sdept='CS';

   五、数据更新

      1)、插入数据

        语法:

            INSERT INTO <表名> [(<属性列1>[<属性列2 >)]VALUES (<1> [<常量2>]           

         I、插入元组

            示例:

             1、将一个新学生记录(学号:95020;姓名:陈冬;性别:男;所在系:IS;年龄:18岁)插入到Student表中。

                insert into Student(Sno,Sname,Ssex,Sdept,Sagevalues('95020','陈冬','','IS',18);

                或 insert into Studen values('95020','陈冬','','IS',18);

             注:若只指出表名,没有指出属性名,则属性列的次序要与GREATE TABLE 中的次序相同,空值用NULL表示

        II、插入子查询结果

           示例:

             1、对每一个系,求学生的平均年龄,并把结果存入数据库。

               INSERT INTO Deptage(Sdept,Avgage) SELECT  Sdept,AVG(Sage) FROM  Student GROUP BY Sdept

      2)、修改数据

         语法:

            UPDATE  <表名>SET  <列名>=<表达式>[<列名>=<表达式>]… [WHERE <条件>]

           示例:

           1、将学生95020的年龄改为22岁。

              update Student set Sage=22 where Sno='95020';

           2、将所有学生的年龄增加1岁。

              update Student set Sage=Sage+1;

           3、将信息系所有学生的年龄增加1岁。

              update Student set Sage=Sage+where Sdept='IS';

           4、将计算机科学系全体学生的成绩置零。

              update SC set Grade=where Sno in (select Sno from Student where Sdept='CS');

             或 UPDATE SC SET Grade=WHERE 'CS'=(SELECT Sdept FROM  Student WHERE  Student.Sno = SC.Sno);

       3)、删除数据

         语法:

            DELETE  FROM <表名> [WHERE <条件>]

           示例:

          1、删除学号为95020的学生记录。

             delete from Student where Sno='95020';

          2、删除所有的学生选课记录。

             delete from SC;

          3 删除计算机科学系所有学生的选课记录。

              DELETE FROM SC WHERE  'CS'=(SELECT Sdept FROM Student WHERE Student.Sno=SC.Sno);


0 0