1. 程式人生 > >mysql的一些題目,有難度

mysql的一些題目,有難度

mysql的一些題目,有難度

案例題目,有些題目有難度,自己動手,豐衣足食!

這是表結構

直接po程式碼

#案例題目
# 1. 查詢工資最低的員工資訊: last_name, salary
SELECT 
  last_name,
  salary 
FROM
  employees 
WHERE salary = 
  (SELECT 
    MIN(salary) 
  FROM
    employees) ;



# 2. 查詢平均工資最低的部門資訊
#每個部門的平均工資
SELECT * FROM 
(SELECT 
  AVG(salary) AS avg_sal,
  department_id 
FROM
  employees 
GROUP BY department_id) AS emp;
#所有部門中,平均工資最低的
SELECT MIN(emp.avg_sal) FROM 
(SELECT 
  AVG(salary) AS avg_sal,
  department_id 
FROM
  employees 
GROUP BY department_id) AS emp;
#
SELECT 
  AVG(salary) AS avg_sal,
  department_id 
FROM
  employees 
GROUP BY department_id
HAVING AVG(salary) = (
SELECT MIN(emp.avg_sal) FROM 
(SELECT 
  AVG(salary) AS avg_sal,
  department_id 
FROM
  employees 
GROUP BY department_id) AS emp);
#
SELECT dep.* FROM departments dep WHERE 
department_id = (
SELECT 
  department_id 
FROM
  employees 
GROUP BY department_id
HAVING AVG(salary) = (
SELECT MIN(emp.avg_sal) FROM 
(SELECT 
  AVG(salary) AS avg_sal,
  department_id 
FROM
  employees 
GROUP BY department_id) AS emp));


#有好多種寫法
#方式一
SELECT 
  department_id,
  AVG(salary) AS avg_sal 
FROM
  employees 
GROUP BY department_id 
ORDER BY avg_sal ASC 
LIMIT 0, 1;
#或者
SELECT 
  department_id,
  AVG(salary) AS avg_sal 
FROM
  employees 
GROUP BY department_id 
ORDER BY avg_sal ASC 
LIMIT 1;
#方式二
SELECT * FROM 
(SELECT 
  department_id,
  AVG(salary) AS avg_sal 
FROM
  employees 
GROUP BY department_id) AS emp01 
INNER JOIN
(SELECT MIN(avg_sal_emp.avg_sal) AS min_sal FROM (
SELECT 
  AVG(salary) AS avg_sal 
FROM
  employees 
GROUP BY department_id) AS avg_sal_emp) emp02
ON emp01.avg_sal = emp02.min_sal;
#
SELECT * FROM departments WHERE department_id = (
SELECT department_id FROM 
(SELECT 
  department_id,
  AVG(salary) AS avg_sal 
FROM
  employees 
GROUP BY department_id) AS emp01 
INNER JOIN
(SELECT MIN(avg_sal_emp.avg_sal) AS min_sal FROM (
SELECT 
  AVG(salary) AS avg_sal 
FROM
  employees 
GROUP BY department_id) AS avg_sal_emp) emp02
ON emp01.avg_sal = emp02.min_sal);


# 3. 查詢平均工資最低的部門資訊和該部門的平均工資
SELECT dep.*, avg_dep.avg_sal FROM departments dep
INNER JOIN 
(SELECT 
  department_id AS dep_id,
  AVG(salary) AS avg_sal 
FROM
  employees 
GROUP BY department_id 
ORDER BY avg_sal ASC 
LIMIT 0, 1) AS avg_dep
ON dep.department_id = avg_dep.dep_id;
#
SELECT dep.*,
(SELECT 
  AVG(salary) AS avg_sal
FROM
  employees emp
WHERE emp.department_id = dep.`department_id`   
GROUP BY department_id 
ORDER BY avg_sal ASC 
LIMIT 0, 1) AS avg_salary
FROM departments dep;

#select後面僅僅支援標量子查詢(標量子查詢即結果集只有一行一列,又叫做單行子查詢)
#最終效果(有難度)
SELECT dep.*,
(SELECT 
  AVG(salary) AS avg_sal
FROM
  employees emp
WHERE emp.department_id = dep.`department_id`   
GROUP BY department_id 
ORDER BY avg_sal ASC 
LIMIT 0, 1) AS avg_salary
FROM departments dep
HAVING avg_salary IS NOT NULL
ORDER BY avg_salary ASC
LIMIT 0, 1;

# 4. 查詢平均工資最高的 job 資訊
SELECT AVG(salary) AS avg_sal,job_id FROM employeeS
GROUP BY job_id
ORDER BY avg_sal DESC
LIMIT 0, 1;
#
SELECT * FROM jobs WHERE job_id = (
SELECT job_id FROM employees
GROUP BY job_id
ORDER BY AVG(salary) DESC
LIMIT 0, 1);


# 5. 查詢平均工資高於公司平均工資的部門有哪些?
SELECT AVG(salary) AS avg_dep,department_id FROM employees GROUP BY department_id
HAVING avg_dep >(
SELECT AVG(salary) FROM employees);


# 6. 查詢出公司中所有 manager 的詳細資訊.
SELECT * FROM employees WHERE employee_id IN (
SELECT DISTINCT manager_id FROM employees emp);
#或者使用ANY
SELECT * FROM employees WHERE employee_id = ANY (
SELECT DISTINCT manager_id FROM employees emp);


# 7. 各個部門中 最高工資中最低的那個部門的 最低工資是多少
SELECT MIN(salary) FROM employees WHERE department_id = (
SELECT department_id  FROM employees GROUP BY department_id 
ORDER BY MAX(salary) ASC LIMIT 0, 1);

#select min(salary) from employees where department_id = 10;
#select * from employees where department_id = 10;


# 8. 查詢平均工資最高的部門的 manager 的詳細資訊: last_name, department_id, email, salary

#
SELECT AVG(salary) AS avg_sal, department_id FROM employees GROUP BY 
department_id ORDER BY avg_sal DESC LIMIT 0, 1;
#最終效果
SELECT employee_id, last_name, department_id, email, salary FROM employees WHERE 
employee_id IN (
SELECT DISTINCT manager_id FROM employees WHERE department_id = (
SELECT department_id FROM employees GROUP BY 
department_id ORDER BY AVG(salary) DESC LIMIT 0, 1
));

#最終效果
SELECT 
        last_name, d.department_id, email, salary 
    FROM
        employees e 
        INNER JOIN departments d 
            ON d.manager_id = e.employee_id 
    WHERE d.department_id = 
        (SELECT 
            department_id 
        FROM
            employees 
        GROUP BY department_id 
        ORDER BY AVG(salary) DESC 
        LIMIT 1) ;
#