文章目录
- 1. 聚合函数
- 2. 字符串函数
- 3. GROUP BY
- 什么时候用
- 如何用
- 4. JOIN
- 5. 窗口函数
- 6. 条件语句
- 其他
- EXISTS
SQL 极简核心(1)核心内容
主要详细记录下重要知识点的概念和用法。
(更详细部分:已经单独写了文章)
1. 聚合函数
条件聚合函数
2. 字符串函数
大小写
LOWER(str)
UPPER(str)
拼接函数
CONCAT(str1, str2, ...)
GROUP_CONCAT(col)
切片函数
LEFT(str, n)
、RIGHT(str, n)
SELECT LEFT('isql', 2) # return is
SUBSTRING(str, index, n)
SELECT SUBSTRING('isql', 1, 1) # return 1 ,注意是从1开始而不是0
SELECT SUBSTRING('isql', -2, 2) # return ql
长度函数
LENGTH(str)
SELECT LENGTH('sq,l') # return 4
替换函数
REPLACE(str, target_str, result_str)
SELECT REPLACE('sq,l', ',', '') # return sql
3. GROUP BY
什么时候用
如果结果如上图所示,那么就应该使用GROUP BY
吗?
不,GROUP BY
一般与聚合函数一起使用。
如何用
下面的代码为什么会发生bug
?
SELECT a, b, SUM(c)
FROM table
GROUP BY b
大白话讲,因为 b
和 c
都由多行变为了一行,系统并不知道按照什么规则将相应的多行a
数据变为相应的一行数据,可能是返回第一条数据,具体的返回策略随平台也不尽相同。
如果聚合函数是MAX()
、MIN()
也是同理,因为可能纯在多条最值数据。
所以,如果使用GROUP BY
,对SELECT
的限制是,字段要么是聚合对象,要么是分组对象。
解决办法是在子查询中使用聚合函数和GROUP BY,或者使用窗口函数。
具体可以参考题目:SQL67 牛客每个人最近的登录日期(二)
4. JOIN
FROM table_a a # 省略 AS,实际指 table_a AS a
JOIN table_b b
JOIN的本质是列合并
,以上代码将表格b
中的字段加入到表格a
中,形成了一个全新的表格;
(可以朴素地理解为,想要同时使用两张表格的字段则需要用到JOIN)
而INNERJOIN 和 LEFT JOIN的区别是,ON之后过滤条件的的针对对象不同:
INNER JOIN :列合并 + 使用ON对两个表行过滤
LEFT JOIN:;列合并 + 使用ON对右表行过滤(对左表不影响)
5. 窗口函数
有空要总结一下
Oracle开发之:窗口函数 (转)
常见的窗口函数:
聚合窗口函数
- 求和:SUM()
- 计数:COUNT()
排序窗口函数 - RANK()
- DENSE_RANK()
- ROW_NUMBER()
最值窗口函数 - MA()
- MIN()
6. 条件语句
- CASE WHEN
- IF
其他
EXISTS
- EXISTS(W3schools)
The EXISTS operator is used to test for the existence of any record in a subquery.
The EXISTS operator returns TRUE if the subquery returns one or more records.
- 基本型:
SELECT c1
FROM t2
WHERE EXISTS (SELECT c2 FROM c2 WHERE condition);
- 本质:谓词
EXISTS的本质是谓词
,即返回真值,因此一般用在WHERE语句
后引导一个子查询,整体作为外表的判断条件。 - 原理和用法
其用法根据子查询不同而不同,当子查询中的WHERE condition
与外表字段有关系时(即关联子查询,一般是这种情况),则执行时会遍历循环外表中的每一条数据,将其放到内表中的条件去查询,若存在则将其加入结果集(点击)。 - EXISTS 与 IN 的区别
IN
是把外表和内表作hash连接
;而EXISTS
是对外表作loop循环
,每次loop循环
再对内表进行查询- 一般认为
EXISTS
的效率比IN
的效率高
- (例题可以参考牛客SQL57)