/ / SQL distinto: descrição, exemplos, propriedades

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.

sql distinta

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.

sql select distinta

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.

distinto em sql

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:

  1. 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).
  2. 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.

descrição de sql distinta
Esperamos que você agora entenda quandodistinto (SQL) é usado. A descrição forneceu informações completas sobre a conveniência de aplicar esse argumento ao resolver vários problemas. Afinal, como se viu, mesmo um argumento tão simples em sua aplicação esconde uma probabilidade muito palpável de perder alguns dados e inferir as informações imprecisas.

Leia mais: