Lección 13 - Consultas III (SQL SELECT FROM WHERE)

Curso SQL para principiantes


Ahora que usted ya conoce el producto cartesiano entre dos o más tablas, y conoce también como trabajar con consultas SQL de una sola tabla, en esta lección descubrirá que, a nivel lógico, hay muy poca diferencia entre las consultas de una sola tabla y las de dos o más tablas.
Una tabla está formada por un conjunto de registros con un cierto número de campos. Podemos afirmar también que el producto cartesiano entre dos tablas está formado por un conjunto de filas de datos con un cierto número de columnas. Si se abstraen estos dos conceptos, ¿no se está hablando de lo mismo?

Véase la tabla MUDAS:


La siguiente consulta SQL:

Código: Seleccionar todo
select *
  
from MUDAS
 where ID_CAMISA 
1


mostraría únicamente las mudas con la camisa de lino blanca, es decir, la camisa con identificador igual a 1, si no fuese porque la tabla MUDAS no existe en la BD. Lo que aparenta ser una tabla es en realidad el resultado de la siguiente consulta SQL:

Código: Seleccionar todo
select C.ID_CAMISA C.CAMISA C.PESO_GR as PESO_CAMISA 
       
P.ID_PANTALON P.PANTALON P.PESO_GR as PESO_PANTALON
  from CAMISAS C 
PANTALONES P


Por tanto diremos que:
Cuando se cruzan tablas en una consulta SQL, a efectos lógicos, el producto cartesiano de dichas tablas se puede considerar como una nueva tabla con tantos registros y campos como filas y columnas resuelva la operación, siendo válido sobre estos registros y campos todo lo expuesto en la primera parte del curso, donde se trabajó únicamente con una sola tabla.

La consulta SQL que devuelve las mudas de la camisa con identificador 1 quedaría de la siguiente manera:
Código: Seleccionar todo
select C.ID_CAMISA C.CAMISA C.PESO_GR as PESO_CAMISA 
       
P.ID_PANTALON P.PANTALON P.PESO_GR as PESO_PANTALON
  from CAMISAS C 
PANTALONES P
 where C
.ID_CAMISA 1



Versión simplificada:
Código: Seleccionar todo
select *
  
from CAMISAS PANTALONES 
 where ID_CAMISA 
1



Si usted tiene dificultades en el futuro para entender o construir consultas complejas, donde intervienen varias tablas y cláusulas, siempre puede considerar de forma lógica la consulta como una sola tabla. Quizás eso le ayude en su propósito.

* * *

Funciones de totalización
Con la anterior premisa es fácil intuir como se comportarán las funciones de totalización. Si antes recorrían la tabla realizando un cálculo determinado, ahora recorrerán el conjunto de filas resultantes de reunir varias tablas:

¿Cuantas mudas se pueden confeccionar con las camisas y pantalones?
Código: Seleccionar todo
select count(*) as COMBINACIONES
  from CAMISAS 
PANTALONES



Un recurso de la función COUNT es la de contar sobre un campo: los distintos valores que contiene, en lugar de contar todos los valores que contiene la columna. Por ejemplo:

Código: Seleccionar todo
select count(*) , count(CAMISA) , count(distinct CAMISA)
  
from CAMISAS PANTALONES



COUNT(*) cuenta filas resultantes, COUNT(camisa) cuenta los datos de la columna CAMISA que no son nulos, en este caso coincide con el número de filas resultantes; y COUNT(DISTINCT camisa) cuenta los distintos valores que presenta la columna CAMISA, como sólo hay tres camisas distintas, el resultado de esta totalización es tres.

* * *

Cláusula WHERE
En todos los filtros que se han establecido en las cláusulas WHERE de las consultas SQL en este curso, hasta ahora, siempre se han condicionado campos con constantes. La potencia del SQL va más allá, pudiendo si interesa comparar o condicionar campos de un mismo registro, o fila resultante de un producto cartesiano, entre sí. Siguiendo con el conjunto resultante de combinar las camisas con los pantalones, supongamos que interesa seleccionar aquellas mudas que el pantalón y la camisa son del mismo color. Al establecer esta condición se está reduciendo el numero de elementos resultantes, puesto que ahora de todas las mudas solo se seleccionarán aquellas que ambas prendas sean del mismo color. Esto se consigue con ayuda de la cláusula WHERE. Volviendo al símil del archivo, a nuestro ayudante le pediríamos para este propósito lo siguiente:

Selecciona todas las mudas confeccionables
del archivo PANTALONES y CAMISAS
donde el COLOR del PANTALON sea el mismo que el COLOR de la CAMISA

Como en las tablas no tenemos guardado el color, para ilustrar esto supongamos que las camisas tiene un orden o prioridad que viene dado por su identificador (1 , 2 , ...), para los pantalones consideramos lo mismo:

¿Que mudas o combinaciones son aquellas que la primera camisa se combina con el primer pantalón, la segunda camisa con el segundo pantalón, y así sucesivamente?

Para ello se tiene que dar que el identificador de la camisa sea el mismo que el del pantalón, por tanto:
Código: Seleccionar todo
select *
  
from CAMISAS CPANTALONES P
 where C
.ID_CAMISA P.ID_PANTALON



