Conceptos básicos de MySQL (4)

consulta de varias tablas

  1. Descripción general: la consulta de varias tablas es una consulta entre varias tablas.

    • Resumen: SELECCIONAR * DESDE nombre_tabla

    • La consulta de varias tablas debe ir seguida de varias tablas. Tales como: seleccione * de emp, departamento

inserte la descripción de la imagen aquí
Producto cartesiano: en matemáticas, el producto cartesiano representa toda la composición de dos conjuntos, el conjunto A y el conjunto B.
inserte la descripción de la imagen aquí

  1. ¿Cómo eliminar el producto cartesiano en sql? En la consulta SQL, solo necesita agregar ciertas condiciones para eliminar los datos no válidos y eliminar el producto cartesiano.

    • Por ejemplo, al consultar Ma Yun, agregar la condición de identificación del departamento puede eliminar otros datos no válidos.

Clasificación de consultas de varias tablas.

consulta de conexión

  • Consulta de unión interna (equivalente a consultar la intersección de nuestras colecciones (C))
  • inserte la descripción de la imagen aquí

consulta de unión interna

  1. Nota: No se pueden consultar datos que no estén relacionados
consulta de unión interna implícita
  1. gramática:

    SELECT 字段列表 FROM1 ,2 WHERE 条件 ... ;
    
    SELECT * FROM emp,dept where emp.dept_id = dept.id
    

    inserte la descripción de la imagen aquí

consulta de unión interna explícita
  1. gramática

    SELECT 字段列表 FROM1 [ INNER ] JOIN2 ON 连接条件 ... ;
    
    SELECT * FROM emp JOIN dept on emp.dept_id = dept.id;
    

    inserte la descripción de la imagen aquí

El caso de la consulta de unión interna.
  1. Consultar el nombre de cada empleado y el nombre del departamento asociado (implementación de conexión interna implícita)

    • Estructura de la tabla: emp, departamento
    • Condición de unión: emp.dept_id = dept.id
    SELECT emp.name '员工姓名' ,dept.name '部门名称' from emp,dept where emp.dept_id = dept.id;
    
    
    SELECT e.name '员工姓名', d.name '部门名称'
    			FROM emp e,dept d 
    			where e.dept_id = d.id;
    

    inserte la descripción de la imagen aquí

Consultar el nombre de cada empleado y el nombre del departamento asociado (implementación de conexión interna explícita) — INNER JOIN…ON…

  • Estructura de la tabla: emp, departamento
  • Condición de unión: emp.dept_id = dept.id
SELECT e.name '员工姓名',d.name '部门名称' 
			FROM emp e JOIN dept d ON e.dept_id = d.id;
			
			
SELECT e.name '员工姓名',d.name '部门名称' 
			FROM emp e INNER JOIN dept d ON e.dept_id = d.id;

Nota: Una vez que se establece un alias, no se puede usar directamente con la tabla. En este momento, solo se puede usar el alias y se puede omitir el interno (no afecta ningún efecto y básicamente no se usa en desarrollo)
inserte la descripción de la imagen aquí

Consulta de unión externa

  1. La consulta de unión externa se divide en unión externa izquierda y unión externa derecha
izquierda combinación externa
  1. Sintaxis (contiene todos los datos de la tabla de la izquierda y también contiene los datos de la intersección de las dos tablas):

    SELECT 字段列表 FROM1 LEFT [ OUTER ] JOIN2 ON 条件 ... ;
    

    [Error en la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-limpieza, se recomienda guardar la imagen y cargarla directamente (img-EcOddn7G-1692223409433)(day04.assets/image-20220622114232241.png)]
    SELECCIONE la lista de campos DE la tabla 1 DERECHA [EXTERIOR] ÚNASE a la tabla 2 CONdición ON...;
    inserte la descripción de la imagen aquí

El caso de la consulta de unión externa.
  1. Consulte todos los datos en la tabla emp y la información del departamento correspondiente. Como se menciona en los requisitos, debe consultar todos los datos en emp, por lo que no puede usar la consulta de combinación interna. Debe considerar el uso de la consulta de combinación externa.

    • Estructura de la tabla: emp, departamento
    • Condición de unión: emp.dept_id = dept.id
    SELECT e.*,d.* from emp e left join dept d on e.dept_id = d.id;
    
  2. Consulta todos los datos en la tabla del departamento y la información correspondiente del empleado (unión externa derecha). Como se menciona en los requisitos, es necesario consultar todos los datos en la tabla del departamento, por lo que la consulta de unión interna no es posible y es necesario considere usar una consulta de unión externa.

    • Estructura de la tabla: emp, departamento
    • Condición de unión: emp.dept_id = dept.id
    SELECT e.*,d.* from emp e right join dept d on e.dept_id = d.id;
    SELECT e.*,d.* from  dept d left join emp e  on e.dept_id = d.id;
    
