说明
多表查询是指基于两个和两个以上的表查询,在实际应用中,查询单个表可能不能满足你的需求,(如下面的课堂练习),需要使用到(dept表和emp表)
- 多表查询 显示雇员名,雇员工资及所在部门的名字【笛卡尔集】
- 小技巧:多表查询的条件不能少于表的个数-1,否则会出现笛卡尔集
- 如何显示部门号为10的部门名、员工名和工资。
- 显示各个员工的姓名,工资,及其工资的级别
在默认情况下:当两个表查询时,规则
- 从第一张表中,取出一行和第二张表的每一行进行组合,返回结果[含有两张表的所有列].
- 一共返回的记录数第一张表行数*第二张表的行数
- 这样多表查询默认处理返回的结果,称为笛卡尔集
- 解决这个多表的关键就是要写出正确的过滤条件 where,需要程序员进行分析
-- 多表查询
-- ?显示雇员名,雇员工资及所在部门的名字 【笛卡尔集】
/*
分析
1. 雇员名,雇员工资 来自 emp表
2. 部门的名字 来自 dept表
3. 需求对 emp 和 dept查询 ename,sal,dname,deptno
4. 当我们需要指定显示某个表的列是,需要 表.列表
*/
SELECT ename,sal,dname,emp.deptno
FROM emp, dept
WHERE emp.deptno = dept.deptno
SELECT * FROM emp;
SELECT * FROM dept;
SELECT * FROM salgrade;
-- 老韩小技巧:多表查询的条件不能少于 表的个数-1, 否则会出现笛卡尔集
-- ?如何显示部门号为10的部门名、员工名和工资
SELECT ename,sal,dname,emp.deptno
FROM emp, dept
WHERE emp.deptno = dept.deptno AND emp.deptno = 10
-- ?显示各个员工的姓名,工资,及其工资的级别
-- 思路 姓名,工资 来自 emp 13
-- 工资级别 salgrade 5
-- 写sql , 先写一个简单,然后加入过滤条件...
SELECT ename, sal, grade
FROM emp , salgrade
WHERE sal BETWEEN losal AND hisal;
子连接是指在同一张表的连接查询【将同一张表看作两张表】
-- 多表查询的 自连接
-- 思考题: 显示公司员工名字和他的上级的名字
-- 老韩分析: 员工名字 在emp, 上级的名字的名字 emp
-- 员工和上级是通过 emp表的 mgr 列关联
-- 这里老师小结:
-- 自连接的特点 1. 把同一张表当做两张表使用
-- 2. 需要给表取别名 表名 表别名
-- 3. 列名不明确,可以指定列的别名 列名 as 列的别名
SELECT worker.ename AS '职员名' , boss.ename AS '上级名'
FROM emp worker, emp boss
WHERE worker.mgr = boss.empno;
SELECT * FROM emp;