Notas de programación y consultas avanzadas de MySQL • [Capítulo 3 Subconsultas]

Todos los capítulos >>>>


Contenido de este capítulo

3.1 Definición de subconsulta y subconsulta de una sola fila

3.1.1 Definición de subconsulta

3.1.2 Aplicación de subconsultas de una sola fila

3.1.4 Ejercicios de práctica

3.2 Aplicación de subconsultas multilínea

3.2.1 en operador de comparación

3.2.3 cualquier | alguna subconsulta de palabras clave

3.2.4 Ejercicios de práctica

3.3 Aplicaciones especiales de subconsultas

3.3.1 Subconsultas en la cláusula from

3.3.2 Subconsultas en la cláusula select

3.3.4 Ejercicios de práctica

3.4 Subconsultas en declaraciones DML

3.4.1 Subconsultas en la cláusula de actualización

3.4.3 Ejercicios de práctica

para resumir:


3.1 Definición de subconsulta y subconsulta de una sola fila

3.1.1 Definición de subconsulta

La subconsulta (subconsulta) es una operación de uso frecuente en bases de datos, no solo se utiliza en declaraciones de consulta de datos, sino también en declaraciones DML.

Una subconsulta anida una sentencia de consulta en otra sentencia de consulta. En determinadas circunstancias, la condición de una sentencia de consulta necesita otra sentencia de consulta para obtener, y el resultado de la consulta de la sentencia de consulta interna se puede proporcionar para la sentencia de consulta externa Condiciones de consulta

La esencia de la subconsulta: el resultado de la consulta de una instrucción select se puede utilizar como valor de entrada de otra instrucción. La subconsulta se puede usar no solo en la cláusula where, sino también en la cláusula from. En este momento, el resultado de la subconsulta se usará como una tabla temporal (tabla temporal)

Las subconsultas también pueden aparecer en la columna de selección de la declaración de selección en forma de campos. De acuerdo con el número de filas de resultados devueltas por la subconsulta, se puede dividir en subconsulta de una sola fila y subconsulta de varias filas

3.1.2 Aplicación de subconsultas de una sola fila

La subconsulta de una sola fila significa que el resultado de retorno de la subconsulta tiene solo una fila de datos. Al hacer referencia al resultado de una subconsulta en la declaración condicional de la consulta principal, puede usar caracteres de comparación de una sola línea (como =,>, <,> =, <= y <>) para comparar

Consulta la información específica de la película temática "bélica" y solicita la salida del título y el nombre del director.

Ejemplo:

(1) La tabla de películas contiene información sobre el nombre de la película, el nombre del director y el número de tipo de película, pero no contiene información sobre el nombre del tipo de película; la tabla de tipo de película (movie_type) contiene información sobre el número de tipo de película y la información sobre el nombre del tipo de película. La información común de las dos tablas anteriores es el número de tipo de película, por lo que la tabla de película y la tabla de tipo de película deben estar conectadas al realizar la consulta, y el número de tipo de película se utiliza como conexión entre las dos tablas. Primero, consulta el número de género de la película con el nombre del género "Guerra" de la tabla de género de la película y usa SQL1 como marca.

select id from movie_type where typeName=' 战争 '

(2) De acuerdo con el código de área consultado por SQL1, recupere el nombre de la película y la información del nombre del director en la tabla de películas. Utilice SQL2 como etiqueta y sustituya SQL1 como condición de consulta en SQL2

select movieName 电影名 ,director 导演名 from movie where typeId=
(select id from movie_type where typeName=' 战争 ')

Dado que typeName es la única columna de restricción en la tabla movie_type, el resultado de la ejecución de la subconsulta SQL1 solo puede tener 1 (subconsulta de una sola fila) o 0 registros.

Este ejemplo también se puede realizar conectando consulta

select movieName 电影名 ,director 导演名 from movie m, movie_type mt
where m.typeId=mt.movie_type and typeName=' 战争 '

Ejemplo:

Consultar información sobre películas con tarifas superiores al precio medio y mostrar el nombre de la película y el director.

(1) Obtenga el precio promedio del boleto, use la marca SQL1

select avg(ticketPrice) from movie

