228 Shares 7075 views

SQL distinto: descripción, ejemplos, propiedades

A menudo, cuando se utiliza SQL para recuperar información de tablas, el usuario recibe datos redundantes, consistentes en filas duplicadas absolutamente idénticas. Para excluir esta situación, utilice el argumento distinto de SQL en la cláusula Select. En este artículo, consideraremos ejemplos del uso de este argumento, así como situaciones en las que es mejor abandonar el argumento.

Antes de comenzar a considerar ejemplos específicos, crearemos un par de tablas necesarias en la base de datos.

Preparación de las mesas

Imagínese que tenemos en la base de datos información almacenada sobre el fondo de pantalla, presentada en dos tablas. Esta es la tabla de Oboi con los campos id (identificador único), tipo (tipo de papel tapiz – papel, vinilo, etc.), color, estructura y precio. Y la tabla Ostatki (sobras) con los campos id_oboi (referencia al identificador único en la tabla Oboi) y cuenta (el número de rollos en el almacén).

Rellene las tablas con los datos. En la tabla con fondos de escritorio añadimos 9 entradas:

Oboi

Id

Tipo

Color

Estructura

Precio

1

Papel

Multicolor

Grabado en relieve

56,9

2

Papel de doble capa

Beige

Suave

114,8

3

Vinilo

Naranja

Grabado en relieve

504

4

Tejidos no tejidos

Beige

Grabado en relieve

1020,9

5

Papel de doble capa

Beige

Suave

150,6

Sexto

Papel

Multicolor

Suave

95,4

Vinilo

Marrón

Suave

372

Octavo

Tejidos no tejidos

Blanco

Grabado en relieve

980,1

Tejido

Rosa

Suave

1166,5

En la tabla con los restos hay también nueve registros:

Ostatki

Id_oboi

Contar

1

Octavo

2

12

3

24

4

5

16

Sexto

24

Octavo

32

11º

Empecemos por describir cómo utilizar distinct en SQL.

Lugar distinto en la cláusula Select

El argumento distinto debe colocarse inmediatamente después de la palabra clave Select en las consultas. Se aplica inmediatamente a todas las columnas especificadas en la cláusula Select, ya que excluirá filas absolutamente idénticas del resultado de la consulta. Por lo tanto, es suficiente especificar "select distinct" al escribir una consulta SQL. La única excepción es el uso de distintas dentro de las funciones agregadas, que serán consideradas un poco más tarde.

Debe recordarse que la mayoría de DBMS no reconoce su solicitud como esta:

SELECT Ostatki.Count distinto, distinto Oboi. *

De Oboi

INNER JOIN Ostatki ON Oboi.id = Ostatki.id_oboi

Aquí, el argumento se especifica varias veces o se especifica una vez, pero antes de la segunda, tercera u otra columna seleccionable. Recibirá un error con un enlace a la inexactitud en la sintaxis.

Uso de distintas consultas estándar

Es obvio que con la construcción adecuada de la estructura de las tablas y su relleno, dentro de la misma mesa se excluyen las situaciones cuando se encuentran cadenas absolutamente idénticas. Por lo tanto, la ejecución de la consulta "Select distinct *" con una selección de una tabla es prácticamente impracticable.

Imagine una situación en la que tenemos que averiguar qué tipo de papel tapiz que tenemos, sólo por conveniencia, ordenar por tipo:

SELECT Oboi.type

FROM Oboi ordenar por tipo

Y tenemos el resultado:

Tipo

Papel

Papel

Papel de doble capa

Papel de doble capa

Vinilo

Vinilo

Tejido

Tejidos no tejidos

Tejidos no tejidos

Como puede ver, hay filas duplicadas en la tabla. Si añadimos a la cláusula Select distinct:

SELECT distinto Oboi.type

FROM Oboi ordenar por tipo

Entonces obtenemos el resultado sin repetir:

Tipo

Papel

Papel de doble capa

Vinilo

Tejido

Tejidos no tejidos