Atención de consultas de unión externa
  1. La combinación externa izquierda y la combinación externa derecha pueden reemplazarse entre sí (es solo una cuestión de invertir el orden). En desarrollo, puedes usarlo de forma arbitraria. Prefiero la combinación izquierda.

consulta de autounión

  1. Descripción general: conéctese usted mismo, es decir, trate una tabla como dos tablas para consultar, la consulta de autounión puede usar una consulta de combinación interna o externa

  2. Sintaxis (se debe utilizar alias)

    SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ... ;
    
Ejemplos de consultas de autounión
  1. Consultar los nombres de los empleados y sus líderes.

    SELECT   e.name '员工姓名' , ee.name '领导名称'  FROM emp e,emp ee where e.managerid = ee.id
    
  2. Consulta el nombre emp de todos los empleados emp y sus líderes. Si el empleado no tiene líder, también es necesario consultarlo.

    SELECT   e.name '员工姓名' , ee.name '领导名称'  FROM emp e left join emp ee on e.managerid = ee.id
    

consulta conjunta

  • consulta sindical

    • Combine los resultados de varias consultas para formar un nuevo conjunto de resultados de consulta
  • unión toda consulta

    • Fusionar todos los datos directamente (unión) eliminará la duplicación
  • gramática

    SELECT 字段列表 FROM 表名 ...
    UNION [ALL]
    SELECT 字段列表 FROM 表名 ...
    
  • Requisitos: para consultas conjuntas, la longitud de la columna de la consulta debe ser coherente y los tipos de campo también deben ser coherentes

  • inserte la descripción de la imagen aquí

El caso de las consultas federadas
  1. Consulta a todos los empleados cuyo salario sea inferior a 5000 y a los empleados cuya edad sea superior a 50 años.

    select * from emp where salary < 5000 
        union 
    select * from emp where age > 50 
    
  2. Nota: El uso de union all no deduplicará, solo realizará una combinación lógica de los conjuntos de resultados de las dos tablas.

  3. inserte la descripción de la imagen aquí