(2) Consultar información sobre películas cuyo precio de entrada sea mayor que el precio medio de entrada y generar el nombre de la película y el director. Utilice el marcado SQL2 y sustituya SQL1 como condición de consulta en SQL2

select movieName 电影名 ,director 导演名 from movie  where ticketPrice>( select avg(ticketPrice) from movie)

Ejemplo:

Consultar información sobre películas con precios de entrada más altos que "guerra" y solicitar que se muestre el nombre de la película y el director.

(1) Consultar el número del tipo de película denominado "Guerra", utilizando la marca SQL1

select id from movie_type where typeName=' 战争 '

(2) Consultar el precio medio de las entradas de películas de "guerra", utilizar el marcado SQL2 y sustituir SQL1 como condición de consulta en SQL2 durante la ejecución.

select avg(ticketPrice) from movie where typeID=(select id from movie_type where typeName=' 战争 ')

(3) Consultar información sobre películas cuyo precio de entrada es mayor que el precio medio de entrada de películas de "guerra" y mostrar el nombre de la película y el director. La instrucción de consulta está marcada con SQL3, y SQL2 se sustituye en SQL3 como condición cuando se usa

select movieName 电影名 ,director 导演名 from movie where ticketPrice>
(select avg(ticketPrice) from movie where typeID=(
select id from movie_type where typeName=' 战争 '))

La experiencia de la aplicación de subconsultas se resume a continuación:

  • La subconsulta se usa generalmente en la cláusula where de la instrucción select y se puede anidar
  • La solución para escribir una subconsulta compleja es descomponer la consulta capa por capa, es decir, comenzar desde la subconsulta más interna y dividir la instrucción SQL anidada en declaraciones SQL independientes.
  • El proceso de ejecución de la subconsulta sigue el principio de "de adentro hacia afuera", es decir, la subconsulta más interna se ejecuta primero, y luego el resultado de la ejecución se fusiona con la declaración externa, y luego se expande capa por capa para formar una declaración SQL completa
  • En circunstancias normales, la consulta de unión se puede cambiar a la implementación de la subconsulta; pero la subconsulta no se puede cambiar para la implementación de la consulta de unión
  • Comparación de la eficiencia de ejecución de la subconsulta y la consulta de combinación: cuando el número de filas del resultado de ejecución de la subconsulta es grande y el número de filas del resultado de ejecución de la consulta principal es pequeño, la eficiencia de ejecución de la subconsulta es mayor; por el contrario, la ejecución la eficiencia de la consulta de combinación es mayor

3.1.4 Ejercicios de práctica

 

3.2 Aplicación de subconsultas multilínea

3.2.1 en operador de comparación

Cuando se utiliza el operador de comparación de varias líneas en, la consulta principal se comparará con cada valor de la subconsulta y, si es el mismo que alguno de los valores, se devolverá. no en y en tiene el significado opuesto

Consultar información relacionada con películas de "guerra" y "comedia", y mostrar el título de la película y el director.

Ejemplo:

(1) Consultar el número de géneros de películas cuyos géneros son "Guerra" y "Comedia".

select id from movie_type where typeName=' 战争 ' or typeName=' 喜剧 '

(2) Consultar información relacionada sobre películas de "guerra" y "comedia"

select movieName 电影名 ,director 导演名 from movie where typeID in
(select id from movie_type where typeName=' 战争 ' or typeName=' 喜剧 ')

Dado que el número de filas de resultado devueltas por una subconsulta de varias filas puede ser uno, una subconsulta de una sola fila también es un caso especial de una subconsulta de varias filas, por lo que el comparador "=" de una subconsulta de una sola fila se puede reemplazar con la "entrada" de un operador de comparación de subconsultas de varias filas. Pero no puede reemplazar el comparador "in" de una subconsulta de varias líneas con el comparador "=" de una subconsulta de una sola línea.

Consultar la información específica de la película reservada por el cliente "zhang01", solicitar la salida del nombre de la película, el nombre del director, el precio de la entrada y la duración de la película, y ordenarlos en orden ascendente según el precio de la entrada.

Ejemplo:

(1) Consultar el número de cliente del cliente "zhang01"

select id from customer where username='zhang01'

(2) Consultar los números de secuencia de todas las películas reservadas por el cliente "zhang01".

select scheduleId from ticket_sell where customerID in
(select id from customer where username='zhang01')

