内连接用于返回两个表中匹配的数据行,使用关键字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 子句,简化连接条件的输入:
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 ;