MySQL 复杂查询

Posted 夏天的技术博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 复杂查询相关的知识,希望对你有一定的参考价值。

记录一些自己不常用的 SQL 查询语句。

例子:现有一张老员工表 staff,员工信息包括姓名,部门,薪水以及等级,公司将新员工放入数据库中的另一张表 newStaff。现在我需要我们查询哪一个部门的哪位员工薪水最高。


join 查询

简单分析一下,两张表,我们要一起查询获得结果首先会用到连接查询,条件是最高的一位,简单使用 order by 排序然后 limit 1 即可。

那么设想的 SQL 语句为

mysql> (select staff.name, staff.dept, max(staff.salary) as MaxSalary from staff left join newStaff on staff.dept = newStaff.dept) union (select newStaff.name, newStaff.dept, max(newStaff.salary) as MaxSalary from staff right join newStaff on staff.dept = newStaff.dept) order by MaxSalary desc limit 1;

注意:MySQL 本身不支持全连接,所以用 union 模拟。


首先创建老员工表:

mysql> create table staff (
    -> uid int(20) auto_increment primary key,
    -> name varchar(10) not null,
    -> dept int(20) not null,
    -> salay int(20) not null,
    -> level int(10) not null);

创建新员工表:

mysql> create table newStaff (
    -> uid int(20) auto_increment primary key,
    -> name varchar(10) not null,
    -> dept int(20) not null,
    -> salay int(20) not null,
    -> level int(10) not null);

插入一定量的数据:

mysql> insert into staff (name, dept, salay, level) values ('Tom', 1, 2000, 1);
Query OK, 1 row affected (0.11 sec)

mysql> insert into staff (name, dept, salay, level) values ('Lili', 1, 3000, 2);
Query OK, 1 row affected (0.18 sec)

mysql> insert into staff (name, dept, salay, level) values ('Andy', 2, 2500, 2);
Query OK, 1 row affected (0.10 sec)

执行最初的 SQL 语句:

explain 命令可以分析出查询过程:

这样一看还是比较复杂的

更多连接查询参考 wiki


一张文章表,一张评论表,统计出热门的前5篇文章,使用 left join

select a.id, a.title, a.agree_time, b.comment_num from articles as a left join (select aid, count(aid) as comment_num from comments group by aid) as b on a.id=b.aid order by agree_time desc limit 5;

注意:
left join 查询时,where 条件必须放到 on 之后,否则会报语法错误。
第一个 select 后面是要查询出的数据
临时表必须要命名如 as a。否则会报错:Every derived table must have its own alias


group by

group by 是用来聚合的。
例子:查询出老员工表中每个部门薪水最高的人并排序且薪水必须大于 3000。


mysql> select name, dept, max(salary) as MaxSalary from staff group by dept having MaxSalary > 3000 order by MaxSalary desc;

关于 where 和 having 的区别:

WHERE语句在GROUP BY语句之前;SQL会在分组之前计算WHERE语句。

HAVING语句在GROUP BY语句之后;SQL会在分组之后计算HAVING语句。

详情参考这里

未完…

以上是关于MySQL 复杂查询的主要内容,如果未能解决你的问题,请参考以下文章

「MySQL」- 复杂的SQL查询语句

优化复杂的mysql以减少查询时间

[MySQL]聚合查询

MySQL常用SQL(含复杂SQL查询)

花费很长时间执行复杂的 mySql 查询

MySql - 在复杂查询中获取 rowid / order [关闭]