Consulta avançada do MySQL e notas de programação • [Capítulo 3 Subconsultas]

Todos os capítulos >>>>


Conteúdo deste capítulo

3.1 Definição de subconsulta e subconsulta de uma única linha

3.1.1 Definição de subconsulta

3.1.2 Aplicativo de subconsulta de linha única

3.1.4 Exercícios de prática

3.2 Aplicação de subconsulta multilinha

3.2.1 no operador de comparação

3.2.3 qualquer | subconsulta de alguma palavra-chave

3.2.4 Exercícios de prática

3.3 Aplicações especiais de subconsultas

3.3.1 Subconsultas na cláusula from

3.3.2 Subconsultas na cláusula select

3.3.4 Exercícios de prática

3.4 Subconsultas em declarações DML

3.4.1 Subconsultas na cláusula de atualização

3.4.3 Exercícios de prática

Resumindo:


3.1 Definição de subconsulta e subconsulta de uma única linha

3.1.1 Definição de subconsulta

A subconsulta (subconsulta) é uma operação frequentemente usada em bancos de dados. Ela não é usada apenas em instruções de consulta de dados, mas também em instruções DML.

Uma subconsulta aninha uma instrução de consulta em outra instrução de consulta. Em certas circunstâncias, a condição de uma instrução de consulta precisa de outra instrução de consulta para ser obtida, e o resultado da consulta da instrução de consulta interna pode ser fornecido para a instrução de consulta externa Condições de consulta

A essência da subconsulta: o resultado da consulta de uma instrução select pode ser usado como o valor de entrada de outra instrução. A subconsulta pode ser usada não apenas na cláusula where, mas também na cláusula from. Neste momento, o resultado da subconsulta será usado como uma tabela temporária (tabela temporária)

As subconsultas também podem aparecer na coluna de seleção da instrução de seleção na forma de campos. De acordo com o número de linhas de resultado retornadas pela subconsulta, ela pode ser dividida em subconsulta de linha única e subconsulta de várias linhas

3.1.2 Aplicativo de subconsulta de linha única

A subconsulta de uma única linha significa que o resultado de retorno da subconsulta tem apenas uma linha de dados. Ao fazer referência ao resultado de uma subconsulta na declaração condicional da consulta principal, você pode usar caracteres de comparação de linha única (como =,>, <,> =, <= e <>) para comparação

Consulte as informações específicas do filme temático de "guerra" e solicite a saída do título e do nome do diretor

Exemplo:

(1) A tabela de filmes contém o nome do filme, o nome do diretor e as informações do número do tipo de filme, mas não contém informações do nome do tipo de filme; a tabela do tipo de filme (movie_type) contém informações do número do tipo de filme e do nome do tipo de filme. A informação comum das duas tabelas acima é o número do tipo de filme, portanto, a tabela de filme e a tabela de tipo de filme precisam estar conectadas durante a consulta, e o número do tipo de filme é usado como a conexão entre as duas tabelas. Primeiro, consulte o número do gênero do filme com o nome do gênero "Guerra" na tabela de gênero do filme e use SQL1 como a marca

select id from movie_type where typeName=' 战争 '

(2) De acordo com o código de área consultado pelo SQL1, recupere as informações do nome do filme e do diretor na tabela de filmes. Use SQL2 como uma tag e substitua SQL1 como uma condição de consulta em SQL2

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

Como typeName é a única coluna de restrição na tabela movie_type, o resultado da execução da subconsulta SQL1 pode ter apenas 1 (subconsulta de linha única) ou 0 registros.

Este exemplo também pode ser realizado conectando a consulta

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

Exemplo:

Consulte informações sobre filmes com tarifas superiores ao preço médio e gere o nome do filme e do diretor

(1) Obtenha o preço médio do ingresso, use a marca SQL1

select avg(ticketPrice) from movie

(2) Consulte informações sobre filmes cujo preço do ingresso é maior do que o preço médio do ingresso e produza o nome do filme e do diretor. Use a marcação SQL2 e substitua SQL1 como condição de consulta em SQL2

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

Exemplo:

Consulte informações sobre filmes com preços de ingressos mais altos do que "guerra" e solicite a saída do nome do filme e do diretor

