该笔记总结自 《数据库系统概论》4小时期末不挂科!期末突击|核心考点|案例解析 的选集3 定义与查询
目录
SQL语言的特点与功能
- 综合统一
- 高度非过程化 (常考)
- 面向集合的操作方式
- 以一种语法结构提供多种组合方式
- 语言简洁,易学易用
SQL功能:
数据的定义、查询、操纵、控制
数据定义
模式定义
模式定义语句格式:
sql
CREATE SCHEMA <模式名称> AUTHORIZATION <用户名>;
如果没有指定模式名称,则隐含为用户名
例题:
为用户 Ye 定义一个名为 Hello 的模式
sql
CREATE SCHEMA Hello AUTHORIZATION Ye;
模式删除
模式定义语句格式:
sql
DROP SCHEMA <模式名> <CASCADE|RESTRICT>;
- CASCADE (级联)
删除模式的同时把该模式中所有的数据库对象全部删除! - RESTRICT (限制)
如果该模式中定义了数据库对象(如表、视图),则拒绝该删除语句的执行。
例题:
限制删除 Test 模型
sql
DROP SCHEMA Test RESTRICT;
基本表定义
基本表定义语句格式:
sql
CREATE TABLE <表名>
(<列名><数据类型>[<列级完整性约束>]
[,<列名><数据类型>[<列级完整性约束>]]
...
[,<表级完整性约束>]);
如果完整性约束涉及该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。
常见约束:
NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK
练习,学生选课表:
sql
CREATE TABLE SC
(Sno CHAR(8),
Cno CHAR(6),
Grade INT,
PRIMARY KEY(Sno, Cno),
FOREIGN KEY(Sno) REFERENCES Students(Sno),
FOREIGN KEY(Cno) REFERENCES Course(Cno)
)
数据类型
| 数据类型 | 含义 |
|---|---|
| CHAR(n), CHARACTER(n) | 长度为n的定长字符串 |
| VARCHAR(n), CHARACTERVARYING(n) | 最大长度为n的变长字符串 |
| CLOB | 字符串大对象 |
| BLOB | 二进制大对象 |
| INT, INTEGER | 整数(4字节),取值范围-2147483648, 2147483647 |
| SMALLINT | 短整数(2字节),取值范围-32768, 32767 |
| BIGINT | 大整数(8字节),取值范围-2 \^ 63, 2 \^ 63 - 1 |
建立索引
sql
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
例:
sql
CREATE UNIQUE INDEX Idx_Stuname ON Students(Sname);
CREATE UNIQUE INDEX Idx_SC ON SC(Sno ASC, Cno DESC);
修改/删除索引
sql
ALTER INDEX <旧索引名> RENAME TO <新索引名>;
DROP INDEX <索引名>
例:
sql
ALTER INDEX stunumber RENAME TO St_num;
DROP INDEX test;
数据查询
直接看:
SQL 十四分钟速成班!没错不要怀疑,资料库语法比中午决定吃什么还要简单!个人学习笔记
下面只写与上文不一样的内容或总结性内容
单表查询
1.查询学生姓名与年龄:
sql
SELETE Sname, (EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM Sbri)) FROM Students;
2.可以像C/C++一样用\标记转义字符
3.常见聚集函数
COUNT, SUM, AVG, MAX, MIN
4.WHERE不能接聚集函数
sql
SELECT Sno, AVG(Grade)
FROM Students
WHERE AVG(Grade)>=90
GROUP BY Sno;
-- 上面这写法是错的!!!
-- 正确写法如下:
SELECT Sno, AVG(Grade)
FROM Students
GROUP BY Sno
HAVING AVG(Grade)>=90;
WHERE作用于元组 ,而HAVING作用于组!
连接查询
等值连接
WHERE子句用来连接两表条件为连接条件 ,也称为连接谓词
sql
[<表名1>] <列名1> <比较运算符> [<表名2>] <列名2>
[<表名1>] <列名1> BETWEEN [<表名2>] <列名2> AND
例:查询每个学生及其选课情况
sql
SELETE Students.*, SC.*
FROM Students, SC
WHERE Students.Sno = SC.Sno;
自然连接
在等值连接中把目标列中重复的属性列去掉 则为自然连接
复合条件连接
WHERE子句由连接谓词和选择谓词组成的复合条件
例:查询选修114号考试且成绩在130分以上的所有学生的考号和姓名
sql
SELETE Students.kh, Sname
FROM Students, KS
WHERE Students.kh = KS.kh AND KS.id = '114' AND KS.grade > 130;
自身连接
一个表与其自己进行连接
需要给表起别名以示区别
由于所有属性名都是同名属性,因此必须使用别名前缀
例:查询每一门课的间接先修课(即先修课的先修课)
sql
SELECT FIRST.Cno, SECOND.Cpno
FROM Course FIRST, Course SECOND
WHERE FIRST.Cpno = SECOND.Cno AND SECOND.Cpno IS NOT NULL;
多表连接
两个以上的表进行连接
例:查询每个学生的学号、姓名、选修的课程名及成绩
sql
SELECT Students.Sno, Sname, Cname, Cgrade
FROM Stu, SC, Cou
WHERE Stu.Sno = SC.Sno AND SC.Cou = Cou.Cno
嵌套查询
一个SELECT-FROM-WHERE语句称为一个查询块
嵌套查询:将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询。
sql
SELECT Sname /*外层查询或父查询*/
FROM Student
WHERE Sno IN
( SELECT Sno /*内层查询或子查询*/
FROM SC
WHERE Cno='81003');
IN起到一个谓词的作用
例1:查询与"张三"在同一个学院的学生学号、姓名和主修专业
sql
SELECT Sno, Sname, Smajor
FROM Student
WHERE Sxy IN
( SELECT Sxy
FROM Student
WHERE Sname = '张三'
);
比较运算
例:找出每个学生超过他选修课程平均成绩的课程号
sql
SELECT Sno, Cno
FROM X
WHERE Grade >= (
SELECT AVG(Grade)
FROM Y
WHERE Y.Sno = X.Sno
);
ANY(SOME)或ALL谓词

