文章目录
article
DQL
AI文章摘要
qwen-turbo-latest
加载中...
SELECT
SELECT
[[ALL|DISTINCT]"colName1" [AS] "alias",]
[[ALL|DISTINCT]"colName2" [AS] "alias",]
...
[ALL|DISTINCT]"colNamen" [AS] "alias"
FROM
["tableName1" [[natural] [{right|left outer}|inner] join "tableName"' on join_predicate|using([c1,]...,cn) [AS] "alias",]
["tableName2" [[natural] [{right|left outer}|inner] join "tableName'" on join_predicate|using([c1,]...,cn) [AS] "alias",]
...
"tableNamen" [[natural] [{right|left outer}|inner] join "tableName'" on join_predicate|using([c1,]...,cn) [AS] "alias"
[WHERE predicate ] ;
[GROUP BY
["colName1",]
["colName2",]
...
"colNamen"
[HAVING predicate]]
[ORDER BY
["colName1" [ASC|DESC],]
["colName2" [ASC|DESC],]
...
colNamen [ASC|DESC]]
SELECT字段
选择投影字段, 可以对字段进行表达式处理. – ALL|DISTINCT: DISTINCT会去除重复元组 – AS: 别名
FROM字段
选择若干表并进行笛卡尔积 – JOIN可以进行连接操作, ON指定连接条件. using指定自然连接的字段 – AS: 别名
WHERE字段
元组选择, 通过谓词和连接词对FROM的元组进行过滤
GROUP BY字段
按GROUP BY字段进行分组归并, 分组归并后SELECT只能处理分组字段 – HAVING… 通过HAVING可以对分组进行过滤.
ORDER BY字段
元组排序, 缺省升序排序. ASC 升序排列(缺省) DESC 降序排列
语句的执行顺序
- FROM阶段: 求笛卡尔积、ON筛选器、添加外部行
- WHERE阶段: 根据predicate筛选元组
- GROUP BY阶段: 根据指定列名进行分组. NULL值被归为同一组.
- HAVING阶段: 根据predicate筛选分组.
- SELECT阶段: 计算列表中的表达式, 若指定DISTINCT则去除重复元组
- ORDER BY阶段: 根据指定列名进行排序
SubQuery
子查询只能应用在SELECT FROM WHERE HAVING中,
- 单行子查询: 单行子查询只能使用单行操作符
- 多行子查询:多行子查询只能使用多行操作符
SELECT字段
FROM字段
WHERE字段
HAVING字段
谓词
谓词可以应用于WHERE HAVING
IN谓词
exp [Not] In( subQuery )
判断表达式的值是否在子查询返回对的集合中 其中表达式最简单的形式是列名或常数
- 元组演算表达式: ${t[xx] | t\in parentQuery \wedge [\not\exists|\exists](u\in sonQuery|parentQuery)(exp = u[xx])}$
- 注意:
- in做的是等值判断, 返回的是真或者假. 表达式要和返回结果要一致才能比对
- in可以简化等值判断条件的书写格式: 例如 S=“a” AND S=“b"等价于S in (“a”,“b”) 子查询可以直接以集合方式给出
ANY谓词
-- ANY谓词表示任意(其中某一个)的意思, 但单词容易联想到"所有"的含义, 所以使用SOME谓词代替, ANY和SOME是等价的.
exp θ ANY( subQuery )
exp θ SOME( subQuery )
- 元组演算表达式: ${t[xx] | t\in parentQuery \wedge \exists(u\in sonQuery|parentQuery)(exp \ \theta \ u[xx])}$
ALL谓词
exp θ All( subQuery )
- 元组演算表达式: ${t[xx] | t\in parentQuery \wedge \forall(u\in sonQuery|parentQuery)(exp \ \theta \ u[xx])}$
EXISTS谓词
[Not] EXISTS( subQuery )
- **元组演算表达式**: $\{t[xx] | t\in parentQuery \wedge [\not\exists|\exists](u\in sonQuery|parentQuery)(P(exp,t[xxx]))\}$
IS谓词
exp IS [Not] NULL
LIKE谓词
exp [Not] LIKE
- 简单正则表达式, 完整正则请使用
RLIKE
%
: 相当于完整正则中的.*
_
: 相当于完整正则中的.
\
: 和完整正则一致, 充当特殊符号的转义功能.
函数
- 单列函数: 单行函数作用于单行, 可以用于SELECT、WHERE、HAVING中用于处理单行数据.
- 聚集函数: 聚集函数作用于多行, 可以用在SELECT 、HAVING中用于处理多行数据.
- 聚集函数常用于统计分析, 并伴随着分组, 且聚合函数排除值为null的行
- CASE结构: CASE结构用于实现逻辑判断类的操作.
CASE...[WHEN...THEN...]...END
集合运算
SELELCT的结果仍然是一个集合,SQL标准提供集合相关的操作
SelectExpresssion1 UNION SelectExpresssion2
SelectExpresssion1 INTERSET SelectExpresssion2
SelectExpresssion1 EXCEPT SelectExpresssion2
SELECT总结
关系代数思维
$Π xxx,…(σ \ _{P(t_1,t_2)}\ (table_1×table_2×…))$
关系演算思维
关系演算思维比较抽象难以理解, 在思考的时候可以采取分解问题为子问题的方式先写出sql,然后使用谓词进行连接 ${t[xx,…] \ | \ t\in table_1×table_2×… \wedge P(exp,t[xxx])}$