(1) Consulte o número do tipo de filme denominado "Guerra", usando a marca SQL1

select id from movie_type where typeName=' 战争 '

(2) Consulte o preço médio do ingresso de filmes de "guerra", use a marcação SQL2 e substitua SQL1 como a condição de consulta no SQL2 durante a execução

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

(3) Consulte informações sobre filmes cujo preço do ingresso é maior que o preço médio do ingresso de filmes de “guerra” e produza o nome do filme e do diretor. A instrução de consulta é marcada com SQL3 e SQL2 é substituída por SQL3 como a condição quando usada

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

A experiência do aplicativo de subconsulta é resumida da seguinte forma:

  • A subconsulta é geralmente usada na cláusula where da instrução select e pode ser aninhada
  • A solução para escrever uma subconsulta complexa é decompor a consulta camada por camada, ou seja, começar a partir da subconsulta mais interna e dividir a instrução SQL aninhada em instruções SQL independentes.
  • O processo de execução da subconsulta segue o princípio de "de dentro para fora", ou seja, a subconsulta mais interna é executada primeiro e, em seguida, o resultado da execução é mesclado com a instrução externa e, em seguida, expandido camada por camada para formar um Instrução SQL completa
  • Em circunstâncias normais, a consulta de junção pode ser alterada para implementação de subconsulta; mas a subconsulta não pode ser alterada para implementação de consulta de junção
  • Comparação da eficiência de execução da subconsulta e da consulta de junção: quando o número de linhas do resultado da execução da subconsulta é grande e o número de linhas do resultado da execução da consulta principal é pequeno, a eficiência de execução da subconsulta é maior; pelo contrário, a execução a eficiência da consulta de junção é maior

3.1.4 Exercícios de prática

 

3.2 Aplicação de subconsulta multilinha

3.2.1 no operador de comparação

Quando o operador de comparação multilinha in for usado, a consulta principal será comparada com cada valor na subconsulta e, se for igual a qualquer um dos valores, será retornado. não dentro e não tem o significado oposto

Consultar informações relacionadas sobre filmes de "guerra" e "comédia" e obter o título do filme e do diretor

Exemplo:

(1) Consulte os números dos gêneros de filmes cujos gêneros são "Guerra" e "Comédia"

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

(2) Consultar informações relacionadas sobre filmes de "guerra" e "comédia"

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

Uma vez que o número de linhas de resultado retornado por uma subconsulta de várias linhas pode ser um, uma subconsulta de uma única linha também é um caso especial de uma subconsulta de várias linhas, então o comparador "=" de uma subconsulta de uma única linha pode ser substituído por o "in" de um operador de comparação de subconsulta de várias linhas. Mas você não pode substituir o comparador "in" de uma subconsulta de várias linhas pelo comparador "=" de uma subconsulta de uma única linha.

Consulte as informações específicas do filme reservado pelo cliente "zhang01", solicite a saída do nome do filme, nome do diretor, preço do ingresso e duração do filme e classifique-os em ordem crescente de preço do ingresso

Exemplo:

(1) Consulte o número do cliente do cliente "zhang01"

select id from customer where username='zhang01'

(2) Consulte os números de sequência de todos os filmes reservados pelo cliente "zhang01"

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

(3) Consulte os números dos filmes de todos os filmes reservados pelo 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) Consultar as informações específicas do filme reservado pelo 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 exemplo está profundamente aninhado e, se a consulta de junção for gravada, será relativamente conciso, especialmente quando o número de registros do produto for grande, a eficiência da consulta de junção será maior. A instrução SQL implementada usando a consulta de conexão é a seguinte:

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

A implementação da subconsulta no exemplo acima incorpora bem a solução para a aplicação da subconsulta - o princípio de "de dentro para fora", ou seja, a consulta principal incluindo a subconsulta é gerada camada por camada, e o principal A consulta gerada camada por camada torna-se As subconsultas contidas na consulta principal do nível superior são recorridas nesta ordem para finalmente gerar a consulta principal do nível superior incluindo todas as subconsultas.