Por lo tanto, si los datos se introdujeron correctamente en las tablas, inmediatamente después de la llamada o la solicitud de los compradores podremos responder que no hay fondos de pantalla líquidos, pavimento de vidrio y papel tapiz de acrílico en la tienda. Dado que el surtido en las tiendas por lo general no se limita a un centenar de fondos de escritorio, sería muy laborioso para mirar a través de la lista de tipos no únicos.

Usando distintas dentro de las funciones agregadas

SQL distinto se puede utilizar con cualquier función de agregado. Pero para Min y Max, su uso no tendrá ningún efecto, y al calcular la suma o el valor promedio, rara vez es posible imaginar una situación en la que no sería necesario tener en cuenta las repeticiones.

Digamos que queremos saber cuánto está lleno nuestro almacén, y para ello enviamos una solicitud que calcula el número total de rollos en el almacén:

SELECT suma (Ostatki.count)

De Ostatki

La consulta devolverá una respuesta 143. Si cambiamos a:

SELECT suma (distinta Ostatki.count)

De Ostatki

Entonces conseguimos solamente 119, porque el papel pintado bajo artículos 3 y 7 está en la acción en la misma cantidad. Sin embargo, es obvio que esta respuesta es incorrecta.

En la mayoría de los casos, SQL se utiliza con la función Count. Así que, sin dificultad, podemos averiguar cuántos tipos únicos de fondos de pantalla generalmente tenemos:

Recuento SELECT (distinto tipo Oboi)

De Oboi

Y obtener el resultado 5 – papel ordinario y de dos capas, vinilo, tela y no tejidos. Seguramente todo el mundo vio un anuncio como: "Sólo tenemos más de 20 tipos de fondos de pantalla diferentes!", Por lo que se entiende que en esta tienda no hay un par de docenas de rollos de todo, pero papel tapiz de los más diversos tipos modernos.

Curiosamente, en una sola petición, puede especificar varias funciones Count con o sin el atributo distinto. Es decir, esta es la única situación donde distintos en Select pueden estar presentes varias veces.

¿Cuándo debo rechazar el uso de un argumento

El uso del argumento distinto de SQL debe ser descartado de una de dos maneras:

  1. Usted selecciona de las tablas y está seguro de la unicidad de los valores en cada uno. En este caso, el uso del argumento es inexpediente, ya que se trata de una carga adicional en el servidor o cliente (dependiendo del tipo de DBMS).
  2. Tienes miedo de perder los datos necesarios. Vamos a explicar.

Supongamos que el jefe le pide que muestre una lista de fondos de escritorio que tiene, con sólo dos columnas – tipo y color. Por hábito, se especifica el argumento distinto:

SELECT distinto Oboi.type, Oboi.color

De Oboi

ORDER BY Oboi.type

Y – se pierden algunos datos:

Tipo

Color

Papel

Multicolor

Papel de doble capa

Beige

Vinilo

Marrón

Vinilo

Naranja

Tejido

Rosa

Tejidos no tejidos

Beige

Tejidos no tejidos

Blanco

Puede parecer que sólo tenemos un tipo de papel de papel (convencional y de dos capas), aunque de hecho incluso en nuestra pequeña mesa tienen dos artículos (el resultado no es distinto):

Tipo

Color

Papel

Multicolor

Papel

Multicolor

Papel de doble capa

Beige

Papel de doble capa

Beige

Vinilo

Marrón

Vinilo

Naranja

Tejido

Rosa

Tejidos no tejidos

Blanco

Tejidos no tejidos

Beige

Por lo tanto, como con cualquier consulta, con el argumento distinto uno debe ser cuidadoso y resolver correctamente el problema con su aplicación dependiendo de la tarea en la mano.

Distintivo alternativo

Lo contrario del argumento distinto es el argumento Todo. Cuando se utiliza, las líneas duplicadas se guardan. Pero como por defecto el DBMS piensa que es necesario imprimir todos los valores, el argumento Todos es más un especificador que un argumento funcional real. Esperamos que ahora entienda cuándo se utiliza distinto (SQL). La descripción le proporcionó información completa sobre la conveniencia de aplicar este argumento en la resolución de varios problemas. Después de todo, como resultó, incluso un argumento tan simple en su aplicación oculta una probabilidad muy palpable de perder algunos datos e inferir información exacta.