类似于高中集合中的 存在 与 全部
例:查询 非智能科学与技术专业 中比 智能科学与技术专业 任意一个学生年龄小的学生的姓名、出生日期和主修专业
sql
SELECT Sname, Sbri, Smajor
FROM Student
WHERE Sbri > ANY(
SELECT Sbri
FROM Stu
WHERE Smajor = 'IS'
) AND Smajor <> 'IS';
EXIST谓词
- EXISTS谓词
带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值"true"或逻辑假值"false"。
若内层查询结果非空,则外层的WHERE子句返回真值
若内层查询结果为空,则外层的WHERE子句返回假值 - NOT EXISTS谓词
若内层查询结果非空,则外层的WHERE子句返回假值
若内层查询结果为空,则外层的WHERE子句返回真值
例:查询所有选修了XXX号课程的学生学号
sql
SELECT Sno
FROM Stu
WHERE EXISTS(
SELECT *
FROM SC
WHERE Sno = Stu.Sno AND Cno = 'XXX'
);
集合查询
并操作:UNION
交操作:INTERSECT
差操作:EXCEPT
参加集合操作要求:
- 各查询结果的列数必须相同
- 对应项的数据类型也必须相同
例:查询2020年第2学期选修了课程81001或81002的学生
sql
SELECT Sno
FROM SC
WHERE Stime = '20202' AND Cno = '81001'
UNION
SELECT Sno
FROM SC
WHERE Stime = '20202' AND Cno = '81002'
派生表
子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,子查询生成的临时派生表成为主查询的查询对象。
例:找出每个学生超过他自己选修课程平均成绩的课程号
sql
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_Sno AND SC.Grade >= AVG_grade;
该笔记仅供学习参考,无商业用途。
如有侵权,请联系删除!