SQL distinct: descripción, ejemplos, propiedades
A menudo cuando se usa SQL para muestreoinformación de las tablas, el usuario recibe datos redundantes, que consisten en la presencia de líneas duplicadas absolutamente idénticas. Para excluir esta situación, use el argumento distinto de SQL en la cláusula Select. En este artículo, consideraremos ejemplos de 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 tablas
Imagina que hemos almacenado en nuestra base de datosinformación sobre el fondo de pantalla, presentado en dos tablas. Esta es la tabla Oboi (fondo de pantalla) con los campos id (identificador único), tipo (tipo de fondo de pantalla - papel, vinilo, etc.), color, estructura y precio. Y la tabla Ostatki (restos) con los campos id_oboi (referencia al identificador único en la tabla Oboi) y el recuento (el número de rollos en el almacén).
Completa las tablas con datos. En la tabla con fondo de pantalla, agrega 9 entradas:
Oboi | ||||
identificación | tipo | color | estructura | precio |
1 | Papel | Multicolor | En relieve | 56,9 |
2 | Papel de doble capa | Beige | Suave | 114,8 |
3 | Vinilo | Naranja | En relieve | 504 |
4 | Guantes de lana no tejida | Beige | En relieve | 1020,9 |
5 | Papel de doble capa | Beige | Suave | 150,6 |
6 | Papel | Multicolor | Suave | 95,4 |
7 | Vinilo | Marrón | Suave | 372 |
8 | Guantes de lana no tejida | Blanco | En relieve | 980,1 |
9 | Tela | Rosa | Suave | 1166,5 |
En la tabla con los restos también hay nueve registros:
Ostatki | |
id_oboi | contar |
1 | 8 |
2 | 12 |
3 | 24 |
4 | 9 |
5 | 16 |
6 | 7 |
7 | 24 |
8 | 32 |
9 | 11 |
Comencemos describiendo cómo usar distinct en SQL.
Lugar distinto en la cláusula Select
El argumento distinto debe colocarse inmediatamente despuésla palabra clave Select en las consultas. Se aplica inmediatamente a todas las columnas especificadas en la cláusula Select porque excluirá filas absolutamente idénticas del resultado de la consulta. Por lo tanto, es suficiente especificar "seleccionar distinto" al escribir la consulta SQL. La única excepción es el uso de distintas dentro de las funciones agregadas, que consideraremos un poco más adelante.
Se debe recordar que la mayoría de DBMS no reconoce su solicitud de esta manera:
SELECCIONE distinto Ostatki.Count, distinct Oboi. * DESDE 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. Obtendrá un error con una referencia a inexactitudes en la sintaxis.
Uso distinto en consultas estándar
Obviamente, con una estructura bien estructuradatablas y su relleno, dentro de una sola tabla, las situaciones se excluyen cuando se encuentran cadenas absolutamente idénticas. Por lo tanto, la ejecución de la consulta "Seleccionar distinto *" con una selección de una tabla es prácticamente impracticable.
Imagine una situación en la que necesitemos descubrir qué tipo de papel tapiz tenemos, solo por comodidad, ordenar por tipo:
SELECCIONE Oboi.type DESDE Oboi ordena por tipo |
Y obtenemos el resultado:
tipo |
Papel |
Papel |
Papel de doble capa |
Papel de doble capa |
Vinilo |
Vinilo |
Tela |
Guantes de lana no tejida |
Guantes de lana no tejida |
Como puede ver, hay filas duplicadas en la tabla. Si agregamos a la cláusula Select distinct:
SELECCIONAR distinto Oboi.type DESDE Oboi ordena por tipo |
entonces obtenemos el resultado sin repetir:
tipo |
Papel |
Papel de doble capa |
Vinilo |
Tela |
Guantes de lana no tejida |
Por lo tanto, si los datos se ingresaron correctamente entabla, luego inmediatamente después de la llamada o la solicitud de los compradores, podremos responder que el papel tapiz líquido, papel tapiz y papel tapiz acrílico no está disponible en la tienda. Dado que el surtido en las tiendas generalmente no se limita a cien fondos de pantalla, sería bastante laborioso escanear la lista de tipos no únicos.
Usar distintas funciones dentro de agregado
El argumento distinto de SQL se puede usar con cualquierfunción agregada 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 esto 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 obtenemos solo 119, porque el fondo de pantalla de los artículos 3 y 7 está en stock en la misma cantidad. Sin embargo, es obvio que esta respuesta es incorrecta.
La mayoría de las veces, SQL se usa con la función Cuenta. Entonces, sin dificultad, podemos descubrir cuántos tipos únicos de papel tapiz tenemos en general:
SELECT count (distinto Oboi.type) DESDE Oboi |
Y obtenga el resultado 5 - papel ordinario ydos capas, vinilo, tela y no tejido. Seguramente todos vieron un anuncio como: "¡Solo tenemos más de 20 tipos de fondos de pantalla diferentes!", Lo que significa que en esta tienda no hay un par de docenas de rollos de todo, sino un fondo de pantalla de los tipos modernos más diversos.
Curiosamente, en una consulta, puede especificarmúltiples funciones de conteo con o sin el atributo distinto. Es decir, esta es la única situación en la que distinct en Select no puede estar presente más de una vez.
¿Cuándo debería rechazar el uso de un argumento?
El uso del argumento distinto de SQL se debe descartar de una de estas dos formas:
- Usted selecciona de tablas y está segurola singularidad de los valores en cada uno. En este caso, el uso del argumento es inoportuno, porque esta es una carga adicional en el servidor o cliente (dependiendo del tipo de DBMS).
- Tienes miedo de perder los datos necesarios. Nosotros lo explicaremos
Supongamos que el jefe le pide que muestre una lista de fondo de pantalla que tiene, indicando solo dos columnas: tipo y color. Por costumbre, especifique el argumento distinct:
SELECCIONAR distinto Oboi.type, Oboi.color DESDE Oboi ORDER BY Oboi.type |
Y - perder algunos de los datos:
tipo | color |
Papel | Multicolor |
Papel de doble capa | Beige |
Vinilo | Marrón |
Vinilo | Naranja |
Tela | Rosa |
Guantes de lana no tejida | Beige |
Guantes de lana no tejida | Blanco |
Puede parecer que tenemos solo un tipo de papel tapiz de papel (convencional y de dos capas), aunque de hecho, incluso en nuestra pequeña mesa tienen dos artículos (el resultado es distinto):
tipo | color |
Papel | Multicolor |
Papel | Multicolor |
Papel de doble capa | Beige |
Papel de doble capa | Beige |
Vinilo | Marrón |
Vinilo | Naranja |
Tela | Rosa |
Guantes de lana no tejida | Blanco |
Guantes de lana no tejida | Beige |
Por lo tanto, al escribir cualquier consulta, con un argumento distinto, uno debe ser cuidadoso y resolver correctamente el problema con su aplicación, dependiendo de la tarea en cuestión.
Alternativa distinta
Lo opuesto al argumento distinto es el argumentoTodo. Cuando lo usa, las líneas duplicadas se guardan. Pero dado que por defecto el DBMS cree que es necesario imprimir todos los valores, el argumento Todo es más un especificador que un argumento funcional real.