Realizacion de Consultas

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 18

IES Suárez de Figueroa- @vanza

Administración de sistemas informáticos en red


Gestión de bases de datos Unidad didáctica 4. Realización de consultas

Unidad 4. Realización de consultas

Índice
1. Introducción 2
2. Elementos componentes de una sentencia SQL 2
3. Valores nulos 3
4. Operaciones de comparación 3
5. La sentencia SELECT 2
6. Expresiones 7
7. Operadores 8
8. Funciones 9
9. Consultas con varias tablas 13
10. Consultas de unión 15
11. Combinaciones internas y externas 15
12. Subconsultas 17
13. Consultas correlacionadas 18

1
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad didáctica 4. Realización de consultas

1. Introducción

Una vez creada la base de datos está lista para su explotación. En esta unidad
didáctica se estudia cómo acceder a la información almacenada en una base de datos:
obtener un listado de proveedores, clientes con facturas pendientes, teléfono de un
proveedor, correo electrónico de otro, productos bajo mínimos, importe de una
factura…

Para realizar estas tareas de consulta de datos seguiremos utilizando el lenguaje


SQL.

Cabe recordar que el lenguaje SQL está dividido en tres grupos de sentencias:

- DDL, para la creación, eliminación, modificación de bases de datos, tablas,


vistas, índices…
- DML, para la consulta, inserción, eliminación y actualización de datos.
- DCL, para el control de acceso.

En esta unidad se estudia una parte del DML o “Lenguaje de manipulación de


datos”, en concreto, se estudia el apartado correspondiente a las consultas.

Cabe mencionar que estas consultas pueden diseñarse también mediante


asistentes gráficos que incorporan los clientes SQL, pero el objetivo de este curso es
estudiar el lenguaje SQL y en esta unidad estamos ante una de las partes más
importantes de este lenguaje.

2. Elementos componentes de una sentencia SQL

Recordando un poco lo visto en la unidad anterior y añadiendo conceptos nuevos,


una sentencia SQL está formada por:

- Palabras predefinidas. Palabras con significado propio dentro del lenguaje,


como CREATE, SELECT, WHERE, etc.
- Nombres de objetos. Son las tablas y columnas a las que accedemos.
- Constantes o literales. Ejemplos: 14, 2.4, ‘Pérez’, ‘2001-11-12’.
o Los literales numéricos se escriben tal cual.
o Las cadenas y fechas se encierran entre comillas simples o dobles.
- Delimitadores. Sirven para separar o delimitar el conjunto de elementos que
forman la sentencia: punto, paréntesis, coma, espacio en blanco…
- Operadores. Utilizados para comparar valores, realizar operaciones
aritméticas, etc.
o Relacionales: =, <, >, >=, <=, <> (distinto).
o Lógicos: AND, OR, NOT
o Aritméticos: +, -, /, *, % (resto de la división entera)

Si en una expresión aparecen varios operadores:


- se evalúan en un orden determinado que viene marcado por la
prevalencia de los mismos.
- cuando dos o más operadores tienen igual prevalencia, se evalúan de
izquierda a derecha.
- en una expresión en la que se utilicen paréntesis para agrupar parte de
los elementos de la misma, se evalúan de dentro hacia fuera.
- Los paréntesis tienen mayor prevalencia que cualquier operador.

2
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad didáctica 4. Realización de consultas

Puedes consultar en este enlace la prioridad de ejecución de los operadores:


https://mariadb.com/kb/en/mariadb/operator-precedence/​.

3. Valores nulos (Null).

Sea cual sea el tipo de dato asignado a un campo, éste puede o no permitir valores
nulos. Entendemos por nulo la ausencia de valor o bien el valor ”desconocido”. En un
campo de tipo numérico, no es lo mismo 0 que valor nulo, y en un campo de tipo
cadena o texto tampoco es lo mismo nulo que cadena vacía “”.

Como regla general, una operación con un valor nulo produce un resultado nulo.
Así, por ejemplo, si sumamos 200 a un valor nulo (desconocido) obtendremos nulo.

4. Operaciones de comparación

Reglas a tener en cuenta al comparar dos valores.

- Sólo se comparan valores cuando son del mismo tipo (o bien cuando el
sistema es capaz de convertir de un tipo a otro de forma implícita).
- Todos los datos de tipo numérico se pueden comparar unos con otros. Lo
mismo sucede con las cadenas. Además, no es necesario que tengan la
misma longitud.
- Al comparar cadenas, el sistema va comparando carácter a carácter de
izquierda a derecha. En realidad se compara el valor ASCII de cada uno de los
caracteres que la forman. Se considera menor la cadena (carácter) que
aparezca antes por orden alfabético.
- Si las dos cadenas son vacías se consideran iguales.

