SQL distinta: descrição, exemplos, propriedades
Muitas vezes, ao usar o SQL para amostrageminformações das tabelas, o usuário recebe dados redundantes, consistindo na presença de linhas duplicadas absolutamente idênticas. Para excluir essa situação, use o argumento distinto de SQL na cláusula Select. Neste artigo, vamos considerar exemplos de uso deste argumento, bem como situações em que é melhor abandonar o argumento.
Antes de começarmos a considerar exemplos específicos, criaremos algumas tabelas necessárias no banco de dados.
Preparando Tabelas
Imagine que nós armazenamos em nosso banco de dadospapel de parede nas informações apresentadas nas duas tabelas. Este oboi mesa (papel de parede) com campos de ID (identificador único), do tipo (tipo de papel de parede -. Papel, vinil, etc.), cor (cor), um struct (estrutura) eo preço (preço). E mesa Ostatki (resíduos) com campos id_oboi (uma referência ao identificador único na tabela Oboi) e count (o número de rolos em estoque).
Preencha as tabelas com dados. Na tabela com papel de parede, adicione 9 entradas:
Oboi | ||||
id | digitar | cor | struct | preco |
1 | Paper | Multicolorido | Em relevo | 56,9 |
2 | Papel de dupla camada | Bege | Suave | 114,8 |
3 | Vinil | Orange | Em relevo | 504 |
4 | Luvas de lã não tecidas | Bege | Em relevo | 1020,9 |
5 | Papel de dupla camada | Bege | Suave | 150,6 |
6 | Paper | Multicolorido | Suave | 95,4 |
7 | Vinil | Castanho | Suave | 372 |
8 | Luvas de lã não tecidas | Branco | Em relevo | 980,1 |
9 | Tecido | Pink | Suave | 1166,5 |
Na tabela com os restos também há nove registros:
Ostatki | |
id_oboi | contar |
1 | 8 |
2 | 12 |
3 | 24 |
4 | 9 |
5 | 16 |
6 | 7 |
7 | 24 |
8 | 32 |
9 | 11 |
Vamos começar descrevendo como usar o distinto no SQL.
Coloque distinto na cláusula Select
O argumento distinto deve ser colocado imediatamente apósa palavra-chave Selecionar nas consultas. Ele é aplicado imediatamente a todas as colunas especificadas na cláusula Select porque excluirá linhas absolutamente idênticas do resultado da consulta. Portanto, é suficiente especificar "select distinct" ao escrever a consulta SQL. A única exceção é o uso de funções distintas dentro das funções agregadas, as quais consideraremos um pouco mais tarde.
Deve ser lembrado que a maioria dos DBMS não reconhece seu pedido desta forma:
SELECT Ostatki.Count distinto, Oboi distinto. * DE Oboi INNER JOIN Ostatki ON Oboi.id = Ostatki.id_oboi |
Aqui, o argumento é especificado várias vezes ou especificado uma vez, mas antes da segunda, terceira ou outra coluna selecionável. Você receberá um erro com uma referência a imprecisões na sintaxe.
Usando distintas em consultas padrão
Obviamente, com uma estrutura bem estruturadatabelas e seu preenchimento, dentro de uma única tabela, as situações são excluídas quando strings absolutamente idênticas são encontradas. Portanto, a execução da consulta "Select distinct *" com uma seleção de uma tabela é praticamente impraticável.
Imagine uma situação em que precisamos descobrir que tipo de papel de parede temos, apenas por conveniência, classificar por tipo:
SELECT Oboi.type FROM Oboi order por tipo |
E nós temos o resultado:
digitar |
Paper |
Paper |
Papel de dupla camada |
Papel de dupla camada |
Vinil |
Vinil |
Tecido |
Luvas de lã não tecidas |
Luvas de lã não tecidas |
Como você pode ver, existem linhas duplicadas na tabela. Se adicionarmos à cláusula Select distinct:
SELECT Oboi.type distinto FROM Oboi order por tipo |
então nós obtemos o resultado sem repetir:
digitar |
Paper |
Papel de dupla camada |
Vinil |
Tecido |
Luvas de lã não tecidas |
Assim, se os dados foram corretamente inseridosmesa, em seguida, imediatamente após a chamada ou o pedido dos compradores, seremos capazes de responder que o papel de parede líquido, papel de parede e papel de parede acrílico não está disponível na loja. Dado que o sortimento em lojas geralmente não é limitado a cem papel de parede, seria bastante trabalhoso examinar a lista de tipos não exclusivos.
Usando distintas dentro de funções agregadas
O argumento distinto de SQL pode ser usado com qualquerfunção agregada. Mas para Min e Max, seu uso não terá nenhum efeito, e ao calcular a soma ou valor médio, raramente é possível imaginar uma situação onde não seria necessário levar em conta as repetições.
Digamos que queremos saber quanto nosso depósito está cheio e, para isso, enviamos uma solicitação que calcula o número total de rolos no depósito:
Soma SELECT (Ostatki.count) DE Ostatki |
A consulta retornará uma resposta 143. Se mudarmos para:
Soma SELECT (Ostatki.count distinto) DE Ostatki |
então temos apenas 119, porque o papel de parede nos artigos 3 e 7 está em estoque na mesma quantidade. No entanto, é óbvio que esta resposta está incorreta.
Na maioria das vezes, o SQL é usado com a função Count. Assim, sem dificuldade, podemos descobrir quantos tipos exclusivos de papel de parede geralmente temos:
Contagem SELECT (Oboi.type distinto) DE Oboi |
E obter o resultado 5 - papel comum eduas camadas, vinil, tecido e não-tecido. Certamente todo mundo viu um anúncio como: "Só temos mais de 20 tipos de papéis de parede diferentes!", O que significa que nesta loja não há um par de dezenas de rolos de tudo, mas papel de parede dos mais diversos tipos modernos.
Curiosamente, em uma consulta, você pode especificarvárias funções de contagem com ou sem o atributo distinto. Ou seja, essa é a única situação em que a distinção em Selecionar não pode estar presente mais de uma vez.
Quando devo rejeitar o uso de um argumento
O uso do argumento distinto de SQL deve ser descartado de duas maneiras:
- Você seleciona de tabelas e tem certezaa singularidade dos valores em cada um. Nesse caso, o uso do argumento é inconveniente, porque essa é uma carga adicional no servidor ou no cliente (dependendo do tipo de DBMS).
- Você tem medo de perder os dados necessários. Nós vamos explicar.
Suponha que o chefe peça para você exibir uma lista de papéis de parede que você possui, indicando apenas duas colunas - tipo e cor. Por hábito, você especifica o argumento distinto:
SELECT Oboi.type distinto, Oboi.color DE Oboi ORDER BY Oboi.type |
E - perder alguns dos dados:
digitar | cor |
Paper | Multicolorido |
Papel de dupla camada | Bege |
Vinil | Castanho |
Vinil | Orange |
Tecido | Pink |
Luvas de lã não tecidas | Bege |
Luvas de lã não tecidas | Branco |
Pode parecer que temos apenas um tipo de papel de parede (convencional e de duas camadas), embora, de fato, mesmo em nossa pequena mesa, eles tenham dois artigos (o resultado é sem distinção):
digitar | cor |
Paper | Multicolorido |
Paper | Multicolorido |
Papel de dupla camada | Bege |
Papel de dupla camada | Bege |
Vinil | Castanho |
Vinil | Orange |
Tecido | Pink |
Luvas de lã não tecidas | Branco |
Luvas de lã não tecidas | Bege |
Portanto, como em escrever qualquer consulta, com o argumento distinto deve-se ter cuidado e resolver corretamente o problema com sua aplicação, dependendo da tarefa em mãos.
Alternativa distinta
O oposto do argumento distinto é o argumentoTudo. Quando você usa, linhas duplicadas são salvas. Mas como, por padrão, o DBMS acha que é necessário imprimir todos os valores, o argumento All é mais um especificador do que um argumento funcional real.