关系字段:两表中有关联关系的字段
\关系字段:两表之间存在关系的字段
什么是表连接?
当我们的查询结果需要从多张表中获取时,此时应该让表之间建立连接,同时获取数据
特点:同时对连接双方做约束,双方只有符合连接条件的数据才会进行显示
select 表名.列名, 表名.列名,... from 表名1 inner join 表名2 on 连接条件 ?-- 两表间的关系字段
-- 查询员工的id、工资与部门名称 -- 第一步:确定数据来自于哪些表 -- 第二步:确定两表之间的关系字段 -- 书写表连接完成查询操作 ? select e.employee_id 员工id,e.salary 员工工资,d.department_name ?-- 基于连接结果进行查询操作 from employees e inner join departments d -- 起别名,方便后续书写 on e.department_id=d.department_id -- 关系字段:员工表的部门id=部门表的部门id
from-->join on:确定数据来源
select:查询操作
特点:左表中的数据无论如何都会显示,右表中的数据只有符合连接条件才会显示
select 表名.列名, 表名.列名,... from 左表 left outer join 右表 on 连接条件 ?-- 两表间的关系字段
-- 使用左外连接显示员工信息及其部门信息 select e.*,d.* from employees e left outer join departments d -- 员工信息无论如何都会显示,部门信息符合连接条件才会显示 on e.department_id=d.department_id
特点:右表中的数据无论如何都会显示,左表中的数据只有符合连接条件才会显示
select 表名.列名, 表名.列名,... from 左表 right outer join 右表 on 连接条件 ?-- 两表间的关系字段
-- 使用右外连接显示部门信息及对应员工信息 select e.*,d.* from employees e right outer join departments d on e.department_id=d.department_id
连接关键字中的inner、outer可以省略
特点:对双方都不做约束
作用:将两个查询结果进行合并
查询结果1 union 查询结果2
使用:
合并双方字段数目、内容必须一致
union关键字可以去重
union all 不会对结果去重
-- 查询员工表所有信息 select employee_id,first_name,salary from employees union all -- 合并,不去重 -- 查询员工表所有信息 select employee_id,first_name,salary from employees
特点:是特殊的表连接,参与连接的是同一张表
使用:
表中的两个字段为关系字段,作为连接条件
-- 按照指定要求查询员工信息:员工id,员工姓名,直接领导的id,直接领导的姓名 select e1.employee_id 员工id,e1.first_name 员工姓名,e1.manager_id 领导id,e2.first_name 领导姓名 from employees e1 left join employees e2 -- e1:员工信息 e2:领导信息 on e1.manager_id=e2.employee_id ?-- 连接条件:员工的领导id=领导的员工id
连接双方判断同一字段,作为连接条件
-- 查询工资相同的员工id及其工资 select e1.employee_id,e1.salary,e2.employee_id,e2.salary from employees e1 left join employees e2 -- 连接参与比较的两个员工 on e1.salary=e2.salary -- 两个员工的工资相同 where e1.employee_id>e2.employee_id
如果查询字段来自于多张表,内连接或左外连接
如果查询字段来自于一张表并且来自同一行数据,则简单查询|子查询
如果查询字段来自于一张表但是不来自于同一行数据。则自连接
特点:同时从多张表中获取数据
select 表名.列名, 表名.列名,... from 表1 left join 表2 on 连接条件 ?-- 表1和表2的关系字段 left join 表3 on 连接条件 ?-- 表1和表3的关系字段|表2和表3的关系字段
-- 查询员工id,员工姓名,所属部门id,部门名称,部门所在城市 select e.employee_id,e.first_name,d.department_id,d.department_name,l.city from employees e left join departments d ?-- 先让员工表和部门表建立连接 on e.department_id=d.department_id ?-- 员工的部门id=部门的id left join locations l ?-- 再让地址表参与连接 on d.location_id=l.location_id ?-- 部门表的地址id=地址表的id
实际开发中,不建议表连接超过3张表,否则会有性能问题