5. La sentencia SELECT

La sentencia SELECT es la más potente y compleja que estudiaremos. Tiene gran


cantidad de variantes y opciones, que pueden diferir de un SGBD a otro.

Se utiliza para consultar datos de una base de datos. En esta sentencia se indican
de qué tablas extraer los datos, como filtrarlos, ordenarlos, agruparlos y que cálculos
realizar con ellos.

Para probar los ejemplos utilizaremos los clientes modo texto y web
(phpMyAdmin).

Además, utilizaremos la base de datos “Oposiciones” cuyo script está disponible


en Recursos con el título “Recurso 1. Scripts de bases de datos”.

Ya hemos estudiado en unidades anteriores cómo incorporar una base de datos a


un servidor MariaDB/MySQL a partir de un script, de todas formas los pasos son los
siguientes:

3
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad didáctica 4. Realización de consultas

- Descargar el archivo comprimido.


- Descomprimirlo y obtener el script con todos las sentencias SQL que permiten
crear la base de datos, crear tablas/relaciones e insertar datos.
- Desde phpMyAdmin ejecutar el script. Clic en “Importar” y pulsar sobre
“Seleccionar archivo”, elegir el archivo descomprimido y “Aceptar”. El proceso
puede tardar varios minutos en ejecutarse, dependiendo del tamaño de la base
de datos.
- Una vez finalizado el proceso, la base de datos debe aparecer en el panel de
la izquierda. Si no aparece debemos refrescar el panel o la página.

5.1. Sintaxis básica

La sintaxis básica de la sentencia SELECT es la que se muestra a continuación:

SELECT [ALL | DISTINCT | DISTINCTROW ] {Expresión | Columna1, ... | * }

FROM TablasReferenciadas [WHERE Condiciones]

[GROUP BY {NombreColumna | Expresión | Posición} [ASC | DESC], …]

[HAVING Condiciones]

[ORDER BY { NombreColumna | Expresión | Posición } [ASC | DESC] , ...]

[LIMIT { [desplazamiento,] contador | contador OFFSET desplazamiento} ]

Como puede observarse, sólo son obligatorias las cláusulas SELECT y FROM.

Tras SELECT debemos elegir entre asterisco, que hace referencia a todas las
columnas y lista de columnas/expresiones a mostrar, separadas por comas. Más tarde
aparece FROM con los nombres de las tablas de las que obtener los datos.

El ejemplo ​SELECT * FROM OPOSITORES​, muestra los datos de todas las


columnas de la tabla Opositores.

El resultado que genera se observa en la imagen adjunta. Se muestran todas las


filas de la tabla, aunque la imagen solo refleja las 4 primeras por motivos de espacio.

Otro ejemplo: SELECT DNI, NOMBRE FROM OPOSITORES. En este caso


sólo se muestran las columnas DNI y Nombre. También se visualizarían todas
las filas de la tabla.

4
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad didáctica 4. Realización de consultas

Si observamos el resultado de la consulta, cada columna mostrada lleva un


encabezado que coincide con el nombre de la propia columna. Esto podemos
cambiarlo con un ​alias de columna como se observa en el ejemplo. Para utilizar un
alias de columna se utiliza AS seguido del nombre que queremos dar a esa columna.

SELECT DNI, NOMBRE AS NOMBRE_OPOSITOR FROM OPOSITORES

Igual que se utilizan alias para columnas, existen ​alias para tablas. Generalmente
el alias de una tabla es un nombre más corto que se utiliza para agilizar la escritura o
bien, para indicar de qué tabla obtener un campo, cuando este campo repite nombre
en varias tablas.

En el ejemplo siguiente, a la tabla Opositores se le asigna el alias O. Sus campos


pueden referenciarse con el prefijo O ó sin él. Esto es útil, como se comentó antes,
para el caso de que en dos tablas exista un campo con el mismo nombre. Para saber
si nos referimos a una u otra tabla, el campo lleva delante el alias correspondiente.

SELECT O.DNI, NOMBRE FROM OPOSITORES O

Siguiendo con las columnas, comentaremos el concepto de ​columna calculada​,


que como su nombre indica es aquella cuyos valores se obtienen a partir de cálculos
sobre los datos de otras columnas.

En el ejemplo se muestran la columna llamada 50%_NOTA que se obtiene


dividiendo la nota entre 2 (NOTA/2). El alias va entre comillas ya que comienza por un
dígito.

SELECT DNIOPOSITOR, NOTA/2 AS '50%_NOTA' FROM NOTAS

