跳到主要内容

MySQL学习记录_使用技巧

导入数据

  1. source xx.sql 需要在命令行执行,这个不是一个 SQL 语句,需要在命令行执行。
  2. 图形界面

MySQL 分页

  1. 常用分页语句
-- select * from table order by id limit (pageIndex - 1 )* pageSize , pageSize;
select * from table order by id limit 1000,10;
  1. 通过子查询分页,用于页数较大时
select * from table where id > (select id from table order by id limit 1000,1) order by id limit 10;
  1. 通过 join 实现
select * from table t1 join (select id from table order by id desc limit 1000,1) t2 
where t1.id < t2.id
order by id desc
limit 10;

多表查询优化

  1. 多表查询时,每个字段都指明其所在的表。
  2. 超过三个表禁止 join,需要 join 的字段,数据类型保持绝对一致。
  3. 多表关联查询时,保证被关联的字段需要有索引。

SQL 的执行顺序

from ...
join ... on ....
where ...
group by ....
having ....

select ....

order by ....
limit ...

from tab1 , tab2 -> on -> left/right join -> where -> group by -> having -> select -> distinct -> order by -> limit

根据 SQL 的执行顺序,可以得到

  1. 别名只能在 order by 使用,不允许在 where 子句中使用。
  2. 不包含聚合的函数应该写在 where 子句中,包含聚合函数的条件只能写在 having 子句中。

all 关键字的使用

-- 查询平均工资最低的部门ID
-- 自己写的,这个有问题,最小值可能有多条数据
select department_id from employees group by department_id order by avg(salary) asc limit 1;
-- 方式一 (三层子查询)
select department_id
from employees
group by department_id
having avg(salary) =
(select min(avg_sal) from (select avg(salary) avg_sal from employees group by department_id) t);
-- 方式二()
select department_id
from employees
group by department_id
having avg(salary) <= ALL (select avg(salary) avg_sal
from employees
group by department_id);