MySQL
二、数据查询语言(七)
前言
提示:以下是本篇文章正文内容,下面案例可供参考
且所用数据表为:可自行下载
子查询-重要经典案例
1. 查询工资最低的员工信息: last_name, salary
USE `myemployees`;
SELECT last_name, salary
FROM employees
WHERE salary=(
SELECT MIN(salary)
FROM employees
);
2. 查询平均工资最低的部门信息
#复杂做法
#1
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id;
#2
SELECT MIN(ag)
FROM(
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id) ag_dep
#3查询哪个部门的平均工资=②
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary)=(
SELECT MIN(ag)
FROM(
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id) ag_dep
);
#4查询部门信息
SELECT d.*
FROM departments d
WHERE d.`department_id`=(
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary)=(
SELECT MIN(ag)
FROM(
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id) ag_dep
)
);
#简单做法
#①各部门的平均工资
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
#②求出最低平均工资部门编号
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1;
#③查询部门信息
SELECT *
FROM departments
WHERE department_id=(
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1);
3. 查询平均工资最低的部门信息和该部门的平均工资
#①查询所以部门的平均工资
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id;
#②查询平均工资最低的部门编号
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1;
#③查询平均工资最低的部门信息和该部门的平均工资
SELECT d.*,ag
FROM departments d
JOIN (
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1
)ag_dep
ON d.`department_id`=ag_dep.department_id;
4. 查询平均工资最高的 job 信息
#①查询每个job的平均工资
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id;
#②平局工资最高的job编号
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id
ORDER BY AVG(salary) DESC
LIMIT 1;
#③查询平均工资最低的job信息
SELECT *
FROM `jobs`
WHERE job_id=(
SELECT job_id
FROM employees
GROUP BY job_id
ORDER BY AVG(salary) DESC
LIMIT 1);
5. 查询平均工资高于公司平均工资的部门有哪些?
#①查询公司的平均工资
SELECT AVG(salary)
FROM employees;
#②查询各个部门的平均工资
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id;
#查询大于公司平均工资的部门
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id
HAVING ag>(
SELECT AVG(salary)
FROM employees)
6. 查询出公司中所有 manager 的详细信息.
#查询所有manager_id号
SELECT DISTINCT `manager_id`
FROM employees;
SELECT *
FROM employees
WHERE employee_id IN(
SELECT DISTINCT `manager_id`
FROM employees);
```c
**7. 各个部门中 最高工资中最低的那个部门的 最低工资是多少**
```c
#①各个部门的最高工资
SELECT MAX(salary),department_id
FROM employees
GROUP BY department_id;
#②查询①中最低工资的部门
SELECT MAX(salary),department_id
FROM employees
GROUP BY department_id
ORDER BY MAX(salary)
LIMIT 1
#③查询②中最低工资
SELECT MIN(salary),department_id
FROM employees
WHERE department_id=(
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY MAX(salary)
LIMIT 1)
8. 查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email, salary
#①查询所有部门的平均工资的最高工资的部门
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)DESC
LIMIT 1
#②查询manager 的详细信息last_name, department_id, email, salary
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);
联合查询
union 联合 合并:将多条查询语句的结果合并成一个结果
语法:
查询语句1
union
查询语句2
...
应用场景
要查询的结果来自多个表,且多个表没有直接的连接关系,但查询的信息一致时
特点:
1、要求多条查询语句的查询列数是一致的
2、要求多条查询语句的查询的每一列的类型和顺序最好一致
3、使用union关键字默认去重,如果使用union all可以包含重复项
引入案例:查询部门编号>90,或邮箱包含a的员工信息
SELECT * FROM employees WHERE email LIKE '%a%' OR department_id>90;
联合查询
SELECT * FROM employees WHERE email LIKE '%a%'
UNION
SELECT * FROM employees WHERE department_id>90;
案例:查询中国用户中男性的信息以及外国用户中男性的用户信息
SELECT id,cname,csex FROM t_ca WHERE csex='男'
UNION
SELECT t_id,tName,tGender FROM t_ua WHERE tGender='male';
总结
期待大家和我交流,留言或者私信,一起学习,一起进步!