跳到主要内容

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);