conexión de varias tablas posstgresql
unir internamente
La conexión interna se utiliza para devolver las filas de datos coincidentes en las dos tablas, utilizando la palabra clave INNER JOIN, que también se puede abreviar como 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 ;
izquierda combinación externa
La combinación externa izquierda devuelve todas las filas de datos de la tabla izquierda; para la tabla derecha, si no hay datos coincidentes, se muestra como un valor nulo. La conexión externa izquierda
está representada por la palabra clave LEFT OUTER JOIN, que también se puede abreviar como 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 ;
Úselo en para condiciones de conexión entre tablas y donde para condiciones de filtro.
-- 查询出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';
unión exterior derecha
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
La combinación externa derecha devuelve todas las filas de datos de la tabla derecha; para la tabla izquierda, si no hay datos coincidentes, se muestra como un valor nulo. La conexión externa derecha está representada por la palabra clave RIGHT OUTER JOIN , que también se puede abreviar como RIGHT JOIN.
Resumir
conexión cruzada
Cuando una consulta de unión no especifica ninguna condición de unión, se denomina unión cruzada. La conexión cruzada está representada por la palabra clave CROSS JOIN
, también conocida como producto cartesiano.
El producto cartesiano de dos tablas equivale a una combinación por pares de todas las filas de una tabla y todas las filas de la otra tabla, y el número de resultados es la multiplicación del número de filas
de las dos tablas.
Tabla de multiplicar nueve nueve
-- generate_series:产生序列,
select concat(t1,'*',t2,'=',t1*t2)
from generate_series(1,9) t1
cross join generate_series(1,9) t2;
conexión natural
Para consultas de unión, si se cumplen las siguientes condiciones, puede usar USING en lugar de la cláusula ON para simplificar la entrada de las condiciones de unión:
- La condición de conexión es una conexión equivalente, es decir, t1.col1 = t2.col1 ;
- Las columnas de las dos tablas deben tener el mismo nombre y tipo, es decir, los tipos de t1.col1 y t2.col1 son los mismos.
- Dado que el nombre y el tipo del campo id_departamento son los mismos tanto en la tabla de empleados como en la tabla de departamentos, puede utilizar la
consulta de unión USING:
select *
from employees e
join departments d
using(department_id);
igual
select *
from employees e
join departments d
on e.department_id =d.department_id ;
Si la cláusula USING incluye todos los campos con el mismo nombre y el mismo tipo en las dos tablas, puede usar una
unión natural más simple ( NATURAL JOIN ) para expresar. Por ejemplo, la tabla de empleados y la tabla de departamentos tienen dos campos con el mismo nombre y tipo:
id_departamento y id_gerente . Si realiza una combinación de equivalencia basada en estos dos campos, puede utilizar una combinación natural:
select
d.department_id,
d.department_name ,
e.first_name ,
e.last_name
from employees e
natural join departments d ;
autounirse
Conexión (Self Join) significa que ambos lados del operador de conexión son la misma tabla, es decir, conectan una tabla consigo misma. En esencia, la autounión no tiene nada de especial
y se utiliza principalmente para tratar tablas que tienen referencias de clave externa a sí mismas. Por ejemplo, el campo del administrador (manager_id) en la tabla de empleados es una columna de clave externa que apunta al campo de ID del empleado (employee_id)
en la propia tabla de empleados .
Si desea mostrar los nombres de los empleados junto con el nombre de su gerente, puede hacerlo con una autounión:
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 ;