(3) Consultar los números de película de todas las películas reservadas por el cliente "zhang01".

select movieId from `schedule` where id in (select scheduleId from ticket_sell where customerID in  (select id from customer where username='zhang01'))

(4) Consulta la información específica de la película reservada por el cliente "zhang01"

select movieName 电影名 ,director 导演名 ,ticketPrice 票价(元),filmLength 片长(分钟)
from movie where id in(select movieId from `schedule` where id in
(select scheduleId from ticket_sell where customerID in
(select id from customer where username='zhang01'))) order by ticketPrice

Este ejemplo está profundamente anidado y, si se escribe la consulta de combinación, será relativamente concisa, especialmente cuando el número de registros de producto es grande, la eficiencia de la consulta de combinación será mayor. La declaración SQL implementada mediante la consulta de conexión es la siguiente:

select distinct movieName 电影名 ,director 导演名 ,ticketPrice 票价(元),filmLength   片长(分钟) from movie m,`schedule` s,ticket_sell ts,customer c where m.id=s.movieId 
and  s.id=ts.scheduleId and ts.customerId=c.id and c.username='zhang01' order by ticketPrice

La implementación de la subconsulta en el ejemplo anterior encarna bien la solución a la aplicación de la subconsulta: el principio de "desde adentro hacia afuera", es decir, la consulta principal, incluida la subconsulta, se genera capa por capa, y la principal La consulta generada capa por capa se convierte en Las subconsultas contenidas en la consulta principal del nivel superior se repiten en este orden para finalmente generar la consulta principal del nivel superior incluyendo todas las subconsultas.

La palabra clave all se encuentra después del operador de comparación de varias filas. La palabra clave all se utiliza para comparar el valor de una expresión o columna con cada fila de una columna de valores devueltos por la subconsulta, siempre que sea el resultado de una comparación es falso (falso), todas las pruebas devuelven falso y la consulta principal no se ejecuta; de lo contrario, devuelve verdadero y se ejecuta la consulta principal

El significado del operador all es el siguiente:

  • Cuando <todos, significa menos que el valor mínimo
  • Cuando> todo, significa mayor que el máximo

gramática:

表达式或字段 多行比较运算符 all( 子查询 )

Consultar información sobre películas con precios de entrada más altos que todas las películas de "comedia" y mostrar el título y el nombre del director.

Ejemplo:

(1) Consulta el número de género de la película cuyo tipo es "comedia".

select id from movie_type where typeName=' 喜剧 '

(2) Consultar los precios de las entradas de todas las películas de "comedia".

select ticketPrice from movie where typeID=(
select id from movie_type where typeName=' 喜剧 ')

(4) Consultar información sobre películas que tengan un precio de entrada más alto que todas las películas de "guerra".

select movieName 电影名 ,director 导演名 from movie where ticketPrice > all  (select ticketPrice from movie where typeID=(select id from movie_type where typeName=' 喜剧 '))

Dado que "> all (subconsulta)" significa "mayor que el valor máximo devuelto por la subconsulta", también puede utilizar "> (valor máximo de columna obtenido por la subconsulta)" para resolver el ejemplo anterior. La declaración SQL es la siguiente :

select movieName 电影名 ,director 导演名 from movie where ticketPrice > (select max(ticketPrice) from movie where typeID=( select id from movie_type where typeName=' 喜剧 ' ))

3.2.3 cualquier | alguna subconsulta de palabras clave

cualquiera y algunos tienen la misma función de consulta

Antes de que se use any o some en una subconsulta, use el operador de comparación any | some para comparar el valor de una expresión o columna con cada fila en una columna de valores devueltos por la subconsulta. Siempre que el resultado de una comparación sea Verdadero, entonces Si alguna o alguna prueba devuelve verdadero, la consulta principal se ejecuta; de lo contrario, el resultado es falso y la consulta principal no se ejecuta

El significado del operador any | some es el siguiente:

  • Cuando <any | some, significa menos que el máximo
  • When = any | some, es equivalente al operador in
  • Cuando> cualquier | algo, significa mayor que el mínimo

gramática:

表达式或字段  多行比较运算符  any|some(子查询)

Consultar información sobre películas que tienen un precio de entrada más alto que cualquier película temática de "comedia" y mostrar el nombre de la película y el director.

