select 可以包含很复杂,很丰富的逻辑,最能考验一个人的逻辑思维能力和sql语句的掌握程度,我是这么认为,以前的很多次面试几乎都死在它手上,所以才有了今天的这篇日志,下定决心把它学好。
where 表达式
我们要这样理解,表达式放在表中的哪一行成立,哪一行就取出来
=,>,<,>=,<=,!=/<>,and,or,between and,in,not
group by
分组,一般和统计函数配合使用才有意义
max,min,avg,count,sum
having 表达式
数据在表中,表在硬盘或内存以文件形式存在
和where区别:where 是针对表文件发挥作用的。
查询出的结果,也可以看成一张表,其文件一般临时存在于缓冲区
having就是针对查询结果发挥作用的。
所以应该现有where,才有having
order by 排序
可以针对字段进行排序,order by 字段1 [asc] 升序,[desc] 降序
有可能一个字段排序不出结果,可以选用其他字段继续排序,
order by 字段1 [asc/desc],字段2 [asc/desc]
limit [offset,] N
offset:偏移量
N:取出的条目
例如:要取某张表3-5行的记录,
select * from tableName limit 2,3;
注意:where->group by->having-order by->limit,必须按顺序出现。
子查询(重点)
where型的子查询:把内层查询的结果作为外层查询比较的条件
差不多这种形式:
select * from tableName where tid = (select tid from ...);
from型子查询:把内层查询的结果,当做一张临时表,供外层继续查询
形式:select * from (select * from ...) as temp group by...;
exists型子查询:把外层的查询结果拿到内层,看内层的查询是否成立
形式:select oid from outTable o where exists(select * from inTable i where i.oid=o.oid);