A palavra-chave all está localizada após o operador de comparação de várias linhas. A palavra-chave all é usada para comparar o valor de uma expressão ou coluna com cada linha de uma coluna de valores retornada pela subconsulta, desde que seja o resultado de uma comparação é falso (falso), O teste all retorna falso e a consulta principal não é executada; caso contrário, retorna verdadeiro e a consulta principal é executada

O significado do operador all é o seguinte:

  • Quando <tudo, significa menos do que o valor mínimo
  • Quando> tudo, significa maior que o máximo

gramática:

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

Consulte informações sobre filmes com preços de ingressos mais altos do que todos os filmes de "comédia" e forneça o título e o nome do diretor

Exemplo:

(1) Consulte o número do gênero do filme cujo tipo é "comédia"

select id from movie_type where typeName=' 喜剧 '

(2) Consulte os preços dos ingressos de todos os filmes de "comédia"

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

(4) Consultar informações do filme que tem um preço de ingresso mais alto do que todos os filmes de "guerra"

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

Como "> todos (subconsulta)" significa "maior que o valor máximo retornado pela subconsulta", você também pode usar "> (valor máximo da coluna obtido pela subconsulta)" para resolver o exemplo acima. A instrução SQL é a seguinte :

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

3.2.3 qualquer | subconsulta de alguma palavra-chave

qualquer um e alguns têm a mesma função de consulta

Antes de algum ou algum ser usado em uma subconsulta, use o operador de comparação any | some para comparar o valor de uma expressão ou coluna com cada linha em uma coluna de valores retornada pela subconsulta. Contanto que o resultado de uma comparação seja verdadeiro, então, se algum ou algum teste retornar verdadeiro, a consulta principal é executada; caso contrário, o resultado é falso e a consulta principal não é executada

O significado do operador any | some é o seguinte:

  • Quando <algum | algum, significa menos do que o máximo
  • Quando = any | some, é equivalente ao operador in
  • Quando> algum | algum, significa maior do que o mínimo

gramática:

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

Consulte informações sobre filmes que têm um preço de ingresso mais alto do que qualquer filme de tema de "comédia" e produza o nome do filme e do diretor

Exemplo:

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

Como "> qualquer (subconsulta)" significa "maior que o valor mínimo dos resultados retornados pela subconsulta", você também pode usar "> (o menor valor de coluna obtido pela subconsulta)" para resolver o exemplo acima. A instrução SQL é o seguinte:

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

3.2.4 Exercícios de prática

 

3.3 Aplicações especiais de subconsultas

3.3.1 Subconsultas na cláusula from

As subconsultas são geralmente usadas na cláusula where, mas também podem ser usadas na cláusula from e na cláusula select

Exemplo:

O sistema de bilhetagem online do cinema otimiza a natureza científica dos preços das tarifas, a fim de aumentar a frequência aos filmes. Para entender a relação entre o preço do ingresso de cada filme e o preço geral do ingresso desta categoria de filmes, é mais apropriado exibir o preço médio do ingresso de cada filme ao mesmo tempo que o preço do ingresso de cada filme.

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 na cláusula select

O uso de subconsultas na cláusula select, cuja essência é usar os resultados da execução da subconsulta como a coluna da cláusula select, que pode desempenhar o mesmo papel que a consulta de junção

Exemplo:

Obtenha o número de exibições e o número de exibições de filmes dirigidos por Zhang Yimou

(1) Obtenha o número de lançamentos de filmes dirigidos por Zhang Yimou

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

(2) Obtenha a programação de exibição do filme dirigido por Zhang Yimou

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

(3) Os resultados da consulta obtidos em (1) e (2), ou seja, o número de lançamentos e o número de exibições dos filmes dirigidos por Zhang Yimou são utilizados como coluna de consulta da cláusula select, e sua forma é a subconsulta na cláusula select.

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

existe é usado para verificar se a subconsulta retornará pelo menos uma linha de dados. A subconsulta não retorna nenhum dado, mas retorna o valor verdadeiro ou falso. existe especifica uma subconsulta para detectar a existência de linhas. Quando a linha da subconsulta existe, a expressão da consulta principal é executada, caso contrário, ela não é executada

Consulte os nomes de todos os clientes que reservaram ingressos de cinema por meio do sistema de ingressos online do cinema

gramática:

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