Ejemplo:

select movieName 电影名 ,director 导演名 from movie where ticketPrice > any
(select ticketPrice from movie where typeID=(
select id from movie_type where typeName=' 喜剧 '))

Dado que "> cualquier (subconsulta)" significa "mayor que el valor mínimo de los resultados devueltos por la subconsulta", también puede usar "> (el valor de columna más pequeño obtenido por la subconsulta)" para resolver el ejemplo anterior. La declaración SQL es como sigue:

select movieName 电影名 ,director 导演名 from movie where ticketPrice > (select min(ticketPrice) from movie where typeID=( select id from movie_type where typeName=' 喜剧 ' ))

3.2.4 Ejercicios de práctica

 

3.3 Aplicaciones especiales de subconsultas

3.3.1 Subconsultas en la cláusula from

Las subconsultas se usan generalmente en la cláusula where, pero también se pueden usar en la cláusula from y la cláusula select

Ejemplo:

El sistema de venta de entradas de cine en línea optimiza la naturaleza científica del precio de las tarifas para aumentar la asistencia a las películas. Para comprender la relación entre el precio de la entrada de cada película y el precio total de la entrada de esta categoría de películas, es más apropiado mostrar el precio medio de la entrada de cada película al mismo tiempo que el precio de la entrada de cada película.

select mt.typeName 电影类型 , m.movieName 电影名 , m.director 导演名 , round(m.ticketPrice,2)
票价(元), round(A.avgPrice,2) 该电影类型平均票价(元) from movie m, movie_type mt,
(select typeId,avg(ticketPrice) avgPrice from movie group by typeId) A where m.typeId=mt.id and m. typeId=A.typeId order by mt.id

3.3.2 Subconsultas en la cláusula select

El uso de subconsultas en la cláusula select, cuya esencia es utilizar los resultados de ejecución de la subconsulta como la columna de la cláusula select, que puede desempeñar el mismo papel que la consulta de combinación.

Ejemplo:

Obtenga el número de proyecciones y el número de proyecciones de películas dirigidas por Zhang Yimou

(1) Obtenga el número de estrenos de películas dirigidas por Zhang Yimou

select count(*) 张艺谋所导演影片的上映数量 from movie where director=' 张艺谋 '

(2) Obtenga el horario de proyección de la película dirigida por Zhang Yimou

select count(movieId) 张艺谋所导演影片的上映班次 from `schedule` where movieId in
(select id from movie where director=' 张艺谋 ')

(3) Los resultados de la consulta obtenidos en (1) y (2), es decir, el número de estrenos y el número de proyecciones de las películas dirigidas por Zhang Yimou se utilizan como columna de consulta de la cláusula select, y su forma es la subconsulta en la cláusula select.

select count(*) 张艺谋所导演影片的上映数量 , (select count(movieId) from `schedule` where
movieId in (select id from movie where director=' 张艺谋 ')) 张艺谋所导演影片的上映班次
from movie where director=' 张艺谋 '

Existe se utiliza para comprobar si la subconsulta devolverá al menos una fila de datos. La subconsulta no devuelve ningún dato, pero devuelve el valor verdadero o falso. existe especifica una subconsulta para detectar la existencia de filas. Cuando existe la fila de la subconsulta, se ejecuta la expresión de la consulta principal; de lo contrario, no se ejecuta

Consultar los nombres de todos los clientes que reservaron entradas de cine a través del sistema de venta de entradas de cine en línea.

gramática:

主查询表达式  [not] exists ( 子查询 )

Ejemplo:

(1) La consulta principal se utiliza para obtener el nombre del cliente de la tabla de clientes.

(2) La subconsulta especificada por existe obtendrá cualquier dato que satisfaga la condición de "Número de cliente = Tabla de cliente. Número de cliente" de la tabla de emisión de boletos.

(3) Siempre que haya filas de datos devueltas en el conjunto de resultados de la subconsulta existente, si el resultado devuelto de la subconsulta existente es verdadero, la consulta principal se ejecutará para obtener los nombres de todos los clientes que reservaron entradas de cine; si el resultado devuelto de la subconsulta existente es falso, no Ejecute la consulta principal. La declaración SQL final es la siguiente:

