多表查询(mysql)

-- 1.列出至少有4个员工的部门名称
SELECT 
    dept.deptno AS 部门编号,
    dept.dname AS 部门名称
FROM 
    dept
JOIN 
    emp ON dept.deptno = emp.deptno
GROUP BY 
    dept.deptno, dept.dname
HAVING 
    COUNT(emp.empno) >= 4;

-- 2.列出薪金比 “smith”多的所有员工
SELECT 
    empno AS 雇员编号,
    ename AS 姓名,
    sal AS 工资
FROM 
    emp
WHERE 
    sal > (SELECT sal FROM emp WHERE ename = 'Smith');

-- 3.列出所有员工的姓名以及其直接上级的姓名
SELECT
    e1.ename AS 员工姓名,
    e2.ename AS 上级姓名
FROM
    emp e1
LEFT JOIN
    emp e2 ON e1.mgr = e2.empno;
-- 4.列出受雇日期早于其直接上级的所有员工的编号、姓名、部门名称	
SELECT
    e1.empno AS 员工编号,
    e1.ename AS 员工姓名,
    d.dname AS 部门名称
FROM
    emp e1
LEFT JOIN
    emp e2 ON e1.mgr = e2.empno
JOIN
    dept d ON e1.deptno = d.deptno
WHERE
    e1.hiredate < e2.hiredate;
-- 	5.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
SELECT
    d.deptno AS 部门编号,
    d.dname AS 部门名称,
    e.empno AS 员工编号,
    e.ename AS 员工姓名,
    e.job AS 职位,
    e.sal AS 工资,
    e.hiredate AS 入职日期
FROM
    dept d
LEFT JOIN
    emp e ON d.deptno = e.deptno
ORDER BY
    d.deptno;
-- 6.列出所有从事“clerk”工作的雇员姓名及部门名称、部门人数
-- 方法1
SELECT
    e.ename AS 员工姓名,
    d.dname AS 部门名称,
    COUNT(e.empno) OVER (PARTITION BY d.deptno) AS 部门人数
FROM
    emp e
LEFT JOIN
    dept d ON e.deptno = d.deptno
WHERE
    e.job = 'CLERK';

-- 方法2
SELECT
    e.ename AS 员工姓名,
    d.dname AS 部门名称,
    (
        SELECT COUNT(*)
        FROM emp e2
        WHERE e2.job = 'CLERK' AND e2.deptno = e.deptno
    ) AS 部门人数
FROM
    emp e
LEFT JOIN
    dept d ON e.deptno = d.deptno
WHERE
    e.job = 'CLERK';

-- 7.列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数
SELECT
    job AS 工作,
    COUNT(empno) AS 雇员人数
FROM
    emp
GROUP BY
    job
HAVING
    MIN(sal) > 1500;
		
-- 8.列出在部门'sales'(销售部)工作的员工的姓名,假定不知道销部的部门编号
SELECT
    e.ename AS 员工姓名
FROM
    emp e
JOIN
    dept d ON e.deptno = d.deptno
WHERE
    d.dname = '销售部';

-- 9列出薪金高于公司平均薪金的雇员姓名、所部门名称、领导姓名、雇员的工资等级
SELECT
    e1.ename AS 员工姓名,
    d.dname AS 部门名称,
    e2.ename AS 领导姓名,
    e1.sal AS 工资,
    sg.grade AS 工资等级
FROM
    emp e1
LEFT JOIN
    emp e2 ON e1.mgr = e2.empno
JOIN
    dept d ON e1.deptno = d.deptno
JOIN
    salgrade sg ON e1.sal BETWEEN sg.losal AND sg.hisal
WHERE
    e1.sal > (SELECT AVG(sal) FROM emp);
-- 10.列出与"smith"从事相同工作的所有员工的部门名称
SELECT DISTINCT
    d.dname AS 部门名称
FROM
    emp e
JOIN
    dept d ON e.deptno = d.deptno
WHERE
    e.job = (SELECT job FROM emp WHERE ename = 'SMITH');
-- 11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金
SELECT
    ename AS 员工姓名,
    sal AS 薪金
FROM
    emp
WHERE
    sal IN (SELECT sal FROM emp WHERE deptno = 30);

-- 12.列出薪金高于部门30所有员工薪金的员工姓名、薪金和部门名称
SELECT
    e.ename AS 员工姓名,
    e.sal AS 薪金,
    d.dname AS 部门名称
FROM
    emp e
JOIN
    dept d ON e.deptno = d.deptno
WHERE
    e.sal > (SELECT MAX(sal) FROM emp WHERE deptno = 30);
-- 13.列出每个部门工作的员工数量、平均工资
SELECT
    d.deptno AS 部门编号,
    d.dname AS 部门名称,
    COUNT(e.empno) AS 员工数量,
    AVG(e.sal) AS 平均工资
FROM
    dept d
LEFT JOIN
    emp e ON d.deptno = e.deptno
GROUP BY
    d.deptno, d.dname;
-- 14.列出所有员工的姓名、部门名称和工资
SELECT
    e.ename AS 员工姓名,
    d.dname AS 部门名称,
    e.sal AS 工资
FROM
    emp e
LEFT JOIN
    dept d ON e.deptno = d.deptno;
-- 15.列出所有部门的详细信息和部门人数
SELECT
    d.deptno AS 部门编号,
    d.dname AS 部门名称,
    d.loc AS 地点,
    COUNT(e.empno) AS 部门人数
FROM
    dept d
LEFT JOIN
    emp e ON d.deptno = e.deptno
GROUP BY
    d.deptno, d.dname, d.loc;
-- 16.列出每种工作的最低工资及从事此工作的雇员姓名
SELECT
    e.job AS 工作,
    MIN(e.sal) AS 最低工资,
    e.ename AS 雇员姓名
FROM
    emp e
GROUP BY
    e.job, e.ename
HAVING
    e.sal = MIN(e.sal);
-- 17.列出各个部门的经理的最低薪金
SELECT
    d.deptno AS 部门编号,
    d.dname AS 部门名称,
    MIN(e.sal) AS 经理最低薪金
FROM
    dept d
JOIN
    emp e ON d.deptno = e.deptno
WHERE
    e.job = 'MANAGER'
GROUP BY
    d.deptno, d.dname;
-- 18.列出所有员工的年薪,按年薪从低到高进行排序
SELECT
    e.ename AS 员工姓名,
    e.sal * 12 AS 年薪
FROM
    emp e
ORDER BY
    年薪;
-- 19.列出所有员工的领导信息,要求领导的薪水要超过3000
SELECT
    e1.ename AS 员工姓名,
    e2.ename AS 领导姓名,
    e2.sal AS 领导薪水
FROM
    emp e1
LEFT JOIN
    emp e2 ON e1.mgr = e2.empno
WHERE
    e2.sal > 3000;
-- 20.求出部门名称中,带“S”字符的部门员工的工资总和、部门人数
SELECT
    d.dname AS 部门名称,
    SUM(e.sal) AS 工资总和,
    COUNT(e.empno) AS 部门人数
FROM
    dept d
LEFT JOIN
    emp e ON d.deptno = e.deptno
WHERE
    d.dname LIKE '%S%'
GROUP BY
    d.dname;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值