记录一些自己不常用的 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语句。
详情参考这里
未完…