Clausula WHERE​. Los ejemplos vistos hasta ahora muestran todas las filas de la
tabla utilizada en FROM. Si es necesario mostrar las filas que cumplen una
determinada condición o condiciones se debe utilizar la cláusula WHERE.

El ejemplo siguiente mostrará todas las columnas de Opositores, pero sólo las filas
en las que la ciudad sea Zafra.

5
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad didáctica 4. Realización de consultas

SELECT * FROM OPOSITORES WHERE CIUDAD='ZAFRA'

Pueden construirse condiciones múltiples utilizando los operadores lógicos AND,


OR o NOT. Si la cláusula lleva dos condiciones unidas con AND deben cumplirse
ambas para mostrar la fila. Si van unidas con OR es suficiente con que se cumpla una
de ellas. El NOT se utiliza para negar una condición.

Ejemplos:

- Muestra los opositores que sean de Zafra o Badajoz.

SELECT * FROM OPOSITORES WHERE


CIUDAD='ZAFRA' OR CIUDAD='BADAJOZ'

- Muestra las notas del opositor con DNI 1173391 siempre que sean mayores
que 5.

SELECT * FROM NOTAS WHERE NOTA>5 AND DNIOPOSITOR


='1173391'

- Muestra las filas de la tabla en las que la ciudad no sea Zafra.

SELECT * FROM OPOSITORES WHERE NOT CIUDAD='ZAFRA'

Cláusula ORDER BY​. Permite mostrar los datos ordenados ascendente o


descendentemente por las columnas indicadas. Puede especificarse el nombre de la
columna, su alias o el número de orden que ocupa la columna en la SELECT, siendo
la número 1 la columna situada más a la izquierda. Se utilizan las palabras reservadas
ASC/DESC para indicar el orden, ascendente o descendente respectivamente. Por
defecto el orden es ascendente.

Ejemplos:

- Mostrar los datos de los opositores ordenados por nombre.

SELECT * FROM OPOSITORES ORDER BY NOMBRE;

SELECT * FROM OPOSITORES ORDER BY 2;

- Mostrar los datos de notas ordenados por código de examen y nota.

SELECT * FROM NOTAS ORDER BY 2 ASC,3 DESC.

6
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad didáctica 4. Realización de consultas

Cláusula LIMIT​. Sin usar LIMIT se muestran todas las filas de la tabla que
cumplen la condición o condiciones. Con LIMIT podemos limitar el número de filas
mostradas en la consulta. Existen dos posibilidades:

- LIMIT número. Donde número indica la cantidad de filas a devolver.


- LIMIT número1, número2. Numero1 indica la primera fila a devolver y
número2 las filas que se devolverán.

Ejemplos:

- Mostrar sólo los 3 primeros opositores por orden alfabético de su


nombre.

SELECT * FROM OPOSITORES ORDER BY NOMBRE LIMIT 3

- Mostrar los datos de los 20 opositores a partir del 50, ordenando por
nombre.

SELECT * FROM OPOSITORES ORDER BY NOMBRE LIMIT 50, 20

Cláusula DISTINCT​. La cláusula DISTINCT se utiliza para eliminar filas repetidas.


Si la SELECT muestra filas idénticas, la cláusula DISTINCT hará que sólo se muestra
una.

- Mostrar las ciudades existentes en la tabla Opositores. Sólo una vez


cada ciudad.

SELECT DISTINCT CIUDAD FROM OPOSITORES

6. Expresiones.

Una expresión es una combinación de operadores, operandos y paréntesis.


Cuando el SGBD la ejecuta devuelve un único valor.

En el apartado anterior se han utilizado expresiones en las columnas calculadas,


pero también pueden ser utilizadas en las cláusulas WHERE y HAVING que se
estudiarán más adelante.

Los operandos pueden ser nombres de campos, literales y otras expresiones.

Para los ejemplos con expresiones utilizaremos una nueva base de datos,
Departamentos. Puedes descargar el script desde el “Recurso 1. Scripts de bases de
datos”.

7
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad didáctica 4. Realización de consultas

Ejemplos que utilizan expresiones:

- Mostrar los datos de los trabajadores cuyo salario es mayor que el doble de su
comisión.

SELECT * FROM EMPLEADOS WHERE SALARIO > COMISION * 2

- Mostrar número, nombre y el salario anual de cada empleado. Este se obtiene


multiplicando el salario mensual por 12.

SELECT NUMEROEMPLEADO, NOMBRE, SALARIO*12 AS


SALARIO_ANUAL FROM EMPLEADOS

7. Operadores.

