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

该笔记总结自 《数据库系统概论》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;

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

如有侵权,请联系删除!

相关推荐
hj2862511 小时前
NFS共享存储 完整超详笔记(含原理+流程+命令详解+案例)
笔记
xcLeigh1 小时前
鸿蒙平台 NixNote2 富文本笔记应用适配实战:从 Linux 到 鸿蒙PC 的 Electron 迁移
linux·笔记·harmonyos·富文本·nixnote2·evernote
kdxiaojie1 小时前
Linux 驱动研究 —— SPI (2)
linux·运维·笔记·学习
nan madol1 小时前
PolarDB 分布式版(PolarDB-X)
数据库
星恒随风1 小时前
C++ 模板初阶:从泛型编程、函数模板到类模板,一篇打通基础概念
开发语言·c++·笔记·学习
johnny2331 小时前
数据库客户端:DBGate、DBX、dblab、SQLQueryStress、openhare、DBcooper、RedisME
数据库
IT策士1 小时前
Redis 从入门到精通:缓存经典难题 —— 穿透、击穿、雪崩
数据库·redis·缓存
LuminousCPP2 小时前
数据结构 - 单链表第二篇:单链表进阶操作
c语言·数据结构·笔记·链表
湘美书院--湘美谈教育2 小时前
湘美谈教育湘美书院考古教育系列:湖南史前文化序列整理
大数据·数据库·人工智能·深度学习·神经网络·机器学习