subconsulta

  1. Descripción general, la esencia es una consulta anidada, que utiliza el conjunto de resultados de la consulta como una nueva tabla para la consulta.

  2. gramática:

    SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );
    
  3. Para agregar, eliminar, modificar y consultar, puede utilizar subconsultas

  4. Clasificación

    • Subconsulta escalar (el resultado de la consulta 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 (el resultado de la subconsulta es de varias filas y varias columnas)
  5. ubicación de consulta

    • dónde
    • de
    • seleccionar

subconsultas escalares

  1. El resultado de la consulta es un valor único (número, fecha) y algunos bits de operación de uso común, =,!=,>,<,>=,<=

  2. caso:

    • Consultar toda la información de los empleados del "Departamento de I+D"

      SELECT * FROM emp where dept_id = (SELECT id from dept where name = '研发部');
      
    • Consultar información de los empleados después de que "Ma Yun" se uniera a la empresa

      SELECT * FROM emp where entrydate > (SELECT entrydate from emp where name = '马云');
      

consulta de columna

  1. El resultado devuelto por una subconsulta es una columna (pueden ser varias filas), esta subconsulta se denomina subconsulta de columna.

    • operadores comunes
      • EN
      • NO EN
      • CUALQUIERA tiene alguien que satisfacer
      • ALGUNOS pueden ser reemplazados por cualquiera que satisfaga CUALQUIER y ALGUNOS
      • TODOS deben estar satisfechos
  2. caso:

    • Consultar toda la información de los empleados del "Departamento de Ventas" y del "Departamento de Marketing"

      SELECT * FROM emp WHERE dept_id in (SELECT id FROM dept where name = '销售部' or name = '市场部');
      
    • Consultar información sobre empleados cuyo salario es superior al de todos los del "Departamento de Finanzas"

      SELECT * FROM emp where salary > all(SELECT salary from emp where dept_id = (SELECT id from dept where name = '财务部'))
      
    • Consultar información sobre empleados cuyo salario es superior al de cualquier persona del departamento de I+D.

      SELECT * FROM emp WHERE salary > any(SELECT salary from emp where dept_id = (SELECT id from dept where name = '研发部'))
      

subconsulta de fila

  1. Descripción general: el resultado devuelto por una subconsulta es una fila (pueden ser varias columnas). Esta subconsulta se denomina subconsulta de fila.

  2. operadores comunes

    • =
    • !=
    • EN
    • NO EN
  3. caso:

    • Consulte la misma información de los empleados que el salario y el liderazgo directo de "Xie Shihuang"

      SELECT 	* FROM emp where (managerid,salary) = (SELECT managerid,salary from emp where name = '谢世煌');
      

subconsulta de tabla

  1. Descripción general: el resultado de la consulta devuelve varias filas y varias columnas. Esta subconsulta es una subconsulta de tabla.

  2. operadores comunes

    • EN
  3. el caso

    • Consultar información de empleados con el mismo puesto y salario que "Han Min" y "Jiang Fang"

      select * from emp where (job,salary) in ( SELECT job,salary from emp where name = '韩敏' or name = '蒋芳')
      
    • Consultar la información del empleado y la información del departamento cuya fecha de entrada es posterior al "2006-01-01"

      SELECT e.name '员工姓名' ,e.salary '薪资', d.name '部门名称' 
      	FROM  (SELECT * FROM emp where entrydate > '2006-01-01') e
      	LEFT JOIN dept d on  d.id = e.dept_id
      

El caso de la consulta de varias tablas.

  1. Consultar el nombre, la edad, el puesto y la información del departamento del empleado.

    SELECT e.name , e.age ,e.job ,d.name
        FROM emp e ,dept d where e.dept_id = d.id
    
  2. Consultar el nombre, la edad, el puesto y la información del departamento de los empleados menores de 30 años.

    SELECT e.name '员工姓名', e.age '员工年龄', e.job '职位',d.name '部门信息'
    		FROM emp e join dept d on e.dept_id = d.id
    		WHERE e.age < 30
    
  3. Consultar el ID del departamento y el nombre del departamento del empleado

    SELECT distinct d.id ,d.name
        FROM emp e join dept d on e.dept_id = d.id
    
  4. Consultar a todos los empleados mayores de 40 años y el departamento al que pertenecen; si el empleado no tiene asignado un departamento, también es necesario mostrarlo.

    SELECT e.*,d.name '部门名称'
    		FROM emp e left join dept d on e.dept_id = d.id
    	where e.age > 40
    
  5. Consultar el nivel salarial de todos los empleados.

    SELECT  e.* ,s.id '薪资等级'
        FROM emp e left join salgrade s on  e.salary > s.losal and e.salary <= s.hisal 
    
  6. Consultar la información y niveles salariales de todos los empleados del "Departamento I+D"

    SELECT * 
    		FROM (SELECT * FROM emp where dept_id = (SELECT id from dept where name = '研发部')) e left join salgrade s on e.salary > s.losal and e.salary <= s.hisal
    
  7. Consultar el salario medio de los empleados del "Departamento I+D"

    SELECT avg(salary)
    		FROM emp where dept_id = (SELECT id from dept where name = '研发部')
    
  8. Consultar información sobre empleados cuyo salario es superior al de Zhang Ying

    select * from emp where salary > (SELECT salary FROM emp where name = '张瑛')
    
  9. Consultar información de empleados con salario superior al promedio.

    select * from emp where salary > (select avg(salary) from emp)
    
  10. Consultar la información de los empleados cuyo salario es inferior al salario promedio del departamento.

    SELECT * FROM emp e1 where e1.salary < (select avg(e2.salary) from emp e2 where e1.dept_id = e2.dept_id )
    
    • Analizar sql complejo

      SELECT * FROM emp e1 where e1.salary < (
              SELECT n.avgSalary from (
                      SELECT avg(e.salary) avgSalary,d.name,d.id
                          FROM dept d left join emp e on d.id = e.dept_id
                          GROUP BY d.name
                  ) n
              where e1.dept_id = n.id
          )
          
      #第一步查询出部门信息的平均薪资
      SELECT avg(e.salary) avgSalary,d.name,d.id
      						FROM dept d left join emp e on d.id = e.dept_id
      						GROUP BY d.name
      						
      #第二步
      SELECT n.avgSalary from (
      					SELECT avg(e.salary) avgSalary,d.name,d.id
      						FROM dept d left join emp e on d.id = e.dept_id
      						GROUP BY d.name
      				) n
      				
      #第三步再建立子查询查出部门员工的平均薪资
      SELECT * FROM emp e1 where e1.salary < (
      			SELECT n.avgSalary from (
      					SELECT avg(e.salary) avgSalary,d.name,d.id
      						FROM dept d left join emp e on d.id = e.dept_id
      						GROUP BY d.name
      				) n
      			where e1.dept_id = n.id
      		)	
      
  11. Consulta toda la información del departamento y cuenta el número de empleados en el departamento.

    SELECT d.name '部门名称' ,count(e.name)
        FROM dept d left join emp e on d.id = e. dept_id
        GROUP BY d.id
    		
    
    
    select d.name '部门名称',(select count(*) from emp e where e.dept_id = d.id) '人数'
    	from dept d;
    
    

Supongo que te gusta

Origin blog.csdn.net/qq_45709416/article/details/132332412
Recomendado
Clasificación