Consultas basicas SQL en MYSQL
Consultas basicas SQL en MYSQL
Consultas
1. El lenguaje SQL
2. ¿Cómo se usa SQL?
3. Componentes del lenguaje SQL
3.1. Tipos de sentencias
3.2. Normas de escritura y sintaxis
3.3. Proceso de sentencias SQL por el SGBDR
4. Practicando con SQL
4.1. El SGBD relacional MySQL Server
5. Un ejemplo para las prácticas
5.1. Creación de la base de datos para las prácticas
6. Tipos de Datos
6.1. Tipos de datos en MySQL
7. Operadores y Funciones de agregación
8. Funciones SQL
9. La Sentencia SELECT.
9.1. Consultas sobre las filas de una tabla
9.2. Cláusula WHERE
9.3. Cláusula DISTINCT
9.4. Cláusula ORDER BY
9.5. Cláusula GROUP BY y funciones de agregación
9.6. Cláusula HAVING
9.7. Cláusula LIMIT
9.8. Subconsultas
9.9. Consultas combinadas a varias tablas (JOIN)
1. El lenguaje SQL
En las unidades didácticas anteriores has aprendido que mediante el
modelo Entidad-Relación se pueden modelizar situaciones del mundo
real, de manera que disponemos de una herramienta gráfica para
trasladar los elementos de un sistema de información y sus relaciones,
a un esquema manejable que puede ser fácilmente interpretado por
cualquiera que conozca las reglas por las que se rige. Posteriormente
has comprobado cómo se puede trasladar ese modelo Entidad-Relación
a otro esquema de información más orientado a su tratamiento, como
es el modelo relacional.
Pero, ¿de qué manera podemos almacenar y tratar la información esquematizada en los
modelos E-R y relacional por medio de un Sistema Gestor de Bases de Datos? La respuesta a
estas preguntas se llama SQL.
SQL es un lenguaje que nos permite interactuar con los SGBD Relacionales para
especificar las operaciones que deseamos realizar sobre los datos y su estructura.
SQL son las siglas de Structured Query Language (Lenguaje de Consulta Estructurado).
Es un lenguaje declarativo, basado en el Álgebra y Cálculo Relacional, lo cual quiere
decir que en él se especifica al Sistema Gestor de Base de Datos qué queremos obtener
y no la manera de cómo conseguirlo.
Se puede utilizar en modo interactivo (vía consola o interfaz gráfico), o bien embebido
en programas.
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
El origen de SQL está íntimamente ligado al de las bases de datos relacionales. En 1970 Codd
propuso el modelo relacional que ya has estudiado en unidades anteriores.
Basándose en esta idea en los laboratorios de IBM se definió el lenguaje
SEQUEL (Structured English QUEry Language) que posteriormente sería
implementado por el SGBD System R. Más tarde otros fabricantes de SGBD
lo adoptarían, de forma que se acabó convirtiendo en un estándar de la
industria informática.
En 1989 el estándar ISO (y ANSI) fue objeto de una revisión y ampliación dando lugar al lenguaje
que se conoce con el nombre SQL89 o SQL1. En 1992 el estándar es revisado y ampliado
considerablemente para cubrir carencias de la versión anterior, apareciendo así la nueva versión
estándar de SQL (a día de hoy sigue siendo la más conocida) llamada SQL92 o SQL2. En 1999 se
aprueba un nuevo SQL estándar, conoce como SQL99 o SQL3, que incorpora mejoras que
incluyen triggers, procedimientos, funciones, y otras características de las bases de datos
objeto-relacionales. Otras revisiones son SQL:2003 (introduce algunas características de
XML y cambios en columnas autonuméricas), SQL:2006 (permite el uso de SQL
conjuntamente con XML y SQuery) y SQL:2008 (incluye disparadores del tipo INSTEAD OF,
añade sentencia TRUNCATE, entre otras).
SQL es un lenguaje con cierta antigüedad que ha tenido que evolucionar para adaptarse a
nuevas características y requerimientos. Hoy día SQL es el lenguaje de consulta y
manipulación de datos más extendido y utilizado por todos los desarrolladores,
administradores y fabricantes de SGBDR.
Es importante resaltar que SQL no es propiedad de ningún fabricante, sino que es una norma
a seguir, desgraciadamente los fabricantes de software no suelen implementar SQL puro en sus
productos, sino que a menudo incorporan pequeñas variaciones para conseguir funcionalidades
concretas en sus desarrollos. Esto hace que lo que debería ser un estándar no lo sea
completamente en la realidad.
SQL, un ejemplo.
El modelo relacional tiene como estructura de almacenamiento de los datos las relaciones o
tablas. La intensión o esquema de una relación consiste en el nombre que hemos dado a la
relación y un conjunto de atributos. La extensión de una relación es un conjunto de tuplas. Al
trabajar con SQL, esta nomenclatura cambia, como podemos apreciar en la siguiente figura
2
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Sin embargo, a pesar de que la nomenclatura utilizada sea diferente, los conceptos son los
mismos.
Con el lenguaje SQL se puede definir, manipular y controlar una base de datos relacional.
A continuación veremos, aunque sólo en un nivel introductorio, cómo se pueden realizar estas
acciones:
1) Crear una tabla que contuviese por ejemplo los datos de los productos de
nuestra empresa:
3
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Y muchas más cosas que iremos viendo punto por punto en los siguientes apartados.
Fijémonos en la estructura de todo lo que hemos hecho hasta ahora con SQL.
Las operaciones de SQL reciben el nombre de sentencias y están formadas por diferentes partes
que denominamos cláusulas, tal y como podemos apreciar en el siguiente ejemplo:
Esta consulta muestra el código, el nombre y el tipo de los productos que cuestan más de 1.000
euros.
4
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Los Sistemas Gestores de Bases de Datos Relacionales (SGBDR) permiten dos modos de acceso a
las bases de datos:
5
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Con el tiempo han surgido nuevas necesidades en los SGBDR que han obligado a incorporar
nuevas sentencias que no se pueden clasificar en los tres grupos clásicos anteriores, cómo son
bloqueo, replicación, etc.
A lo largo de esta unidad estudiaremos y practicaremos gran parte de las sentencias SQL, y por
supuesto las más importantes y utilizadas. Aunque su estudio completo no sería posible aquí, por
su elevadísimo número y casuística de cada una, y para completar tu formación te remitimos a
los buenos manuales que sobre SQL circulan en la red y en las librerías. En especial te
recomendamos la documentación del SGBDR que vas a utilizar, MySQL. Puedes obtenerla de la
misma web desde donde has descargado la aplicación.
6
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
1. PALABRA Cuando en la sintaxis se utiliza una palabra en negrita, significa que es una
palabra que hay que escribir literalmente (aunque sin importar si en mayúsculas o
minúsculas).
2. texto. El texto que aparece en color normal sirve para indicar que no hay que escribirlo
literalmente, sino que se refiere a un tipo de elemento que se puede utilizar en el
comando.
EJEMPLO:
El texto columna hay que cambiarlo por un nombre concreto de columna (nombre,
apellidos,...), al igual que tabla se refiere a un nombre de tabla concreto.
EJEMPLO:
7
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Se nos presenta aquí la primera decisión que adoptar ¿Qué SGBDR utilizar? La respuesta es al
mismo tiempo sencilla y complicada, veamos:
▫ Es sencilla porque nos vale cualquier SGBDR que
implemente al menos SQL-92 o SQL-99.
▫ Es complicada porque existen bastantes productos en el
mercado que cumplen ese requisito.
Es una base de datos muy rápida, robusta, segura y fácil de usar. Fue desarrollada inicialmente
para manejar grandes bases de datos mucho más rápidamente que las soluciones existentes y ha
sido usada con éxito en ambientes de producción de alta demanda. Su desarrollo es constante,
lo que hace que ofrezca una rica variedad de funciones. Su conectividad, velocidad y
seguridad hacen a MySQL altamente satisfactorio para acceder a través de Internet.
Actualmente existen versiones para la mayoría de los Sistemas Operativos.
Para comenzar a trabajar y practicar con SQL necesitaremos tener instalado el Servidor de
MySQL. También es conveniente que instalemos algún cliente gráfico para acceder al servidor y
ejecutar sentencias SQL, como por ejemplo SQL Development (anteriormente denominado
Query Browser), que viene incluido en el paquete de herramientas MySQL Workbench.
En este documento puedes ver los pasos a seguir para la instalación del Servidor MySQL, su
puesta en marcha y como interactuar con el SGBDR MySQL mediante:
Un cliente en modo texto, consola o la Línea de comandos de MySQ (Monitor MySQL)
Un cliente gráfico como SQL Development
8
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Hasta aquí el enunciado de nuestro caso práctico, veamos a continuación el diseño conceptual
de este supuesto.
9
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
El esquema anterior está en 3FN (tercera forma normal) y consta de cuatro tablas. A partir de
ahora y en lo que resta de esta unidad didáctica utilizaremos este esquema relacional para
ejemplificar los contenidos teóricos relativos al lenguaje SQL. No olvides que el vehículo para
realizar las prácticas será el gestor de base de datos MySQL, que debes tener instalado y en
funcionamiento. También debes tener a mano la documentación de MySQL que se instaló junto
con la aplicación, o en línea a través de la página web oficial del producto.
10
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Un script SQL es una agrupación de sentencias SQL que pueden ser editadas, almacenadas y
recuperadas para hacer más productivo nuestro trabajo.
En nuestro caso, cargaremos o ejecutaremos el script que crea la BD y el que la llena con datos
(podrían ir todas las sentencias en un solo script) desde un cliente gráfico como SQL
Development de Workbench
Ejecutar script
– Rayo
11
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
2) Poner en uso la base de datos creada. Doble click en BD o seleccionar según el cliente
gráfico que estés utilizando.
Una vez ejecutado el script, puede ser necesario refrescar o reconectar al servidor para
poder visualizar la nueva BD. La seleccionamos como BD por defecto (Base de datos en uso).
A partir de ahora, puedes probar todas las sentencias SQL de los ejemplos de la UD4, desde este
cliente gráfico abriendo una nueva ventana de script:
Desde el siguiente enlace puedes acceder a un manual sobre el SGBD MySQL en español.
http://dev.mysql.com/doc/refman/5.0/es/index.html
12
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
6. Tipos de datos
Un dominio es un conjunto del cual toma sus valores una columna de una tabla. Según este
concepto, los tipos de datos predefinidos son dominios.
Cada SGBDR incorpora los tipos predefinidos según el estándar SQL, y otros tipos propios
que es conveniente conocer según el sistema que se vaya a utilizar.
Estudiaremos con más detalle los principales tipos de datos de MySQL en apartados posteriores.
De momento te indicamos de manera general cuales son estos tipos:
1) Números Enteros.
Son números sin parte fraccionaria o decimal.
[ ]: opcionalidad
M: ancho de columna
Ejemplo:
INT ----- valor entero (4 bytes)
INT(5) ---- valor entero (4 bytes). Su representación será en un ancho de columna de 5
caracteres.
2) Números Reales.
Son números que tienen una parte fraccionaria o decimal. No se utiliza este tipo solo para
números con parte decimal, sino que también podemos utilizar este tipo para números enteros
que son tan grandes que no se pueden representar con el tipo BIGINT.
13
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Ejemplo:
FLOAT(6,2) ---- un número real (4 bytes). Se representará con 6 dígitos totales, 4 antes del
punto decimal y 2 después del punto.
Cadenas de caracteres
M: ancho de columna
L : longitud o tamaño real de una cadena
Si observamos la tabla, vemos que el único tipo de dato que siempre utiliza el tamaño
especificado por M es el tipo char. Por este motivo, se ofrece el tipo varchar que ocupa sólo el
espacio requerido por el valor de la columna.
Los tipos text y blob son equivalentes, pero BLOB respeta las mayúsculas, minúsculas y
caracteres acentuados en la ordenación.
El tipo enum (‘v1’, ‘v2’, ..) indica que el campo tomará uno de los valores especificados en la
lista, mientras que set(‘v1’, ‘v2’,…) permite que el campo no tome ninguno de los valores o
bien uno o varios de los valores especificados en la lista.
Ejemplo:
Enum(‘1’,’2’,’3’) una columna: null, o ‘1’ o ‘2’ o ’3’ o ‘ ‘
Set(‘1’,’2’,’3’) una columna: ‘1’ o ‘1,2’ o ‘1,2,3’ o ‘ ‘ o null
14
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Fechas y horas
Timestamp es una secuencia de caracteres, que denotan la hora y fecha (o alguna de ellas) en la
cual ocurrió un determinado evento
15
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
SQL nos ofrece las siguientes funciones de agregación para efectuar varias operaciones sobre los
datos de una base de datos
8. Funciones SQL
SQL también dispone de una extensa gama de funciones que pueden ser
utilizadas en las expresiones. Típicamente las expresiones constan de un
nombre y aceptan unos parámetros entre paréntesis para devolver un valor.
<nombre_función>(<parámetro1>,<parámetro2>,…)
Funciones de caracteres
o CHAR_LENGTH(<cadena>): Devuelve un entero que es la longitud de la cadena de
caracteres.
Ejemplo: SELECT CHAR_LENGTH('Hola')Devuelve 4.
16
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Funciones numéricas
o ABS(<número>) : Devuelve el valor absoluto de un número.
Ejemplo: SELECT ABS(-21) Devuelve 21.
17
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Funciones de conversión:
o CONVERT(<expresion>,<tipo_dato>): Devuelve la expresión convertida al tipo de dato
suministrado.
Ejemplo: SELECT CONVERT(21,DECIMAL) Devuelve 21.00.
9. La sentencia SELECT
9.1 Consultas sobre las filas de una tabla.
Veremos cómo podemos realizar consultas sobre los datos almacenados, de forma que
podamos obtener información de los datos existentes.
Las consultas en SQL son la operación más común y se hacen con la sentencia SELECT. Una
sentencia SELECT tiene como sintaxis más básica y sencilla la compuesta por las cláusulas
SELECT y FROM.
SELECT <lista_de_expresiones>
FROM <tabla>
Siendo <lista_de_expresiones> una lista de expresiones a evaluar por cada fila afectada de la
tabla, (normalmente serán nombres de columnas). Por ejemplo, para obtener los nombres de
todos los departamentos y las ciudades donde se encuentran, se teclea en SQL:
SELECT nombre,ciudad
FROM departamento
Si queremos obtener todas las columnas de una tabla se puede utilizar cómo
<lista_de_expresiones> el carácter “*”. Por ejemplo, para obtener todos los datos de todos los
empleados podemos utilizar la siguiente sentencia SELECT:
SELECT *
FROM empleado
Se pueden utilizar expresiones que realicen algún cálculo u operación. Por ejemplo, si
suponemos que cada hora de trabajo se paga a 40 euros. Una lista de lo que hay que pagar a
cada empleado que trabaja en un proyecto se haría de la siguiente manera:
18
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Podemos utilizar el cliente gráfico para pasar sentencias al SGBDR y obtener los resultados.
La sentencia SELECT admite otras cláusulas que la hacen más potente y versátil. Estas son las
siguientes:
WHERE
ORDER BY
GROUP BY
HAVING
LIMIT
19
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Su formato es:
SELECT <lista_de_expresiones>
FROM <tabla>
WHERE <criterio>
Por ejemplo, si queremos obtener los nombres de los empleados del departamento “02”
podemos ejecutar la sentencia:
SELECT nombre
FROM empleado
WHERE cddep='02'
Para construir el criterio disponemos de una gran variedad de operadores lógicos, a continuación
los veremos y practicaremos.
Operadores de comparación: <, <=, =, >=, >, <>. Con el significado habitual.
20
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Operadores lógicos para enlazar más de un criterio: AND y OR. Sirven para obtener un
resultado lógico combinando el resultado de dos criterios. Tienen el habitual significado del
Y y el O lógicos.
Las expresiones lógicas pueden agruparse con paréntesis para indicar el orden de evaluación
o aclarar las expresiones complicadas.
21
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Por tanto, para la consulta anterior se pueden conseguir resultados más correctos utilizando
DISTINCT:
Por ejemplo, para listar los nombres de los empleados en orden alfabético podemos emplear la
siguiente sentencia SELECT:
SELECT nombre
FROM empleado
ORDER BY nombre
Para obtener los nombres de empleado ordenados por el departamento donde trabajan, y a
igualdad de éste, usar como segundo criterio de ordenación el orden alfabético de nombre, se
emplearía:
22
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Se puede decidir si el orden será ascendente (ASC) o descendente (DESC). Si queremos la lista
de departamentos ordenada por orden alfabético descendente de la ciudad de localización
podemos usar:
SELECT *
FROM departamento
ORDER BY ciudad DESC
Por supuesto se puede combinar la cláusula ORDER BY con la cláusula WHERE. En este caso
ORDER BY debe aparecer después de WHERE.
Por ejemplo, la lista de empleados por orden alfabético del departamento “02” se obtendría
con:
SELECT *
FROM empleado
WHERE cddep='02'
ORDER BY nombre
23
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Por ejemplo, para calcular la suma de horas trabajadas por todos los empleados se utilizaría:
SELECT SUM(nhoras)
FROM trabaja
Por ejemplo, la media de horas trabajadas por cada empleado se calcula como:
SELECT AVG(nhoras)
FROM trabaja
o Valor mínimo MIN(<expresión>) : Produce como resultado el mínimo de los valores del
conjunto de expresiones evaluadas.
Por ejemplo, el mínimo valor de “horas trabajadas” (correspondiente al trabajador que menos
ha horas ha trabajado):
SELECT MIN(nhoras)
FROM trabaja
o Valor máximo MAX(<expresión>) : Obtiene el máximo del conjunto de expresiones.
Por ejemplo, fecha de ingreso en la empresa más reciente, es decir, la fecha en la que ingresó
el último trabajador contratado por la empresa. (Evidentemente se entiende que las fechas más
recientes son mayores que las más antiguas):
SELECT MAX(fecha_ingreso)
FROM empleado
o Cuenta del número de filas de una consulta COUNT(*) : Cuenta el número de filas que se
obtienen en una consulta.
SELECT COUNT(*)
FROM empleado
o Cuenta del número de filas que no producen el valor NULL COUNT(<expresión>): Produce
como resultado un número que indica cuántas filas de la consulta no producen NULL al
evaluar la expresión.
Por ejemplo para calcular el número de empleados que están asignados a un departamento:
SELECT COUNT(cddep)
FROM empleado
24
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Es muy útil combinar estas funciones de agregación con la cláusula GROUP BY,
de esta forma se pueden calcular subtotales de grupos de filas con alguna
característica en común. Por ejemplo, si quisiéramos saber cuál es el número de
horas trabajadas en cada proyecto se podría emplear:
25
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Por supuesto se puede combinar lo anterior con la ordenación por medio de la cláusula ORDER
BY.
Por ejemplo, para listar los tres empleados más antiguos de la empresa:
SELECT nombre,fecha_ingreso
FROM empleado
ORDER BY fecha_ingreso ASC
LIMIT 3
Otro ejemplo puede ser conocer los dos empleados que más horas han trabajado en proyectos:
SELECT cdemp,SUM(nhoras)
FROM trabaja
GROUP BY cdemp
ORDER BY SUM(nhoras) DESC
LIMIT 2
26
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
9.8 Subconsultas
En muchas ocasiones el criterio lógico para seleccionar las
filas de una consulta en la cláusula WHERE viene dado por
los resultados de otra consulta previa. A esta consulta
previa se la denomina subconsulta o consulta anidada. Es
una característica muy importante del lenguaje SQL,
hasta el punto de que muchas consultas no podrían ser
realizadas sin el uso de esta capacidad.
Nos centraremos en subconsultas que aparecen tras WHERE y HAVING. Por ejemplo, si
analizamos el enunciado “lista de empleados que han trabajado más horas de la media de horas
trabajadas de todos los empleados en proyectos”, nos daremos cuenta que en realidad hay dos
consultas en el enunciado, en una de ellas hay que calcular la media de horas trabajadas, y en la
otra hay que listar los empleados que superan esa media. En SQL quedaría así:
SELECT cdemp,nhoras
FROM trabaja
WHERE nhoras > (SELECT AVG(nhoras)FROM trabaja);
En la cláusula HAVING las subconsultas sirven para seleccionar los grupos de filas del
resultado. Por ejemplo, lista de empleados que han trabajado más horas en proyectos que las
horas dedicadas al proyecto “AEE”:
Es necesario hacer una serie de consideraciones relativas a las subconsultas tras WHERE O
HAVING:
o Una subconsulta debe producir una única columna de datos como resultado. Esto significa
que una subconsulta siempre tiene un único elemento de selección de la cláusula SELECT.
o La cláusula ORDER BY no tiene sentido en una subconsulta. Los resultados de la
subconsulta se utilizan internamente por parte de la consulta principal y nunca son visibles al
exterior, por lo que carece de sentido ordenarlos.
o Es posible referirse a nombres de columnas de la consulta principal desde dentro de la
subconsulta.
Existe una gama muy rica de operadores para relacionar la consulta principal y la subconsulta.
Vamos a verlos a continuación.
o Operadores de comparación: <, <=, =, >=, >, <>: Se compara el valor de la expresión WHERE
utilizada en la consulta principal con un único valor proporcionado por la subconsulta. Por
ejemplo, lista de los departamentos que están en la misma ciudad que el departamento
“01”:
27
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
SELECT cddep
FROM departamento
WHERE ciudad = (SELECT ciudad FROM departamento WHERE cddep='01')
SELECT nombre
FROM empleado
WHERE EXISTS (SELECT * FROM departamento WHERE ciudad='Almería' AND
empleado.cddep=departamento.cddep)
Observa cómo hemos incluido una condición en la cláusula WHERE de la subconsulta que la
relaciona con la consulta principal empleado.cddep=departamento.cddep.
o También es posible utilizar alias para los nombres de tabla en el caso de que la tabla de
la consulta principal y de la subconsulta sean la misma, un alias es como un sobrenombre
dado a una tabla. Se pueden definir los alias en la cláusula FROM, a continuación del nombre
la tabla referenciada. Por ejemplo, si quisiéramos obtener la lista de los empleados que son
jefes de algún empleado, deberíamos comprobar para cada empleado de la tabla empleado
“sí existe” (EXISTS) algún otro empleado de la tabla empleado que tiene como cdjefe el
cdemp del empleado que estamos comprobando. Quedaría así:
SELECT nombre
FROM empleado a
WHERE EXISTS (SELECT * FROM empleado b WHERE a.cdemp=b.cdjefe)
Lista de los empleados que tienen una antigüedad superior a alguno del departamento “03”:
SELECT nombre,fecha_ingreso,cdemp
FROM empleado
WHERE fecha_ingreso < SOME(SELECT fecha_ingreso FROM empleado WHERE cddep='03')
Lista de empleados y horas trabajadas de los empleados que han trabajado más horas que todos
los empleados del proyecto “GRE”:
SELECT cdemp,nhoras
FROM trabaja
WHERE nhoras > ALL (SELECT nhoras FROM trabaja WHERE cdpro='GRE')
28
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
¿Qué podemos hacer para consultar una información que se encuentre repartida por varias
tablas?
Es muy habitual que los datos que queremos obtener por medio de una consulta se
encuentren en tablas diferentes. En estos casos hay que combinar las tablas necesarias para
construir una única consulta. Existen dos tipos de combinaciones de tablas, la unión (UNION) y la
composición (JOIN). Vamos a ver a continuación en qué consiste cada una.
Unión de tablas.
La unión de tablas en una consulta produce como
resultado la unión, en el sentido algebraico de la teoría
de conjuntos, de las filas de ambas tablas, es decir,
produce una nueva tabla que tiene todas las filas de la
primera tabla y a continuación también todas las filas de la
segunda tabla.
Composición de tablas.
En este tipo de combinación de tablas se realiza el
producto cartesiano entre las tablas, pero obteniendo
sólo las filas o registros que estén relacionados. A esto
se le llama JOIN o composición de tablas.
SELECT empleado.nombre,departamento.nombre
FROM empleado, departamento
WHERE empleado.cddep=departamento.cddep
29
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Piensa que en vez de tablas de bases de datos estuvieras manejando esas mismas tablas pero
impresas en papel, cada una en una hoja. La forma de encontrar la información que se pide,
¿cuál sería?
Pues empezaríamos con la primera fila de la primera tabla empleado,
nos fijaríamos en el nombre del primer empleado, y en el código del departamento en el
que trabaja, para a continuación empezar a comparar ese código de departamento con
el de todas las filas de la tabla departamentos en la segunda hoja, hasta que
encontráramos una coincidencia.
Entonces nos fijaríamos en el nombre de ese departamento y lo anotaríamos junto al
nombre del empleado.
Y volveríamos a repetir el proceso con todas las filas de la tabla empleado.
Pues bien, más o menos es lo mismo que hace automáticamente la composición (JOIN)
SELECT <lista_de_expresiones>
FROM <tabla1> INNER JOIN <tabla2> ON
<expresión_composición>
Por ejemplo, si queremos resolver de forma más eficiente el ejemplo propuesto cuando
tratamos la composición por producto cartesiano, listado de nombres de los empleados junto
con el nombre del departamento donde trabajan. Podemos escribir:
30
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos
Observa además el uso de alias de tablas, aunque no es necesario en este caso nos ahorra
escribir repetidamente el nombre de las tablas.
Para corregir este comportamiento se utilizan las composiciones LEFT JOIN y RIGHT JOIN.
En ambos casos las filas con valores nulos en las columnas de composición, o con valores
no coincidentes en ambas tablas de composición son tenidos en cuenta.
LEFT JOIN añade al resultado del INNER JOIN las filas de la tabla izquierda que no tienen
correspondencia en la tabla de la derecha.
El resultado es el INNER JOIN de ambas tablas, más los empleados que no están asignados a
ningún departamento.
Otro ejemplo:
El resultado es el INNER JOIN de ambas tablas más los departamentos donde no hay
empleados en este momento.
REFERENCIAS
Bases de datos: UOC software libre
Fundamentos de Sistemas de bases de datos (5ª Edición) – PEARSON Addison Wesley
Aprende SQL (2ª Edición) – Anaya Multimedia O’REALLY
http://es.wikipedia.org/
http://www.jorgesanchez.net/bd/index.html
http://mysql.conclase.net/curso/index.php
31