💻博主现有专栏:
C51单片机(STC89C516),c语言,c++,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux,基于HTML5的网页设计及应用,Rust(官方文档重点总结),jQuery,前端vue.js,Javaweb开发,Python机器学习等
🥏主页链接:
目录
[🎃Order by子句](#🎃Order by子句)
[🎃group by字句](#🎃group by字句)
🎯语句格式
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]
FROM <表名或视图名>[,<表名或视图名> ]...|(SELECT 语句)
[AS]<别名>
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
- SELECT子句:指定要显示的属性列
- FROM子句:指定查询对象(基本表或视图)
- WHERE子句:指定查询条件
- GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。
- HAVING短语:只有满足指定条件的组才予以输出
- ORDER BY子句:对查询结果表按指定列值的升序或降序排序
🎯单表查询
🎃查仅涉及一个表
✨选择表中若干列
查询全部列
选出所有属性列:
- 在SELECT关键字后面列出所有列名
- 将<目标列表达式>指定为 *
查询经过计算的值:
- SELECT子句的<目标列表达式>不仅可以为表中的属性列,也可以是表达式
✨选择表中的若干元组
消除取值重复的行
- 如果没有指定DISTINCT关键词,则缺省为ALL
- 指定DISTINCT关键词,去掉表中重复的行
确定集合:
- 谓词:IN <值表>, NOT IN <值表>
字符匹配:
- 谓词: [NOT] LIKE '<匹配串>' [ESCAPE ' <换码字符>']
涉及到控制查询:
- 谓词: IS NULL 或 IS NOT NULL "IS" 不能用 "=" 代替
多重条件查询
- 逻辑运算符:AND和 OR来连接多个查询条件
- AND的优先级高于OR
- 可以用括号改变优先级
🎃Order by子句
- 可以按一个或多个属性列排序
- 升序:ASC;降序:DESC;缺省值为升序
- 对于空值,排序时显示的次序由具体系统实现来决定
🎃聚集函数
统计元组个数 :
- COUNT(*) 统计一列中值的个数
- COUNT([DISTINCT|ALL] <列名>)
计算一列值的总和(此列必须为数值型):
- SUM([DISTINCT|ALL] <列名>)
计算一列值的平均值(此列必须为数值型):
- AVG([DISTINCT|ALL] <列名>)
求一列中的最大值和最小值 :
- MAX([DISTINCT|ALL] <列名>)
- MIN([DISTINCT|ALL] <列名>)
🎃group by字句
GROUP BY子句分组:
细化聚集函数的作用对象
- 如果未对查询结果分组,聚集函数将作用于整个查询结果
- 对查询结果分组后,聚集函数将分别作用于每个组
- 按指定的一列或多列值分组,值相等的为一组
HAVING短语与WHERE子句的区别:
- 作用对象不同 WHERE子句作用于基表或视图,从中选择满足条件的元组
- HAVING短语作用于组,从中选择满足条件的组。
🎯连接查询
连接查询:同时涉及两个以上的表的查询
连接条件或连接谓词:用来连接两个表的条件
- 一般格式: [<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>
- [<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>
连接字段:连接谓词中的列名称
连接条件中的各连接字段类型必须是可比的,但名字不必相同
🎃等值与非等值连接查询
等值连接:连接运算符为=
方法:
- 嵌套循环法(NESTED-LOOP)
- 排序合并法(SORT-MERGE)
- 索引连接(INDEX-JOIN)
自然连接:
一条SQL语句可以同时完成选择和连接查询,这时WHERE子句是由连接谓词和选择谓词组成的复合条件。
执行过程:
- 先从SC中挑选出Cno='2'并且Grade>90的元组形成一个中间关系
- 再和Student中满足连接条件的元组进行连接得到最终的结果关系
🎃自身连接
- 自身连接:一个表与其自己进行连接
- 需要给表起别名以示区别
- 由于所有属性名都是同名属性,因此必须使用别名前缀
🎃外连接
外连接与普通连接的区别:
- 普通连接操作只输出满足连接条件的元组
- 外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
左外连接:
- 列出左边关系中所有的元组
右外连接:
- 列出右边关系中所有的元组
🎃多表连接
多表连接:两个以上的表进行连接
在建立数据表时,如果一个表与多个表联接,那么这一个表中的字段必须是"数字"数据类型,而多个表中的相同字段必须是主键,而且是"自动编号"数据类型。 否则,很难联接成功。 代码嵌套快速方法:如,想连接五个表,则只要在连接四个表的代码上加一个前后括号(前括号加在FROM的后面,后括号加在代码的末尾即可),然后在后括号后面继续添加"INNER JOIN 表名X ON 表1.字段号=表X.字段号"代码即可,这样就可以无限联接数据表了。
🎯嵌套查询
嵌套查询概述:
- 一个SELECT-FROM-WHERE语句称为一个查询块
- 将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
- 上层的查询块称为外层查询或父查询
- 下层查询块称为内层查询或子查询
- SQL语言允许多层嵌套查询:即一个子查询中还可以嵌套其他子查询
- 子查询的限制:不能使用ORDER BY子句
嵌套查询可分成不相关子查询和相关子查询两类。
- 不相关子查询的查询条件不依赖于父查询,一般使用谓词IN。
- 相关子查询的查询条件依赖于外层父查询的某个属性值,一般使用谓词EXISTS。
同样一个查询,既可以用不相关子查询实现,也可以用相关子查询实现,也可以用连接查询实现。
🎯集合查询
集合操作的种类
- 并操作UNION
- 交操作INTERSECT
- 差操作EXCEPT
- 参加集合操作的各查询结果的列数必须相同;对应项的INTERSECT
数据类型也必须相同,列名可以不同
UNION:将多个查询结果合并起来时,系统自动去掉重复元组
UNION ALL:将多个查询结果合并起来时,保留重复元组
🎯基于派生表的查询
子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成的临时派生表(Derived Table)成为主查询的查询对象
例子:
查询所有选修了1号课程的学生姓名,可以用如下查询完成:
SELECT Sname
FROM Student,
(SELECT Sno FROM SC WHERE Cno=' 1 ') AS SC1
WHERE Student.Sno=SC1.Sno;
🎯SELECT语句的一般形式
SELECT [ALL|DISTINCT]
<目标列表达式> [别名] [ ,<目标列表达式> [别名]] ... FROM
<表名或视图名> [别名]
[ ,<表名或视图名> [别名]] ...
|(<SELECT语句>)[AS]<别名>
[WHERE <条件表达式>]
[GROUP BY <列名1>[HAVING<条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]];
🎃目标列表达式的可选格式
目标列表达式格式
(1) *
(2) <表名>.*
(3) COUNT([DISTINCT|ALL]* )
(4) [<表名>.]<属性列名表达式>[,<表名>.]<属性列名表达式>]...
其中<属性列名表达式>可以是由属性列、作用于属性列 的聚集函数和常量的任意算术运算(+,-,*,/)组成的 运算公式
🎃聚集函数的一般形式
COUNT
SUM
AVG ------------------》([DISTINCT|ALL] <列名>)
MAX
MIN