select customerName 客户姓名 from customer c where exists
(select * from orders where customerID=c.customerID)

3.3.4 Ejercicios de práctica

 

3.4 Subconsultas en declaraciones DML

3.4.1 Subconsultas en la cláusula de actualización

  • Las subconsultas no solo se pueden usar en sentencias de selección para lograr funciones de consulta anidadas, sino también mantener datos y completar funciones complejas de actualización, eliminación e inserción
  • Para completar las funciones de mantenimiento de datos anteriores, las subconsultas deben usarse en la declaración de actualización, la declaración de eliminación y la declaración de inserción del DML
  • El principio de usar subconsultas en declaraciones DML es el mismo que usar subconsultas en declaraciones select. Ambas usan los resultados de la subconsulta interna como el valor de referencia de la condición where en la consulta principal externa.

Ejemplo:

En respuesta al llamado del gobierno para mejorar la conciencia de los ciudadanos y las capacidades de respuesta a los desastres, los cines redujeron el precio de las entradas de todas las películas de desastres en un 20%.

(1) Obtenga el número de género de la película cuyo tipo es "desastre" en la subconsulta.

(2) En la consulta principal, use la declaración de actualización para reducir el precio de la entrada de todas las películas de desastres en un 20%

update product set currentPrice=currentPrice*0.9 where categoryID in(
select categoryID from category where categoryName=' 灾难 ')

Ejemplo:

Calcule la cantidad total de entradas al cine reservadas por todos los clientes y utilice esta cantidad para actualizar el valor del campo de la "cantidad acumulada de la reserva" en la tabla de clientes.

(1) En la tabla de emisión de boletos, agrupe por número de cliente y use "suma (tarifa real)" para resumir el monto total de la reserva de cada cliente.

select customerID 客户编号 , sum(purchasePrice) 总订票金额(元) from ticket_sellgroup by customerID

(2) Debido a que desea asignar el monto total de la reserva de cada cliente resumido en (1) al campo "monto acumulado de la reserva" en la tabla de clientes, puede usar el SQL en (1) como una subconsulta y agregarlo en la consulta principal, ejecute "actualizar el conjunto de la tabla de clientes monto acumulado del boleto = (monto total del boleto para cada cliente obtenido en la subconsulta)".

(3) Para implementar la declaración de actualización, debe eliminar la columna de selección "número de cliente" en la subconsulta, y para establecer la asociación entre la consulta principal y la subconsulta, también debe establecer "número de cliente = tabla de tickets "en la condición where de la subconsulta. Número de cliente"

update customer c set totalFee=(select sum(purchasePrice) from ticket_sell where customerID=c.ID group by customerID)

Utilice la subconsulta para eliminar el cliente "chen01"

Ejemplo:

Al eliminar datos, debe tener en cuenta la relación maestro-esclavo de la tabla. El enfoque correcto es eliminar los datos de la tabla primero y luego eliminar los datos de la tabla principal.

(1) Utilice una subconsulta para eliminar todos los registros de reserva del cliente "chen01" en la tabla de emisión de boletos.

delete from ticket_sell where customerID in
(select id from customer where username='chen01')

(2) Elimine el registro del cliente "chen01" en la tabla de clientes.

delete from customer where username='chen01'

3.4.3 Ejercicios de práctica

 

para resumir:

  • Una subconsulta anida una sentencia de consulta en otra sentencia de consulta. En determinadas circunstancias, la condición de una sentencia de consulta requiere otra sentencia de consulta para obtener
  • Antes de que el operador de comparación use todas las palabras clave en una subconsulta, la palabra clave compara el valor de una expresión o columna con cada fila de una columna de valores devueltos por la subconsulta.
  • Existe se utiliza para detectar la existencia de filas. Esta subconsulta en realidad no devuelve ningún dato, pero devuelve verdadero o falso. Cuando existe la fila de la subconsulta, se ejecuta la expresión de la consulta principal; de lo contrario, no se ejecuta
  • El principio de usar subconsultas en declaraciones DML es el mismo que usar subconsultas en declaraciones select. Ambas usan los resultados de la subconsulta interna como el valor de referencia de la condición where en la consulta principal externa.

 

Supongo que te gusta

Origin blog.csdn.net/weixin_44893902/article/details/111094651
Recomendado
Clasificación