案例:找出工作岗位是SALESMAN和MANAGER的员工?select ename,job from emp where job = 'SALESMAN' or job = 'MANAGER';select ename,job from emp where job in('SALESMAN','MANAGER'); +--------+----------+ | ename | job | +--------+----------+ | ALLEN | SALESMAN | | WARD | SALESMAN | | JONES | MANAGER | | MARTIN | SALESMAN | | BLAKE | MANAGER | | CLARK | MANAGER | | TURNER | SALESMAN | +--------+----------+select ename,job from emp where job = 'SALESMAN'unionselect ename,job from emp where job = 'MANAGER'; +--------+----------+ | ename | job | +--------+----------+ | ALLEN | SALESMAN | | WARD | SALESMAN | | MARTIN | SALESMAN | | TURNER | SALESMAN | | JONES | MANAGER | | BLAKE | MANAGER | | CLARK | MANAGER | +--------+----------+//union的效率要高一些,对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积,成倍的翻但是union可以减少匹配的次数,在减少匹配次数的情况下,还可以完成两个结果集的拼接a 连接 b 连接 c a 10条记录b 10条记录c 10条记录匹配次数:10 * 10 * 10 = 1000a 连接 b 一个结果:10 * 10 = 100a 连接 c 一个结果:10 * 10 = 100使用union的话是: 100 + 100 = 200 (union将乘法运算变成了加法运算 ) union使用注意事项 //错误:union在进行结果集合并时,要求两个结果集的列数相同select ename,job from emp where job = 'SALESMAN'unionselect ename from emp where job = 'MANAGER';//MySQL可以,oracle语法严格,不可以,会报错 //要求:结果集合并时列和列的数据类型也要一致select ename,job from emp where job = 'SALESMAN'unionselect ename,sal from emp where job = 'MANAGER'; +--------+----------+ | ename | job | +--------+----------+ | ALLEN | SALESMAN | | WARD | SALESMAN | | MARTIN | SALESMAN | | TURNER | SALESMAN | | JONES | 2975 | | BLAKE | 2850 | | CLARK | 2450 | +--------+----------+