Como se ha comentado anteriormente pueden ser aritméticos, lógicos y


relacionales.

Los ​aritméticos se utilizan para realizar operaciones con valores numéricos:


sumas, restas, divisiones,… Estas operaciones devuelven por tanto un valor numérico.

Entre ellos tenemos: +, -, * (producto), / (división) , \ (división entera), % (resto de


una división entera). Su prioridad es *, /, +, -.

Los operadores ​relacionales o de comparación se utilizan para crear expresiones


lógicas, es decir, expresiones que devuelven verdadero o falso. Son >, <, >=, <=, =, <>
(distinto). Todos tienen la misma prioridad.

Finalmente, los operadores ​lógicos ​se utilizan para crear expresiones lógicas
complejas. El resultado de estas expresiones puede ser verdadero, falso o
desconocido (nulo). Son AND, OR y NOT.

- El operador AND devuelve verdadero si el resultado de las dos expresiones es


verdadero y falso si alguna de ellas es falsa.
- OR devuelve verdadero si alguna de las expresiones o ambas son verdaderas.
- NOT devuelve lo opuesto a la expresión que le sigue.

En el “Recurso 2. Operadores” puedes encontrar varios ejemplos sobre


operadores.

7.1. Operadores especiales.

Null​. Con este operador se pregunta si el valor contenido en una columna es o no


nulo.

Formato: nombre-columna IS [NOT ] NULL.

Ejemplo, mostrar los empleados que tengan nulo en el campo salario.

SELECT * FROM EMPLEADOS WHERE SALARIO IS NULL

8
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad didáctica 4. Realización de consultas

Between​. Sirve para comprobar si un valor está comprendido entre otros dos,
ambos inclusive.

Formato: expresion-1 [NOT] BETWEEN expresión-2 AND expresión-3

Ejemplo, mostrar los empleados cuyo salario está comprendido entre 1000 y 2000
euros.

SELECT * FROM EMPLEADOS WHERE SALARIO BETWEEN 1000 AND 2000

Like​. Sirve para buscar cadenas que coincidan o no con un patrón de búsqueda.
Para realizar estas búsquedas pueden utilizarse caracteres especiales o comodines.
El % que representa a un conjunto de caracteres (cero incluido) y _ (guión bajo),
representa a un carácter.

Formato: nombre-columna [NOT] LIKE constante-alfanumérica

Ejemplos:

- Mostrar los empleados cuyo nombre comienza por D.

SELECT * FROM EMPLEADOS WHERE NOMBRE LIKE 'D%'

- Mostrar los empleados que se apelliden Sainz, Saenz, …

SELECT * FROM EMPLEADOS WHERE NOMBRE LIKE '%SA_NZ%'

In​. Se utiliza para comprobar si la expresión está incluida o no en la lista de


valores.

Formato: expresión [NOT] IN (constante-1 [,constante-2] …)

Ejemplo, mostrar los empleados de los departamentos 1 y 3.

SELECT * FROM EMPLEADOS WHERE DEPARTAMENTO IN (1, 3)

8. Funciones.

Una función representa un valor único que se obtiene aplicando unas determinadas
operaciones sobre un valor o conjunto de valores dados. Se especifican como una
palabra reservada seguida de unos paréntesis entre los que se escriben los
argumentos separados por comas si son varios.

En SQL encontramos funciones de dos tipos: escalares y colectivas. Las escalares


devuelven su resultado a partir de un valor único y las colectivas a partir de un
conjunto de valores.

8.1. Funciones escalares.

Dentro de estas podemos encontrarlas de varios tipos: de cadenas o textos, de


fechas y horas, aritméticas, etc.

9
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad didáctica 4. Realización de consultas

Las funciones escalares pueden ser usadas en cualquier lugar donde se espere
una columna, es decir, en SELECT, WHERE...

En esta sección sólo se estudiarán algunos ejemplos de estas funciones. Para


saber más puedes acceder a estas webs:

https://mariadb.com/kb/en/mariadb/functions-and-operators/

http://mysql.conclase.net/curso/index.php?cap=011#

