🤖 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])}$