SQL II 多表操作
逻辑顺序
JOIN Queries
用来解决交叉表
将表进行叉乘之后再筛选
默认INNER JOIN
自然连接(Natural Join)
是关系型数据库中一种常用的连接操作,它在两个表中根据相同名称的列(通常是主键和外键)进行连接。自然连接会自动匹配两个表中列名相同的字段,并且去除重复的列。
自然连接的特点:
- 自动匹配列:自然连接会自动识别两个表中列名相同的列,并根据这些列进行连接。
- 去除重复列:在连接结果中,重复的列会被去除,避免出现冗余信息。
- 基于相等条件:自然连接的本质是基于列的相等进行连接。
Left Outer Join
左表不匹配的项也会出现一次,没有匹配的地方填充null
Right Outer Join
同理
Full Outer Join
left+right
alias
输出结果可以取别名
FROM里面也可以取别名
可以在select, where任意地方进行算数
其他功能
可以当个单纯的计算机
String Comparsion
正则表达式
基本正则表达式符号
- 字符匹配:
- 普通字符:
a
、b
、1
、A
都表示字符本身。 .
:匹配除换行符以外的任何单个字符。例如,a.b
可以匹配aab
、acb
、a-b
等。\
:用于转义特殊字符,例如\\
匹配反斜杠,\.
匹配点号。
- 普通字符:
- 字符类(Character classes):
[abc]
:匹配字符a
、b
或c
中的任意一个。[a-z]
:匹配任何小写字母。[0-9]
:匹配任何数字。[^abc]
:匹配除了a
、b
和c
以外的任何字符。\d
:匹配任何数字,等价于[0-9]
。\w
:匹配任何字母数字字符(包括下划线),等价于[a-zA-Z0-9_]
。\s
:匹配任何空白字符,包括空格、制表符和换行符。
- 量词(Quantifiers):
\*
:匹配前一个字符零次或多次。例如,a*
匹配零个或多个a
字符。+
:匹配前一个字符一次或多次。例如,a+
匹配一个或多个a
字符。?
:匹配前一个字符零次或一次。例如,a?
匹配零个或一个a
字符。{n}
:精确匹配前一个字符出现的次数。例如,a{3}
只匹配aaa
。{n,}
:匹配前一个字符出现至少n
次。例如,a{2,}
匹配两个或更多a
字符。{n,m}
:匹配前一个字符出现至少n
次,最多m
次。例如,a{2,4}
匹配aa
、aaa
或aaaa
。
- 位置匹配符:
^
:匹配字符串的开头。例如,^abc
匹配以abc
开头的字符串。$
:匹配字符串的结尾。例如,abc$
匹配以abc
结尾的字符串。\b
:匹配单词边界。例如,\babc\b
匹配独立的abc
,不会匹配xabc
或abcx
。
- 分组和选择:
()
:用来分组或捕获子表达式。例如,(abc)
捕获abc
字符串。|
:表示“或”操作,匹配左边或右边的表达式。例如,a|b
匹配a
或b
。
- 其他特殊字符:
\d
:匹配任何数字字符,等价于[0-9]
。\w
:匹配任何字母数字字符,等价于[a-zA-Z0-9_]
。\s
:匹配任何空白字符
set集合关系
UNION
UNION
是 SQL 中用于合并两个或多个查询结果的操作符。它允许你将多个 SELECT
语句的结果合并为一个结果集,返回的是一个去重后的集合。也就是说,UNION
会自动去除重复的行。如果你希望保留重复的行,可以使用 UNION ALL
。
INTERSECT
INTERSECT
是 SQL 中的一个集合运算符,用于返回两个查询结果集的交集。即,它只会返回两个 SELECT
查询结果中同时存在的行(即两个查询都返回的相同数据)。如果某个记录只在一个查询结果中出现,而在另一个查询结果中没有出现,INTERSECT
会把它排除在外。
-
INTERSECT ALL: min of cardinalities
EXCEPT
EXCEPT
是 SQL 中的一个集合操作符,用于返回第一个查询结果中有,但第二个查询结果中没有的记录。它基本上返回的是第一个查询和第二个查询的差集,即 SELECT
查询的结果集中,存在于第一个查询中而不存在于第二个查询中的行
- EXCEPT ALL:difference of cardinalities <0的结果不输出
IN
WHERE里可以用IN后面跟一个集合(可以是subquery)
还可以写NOT IN不在这个集合里面
EXISTS
如果子查询里面有结果,就返回true(正常返回主查询)
如果子查询为空,主查询不返回东西
相当于一个函数每一个外部的都会放入子查询
ALL
ALL
是 SQL 中的一个关键字,用于与子查询一起使用,用来对比一个列的值与子查询返回的所有结果集合。ALL
可以用在 WHERE
子句中,通常与比较运算符(如 =
, <
, >
, <=
, >=
, !=
)配合使用。
CREATE VIEW
类似于编程中的函数 适合复杂查询分解成小部分
- 可以将复杂逻辑切换成简单部分
- 保证了安全性,只给予view的权限,不给表的权限
- 不会储存,而是每次都进行计算
可以就像使用常规表和查询一样
也可以不用view,只用一次的查询,可以直接放在from里
这个from里面的内容就是写的筛选出红色船有多少只 在from里面动态执行
WITH
后续可以复用的表
可以互相进行级联
NULL VALUE
SQL中的每一个数据类型都可以由null
如何判断NULL (转换成boolean值)
IS null
IS NOT null
聚合函数会自动忽略null
三值逻辑(Three-Valued Logic)
SQL 使用三值逻辑来处理 NULL
,即除了 TRUE
和 FALSE
,还允许 UNKNOWN
(未知)值。如果一个表达式涉及 NULL
,结果通常为 UNKNOWN
。这就是为什么在 NULL
和任何值进行比较时,不能直接得到 TRUE
或 FALSE
,而是得到 UNKNOWN
。