sql语句

来源:互联网 发布:r语言编程书籍 编辑:程序博客网 时间:2024/05/29 19:38

1.创建表

举例如下:create table teachers(

Tno char(7) primary key,

Tname char(10) not null,

Sex char(2) check(Sex = '男' OR Sex ='女'),

Birthday DATE,

Title char(6),

Dno char(4),

Foreign key(Dno)REFERENCES Departments(Dno)

);

注:char 和varchar的区别:char是定长字符串,varchar是变长字符串,前者需要固定长度的空间,而后者占用的空间在最大长度范围内是可变的。

2.修改表(SQL语言使用ALTER TABLE修改基本表)

(1)向基本表中添加新的列ALTER TABLE<表名> ADD [COLUMN]<列定义>如:ALTER TABLE Coursers ADD Pno CHAR(5);

(2)对于已存在的列只允许修改或删除列的缺省值,语句形式为:ALTER TABLE<表名>

                                                                                                          ALTER [COLUMN]<列名>{SET DEFAULT<缺省值>|DROP DEFAULT}

如:ALTER TABLE Students ALTER SEX SET DEFAULT '女';

(3)删除已存在的列 ALTER TABLE <表名> DROP[COLUMN]<列名>{CASCADE|RESTRICT}其中CASCADE表示级联,RESTRICT表示受限

如:ALTER TABLE Courses DROP Pno;

(4)添加表约束ALTER TABLE<表名> ADD<表约束定义>

(5)删除表约束ALTER TABLE<表名>DROP CONSTRAINT<约束名>{CASCADE|RESTRICT}

3.删除表DROP TABLE<表名>{CASCADE|RESTRICT}如DROP TABLE SC RESTRICT;

4.建立和删除索引(索引类似于数的目录,索引通常分为唯一性索引和非唯一性索引,也可以分为聚簇索引和非聚簇索引)

(1)创建索引的语句格式为:CREATE [UNIQUE][CLUSTER] INDEX<索引名>ON <表名>(<列名>[<次序>]...<列名>[<次序>]);

         其中列名后可以用次序指定索引值的排列次序,包括ASC(升序)和DESC(降序)缺省值为ASC;UNIQUE表示该索引为唯一性索引,缺省时为非唯一性索引;

        CLUSTER表示建立的索引时聚簇索引,缺省时为非聚簇索引注:聚簇索引比非聚簇索引的查询效率高,但是维护代价大,所以一个基本表最多只能建立一个聚簇索引

如:CREATE INDEX Student_Dept ON Students(Dno);

(2)删除索引DROP INDEX<索引名>

5.查询语句用SELECT语句实现

(1)语句的一般形式如下SELECT[ALL|DISTINCT]<选择序列>

                                          FROM <表引用>,...,<表引用>

                                          [WHERE<查询条件>]

                                          [GROUP BY<分组列>,...<分组列>[HAVING<分组选择条件>]]

                                          [ORDER BY<排序列>[ASC|DESC],..,<排序列>[ASC|DESC]]

注:ALL表示不删除结果的重复行,DISTINCT表示删除结果中的重复行

(2)不带WHERE的简单查询,举例SELECT * FROM Students;

(3)带WHERE的查询

*比较表达式形式如下:<值表达式1>R<值表达式2>其中R是比较运算符(<、<=、>、>=、=、<>、!=)

*BETWEEN表达式判定一个给定的值是否在给定的闭区间,最常见的形式如下:<值表达式>[NOT]BETWEEN<下界>AND<上界> 

 如:SELECT Sname,Speciality

        FROM Students

        WHERE year(Birthday)BETWEEN1987 AND 1990;

*IN表达式判定一个给定的元素是否咋给定的集合中。

IN表达式的两种形式:a.<值表达式>[NOT]IN(<值表达式列表>)举例如下:

SELECT Sno,Sname

FROM Students

WHERE Specility IN('计算机科学与技术','软件工程');

  b.<元祖>|[NOT] IN<子查询>

*LIKE表达式允许模糊查询一般形式为:<匹配值>[NOT] LIKE<模式>[ESCAPE '<换码字符>']其中,匹配值是属性,模式是字符串常量,模式中允许使用通配符,有两种通配符:“_”可以与任意单个字符匹配,而“%”可以与零个或多个任意字符匹配,ESCAPE'<换吗字符>'通常的形式是ESCAPE'\'它定义为转义字符,将紧随气候的一个字符转移。

举例如下:SELECT *

                  FROM Courses

                  WHERE Cname LIKE 'C \ _ %  ' ESCAPE '\';

*NULL表达式允许我们判定给定的值是否为空值。常见形式如下:<值表达式>|<子查询>IS[NOT]NULL

如:SELECT Sno,Cno FROM SC WHERE Grade IS NULL;

6.排序和分组

a.将查询结果排序

ORDER BY子句可以按多个结果列将查询结果排序,形式如下:ORDER BY<排序列>[ASC|DESC],<排序列>[ASC|DESC]缺省值为升序(ASC)注:如果指定多个排序列,则查询结果按指定的次序,首先按第一个排序列的值排序,第一个排序列值相同的结果元祖按第二个排序列的值排序,如此下去。

