1. 请你查找employees里最晚入职员工的所有信息,以上例子输出如下:
      1. select *
      2. from employees
      3. where hire_date = (select max(hire_date) from employees);
    • 因为有可能有多个在最晚那天入职的,所以可以选出入职日期等于最晚的那天的,这一定是正确。
    • 如果只需要取出一个,那么可以
      1. select *
      2. from employees
      3. order by hire_date desc
      4. limit 0,1;
      limit 0,1; 代表从0号位置开始取1个。
    1. 查找employees里入职员工时间排名倒数第三的员工所有信息
    • 只有一个时候

      1. select * from employees
      2. order by hire_date desc
      3. limit 2,1;
    • 有多个时候

      1. select emp_no,birth_date,first_name,last_name,gender,hire_date
      2. from employees e1
      3. where 2= ( # 有两种日期大于她自己的
      4. select count(*)
      5. from employees e2
      6. where e2.hire_date > e1.hire_date
      7. );
    1. 查找各个部门领导薪水详情以及其对应部门编号dept_no,输出结果以salaries.emp_no升序排序,并且请注意输出结果里面dept_no列是最后一列,以上例子输入如下:

    image.png
    SQL题目 - 图2

    1. select s.*,d.dept_no
    2. from salaries s
    3. join dept_manager d
    4. on s.emp_no = d.emp_no
    5. order by emp_no;
    1. 查找所有已经分配部门的员工的last_name和first_name以及dept_no,未分配的部门的员工不显示,以上例子如下:

    image.png
    只要employees表里的emp_no = dept_emp 表里的emp_no 就可以了。

    1. select last_name,first_name,dept_no
    2. from employees e
    3. join dept_emp d
    4. on e.emp_no = d.emp_no;
    1. 查找所有已经分配部门的员工的last_name和first_name以及dept_no,也包括暂时没有分配具体部门的员工

      1. select last_name,first_name,dept_no
      2. from employees e
      3. left join dept_emp d
      4. on e.emp_no = d.emp_no;
    2. 查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t,以上例子输出如下: ```sql select emp_no,count() t from salaries s group by emp_no having t > 15; # 不需要计算两次count() t

    select emp_no,count() t from salaries s group by emp_no having count(t) > 15; # 需要计算两次count() t ,慢

    1. 7. 有一个薪水表,请你找出所有员工具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示,以上例子输出如下:
    2. ![](https://cdn.nlark.com/yuque/0/2021/png/8429887/1615354332161-04c64d42-44de-420a-ae89-9bcd0e30609d.png#height=320&id=erZIs&originHeight=320&originWidth=656&originalType=binary&ratio=1&size=0&status=done&style=none&width=656)<br />![](https://cdn.nlark.com/yuque/0/2021/png/8429887/1615354452456-dd002db3-252e-401e-a5e5-63c9f9d3af67.png#height=252&id=lFO0k&originHeight=252&originWidth=354&originalType=binary&ratio=1&size=0&status=done&style=none&width=354)
    3. - 分组+ 降序 就行了
    4. ```sql
    5. select salary
    6. from salaries
    7. group by salary
    8. order by salary desc;
    1. 有一个员工表employees简况如下:

    SQL题目 - 图4

    有一个部门领导表dept_manager简况如下:
    SQL题目 - 图5
    请你找出所有非部门领导的员工emp_no,以上例子输出:
    SQL题目 - 图6

    • 查找员工表的id,只要id不在领导表里面就行了
      1. select emp_no
      2. from employees e1
      3. where e1.emp_no not in (
      4. select emp_no
      5. from dept_manager);
    1. 有一个员工表dept_emp简况如下:

    SQL题目 - 图7
    第一行表示为员工编号为10001的部门是d001部门。

    有一个部门经理表dept_manager简况如下:
    SQL题目 - 图8
    第一行表示为d001部门的经理是编号为10002的员工。

    获取所有的员工和员工对应的经理,如果员工本身是经理的话则不显示,以上例子如下:
    SQL题目 - 图9

    连接操作:

    1. 员工表和管理表部门一致
    2. 员工表和管理表的员工id不一致

      1. select e.emp_no,m.emp_no
      2. from dept_emp e
      3. join dept_manager m
      4. on e.dept_no = m.dept_no and e.emp_no != m.emp_no;
    3. 有一个员工表dept_emp简况如下:

    https://www.nowcoder.com/practice/4a052e3e1df5435880d4353eb18a91c6?tpId=82&tqId=29764&rp=1&ru=%2Factivity%2Foj&qru=%2Fta%2Fsql%2Fquestion-ranking&tab=answerKey
    SQL题目 - 图10

    有一个薪水表salaries简况如下:
    SQL题目 - 图11

    获取所有部门中员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号升序排列,以上例子输出如下:
    SQL题目 - 图12

    • 很复杂,需要使用多次连接
    • 写了很久
      1. select d2.dept_no,d2.emp_no,maxSalary
      2. from ( # 选出每组的最大的
      3. select dept_no,max(salary) maxSalary
      4. from dept_emp e1
      5. join salaries s1
      6. on e1.emp_no = s1.emp_no
      7. group by dept_no
      8. ) d1,dept_emp d2,salaries d3
      9. # 按员工编号,组号,工资进行连接判断
      10. where d1.dept_no = d2.dept_no
      11. and d1.maxSalary = d3.salary
      12. and d2.emp_no = d3.emp_no
      13. order by d2.dept_no;
    1. 有一个员工表employees简况如下:

    SQL题目 - 图13

    建表语句如下:

    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLEemployees(
    emp_no` int(11) NOT NULL,`<br />birth_datedate NOT NULL,
    first_name` varchar(14) NOT NULL,`<br />last_namevarchar(16) NOT NULL,
    gender` char(1) NOT NULL,`<br />hire_datedate NOT NULL,
    PRIMARY KEY (emp_no));

    请你查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列,以上例子查询结果如下:
    SQL题目 - 图14

    1. select *
    2. from employees
    3. where emp_no & 1 = 1 # 取余使用mod的,使用位运算比较快
    4. and last_name != 'Mary'
    5. order by hire_date desc;
    1. 有一个员工职称表titles简况如下:

    SQL题目 - 图15

    有一个薪水表salaries简况如下:
    SQL题目 - 图16

    建表语句如下:

    1
    2
    3
    4
    5
    CREATE TABLE titles (
    emp_no` int(11) NOT NULL,`<br />titlevarchar(50) NOT NULL,
    from_date` date NOT NULL,`<br />to_datedate DEFAULT NULL);
    1
    2
    3
    4
    5
    6
    CREATE TABLEsalaries(
    emp_no` int(11) NOT NULL,`<br />salary``int``(11) NOT NULL,
    from_date` date NOT NULL,`<br />to_datedate NOT NULL,
    PRIMARY KEY (emp_no,from_date));

    请你统计出各个title类型对应的员工薪水对应的平均工资avg。结果给出title以及平均工资avg,并且以avg升序排序,以上例子输出如下:
    SQL题目 - 图17

    • 使用连接以及分组
      1. select title,avg(s.salary)
      2. from titles t
      3. join salaries s
      4. on t.emp_no = s.emp_no
      5. group by title;
    1. 有一个薪水表salaries简况如下:

    SQL题目 - 图18

    请你获取薪水第二多的员工的emp_no以及其对应的薪水salary
    SQL题目 - 图19

    • 如果薪水各个不相同

      1. select emp_no,salary
      2. from salaries s1
      3. where 1 = (select count(*) from salaries s2 where s2.salary > s1.salary);
    • 如果有多个薪水是一样的

      • 按薪水进行分组,选出第二组limit 1,1
        1. select emp_no,salary
        2. from salaries
        3. where salary = (select salary
        4. from salaries
        5. group by salary
        6. order by salary desc
        7. limit 1,1);