跳至主要內容

SQL 必知必会

kfkfka zkye...大约 2 分钟

SQL 必知必会

count

  • count(*) :它会获取所有行的数据,不做任何处理,行数加1。
  • count(1):它会获取所有行的数据,每行固定值1,也是行数加1。
  • count(id):id代表主键,它需要从所有行的数据中解析出id字段,其中id肯定都不为NULL,行数加1。
  • count(普通索引列):它需要从所有行的数据中解析出普通索引列,然后判断是否为NULL,如果不是NULL,则行数+1。
  • count(未加索引列):它会全表扫描获取所有数据,解析中未加索引列,然后判断是否为NULL,如果不是NULL,则行数+1。

由此,最后count的性能从高到低是:

count(*) ≈ count(1) > count(id) > count(普通索引列) > count(未加索引列)

所以,其实count(*)是最快的。

参考自:https://mp.weixin.qq.com/s/g2NsLkclSTeUQoeDRER3Qg

group by

有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面,否则会报错。可用 group_concat() 包裹输出。

基础用法参考:想要弄懂GROUP BY看这一篇就够了open in new window

关键字的执行顺序

# 关键字的书写顺序如下:
		1.select 
		2.from
		3.where
		4.group by
		5.having
		6.order by
		7. limit
# 关键字的执行顺序如下:
    	1.from	    //行过滤
		2.where
		3.group by
		4.having
		5.select	//列过滤
		6.order by  //排序
		7.limit     //附加

重要 进一步的,由于SQL语句执行顺序如下:

FROM - ON - JOIN - WHERE - GROUP BY - `WITH` - HAVING - SELECT - DISTINCT - ORDER BY - LIMIT

仅三类可以跟聚合函数:select、having、order by

where 先于 having 执行,having 属于二次过滤,故能先 where 过滤的条件先过滤,性能会高很多。

问:join on 和 where 的区别?

答:一般两者的比较可以限定在联表查询的前提下

  1. join 先于 where 执行
  1. join 可认为是生成临时的表用于查询,而 where 更类似于在紧邻的 from 后的表上做过滤
  1. …

子查询与连接查询

子查询方法在子查询内可排除大量数据的时候性能将优于连接查询

# 查看所有来自浙江大学的用户题目回答明细情况,表 question_practice_detail 和 user_profile

# 子查询
select device_id, question_id, result
from question_practice_detail
where device_id in (
    select device_id
    from user_profile
    where university = "浙江大学"
);

# 连接查询
select question_practice_detail.device_id,question_id,result
from question_practice_detail, user_profile
where question_practice_detail.device_id = user_profile.device_id
and user_profile.university = "浙江大学";

# 内查询
select question_practice_detail.device_id,question_id,result
from question_practice_detail inner join user_profile
on question_practice_detail.device_id = user_profile.device_id
and user_profile.university = "浙江大学";

合并操作

# or,筛选出的结果为去重过的结果,即满足多条件的值为一条,应该是由于短路
select * from user_profile where a = "a" or b = "b";

# union,结果同 or,即去并集,集合默认去重
select * from user_profile where a = "a"
union
select * from user_profile where b = "b"

# union all,结果直接合并,不做去重操作
select * from user_profile where a = "a"
union all
select * from user_profile where b = "b"
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.8