- Funciones de fecha/hora.
o Curdate(). Devuelve la fecha actual del equipo.
o DayName(fecha). Devuelve el día de la semana de la fecha pasada
como parámetro.
o DateDiff(fecha1, fecha2). Devuelve la diferencia en días entre las dos
fechas. Fecha2 es la fecha más antigua.
o Year(fecha). Devuelve el año de la fecha pasada como parámetro.
o Month(fecha). Devuelve el mes de la fecha pasada como parámetro.
o Day(fecha). Devuelve el día del mes de la fecha pasada como
parámetro.
- Funciones de texto o cadena.
o Length(cadena). Devuelve el número de caracteres de la cadena
pasada como parámetro.
o Right(cadena, número). Extrae de la cadena tantos caracteres por la
derecha como indique número.
o Left(cadena, número). Igual pero por la izquierda.
o Concat(cadena1, cadena2). Concatena o une las dos cadenas en una
sola.
o Substring(cadena, posición, longitud). Extrae de la cadena pasada, otra
cadena a partir de la posición indicada y de tantos caracteres como se
indique en longitud.
- Funciones de control de flujo.
o IF (condición, valor1, valor2). Devuelve valor1 si la condición se cumple,
en caso contrario devuelve valor2.
o Ifnull(expresión1, expresión2). Si expresión1 es nulo devuelve
expresión2, en caso contrario devuelve expresión1.
o Nullif(expresión1, expresión2). Devuelve nulo si ambas expresiones son
iguales, en caso contrario devuelve expresión1.
- Funciones matemáticas.
o Truncate(expresión, número). Elimina decimales de la expresión. Sólo
muestra los indicados en número.
o Round(expresión). Redondea al entero más cercano.

8.2. Funciones colectivas.

Estas funciones son:

- AVG (expresión): calcula la media de los valores de la colección.


- MAX (expresión): halla el máximo valor de la colección

10
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad didáctica 4. Realización de consultas

- MIN (expresión): halla el mínimo


- SUM (expresión): calcula la suma
- COUNT (expresión): halla cuántos valores hay en la colección.

El argumento suele ser una expresión formada en la mayoría de las ocasiones por
un único campo y se sitúan como columnas en la sentencia SELECT.

Ejemplo: Select sum(salario) from ....

Antes de utilizar estas funciones se suelen construir grupos de filas con


características comunes y más tarde se aplica la función a cada uno de estos grupos.
Para construir grupos de filas se utiliza la sentencia GROUP BY.

Si no se construyen grupos, la función se aplica a todas las filas de la tabla que


satisfagan el predicado WHERE, por lo tanto se obtiene una tabla con una sola fila,
con tantas columnas como expresiones haya en la SELECT.

Ejemplos:

- Mostrar la media, el máximo y el mínimo de los salarios de la tabla empleados.

SELECT AVG(SALARIO), MAX(SALARIO), MIN(SALARIO) FROM EMPLEADOS

- Mostrar la media, el máximo y el mínimo de los salarios de la tabla empleados


del departamento 2.

SELECT AVG(SALARIO), MAX(SALARIO), MIN(SALARIO) FROM EMPLEADOS


WHERE DEPARTAMENTO=2

Algunas consideraciones:

- Si la colección de valores es vacía, Count devuelve 0 y las demás Nulo.


- Formato 1. Nombre_función ([DISTINCT] nombre_columna). En este caso
antes de aplicar la función se eliminan los valores repetidos del campo en
cuestión. Select count(Distinct población) from empleados
- Formato 2. nombre-función (expresión). La expresión debe contener algún
nombre de columna y no puede contener otra función colectiva. Ejemplo:
Select AVG(salario) from empleados
- Formato 3. Count(*). Sólo válido para Count. Devuelve como resultado el
número de filas que hay en el grupo al que se aplica, o de la tabla si no hay
GROUP BY.

Clausula GROUP BY​. Las funciones colectivas suelen aplicarse a grupos de filas.
Por ejemplo, pueden calcular el salario medio por departamento, el número de
compras de cada cliente, la suma de unidades vendidas de cada artículo…

Su sintaxis es muy sencilla: GROUP BY columna1 [,columna2, …]

Cuando se utiliza GROUP BY se crean grupos de filas en los que coincide la


columna de agrupamiento, es decir, si escribimos

11
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad didáctica 4. Realización de consultas

SELECT DEPARTAMENTO, COUNT(*) FROM EMPLEADOS GROUP BY


DEPARTAMENTO

se creará un grupo por cada departamento existente en la


tabla empleados. Todos los empleados del departamento
1 se meten en un grupo, los del departamento 2 en otro, y
así por cada departamento existente. La función Count(*)
se aplica a cada uno de los grupos, por tanto la sentencia
mostrará dos columnas, la primera el número de
departamento y la segunda cuántos empleados tiene ese
departamento. Al existir dos empleados sin departamento (departamento nulo), se
crea un grupo para ellos.

Por cada grupo creado se muestra una fila.

Estudiemos varios ejemplos con la base de datos Oposiciones. Hasta ahora solo
se han estudiado consultas basadas en una tabla, de ahí que los ejemplos sigan este
patrón.

