文章目录

  • 1. 聚合函数
  • 2. 字符串函数
  • 3. GROUP BY
  • 什么时候用
  • 如何用
  • 4. JOIN
  • 5. 窗口函数
  • 6. 条件语句
  • 其他
  • EXISTS


SQL 极简核心(1)核心内容

主要详细记录下重要知识点的概念和用法。

(更详细部分:已经单独写了文章)

SQL Server 2008 字符串聚合 sql 聚合函数 字符串拼接_窗口函数

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

什么时候用

SQL Server 2008 字符串聚合 sql 聚合函数 字符串拼接_database_02


如果结果如上图所示,那么就应该使用GROUP BY 吗?

不,GROUP BY 一般与聚合函数一起使用。

如何用

下面的代码为什么会发生bug

SELECT a, b, SUM(c)
FROM table
GROUP BY b

大白话讲,因为 bc 都由多行变为了一行,系统并不知道按照什么规则将相应的多行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)