本篇内容为中国人民大学教授王珊、萨师煊的《数据库系统概论》自学课程的复习笔记,学习视频源于小破站(传送门),对应视频P16-P27,属教材“【第一篇 基础篇】”的“【第3章 关系数据库标准语言SQL】”内容。
文章目录
-
- P16 SQL概述
-
-
- 16.1 SQL的特点
- 16.2 SQL的基本概念
- P17 数据定义
-
-
- 17.1 SQL的数据定义语句
- 17.2 模式的定义与删除
- 17.3 基本表的定义、删除与修改
- 17.4 索引的建立与删除
- P18 数据查询-单表查询
-
-
- 18.1 单表查询语句格式
- 18.2 SELECT、 FROM、WHERE 子句
- P19 数据查询-单表查询2
-
-
- 19.1 ORDER BY 子句
- 19.2 GROUP BY 子句
- P20 数据查询-连接查询
-
-
- 20.1 等值与非等值连接查询
- 20.2 自身连接(一个表与其自身的连接)
- 20.3 外连接(填补空值NULL)
- 20.4 多表连接(两个以上的表的连接)
- P21 数据查询-嵌套查询(≈套娃)
-
-
- 21.1 带有 IN 谓词的子查询
- 21.2 带有比较运算符的子查询
- P22 数据查询-嵌套查询2
-
-
- 22.1 带有 ANY(SOME)或 ALL 谓词的子查询
- 22.2 带有 EXISITS 谓词的子查询(≈存在)
- P23 数据查询-集合查询
-
- P24 空值处理
- P25 数据更新
-
-
- 25.1 插入语句
- 25.2 修改语句
- 25.3 删除语句
- P26 视图
-
- P27 视图2
-
- 札记
P16 SQL概述
16.1 SQL的特点
- 综合统一
- 高度非过程化
- 面向集合的操作方式
- 以同一种语法结构提供多种使用方式
① SQL是独立的语言
② SQL能嵌入到高级语言(例如:C、C++、Java)
- 语言简洁,易学易用
16.2 SQL的基本概念
- 外模式包括若干视图(view)和部分基本表(base table)
- 模式包括若干基本表
- 内模式包括若干存储文件(stored file)
P17 数据定义
17.1 SQL的数据定义语句
- 关系数据库系统支持三级模式结构;
- 其模式、外模式、内模式中的基本对象有模式、表、视图和索引等;
- SQL的数据定义功能包括模式定义、表定义、视图和索引的定义。
- Tips:
① SQL标准不提供修改模式定义和修改视图定义的操作,若想要修改则必须先删除后重建。
② SQL标准也未提供索引相关语句,但为了提高查询效率,商用关系数据库管理系统通常都提供相应机制。
操作对象 |
操作方式 |
创建 |
删除 |
修改 |
模式 |
CREATE SCHEMA |
DROP SCHEMA |
|
表 |
CREATE TABLE |
DROP TABLE |
ALTER TABLE |
视图 |
CREATE VIEW |
DROP VIEW |
|
索引 |
CREATE INDEX |
DROP INDEX |
ALTER INDEX |
- 一个关系数据库管理系统的实例中可以建立多个数据库;
- 一个数据库可以建立多个模式;
- 一个模式下通常包括多个表、视图和索引等数据库对象。
17.2 模式的定义与删除
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
要创建模式,调用该命令的用户必须拥有数据库管理员权限,或者获得了数据库管理员授予的 CREATE SCHEMA 的权限。
CREATE SCHEMA TEST AUTHORIZATION ZHANG
CREATE TABLE TAB1(COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20),
COL4 NUMERIC(10,3),
COL5 DECIMAL(5,2),
);
- 删除模式
① CASCADE 和 RESTRICT 两者必选其一。
② CASCADE(级联):删除模式的同时把该模式中所有数据库对象全部删除。【危险性较高,谨慎使用!!!】
③ RESTRICT(限制):若模式中已经定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行;只有当该模式没有任何下属对象时才能执行 DROP 语句。
DROP SCHEMA <模式名> <CASCADE|RESTRICT>
DROP SCHEMA ZHANG CASCADE;
17.3 基本表的定义、删除与修改
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) UNIQUE,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
);
CREATE TABLE Course
(Cno CHAR(4) PRIMARY KEY,
Cname CHAR(40) NOT NULL,
Cpno CHAR(4),
Credit SMALLINT,
FOREIGN KEY (Cpno) REFERENCES Course(Cno),
);
CREATE TABLE SC
(Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY (Sno, Cno),
FOREIGN KEY (Sno) REFERENCES Student(Sno),
FOREIGN KEY (Cno) REFERENCES Course(Cno),
);
ALTER TABLE<表名>
[ADD [COLUMN] <新列名><数据类型>]
[DROP [COLUMN] <列名> [CASCADE|RESTRICT]]
[ALTER COLUMN <列名><数据类型>];
ALTER TABLE Student ADD S_entrence DATE;
ALTER TABLE Student ALTER COLUMN Sage INT;
ALTER TABLE Course ADD UNIQUE(Cname);
DROP TABLE <表名> [CASCADE|RESTRICT];
DROP TABLE Student CASCADE;
17.4 索引的建立与删除
- 建立索引
当表的数据量比较大时,查询效率低耗时长,建立索引是加快查询速度的有效手段。常见数据库索引包括顺序文件上的索引、B+树索引、散列(hash)索引、位图索引。
① 顺序文件上的索引:属性值升 / 降序存储,指针操作。
② B+树索引:B+树叶结点指针存储,具有动态平衡的优点。
③ 散列(hash)索引:利用散列函数映射到若干个桶中存储,具有快速查找的优点。
④ 位图索引:位向量记录缩阴属性,每个位向量对应一个可能值。
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>;
ALTER INDEX <旧索引名> RENAME TO <新索引名>;
ALTER INDEX SCno RENAME TO SCSno;
DROP INDEX <索引名>;
DROP INDEX Stusname;
P18 数据查询-单表查询
18.1 单表查询语句格式
18.2 SELECT、 FROM、WHERE 子句
SELECT Sno, Sname
FROM Student;
SELECT Sname, Sno, Sdept
FROM Student;
SELECT*
FROM Student;
SELECT Sname, 2020-Sage
FROM Student;
SELECT Sname, 'Year of Birth:', 2020-Sage, LOWER(Sdept)
FROM Studen;
SELECT Sname NAME, 'Year of Birth:' BIRTH, 2020-Sage BIRTHDAY, LOWER(Sdept) DEPARTMENT
FROM Student;
- 选择表中若干元组
① 消除取值重复行 DISTINCT
② 查询满足条件的元组 WHERE
查询条件 |
谓语 |
比较 |
=, >, <, >=, <=, <>, !>, !<, NOT+上述比较运算符 |
确定范围 |
BETWEEN AND, NOT BETWEEN AND |
确定集合 |
IN, NOT IN |
字符匹配 |
LIKE, NOT LIKE |
空值 |
IS NULL, IS NOT NULL |
多重条件(逻辑运算) |
AND, OR, NOT |
SELECT DISTINCT Sno
FROM SC;
SELECT Sname
FROM Student
WHERE Sdept = 'SC';
SELECT Sname, Sage
FROM Student
WHERE Sage < 20;
SELECT DISTINCT Sno
FROM SC
WHERE Grade < 60;
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
SELECT Sname, Ssex
FROM Student
WHERE Sdept IN ('CS', 'MA', 'IS');
SELECT *
FROM Student
WHERE Sno LIKE '201215121';
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE '张%';
SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳_';
SELECT Sname, Sno
FROM Student
WHERE Sname LIKE '_阳%';
SELECT Cno, Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE '\'; //ESCAPE为转义操作'\'
SELECT Sno, Cno
FROM SC
WHERE Grade IS NULL;
SELECT Sno, Cno
FROM SC
WHERE Grade IS NOT NULL;
SELECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20;
P19 数据查询-单表查询2
19.1 ORDER BY 子句
- ORDER BY 子句
① ASC 升序
② DESC 降序
SELECT Sno, Grade
FROM SC
WHERE Cno = '3'
ORDER BY Grade DESC;
SELECT *
FROM Student
ORDER BY Sdept ASC, Sage DESC;
- 聚集函数
为增强检索功能,SQL提供了很多聚集函数,主要有:
函数 |
用途 |
COUNT(*) |
统计元组个数 |
COUNT( [ DISTINCT | ALL]<列名> ) |
统计一列中值的个数 |
SUM( [ DISTINCT | ALL]<列名> ) |
计算一列值的总和(数值型) |
AVG( [ DISTINCT | ALL]<列名> ) |
计算一列值的平均值(数值型) |
MAX( [ DISTINCT | ALL]<列名> ) |
计算一列值的最大值 |
MIN( [ DISTINCT | ALL]<列名> ) |
计算一列值的最小值 |
SELECT COUNT(*)
FROM Student;
SELECT COUNT(DISTINCT Sno)
FROM SC;
SELECT AVG(Grade)
FROM SC
WHERE Cno='1';
SELECT SUM(Ccredit)
FROM SC, Course
WHERE Sno='201215012' AND SC.cno=Course.cno;
19.2 GROUP BY 子句
- GROUP BY子句.
分组:细化聚集函数的作用的对象。分组后聚集函数将作用于每一组,每一组都有一个函数值。
SELECT Cno, COUNT(Sno)
FROM SC
GROUP BY Cno;
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3;
SELECT Sno, AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;
P20 数据查询-连接查询
20.1 等值与非等值连接查询
- 使用“=”为等值连接
- 使用其他运算符为非等值连接
- 相应方法
① 嵌套循环法:外表外循环扫描,内表内循环扫描;
② 排序合并法:先对两张表排序,通过指针拼接相应元组;
③ 索引连接:通过索引直接定位查询,效率最高。
SELECT Student.*, SC.*
FROM Student, SC
WHERE Student.Sno = SC.sno;
20.2 自身连接(一个表与其自身的连接)
SELECT FIRST.Cname, SECOND.Cname
FROM Course FIRST, Course SECOND
WHERE FIRST.Cpno = SECOND.Cno;
20.3 外连接(填补空值NULL)
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno);
20.4 多表连接(两个以上的表的连接)
SELECT Student.Sno, Sname, Cname, Grade
FROM Student, SC, Course
WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno;
P21 数据查询-嵌套查询(≈套娃)
- 一个SELECT-FROM-WHERE语句称为一个查询块
- 上层查询块:外层查询或父查询
- 下层查询块:内层查询或子查询
- ORDER BY 子句只能对最终结果排序,故子循环中不可存在 ORDER BY 子句
21.1 带有 IN 谓词的子查询
SELECT Sdept
FROM Student
WHERE Sname='刘晨';
SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept='CS'
SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname='刘晨';)
21.2 带有比较运算符的子查询
SELECT Sno, Cno
FROM SC x
WHERE Grade >= (SELECT AVG(Grade)
FROM SC y
WHERE y.Sno=x.Sno);
P22 数据查询-嵌套查询2
22.1 带有 ANY(SOME)或 ALL 谓词的子查询
SELECT Sname, Sage
FROM Student
WHERE Sage < ANY(SELECT Sage
FROM Student
WHERE Sdept='CS')
AND Sdept<>'CS';
|
= |
<>或!= |
< |
<= |
> |
>= |
ANY |
IN |
– |
<=MAX |
>MIN |
>=MIN |
|
ALL |
– |
NOT IN |
<=MIN |
>MAX |
>=MAX |
|
22.2 带有 EXISITS 谓词的子查询(≈存在)
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT *
FROM SC
WHERE Sno = Student.Sno AND Cno = '1');
P23 数据查询-集合查询
23.1 集合查询
操作 |
符号 |
并操作 |
UNION |
交操作 |
INTERSECT |
差操作 |
EXCEPT |
SELECT *
FROM Student
WHERE Sdept = 'CS'
UNION
SELECT *
FROM Student
WHERE Sage <= 19;
SELECT *
FROM Student
WHERE Sdept = 'CS'
INTERSECT
SELECT *
FROM Student
WHERE Sage <= 19;
SELECT *
FROM Student
WHERE Sdept = 'CS'
EXCEPT
SELECT *
FROM Student
WHERE Sage <= 19;
23.2 查询语句小结
SELECT 语句的一般格式
P24 空值处理
- 空值的产生、判断(IS NULL 或 IS NOT NULL)
- 空值的算术运算、比较运算和逻辑运算
- 逻辑运算符真值表
P25 数据更新
25.1 插入语句
INSERT
INTO <表名> [(<属性列 1> [,<属性列2>] ……)]
VALUES (<常量 1> [,<常量 2> ……]);
INSERT
INTO Student (Sno, Sname, Ssex, Sdept, Sage)
VALUES ('201215128', '陈冬', '男', 'IS', '18');
INSERT
INTO Student
VALUES ('201215126', '张成民', '男', '18', 'CS');
INSERT
INTO SC (Sno, Cno)
VALUES ('201215128', '1');
INSERT
INTO SC
VALUES ('201215128', '1', NULL);
INSERT
INTO <表名> [(<属性列 1> [,<属性列2>] ……)]
子查询;
CREATE TABLE Dept_age
(Sdept CHAR(15)
AVG_age SMALLINT);
INSERT
INTO Dept_age (Sdept, AVG_age)
SELECT Sdept, AVG(Sage)
FROM Student
GROUP BY Sdept;
25.2 修改语句
UPDATE <表名>
SET <列表>=<表达式> [,<列名>=<表达式>] ……
[WHERE <条件>];
UPDATE Student
SET Sage = '22'
WHERE Sno = '201215121';
UPDATE Student
SET Sage = Sage + 1;
UPDATE SC
SET Grade = 0
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Sdept = 'CS');
25.3 删除语句
DELETE
FROM <表名>
[WHERE <条件>];
DELETE
FROM Student
WHERE Sno='201215128';
DELETE
FROM SC;
DELETE
FROM SC
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Sdept = 'CS');
P26 视图
26.1 定义视图
CREATE VIEW <视图名> [(<列名> [,<列名>]……)]
AS <子查询>
[WITH CHECK OPTION];
DROP VIEW <视图名> [CASCADE];
26.2 查询视图
P27 视图2
27.1 更新视图
27.2 视图的作用
札记
- 数据库安全审计系统提供了一种( 事前预测)的安全机制。
- 把对关系SPJ的属性QTY的修改权授予用户李勇的T-SQL语句是( GRANT UPDATE ON SPJ (QTY) TO ‘李勇’ )。
- 保护数据库安全性的一般方法是( 设置用户标识;存取权限控制 )。
- 安全性控制的一般方法有( 用户标识鉴定;存取控制;审计;数据加密)。
- 数据对象的范围越小,授权子系统就越灵活。关于授权子系统,是DBMS中负责权限管理的子系统,不是指授权对象。“灵活”是指可以进行更精细的存取控制