La forma de resolverlos es la misma que en el ejemplo anterior, se agrupa por el


campo de referencia y se aplica la función correspondiente a cada grupo.

- Contar el número de opositores por cada ciudad. Mostrar dos columnas


nombre de ciudad y número de opositores. Los datos los extraemos de la tabla
Opositores.

SELECT CIUDAD, COUNT(*) AS NUMERO_OPOSITORES FROM


OPOSITORES GROUP BY CIUDAD

Se crea un grupo por cada ciudad, y en él se meten a todos los opositores de


esa ciudad. El count(*) se aplica a cada grupo creado.

- Mostrar la nota media por cada examen. Dos columnas, código de examen y
media. En este caso los datos se obtienen de la tabla Notas. En la tabla
examen no se guardan las notas.

SELECT CODIGOEXAMEN, AVG(NOTA) AS NOTA_MEDIA FROM NOTAS


GROUP BY CODIGOEXAMEN

Podemos truncar el resultado:

SELECT CODIGOEXAMEN, TRUNCATE(AVG(NOTA), 2) AS NOTA_MEDIA


FROM NOTAS GROUP BY CODIGOEXAMEN

Clausula HAVING​. Formados los grupos y aplicadas las funciones colectivas


podemos seleccionar sólo aquellos grupos que cumplan una determinada condición.
Cuando se quieren filtrar filas y en este filtro participan funciones colectivas, debe
utilizarse HAVING y nunca WHERE.

12
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad didáctica 4. Realización de consultas

Si quieren mostrarse los códigos de exámenes y su nota media, pero sólo aquellos
en los que la media es igual o superior a 5 debe escribirse una select como la
siguiente:

SELECT CODIGOEXAMEN, AVG(NOTA) AS NOTA_MEDIA FROM NOTAS GROUP


BY CODIGOEXAMEN HAVING AVG(NOTA) >=5

Ó bien esta otra, utilizando el alias de la columna en HAVING

SELECT CODIGOEXAMEN, AVG(NOTA) AS NOTA_MEDIA FROM NOTAS GROUP


BY CODIGOEXAMEN HAVING NOTA_MEDIA >=5

9. Consultas con varias tablas.

Si se quiere obtener información procedente de varias tablas, deben especificarse


todas ellas en la cláusula FROM. Lo habitual es incluir en dicha cláusula tablas que
estén relacionadas entre sí, se utilicen sus campos en la SELECT o no.

Pueden unirse tantas tablas como se desee y hacer referencia en SELECT a todas
las columnas de esas tablas. Si existen campos en varias tablas con el mismo nombre
deben calificarse, anteponiendo el nombre de la tabla al del campo. Ejemplo
departamentos.nombre​.

¡Importante! Si se tienen dos tablas A y B, al crear una sentencia SELECT


basada en ellas, se obtiene lo que se llama un producto cartesiano, es decir, se
mezcla cada fila de la tabla A con todas las filas de la tabla B. Si la tabla A tiene 50
filas y la tabla B 100 filas, la consulta generada tendrá 5000 filas. En este conjunto es
necesario eliminar las filas que no están relacionadas, esto se consigue mediante una
condición en la cláusula WHERE que comparará clave principal de una tabla con la
clave ajena de la otra. Si no lo hacemos de esta forma, el conjunto de resultados
mostrado no será correcto.

En el ejemplo “mostrar número de empleado, nombre de empleado, salario y


nombre del departamento en el que trabaja”, los datos deben obtenerse de las tablas
departamentos y empleados. La select podría empezar así:

SELECT NUMEROEMPLEADO, EMPLEADOS.NOMBRE, SALARIO,


DEPARTAMENTOS.NOMBRE FROM EMPLEADOS, DEPARTAMENTOS

El resultado sería:

Como puede observarse, cada fila


de la tabla empleados se ha
combinado con cada departamento
(solo se muestran los tres primeros
empleados por motivos de espacio).

Para evitar estas filas ficticias


debemos añadir en la cláusula
WHERE la condición que compare

13
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad didáctica 4. Realización de consultas

clave principal y clave ajena de las tablas unidas.

La SELECT quedaría así:

SELECT NUMEROEMPLEADO, EMPLEADOS.NOMBRE, SALARIO,


DEPARTAMENTOS.NOMBRE FROM EMPLEADOS, DEPARTAMENTOS
WHERE NUMERODEPARTAMENTO=DEPARTAMENTO.

Con esto se consigue que solo se muestre


por cada empleado los datos de su
departamento, el valor contenido en el campo
clave ajena, campo “departamento” de la tabla
empleado.

