posstgresql多表连接
- 内连接
- 左外连接
- 右外连接
- 总结
- 交叉连接
- 九九乘法表
- 自然连接
- 自连接
内连接
内连接用于返回两个表中匹配的数据行,使用关键字INNER JOIN表示,也可以简写成JOIN
select
-- 内连接
d.department_id ,e.first_name ,d.department_name
from employees e
join departments d on e.department_id =d.department_id;
-- 内连接也可以写成如下sql
select d.department_id ,e.first_name ,d.department_name
from employees e,departments d
where e.department_id =d.department_id ;
左外连接
左外连接返回左表中所有的数据行;对于右表,如果没有匹配的数据,显示为空值。左外连
接使用关键字 LEFT OUTER JOIN 表示,也可以简写成 LEFT JOIN
-- 左外连接
select
d.department_id ,e.employee_id ,e.first_name ,d.department_name
from employees e
left join departments d on e.department_id =d.department_id
where d.department_id isnull ;
表和表之间的连接条件用on,过滤条件用where
-- 查询出IT部门的信息
select
d.department_id ,
e.employee_id ,
e.first_name ,
d.department_name
from employees e
left join departments d
on e.department_id =d.department_id
where d.department_name ='IT';
右外连接
select
d.department_id ,
e.employee_id ,
e.first_name ,
d.department_name
from employees e
right join departments d
on e.department_id = d.department_id
右外连接返回右表中所有的数据行;对于左表,如果没有匹配的数据,显示为空值。右外连接使用关键字 RIGHT OUTER JOIN 表示,也可以简写成 RIGHT JOIN
总结
交叉连接
当连接查询没有指定任何连接条件时,就称为交叉连接。交叉连接使用关键字 CROSS JOIN
表示,也称为笛卡尔积(Cartesian product)。
两个表的笛卡尔积相当于一个表的所有行和另一个表的所有行两两组合,结果数量为两个表
的行数相乘
九九乘法表
-- generate_series:产生序列,
select concat(t1,'*',t2,'=',t1*t2)
from generate_series(1,9) t1
cross join generate_series(1,9) t2;
自然连接
对于连接查询,如果满足以下条件,可以使用 USING 替代 ON 子句,简化连接条件的输入:
- 连接条件是等值连接,即 t1.col1 = t2.col1;
- 两个表中的列必须同名同类型,即 t1.col1 和 t2.col1 的类型相同。
- 由于 employees 表和 departments 表中的 department_id 字段名称和类型都相同,可以使用
USING 连接查询:
select *
from employees e
join departments d
using(department_id);
等于
select *
from employees e
join departments d
on e.department_id =d.department_id ;
如果 USING 子句中包含了两个表中所有的这种同名同类型字段,可以使用更加简单的自然
连接(NATURAL JOIN)表示。例如,employees 表和 departments 表拥有 2 个同名同类型字段:
department_id 和 manager_id,如果基于这 2 个字段进行等值连接,可以使用自然连接:
select
d.department_id,
d.department_name ,
e.first_name ,
e.last_name
from employees e
natural join departments d ;
自连接
连接(Self Join)是指连接操作符的两边都是同一个表,即把一个表和它自己进行连接。自
连接本质上并没有什么特殊之处,主要用于处理那些对自己进行了外键引用的表。
例如,员工表中的经理字段(manager_id)是一个外键列,指向了员工表自身的员工编号字
段(employee_id)。如果要显示员工姓名以及他们经理的姓名,可以通过自连接实现:
select
e.first_name ,
e.last_name ,
m.first_name as manager_first_name,
m.last_name as manager_last_name
from employees e
left join employees m
on e.manager_id = m.employee_id ;