Como usar Nested consultas SQL que retornam um valor único

Apresentando uma subconsulta com um dos seis operadores de comparação (=, lt;>, lt;,lt; =, >, > =) É frequentemente útil. Em tal caso, a expressão SQL que precede o operador é avaliado com um valor único, e a subconsulta segue o operador também deve ser avaliada como um único valor. Uma excepção é o caso do operador de comparação quantificada, que é um operador de comparação seguido por um quantificador (QUALQUER, ALGUNS, ou TODOS).

Para ilustrar um caso em que uma subconsulta retorna um valor único, olhar para outro pedaço de banco de dados do Zetec Corporation. Ele contém uma tabela de clientes que contém informações sobre as empresas que compram produtos Zetec.

ColunaDigitarrestrições
CustIDINTEIROCHAVE PRIMÁRIA
companhiaCHAR (40)UNIQUE
CustAddress CHAR (30)
CustCityCHAR (20)
CustStateCHAR (2)
CustZipCHAR (10)
CustPhoneCHAR (12)
modlevelINTEIRO

A tabela CONTATO detém dados pessoais sobre indivíduos em cada uma das organizações de clientes da Zetec.

ColunaDigitarrestrições
CustIDINTEIROCHAVE PRIMÁRIA
ContFNameCHAR (10)
ContLNameCHAR (16)
ContPhoneCHAR (12)
ContInfoCHAR (50)

Diga que você quer olhar para as informações de contato para vendas Olímpico, mas você não se lembra que a empresa de CustID. Use uma consulta aninhada como este para recuperar as informações que deseja:

SELECT * DE CONTACTWHERE CustID = (SELECT CustIDFROM CUSTOMERWHERE Empresa = 'Vendas Olímpico') -

O resultado é algo como isto:

CustID ContFName ContLName ContPhone ContInfo ------ --------- --------- --------- -------- 118 Jerry Attwater 505 -876-3456 Será playmajor papel inadditivemanufacturing.

Agora você pode chamar Jerry no Olympic e dizer-lhe sobre venda especial deste mês em impressoras 3D.

Quando você usa uma subconsulta em um # 147-=# 148- comparação, a subconsulta de SELECIONAR lista deve especificar uma única coluna (CustID no exemplo). Quando a subconsulta é executado, ele deve retornar uma única linha, a fim de ter um único valor de comparação.

Neste exemplo, suponha que a tabela de cliente tem apenas uma linha com um companhia valor de 'Vendas Olímpico'. o CREATE TABLE declaração para CLIENTE especifica um UNIQUE restrição para companhia, e esta declaração garante que a subconsulta no exemplo anterior retorna um único valor (ou nenhum valor).

Subqueries como o que neste exemplo, no entanto, são normalmente utilizados em colunas que não são especificadas de ser UNIQUE. Nesses casos, você deve contar com o conhecimento prévio do conteúdo do banco de dados para acreditar que a coluna não tem duplicatas.

Se mais do que um cliente tem um valor de 'Vendas Olímpico' no companhia coluna (talvez em diferentes estados), a subconsulta gerará um erro.

Se nenhum cliente com esse nome da empresa existe, a subconsulta é tratado como se fosse nula, e a comparação torna-se desconhecido. Neste caso, o ONDE cláusula retorna nenhuma linha (porque ele retorna somente as linhas com a condição verdadeira e filtra as linhas com a condição falsa ou desconhecida). Isso provavelmente iria acontecer, por exemplo, se alguém incorreto o companhiaComo 'Olumpic Vendas'.

Embora o operador igual (=) É o mais comum, você pode usar qualquer um dos outros cinco operadores de comparação em uma estrutura similar. Para cada linha na tabela especificada na envolvente declaração de A PARTIR DE cláusula, o valor único devolvido pela subconsulta é comparado com a expressão na declaração da envolvente ONDE cláusula. Se a comparação dá um valor True, uma linha é adicionada à tabela de resultados.

Você pode garantir que uma subconsulta retornará um único valor, se você incluir uma função de agregação na mesma. As funções de agregação sempre retornam um único valor. Claro, esta maneira de retornar um único valor é útil apenas se você quer o resultado de uma função de agregação.

Suponha que você é um vendedor Zetec e você precisa ganhar uma comissão de seleção grande para pagar algumas contas inesperadas. Você decide se concentrar na venda do produto mais caro da Zetec. Você pode descobrir o que esse produto está com uma consulta aninhada:

Select Model, ProdName, ListPriceFROM PRODUCTWHERE ListPrice = (SELECT MAX (ListPrice) DE PRODUTO) -

Na consulta aninhada anterior, tanto a subconsulta ea declaração envolvente operar na mesma mesa. A subconsulta retorna um único valor: o preço máximo de lista na tabela de produtos. A consulta externa recupera todas as linhas da tabela de produtos que têm esse preço lista.

O próximo exemplo mostra uma subconsulta comparação que usa um operador de comparação diferente =:

Select Model, ProdName, ListPriceFROM PRODUCTWHERE ListPrice lt; (SELECT AVG (ListPrice) DE PRODUTO) -

A subconsulta retorna um único valor: o preço médio de lista na tabela de produtos. A consulta externa recupera todas as linhas da tabela de produtos que têm um preço de tabela mais baixo do que o preço médio de lista.

No padrão SQL original, uma comparação pode ter apenas uma subconsulta, e que tinha que ser no lado direito da comparação. SQL: 1999 permitiu um ou ambos os operandos da comparação ser subconsultas, e versões posteriores do SQL reter que a expansão da capacidade.

menu