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语句。

详情参考这里

未完…

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值