关于表格的创建,请看上一篇文章——MySQL查询—连接查询
1、联合查询:把多次查询的结果合并,形成一共新的查询集。
UNION,UNION ALL
语法:
SELECT 字段列表 FROM 表A...
UNION [ALL]
SELECT 字段列表 FROM 表b...
1.1、举个例子
1.1.2、将薪资低于5000的员工,和年龄大于50岁的员工全部查询出来
SELECT * FROM emp_new a WHERE a.salary<5000
UNION ALL
SELECT * FROM emp_new b WHERE b.age>50;
查询结果发现将薪资低于5000,年龄大一50的员工都展示出来了,但是会发现没有去重,鹿仗客出现了两次,所以我们要进行去重的操作,删除all即可
SELECT * FROM emp_new a WHERE a.salary<5000
UNION
SELECT * FROM emp_new b WHERE b.age>50;
总结:上下字段数目必须一致,UNION ALL会有城府结果,UNION不会 联合查询比使用or的效率更高,不会索引失效
2、子查询
SQL语句中嵌套SELECT语句,称作嵌套查询,又称子查询。子查询外边缘的语句可以是INSERT/UPDATE/DELETE/SELECT
语法:
SELECT * FROM t1 WHERE comulumn1=(SELECT comulumn1 FROM t2)
子查询又分为4类:标量子查询、列子查询、行子查询、表子查询
2.1、标量子查询(子查询结果为单个值)
子查询返回的结果是单个值(数字、字符串、日期等)。常用操作符-<,>,<=,>=
2.1.1、查询“销售部”的所有员工信息(当然有好多解决方法哈)
a、查询“销售部”部门id
SELECT id FROM dept where name="销售部";
b、根据销售部门id,查询员工信息
SELECT * FROM emp_new where dept_id=4;
那么可以直接将两个语句进行合并
SELECT *FROM dept where dept= (SELECT id from dept where name ="销售部");
2.2、列子查询(子查询结果为一列)
列子查询的结果是一列(可以是多行)
操作符 | 描述 |
IN | 在指定的集合范围内,多选一 |
NOT IN | 不在指定的集合范围内 |
ANY | 子查询返回列表中,有任意一共满足即可 |
SOME | 与ANY等同,使用SOME的地方都可以是ANY |
ALL | 子查询返回列表的所有值都必须满足 |
2.2.1、查询销售部和市场部的所有员工信息
#SELECT id FROM dept b where b.`name`='销售部' OR b.`name`='市场部';SELECT * FROM emp_new WHERE dept_id IN (SELECT id FROM dept b where b.`name`='销售部' OR b.`name`='市场部');
2.2.2、查询比财务部所有人工资都高的员工信息
#SELECT id FROM dept b WHERE b.`name`='财务部';
#SELECT salary FROM emp_new a WHERE a.dept_id=(SELECT id FROM dept b WHERE b.`name`='财务部');
SELECT *FROM emp_new a WHERE a.salary>ALL(SELECT salary FROM emp_new a WHERE a.dept_id=(SELECT id FROM dept b WHERE b.`name`='财务部'));
2.2.3、 查询比研发部任意一人工资高的员工信息(ANY或SOME)
#SELECT id FROM dept b WHERE b.`name`='研发部';
#SELECT salary FROM emp_new a WHERE a.dept_id=(SELECT id FROM dept b WHERE b.`name`='研发部');
SELECT *FROM emp_new a WHERE a.salary>ANY(SELECT salary FROM emp_new a WHERE a.dept_id=(SELECT id FROM dept b WHERE b.`name`='研发部'));
2.3、行子查询(子查询结果为一行)
行子查询的结果是一行(可以是多列)
举个例子:
2.3.1、查询与张无忌的薪资及直属领导相同的员工
#SELECT id FROM emp_new a WHERE a.`name`='张无忌';
#SELECT a.salary,a.managerid FROM emp_new a WHERE id=(SELECT id FROM emp_new a WHERE a.`name`='张无忌');
SELECT * FROM emp_new a WHERE (a.salary,a.managerid)=(SELECT a.salary,a.managerid FROM emp_new a WHERE id=(SELECT id FROM emp_new a WHERE a.`name`='张无忌'));
SELECT * FROM emp_new WHERE (salary,managerid)=(SELECT salary,managerid FROM emp_new WHERE name='张无忌'));
2.4、表子查询(子查询结果为多行多列)
表子查询返回的结果是多行多列 常用操作符是IN
举个例子:
2.4.1、查询与“鹿仗客”,“宋远桥”的职位和薪资相同的员工信息
#SELECT job,salary FROM emp_new WHERE name='鹿杖客' or name='宋远桥';
SELECT * FROM emp_new WHERE (job,salary) IN (SELECT job, salary FROM emp_new WHERE name='鹿仗客' OR name='宋远桥');
2.4.2、查询入职日期是2006-01-01之后的员工,及其部门信息
#SELECT * FROM emp_new a where a.enterdate>'2006-01-01';SELECT e.*,d.* FROM (SELECT * FROM emp_new a where a.enterdate>'2006-01-01') e LEFT JOIN dept d ON e.dept_id=d.id;
完结撒花