Exemplo:

(1) A consulta principal é usada para obter o nome do cliente na tabela de clientes.

(2) A subconsulta especificada por exists obterá quaisquer dados que satisfaçam a condição de "Número do cliente = Tabela do cliente. Número do cliente" da tabela de tickets.

(3) Enquanto houver linhas de dados retornadas no conjunto de resultados da subconsulta exista, se o resultado de retorno da subconsulta existente for verdadeiro, a consulta principal será executada para obter os nomes de todos os clientes que reservaram ingressos de cinema; se o resultado de retorno da subconsulta existente é falso, não Execute a consulta principal. A instrução SQL final é a seguinte:

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

3.3.4 Exercícios de prática

 

3.4 Subconsultas em declarações DML

3.4.1 Subconsultas na cláusula de atualização

  • As subconsultas não só podem ser usadas em instruções de seleção para obter funções de consulta aninhadas, mas também manter dados e completar funções complexas de atualização, exclusão e inserção
  • Para completar as funções de manutenção de dados acima, as subconsultas precisam ser usadas na instrução de atualização, instrução de exclusão e instrução de inserção do DML
  • O princípio de usar subconsultas em instruções DML é o mesmo que usar subconsultas em instruções select.Ambos usam os resultados da subconsulta interna como o valor de referência da condição where na consulta principal externa.

Exemplo:

Em resposta ao apelo do governo para aumentar a consciência dos cidadãos e as capacidades de resposta a desastres, os cinemas reduziram os preços dos ingressos de todos os filmes de desastre em 20%

(1) Obtenha o número do gênero do filme cujo tipo é "desastre" na subconsulta.

(2) Na consulta principal, use a declaração de atualização para reduzir o preço dos ingressos de todos os filmes de desastre em 20%

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

Exemplo:

Calcule a quantidade total de ingressos de cinema reservados por todos os clientes e use esse valor para atualizar o valor do campo "valor acumulado da reserva" na tabela de clientes

(1) Na tabela de bilhetes, agrupe por número de cliente e use "soma (tarifa real)" para resumir o valor total da reserva de cada cliente

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

(2) Como você deseja atribuir o valor total da reserva de cada cliente resumido em (1) ao campo "valor da reserva cumulativa" na tabela do cliente, você pode usar o SQL em (1) como uma subconsulta e adicioná-lo em a consulta principal, execute "atualizar tabela do cliente definir valor do ticket acumulado = (valor total do ticket para cada cliente obtido na subconsulta)".

(3) Para implementar a instrução de atualização, você precisa excluir a coluna de seleção "número do cliente" na subconsulta e, para estabelecer a associação entre a consulta principal e a subconsulta, você também precisa definir "número do cliente = tabela de tickets "na condição where da subconsulta. Número do cliente"

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

Use a subconsulta para excluir o cliente "chen01"

Exemplo:

Ao excluir dados, você precisa considerar a relação mestre-escravo da tabela.A abordagem correta é excluir os dados da tabela primeiro e, em seguida, excluir os dados da tabela principal.

(1) Use uma subconsulta para excluir todos os registros de reserva do cliente "chen01" na tabela de bilhetes

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

(2) Excluir o registro do cliente "chen01" na tabela de clientes

delete from customer where username='chen01'

3.4.3 Exercícios de prática

 

Resumindo:

  • Uma subconsulta aninha uma instrução de consulta em outra instrução de consulta. Em certas circunstâncias, a condição de uma instrução de consulta requer outra instrução de consulta para obter
  • Antes do operador de comparação todas as palavras-chave serem usadas em uma subconsulta, a palavra-chave compara o valor de uma expressão ou coluna com cada linha em uma coluna de valores retornados pela subconsulta.
  • existe é usado para detectar a existência de linhas. Esta subconsulta não retorna nenhum dado, mas retorna verdadeiro ou falso. Quando a linha da subconsulta existe, a expressão da consulta principal é executada, caso contrário, ela não é executada
  • O princípio de usar subconsultas em instruções DML é o mesmo que usar subconsultas em instruções select.Ambos usam os resultados da subconsulta interna como o valor de referência da condição where na consulta principal externa.

 

Acho que você gosta

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