多表查询
多表查询是指基于两个和两个以上的表查询,在实际应用中,查询单个表可能不能满足我们的需求,因此我们需要使用到多表查询。
emp表
dept表
当我们同时查询emp表和dept表会查询到什么结果呢?
如上图,我们不加条件约束会查询到52个结果,正好是我们emp表行数乘以dept表行数,我们将这个称为笛卡尔集。
他是从第一张表中,取出一行和第二张表的每一行进行组合,返回的结果。
这里提出一个问题,大家思考一下,如何显示部门号为10的部门名,员工名和工资。
首先部门名和员工名来自两个不同的表,所以我们需要进行多表查询。
解决这个问题我们就需要进行条件过滤,找到两张表相关联的字段。 我们举例的这两张表相关联的字段是deptno,因此我们可以进行这样的过滤。
SELECT ename,dname,sal,emp.deptno
FROM emp,dept
WHERE emp.deptno = 10 AND dept.deptno = emp.deptno
这样我们就完成了上述问题。 这里其实还可以按照部门来分组,当然大家可以去自行尝试。
自连接: 在此基础上我们可以思考一下是不是能连接自己呢?当我们将一张表看成两张表来连接时,这个就叫做自连接
自连接的特点:
1.把同一张表当做两张表
2.需要给表取别名 : 表名 表别名
3.列名如果不明确,可以指定列名的别名, 表别名.列名 as 列的别名
自连接可以处理,我们需要一张表中的两个数据,他们之间又符合某种条件, 比如emp表,我们想查询员工名字和他的老板的名字
SELECT worker.ename AS '员工名' ,boss.ename AS '上级名'
FROM emp worker,emp boss
WHERE worker.mgr = boss.empno;
当然实际工作中,自连接能解决的问题不止这些。
子查询
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。
单行子查询:只返回一行数据的子查询语句。
如何显示与SMITH同一部门的所有员工?
SELECT *
FROM emp
WHERE deptno = (
SELECT deptno
FROM emp
WHERE ename = 'SMITH'
);
多行子查询:返回多行数据的子查询
如何查询和部门10的工作相同的雇员的名字,岗位,工资,部门号,但是不含10部门自己的雇员?
SELECT ename,job,sal,deptno
FROM emp
WHERE job IN(
SELECT DISTINCT job
FROM emp
WHERE deptno = 10
) AND deptno <> 10;