SQL 查询
1. 查询最值
如;最大、时间最晚、最小、最高
select * from table_xx group by XXX (DESC) limit 0,1
2. 查询第N大的元素
最简单的是直接用limit查询
select * from employees ORDER BY hire_date DESC limit 2,1
2.1 如果第N大的元素,有多个重复的,怎么办
如:查找入职员工时间排名倒数第三的员工所有信息
答:先去重,找到入职时间是到数第三的那个日期,然后找到所有那天入职的员工
select * from employees where hire_date=
(select distinct hire_date from employees order by hire_date desc limit 2,1);
3. 默认是ASC 按照升序,DESC是降序
4. LIMIT
limit 0,1 取第1个
limit 1,1 取第二个
limit N,1 取第N+1个
limit 1 ,取第一个
limit 3 ,取前三个
limit N 取前N个
5. Left join on 后面的条件和where后面条件的区别
left join on 是左连接
- 表 A 和表 B 的连接依靠关联条件
- 主表的筛选条件,应该放置在 where 条件后
- on 后面的筛选条件是针对于关联表
- 关联表的筛选条件,如果放置在 on 后面,那么 A 和 B 的连接顺序为:B 表先按条件查询,再与 A 表连接,即先筛选再连接;(数据会多)
- 如果放置在 where 后面,那么 A 和 B 的连接顺序为:A 与 B 连接后,再从连接表中筛选,即先连接再筛选
where 后面的条件是对连接后的数据进行筛选(数据会少一些)
6. 查询一张表薪资涨幅超过15次的员工
select emp_no, count(distinct salary ) as t
from salaries
group by emp_no
having t > 15
注意: having要跟在分租之后,而且多用于聚合函数,比如上面的count就是聚合函数
7. order by中索引的使用
- 如果select 只查询索引字段,order by 索引字段会用到索引,要不然就是全表排列;
//一张表 id(主键)name obj(有索引) score
EXPLAIN select id ,name from you_class order by obj //查询了多个,不可以
EXPLAIN select name from you_class order by obj //查询字段没有索引,不可以
EXPLAIN select id from you_class order by obj
//查询虽然不是order by字段,但是用到了索引,而且还是Obj的索引,而非id的索引
EXPLAIN select obj from you_class order by obj //用到索引,obj的索引
- 但是有个例外:主键ID
经过测试,无论查询一个或者多个,只要是按照id orderby 都会用到主键索引
EXPLAIN select * from you_class order by id //用到索引,id
EXPLAIN select * from you_class where obj ='数学' order by id
//用到索引,但是是where中obj的索引
- 如果是查询多个,但是where条件中满足索引查询的条件,order by 也会用到索引
//这样可以
EXPLAIN select id ,name from you_class where obj='数学' order by obj
-
但是如果where的条件和order by的条件都有索引,优先使用where的索引
//假如说:name和obj都有索引了,优先使用where EXPLAIN select * from you_class where name ='a' order by obj
8. Group By 索引的使用
group by的顺序必须和where条件的顺序一样才能使用索引,而且满足索引的左原则
1、查询字段必须和后面GROUP BY 一致
select TeamID from competeinfo where TeamID >10 group by TeamID。
这里就是通过TeamID 来查找。完成group by 。
2、联合索引的应用,切记注意GROUP BY 顺序,Where 条件和GROUP BY 字段得是一个索引里面的
这个表CompeteID,TeamID建立联合索引
1)select TeamID from competeinfo
where TeamID >10 and CompeteID > 100020 group by CompeteID
这个查询用到了CompeteID,TeamID联合索引,而且单独使用一个也是可以用到索引的,
只要不是多个且顺序反了的情况下,都可以用到索引
2)select TeamID from competeinfo where TeamID >10 and CompeteID > 100020 group by TeamID
这样的话查询group by中就没有用到索引了
9. Limit和索引没有直接关系