Esto puede ser visto como un filtro, puesto que de las seis filas resultantes de cruzar estas dos tablas, solo tomamos dos, las que cumplen la condición, y esto sería así si en realidad se tratara de una sola tabla, pero son dos tablas, por lo que más que un filtro, que lo es, se debe hablar de reunión. Con este tipo de condiciones se están reuniendo registros entre tablas relacionadas, o si usted quiere, entre ellas guardan una relación y de este modo obtenemos los registros relacionados. En este caso existe una relación de orden. Este no es un buen ejemplo de reunión entre dos tablas, pero como vamos a hablar largo y tendido de ello en las próximas lecciones, sirva el ejemplo de introducción.

Un ejemplo de filtro que no relaciona tablas pero sí compara campos entre sí de una misma tabla es el siguiente:

Código: Seleccionar todo
select *
  
from PERSONAS
 where RUBIA 
ALTA



La anterior consulta SQL devuelve los registros de la tabla PERSONAS que contienen el mismo valor en el campo RUBIA Y ALTA. En este caso concreto devuelve las personas que son altas y rubias, o bien, no son altas ni rubias. Por tanto en este, y sólo en este caso, equivale a la siguiente consulta:

Código: Seleccionar todo
select *
  
from PERSONAS
 where 
(RUBIA 'S' and ALTA 'S')
    or (
RUBIA 'N' and ALTA 'N')   



* * *

Uniones (UNION ALL)
Antes de entrar de lleno en la operación de reunión, vamos a presentar otro recurso muy potente del SQL. Se ha visto como al cruzar dos tablas, el SGBD reúne los registros mediante el producto cartesiano colocando los registros de la segunda tabla al lado de los registros de la primera tabla. Ahora vamos a ver el modo de colocar los registros de una tabla debajo los registros de otra, es decir, vamos a unir dos consultas. Para ello planteamos la siguiente pregunta:

¿Qué prendas contiene una maleta con todas las camisas y pantalones?

Con lo visto en este curso usted debería saber responder a esto, para ello necesita dos consultas, una para seleccionar todas las camisas, y otra para seleccionar todos los pantalones. Existe un modo de unir los resultados de dos o más consultas colocando entre ellas la palabra clave: UNION ALL.

Prendas de la maleta:
Código: Seleccionar todo
   select concat('Camisa de ',CAMISA) as PRENDA
     from CAMISAS
union all
   select concat
('Pantalón de ',PANTALON)
     
from PANTALONES



Obsérvese como para realizar la operación de unión, es necesario que ambas devuelvan el mismo número de columnas, de lo contrario la consulta SQL es en conjunto errónea y SGBD no sabrá resolverla.


Una variante de UNION ALL es indicar para este mismo propósito UNION a secas, esta opción eliminará del resultado filas duplicadas, es decir, si de entre las consultas implicadas existen filas repetidas, al realizar la unión solo se quedará con una.

* * *

Resumen
A efectos lógicos el producto cartesiano entre varias tablas se puede considerar como una nueva tabla siendo válido todo lo expuesto sobre consultas de una sola tabla, es decir, se considera que el motor SQL primero generará el producto cartesiano sobre las tablas de la cláusula FROM, para después ejecutar el resto de la consulta sobre este resultado.

En la clausula WHERE se pueden establecer condiciones comparando campos de un mismo registro entre si. Cuando los campos son de tablas distintas se estarán reuniendo registros entre ambas tablas bajo un concepto o propósito. El caso más amplio de relación es el producto cartesiano, donde se reunen todos con todos.

Mediante UNION ALL o bien UNION, es posible unir dos o más consultas SQL, el resultado es la unión de resultados, por lo que todas las consultas que intervienen en la unión deben devolver el mismo número de columnas.

Obsérvese que si tomamos la tabla CAMISAS y PANTALONES y realizamos la operación de reunión se obtiene la lista de todas las mudas confeccionables, mientras que si realizamos la operación de unión, se obtiene la lista de las prendas disponibles.

* * *

Ejercicio 1
Construya una consulta SQL que devuelva el peso medio de todas las mudas confeccionables entre camisas y pantalones. Modifique la consulta para obtener el mismo resultado entre camisas, pantalones y calzados.

Ejercicio 2
Construya una consulta SQL que devuelva el peso medio de todas las mudas confeccionables entre camisas y pantalones agrupado por camisa. Modifique la consulta de manera que devuelva el mismo resultado pero de los grupos que el peso medio es superior a 850 gramos.

Ejercicio 3
Construya una consulta SQL que devuelva las combinaciones de las camisas con los pantalones de manera que: la primera camisa se combine con todos los pantalones menos con el primero, la segunda camisa se combine con todos los pantalones menos con el segundo, y así sucesivamente.

Ejercicio 4
Construye una consulta que devuelva la lista de prendas de una maleta que contiene todos las camisas, pantalones y calzados.




    Lección 12 - El producto cartesiano (SQL FROM)
  • Lección 14 - Relaciones, claves primarias y foráneas

Creative Commons License Creative Commons License

Este curso está sujeto a la licencia Reconocimiento-NoComercial-SinObraDerivada 3.0 de Creative Commons. Usted puede copiarla, distribuirla y comunicarla públicamente siempre que especifique su autor y deletesql.com; no la utilice para fines comerciales; y no haga con ella obra derivada. Puede usted consultar la licencia completa aquí.




Volver a Curso SQL desde cero

¿Quién está conectado?

Usuarios navegando por este Foro: Adrian Lobo y 12 invitados