Si la consulta tuviera varias condiciones en WHERE, las necesarias para eliminar


filas no deseadas se unirían a las mismas. Por ejemplo, “mostrar número de
empleado, nombre de empleado, salario y nombre del departamento en el que trabaja,
solo para los empleados que ganan más de 1500 euros”:

SELECT NUMEROEMPLEADO,
EMPLEADOS.NOMBRE, SALARIO,
DEPARTAMENTOS.NOMBRE FROM EMPLEADOS,
DEPARTAMENTOS WHERE NUMERODEPARTAMENTO=DEPARTAMENTO AND
SALARIO > 1500

Además si en FROM aparecen más de dos tablas, será necesario indicar en


WHERE las condiciones que comparen clave principal-clave ajena para cada
pareja de tablas.

Debe tenerse en cuenta, que si las claves primarias/ajenas relacionadas están


formadas por varios campos, deben especificarse condiciones en WHERE para todas
las parejas de campos.

10. Consultas de unión.

Se llaman así aquellas consultas cuyo resultado se obtiene uniendo en uno solo los
de otras dos, que a su vez también pueden ser compuestas.

Para unir dos SELECT se escribe UNION o UNION ALL entre ambas consultas. La
diferencia reside en que al escribir sólo UNION, si existen filas repetidas sólo se nos
muestra una de ellas, sin embargo con UNION ALL también se muestran las
repeticiones.

Al utilizar UNION, las tablas resultantes deben tener igual número de columnas y
las columnas que están en la misma posición relativa deben ser de igual tipo de datos.

14
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad didáctica 4. Realización de consultas

El encabezado que se muestra para las columnas será el de la primera consulta.

Sobre el resultado final no se pueden aplicar otras cláusulas como GROUP BY,
únicamente puede contener ORDER BY al final de la sentencia SELECT.

Un ejemplo:

SELECT NUMEROEMPLEADO, NOMBRE, DEPARTAMENTO FROM


EMPLEADOS WHERE DEPARTAMENTO = 1
UNION
SELECT NUMEROEMPLEADO, NOMBRE, DEPARTAMENTO FROM
EMPLEADOS WHERE DEPARTAMENTO = 2

Evidentemente esta consulta podría haberse resuelto con WHERE


DEPARTAMENTO IN (1, 2).

11. Combinaciones internas y externas.

Al trabajar con varias tablas en una consulta, podemos obtener, como se ha visto,
datos que están relacionados, pero en ningún momento podemos obtener filas de una
tabla que no tienen filas relacionadas en otras. A estas consultas que sólo muestran
datos relacionados se les llama ​combinaciones internas y pueden ser desarrolladas
con otras sintaxis:

- SELECT … FROM NombreTabla1 INNER JOIN NombreTabla2 ON condición


de relación. Donde condición de relación será sustituido por la comparación
clave principal-clave ajena.

- SELECT ….FROM NombreTabla1 INNER JOIN NombreTabla2


USING(ColumnaRelacionada). En este caso la columna que relaciona las dos
tablas debe tener el mismo nombre en cada una de ellas.

El ejemplo anterior nos quedaría de la siguiente forma:

SELECT NUMEROEMPLEADO, EMPLEADOS.NOMBRE, SALARIO,


DEPARTAMENTOS.NOMBRE FROM EMPLEADOS INNER JOIN
DEPARTAMENTOS ON NUMERODEPARTAMENTO=DEPARTAMENTO WHERE
SALARIO > 1500.

Como se observa las condiciones propias de la consulta se especifican en


WHERE.

Por otro lado, ​las combinaciones externas permiten extraer filas de una tabla que
no tienen relación con las filas de la otra tabla participante en la consulta. En el caso
de la base de datos “Departamentos” podríamos querer visualizar los empleados con
su número, nombre, salario y nombre del departamento al que pertenecen, si no tienen
departamento asignado que aparezca el valor null.

Estas combinaciones externas pueden ser:

15
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad didáctica 4. Realización de consultas

- Combinaciones externas izquierdas o LEFT JOIN. Cada fila de la tabla


colocada a la izquierda que no se pueda combinar con ninguna fila de la
segunda tabla, añade una fila al resultado con los valores de las columnas de
la primera tabla (izquierda) y NULL para todas las columnas de la segunda que
no han encontrado resultados coincidentes.
- Combinaciones externas derechas o RIGHT JOIN. Cada fila de la tabla
colocada a la derecha que no se pueda combinar con ninguna fila de la primera
tabla, añade una fila al resultado con los valores de las columnas de la
segunda tabla (derecha) y NULL para todas las columnas de la primera que no
encuentren coincidentes.

