SQL问题总结

本文介绍了SQL中的内连接、左连接、交叉连接和全连接,以及排序窗口函数如row_number()、rank()和dense_rank()的用法。还讨论了on和where子句的区别,并列举了字符串操作函数如concat()和group_concat()。文章最后提到了数据倾斜问题及其解决方案——使用MapJoin优化查询。
摘要由CSDN通过智能技术生成

以下内容需熟悉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.字段;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值