A menudo cuando se utiliza SQL para recuperarinformación de las tablas, el usuario recibe datos redundantes, que consisten en la presencia de filas duplicadas absolutamente idénticas. Para eliminar esta situación, use el argumento SQL distinto en la cláusula Select. Este artículo discutirá ejemplos del uso de este argumento, así como las situaciones en las que se debe abandonar el uso del argumento.
Antes de comenzar a considerar ejemplos concretos, crearemos un par de tablas necesarias en la base de datos.
Imagina lo que está almacenado en nuestra base de datos.Información de fondo de pantalla presentada en dos tablas. Estos son la tabla Oboi (fondo de pantalla) con los campos id (identificador único), tipo (tipo de fondo de pantalla - papel, vinilo, etc.), color (color), estructura (estructura) y precio (precio). Y la tabla Ostatki (remanentes) con los campos id_oboi (enlace a un identificador único en la tabla Oboi) y cuenta (el número de rollos en stock).
Rellena la tabla con datos. Agrega 9 entradas a la tabla con fondo de pantalla:
Fondos de pantalla | ||||
iba | tipo | colorear | estructura | precio |
1 | Papel | Multicolor | En relieve | 56,9 |
2 | Doble capa de papel | Beige | Liso | 114,8 |
3 | Vinilo | Naranja | En relieve | 504 |
4 | Flizelinovye | Beige | En relieve | 1020,9 |
5 | Doble capa de papel | Beige | Liso | 150,6 |
6 | Papel | Multicolor | Liso | 95,4 |
7 | Vinilo | Marrón | Liso | 372 |
8 | Flizelinovye | Los blancos | En relieve | 980,1 |
9 | Tela | Rosa | Liso | 1166,5 |
También hay nueve entradas en la tabla con saldos:
Las sobras | |
id_oboi | contar |
1 | 8 |
2 | 12 |
3 | 24 |
4 | 9 |
5 | 16 |
6 | 7 |
7 | 24 |
8 | 32 |
9 | 11 |
Procedemos a la descripción de cómo utilizar distintas en SQL.
El argumento distinto debe ser colocado inmediatamente despuésSeleccionar palabra clave en las consultas. Se aplica inmediatamente a todas las columnas especificadas en la cláusula Select, porque excluirá filas absolutamente idénticas del resultado final de la consulta. Por lo tanto, es suficiente especificar el "seleccionar distinto" una vez al escribir la consulta SQL. La excepción es el uso de distintas funciones agregadas internas, que se considerarán un poco más adelante.
Debe recordarse que la mayoría de los DBMS no reconocen su consulta del formulario:
SELECCIONE la distinción restante. Cuenta, fondo de pantalla distintivo. * DE Oboi INNER EIN Remnants ON Wallpaper.id = Remnants.id_oboi |
Aquí, el argumento se especifica varias veces, o se especifica solo una vez, pero antes de la segunda, tercera u otra columna seleccionable. Recibirá un error con referencia a inexactitudes en la sintaxis.
Obviamente, con estructura propia.las tablas y su relleno, dentro de una tabla, se excluyen las situaciones cuando se encuentran líneas absolutamente idénticas. Por lo tanto, la ejecución de la consulta "Seleccionar distinto *" con una selección de una tabla es prácticamente poco práctica.
Imagine una situación en la que necesitamos averiguar qué tipo de fondo de pantalla tenemos, inmediatamente por comodidad, ordenamos por tipo
SELECCIONAR Oboi.type DESDE Oboi orden por tipo |
Y obtenemos el resultado:
tipo |
Papel |
Papel |
Doble capa de papel |
Doble capa de papel |
Vinilo |
Vinilo |
Tela |
Flizelinovye |
Flizelinovye |
Como puede ver, la tabla contiene filas duplicadas. Si agregamos a la cláusula de selección distinta:
SELECCIONAR Oboi.type distinto DESDE Oboi orden por tipo |
Entonces obtenemos el resultado sin repeticiones:
tipo |
Papel |
Doble capa de papel |
Vinilo |
Tela |
Flizelinovye |
Por lo tanto, si los datos fueron ingresados correctamente enLa mesa, inmediatamente después de una llamada o solicitud del cliente, podremos responder que no hay papel tapiz líquido, paredes de vidrio y papel acrílico en la tienda. Teniendo en cuenta que el surtido en las tiendas generalmente no se limita a cien fondos de pantalla, sería bastante laborioso revisar la lista de tipos no únicos.
El argumento distinto de SQL se puede utilizar 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, es raro imaginar una situación en la que no sería necesario tener en cuenta las repeticiones.
Supongamos que queremos saber cuán lleno está nuestro almacén, y para ello enviamos una solicitud que calcula el número total de rollos en el almacén:
SELECCIONE suma (Ostatki.count) De permanece |
La solicitud responderá 143. Si cambiamos a:
SELECCIONAR suma (distinto Ostatki.count) De permanece |
luego obtenemos solo 119, porque el papel tapiz 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 en SQL, distintas se utiliza con la función Count. Entonces, sin dificultad, podemos descubrir cuántos tipos de fondos de pantalla únicos tenemos todos:
Cuenta SELECT (tipo Oboi distinto) DE Oboi |
И получить результат 5 – бумажные обычные и dos 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 fondos de pantalla de los tipos modernos más diversos.
Интересно, что в одном запросе можно указывать varias funciones de Count con y sin atributo distinto. Es decir, esta es la única situación en la que distintos en Select "e pueden estar presentes varias veces.
El uso del argumento distinto de SQL debe descartarse en uno de dos casos:
Supongamos que un jefe le pide que enumere los fondos de pantalla que tiene, con solo dos columnas: tipo y color. Por costumbre, especifica el argumento distinto:
SELECCIONE distintos Oboi.type, Oboi.color DE Oboi ORDEN SERÍA. |
Y - pierda algunos de los datos:
tipo | colorear |
Papel | Multicolor |
Doble capa de papel | Beige |
Vinilo | Marrón |
Vinilo | Naranja |
Tela | Rosa |
Flizelinovye | Beige |
Flizelinovye | Los blancos |
Puede parecer que solo tenemos un tipo de papel tapiz de papel (ordinario y de dos capas), aunque, de hecho, incluso en nuestra pequeña mesa hay dos números de artículo (el resultado no es distinto):
tipo | colorear |
Papel | Multicolor |
Papel | Multicolor |
Doble capa de papel | Beige |
Doble capa de papel | Beige |
Vinilo | Marrón |
Vinilo | Naranja |
Tela | Rosa |
Flizelinovye | Los blancos |
Flizelinovye | Beige |
Por lo tanto, como al escribir cualquier solicitud, con el argumento distinto, debe tener cuidado y resolver correctamente el problema con su aplicación, dependiendo de la tarea.
Lo contrario de distinto es el argumentoTodos. Cuando se aplica, se guardan las líneas duplicadas. Pero dado que, de manera predeterminada, el DBMS cree que todos los valores deberían mostrarse, entonces el argumento All es más un calificador que un argumento funcional real.