SQL查询高级

版权声明:本文为HCG原创文章,未经博主允许不得转载。请联系[email protected] https://blog.csdn.net/qq_39455116/article/details/88358024

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 是左连接

  1. 表 A 和表 B 的连接依靠关联条件
  2. 主表的筛选条件,应该放置在 where 条件后
  3. on 后面的筛选条件是针对于关联表
  4. 关联表的筛选条件,如果放置在 on 后面,那么 A 和 B 的连接顺序为:B 表先按条件查询,再与 A 表连接,即先筛选再连接;(数据会多)
  5. 如果放置在 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中索引的使用

  1. 如果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的索引
  1. 但是有个例外:主键ID

经过测试,无论查询一个或者多个,只要是按照id orderby 都会用到主键索引

EXPLAIN select *  from you_class    order by id  //用到索引,id
EXPLAIN select *  from you_class   where obj ='数学' order by id 
//用到索引,但是是where中obj的索引
  1. 如果是查询多个,但是where条件中满足索引查询的条件,order by 也会用到索引
//这样可以
EXPLAIN select id ,name from you_class where obj='数学'  order by obj
  1. 但是如果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和索引没有直接关系

猜你喜欢

转载自blog.csdn.net/qq_39455116/article/details/88358024