子查询 & 联合查询

子查询

嵌套在其他语句内部的select语句称为子查询或内查询,外层的语句可以是insert、update、delete、select等,一般select作为外层语句较多。外面如果为select语句,则此语句称为外查询或主查询

【说明】:

  • 子查询 ( 内查询) 在主查询之前执行完成。
  • 子查询的结果被主查询( 外查询)使用 。
  • 多行子查询和单行子查询操作不能混用

分类

分类 说明
标量子查询(单行子查询) 结果集为一行一列
列子查询(多行子查询) 结果集为多行一列
行子查询 结果集为多行多列
表子查询 结果集为多行多列

使用

按出现位置

  • select后面:
    仅仅支持标量子查询(一行一列)

  • from后面:

      表子查询(将子查询结果充当一张表),要求必须起别名
    
  • where或having后面:
    标量子查询
    列子查询
    行子查询

  • exists后面:
    标量子查询
    列子查询
    行子查询
    表子查询

注意:

  • 单行子查询操作符::= > >= < <= <>(不等)
  • 多行子查询操作符:IN/NOT IN ANY|SOME ALL
  • 能用exists的地方都能用in
#查询有员工的部门名
use myemployees
SELECT department_id
FROM departments d
WHERE EXISTS(
	SELECT *
	FROM employees e
	WHERE d.department_id = e.department_id
)
#in写法
SELECT department_id
FROM departments
WHERE department_id in (
	SELECT department_id
	FROM employees e
)

综合案例

#查询工资最低的员工信息
	 #1、查询最低工资
	 SELECT MIN(salary)
	 FROM employees;
	 #2、salary = 1
	 SELECT last_name,salary
	 FROM employees 
	 WHERE salary = (
			SELECT MIN(salary)
			FROM employees
	 );
	 
#查询平均工资最低的部门信息
 #1、查询每个部门的平均工资
	SELECT AVG(salary),department_id
	FROM employees
	GROUP BY department_id
#2、
 SELECT ag,d.*
 FROM departments d
 INNER JOIN (
			SELECT AVG(salary) ag,department_id
			FROM employees
			GROUP BY department_id
			ORDER BY ag
			LIMIT 1
 ) d_avg
 ON d_avg.department_id = d.department_id
 
 #查询平均工资最高的job信息
  #1、查询平均工资最高的job_id
	SELECT AVG(salary),job_id
	FROM employees
	GROUP BY job_id
	ORDER BY AVG(salary) DESC
	LIMIT 1
  #2、
	SELECT *
	FROM jobs
	WHERE job_id = (
		SELECT job_id
		FROM employees
		GROUP BY job_id
		ORDER BY AVG(salary) DESC
		LIMIT 1
	)
 

联合查询

常用于查询多个表,且多表之间没有直接的连接关系

查询语句1
union
查询语句2
union
查询语句3
...;

作用:

  • 可将一条比较复杂的查询语句拆分成多条语句
  • 可将无关联的表合并在一起,连接查询需要两表中有关联的属性联合查询不需要

注意:

  • union关键字会去重,想要保留重复数据,则要使用union all
  • 只在最后一个查询语句后加分号结束符;
  • 要求多条查询语句的查询列数必须一致
  • 要求多条查询语句的查询的各列类型、顺序一致,若不一致则按第一条的顺 序排列
  • union 会去重,union all包含重复项
posted @ 2021-07-15 14:44  至安  阅读(188)  评论(0编辑  收藏  举报