SQL知识

UNION

UNION 和 UNION ALL 用来 合并两个或多个 SELECT 查询的结果集,要求每个 SELECT 查询的 列数和列类型必须一致。

操作功能去重情况性能
UNION合并结果集,并自动去掉重复行会去重较慢(需要排序去重)
UNION ALL合并结果集,不去重不去重快(直接合并)
1
2
3
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;

GROUP_CONCAT

GROUP_CONCAT 是一个SQL 函数,用来将拼接字符传的

1
2
3
4
5
6
7
# 拼接 name
SELECT GROUP_CONCAT(name) AS names FROM user;
# 去重拼接
SELECT GROUP_CONCAT(DISTINCT name) AS names FROM user;
# 多字段拼接
SELECT GROUP_CONCAT(CONCAT('ID=', id, ',NAME=', name) SEPARATOR '; ') FROM user;

IN

  • IN 会走索引吗?
  • 我:

    答:走索引,MySQL 会把它当成多个 id = ? 的等值查询。
    IN 的数量太大,超过表数据的四分之一时,会有全表扫描

SQL规范

  1. 非主子表尽量不要连表查询

    • 非主子表一般没有 一对多关系,或者外键关联的表。用join 极大可能会走全表扫面。使SQL速度很慢。
    • join 会使SQL 耦合较高,不好维护。
  2. 多表 JOIN 时,尽量选择结果集较小(过滤后行数少)的表作为驱动表(Driving Table)

    • 驱动表:先被读取、做循环的那张表
    • 被驱动表:根据驱动表的行去匹配的表
      -SQL执行的时候,会先去查 驱动表的数据,然后循环每一条数据,去匹配他表。所以 小表作为驱动表,可以使循环次数最少
      1
      2
      3
      for(驱动表每一行){
      去被驱动表匹配
      }
  3. update 语句 禁止携带 limit

    可能导致主从不一致。
    主从数据库采用 Statement-Based Replication(SBR,语句复制) 时,binlog记录sql语句,同步到主表。主库和从库更新的数据可能不一样,如果没有明确指定 id
    Row-Based Replication(RBR,行复制) 记录的是一整行的数据,相对安全

总结