1. Relación de varias tablas
Durante el desarrollo del proyecto, al diseñar la estructura de la tabla de la base de datos, la estructura de la tabla se analizará y diseñará en función de las necesidades del negocio y la relación entre los módulos de negocio. Dado que los negocios están interrelacionados, existen varias conexiones entre cada estructura de la tabla. Básicamente hay tres tipos:
- Uno a muchos (muchos a uno)
- muchos a muchos
- Cara a cara
1.1 Uno a muchos
Caso: departamento y empleado
Relación: un departamento corresponde a varios empleados y un empleado corresponde a un departamento
Implementación: establezca una clave externa en muchos lados, apuntando a la clave primaria de un lado (en desarrollo, la configuración de Las claves generalmente se cancelan, es decir, en muchos lados Una parte puede crear un campo que apunte a la clave principal de una parte)
1.2 Muchos a muchos
Caso: Estudiantes y cursos
Relación: Un estudiante puede elegir varios cursos, y un curso también puede ser tomado por varios estudiantes. Implementación
: Crear una tercera tabla intermedia. La tabla intermedia contiene al menos dos claves foráneas, que están relacionadas con las claves primarias. de las dos partes (desarrollo En general, puede cancelar la configuración de claves externas, es decir, crear dos campos en la tabla intermedia que apunten a las claves primarias de ambas partes)
1.3 Uno a uno
Caso: usuario y detalles de usuario
Relación: relación uno a uno, utilizada principalmente para dividir una sola tabla. Coloque los campos básicos de una tabla en una tabla y otros campos de detalles en otra tabla para mejorar la eficiencia operativa. Implementación: en cualquier lado
Agregar una clave externa, asociarla con la clave principal de la otra parte y configurar la clave externa para que sea única (ÚNICA) (Durante el desarrollo, la configuración de la clave externa generalmente se cancela, es decir, agregar un campo en cualquiera de las partes a asociar la clave primaria de la otra parte)
2. Consulta de varias tablas: producto cartesiano
Consulta combinada (producto cartesiano, se mostrarán todos los resultados combinados): select * from employee, dept;
Producto cartesiano: todas las combinaciones de dos conjuntos A y B (en consultas de varias tablas, los productos cartesianos no válidos deben eliminarse)
Eliminar productos cartesianos no válidos: select * from employee, dept where employee.dept_id = dept.id;
3. Unión interna de consultas de varias tablas
La combinación interna consulta la intersección de las dos tablas.
Unión interna implícita: SELECT 字段列表 FROM 表1, 表2 WHERE 条件 ...;
Unión interna explícita: SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ...;
ejemplo:
-- 查询员工姓名,及关联的部门的名称
-- 隐式
select e.name, d.name from employee as e, dept as d where e.dept = d.id;
-- 显式
select e.name, d.name from employee as e inner join dept as d on e.dept = d.id;
4. Unión externa de consulta de varias tablas (unión externa izquierda, unión externa derecha)
Unión externa izquierda:
consulta todos los datos de la tabla de la izquierda y los datos de intersección de las dos tablas, SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ...;
lo que equivale a consultar todos los datos de la tabla 1, incluidos los datos de intersección de la tabla 1 y la tabla 2.
Unión externa derecha:
consulta todos los datos en la tabla derecha y algunos datos en la intersección de las dos tablas SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ...;
ejemplo:
-- 左
select e.*, d.name from employee as e left join dept as d on e.dept = d.id;
select d.name, e.* from dept d left join emp e on e.dept = d.id; -- 这条语句与下面的语句效果一样
-- 右
select d.name, e.* from employee as e right join dept as d on e.dept = d.id;
5. Autounión de consultas de varias tablas
Consulta la conexión entre la tabla actual y ella misma. Se deben utilizar alias de tabla para las autouniones.
gramática: SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ...;
Consulta de autounión, que puede ser una consulta de unión interna o una consulta de unión externa.
ejemplo:
-- 查询员工及其所属领导的名字
select a.name, b.name from employee a, employee b where a.manager = b.id;
-- 没有领导的也查询出来
select a.name, b.name from employee a left join employee b on a.manager = b.id;
6. Consulta conjunta de varias tablas
Combine los resultados de varias consultas para formar un nuevo conjunto de consultas
gramática:
SELECT 字段列表 FROM 表A ...
UNION [ALL]
SELECT 字段列表 FROM 表B ...
Precauciones
- UNION ALL tendrá resultados duplicados, UNION no
- La consulta de unión es más eficiente que usar o y no invalidará el índice.
- Para consultas conjuntas, el número de columnas en varias tablas debe ser coherente y los tipos de campos también deben ser coherentes.
A continuación se muestra un ejemplo que muestra cómo utilizar una consulta de unión para obtener datos de dos tablas:
SELECT column1, column2 FROM table1 UNION SELECT column3, column4 FROM table2;
En el ejemplo anterior, SELECT column1, column2 FROM table1
y SELECT column3, column4 FROM table2
son dos declaraciones independientes SELECT
que obtienen datos de columnas específicas de table1
las tablas y respectivamente. table2
Al fusionarlos mediante UNION
operadores, puede obtener un conjunto de resultados que contenga datos de ambas tablas. (En términos generales, la tabla 1 y la tabla 2 de la consulta conjunta son la misma tabla. Por ejemplo, si consulta la tabla de empleados para empleados con un salario superior a 5000 o empleados con una edad superior a 40, puede utilizar una consulta conjunta)
Cabe señalar que UNION
cuando se utiliza una consulta conjunta, el SELECT
número de columnas, los nombres de las columnas y los tipos de datos de las dos declaraciones deben coincidir. Si necesita conservar filas duplicadas, utilice UNION ALL
en su lugar UNION
.
7. Subconsulta de varias tablas (consulta anidada)
Anidar una instrucción SELECT en una instrucción SQL se denomina consulta anidada, también conocida como subconsulta. SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2);
La declaración fuera de la subconsulta puede ser cualquiera de INSERTAR / ACTUALIZAR / ELIMINAR / SELECCIONAR
Según los resultados de la subconsulta, se pueden dividir en:
- Subconsulta escalar (el resultado de la subconsulta es un valor único)
- Subconsulta de columna (el resultado de la subconsulta es una columna)
- Subconsulta de fila (el resultado de la subconsulta es una fila)
- Subconsulta de tabla (los resultados de la subconsulta son varias filas y columnas)
Según la posición de la subconsulta, se puede dividir en:
- Después de DONDE
- DESDE después
- Después de SELECCIONAR
7.1 Subconsultas escalares
El resultado devuelto por una subconsulta es un valor único (número, cadena, fecha, etc.).
Operadores de uso común: - < > > >= < <=
ejemplo:
-- 查询销售部所有员工
select id from dept where name = '销售部';
-- 根据销售部部门ID,查询员工信息
select * from employee where dept = 4;
-- 合并(子查询)
select * from employee where dept = (select id from dept where name = '销售部');
-- 查询xxx入职之后的员工信息
select * from employee where entrydate > (select entrydate from employee where name = 'xxx');
7.2 Subconsulta de lista
El resultado devuelto es una columna (pueden ser varias filas).
Operadores de uso común:
Operador | describir |
---|---|
EN | Dentro del rango de colección especificado, seleccione uno de más de uno |
NO EN | No dentro del rango de colección especificado |
CUALQUIER | En la lista devuelta por la subconsulta, cualquiera de ellos puede satisfacerse. |
ALGUNO | Igual que ANY, ANY se puede usar dondequiera que se use SOME. |
TODO | Todos los valores de la lista devuelta por la subconsulta deben satisfacer |
ejemplo:
-- 查询销售部和市场部的所有员工信息
select * from employee where dept in (select id from dept where name = '销售部' or name = '市场部');
-- 查询比财务部所有人工资都高的员工信息
select * from employee where salary > all(select salary from employee where dept = (select id from dept where name = '财务部'));
-- 查询比研发部任意一人工资高的员工信息
select * from employee where salary > any (select salary from employee where dept = (select id from dept where name = '研发部'));
7.3 Subconsulta de fila
El resultado devuelto es una fila (pueden tener varias columnas).
Operadores comunes: =, <, >, EN, NO EN
ejemplo:
-- 查询与xxx的薪资及直属领导相同的员工信息
select * from employee where (salary, manager) = (12500, 1);
select * from employee where (salary, manager) = (select salary, manager from employee where name = 'xxx');
7.4 Subconsulta de tabla
El resultado devuelto son varias filas y varias columnas.
Operadores comunes: IN
ejemplo:
-- 查询与xxx1,xxx2的职位和薪资相同的员工
select * from employee where (job, salary) in (select job, salary from employee where name = 'xxx1' or name = 'xxx2');
-- 查询入职日期是2006-01-01之后的员工,及其部门信息
select e.*, d.* from (select * from employee where entrydate > '2006-01-01') as e left join dept as d on e.dept = d.id;