如:SELECT * FROM SC ORDER BY Cno,Grade DESC;

b.聚集函数(SQL的聚集函数可以单独使用,也可以配合GROUP BY(分组)子句使用),单独使用时,聚集函数作用于整个查询结果;而与GROUPBY子句配合使用时,聚集函数作用于查询结果的每个分组。)

聚集函数具有如下形式:COUNT([ALL|DISTINCT] *)或<聚集函数>([ALL|DISTINCT]<值表达式>)

第一种情况:COUNT(*)或COUNT(ALL *)返回每个分组中元组的个数;而COUNT(DISTINCT *)返回每个分组中不同元组的个数。

第二种情况:<聚集函数>可以使COUNT(计数),SUM(求和),MAX(最大值),MIN(最小值),AVG(平均值);<值表达式>是可求值的表达式。通常是属性,短语ALL或DISTINCT是可选的,缺省时为ALL

如 SELECT MIN(Grade),AVG(Grade),MAX(Grade) FROM SC WHERE Cno = 'CS302';

c.分组

GROUP BY子句的一般形式为:GROUP BY<分组列>,<分组列>[HAVING<分组选择条件>]

其中,分组列是属性,他所在的表出现在FROM子句中,可选的HAVING子句用来过滤掉不满足分组选择条件的分组,缺省时等价于HAVING TRUE,分组条件允许出现聚集条件

如:SELECT Sno,AVG(Grade) FROM Students GROUP BY Sno HAVING AVG(Grade)>60;

7.嵌套查询(最常见的子查询嵌套在WHERE或HAVING短语的条件中,子查询不能使用ORDER BY语句)

嵌套查询可以为2类:不相关子查询(子查询条件不依赖于父查询)和相关子查询(子查询条件依赖于父查询)

a.IN引出的子查询表达式为<元组>[NOT] IN <子查询>当且仅当元组出现在子查询的结果中,该<元组>IN<子查询>为真,而<元组>NOT IN<子查询>为假

如:SELECT Sno,Sname

FROM Students

WHERE Sex = '女' AND Speciality IN (

        SELECT Speciality

        FROM Students

       WHERE Sname = '王丽丽'

);

b.集合的比较引出的子查询表达式为:<值表达式>R ALL|SOME|ANY<子查询>,其中,值表达式是属性,R是比较运算符,当子查询的结果为单个值时,可以省略ALL,SOME和ANY。注:假设v是值表达式的值,s是子查询的查询结果,是一个集合,当v R ALL s为真,当且仅当v与s中的每个值都满足比较关系R。v R SOME s为真,当且仅当v与s中的某个值满足比较关系R。

如:SELECT Cno,AVG(Grade)

FROM SC

GROUP BY Cno

HAVING AVG(Grade) >= ALL (SELECT AVG(Grade) FROM SC GROUP BY Cno);

c.存在量词引出的子查询表达式为 EXISTS<子查询>其中,子查询的SELECT子句的形式为SELECT *。EXISTS为真,当且仅当子查询的结果非空。

如:SELECT Sno,Sname

FROM Students S

WHERE EXISTS

(SELECT *

FROM SC

WHERE Sno = S.Sno AND Cno = 'CS403');

d.检测子查询结果中的重复元素表达式为UNIQUE<子查询>该表达式为真,当且仅当子查询的结果中不存在两个完全相同的元组。

如:SELECT Tname ,Title

FROM Teachers T

WHERE UNIQUE(SELECT Tno FROM Teaches TC WHERE T.Tno = TC.Tno);此语句为查询之讲授一门课程的教师的姓名和职称。

8.数据更新

(1)插入 两种形式:a. 插入单个元组:语句格式为 INSERT INTO T[(A1,A2,...,AK)] VALUES(C1,C2,...,CK)其中T是基本表,也可以是视图,A是T的属性c是常量,当A缺省时,VALUES子句必须按基本表属性的定义次序提供新元组每个属性上的值。如:INSERT INTO SC(Sno,Cno,Grade) VALUES('200323','CS12','34');

b.插入查询结果语句格式为INSERT INTO T[(A1,A2,...,AK)] <查询表达式>其中,查询表达式通常是一个SELECT语句,该语句对查询表达式求值,并将记过元组集插入到基本表T中。

如:INSERT INTO Cardinf(Card-no,Name,Balance)

SELECT Tno,Tname,100.00

FROM Teachers

WHERE Dno = 'IE';

(2)删除DELETE语句格式为:DELETE FROM T [WHERE <删除条件>]WHERE缺省时,则删除表中的全部元组

如:DELETE FROM Students WHERE Sno = '200904';

(3)修改UPDATE语句格式为UPDATE T SET A1=E1,...,AK = EK [WHERE<修改条件>]

如:UPDATE Teachers SET Title = '副教授' WHERE Tno = 'B089989';UPDATE语句只能修改一个表的元组

原创粉丝点击