假定业务:

查看在职员工的薪资的第二名的员工信息

创建数据库

drop database if exists emps;create database emps;use emps;create table employees(    empId int primary key,-- 员工编号    gender char(1) NOT NULL, -- 员工性别hire_date date NOT NULL -- 员工入职时间   );create table salaries(    empId int primary key,     salary double -- 员工薪资    );    INSERT INTO employees VALUES(10001,'M','1986-06-26');INSERT INTO employees VALUES(10002,'F','1985-11-21');INSERT INTO employees VALUES(10003,'M','1986-08-28');INSERT INTO employees VALUES(10004,'M','1986-12-01');INSERT INTO salaries VALUES(10001,88958);INSERT INTO salaries VALUES(10002,72527);INSERT INTO salaries VALUES(10003,43311);INSERT INTO salaries VALUES(10004,74057);

1、(基础解法)

先查出salaries表中最高薪资,再以此为条件查出第二高的工资

查询语句如下:

selectE.empId,E.gender,E.hire_date,S.salaryfromemployees E join salaries S on E.empId = S.empIdwhereS.salary=(    select max(salary)from salaries     where         salary<        (select max(salary) from salaries)    );-- ---------------查询结果------------ --+-------+--------+------------+--------+| empId | gender | hire_date  | salary |+-------+--------+------------+--------+| 10004 | M      | 1986-12-01 |  74057 |+-------+--------+------------+--------+

先对salaries进行自联结查询,当s1<=s2链接并以s1.salary分组,此时count的值,即薪资比他高的人数,用having筛选count=2 的人,就可以得到第二高的薪资了;

查询语句如下:

selectE.empId,E.gender,E.hire_date,S.salaryfromemployees E join salaries S on E.empId = S.empIdwhere S.salary=(    select         s1.salary    from         salaries s1 join salaries s2     on         s1.salary <= s2.salary    group by         s1.salary                having   count(distinct s2.salary) = 2    );-- ---------------查询结果------------ --+-------+--------+------------+--------+| empId | gender | hire_date  | salary |+-------+--------+------------+--------+| 10004 | M      | 1986-12-01 |  74057 |+-------+--------+------------+--------+

原理和2相同,但是代码精简了很多,上面两种是为了引出最后这种方法,在很多时候group by和order by都有其局限性,对于俺们初学者掌握这种实用性较广的思路,还是很有意义的。

selectE.empId,E.gender,E.hire_date,S.salaryfromemployees E join salaries S on    S.empId =E.empIdwhere    (select count(1) from salaries where salary>=S.salary)=2;-- ---------------查询结果------------ --+-------+--------+------------+--------+| empId | gender | hire_date  | salary |+-------+--------+------------+--------+| 10004 | M      | 1986-12-01 |  74057 |+-------+--------+------------+--------+

总结

更多相关文章

  1. Android,一个思路实现APP版本更新
  2. 【安卓笔记】android客户端与服务端交互的三种方式
  3. Android描画简单圆形
  4. Android三种实现定时器的方法
  5. android 沉浸式状态栏的三种方法
  6. 详解Android(安卓)TextView属性ellipsize多行失效的解决思路
  7. [Android]应用语言切换的三种方法
  8. Android三种XML解析
  9. android 类似QQ 换皮肤 实现思路 apk资源共享

随机推荐

  1. [php入门] 1、从安装开发环境环境到(庄B)做
  2. Laravel 5验证日期为php Y格式。g 2015 ?
  3. php-fpm通过request_slowlog_timeout检查
  4. 有没有办法在php关闭标签后强制换行?>什么
  5. 让Tomcat运行PHP的几种方式
  6. php对象的实现
  7. 为什么只有ASP.NET有异步编程模型?
  8. PHP / Ajax:如何在成功登录后启动会话(剩
  9. php单引号和双引号的区别
  10. GET 与 POST 的理解