MySQL联合查询是指在一条SQL语句中使用UNION关键字将多个查询结果合并返回的操作。UNION查询能够将多条SELECT语句的结果合并成一个结果集,每个查询结果集的列数和列类型必须一致。
语法格式如下:
- SELECT 列1, 列2, 列3 FROM 表1 WHERE 条件1
- UNION
- SELECT 列1, 列2, 列3 FROM 表2 WHERE 条件2
联合查询将返回两个或多个查询的结果集,并且会自动去除重复的记录。
UNION ALL关键字与UNION的作用类似,但不会自动去重,会返回所有的记录。
MySQL子查询是指在一个查询内部嵌套了另一个完整的查询语句。子查询可以嵌套在SELECT、FROM、WHERE等子句中,用于获取一组数据用于父查询的条件或结果集。
子查询是从内到外执行的,即先执行子查询,将其结果作为外层查询的一部分。子查询可以返回单个值、一行或多行数据,具体取决于子查询的语句和位置。
子查询的语法格式如下:
SELECT 列1, 列2, 列3 FROM 表1 WHERE 列A IN (SELECT 列A FROM 表2 WHERE 条件)
子查询`(SELECT 列A FROM 表2 WHERE 条件)`嵌套在了主查询中的WHERE子句内部,并且主查询的条件使用了子查询的结果。子查询可以用于各种场景,例如作为过滤条件、计算字段、连接其他表等。使用子查询可以使查询语句更加灵活和复杂,能够处理更多的业务需求。
需要注意的是,子查询的性能可能不如联合查询或使用临时表,因此在使用子查询时要注意性能优化的问题。
MySQL的子查询可以分为以下几种类型:
1. 标量子查询(Scalar Subquery):返回的结果集只有一行一列,通常用于作为父查询的条件或计算字段的取值。例如,获取某个表的最大值或最小值作为查询条件。子查询位于主查询的条件部分,并用括号括起来。子查询返回的结果集只能是一行一列,且通常用于比较运算符(如=、>, <等)的右侧。
- SELECT column_name
- FROM table_name
- WHERE column_name = (SELECT column_name FROM table_name WHERE condition);
-
- select * from emp where dept_id=(select id from dept where name='销售部');
- SELECT 列1, 列2, ...
- FROM 表1
- WHERE 列N 表达式 (SELECT 列M FROM 表2 WHERE 表达式);
-
- /*
- 首先查询 某某 的入职时间
- 查询指定入职日期之后的入职的员工的信息
- */
-
- select entrydate from emp where name='姓名';
-
- select * from emp where entrydate > '2006-12-05';
-
- select * from emp
- where entrydate > (select entrydate from emp where name='姓名');
2. 列子查询(Row Subquery):返回的结果集有多行一列,通常用于作为父查询的条件使用IN、ANY、SOME等条件运算符。例如,查找在一个表的某个字段中存在于另一个表的某个字段中的所有行。
- /*查询比某一个部所有人工资都搞的员工信息*/
- /*查询所有财务部人员运功工资*/
- select id from dept where name = '具体的部门';
-
- select salary from emp where dept_id=查询出来的部门ID;
-
- select salary from emp where dept_id=(select id from dept where name = '具体的部门');
-
- /*比某一个部所有员工工资都高的员工信息 all都需要满足*/
-
- select * from emp
- where salary > all (select salary from emp where dept_id=(select id from dept where name = '具体的部门'));
3. 行子查询(Column Subquery):返回的结果集有一行多列,通常用于查询某个表中的某个字段在另一个表中的多个字段的值。
- /*
- 行子查询
- 1.查询与某某员工的薪资及直属领导相同的员工信息
- */
- /*a 查询张无忌员工的薪资及其直属领导*/
-
- select salary,managerid from emp where name ='某员工';
-
- /*b 查询与某某员工 的薪资及其直属领导相同的员工信息*/
- select * from emp
- where (salary,managerid)=(62500,1);
- /*
- 内部子查询返回的一行多列 和前面的salary,managerid 匹配
- */
- select * from emp
- where (salary,managerid)=(select salary,managerid from emp where name ='某员工');
4. 表子查询(Table Subquery):返回的结果集有多行多列,通常用于作为父查询的表来源,可以通过JOIN操作与其他表进行关联查询。
- /*表子查询*/
- /*查询与 某某员工1 某某员工2职位工资相同的员工*/
- /*首先查询 某某员工1 某某员工2的职位和薪资*/
- select job,salary from emp where name=' 某某员工1'or name=' 某某员工2';
-
- /*查询与 某某员工1 某某员工2 的职位和薪资相同的员工信息*/
-
- select * from emp where (job,salary)
- in (select job,salary from emp where name='某某员工1'or name=' 某某员工2');