以下内容需熟悉SQL语句之后,配合SQL习题食用更好🙊
#MySQL
【常见常用】:
-
Inner join(内连接)= join:返回两个表的交集。根据两个表共有的列来匹配其中的行
-
Left join(左连接):以左表为基准,若右表中对应行不满足条件,则结果会将右表中的值以null形式匹配进来。
-
Cross join(交叉连接):笛卡尔积,第一个表符合查询条件的行数乘以第二个表中符合查询的行数。
-
Union all(全连接):有重复(不过滤去重)
-
Union:无重复(过滤去重)
-
Limit 2:从0索引开始读取2条数据
-
Limit 2, 1:从第2条记录开始读取1条数据(即第3条数据)
【排序窗口函数】(还是不太熟练):
row_number():为查询出来的每一行记录生成一个序号,依次排序且不会重复
语法结构:row_number() over(partition by 字段1 order by 字段2)
rank():使用rank函数生成序号,over子句中排序字段相同的序号是一样的,后面字段值不相同的序号将跳过相同的排名排下一个,rank函数生成的序号有可能是不连续的,即排名可能为1,1,3跳跃式排名(语法结构同上)。
dense_rank()
生成序号是连续的,当出现相同排名时,将不跳过相同排名号,有两个第一名仍跟着第二名,即排名为1,1,2这种(语法结构同上)。
【on和where的区别!!】:
- 内连接时无区别;
- 外连接(以左连接为例):on是在生成临时表时使用的条件,不管on的条件是否为真,都会返回左表中的全部记录;where是在临时表生成之后,再对临时表过滤的条件,条件不为真就全部过滤。
【字符串操作函数】:
- concat():将多个字符串连接成一个字符串,连接符用引号引起来,需多次指定。分隔符不能为null,否则结果全为null。
语法结构:CONCAT(string1, string2, …)
- concat_ws():concat With Separator 在最开始的位置加分隔符,指定一次即可。
语法结构:CONCAT(separator, string1, string2, …)
- group_concat():将group by产生的同一个分组中的值连接起来,返回一个字符串。
语法结构:group_concat(distinct 字段 [order by 字段 ASC/DESC][separator ‘分隔符’])
- like():需要与通配符一起使用(‘%’表示任意字符出现任意次数,‘_’仅能匹配单个字符)
- substr():从字段中提取出相应位置的字符
substr(str, 1, 4) 假如str表示2023-05-18,那么从其中提取出2023。1表示起始位置,4表示截取的长度。
- regexp(): 正则表达式匹配函数
【数据倾斜】是什么?如何解决?
大量相同的key被分配到同一个区内,一个节点承受巨大的压力,而其他节点计算完毕后一直在等这个忙碌的节点,拖累了整体的计算时间,效率非常低。
解决方法:使用小表在左,大表在右,使用 / + map join(table)/ 连接,假设表A位小表,B为大表。
# 普通查询
SELECT A.字段, B.字段
FROM A INNER JOIN B ON A.字段 = B.字段;
# 使用map join
SELECT map join (A) A.字段, B.字段
FROM A INNER JOIN B ON A.字段 = B.字段;