数据库系统概论 - 定义与查询 期末速成课笔记

该笔记总结自 《数据库系统概论》4小时期末不挂科!期末突击|核心考点|案例解析 的选集3 定义与查询

目录


SQL语言的特点与功能

  1. 综合统一
  2. 高度非过程化 (常考)
  3. 面向集合的操作方式
  4. 以一种语法结构提供多种组合方式
  5. 语言简洁,易学易用

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

参加集合操作要求:

  1. 各查询结果的列数必须相同
  2. 对应项的数据类型也必须相同

例:查询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;

该笔记仅供学习参考,无商业用途。

如有侵权,请联系删除!

相关推荐
YOU OU5 小时前
Redis基础常识与命令
数据库·redis·缓存
克里斯蒂亚诺更新7 小时前
ruoyi角色权限的对应关系
笔记
Database_Cool_7 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
爱写代码的阿森8 小时前
鸿蒙三方库 | harmony-utils之KvUtil键值型数据库操作详解
数据库·华为·harmonyos·鸿蒙·huawei
Database_Cool_8 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
姜太小白9 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql
a1117769 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
窝子面9 小时前
手搓最简前后端协作-node
javascript·数据库
吳所畏惧10 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
运维·服务器·数据库·redis·缓存·ssh