MySQL 05 :多表查询
加where过滤
老韩分析
1。雇员名,雇员工资来自emp表
2。部门的名字来自dept表
3。 需求对emp和dept查询 ename,sal,dname,deptno
4。 当我们需要指定显示某个表的列是,需要表,
说明
自连接
自连接是指在同一张表的连接查询[将同一张表当做两张表使用]。
1。把同一张表当做两张表使用
2。需要给表取别名
3。列名不明确,可以指定列的别名 列名as 列的别名
给一张表起了一个大名和小名,大名用的一个列,小名用的另一个列
mysql表子查询
单行子查询
-- 子查询的演示
-- 请思考:如何显示与SMITH同一部门的所有员工?
SELECT deptno
FROM emp
WHERE ename = 'SMITH'
SELECT *
FROM emp
WHERE deptno = (
SELECT deptno
FROM emp
WHERE ename = 'SMITH'
)
多行子查询
– 多行子查询
– 课堂练习:如何查询和部门10的工作相同的雇员的
– 名字、岗位、工资、部门号,但是不含10自己的。
子查询当做临时表来使用
把子查询当做一张临时表可以解决很多很多复杂的查询
-- 查询ecshop中各个类别中,价格最高的商品
-- 查询商品表
-- 先得到 各个类别中,价格最高的商品 max + group by cat id
SELECT cat_id, MAX(shop_price) AS max_price
FROM ecs_goods
GROUP BY cat_id
SELECT goods_id, temp.cat_id, goods_name, shop_price
FROM (
SELECT cat_id, MAX(shop_price) AS max_price
FROM ecs_goods
GROUP BY cat_id
) temp, ecs_goods
WHERE temp.cat_id = ecs_goods.cat_id
AND temp.max_price = ecs_goods.shop_price
在多行子查询中 all 和 any 的使用
请思考:显示工资比部门30的所有员工的工资高的员工的姓名、工 资和部门号
-- 请思考:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
-- 1、首先算出部门号=30 中的最高工资
SELECT MAX(sal)
FROM emp
WHERE deptno = 30
-- 2、然后找出高于这个工资的人
-- (1)all方法
SELECT ename, sal, deptno
FROM emp
WHERE sal > all (
SELECT sal
FROM emp
WHERE deptno = 30
)
-- (2)MAX方法
SELECT ename, sal, deptno
FROM emp
WHERE sal > (
SELECT MAX(sal)
FROM emp
WHERE deptno = 30
)
请思考:如何显示工资比部门30的其中一个员工的工资高的员工的姓名、工资和部门号
-- 请思考:显示工资比部门30的任一员工的工资高的员工的姓名、工 资和部门号
-- (1)any方法
SELECT ename, sal, deptno
FROM emp
WHERE sal > ANY (
SELECT sal
FROM emp
WHERE deptno = 30
)
-- (2)MIN方法
SELECT ename, sal, deptno
FROM emp
WHERE sal > (
SELECT MIN(sal)
FROM emp
WHERE deptno = 30
)
多列子查询 manycolumn.sql
![请添加图片描述](https://img-blog.csdnimg.cn/5afd01ef635c456aa825f068e3654e47.png
1、查询出smith的信息
2、将上边的查询作为子查询来使用,并且使用多列子查询的语法来进行匹配