关系数据库标准语言SQL
概述
SQL特点:综合统一(可以完成数据库生命周期中的全部活动),高度非过程化,面向集合的操纵方式,以同一种语法结构提供多种使用方式,语言简洁……
三级模式结构:外模式(基本表,视图),内模式(存储文件的逻辑结构)
本章的重点为各种语句的掌握(背诵)。
数据定义
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
DROP SCHEMA <模式名> <CASCADE | RESTRICT>
- 一个DBMS中可以有多个数据库,一个数据库中可以有多个模式
- 数据库管理员权限
CREATE TABLE <表名> (<列名><数据类型>[完整性约束]……)
- PRIMARY KEY (Sno, Cno)
- FOREIGN KEY (Sno) REFERENCES Student(Sno)
- CHAR(n),、VARCHAR(n), INT、SMALLINT、BIGINT,FLOAT(n),DATE、TIME……
SHOW SEARCH_PATH
- 确认表所属的模式
ALTER TABLE <>
ADD [COLUMN] <列名><数据类型>[完整性约束]
DROP [COLUMN] <列名> [ CASCASE | RESTRICT ]
ADD <表级完整性约束>
DROP CONSTRAINT <完整性约束> [ RESTRICT | CASCADE]
ALTER COLUMN <列名><数据类型> (修改列的数据类型)
- 用于 对表结构的修改,不是修改其数据
- 例:ALTER TABLE Student ADD UNIQUE ( Cname )
DROP TABLE <表名> [ RESTRICT | CASCADE]
CREATE INDEX <索引名> ON <表名>(<列名>[<次序>])
- 例:CREATE UNIQUE INDEX SCno ON SC(Sno ASC, Cno DESC)
ALTER INDEX <旧索引名> RENAME TO <新索引名>
DROP INDEX <索引名>
数据查询
- SELECT DISTINCT Sno, Sname FROM Student(消除重复元组)
- SELECT * FROM Student STU1 (自定义表名)
- SELECT Sname, 2014 - Sage BIRTHDAT FROM STUDENT (函数与自定义列别名的应用)
-
WHERE Sdept = ‘CS’
-
WHERE Sage < 20
-
WHERE Sage (NOT) BETWEEN 下限 AND 上限
-
WHERE Sdept (NOT) IN (‘CS’, ‘MA’)
-
WHERE Sno (NOT) LIKE ‘U2019%’ (%:任意长度字符串 _:单个字符串)
-
WHERE Cname LIKE ‘DB_Design’ ESCAPE ‘\’ (转义字符的使用)
-
WHERE Grade IS (NOT) NULL
-
WHERE a AND/OR b
-
(连接查询) WERE Student.Sno = SC.Sno
- ORDER BY 列1,列2,…… DESC|默认升序 (先按列1排序,列1中值相同的为一组再按列2排序,以此类推)
聚集函数,用于select语句
- COUNT ( * ) 不会跳过空值!
- COUNT | SUM | AVG | MAX | MIN ( [DISTINCT | ALL] 列名)
- GROUP BY:细化聚集函数的作用对象!!!聚集函数作用于每一组
- HAVING:选择组的条件,只有满足条件的组才会被选出来
连接查询
- FROM Student LEFT OUTER JOIN SC ON (Student.Sno = SC.Sno)
嵌套查询
将一个查询块(SELECT-FROM-WHERE)嵌入在另一个查询块的WHERE或HAVING的条件中。
例:
- WHERE Sno IN*
(SELECT Sno FROM SC WJERE Cno=‘2’)
注:ORDER BY 只能对最终的查询结果进行排序
子查询的查询条件不依赖与父查询:不相关子查询
子查询的查询条件依赖与父查询:相关子查询->相关嵌套查询语句
- SELECT Sno, Cno
FROM SC x
WHERE Grade > (
SELECT AVG(Grade)
FROM SC y
WHERE y.Sno = x.Sno )
带有ANY,SOME,ALL的子查询:> | < | >= | <= | = | != + ANY | ALL
- SELECT Sname
FROM Student
WHERE Sage < ANY (
SELECT Sage
FROM Student
WHERE Sdept = ‘CS’ )
AND Sdept <> ‘CS’;
带有EXISTS谓词的子查询:只产生逻辑值true | false
-
SELECT Sname FROM Student
WHERE (NOT) EXISTS
(SELECT * FROM SC WHERE Sno=Student.Sno AND Cno=‘1’)
解释:从Student中依次取元组,与子查询中的表进行匹配,若二者Sno相等且选了课程1,则返回真值,输出对应的学生的名字,否则返回false。 -
SELECT Sname FROM STUDENT //遍历学生学号
WHERE NOT EXISTS
(SELECT * FROM COURSE //遍历课程号
WHERE NOT EXISTS
(SELECT * FROM SC
WHERE SC.Sno=Student.Sno AND Cno=Course.Cno)); -
SELECT DISTINCT Sno FROM SC SCX
WHERE NOT EXISTS
(SELECT * FROM SCY
WHERE SCY.Sno=U201911743’
AND NOT EXISTS
(SELECT * FROM SCZ WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno));
说实话没太明白
子查询不仅可以出现在WHERE中,还可以用于FROM中,这时子查询生成临时的派生表成为主查询的查询对象。
-
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; -
SELECT Sname FROM Student,
(SELECT Sno FROM SC WHERE Sno=‘1’) AS SC1
WHERE Student.Sno=SC1.Sno;
集合查询:SELECT语句的查询结果是一个集合,所以可以进行集合操作。
- SELECT-FROM-WHERE UNION并集 | INTERSECT交集 | EXCEPT差集 SELECT-FROM-WHERE
数据的添加、更改与删除
插入数据
- INSERT INTO Student (Sno,Sname,Ssxe,Sdept,Sgae)
VALUES (‘201215128’,‘陈东’,‘男’,‘IS’,18);
INTO后要指明在哪个表的那些列中插入数据。对于没有数据的列,可以不写,也可以明确的给出空值NULL。
插入子查询的结果:
- INSERT INTO Dept_age(Sdept,Avg_age)
SELECT Sdept,AVG(Sgae)
FROM Student
GROUP BY Sdept;
修改数据
- UPDATE Student
SET Sage=22
WHERE Sno=‘201911743’ - UPDATE Student
SET Sage=Sage + 1;
修改数据也可以带上子查询:
- UPDATE SC SET GRADE=0
WHERE Sno IN
(SELECT Sno FROM Student WHERE Sdept=‘CS’);
删除数据(也可以带子查询
- DELETE FORM SC //删除所有数据
- DELETE FROM SC WHERE SNO IN
(SELECT Sno FROM Student WHERE Sdept=‘CS’);
空值的处理
- INSERT INTO … VALUES (… , … , …, NULL);
- UPDATE SC SET Sdept=NULL;
- … WHERE Sname IS NULL;
- NOT NULL, UNIQUE 限制属性不能取空值
空值的运算:算术运算为空值,比较运算为UNKNOWN
逻辑运算:unknown的取反还是unknown,AND运算取权力最小的(权力TRUE>UNKNOWN>FALSE),OR运算取权力最大的。
视图
视图是一个虚表,数据库只存放其定义,其数据存放在基本表从中。只有对视图进行查询时,才按照视图的定义从基本表中将数据查出。
建立:
CREATE VIEW <视图名> [(<列名1>[,<列名2>]…)]
AS <子查询>
[WITH CHECK OPTION]
- 列名只能全部省略或全部指定。当子查询中SELECT中存在聚合函数或表达式、多表链接时有同名字段时,必须指派。
- WITH CHECK OPTION:对视图进行操作时,数据需要满足子查询中的where条件
- 视图可以建立在基本表或视图上
删除:DROP VIEW <视图名> [CASCADE]
查询:对视图的查询与对表的查询一样。
更新:INSERT,DELETE,UPDATE -> 最终会对表中的数据进行更新!!(WITH CHECK POINT会检查更新的数据是否满足视图定义)。更新语句与对基本表的更新一致。
- 有时,视图是不可更新的,比如视图中存放的是平均成绩时,系统无法修改各科的成绩,所以无法更改。更为严格的规则是:
- 视图来自两个及以上的表时不可以更新
- 数据来自于聚集函数时不可更新
- 视图定义有DISTINCT短语、GROUP BY子句时不可更新
- 视图定义时使用的嵌套查询,且内外能查询访问了相同的表,则不可更新
视图的作用(maybe简答题):
- 简化用户操作:使用户将注意力集中在他关心的数据上,使数据看起来结构简单、清晰,简化用户的查询操作。
- 使不同种类的用户以多种角度看待同一数据
- 对重构数据库提供了一定的数据逻辑独立性:用户的外模式保持不变
- 对机密数据提供安全保护:对不同的用户提供不同的视图
- 清晰的表达查询