联表查询
联表查询
查询语句的结果如果在一张表中无法获取时,或者查询某写内容需要多张表时,这样就需要联表查询,
而联表查询的基础在于外键的约束,使得表与表之间存在一定的关联。
联表查询的种类
1. 连接查询:分为内连接,外连接和自连接
①内连接:相当于查询表A和表B之间交集部分数据
②外连接:
左外连接:查询左表所有数据,以及两张表交集部分数据
右外连接:查询右表所有数据,以及两张表交集部分数据
③自连接:当前表与自身的连接查询,自连接必须使用表别名
2. 子查询:通过使用表与表嵌套的方式
如下表:
内连接
内连接是查询两张表之间的交集的部分。
语法:
①隐式内连接
select 字段列表 from 表1,表2 where 两表连接条件 其它条件......;
②显示内连接
select 字段列表 from 表1 [inner] join 表2 on 两表连接条件 where 其它条件....;
隐式内连接
举个例子:
select * from emp,dept
效果展示:
发现数据特点多,而且仔细发现还存在重复出现的数据。
因为当你如果没有添加【联表条件】时,会出现笛卡尔积现象,所以为了解决这个问题一定一定要写【联表条件】
正确的例子:
select * from emp,dept where emp.deptno=dept.deptno
效果展示:
如果后续需要过滤某些数据时,可以在where条件后面继续添加条件语句。
显式内连接
举个例子:
select * from emp inner join dept on emp.deptno=dept.deptno
效果展示:
两者显式内连接和隐式内连接效果完全一样的。
外连接
左外连接:相当于查询左表的所有数据包含表1和表2 交集部分的数据
右外连接:相当于查询右表的所有数据包含表1和表2 交集部分的数据
语法:
①左外连接
select 字段列表 from 表1 left [outer] join 表2 on 两表连接条件 where 条件语句;
①右外连接
select 字段列表 from 表1 right [outer] join 表2 on 两表连接条件 where 条件语句;
左外连接
举个例子:
-- 左外连接
select * from emp left join dept on emp.deptno=dept.deptno;
效果展示:
右外连接
举个例子:
-- 右外连接
select * from emp right join dept on emp.deptno=dept.deptno;
效果展示:
会发现右外连接它会把表2(dept)中的deptno=40的也查询出来,即使左表(emp)没有员工在这个部门里面。
自连接
自己与自己进行连接,必须给表起别名
语法:
①隐式自连接
select 字段列表 from 表A as 别名1 表A as 别名2 where 连接条件
②显示自连接
select 字段列表 from 表A as 别名1 join 表A as 别名2 on 连接条件
举个例子:
要求: 查询员工名称以及对应的领导名
分析: 查询的结果都在一张表中。但是设计员工表---领导表
select e.ename 员工姓名,l.ename 领导名 from emp e join emp l on e.mgr=l.empno;
效果展示:
子查询(嵌套查询)
把一次查询的结果作为另一个查询的条件值。这种方式就是嵌套查询。
语法:
select * from 表名 where 字段 [in|=] (select 字段 from 表名 where 条件)
例子:
根据部门名称查询到部门的编号
select * from emp where deptno=(
select deptno from dept where dname='研发部'
)