Al hablar de la tabla de la derecha o izquierda, se hace referencia a la posición de esta


tabla respecto a la palabra JOIN de la select.

Ejemplo resuelto con LEFT y RIGHT JOIN. Visualizar los empleados con su número,
nombre, salario y nombre del departamento al que pertenecen. Si no tienen
departamento asignado, que aparezca el valor null.

- Con LEFT JOIN:

SELECT NUMEROEMPLEADO, EMPLEADOS.NOMBRE, SALARIO,


DEPARTAMENTOS.NOMBRE FROM EMPLEADOS LEFT JOIN DEPARTAMENTOS
ON NUMERODEPARTAMENTO=DEPARTAMENTO

- Con RIGHT JOIN:

SELECT NUMEROEMPLEADO, EMPLEADOS.NOMBRE, SALARIO,


DEPARTAMENTOS.NOMBRE FROM DEPARTAMENTOS RIGHT JOIN
EMPLEADOS ON NUMERODEPARTAMENTO=DEPARTAMENTO.

El resultado es el mismo en ambos casos y solamente se ha cambiado la posición


de las tablas con respecto a la palabra JOIN.

12. Subconsultas

Una subconsulta o subselect es una consulta que se ejecuta dentro de otra y que
puede ser utilizada para obtener un valor necesario para la consulta principal.

Imaginemos que queremos obtener los empleados que tengan un salario superior
al de la media. Primero será necesario obtener el salario medio para más tarde

16
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad didáctica 4. Realización de consultas

compararlo con el salario de cada empleado. En este caso la subselect sería un


operando en la cláusula WHERE de la select principal.

La sentencia quedaría:

SELECT NUMEROEMPLEADO, EMPLEADOS.NOMBRE, SALARIO FROM


EMPLEADOS WHERE SALARIO > (SELECT AVG(SALARIO) FROM EMPLEADOS)

La subselect se ejecutaría primero y una sola vez. El valor que devuelve se


compara con el salario de cada empleado. Solo se muestran las filas en las que la
condición devuelva verdadero.

En este caso la subselect devuelve un ​único valor​, una sola fila y una sola
columna, por lo que podemos compararlo con el salario utilizando >, <, >=, etc.

Sin embargo puede darse el caso de que la subselect devuelva ​una lista de
valores​, varias filas y una sola columna. En este caso serían necesarios los
operadores IN o NOT IN.

Un ejemplo para esta situación sería “mostrar los opositores que viven en la misma
ciudad que los opositores con DNI 1173391 y 76123215”. Ahora, la subselect debe
devolver las ciudades de estos dos opositores para ir comparando con las de los
demás. Como las ciudades pueden ser distintas (de hecho lo son en el ejemplo), debe
utilizarse IN.

SELECT * FROM OPOSITORES WHERE CIUDAD IN (SELECT CIUDAD FROM


OPOSITORES WHERE DNI IN (1173391, 76123615))

Es importante destacar que en estas subconsultas deben compararse elementos


que guarden la misma información. En este caso, el WHERE compara CIUDAD con lo
devuelto por la subselect que es una lista de ciudades. En el primer ejemplo, la
subselect devuelve la media de los salarios para comparar con los salarios de la tabla
empleados.

Las subconsultas pueden anidarse de forma que en una de ellas aparezca otra
subconsulta.

13. Consultas correlacionadas.

Las consultas correlacionadas son un tipo especial de subselect que se evalúa una
vez por cada fila que cumpla los criterios de la consulta principal. Imagina que se
quiere obtener la lista de empleados que tienen un salario superior a la media de su
departamento. Como existen varios departamentos, esta media debe calcularse para
cada uno de ellos (de los empleados), por tanto la subselect que la calcula debe
ejecutarse varias veces.

SELECT * FROM EMPLEADOS E WHERE SALARIO >


(SELECT AVG(SALARIO) FROM EMPLEADOS WHERE DEPARTAMENTO =
E.DEPARTAMENTO)

17
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad didáctica 4. Realización de consultas

La consulta funciona de la siguiente forma. Se trata empleado por empleado,


comparando su salario con la media del salario de su departamento. Para obtener esta
media la subselect debe conocer el departamento del empleado en cuestión, por tanto
debe acceder al campo “Departamento” de la tabla de la select principal. Como esta
subselect calcula la media de los salarios de la tabla “Empleados”, tanto select
principal como subselect acceden a la misma tabla, por lo que es necesario dar un
alias a la tabla “Empleados” de la select principal (E) para que en la cláusula WHERE
puedan compararse dos campos con el mismo nombre.

18

También podría gustarte