Bd Gicd Tema5 Ansisql+Mysql

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

GRADO EN GESTIÓN DE INFORMACIÓN Y CONTENIDOS DIGITALES

FACULTAD DE COMUNICACIÓN Y DOCUMENTACIÓN


Universidad de Murcia

TEMA 5.
EL LENGUAJE RELACIONAL
SQL
Asignatura: Bases de Datos
Tema 5. El lenguaje relacional SQL
2

Objetivos
 Conocer la sintaxis del lenguaje SQL con el fin de

escribir sentencias de definición, modificación o


eliminación de estructuras de datos, así como
sentencias de consulta de los datos ya almacenados
en una base de datos relacional
 Distinguir entre las sentencias de definición de datos

(LDD) y las de manipulación de datos (LMD) del


lenguaje SQL
Tema 5. El lenguaje relacional SQL
3

Contenidos
 Introducción

 Definición de datos
 CREATE TABLE, DROP TABLE
 Con un inciso: Datos Lógicos o Booleanos
 Recuperación o Selección de datos
 SELECT
 Modificación de datos
 INSERT, UPDATE, DELETE
Tema 5. El lenguaje relacional SQL
4

Bibliografía
 [CB 2015] Connolly, T.M.; Begg C.E.: Database
Systems: A Practical Approach to Design,
Implementation, and Management, 6th Edition.
Pearson. (Capítulos 5,6y7)
 [EN 2016] Elmasri, R.; Navathe, S.B.: Fundamentals of

Database Systems, 7th Edition. Pearson. (Cap. 6,7y8)


El Lenguaje Relacional SQL
5

 Structured Query Language (lenguaje estructurado de consulta)


 Primer lenguaje de BD de alto nivel. Años 70
 Diseñado e implementado en el IBM’s Research Laboratory (San José -
California), para el SGBD Relacional experimental “System R”
 Definición de un lenguaje estándar para SGBDR
ANSI (American National Standards Institute)
+ ISO (International Standardization Organization)
 SQL-86, extendido en 1989 (SQL-89)
 SQL-92
 Versiones (extensiones) posteriores
◼ SQL:1999 (características de Orientación a Objetos, disparadores, …)
◼ SQL:2003 (incluye XML...)
◼ SQL:2006, SQL:2008, SQL:2011, SQL:2016 (actual) y SQL-2019 (en borrador)
 Primeras implementaciones en 1979
 ORACLE y poco después INGRES
El lenguaje relacional SQL
6

 Lenguaje de BD completo (no sólo «de consulta»):


Los comandos están organizados en...
 El Lenguaje de Definición de Datos (LDD)
◼ Para crear, modificar y eliminar estructuras de datos (tablas,…)
◼ Instrucciones CREATE, ALTER, DROP
 El Lenguaje de Manipulación de Datos (LMD)
◼ Para introducir datos en las tablas, actualizarlos y eliminarlos
◼ Órdenes INSERT, UPDATE, DELETE
◼ Extraer (recuperar o seleccionar) datos almacenados
◼ Sentencia SELECT
 Los proveedores de SGBDR comerciales (Oracle,
MySQL, MariaDB, Microsoft Access, etc.) implementan
variaciones o dialectos de SQL
 Algunos incluyen características que no están estandarizadas
Definición de Datos en SQL
7

 El Diseño Lógico Específico consiste en escribir el Esquema


Lógico con la sintaxis propia del modelo de datos particular
del SGBD comercial elegido
 Hemos elegido MySQL, así que debemos conocer el dialecto SQL
que ofrece para poder definir tablas
 Pero no tiene sentido que estudiemos “sólo un SQL específico”:
hemos de estudiar el SQL estándar ANSI, pues todos los SQL
comerciales se basan en él. De este modo, seremos capaces de
aprender rápidamente cualquier dialecto SQL de cualquier SGBD
comercial con el que tengamos que trabajar
 Sentencias o instrucciones que permiten definir (crear) nuevas
tablas, alterar su estructura y eliminar tablas:
 CREATE TABLE
 ALTER TABLE (no veremos esta sentencia)
 DROP TABLE
Definición de Datos

Creación de tablas
8

 Sentencia CREATE TABLE CREATE TABLE SOCIO (


 Define (crea) una tabla: codigo ...,
nombre, columnas y nombre ...,
restricciones telefono ...,
 Nombre único dentro del dni ...,
esquema penalizado ...,
 Para cada Columna fin_pena ...,
se puede indicar… ...
◼ nombre,
◼ tipo de datos (dominio) );
◼ restricciones de columna
 Restricciones de tabla...
◼ de clave candidata, En phpMyAdmin con MySQL el
nombre de la tabla distingue
◼ de clave ajena (integridad mayúsculas y minúsculas. Si se crea
referencial), y como “SOCIO” y luego se usa
◼ restricciones de otro tipo “socio” o “Socio” en las consultas,
surgirá un error indicando que la
tabla no existe
Definición de Datos

Creación de tablas
9

 Ordenamiento de columnas y filas


 Una vez creada la tabla, las columnas ‘quedan
ordenadas’ tal como aparecen en la instrucción
CREATE TABLE
 Las filas (contenido) no están ordenadas de ningún
modo concreto
◼ Quedan en el orden de inserción
 Las tablas creadas con CREATE TABLE son
denominadas tablas base
 Esosignifica que el SGBD las almacena físicamente en
algún fichero de la base de datos en disco
Definición de Datos

Definir columnas de tabla


10

 En la sentencia CREATE TABLE cada columna se define en


una línea
 La definición termina con una coma: ,
 Hay que especificar...
 El nombre de la columna
 El tipo de datos
◼ Cadena de caracteres (texto), fecha y hora, numérico (entero,
decimal, ... ), etc.
 Y restricciones de columna
CREATE TABLE SOCIO (
Veremos los tipos de datos del
... SQL estándar ANSI (teórico).
nombre VARCHAR(30) NOT NULL, Pero, ¡ojo! En las prácticas hay que
telefono INTEGER(9) NOT NULL, usar los que ofrece el SGBD que
DNI CHAR(9) NULL, se utilice (MySQL, MS Access,
... ); Oracle, etc.)
Definición de Datos

Tipos de datos de columna SQL-92


11

 Numéricos
 Enteros y Reales
◼ INTEGER (también INT), SMALLINT,
◼ REAL (simple precisión), DOUBLE PRECISION, FLOAT(p)

 Con formato
◼ NUMERIC(p,e) o DECIMAL(p,e) ( también DEC(p,e) )
p: precisión (número total de dígitos del número)
e: escala (cuantos dígitos, de los p totales, son decimales); el
valor por omisión de e=0
Ejemplo: NUMERIC(7,2) corresponde a números con 7 dígitos en
total, de los cuales 2 son decimales: 99.999,99
Definición de Datos

Tipos de datos de columna SQL-92


12

 Cadena de caracteres
 Longitud fija CHAR(n) n: nº de caracteres; por omisión n=1
 Longitud variable VARCHAR(n) n: máximo nº de caracteres

 Temporales
 DATE (10 posiciones) = YEAR, MONTH, DAY (yyyy-mm-dd)
 TIME (8 posiciones) = HOUR, MINUTE, SECOND (hh:mi:ss)
◼ Sólo permitidas fechas y horas válidas
 TIMESTAMP (marca de tiempo)
◼ Incluye DATE, TIME, fracciones de segundo
◼ Y, si se incluye WITH TIME ZONE, incluye desplazamiento respecto al
UTC (tiempo universal coordinado o huso horario estándar)
Definición de Datos

Tipos de datos en MySQL Estos tipos de datos son los que


podremos usar en las prácticas
13

Tipo de datos Descripción Uso


CHAR Un carácter (alfanumérico).
CHAR(n) Cadena de caracteres de exactamente n letras de longitud. El
rango de n es de 0 a 255. Nombres, códigos alfanuméricos,
descripciones, etc.
VARCHAR(n) Cadena de caracteres de entre 1 y n letras de longitud. El rango
de n es de 0 a 65.536.
DATE Fechas con formato 'YYYY-MM-DD’ Fechas
entre ‘1000-01-01’ a '9999-12-31'.
DATETIME Formato 'YYYY-MM-DD hh:mm:ss’ Fechas y horas
entre '1000-01-01 00:00:00’ y '9999-12-31 23:59:59’.
TIMESTAMP Igual formato que DATETIME, pero para fechas entre '1970-01-01 Fechas y horas expresada en tiempo
00:00:01' UTC y '2038-01-19 03:14:07' UTC. universal coordinado (UTC)
TIME Horas con formato 'hh:mi:ss’ entre '-838:59:59’ y '838:59:59'. Horas
YEAR Años con formato ‘YYYY’ entre 1901 y 2155, y el 0000. Años
INTEGER o INT Entero largo entre – 2.147.483.648 y 2.147.483.647. Datos numéricos que no necesiten
decimales.
DECIMAL o DEC Equivale a DECIMAL(m) y DECIMAL(m,0) Datos numéricos que necesiten decimales.
m suele ser 10 Por ejemplo, medidas de longitud, peso,
volumen, etc.
DECIMAL(p,e) p: precisión (dígitos en total).
e: escala (nº de decimales)
FLOAT(p) Valores de datos numéricos aproximados (números en punto Permite representar números reales
DOUBLE(p) flotante) extremadamente grandes o pequeños de
forma compacta y eficiente.
Definición de Datos

Definir Restricciones de Columna


14

 Además del nombre y del tipo de datos, la


definición de una columna puede incluir restricciones
de integridad que afectan a los valores de esa
columna:
 Cláusula NULL o NOT NULL
 Indica si una columna puede contener NULL o no
CREATE TABLE SOCIO (
...
nombre VARCHAR(30) NOT NULL,
...
DNI CHAR(9) NULL,
... );

 Por omisión (si no se indica nada), se asume NULL


Definición de Datos

Definir Restricciones de Columna


15

CREATE TABLE SOCIO (


codigo CHAR(4) NOT NULL,
nombre VARCHAR(30) NOT NULL,
telefono INTEGER(9) NOT NULL,
DNI CHAR(9),
penalizado CHAR(2) NOT NULL, Se asume NULL por omisión
fin_pena DATE,
... -- más columnas y restricciones
);

Se puede poner la longitud de un INTEGER, pero el SGBD


MySQL la obvia (y el compilador da un error leve: Warning
#1681).

En realidad indicar INTEGER(9) o INTEGER(12) es lo mismo


Las diapositivas con fondo gris
que poner sólo INTEGER contienen código escrito en el
SQL de MySQL
Definición de Datos

Definir Restricciones de Tabla


16

 Además de las columnas, la sentencia CREATE TABLE


incluye la definición de restricciones de integridad
que afectan al contenido de la tabla, es decir a
todas las filas:
 Cuál es la clave primaria
 Cuáles son las claves alternativas (si las hay)
 Qué columnas son claves ajenas (si las hay)
 Qué otras restricciones deben cumplir (si las hay) los
valores de ciertas columnas
 Cada restricción se define en una línea
Y finaliza con una coma, salvo la última
Definición de Datos

Definir Restricciones de Tabla


17

 Cláusula PRIMARY KEY (lista_columnas)


 Columnas (1 o más) que componen la clave primaria (PK)
◼ Identifican cada fila; los valores de estas columna
concatenados son únicos: ninguna otra fila contiene los mismos
 Ningún componente de la PK puede contener NULL
 En SQL estándar ANSI, se asume NOT NULL por omisión
para cada columna componente de la clave primaria
◼ Es decir, ya incluye la Restricción de Integridad de Entidad
◼ Sin embargo, MySQL obliga a definir explícitamente como
NOT NULL toda columna que forme parte de la clave primaria
 Un CREATE TABLE debe
incluir una y sólo una
cláusula PRIMARY KEY
Definición de Datos

Definir Restricciones de Tabla


18

 Cláusula UNIQUE (lista_columnas)


 Columnas (1 o más) que forman una clave alternativa
◼ Columnas cuyo valor concatenado no se puede repetir: no
hay dos filas con el mismo valor para estas columnas
CREATE TABLE SOCIO(
codigo CHAR(4) NOT NULL, NOT NULL obligatorio, pues
“codigo” es la clave primaria
nombre VARCHAR(30) NOT NULL,
telefono INTEGER(9) NOT NULL,
DNI CHAR(9),
penalizado CHAR(2) NOT NULL,
fin_pena DATE,
El código con PRIMARY KEY (codigo),
fondo gris UNIQUE (DNI)
está escrito Aquí ya no se pone una coma, por ser la última línea.
en el SQL de ); A continuación va el paréntesis de cierre y el ; de la
MySQL instrucción CREATE TABLE
Definición de Datos

Definir Restricciones de Tabla


19

 Sí se permite que una clave UNIQUE contenga NULL


CREATE TABLE PACIENTE (
num_historial CHAR(15) NOT NULL,
DNI CHAR(9) NULL,
nombre VARCHAR(60) NOT NULL,
f_nacimiento DATE NOT NULL,
PRIMARY KEY (num_historial),
UNIQUE (DNI), El código con fondo
-- más cosas...); gris está escrito en
el SQL de MySQL
◼ num_historial es la clave primaria
◼ DNI es clave alternativa y puede contener NULL, p.ej. para
pacientes de poca edad, para los cuales aún no se ha
expedido el DNI
Definición de Datos

Definir Restricciones de Tabla


20

 Hay que incluir una cláusula UNIQUE para cada una de las
claves alternativas que tenga la tabla

CREATE TABLE ESTUDIANTE (


DNI CHAR(9) NOT NULL, NOT NULL obligatorio, pues
DNI es la clave primaria
expediente INTEGER(6) NOT NULL,
nombre VARCHAR(60) NOT NULL,
email VARCHAR(35) NOT NULL,
El código con PRIMARY KEY (DNI),
fondo gris UNIQUE (expediente),
está escrito
en el SQL de UNIQUE (email)
MySQL
);  Un CREATE TABLE puede
incluir ninguna, una o
muchas cláusulas UNIQUE
Definición de Datos

Definir Restricciones de Tabla


21

Las diapositivas
 Una clave UNIQUE puede ser compuesta con fondo gris
contienen código
escrito en el SQL
de MySQL
CREATE TABLE PACIENTE (
num_historial CHAR(15) NOT NULL,
DNI CHAR(9) NULL,
nombre VARCHAR(60) NOT NULL,
f_nacimiento DATE NOT NULL,
NSS INTEGER(12) NOT NULL,
PRIMARY KEY(num_historial),
UNIQUE (DNI),
UNIQUE (NSS, f_nacimiento)
); Dos pacientes pueden tener el mismo
Tiene 2 claves alternativas: hay NSS (por ejemplo, varios niños
que definirlas por separado hermanos que como pacientes usan el
NSS de uno de sus progenitores).
Por eso NSS en solitario no es clave
Definición de Datos

Definir Restricciones de Tabla


22

 Cláusula FOREIGN KEY(lista_columnas)


REFERENCES tabla(lista_columnas)
 Definición de las columnas clave ajena o externa
◼ Asegura la Integridad Referencial
◼ Los valores de las columnas clave ajena deben existir en la
columna clave primaria a la que hacen referencia
 Cada clave ajena debe estar formada por tantas
columnas como tenga la clave primaria a la que
referencia
 Cada columna de la clave ajena debe tener el mismo
tipo de datos que la columna correspondiente de la
clave primaria a la que referencia
Definición de Datos

Definir Restricciones de Tabla


Las diapositivas con fondo gris
23 contienen código escrito en el
SQL de MySQL
CREATE TABLE EJEMPLAR (
ISBN CHAR(13) NOT NULL,
numero INTEGER(2) NOT NULL,
estante CHAR(4) NOT NULL, Clave primaria compuesta
por dos columnas
PRIMARY KEY (ISBN, numero),
FOREIGN KEY (ISBN) REFERENCES LIBRO(ISBN)
);
CREATE TABLE PRESTAMO (
libro CHAR(13) NOT NULL,
ejemplar INTEGER(2) NOT NULL,
socio CHAR(4) NOT NULL,
fecha DATE NOT NULL, Clave primaria compuesta
devolucion DATE NOT NULL, por 4 columnas
PRIMARY KEY (libro, ejemplar, socio, fecha),
FOREIGN KEY (libro, ejemplar) Clave ajena compuesta por 2 columnas,
porque la clave primaria de EJEMPLAR
REFERENCES EJEMPLAR(ISBN, numero), está compuesta por 2 columnas
FOREIGN KEY (socio) REFERENCES SOCIO(codigo)
); El tipo de datos de cada columna de la clave ajena debe ser el mismo que
el del correspondiente columna dentro de la clave primaria referenciada
Definición de Datos

Definir Restricciones de Tabla


24

 Dar nombre a una restricción de integridad es


opcional en SQL-92, y también en SQL de MySQL,
pero se recomienda su uso
 CONSTRAINT nombre_RI
 El nombre_RI debe ser único dentro del mismo
esquema de bases de datos: dos tablas distintas no
pueden tener restricciones con el mismo nombre
 MySQL obvia el nombre que le demos a la restricción
PRIMARY KEY(...), pues para cada tabla siempre le
asigna el nombre PRIMARY
Definición de Datos

Definir Restricciones de Tabla


25

CREATE TABLE SOCIO(


NOT NULL obligatorio, pues es
codigo CHAR(4) NOT NULL, clave primaria
nombre VARCHAR(30) NOT NULL,
telefono INTEGER(9) NOT NULL,
DNI CHAR(9), Se asume NULL por omisión
penalizado CHAR(2) NOT NULL,
fin_pena DATE,
CONSTRAINT socio_pk PRIMARY KEY (codigo),
CONSTRAINT socio_ak UNIQUE (DNI)
);
CREATE TABLE EJEMPLAR(
ISBN CHAR(13) NOT NULL,
numero INTEGER(2)NOT NULL,
estante CHAR(4) NOT NULL,
CONSTRAINT ejemplar_pk PRIMARY KEY (ISBN, numero),
CONSTRAINT ejemplar_fk_libro
El tipo de datos de cada clave
FOREIGN KEY (ISBN) REFERENCES LIBRO(ISBN) ajena debe ser el mismo que el
); de la clave primaria a la que
referencia
Definición de Datos

Definir Restricciones de Tabla


26

 Otro ejemplo de Clave Ajena compuesta


 Por ser compuesta la clave primaria a la que referencia
CREATE TABLE HOTEL(
codigo CHAR(4) NOT NULL,
nombre CHAR(30) NOT NULL,
... --otras columnas
CONSTRAINT hotel_pk PRIMARY KEY(codigo)
);
CREATE TABLE SALON_HOTEL(
idSalon CHAR(2) NOT NULL, La clave primaria está
hotel CHAR(4) NOT NULL, compuesta por dos columnas
capacidad INT(3) NOT NULL,
... --otras columnas
CONSTRAINT salon_pk PRIMARY KEY (hotel, idSalon),
CONSTRAINT salon_fk_hotel FOREIGN KEY(hotel)
REFERENCES HOTEL(codigo)
);
 Cada salón referencia al hotel en el cual está ubicado (clave ajena)
Definición de Datos

Definir Restricciones de Tabla


27

 Ejemplo de Clave Ajena compuesta (continuación)


 La tabla RESERVA_SALON almacena las distintas reservas de los
salones de cada hotel que se ha hecho a lo largo del tiempo
CREATE TABLE RESERVA_SALON(
numero INT(5) NOT NULL,
hotel CHAR(4) NOT NULL,
salon CHAR(2) NOT NULL, La clave ajena debe estar
fecha DATE NOT NULL, compuesta por dos columnas
... --otras columnas
CONSTRAINT reserva_pk PRIMARY KEY(numero),
CONSTRAINT reserva_fk_salon FOREIGN KEY(hotel,salon)
REFERENCES SALON_HOTEL(hotel,idSalon)
);
 La referencia debe ser hacia la tabla SALON_HOTEL, puesto que
cada reserva se refiere a cierto salón en concreto
◼ No tiene sentido hacer referencia en solitario a la tabla HOTEL, por ejemplo
◼ Puesto que la clave primaria de SALON_HOTEL tiene dos columnas, también las
debe tener la clave ajena
Definición de Datos

Definir Restricciones de Tabla


28

HOTEL
codigo
aa nombre …
SALON_HOTEL
H001 ZENIT hotel idSalon capacidad …
H002 NH AMISTAD H001 S1 60
H003 HESPERIA H001 S2 50
H004 NELVA H001 S3 100
H005 CAMPANILE H002 S1 85
H006 IBIS H002 S2 50
H003 S1 25 RESERVA_SALON
numero hotel salon fecha …
H004 S1 95
H004 S2 50 2 H001 S2 14/09/2019
H004 S3 85 3 H001 S1 14/09/2019
5 H002 S1 15/10/2019
1 H002 S2 09/09/2019
Un mismo salón 6 H003 S1 19/10/2019
puede ser 7 H004 S1 20/10/2019
reservado varias 4 H001 S1 09/10/2019
veces
8 H004 S1 18/11/2019
Datos Lógicos o Booleanos
29

 Un dato booleano o lógico es aquél que puede


representar dos valores:
 TRUE (verdadero), o
 FALSE (falso)

 Estos valores se generan aplicando operadores de


comparación u operadores lógicos a otros valores de
otros tipos de datos
 Operadores de comparación: >, <, >=, <=, =, <>
Corresponden a los tradicionales >, <, , , =, 
◼ (47 > 10) = TRUE
◼ (8 <= 6) = FALSE
 Operadores lógicos o booleanos: AND, OR, NOT
Datos Lógicos o Booleanos
30

 En realidad en nuestro lenguaje natural utilizamos


constantemente los datos lógicos y la aplicación de
operadores que los generan…
 ¿Esteestudiante ha aprobado la asignatura?
O lo que es equivalente: ¿Su nota es superior a 5 puntos?
◼ Posibles resultados: Sí (TRUE) o No (FALSE)
 ¿Saturnina es más alta que Clodomiro?
◼ Posibles resultados: Sí (TRUE) o No (FALSE)
 ¿Este empleado pertenece al departamento de
Investigación?
◼ Posibles resultados: Sí (TRUE) o No (FALSE)
Datos Lógicos o Booleanos
31

 Los operadores de comparación se aplican a dos


valores numéricos o a dos cadenas de caracteres (texto)
para producir un valor TRUE o FALSE
Operador Operación Ejemplo
- a y b numéricos: devuelve TRUE si el dato a es mayor (o 55 > 23 → TRUE
igual) que b 23 > 55 → FALSE
a>b
- a y b cadenas de caracteres: obtiene TRUE si a es
a >= b
posterior alfabéticamente (o igual) a b. ‘aa’ >= ‘BB’ → FALSE
En otro caso, devuelve FALSE. ‘BB’ >= ‘aa’ → TRUE
- a y b numéricos: devuelve TRUE si el dato a es menor (o
55 < 23 → FALSE
igual) que b
a<b 23 < 55 → TRUE
- a y b cadenas de caracteres: devuelve TRUE si a es
a <= b ‘aa’ <= ‘BB’ → TRUE
anterior alfabéticamente (o igual) a b.
‘BB’ <= ‘aa’ → FALSE
En otro caso, devuelve FALSE.
Devuelve TRUE si a y b son iguales. 35 = 35 → TRUE
=
Devuelve FALSE si son distintos. ‘aa’ = ‘BB’ → FALSE
Devuelve TRUE si a y b son distintos. 35 <> 35 → FALSE
<>
Devuelve FALSE si a es igual a b. ‘aa’ <> ‘BB’ → TRUE
Datos Lógicos o Booleanos
32

 Los operadores Lógicos AND, OR y NOT combinan los


resultados de otras condiciones para…
 Invertir el resultado de una condición (NOT)
 Producir un resultado basado en dos condiciones (AND, OR)

Opera Operación Ejemplo


dor
Devuelve TRUE si la condición es FALSE. NOT (55 > 23) → FALSE
NOT
Devuelve FALSE si la condición es TRUE. NOT (‘aa’ = ‘BB’) → TRUE
Devuelve TRUE si ambas condiciones
(55 > 23) AND (‘aa’ = ‘BB’) → FALSE;
AND son TRUE.
(55 > 23) AND (‘aa’ <> ‘BB’) → TRUE;
Devuelve FALSE si alguna es FALSE.
Devuelve TRUE si alguna condición es
(55 > 23) OR (‘aa’ = ‘BB’) → TRUE;
OR TRUE.
(55 < 23) OR (‘aa’ = ‘BB’) → FALSE;
Devuelve FALSE si ambas son FALSE.
Datos Lógicos o Booleanos
33

 Ejemplos para comprender los operadores AND, OR y NOT


 ¿Sinforoso ha aprobado la teoría AND ha entregado la práctica?
◼ Si ha aprobado la teoría y ha entregado la práctica, es TRUE
◼ Si no ha aprobado la teoría y sí ha entregado la práctica, es FALSE
◼ Si ha aprobado la teoría y no ha entregado la práctica, es FALSE
◼ Si no ha aprobado la teoría y no ha entregado la práctica, es FALSE
 ¿Saturnina es más alta que Clodomiro OR tiene más de 18 años?
◼ Si es más alta y no tiene más de 18, es TRUE
◼ Si no es más alta y sí tiene más de 18, es TRUE
◼ Si es más alta y tiene más de 18, es TRUE
◼ Si no es más alta y no tiene más de 18, es FALSE
 ¿Bonifacio NOT está matriculado de Bases de Datos?
◼ Si sí está matriculado, es FALSE
◼ Si no está matriculado, es TRUE
Definición de Datos

Definir Restricciones de Tabla


34

 Cláusula CHECK (expresión)


 Permite definir una condición sobre los valores de ciertas
columnas que debe cumplir toda fila de la tabla
*El salario de todo empleado es como mínimo 600€
CREATE TABLE EMPLEADO (
...,
Esto obliga a que todas las
CONSTRAINT emp_salario filas de EMPLEADO hagan
CHECK (salario  600), TRUE esta condición

... );
 Puede definir restricciones que involucran varias columnas
*Toda película se estrena tras finalizar su rodaje
CREATE TABLE PELICULA ( Esto obliga a que todas las
filas de PELICULA hagan
..., TRUE esta condición
CONSTRAINT peli_fechas
CHECK (fecha_fin_rodaje < fecha_estreno),
... );
Definición de Datos

Restricciones CHECK en MySQL


35

 La cláusula CHECK se puede colocar como parte de la definición


de una columna, para permitir sólo ciertos valores
*El salario de todo empleado es superior a 600€
CREATE TABLE EMPLEADO ( Importante el espacio
..., entre CHECK y el (
salario DECIMAL(6,2) NOT NULL CHECK (salario >= 600),
... );
 Dependiendo de la versión del SGBD MySQL instalado, es
posible darle nombre y/o colocarla por separado, fuera de la
definición de las columnas
 Esto permite que la comprobación incluya más de una columna de la tabla
 Pero en la versión que usamos en prácticas NO está implementado aún
CREATE TABLE EMPLEADO (
..., Este CHECK da error por no estar
dentro de la definición de una columna
CHECK (salario >= 600),
CONSTRAINT emp_jefe_ok CHECK (nss <> nssjefe),
... ); Este CHECK tampoco funcionaría
porque además incluye 2 columnas
Definición de Datos: Nuestro ejemplo

Esquema Lógico Específico


36

En SQL de MySQL
Descripción de tabla (Esquema Lógico Estándar)
EDITORIAL(nombre, calle, numero, cod_post, ciudad)
Admiten nulos: codpost
Clave primaria: nombre

Definición de tabla (Esquema Lógico Específico)


CREATE TABLE EDITORIAL(
nombre VARCHAR(15) NOT NULL,
calle VARCHAR(20) NOT NULL,
numero INTEGER(3) NOT NULL,
cod_post CHAR(6) NULL,
ciudad VARCHAR(15) NOT NULL,
CONSTRAINT editorial_pk PRIMARY KEY (nombre)
);
Definición de Datos: Nuestro ejemplo

Esquema Lógico Específico (MySQL)


37

LIBRO(ISBN, titulo, año, edicion, num_copias, editorial)


Admiten nulos: Ninguno
Clave primaria: ISBN
Clave ajena: editorial Referencia_a EDITORIAL(nombre)
Derivado: num_copias
CREATE TABLE LIBRO(
ISBN CHAR(13) NOT NULL,
titulo VARCHAR(64) NOT NULL,
año YEAR NOT NULL,
edicion INTEGER(2) NOT NULL,
num_copias INTEGER(3) NOT NULL,
editorial VARCHAR(15) NOT NULL,
CONSTRAINT libro_pk PRIMARY KEY (ISBN),
CONSTRAINT libro_fk_editorial
FOREIGN KEY (editorial)
REFERENCES EDITORIAL(nombre)
);
Definición de Datos: Nuestro ejemplo

Esquema Lógico Específico (MySQL)


38

EJEMPLAR(numero, estante, ISBN)


Admiten nulos: Ninguno
Clave primaria: (ISBN, numero)
Clave ajena: ISBN Referencia_a LIBRO(ISBN)

CREATE TABLE EJEMPLAR(


ISBN CHAR(13) NOT NULL,
numero INTEGER(2)NOT NULL,
estante CHAR(4) NOT NULL,
CONSTRAINT ejemplar_pk PRIMARY KEY (ISBN, numero),
CONSTRAINT ejemplar_fk_libro
FOREIGN KEY (ISBN) REFERENCES LIBRO(ISBN)
);
Definición de Datos: Nuestro ejemplo

Esquema Lógico Específico (MySQL)


39

SOCIO(codigo, nombre, telefono, DNI, penalizado, fin_pena)


Admiten nulos: DNI, fin_pena
Clave primaria: codigo
Clave alternativa: DNI
Comprobación: penalizado IN (‘SI’, ‘NO’)

CREATE TABLE SOCIO(


codigo CHAR(4) NOT NULL,
nombre VARCHAR(30) NOT NULL,
telefono INTEGER(9) NOT NULL,
DNI CHAR(9) NULL,
penalizado CHAR(2) NOT NULL
CHECK (penalizado IN ('SI','NO')),
fin_pena DATE NULL,
CONSTRAINT socio_pk PRIMARY KEY (codigo),
CONSTRAINT socio_ak UNIQUE (DNI)
);
Definición de Datos: Nuestro ejemplo

Esquema Lógico Específico (MySQL)


40

PRESTAMO(libro, ejemplar, socio, fecha, devolucion)


Admiten nulos: Ninguno
Clave primaria: (libro, ejemplar, socio, fecha)
Clave ajena: (libro, ejemplar) Referencia_a EJEMPLAR(ISBN, numero)
Clave ajena: socio Referencia_a SOCIO(codigo)
CREATE TABLE PRESTAMO(
libro CHAR(13) NOT NULL,
ejemplar INTEGER(2) NOT NULL,
socio CHAR(4) NOT NULL,
fecha DATE NOT NULL,
devolucion DATE NOT NULL,
CONSTRAINT prestamo_pk
PRIMARY KEY (libro, ejemplar, socio, fecha),
CONSTRAINT prestamo_fk_ejemplar
FOREIGN KEY (libro, ejemplar)
REFERENCES EJEMPLAR(ISBN, numero),
CONSTRAINT prestamo_fk_socio
FOREIGN KEY (socio) REFERENCES SOCIO(codigo)
);
Definición de Datos: Nuestro ejemplo

Esquema Lógico Específico (MySQL)


41

AUTOR(id,nombre,apellido1,apellido2,año_nacim,pais,num_premios)
Admiten nulos: apellido2
Clave primaria: id
Comprobación: (num_premios>0 AND num_premios<99)

CREATE TABLE AUTOR(


id CHAR(2) NOT NULL,
nombre VARCHAR(20) NOT NULL,
apellido1 VARCHAR(15) NOT NULL,
apellido2 VARCHAR(15) NULL,
año_nacim YEAR NOT NULL,
pais VARCHAR(30) NOT NULL,
num_premios INTEGER(2) NOT NULL DEFAULT 0
CHECK (num_premios>=0),
CONSTRAINT autor_pk PRIMARY KEY (id)
);
Definición de Datos: Nuestro ejemplo

Esquema Lógico Específico (MySQL)


42

ESCRITO_POR(libro, autor)
Admiten nulos: Ninguno
Clave primaria: (libro, autor)
Clave ajena: libro Referencia_a LIBRO(ISBN)
Clave ajena: autor Referencia_a AUTOR(id)

CREATE TABLE ESCRITO_POR(


libro CHAR(13) NOT NULL,
autor CHAR(2) NOT NULL,
CONSTRAINT escrito_por_pk PRIMARY KEY(libro, autor),
CONSTRAINT escrito_por_fk_libro
FOREIGN KEY (libro) REFERENCES LIBRO(ISBN),
CONSTRAINT escrito_por_fk_autor
FOREIGN KEY(autor) REFERENCES AUTOR(id)
);
Definición de Datos

Eliminar tablas
43

SQL de MySQL
 Sentencia DROP TABLE
DROP TABLE EMPLEADO;
 Destrucción de una tabla (estructura y contenido)
◼ Eliminasus filas (liberando el espacio reservado)
◼ La tabla desaparece del esquema de base de datos
◼ Y se borra su definición del Diccionario de Datos (metadatos)

 Sólose destruye la tabla si no se le hace referencia


desde ninguna otra
◼ Sino existe una clave ajena en otra tabla que haga
referencia a alguna columna de la tabla que se desea
borrar
Recuperación de datos en SQL
44

 SQL permite extraer información almacenada en las tablas


de una base de datos (sentencia SELECT)
 Ejemplo: “Listado de nombres y salarios de los empleados del
departamento INVESTIGACION”
 Es necesario escribir las consultas utilizando un conjunto de
instrucciones y cláusulas concretas, de modo que el SGBD
pueda entenderlas
 Hay que escribir la consulta indicando qué datos queremos
extraer: qué condiciones deben cumplir
 Ejemplo: “Mostrar los nombres y apellidos de los empleados que
viven en Yecla”
◼ Deben ser filas de la tabla EMPLEADO tales que su ciudad (valor de la
columna “ciudad”) es igual a ‘YECLA’
 …y el SGBD interpretará la consulta, buscará los datos en la
BD, y los devolverá como resultado
SQL. Running Example
45

EMPLEADO
nombre apellido nss dni fechanacim ciudad estadocivil salario nssjefe dep

DEPARTAMENTO
nombre coddep nssdire

FAMILIAR
nssemp numero nombre sexo fechanacim parentesco

 Un esquema de base de datos “Empresa” (simplificado)


SQL. Running Example

Esquema Lógico Específico (MySQL)


46

CREATE TABLE EMPLEADO (


nombre VARCHAR(25) NOT NULL,
apellido VARCHAR(15) NOT NULL,
nss INTEGER NOT NULL,
dni CHAR(9) NOT NULL,
fechanacim DATE NULL,
ciudad VARCHAR(30),
estadocivil CHAR(1)
CHECK (estadocivil IN ('S','C','V','D','P')),
salario DECIMAL(6,2) DEFAULT 1000 NOT NULL
CHECK (salario>600), Este CHECK daría
nssjefe INTEGER, -- CHECK (nssjefe<>nss) error por afectar a
dep CHAR(3) NULL, varias columnas
cuantos_familiares INTEGER DEFAULT 0 NOT NULL,
CONSTRAINT emp_pk PRIMARY KEY (nss),
CONSTRAINT emp_ak UNIQUE (dni),
CONSTRAINT emp_fk_emp FOREIGN KEY (nssjefe)
REFERENCES EMPLEADO(nss)
); Importante: no es posible incluir la clave ajena para hacer referencia al
departamento (columna dep), porque aún no se ha creado la tabla DEPARTAMENTO
SQL. Running Example

Esquema Lógico Específico (MySQL)


47

CREATE TABLE DEPARTAMENTO (


nombre VARCHAR(20) NOT NULL,
coddep CHAR(3) NOT NULL,
nssdire INTEGER NULL,
CONSTRAINT dep_pk PRIMARY KEY (coddep),
CONSTRAINT dep_ak UNIQUE(nssdire),
CONSTRAINT dep_fk_emp FOREIGN KEY (nssdire)
REFERENCES EMPLEADO(nss);
);
/* Una vez que se ha creado la tabla DEPARTAMENTO
ya se puede definir la clave ajena desde EMPLEADO
a DEPARTAMENTO: */
ALTER TABLE EMPLEADO ADD
CONSTRAINT emp_fk_dep FOREIGN KEY (dep)
REFERENCES DEPARTAMENTO(coddep);
SQL. Running Example

Esquema Lógico Específico (MySQL)


48

CREATE TABLE FAMILIAR (


nssemp INTEGER NOT NULL,
numero INTEGER NOT NULL CHECK (numero > 0),
nombre VARCHAR(25) NOT NULL,
sexo CHAR(1) NOT NULL
CHECK (sexo IN ('H', 'M')),
fechanacim DATE NOT NULL,
parentesco VARCHAR(10) NOT NULL
CHECK (parentesco IN ('MADRE','PADRE',
'HIJO', HIJA', 'ABUELO', 'ABUELA’,
'SOBRINO', 'SOBRINA', 'TIA', 'TIO')),
CONSTRAINT fam_pk PRIMARY KEY (nssemp, numero),
CONSTRAINT fam_fk_emp FOREIGN KEY (nssemp)
REFERENCES EMPLEADO(nss)
);
SQL. Running Example

Ejemplo: un Estado del esquema


49
EMPLEADO
nombre apellido nss dni fechanacim ciudad estadocivil salario nssjefe dep
JONÁS SOLANO 123 11A 10/10/1945 MURCIA P 1100 111 D1
RIGOBERTA CALAVERA 321 21C 12/11/1974 YECLA C 900 333 D3
EUSEBIO MULETAS 222 22B 01/01/1969 TOTANA D 2100 123 D2
MACARENO SOSO 111 23D 06/04/1944 JUMILLA S 1100 NULL D1
CASIANA FABERGÉ 333 33B 15/06/1943 MURCIA V 920 123 D3
FILOMENA RASCAS 234 34E 18/07/1970 MURCIA C 1100 111 D1
GUMERSINDA MIMOS 543 45F 10/02/1980 PINOSO P 850 NULL NULL
FAMILIAR
DEPARTAMENTO
nssemp numero nombre sexo fechanacim parentesco
nombre coddep nssdire
123 1 JONÁS H 17/05/1992 HIJO
321 2 RÓMULA M 23/09/1923 ABUELA INVESTIGACION D2 222
222 1 ELEUTERIO H 30/10/2002 HIJO ADMINISTRACION D1 111
321 1 RENATA M 10/03/2002 HIJA PERSONAL D3 333
111 1 JULIANA M 10/10/1936 MADRE
TRAINING D4 NULL
321 3 TORCUATA M 17/05/1938 ABUELA
111 1 SINFOROSA M 23/09/1947 ABUELA
Recuperación de Datos

SQL. Sentencia SELECT


50

 Instrucción básica de obtención de información


SELECT lista_columnas
FROM lista_tablas
WHERE condición ;  siempre termina con un punto y coma
 La consulta selecciona las filas de lista_tablas
que satisfacen condición y
proyecta el resultado sobre las columnas de lista_columnas
 Resultado: Tabla con las con las columnas indicadas
y las filas seleccionadas
* DNI y ciudad del empleado con apellido ‘RASCAS’
SELECT dni, ciudad
dni ciudad
FROM EMPLEADO
WHERE apellido = 'RASCAS'; 34E MURCIA
Recuperación de Datos

SQL. Consultas básicas


51

* Código y nombre del departamento dirigido por el/la empleadx con NSS 111
SELECT coddep, nombre
FROM DEPARTAMENTO
WHERE nssdire = 111;
* Nombres, apellidos y estado civil de lxs empleadxs que no estén solterxs
SELECT nombre, apellido, estadocivil
FROM EMPLEADO
WHERE estadocivil <> 'S';
* Nombres de lxs familiares que tienen parentesco ‘HIJO’ con algún/a empleadx
SELECT nombre
FROM FAMILIAR
WHERE parentesco = 'HIJO';
* NSS y nombre de empleadxs del departamento ‘D3’ que cobran más de 910€
SELECT nss, nombre
FROM EMPLEADO
WHERE dep = 'D3' AND salario > 910;
Recuperación de Datos

SQL. Consultas básicas


52

 Cualquier nº de condiciones (selección/reunión) en SELECT


* Para cada empleadx del departamento D2 o del D3, que viva en Murcia y
tenga un salario no superior a 1000€, obtener su dni, nombre y estado civil
SELECT dni, nombre, estadocivil
FROM EMPLEADO dni nombre estadocivil
WHERE (dep = 'D2' OR dep = 'D3') 33B CASIANA V
AND (ciudad = 'MURCIA')
AND NOT (salario > 1000);

 Una SELECT puede obtener filas repetidas


salario
 No se eliminan las filas duplicadas de forma automática
1100
* Salario de lxs empleadxs 900
SELECT salario 2100
FROM EMPLEADO 1100
WHERE dep = 'D1' OR dep = 'D2' OR dep = 'D3'; 920
1100
Recuperación de Datos

SQL. SELECT. Uso de *


53

 Obtención de los valores de todas las columnas de las


filas seleccionadas
 Uso del símbolo * (asterisco, que significa “todas las columnas”)
 No es necesario listar todos los nombres tras la cláusula SELECT
SELECT *
FROM EMPLEADO
WHERE dep = 'D1';
nombre apellido nss dni fechanacim ciudad estadocivil salario nssjefe dep
JONÁS SOLANO 123 11A 10/10/1945 MURCIA P 1100 111 D1

MACARENO SOSO 111 23D 06/04/1944 JUMILLA S 1100 NULL D1

FILOMENA RASCAS 234 34E 18/07/1970 MURCIA C 1100 111 D1

SELECT *
nombre coddep nssdire
FROM DEPARTAMENTO
WHERE nombre = 'INVESTIGACION'; INVESTIGACION D2 222
Recuperación de Datos

SQL. SELECT. Cadenas de caracteres


54

 Operador LIKE
 Comparación de cadenas de caracteres (textos)
 Suele usar caracteres reservados (comodines):
‘%’ significa “una cantidad cualquiera de caracteres (letras y dígitos)”
‘_’ significa “un solo carácter (una letra o un dígito)”
* Nombres y apellidos de empleadxs de Las Torres de Cotillas o Cabezo de Torres
SELECT nombre, apellido
FROM EMPLEADO
WHERE ciudad LIKE '%TORRES%' ;

* Nombres y fecha de nacimiento de lxs familiares padres o madres de empleadxs


SELECT nombre, fechanacim
FROM FAMILIAR
WHERE parentesco LIKE '_ADRE' ;
Recuperación de Datos

SQL. SELECT. Aritmética


55

 Operaciones aritméticas
 Aplicación de operadores aritméticos ( +, -, *, / ) sobre valores
numéricos
 Se muestra el resultado de la operación, pero no se modifica
ningún dato almacenado en la tabla
* ¿Cómo quedarían los salarios de lxs empleadxs del departamento D3 tras
un aumento del 10% ? apellido nombre 1.1*salario
SELECT apellido, nombre, 1.1*salario CALAVERA RIGOBERTA 990
FROM EMPLEADO
WHERE dep = 'D3'; FABERGÉ CASIANA 1012

* ¿Cómo quedaría el salario de lxs empleadxs del departamento D2 si les


sumamos 200 euros?
SELECT apellido, nombre, salario+200
FROM EMPLEADO apellido nombre salario+200
WHERE dep = 'D2';
MULETAS EUSEBIO 2300
el valor de los salarios
en la tabla EMPLEADO no cambia
Recuperación de Datos

SQL. SELECT. NULL


56

 NULL
 No es un valor, sino una marca que indica desconocimiento o
ausencia de información
 Comparar NULL usando =, <>, >, >=, <, <=, con cualquier cosa
siempre da FALSE o UNKNOWN
◼ NULL es distinto a cualquier otra cosa, incluso a otro NULL

* Nombres y apellidos de lxs empleadxs sin supervisores


SELECT nombre, apellido nombre apellido
FROM EMPLEADO
WHERE nssjefe = NULL; (vacío)

◼ Resultado: tabla vacía, porque ninguna fila cumple la condición de


selección
◼ Para JONÁS SOLANO, por ejemplo, el valor de “nssjefe” es 111 y
111 no es igual a NULL. El resultado de la comparación es FALSE. Ok.
◼ Pero para MACARENO SOSO, el valor de “nssjefe” sí es NULL. Pero
NULL no es igual a nada, ni siquiera a otro NULL. Así que el resultado
también es FALSE. Ok.
Recuperación de Datos

SQL. SELECT. NULL


57

 Es necesario un comparador específico para comprobar si


una columna contiene o no el NULL
 Operador IS NULL , IS NOT NULL
v IS NULL
 Devuelve TRUE si v es NULL
v IS NOT NULL
 Devuelve TRUE si v no es un valor NULL

* Nombres y apellidos de lxs empleadxs sin supervisores


SELECT nombre, apellido nombre apellido
FROM EMPLEADO MACARENO SOSO
WHERE nssjefe IS NULL; GUMERSINDA MIMOS
Recuperación de Datos

SQL. SELECT. Orden de presentación


58

 SQL permite presentar las filas resultado de una consulta


de forma ordenada: Cláusula ORDER BY
 Ordenación según valores de una o varias columnas
 Ascendente ASC (por defecto) o Descendente DESC
 Suele ser una operación muy costosa
 Las filas no se ordenan en disco: se ven ordenadas, pero no
cambian dentro de su tabla
SELECT coddep, nombre SELECT nssemp, nombre, fechanacim, parentesco
FROM DEPARTAMENTO FROM FAMILIAR
ORDER BY nombre; ORDER BY nssemp, fechanacim DESC;

SELECT apellido, nombre, fechanacim


FROM EMPLEADO
WHERE ciudad = 'MURCIA'
ORDER BY apellido ASC, nombre DESC;
Recuperación de Datos

SQL. SELECT. Reunión (JOIN)


59

 Hasta ahora hemos realizado SELECTs que extraen


datos de una tabla: sólo 1 tabla en la claúsula FROM
 ¿Qué ocurre si necesitamos mostrar datos que están
almacenados en varias tablas?
 Eso es muy habitual en nuestro día a día:
* Estante en el que está el ejemplar número 2 del libro titulado
‘Yo, robot’ junto con el año de publicación de dicho libro.
* Nombre y año de nacimiento de cada empleadx junto con el
nombre y parentesco de sus familiares.
* Todos los datos del empleado ‘SOLANO’ junto con los datos
de su departamento.
* ISBN del libro con titulo ‘Mentira’ junto con el nombre y la
ciudad de su editorial.
Resolvamos esta última consulta…
Recuperación de Datos

SQL. SELECT. Reunión (JOIN)


60

* ISBN del libro con titulo ‘Mentira’ junto con el nombre y la


ciudad de su editorial
 Si lo hacemos “a mano”, buscamos en la tabla LIBRO la fila
que tiene como valor de “titulo” el texto ‘Mentira’
 Esa fila contiene los datos de dicho libro. Ya tenemos el
ISBN y el nombre de la editorial (‘Edebé’)
 Pero en LIBRO no se almacenan las ciudades de las
editoriales: eso está en la tabla EDITORIAL
 Hemos de buscar la fila de EDITORIAL cuyo valor de
“nombre” es ‘Edebé’, es decir, aquella fila a la que está
referenciando la fila del libro ‘Mentira’
 Y ahí encontramos la ciudad (‘Barcelona’)

 Resultado: ISBN nombre ciudad


9788468315775 Edebé Barcelona
Recuperación de Datos

SQL. SELECT. Reunión (JOIN)


61

EDITORIAL
nombre calle numero cod_post ciudad
Espasa Josefa Valcárcel 42 28027 Madrid
Santillana Avenida de los Artesanos 6 28760 Tres Cantos, Madrid
Edebé Paseo San Juan Bosco 62 08017 Barcelona

LIBRO
ISBN titulo año edicion num_copias editorial
9788408217251 Un científico en el supermercado 2019 1 14 Espasa
9788491223542 Malamandra 2019 5 5 Santillana
9788468315775 Mentira 2015 4 12 Edebé
9788467009101 Divina comedia 2010 50 25 Espasa
9788468319612 La nueva vida del señor Rutin 2014 23 16 Edebé
Recuperación de Datos

SQL. SELECT. Reunión (JOIN)


62

* Todos los datos del empleado ‘SOLANO’ junto con los datos de
su departamento
 Si lo hacemos “a mano”, buscamos en la tabla EMPLEADO la
fila que tiene el valor ‘SOLANO’ en la columna “apellido”
 Esa fila contiene los datos de dicho empleado. Pero no
tenemos todos los datos del departamento, sino sólo su
código ‘D1’ (columna “dep”)
 Los datos de los departamentos están en DEPARTAMENTO

 Hemos de buscar aquella fila de DEPARTAMENTO cuyo valor


de “coddep” es ‘D1’, es decir, aquella fila a la que está
referenciando la fila del empleado ‘SOLANO’
 Y ahí encontramos los datos del departamento de ‘SOLANO’

 Resultado: nombre apellido nss ... dep nombre coddep nssdire


JONÁS SOLANO 123 … D1 ADMINISTRACION D1 111
Recuperación de Datos

SQL. SELECT. Reunión (JOIN)


63
EMPLEADO
nombre apellido nss DNI fechanacim ciudad estadocivil salario nssjefe dep
JONÁS SOLANO 123 11A 10/10/1945 MURCIA P 1100 111 D1
RIGOBERTA CALAVERA 321 21C 12/11/1974 YECLA C 900 333 D3
EUSEBIO MULETAS 222 22B 01/01/1969 TOTANA D 2100 123 D2
MACARENO SOSO 111 23D 06/04/1944 JUMILLA S 1100 NULL D1
CASIANA FABERGÉ 333 33B 15/06/1943 MURCIA V 920 123 D3
FILOMENA RASCAS 234 34E 18/07/1970 MURCIA C 1100 111 D1
GUMERSINDA MIMOS 543 45F 10/02/1980 PINOSO P 850 NULL NULL
FAMILIAR
DEPARTAMENTO
nssemp numero nombre sexo fechanacim parentesco
nombre coddep nssdire
123 1 JONÁS H 17/05/1992 HIJO
321 2 RÓMULA M 23/09/1923 ABUELA INVESTIGACION D2 222
222 1 ELEUTERIO H 30/10/2002 HIJO ADMINISTRACION D1 111
321 1 RENATA M 10/03/2002 HIJA PERSONAL D3 333
111 2 JULIANA M 10/10/1936 MADRE
TRAINING D4 NULL
321 3 TORCUATA M 17/05/1938 ABUELA
111 3 SINFOROSA M 23/09/1947 ABUELA
Recuperación de Datos

SQL. SELECT. Reunión (JOIN)


64

 Lo que estamos haciendo es sacar información de dos


filas (cada una de una tabla distinta) que están
relacionadas entre sí
 Y ese vínculo entre ellas está representado mediante la
referencia que una fila (en una tabla ) tiene hacia la
otra (en otra tabla)
 Clave Ajena → Clave Primaria
 Bien ¿Y si en lugar de hacerlo solo para una fila (un solo
empleado), lo hacemos para todas las filas (todos los
empleados)?
Recuperación de Datos

SQL. SELECT. Reunión (JOIN)


65

* Para todo empleado, mostrar sus datos junto con los datos de
su departamento
 Es necesario combinar cada fila de la tabla EMPLEADO con
aquella fila de DEPARTAMENTO cuyo valor en “coddep” sea
igual al valor de “dep”
 Se consigue aplicando la operación REUNIÓN (JOIN) a las
dos tablas
SELECT *
FROM EMPLEADO, DEPARTAMENTO
WHERE dep = coddep;
Al poner las DOS tablas en la cláusula FROM
separadas por una coma, el SGBD entiende
que tiene que hacer una reunión entre ellas,
aplicando la cláusula WHERE
Recuperación de Datos

SQL. SELECT. Reunión (JOIN)


66

EMPLEADO DEPARTAMENTO
nombre apellido nss ... dep nombre coddep nssdire
JONÁS SOLANO 123 … D1 INVESTIGACION D2 222
RIGOBERTA CALAVERA 321 … D3 ADMINISTRACION D1 111
EUSEBIO MULETAS 222 … D2 PERSONAL D3 333
MACARENO SOSO 111 … D1 TRAINING D4 NULL
CASIANA FABERGÉ 333 … D3
FILOMENA RASCAS 234 … D1 SELECT *
GUMERSINDA MIMOS 543 … NULL FROM EMPLEADO, DEPARTAMENTO
WHERE dep = coddep;
nombre apellido nss ... dep nombre coddep nssdire
Resultado del JONÁS SOLANO 123 … D1 ADMINISTRACION D1 111
JOIN: una tabla RIGOBERTA CALAVERA 321 … D3 PERSONAL D3 333
con una fila por EUSEBIO MULETAS 222 … D2 INVESTIGACION D2 222
cada dos filas
MACARENO SOSO 111 … D1 ADMINISTRACION D1 111
vinculadas de las
CASIANA FABERGÉ 333 … D3 PERSONAL D3 333
tablas origen
FILOMENA RASCAS 234 … D1 ADMINISTRACION D1 111

Importante: En el resultado del JOIN no está la empleada GUMERSINDA MIMOS , ¿Por qué?
Tampoco aparece el departamento TRAINING. ¿Por qué?
Recuperación de Datos

SQL. SELECT. Reunión (JOIN)


67

* Datos de cada empleado junto con los datos de sus familiares


 ¿Cómo sabemos cuál es el empleado de cada familiar?

 Pues es aquel que tiene como “nss” el mismo valor que el familiar
tiene en “nssemp”
 Así, es necesario combinar cada fila de EMPLEADO con cada
fila de FAMILIAR tal que el valor de “nssemp” coincida con el
de “nss”
 Se consigue aplicando la operación REUNIÓN (JOIN) a las
dos tablas:
SELECT *
FROM EMPLEADO, FAMILIAR
WHERE nss = nssemp;
Recuperación de Datos

SQL. SELECT. Reunión (JOIN)


68
EMPLEADO FAMILIAR
nombre apellido nss ... dep nssemp numero nombre sexo fechanacim parentesco
JONÁS SOLANO 123 … D1 123 1 JONÁS H 17/05/1992 HIJO
RIGOBERTA CALAVERA 321 … D3 321 2 RÓMULA M 23/09/1923 ABUELA
EUSEBIO MULETAS 222 … D2 222 1 ELEUTERIO H 30/10/2002 HIJO
MACARENO SOSO 111 … D1 1 10/03/2002
321 RENATA M HIJA
CASIANA FABERGÉ 333 … D3
111 1 JULIANA M 10/10/1936 MADRE
FILOMENA RASCAS 234 … D1
GUMERSINDA MIMOS 543 … NULL 321 3 TORCUATA M 17/05/1938 ABUELA
111 2 SINFOROSA M 23/09/1947 ABUELA
SELECT *
FROM EMPLEADO, FAMILIAR
Si un empleado WHERE nss = nssemp;
tiene varios nombre apellido nss ... dep nssemp numero nombre … parentesco
familiares,
JONAS SOLANO 123 … D1 123 1 JONÁS … HIJO
aparece varias
veces en el RIGOBERTA CALAVERA 321 … D3 321 2 RÓMULA … ABUELA
resultado, EUSEBIO MULETAS 222 … D2 222 1 ELEUTERIO … HIJO
combinado una RIGOBERTA CALAVERA 321 … D3 321 1 RENATA … HIJA
vez con cada MACARENO SOSO 111 … D1 111 1 JULIANA … MADRE
familiar RIGOBERTA CALAVERA 321 … D3 321 3 TORCUATA ... ABUELA
MACARENO SOSO 111 … D1 111 2 SINFOROSA ... ABUELA

Importante: En el resultado del JOIN faltan varios empleados (CASIANA por ejemplo) ¿Por qué?
¿Y faltan familiares? ¿Por qué?
Recuperación de Datos

SQL. SELECT. Reunión (JOIN)


69

 La reunión permite procesar vínculos entre las tablas


 La reunión combina cada dos filas vinculadas, una de
una tabla y otra de la otra tabla, obteniendo una sola
fila para el resultado

 Para especificar una reunión (JOIN) se indica los nombres


de las tablas separados por comas en la cláusula FROM

SELECT lista_columnas_de_R_y_S
FROM R, S
WHERE condición_de_reunión;

 Y la condición de reunión se incluye en la cláusula WHERE


Recuperación de Datos

SQL. SELECT. Reunión (JOIN)


70

 Acerca de la condición de reunión ...


 Es la que garantiza que se reúnan las filas que están
relacionadas entre sí
 Suele ser la comparación por igualdad entre una clave ajena y
una clave primaria
 Quizá aparece junto con otras condiciones de selección de
filas

* Para cada familiar que sea hijo/a de un/a empleadx, mostrar su parentesco, el
nss del empleadx del cual es familiar, junto con el estado civil y ciudad de dichx
empleadx
SELECT parentesco, nss, estado_civil, ciudad
FROM EMPLEADO, FAMILIAR → reunión o join de dos tablas
WHERE nss=nssemp → condición de reunión entre tablas 
AND parentesco LIKE 'HIJ_'; → condición de selección;
Recuperación de Datos

SQL. SELECT. Reunión (JOIN)


71

* Para cada departamento, mostrar su código y el apellido de su director


 Hemos de sacar información de la tabla DEPARTAMENTO, pues ahí
están todos los departamentos.
 Hemos de poner DEPARTAMENTO en la cláusula FROM
 Cada fila de DEPARTAMENTO incluye una referencia a su director:
“nssdire” contiene un NSS de empleado, pero no su apellido
 Con ese valor de “nssdire” podemos ir a la tabla EMPLEADO, buscar
la fila cuyo valor para “nss” coincide, y ya tenemos los datos del
empleado director del departamento (el apellido)
 También hemos de poner EMPLEADO en el FROM
 Así que hay que hacer un JOIN entre DEPARTAMENTO y EMPLEADO
 Y la condición de reunión es nssdire=nss
 Por tanto, esta es la SELECT que hemos de redactar:
SELECT coddep, apellido Cómo construir
FROM DEPARTAMENTO, EMPLEADO una consulta
WHERE nssdire = nss; que incluye un
JOIN...
Recuperación de Datos

SQL. SELECT. Reunión (JOIN)


72

 La condición de reunión puede incluir más de una comparación


por igualdad, ligadas con el operador booleano AND, si es
necesario usar dos o más columnas para combinar correctamente
las filas de una tabla con las filas de la otra tabla
 Esto ocurre cuando la clave ajena y la clave primaria (vínculo entre
las tablas) son compuestas (tienen más de una columna)
 Ejemplo: la clave primaria de EJEMPLAR es (ISBN, numero)
 Por tanto, la clave ajena en PRESTAMO es (libro, ejemplar)
* Para cada préstamo de un ejemplar realizado por el socio ‘s03’, mostrar el ISBN
y número del ejemplar, el estante donde está y la fecha del préstamo
SELECT ISBN, numero, estante, fecha
FROM PRESTAMO, EJEMPLAR → reunión (JOIN) de dos tablas
WHERE socio = ‘S03' → condición de selección de filas
AND libro = ISBN → condición de reunión con
AND ejemplar = numero; dos comparaciones
Recuperación de Datos

SQL. SELECT. Reunión (JOIN)


73

EJEMPLAR
PRESTAMO
ISBN numero estante libro ejemplar socio fecha …
9788408217251 1 H4
9788408217251 1 S02 14/09/2019
9788408217251 2 H4
9788408217251 2 S03 14/09/2019
9788408217251 3 H5
9788408217251 3 S06 15/10/2019
9788467009101 1 M2
9788467009101 1 S04 09/09/2019
9788467009101 2 M2
9788467009101 1 S04 19/10/2019
9788468319612 1 S1
9788408217251 3 S02 20/10/2019
9788491223542 1 S2
9788491223542 2 S03 09/10/2019
9788491223542 2 A3
9788491223542 2 S01 18/11/2019
9788468315775 1 S7

SELECT ISBN, numero, estante, fecha


FROM PRESTAMO, EJEMPLAR Resultado de la consulta
WHERE socio = ‘S03' ISBN numero estante fecha
AND libro = ISBN 9788408217251 2 H4 14/09/2019
AND ejemplar = numero; 9788491223542 2 A3 09/10/2019
Recuperación de Datos

SQL. SELECT. Reunión (JOIN)


74

 Es posible hacer una reunión entre más de dos tablas, y


 Es necesario incluir tantas condiciones de reunión como
(número de tablas -1) haya en la cláusula FROM

* Para cada familiar con parentesco ‘ABUELA’ o ‘MADRE’, mostrar dicho


parentesco, el apellido del empleadx del que depende, y el nss del director del
departamento al que pertenece el/la empleadx.

SELECT parentesco, apellido, nssdire


FROM FAMILIAR, EMPLEADO, DEPARTAMENTO → reunión de TRES tablas
WHERE nssemp = nss → condición de reunión entre FAMILIAR y EMPLEADO
AND dep = coddep → condición de reunión entre EMPLEADO y DEPARTAMENTO
AND parentesco IN ('ABUELA', 'MADRE'); → condición de selección
Recuperación de Datos

SQL. SELECT. Omisión de WHERE


75

 Selección incondicional
 No incluir WHERE en una SELECT equivale a una condición TRUE
para todas las filas
 Si en la cláusula FROM aparece sólo una tabla, se obtienen
todas las filas de dicha tabla
* Seleccionar los nss de todos los empleados
SELECT nss
FROM EMPLEADO;
 Si el FROM incluye más de una tabla, se obtiene el producto
cartesiano entre dichas tablas
 Se combina cada fila de una tabla con todas las filas de la otra
* Obtener todas las combinaciones de departamentos y empleados
SELECT * ¿Qué era el
FROM EMPLEADO, DEPARTAMENTO; PRODUCTO
CARTESIANO?
Recuperación de Datos

Inciso: Producto Cartesiano


76

Otro ejemplo, dados los conjuntos:


A = { 1, 2, 3, 4 } y B = { a, b }
El producto cartesiano de A por B es:
A×B = { (1,a), (1,b), (2,a), (2,b), (3,a), (3,b), (4,a) ,(4,b) }
Recuperación de Datos

SQL. SELECT. Reunión sin WHERE


SELECT *
77 FROM EMPLEADO, DEPARTAMENTO;
nombre apellido nss dni fechanacim ciudad estado_civil salario nssjefe dep nombre coddep nssdire
JONÁS SOLANO 123 11A 10/10/1945 MURCIA P 1100 111 D1 ADMINISTRACION D1 111
RIGOBERTA CALAVERA 321 21C 12/11/1974 YECLA C 900 333 D3 ADMINISTRACION D1 111
EUSEBIO MULETAS 222 22B 01/01/1969 TOTANA D 2100 123 D2 ADMINISTRACION D1 111
MACARENO SOSO 111 23D 06/04/1944 JUMILLA S 1100 NULL D1 ADMINISTRACION D1 111
CASIANA FABERGÉ 333 33B 15/06/1943 MURCIA V 920 123 D3 ADMINISTRACION D1 111
FILOMENA RASCAS 234 34E 18/07/1970 MURCIA C 1100 111 D1 ADMINISTRACION D1 111
GUMERSINDA MIMOS 543 45F 10/02/1980 PINOSO P 850 NULL NULL ADMINISTRACION D1 111
JONÁS SOLANO 123 11A 10/10/1945 MURCIA P 1100 111 D1 INVESTIGACION D2 222
RIGOBERTA CALAVERA 321 21C 12/11/1974 YECLA C 900 333 D3 INVESTIGACION D2 222
EUSEBIO MULETAS 222 22B 01/01/1969 TOTANA D 2100 123 D2 INVESTIGACION D2 222
MACARENO SOSO 111 23D 06/04/1944 JUMILLA S 1100 NULL D1 INVESTIGACION D2 222
CASIANA FABERGÉ 333 33B 15/06/1943 MURCIA V 920 123 D3 INVESTIGACION D2 222
FILOMENA RASCAS 234 34E 18/07/1970 MURCIA C 1100 111 D1 INVESTIGACION D2 222
GUMERSINDA MIMOS 543 45F 10/02/1980 PINOSO P 850 NULL NULL INVESTIGACION D2 222
… sigue…

 En el resultado SÍ ESTÁ la empleada GUMERSINDA MIMOS, y el departamento TRAINING


Recuperación de Datos

SQL. SELECT. Reunión sin WHERE


SELECT *
78 FROM EMPLEADO, DEPARTAMENTO;
nombre apellido nss dni fechanacim ciudad estado_civil salario nssjefe dep nombre coddep nssdire

… sigue…
JONÁS SOLANO 123 11A 10/10/1945 MURCIA P 1100 111 D1 PERSONAL D3 333
RIGOBERTA CALAVERA 321 21C 12/11/1974 YECLA C 900 333 D3 PERSONAL D3 333
EUSEBIO MULETAS 222 22B 01/01/1969 TOTANA D 2100 123 D2 PERSONAL D3 333
MACARENO SOSO 111 23D 06/04/1944 JUMILLA S 1100 NULL D1 PERSONAL D3 333
CASIANA FABERGÉ 333 33B 15/06/1943 MURCIA V 920 123 D3 PERSONAL D3 333
FILOMENA RASCAS 234 34E 18/07/1970 MURCIA C 1100 111 D1 PERSONAL D3 333
GUMERSINDA MIMOS 543 45F 10/02/1980 PINOSO P 850 NULL NULL PERSONAL D3 333
JONÁS SOLANO 123 11A 10/10/1945 MURCIA P 1100 111 D1 TRAINING D4 NULL
RIGOBERTA CALAVERA 321 21C 12/11/1974 YECLA C 900 333 D3 TRAINING D4 NULL
EUSEBIO MULETAS 222 22B 01/01/1969 TOTANA D 2100 123 D2 TRAINING D4 NULL
MACARENO SOSO 111 23D 06/04/1944 JUMILLA S 1100 NULL D1 TRAINING D4 NULL
CASIANA FABERGÉ 333 33B 15/06/1943 MURCIA V 920 123 D3 TRAINING D4 NULL
FILOMENA RASCAS 234 34E 18/07/1970 MURCIA C 1100 111 D1 TRAINING D4 NULL
GUMERSINDA MIMOS 543 45F 10/02/1980 PINOSO P 850 NULL NULL TRAINING D4 NULL

 En el resultado SÍ ESTÁ la empleada GUMERSINDA MIMOS, y el departamento TRAINING


Recuperación de Datos

SQL. SELECT. Calificación


79

 En SQL los nombres de las columnas deben ser únicos


dentro de cada tabla
 Pero distintas tablas pueden tener columnas denominadas igual
◼ DEPARTAMENTO y EMPLEADO tienen columnas llamadas “nombre”
◼ EMPLEADO y FAMILIAR tienen columnas llamadas “nombre” y
“fechanacim”
◼ ...
* Nombre, apellido de los empleados junto con el nombre de su departamento
SELECT nombre, apellido, nombre -- Error: columnas ambiguas
FROM EMPLEADO, DEPARTAMENTO
WHERE dep = coddep;
 Si en una consulta aparecen varias columnas de igual
nombre, pero de tablas distintas... AMBIGÜEDAD
 El SGBD no sabe a qué tabla pertenece cada columna (ERROR!)
Recuperación de Datos

SQL. SELECT. Calificación


80

 Para resolver la ambigüedad hay que CALIFICAR cada


columna ambigua con el nombre de su tabla
SELECT EMPLEADO.nombre, apellido, DEPARTAMENTO.nombre
FROM EMPLEADO, DEPARTAMENTO
WHERE dep = coddep;

* Nombre, apellido y estado civil de los empleados del departamento INVESTIGACION


SELECT nombre, apellido, estado_civil
FROM EMPLEADO, DEPARTAMENTO
WHERE dep = coddep
AND nombre = 'INVESTIGACION'; -- Error: columnas ambiguas
-- Sentencia correcta:
SELECT EMPLEADO.nombre, apellido, estado_civil
FROM EMPLEADO, DEPARTAMENTO
WHERE dep = coddep
AND DEPARTAMENTO.nombre = 'INVESTIGACION';
Recuperación de Datos

SQL. SELECT. Calificación


81

 Puede utilizarse pseudónimos (alias) para acortar los


nombres de tabla que se usan para calificar:
SELECT E.nombre, apellido, estado_civil El SGBD ejecuta
primero el FROM, por
FROM EMPLEADO E, DEPARTAMENTO D lo que conoce los
WHERE dep=coddep alias de cada tabla
al principio de la
AND D.nombre=‘INVESTIGACION’; ejecución

* Nombre, apellido de los empleados junto con el nombre de su departamento


SELECT E.nombre, apellido, D.nombre Sólo hace falta calificar
FROM EMPLEADO E, DEPARTAMENTO D las columnas
ambiguas. El resto de
WHERE dep=coddep; columnas pueden
dejarse sin calificar
(aunque si se califican,
* Obtener nombre de cada empleado y de sus familiares no hay problema)

SELECT E.nombre, F.nombre


FROM EMPLEADO E, FAMILIAR F
WHERE nss=nssemp;
Recuperación de Datos

SQL. SELECT. Tablas Reunidas


82

 Reunión especificada en la cláusula FROM de una consulta


* Nombre, apellido y ciudad de cada empleado del departamento de Investigación
SELECT E.nombre, apellido, ciudad
FROM (EMPLEADO E JOIN DEPARTAMENTO D  tabla reunida
ON dep=coddep)
WHERE D.nombre = 'INVESTIGACION’;  condición de selección
 Es una alternativa a indicarla en las cláusulas FROM y WHERE
* Nombre, apellido y ciudad de cada empleado del departamento de Investigación
SELECT E.nombre, apellido, ciudad
FROM EMPLEADO E, DEPARTAMENTO D  reunión de tablas
WHERE dep=coddep  condición de reunión
AND D.nombre = 'INVESTIGACION';  condición de selección
 Usar tablas reunidas genera consultas más comprensibles:
separa las condiciones de reunión de las de selección
Recuperación de Datos

SQL. SELECT. Tablas Reunidas


83

 Formato:
SELECT columnas
FROM ( R1 JOIN R2 ON condición_reunión )
WHERE condiciones de selección de filas, subconsultas, etc ;
* Nombres de cada empleado y de su departamento
SELECT E.nombre empleado, D.nombre departamento
FROM (EMPLEADO E JOIN DEPARTAMENTO D
ON E.dep = D.coddep); empleado departamento
MACARENO ADMINISTRACION
JONÁS ADMINISTRACION
EUSEBIO INVESTIGACION
FILOMENA ADMINISTRACION
RIGOBERTA PERSONAL
CASIANA PERSONAL
Recuperación de Datos

SQL. SELECT. Renombrar columnas


84

 Es posible dar nuevos nombres para las columnas del


resultado de la consulta
* Nombres de cada empleado y sus familiares, cambiando al mismo tiempo los nombres
de las columnas resultantes a ‘empleado’ y ‘familiar’
Basta con separar el
SELECT E.nombre AS empleado, F.nombre AS familiar nombre de la columna
FROM EMPLEADO E JOIN FAMILIAR F y el nuevo nombre con
ON E.nss = F.nssemp; la cláusula AS
 Resultado sin los nuevos nombres Resultado con los nuevos nombres
E.nombre F.nombre empleado familiar
MACARENO JULIANA MACARENO JULIANA
MACARENO SINFOROSA MACARENO SINFOROSA
JONÁS JONÁS JONÁS JONÁS
EUSEBIO ELEUTERIO EUSEBIO ELEUTERIO
RIGOBERTA RENATA RIGOBERTA RENATA
RIGOBERTA RÓMULA RIGOBERTA RÓMULA
RIGOBERTA TORCUATA RIGOBERTA TORCUATA

 Es una nueva cabecera para la tabla resultado


 No cambia el nombre de ninguna columna de las tablas
Recuperación de Datos

SQL. SELECT. Tablas como conjuntos


85

 SQL no elimina filas repetidas del resultado de una consulta,


porque...
 Eliminar duplicados es costoso (ordenar+recorrer+eliminar)
 El usuario puede desear ver las filas repetidas en el resultado
 Si se aplica una función agregada a filas (p.ej. calcular la media de
ciertos valores: AVG) rara vez deben eliminarse los duplicados
 Operador DISTINCT
 Para eliminar filas repetidas del resultado de una consulta SQL
 Resultado = Relación del Modelo Relacional Formal (conjunto de filas)
salario * Salarios de los empleados
1100
SELECT salario
900 salario
FROM EMPLEADO; 1100
2100
* Salarios distintos de los empleados 900
1100
920
SELECT DISTINCT salario 2100

1100
FROM EMPLEADO; 920

850 850
Recuperación de Datos

SQL. SELECT. Tablas como conjuntos


86

* NSS de los empleados que tienen algún familiar que sea su hija o su abuela.
SELECT nssemp nssemp
FROM FAMILIAR 321
WHERE parentesco = 'HIJA' 321
321
OR parentesco = 'ABUELA'; 111

 Mejor eliminar duplicados del resultado, pues nos piden los NSS de los
empleados: con que nos digan una vez el NSS es suficiente (y es más
adecuado, y elegante, claro)
SELECT DISTINCT nssemp nssemp
FROM FAMILIAR 321
WHERE parentesco = 'HIJA' 111
OR parentesco = 'ABUELA';
Recuperación de Datos

SQL. SELECT. Tablas como conjuntos


87

 Operaciones de conjuntos: UNION, INTERSECT, EXCEPT


 Permite realizar la unión, intersección o resta entre dos tablas
(entre dos conjuntos de filas, en realidad)
 El Resultado es un conjunto de filas (es una tabla)
 Importante: las filas repetidas se eliminan, y se deja sólo una
de las copias en la tabla resultado
 Las tablas operando han de ser compatibles en tipo:
◼ igual número de columnas, y
◼ columnas “correspondientes” (en la misma posición) tienen que tener
el mismo tipo de datos
◼ Es imposible hacer la unión entre EMPLEADO y DEPARTAMENTO, o entre
EMPLEADO y FAMILIAR, porque el resultado no sería un conjunto de filas,
todas ellas con la misma estructura (pues tienen distintas columnas)
Recuperación de Datos

SQL. SELECT. Tablas como conjuntos


88

 Operación UNION
 La unión entre dos tablas obtiene una tabla con todas las
filas de las dos tablas de origen (y sin duplicados)
 Como el resultado de una SELECT es una tabla, es posible
hacer la UNION entre dos consultas (entre dos SELECT)
No hace falta que las
* Empleados veteranos (nacidos antes de 1965), o con familiares columnas se llamen
abuelos a su cargo igual, pero sí tienen
(SELECT nss que tener un tipo de
datos compatible
FROM EMPLEADO
WHERE fechanacim < '1965-01-01')
UNION nss
nss nssemp
(SELECT nssemp 123 321
111
FROM FAMILIAR 111
UNION
321
= 123
WHERE parentesco LIKE 'ABUEL_'); 111
321
333
333
Recuperación de Datos

SQL. SELECT. Tablas como conjuntos


89

 Operación INTERSECT
 La intersección entre dos tablas obtiene una tabla con las
filas que están a la vez en las dos tablas de origen (y sin
duplicados)
 Como el resultado de una SELECT es una tabla, es posible
hacer la INTERSECCIÓN entre dos consultas (entre dos
SELECT)
nssemp
* Empleados del departamento ‘D3’ y que tienen familiares 111
(SELECT nss nss 321
FROM EMPLEADO 222 nss
321 INTERSECT =
WHERE dep = 'D3') 321 321
333 111
INTERSECT 321
(SELECT nssemp 111
FROM FAMILIAR);
No lo podemos utilizar, porque el SQL de
MySQL no implementa este operador
Recuperación de Datos

SQL. SELECT. Tablas como conjuntos


90

 Operación EXCEPT
 La resta entre dos tablas obtiene una tabla con las filas que
están en la tabla de la izquierda y no están en la tabla de
la derecha (y sin duplicados)
 Como el resultado de una SELECT es una tabla, es posible
hacer la RESTA entre dos consultas (entre dos SELECT)

* Empleados que cobran menos de 950€ y que no tienen hijos


(SELECT nss nss nssemp
nss
FROM EMPLEADO 321
EXCEPT
123
= 333
WHERE salario<950) 333 222
543
EXCEPT 543 321
(SELECT nssemp
FROM FAMILIAR
WHERE parentesco LIKE 'HIJ_'); No lo podemos utilizar, porque el SQL de
MySQL no implementa este operador
Recuperación de Datos

SQL. SELECT. Conjuntos explícitos


91

 Un conjunto explícito de valores es una lista de valores,


separados por comas, encerrada entre paréntesis
 Puede aparecer en la cláusula WHERE
* Nss de los empleados que tienen padres/madres o abuelos/as a su cargo
SELECT DISTINCT nssemp
FROM FAMILIAR
WHERE parentesco IN ('MADRE', 'PADRE', 'ABUELO', 'ABUELA');
 Operador IN (también NOT IN)
v IN V
– Indica si el valor v pertenece al conjunto de valores V
– Devuelve TRUE si algún elemento e de V cumple que v = e
* Nss de los empleados que tengan familiares que no sean ni hijos/as ni sobrinos/as
SELECT DISTINCT nssemp
FROM FAMILIAR
WHERE parentesco NOT IN ('HIJA', 'HIJO', 'SOBRINA', 'SOBRINO');
Recuperación de Datos

SQL. SELECT. Consultas anidadas


92

 Algunas consultas requieren obtener o calcular valores de la


base de datos para ser usados en una condición de
comparación: se necesita realizar una consulta “antes” o
“dentro” de otra
 Una consulta anidada es una consulta SELECT completa,
dentro de cláusula WHERE de otra consulta (consulta exterior)
 Obtiene valores de la BD que se usan en la condición de otra
consulta, para obtener otros datos
Primero se obtienen los
* Nombres de familiares de empleados directores de departamento códigos de los empleados
SELECT nombre que son directores de los
departamentos
FROM FAMILIAR
WHERE nssemp IN (SELECT nssdire Después se usa cada uno de
dichos códigos para seleccionar a
Otro uso del FROM DEPARTAMENTO); sus familiares: los que tienen ese
operador IN valor en su columna “nssemp”
Recuperación de Datos

SQL. SELECT. Consultas anidadas


93

 Operador IN (también NOT IN) -- otro uso del operador


t IN S
– Indica si la fila t pertenece al conjunto de filas S (subconsulta)
* Nombre y estado civil de los empleados que tienen algún familiar.
SELECT nombre, estadocivil 1º se obtienen los nss de los empleados que
FROM EMPLEADO tienen familiares
WHERE nss IN (SELECT nssemp 2º se seleccionan los empleados cuyo nss está
FROM FAMILIAR); entre los obtenidos
* Dni, nombre y ciudad de los empleados que son jefes de departamento.
SELECT dni, nombre, ciudad 1º se obtienen los nss de los empleados que
FROM EMPLEADO dirigen departamentos
WHERE nss IN (SELECT nssdire 2º se seleccionan los empleados cuyo nss está
FROM DEPARTAMENTO); entre los obtenidos
* Nombre y fecha de nacimiento de los familiares de empleados del departamento ‘D1’.
SELECT nombre, fechanacim
FROM FAMILIAR 1º se obtienen los nss de los empleados del
departamento ‘D1’
WHERE nssemp IN (SELECT nss
FROM EMPLEADO 2º se seleccionan los familiares de dichos
empleados
WHERE dep = 'D1');
Recuperación de Datos

SQL. SELECT. Consultas anidadas


94

* Nombres de familiares de empleados directores de departamento


SELECT nombre FROM FAMILIAR
Veamos con detalle
WHERE nssemp IN (SELECT nssdire el modelo de
FROM DEPARTAMENTO); ejecución de este tipo
Primero se evalúa la subconsulta nssdire de consultas...
222
111
333
NULL
Después se seleccionan las filas nssemp numero nombre sexo fechanacim parentesco
de FAMILIAR cuyo valor de 123 1 JONÁS H 1992 HIJO
columna “nssemp” está entre los 321 2 RÓMULA M 1923 ABUELA
obtenidos en la subconsulta 222 1 ELEUTERIO H 2002 HIJO
321 1 RENATA M 2002 HIJA
111 1 JULIANA M 1936 MADRE
321 3 TORCUATA M 1938 ABUELA
111 2 SINFOROSA M 1947 ABUELA
Por último, se proyecta en la nombre
columna indicada ELEUTERIO
JULIANA
SINFOROSA
Recuperación de Datos

SQL. SELECT. Consultas anidadas


95

* Empleados (nss y nombre) del departamento de Investigación


SELECT nss, nombre
FROM EMPLEADO
WHERE dep IN (SELECT coddep FROM DEPARTAMENTO
WHERE nombre = ' INVESTIGACION');
Primero se evalúa la subconsulta coddep
D2

Después se seleccionan las filas nombre apellido nss … nssjefe dep


de EMPLEADO cuyo valor de JONÁS SOLANO 123 111 D1
columna “dep” está entre los RIGOBERTA CALAVERA 321 333 D3
obtenidos en la subconsulta
EUSEBIO MULETAS 222 123 D2
MACARENO SOSO 111 D1
CASIANA FABERGÉ 333 123 D3
FILOMENA RASCAS 234 111 D1
GUMERSINDA MIMOS 543 NULL NULL

Por último, se proyecta en las nss nombre


columnas indicadas 222 EUSEBIO
Recuperación de Datos

SQL. SELECT. Consultas anidadas


96

* Familiares de la empleada ‘RIGOBERTA CALAVERA’


SELECT nombre FROM FAMILIAR
WHERE nssemp IN (SELECT nss FROM EMPLEADO
WHERE nombre = 'RIGOBERTA'
AND apellido = 'CALAVERA');
Primero se evalúa la subconsulta nss
321

Después se seleccionan las filas nssemp numero nombre sexo fechanacim parentesco
de FAMILIAR cuyo valor de 123 1 JONÁS H 17/05/1992 HIJO
columna “nssemp” está entre los 321 2 RÓMULA M 23/09/1923 ABUELA
obtenidos en la subconsulta 222 1 ELEUTERIO H 30/10/2002 HIJO
321 1 RENATA M 10/03/2002 HIJA
111 1 JULIANA M 10/10/1936 MADRE
321 3 TORCUATA M 17/05/1938 ABUELA
111 2 SINFOROSA M 23/09/1947 ABUELA

Por último, se proyecta en las nombre


columnas indicadas RÓMULA
RENATA
TORCUATA
Recuperación de Datos

SQL. SELECT. Consultas anidadas


97

t NOT IN S
– Indica si la fila t NO está entre las filas que devuelve S (subconsulta)
* Nombre y estado civil de los empleados que no tienen familiares a su cargo.
SELECT nombre, estadocivil 1º se obtienen los nss de los empleados que
FROM EMPLEADO tienen familiares
WHERE nss NOT IN (SELECT nssemp 2º se seleccionan los empleados cuyo nss NO
FROM FAMILIAR); está entre los obtenidos
* Nombre de los departamentos cuyo director no es de Murcia.
SELECT nombre 1º se obtienen los nss de los empleados que
FROM DEPARTAMENTO dirigen los departamentos
WHERE nssdire NOT IN (SELECT nss 2º se seleccionan los empleados cuyo nss está
FROM empleado entre los obtenidos
WHERE ciudad = 'MURCIA');
* Nombre y fecha de nacimiento de los familiares de empleados que no están casados.
SELECT nombre, fechanacim 1º se obtienen los nss de los
FROM FAMILIAR empleados que SÍ están casados
WHERE nssemp NOT IN (SELECT nss 2º se seleccionan los familiares cuyos
FROM EMPLEADO empleados no están entre los casados
WHERE estadocivil='C');
Recuperación de Datos

SQL. SELECT. Consultas anidadas


98

* Nombre y fecha de nacimiento de los familiares de empleados que no están casados.


SELECT nombre, fechanacim
FROM FAMILIAR
WHERE nssemp NOT IN ( SELECT nss
FROM EMPLEADO
WHERE estadocivil = 'C' );
Primero se evalúa la subconsulta nss
321
234
Después se seleccionan las filas nssemp numero nombre sexo fechanacim parentesco
de FAMILIAR cuyo valor de 123 1 JONAS H 17/05/1992 HIJO
columna “nssemp” NO está entre 321 2 ROMULA M 23/09/1923 ABUELA
los obtenidos en la subconsulta 222 1 ELEUTERIO H 30/10/2002 HIJO
321 1 RENATA M 10/03/2002 HIJA
111 1 JULIANA M 10/10/1936 MADRE
321 3 TORCUATA M 17/05/1938 ABUELA
111 2 SINFOROSA M 23/09/1947 ABUELA
Por último, se proyecta en las nombre fechanacim
columnas indicadas en el JONAS 17/05/1992
enunciado ELEUTERIO 30/10/2002
JULIANA 10/10/1936
SINFOROSA 23/09/1947
Recuperación de Datos

SQL. SELECT. Consultas anidadas


99

 Es posible tener varios niveles de consultas anidadas

* Empleados (dni y nombre) del departamento dirigido por ‘MACARENO SOSO’.

SELECT dni, nombre


FROM EMPLEADO
WHERE dep IN (SELECT coddep
FROM DEPARTAMENTO
WHERE nssdire IN (SELECT nss
FROM EMPLEADO
WHERE nombre = 'MACARENO'
AND apellido = 'SOSO'));
Recuperación de Datos

SQL. SELECT. Consultas anidadas


100

 El operador IN en realidad compara filas (tuplas)


* Familiares con igual nombre que el empleado del que dependen
SELECT * Primero, la subconsulta
FROM FAMILIAR obtiene filas con el nombre y
nss de todos los empleados
WHERE (nombre, nssemp) IN (SELECT nombre, nss
FROM EMPLEADO);
Después, para cada fila de FAMILIAR, compara las columnas
“nombre” y “nssemp” con las filas obtenidas por la subconsulta
Compara por posición: “nombre” de familiar con “nombre” de empleado y “nssemp”
con “nss” ... Y selecciona las filas de FAMILIAR que cumplen ambas comparaciones
* NSS de empleados que tienen la misma ciudad y salario que ‘JONAS SOLANO’.
SELECT nss
FROM EMPLEADO
WHERE (ciudad, salario) IN (SELECT ciudad, salario nss
FROM EMPLEADO 123
WHERE nombre = ‘JONAS'
234
AND apellido = 'SOLANO');
Recuperación de Datos

SQL. SELECT. Consultas anidadas


101

 Si la consulta anidada devuelve una sola columna y una


única fila, el resultado es un solo valor, y se permite usar
cualquier comparador (=, <, >, <=, >=, <>) en lugar de IN
 El más usado es el =
Recomendamos usar IN
* Empleados (nss y nombre) del departamento de Investigación en lugar de = para
SELECT nss, nombre evitar errores en tiempo
FROM EMPLEADO de ejecución...
WHERE dep = (SELECT coddep
FROM DEPARTAMENTO nss

WHERE nombre = 'INVESTIGACION'); 222

* Familiares del empleado ‘RIGOBERTA CALAVERA’


SELECT nombre
FROM FAMILIAR nombre
WHERE nssemp = (SELECT nss RENATA
FROM Empleado
WHERE nombre = 'RIGOBERTA' RÓMULA

AND apellido = 'CALAVERA'); TORCUATA


Recuperación de Datos

SQL. SELECT. Ejemplos


102

* Empleados (dni y nombre) del departamento dirigido por ‘MACARENO SOSO’.


SELECT dni, nombre -- Consultas anidadas
FROM EMPLEADO
WHERE dep IN (SELECT coddep
FROM DEPARTAMENTO
WHERE nssdire IN (SELECT nss
FROM EMPLEADO
WHERE nombre = 'MACARENO'
AND apellido = 'SOSO'));

SELECT E.dni, E.nombre -- JOIN tradicional


FROM EMPLEADO E, DEPARTAMENTO D, EMPLEADO M
WHERE E.dep = D.coddep
AND D.nssdire = M.nss
AND M.nombre = 'MACARENO'
AND M.apellido = 'SOSO';
Recuperación de Datos

SQL. SELECT. Ejemplos


103

* Empleados (nss y nombre) que son directores de algún departamento y también


jefes de algún otro empleado.
SELECT nss, nombre
FROM EMPLEADO
WHERE nss IN (SELECT nssjefe
FROM EMPLEADO)
AND nss IN (SELECT nssdire
FROM DEPARTAMENTO);

* Empleados (nss) que cobran menos de 950€ y no tienen hijos.


SELECT nss
FROM EMPLEADO
WHERE salario<950
AND nss NOT IN
(SELECT nssemp
FROM FAMILIAR
WHERE parentesco =‘HIJO’);
Recuperación de Datos > Consultas anidadas

SQL. SELECT. Correlación


104

 A veces, una consulta anidada necesita usar columnas de una


tabla declarada en el FROM de una consulta exterior
* Código de los departamentos cuyo director pertenece a otro departamento distinto
(detección de errores en los datos introducidos)
SELECT coddep
FROM DEPARTAMENTO
WHERE nssdire IN ( SELECT nss
FROM EMPLEADO
WHERE dep <> coddep );
 La consulta contiene una correlación
 Una consulta exterior y otra anidada están correlacionadas si
una condición de la anidada contiene columnas de una tabla
declarada en la consulta exterior
Recuperación de Datos > Consultas anidadas

SQL. SELECT. Correlación


105

 Si las columnas en las consultas exterior y anidada se llaman


igual, entonces existe ambigüedad
* Nombre y apellidos de cada empleado con familiares de igual nombre que él
SELECT nombre, apellido
FROM EMPLEADO
WHERE nss IN (SELECT nssemp
FROM FAMILIAR
WHERE nombre = nombre);¿cómo evitar esta ambigüedad?
 Solución: CALIFICAR la columna ambigua de la tabla exterior
SELECT nombre, apellido
FROM EMPLEADO E
No hace falta calificar la columna
WHERE nss IN (SELECT nssemp de la tabla que está en la FROM
FROM FAMILIAR de la consulta anidada (“nombre”
de FAMILIAR): ya se asume que
WHERE nombre = E.nombre); corresponde a dicha tabla.
Regla: una columna no calificada se refiere a la tabla Pero, por supuesto, se pueden
del FROM de la SELECT anidada más interior calificar ambas columnas.
Recuperación de Datos > Consultas anidadas
Una consulta anidada
SQL. SELECT. Correlación correlacionada se ejecuta
una vez por cada fila de la
SELECT inmediata exterior
106 e.nombre (SELECT nssemp
EMPLEADO 1
nombre apellido nss ...
FROM familiar
WHERE nombre = ‘JONÁS’)
JONÁS SOLANO 123 ... (SELECT nssemp
RIGOBERTA CALAVERA 321 ... FROM familiar 2
WHERE nombre = ‘RIGOBERTA’)
EUSEBIO MULETAS 222 ...
(SELECT nssemp
MACARENO SOSO 111 ...
FROM familiar 3
CASIANA FABERGÉ 333 ... WHERE nombre = ‘EUSEBIO’)
FILOMENA RASCAS 234 ... (SELECT nssemp
FROM familiar 4
GUMERSINDA MIMOS 543 ... WHERE nombre = ‘MACARENO’)
FAMILIAR (SELECT nssemp
nssemp numero nombre ... FROM familiar 5
123 1 JONÁS ... WHERE nombre = ‘CASIANA’)
321 2 RÓMULA ... (SELECT nssemp
222 1 ELEUTERIO ... FROM familiar 6
321 1 RENATA ... WHERE nombre = ‘FILOMENA’)
111 2 JULIANA ...
321 3 TORCUATA ...
(SELECT nssemp
FROM familiar 7
111 3 SINFOROSA ...
WHERE nombre = ‘GUMERSINDA’)
Maria José Ortín – Bases de Datos – FIUM - Universidad de Murcia
Recuperación de Datos > Consultas anidadas

SQL. SELECT. Correlación


107

 La mayoría de las correlaciones (ojo: algunas no) se pueden


evitar expresando la consulta de otro modo
* Nombre y apellido de lxs empleadxs que tienen alguna abuela con igual nombre
SELECT nombre, apellido Esta SELECT contiene una
FROM EMPLEADO E correlación: la consulta anidada
WHERE nss IN ( SELECT nssemp utiliza una columna de una tabla
de la consulta exterior
FROM FAMILIAR
WHERE nombre = E.nombre
AND parentesco = 'ABUELA' );
SELECT E.nombre, apellido
FROM EMPLEADO E JOIN FAMILIAR F
ON nss = nssemp Esta no contiene ninguna correlación:
WHERE E.nombre = F.nombre ya no hay subconsulta, sino que utiliza
la operación REUNION (JOIN)
AND parentesco = 'ABUELA';
  Una SELECT con consulta anidada que use el operador = o
IN siempre puede expresarse como una reunión (JOIN)
Recuperación de Datos > Consultas anidadas

SQL. SELECT. Correlación


108

* Código de los departamentos cuyo director pertenece a otro departamento


distinto (detección de errores en los datos introducidos)
SELECT coddep SELECT coddep
FROM DEPARTAMENTO FROM DEPARTAMENTO
WHERE nssdire IN (SELECT nss JOIN EMPLEADO
FROM EMPLEADO ON nssdire = nss
WHERE dep <> coddep); WHERE dep <> coddep;
* Nombre y estado civil de los empleados que tienen algún familiar con su
mismo nombre
SELECT E.nombre, estado_civil
SELECT nombre, estado_civil FROM EMPLEADO E
FROM EMPLEADO E JOIN FAMILIAR F
WHERE nss IN (SELECT nssemp ON nss = nssemp
FROM FAMILIAR F WHERE E.nombre = F.nombre;
WHERE F.nombre = E.nombre);
Recuperación de Datos

SQL. SELECT. Ejemplos


109

* Empleados (nombre, apellido y estado civil) del departamento ‘INVESTIGACION’.

SELECT E.nombre, apellido, ciudad -- JOIN clásico


FROM EMPLEADO E, DEPARTAMENTO D
WHERE dep = coddep
AND D.nombre = 'INVESTIGACION’;

SELECT E.nombre, apellido, ciudad -- JOIN con tabla reunida


FROM EMPLEADO E JOIN DEPARTAMENTO D
ON dep = coddep
WHERE D.nombre = 'INVESTIGACION’;

SELECT nombre, apellido, ciudad -- Subconsulta sin correlación


FROM EMPLEADO
WHERE dep IN (SELECT coddep
FROM DEPARTAMENTO
WHERE nombre = 'INVESTIGACION');
Recuperación de Datos

SQL. SELECT. Ejemplos


110

* Nombre y estado civil de los empleados que tienen algún familiar.


SELECT nombre, estadocivil SELECT nombre, estadocivil
FROM EMPLEADO FROM EMPLEADO, FAMILIAR
WHERE nss IN (SELECT nssemp WHERE nss = nssemp;
FROM FAMILIAR); SELECT nombre, estadocivil
FROM EMPLEADO JOIN FAMILIAR
ON nss = nssemp;
* Dni, nombre y ciudad de los empleados que son
jefes de departamento. SELECT dni, nombre, ciudad
SELECT dni, nombre, ciudad FROM EMPLEADO, DEPARTAMENTO
FROM EMPLEADO WHERE nss = nssdire;
WHERE nss IN (SELECT nssdire SELECT dni, nombre, ciudad
FROM DEPARTAMENTO); FROM EMPLEADO JOIN DEPARTAMENTO
ON nss = nssdire;
* Nombre y fecha de nacimiento de los
familiares de empleados del depto. ‘D1’. SELECT nombre, fechanacim
SELECT nombre, fechanacim FROM FAMILIAR, EMPLEADO
FROM FAMILIAR WHERE nssemp = nss AND dep = 'D1';
WHERE nssemp IN (SELECT nss SELECT nombre, fechanacim
FROM EMPLEADO FROM FAMILIAR JOIN EMPLEADO
WHERE dep = 'D1'); ON nssemp = nss
WHERE dep = 'D1';
Recuperación de Datos

SQL. SELECT. Funciones de agregados


111

 Es muy habitual necesitar realizar cálculos con los datos


almacenados en una tabla:
 ¿Cuántos empleados tenemos?
 ¿Cuál es la media del salario de los empleados?
 ¿A cuánto asciende la suma de todos los salarios de los
empleados?
 ¿Cuántos familiares hay?
 ¿Cuál es el mínimo salario que cobran los empleados? ¿Y el
máximo?
 Es preciso poder calcular estos datos a partir de los
valores almacenados en ciertas columnas (salario, por
ejemplo)
 Esto se consigue con las funciones de agregados
Recuperación de Datos

SQL. SELECT. Funciones de agregados


112

 Funciones SUM( ), MAX( ), MIN( ), AVG( )…


 Suma, máximo, mínimo y media aritmética (promedio),…
 Aplicadas a los valores numéricos almacenados en una columna
 Pueden aparecer en cláusula SELECT
* Suma de los salarios y salario máximo, mínimo y medio de los empleados
SELECT SUM(salario),MAX(salario),MIN(salario),AVG(salario)
FROM EMPLEADO; SUM(salario) MAX(salario) MIN(salario) AVG(salario)
8070 2100 850 1152,86

* Suma de salarios y salario máximo, mínimo y medio de empleados del dep. Investigación
SELECT SUM(salario),MAX(salario),MIN(salario),AVG(salario)
FROM EMPLEADO
WHERE dep IN (SELECT coddep
FROM DEPARTAMENTO
WHERE nombre = 'INVESTIGACION');
SUM(salario) MAX(salario) MIN(salario) AVG(salario)
3300 1100 1100 1100
Recuperación de Datos

SQL. SELECT. Funciones de agregados


113

 Función COUNT( )
 Cuenta número de filas (usando *) o valores no nulos en una columna

 Puede aparecer en la cláusula SELECT


o Contar número de filas:
* Número total de empleados de la empresa COUNT(*)

SELECT COUNT(*) 7
FROM EMPLEADO
* ¿Cuántos empleados hay en el departamento de Investigación? COUNT(*)
SELECT COUNT(*) 1
FROM EMPLEADO E JOIN DEPARTAMENTO D ON dep=coddep
WHERE D.nombre = 'INVESTIGACION';
* ¿Cuántos familiares tiene la empleada ‘RIGOBERTA CALAVERA’? COUNT(*)

SELECT COUNT(*) FROM FAMILIAR 3


WHERE nssemp IN (SELECT nss FROM EMPLEADO
WHERE nombre = 'RIGOBERTA' AND apellido = 'CALAVERA’);
Recuperación de Datos

SQL. SELECT. Funciones de agregados


114

 Contar valores no nulos en cierta columna


* Contar el número de empleados de la empresa que tienen un jefe
SELECT COUNT(nssjefe) cuenta filas con “nssjefe” NOT NULL
FROM EMPLEADO; COUNT(nssjefe)
5

* Contar el número de departamentos de la empresa que tienen un director


SELECT COUNT(nssdire) cuenta filas con “nssdire” NOT NULL
FROM DEPARTAMENTO; COUNT(nssdire)
3
Recuperación de Datos

SQL. SELECT. Funciones de agregados


115

 Contar valores distintos en cierta columna: uso de DISTINCT


* Contar el nº de valores distintos de salario que pueden cobrar los empleados
SELECT COUNT(salario) COUNT(salario)
FROM EMPLEADO; 7

 Error: NO se eliminan duplicados y cuenta valores no nulos; como todos


los empleados tienen salario, entonces COUNT(salario) = COUNT(*)

SELECT COUNT(DISTINCT salario) COUNT(DISTINCT salario)


FROM EMPLEADO;  OK !! 5
Recuperación de Datos

SQL. SELECT. Funciones de agregados


116

 Es posible que una consulta anidada (y quizá correlacionada


con otra exterior) incluya una función agregada
* Apellidos y nombres de los empleados con sólo un familiar
SELECT apellido, nombre
FROM EMPLEADO apellido nombre
WHERE 1 = (SELECT COUNT(*) MULETAS EUSEBIO
FROM FAMILIAR SOLANO JONÁS
WHERE nssemp = nss);
* Apellidos, nombres y salarios de empleados cuyo sueldo coincide con el sueldo medio
SELECT nombre, apellido, salario
FROM EMPLEADO
WHERE salario = (SELECT AVG(salario) apellido nombre
FROM EMPLEADO); vacío
Recuperación de Datos

SQL. SELECT. Funciones de agregados


117

 A veces se necesita realizar cálculos de agregados


agrupando los valores de cierta columna:
 ¿Cuántos familiares tiene cada uno de los empleados?
 ¿Cuántos empleados hay en cada departamento?
 ¿Cuál es la media del salario de los empleados en cada
departamento?
 ¿A cuánto asciende la suma de los salarios de los
empleados de cada departamento?
 ¿Cuál es el mínimo salario que cobran los empleados en
cada departamento? ¿Y el máximo?
 Esto se consigue aplicando funciones de agregados a
grupos de filas
Recuperación de Datos

SQL. SELECT. Agrupación


118

 Cláusula GROUP BY
 Para formar grupos de filas dentro de una tabla
 Los grupos se forman según el valor de las columnas de
agrupación
 Las filas de cada grupo tendrán el mismo valor en las
columnas de agrupación
 Aplicación de funciones agregadas a grupos de filas
* Para cada departamento, obtener su código y cuántos empleados tiene dep COUNT(*)
SELECT dep, COUNT(*) D1 3
FROM EMPLEADO D2 1
D3 2
GROUP BY dep ;  una columna de agrupación NULL 1

 En la cláusula SELECT, las columnas de agrupación deben aparecer


antes de cualquier función agregada, para que su valor (único para
cada grupo) aparezca junto al resultado de aplicar la función al grupo
Recuperación de Datos

SQL. SELECT. Agrupación


119

* Para cada departamento, obtener su número, cuántos empleados tiene dicho


departamento y el salario medio de los empleados del mismo
SELECT dep, COUNT(*), AVG(salario)
FROM EMPLEADO
GROUP BY dep ;
Primero se construyen los grupos en la tabla EMPLEADO, en funcion del valor de “dep”
nombre apellido salario ... dep
JONÁS SOLANO 1100 … D1
MACARENO SOSO 1100 … D1 Grupo 1: D1
FILOMENA RASCAS 1100 … D1
EUSEBIO MULETAS 2100 … D2 Grupo 2: D2
RIGOBERTA CALAVERA 900 … D3
Grupo 3: D3 dep COUNT(*) AVG(*)
CASIANA FABERGÉ 920 … D3
GUMERSINDA MIMOS 850 … NULL Grupo 4: NULL D1 3 1100
D2 1 2100
Después se aplica la cláusula SELECT a cada grupo D3 2 910
NULL 1 850
Recuperación de Datos

SQL. SELECT. Agrupación y HAVING


120

 Cláusula HAVING
 Siempre junto a GROUP BY
◼ No tiene sentido que aparezca HAVING si en la SELECT no hay un
GROUP BY
 Condición que deben cumplir los grupos de filas asociados
a cada valor de las columnas de agrupación
 Un grupo que no cumple la condición es descartado, es
decir, el grupo completo no es seleccionado para el
resultado
* Para cada departamento en el que el salario medio de los empleados sea inferior a
1200 euros, mostrar el código y nombre del departamento y el código de su director
SELECT coddep, D.nombre, nssdire
FROM EMPLEADO E, DEPARTAMENTO D
WHERE dep=coddep
GROUP BY coddep
HAVING AVG(salario)<1200 ;
Recuperación de Datos

SQL. SELECT. Agrupación y HAVING


121

SELECT coddep, D.nombre, nssdire


FROM EMPLEADO E, DEPARTAMENTO D
WHERE dep=coddep
GROUP BY coddep
HAVING AVG(salario)<1200 ;

Primero se ejecuta el FROM, que contiene una reunión (join)


E.nombre apellido nss ... dep nombre coddep nssdire
JONÁS SOLANO 123 … D1 ADMINISTRACION D1 111
RIGOBERTA CALAVERA 321 … D3 PERSONAL D3 333
EUSEBIO MULETAS 222 … D2 INVESTIGACION D2 222
MACARENO SOSO 111 … D1 ADMINISTRACION D1 111
CASIANA FABERGÉ 333 … D3 PERSONAL D3 333
FILOMENA RASCAS 234 … D1 ADMINISTRACION D1 111
Recuperación de Datos

SQL. SELECT. Agrupación y HAVING


122

SELECT coddep, D.nombre, nssdire


FROM EMPLEADO E, DEPARTAMENTO D
WHERE dep=coddep
GROUP BY coddep
HAVING AVG(salario)<1200 ;

Después se particiona en grupos según el valor de la columna coddep


E.nombre apellido salario ... dep nombre coddep nssdire
JONÁS SOLANO 1100 … D1 ADMINISTRACION D1 111
MACARENO SOSO 1100 … D1 ADMINISTRACION D1 111
FILOMENA RASCAS 1100 … D1 ADMINISTRACION D1 111
EUSEBIO MULETAS 2100 … D2 INVESTIGACION D2 222
RIGOBERTA CALAVERA 900 … D3 PERSONAL D3 333
CASIANA FABERGÉ 920 … D3 PERSONAL D3 333
Recuperación de Datos

SQL. SELECT. Agrupación y HAVING


123

SELECT coddep, D.nombre, nssdire


FROM EMPLEADO E, DEPARTAMENTO D
WHERE dep=coddep
GROUP BY coddep
HAVING AVG(salario)<1200 ;

Ahora se selecciona aquellos grupos que cumplen lo indicado en el HAVING


E.nombre apellido salario ... dep D.nombre coddep nssdire AVG(salario)
JONÁS SOLANO 1100 … D1 ADMINISTRACION D1 111 1100 
MACARENO SOSO 1100 … D1 ADMINISTRACION D1 111
FILOMENA RASCAS 1100 … D1 ADMINISTRACION D1 111
EUSEBIO MULETAS 2100 … D2 INVESTIGACION D2 222 2100
RIGOBERTA CALAVERA 900 … D3 PERSONAL D3 333 910 
CASIANA FABERGÉ 920 … D3 PERSONAL D3 333
Recuperación de Datos

SQL. SELECT. Agrupación y HAVING


124

SELECT coddep, D.nombre, nssdire


FROM EMPLEADO E, DEPARTAMENTO D
WHERE dep=coddep
GROUP BY coddep
HAVING AVG(salario)<1200 ;

Por último, se aplica la cláusula SELECT a cada grupo

coddep D.nombre nssdire


D1 ADMINISTRACION 111
D3 PERSONAL 333
Recuperación de Datos

SQL. SELECT. WHERE vs. HAVING


125

 WHERE... se aplica a filas individuales


 HAVING... se aplica a grupos de filas
* Para cada departamento en el que trabajen más de 2 empleados, obtener el código y
nombre del departamento, y el nº de empleados que trabajan en él
SELECT coddep, D.nombre, COUNT(*) En el WHERE no pueden
aplicarse funciones de
FROM DEPARTAMENTO D, EMPLEADO agregación, pues se evalúa
WHERE coddep=dep antes del GROUP BY
AND COUNT(*) > 2 Además, se contaría sobre el
GROUP BY coddep, D.nombre; resultado del join, antes de
hacer los grupos--- KO
SELECT coddep, D.nombre, COUNT(*) Hay que usar HAVING para
aplicar las condiciones a los
FROM DEPARTAMENTO D, EMPLEADO grupos que se forman como
WHERE coddep=dep resultado del GROUP BY
GROUP BY coddep, D.nombre Primero se hacen los grupos, y
HAVING COUNT(*) > 2 ; se cuentan las filas de cada
grupo, descartando los que
tienen menos de 10 filas
Recuperación de Datos

SQL. SELECT. Evaluación


126

 En una consulta SQL hay un máximo de 6 cláusulas


 Sólo son obligatorias SELECT y FROM
 Debe terminar con un ;

Orden de ESCRITURA
SELECT lista columnas o funciones Lista select: lo que se desea obtener
FROM lista tablas Tablas necesarias
WHERE condición para filas Condiciones de selección de filas o reunión
GROUP BY lista columnas agrupación Especificación del agrupamiento de filas
HAVING condición para grupos Condición de selección de grupos de filas
ORDER BY lista columnas ordenación Orden de presentación del resultado
Recuperación de Datos

SQL. SELECT. Evaluación


127

 Orden de EVALUACIÓN
FROM lista tablas Acceso a tablas, o reunión
WHERE condición para filas Descarta filas que incumplen la condición
GROUP BY lista columnas agrupación Crea grupos de filas
HAVING condición para grupos Descarta los grupos de filas que la incumplen
ORDER BY lista columnas ordenación Ordena las filas del resultado
SELECT lista columnas o funciones Para el conjunto de filas resultado, elige las
columnas indicadas, calcula las funciones y lo
muestra
 Diversas formas de especificar una misma consulta
 Ejemplo: es posible expresar una consulta utilizando...
◼ Lista de tablas en el FROM y condiciones de reunión en el WHERE, o
◼ Consultas anidadas (correlacionadas o no ) y comparación con IN ...
Flexibilidad
Modificación de datos con SQL
128

Contenidos
 INSERT

 INSERT .. SELECT
 DELETE
 UPDATE
Modificación de Datos

SQL. Inserción de datos en tablas


129

 Orden INSERT
 Añade una fila completa a una tabla
 Incluye nombre de la tabla y lista de valores para las columnas,
escritos en igual orden al especificado en la orden CREATE TABLE

INSERT INTO EMPLEADO


VALUES (‘CEFERINA’, ‘SALSIPUEDES’, 444, '44C',
'1992-12-30', 'YECLA', 'S', 3700, 'D4', NULL);
INSERT INTO EMPLEADO
VALUES ('PRUDENCIO', 'SILENCIO’, 456, ‘45S',
'1995-01-22', 'VILLENA', 'P', 2250, 'D4', 444);
INSERT INTO EMPLEADO
VALUES ('FERDINANDA', 'FUERTES', 567, '56F',
'1988-08-12', 'MAZARRÓN', 'C', 1560, 'D4', 456);
Modificación de Datos

SQL. INSERT
130

 Para poder poner los valores de las columnas en cualquier orden,


hay que especificar los nombres de las columnas antes de la
cláusula VALUES (recomendado)
 El SGBD hará una correspondencia nombre-valor
INSERT INTO EMPLEADO (nombre, apellido, nss, dni, dep, salario, nssjefe,
ciudad, fechanacim, estadocivil)
VALUES ('CEFERINA', 'SALSIPUEDES', 444, '44C', 'D4', 3700, NULL,
'YECLA', '1992-12-30', 'S');

INSERT INTO EMPLEADO (apellido, nombre, nss, dni, fechanacim, ciudad,


estadocivil, salario, nssjefe, dep)
VALUES ('SILENCIO', 'PRUDENCIO', 456, '45S', '1995-01-22’, 'VILLENA’,
'P', 2250, 444, 'D4');

INSERT INTO EMPLEADO (nombre, apellido, nss, dni, fechanacim, ciudad,


estadocivil, salario, nssjefe, dep)
VALUES ('FERDINANDA', 'FUERTES', 567, '56F', '1988-08-12', 'MAZARRÓN’,
'C', 1560, 456, 'D4');
Modificación de Datos

SQL. INSERT. Omisión de valores


131

 Especificación explícita de valores para algunas columnas


 Es posible omitir las columnas cuyo valor se desconoce
 ... siempre que admitan el NULL o tengan valor por defecto
 Cada columna no especificada tomará el...
 valor por omisión: valor tomado de su cláusula DEFAULT, o
 NULL: si la columna permite nulos y no se definió cláusula DEFAULT para
la misma
* Inserción de empleado del que sólo se conoce su nombre, apellido, NSS, DNI y dep
INSERT INTO EMPLEADO (nombre, apellido, nss, dni, dep)
VALUES ('GILDA', 'ROLLER', 678, '67R', 'D2');

nombre apellido nss dni fechanacim ciudad estadocivil salario dep nssjefe

GILDA ROLLER 678 67R NULL NULL NULL 1000 D2 NULL

Modificación de Datos

SQL. INSERT. Restricc. de Integridad


132

 Comprobación automática (SGBD) de restricciones


INSERT INTO EMPLEADO (nombre, apellido, dep)
VALUES ('CIRILO', 'HUM', 'D2');
 Inserción rechazada:
porque no se incluye valor para, por ejemplo, la columna “nss”,
que está definida como NOT NULL

* Supongamos que no existe ningún departamento con coddep='D8'


INSERT INTO EMPLEADO (nombre, apellido, nss, dni, dep)
VALUES ('CIRILO', 'HUM', 789, '78H', 'D8');
 Inserción rechazada :
porque no encuentra el valor D8 en la columna “coddep” de
DEPARTAMENTO
 Se incumple la Integridad Referencial (la clave ajena no contiene un
valor que exista en la clave primaria)
◼ Restricción “emp_fk_dep”
Modificación de Datos

SQL. INSERT. Uso de SELECT


133

 Carga de una tabla con “información resumen” de la BD


* Sea una tabla INFO_DEP vacía, creada mediante esta sentencia
CREATE TABLE INFO_DEP (
nombre_dep VARCHAR(25) NOT NULL, SQL de
num_empleados INTEGER DEFAULT 0 NOT NULL, MySQL
suma_salarios INTEGER NOT NULL
);
Almacenará el nombre de cada departamento, cuántos empleados tiene y la
suma de los salarios de sus empleados
 Es posible rellenar una tabla extrayendo su contenido de la
base de datos, mediante una SELECT
INSERT INTO
INFO_DEP (nombre_dep, num_empleados, suma_salarios)
SELECT D.nombre, COUNT(*), SUM(salario)
FROM DEPARTAMENTO D JOIN EMPLEADO E
ON coddep = dep
GROUP BY D.nombre ;
Modificación de Datos

SQL. INSERT. Uso de SELECT


134

INFO_DEP
nom_dep num_empleados suma_salarios
ADMINISTRACION 3 3300

INVESTIGACION 2 3100

PERSONAL 2 1820

TRAINING 3 7510

 Por supuesto, es posible visualizar


el contenido de la tabla mediante  INFO_DEP puede
sentencias SELECT contener información
SELECT nombre_dep, suma_salarios no actualizada
FROM INFO_DEP  Si se modifica el contenido de
WHERE num_empleados < 3;
EMPLEADO y/o de
nombre_dep suma_salarios DEPARTAMENTO, dichos
INVESTIGACION 3100 cambios no se reflejarán en la
PERSONAL 1820 tabla INFO_DEP
Modificación de Datos

SQL. Eliminación de Datos


135

 Orden DELETE
 Elimina filas completas de una tabla (sólo una tabla en el FROM)
 Cláusula WHERE para seleccionar las filas que se desea eliminar
DELETE FROM EMPLEADO
WHERE apellido = 'ROLLER';
DELETE FROM DEPARTAMENTO 1º se accede a la tabla
WHERE nssdire = 111; 2º se ejecuta el WHERE
DELETE FROM EMPLEADO 3º se ejecuta el borrado
WHERE dep IN
(SELECT coddep
FROM DEPARTAMENTO
WHERE nombre = 'INVESTIGACION');
 Si no hay WHERE, se eliminan todas las filas
 La tabla permanece, pero queda vacía
DELETE FROM EMPLEADO; -- elimina todas las filas
Modificación de Datos

SQL. Actualización de Datos


136

 Orden UPDATE
 Modifica valores de columnas en una o más filas de una tabla
* Cambiar el nombre del departamento D4 por ‘FORMACION’ y asignarle un director
UPDATE DEPARTAMENTO 1º se accede a la tabla
SET nombre = 'FORMACION', nssdire = 444 2º se ejecuta el WHERE
3º se ejecuta el SET
WHERE coddep = 'D4';
 Cláusula WHERE para seleccionar las filas que actualizar
◼ Si no hay WHERE, se aplica la modificación a TODAS las filas
 Cláusula SET con las columnas que modificar y los nuevos valores
 NULL o DEFAULT como nuevo valor de una columna
UPDATE EMPLEADO SET nssjefe = NULL
WHERE apellido = 'FUERTES'; Estos ejemplos de UPDATE
sólo modifican una fila
UPDATE EMPLEADO SET salario = DEFAULT de la tabla, pues sólo una
WHERE nss = 333; de ellas hacen TRUE lo
indicado en el WHERE
Modificación de Datos

SQL. Actualización de Datos


137

 Modificación de varias filas a la vez


◼ Varias filas hacen TRUE la comparación incluida en la WHERE
UPDATE EMPLEADO SET ciudad = 'Murcia' Modificados todos los
WHERE ciudad = 'MURCIA'; empleados cuya
ciudad era ‘MURCIA’
◼ Inclusión de una subconsulta en la cláusula WHERE para
seleccionar las filas que modificar
* Subir un 10% el salario de todo empleado del departamento de Investigación
UPDATE EMPLEADO SET salario = salario*1.1 Modificados todos
WHERE dep IN ( SELECT coddep los empleados del
FROM DEPARTAMENTO departamento D2
WHERE nombre = 'INVESTIGACION' );

* Aumentar el salario de todo director de departamento un 25%


UPDATE EMPLEADO SET salario = salario * 1.25
WHERE nss IN ( SELECT nssdire 2º para cada una de esas filas,
1º selecciona sólo las filas de
FROM DEPARTAMENTO ); calcula el nuevo salario
EMPLEADO que son directores
Modificación de Datos

SQL. Actualización de Datos


138

 Modificación de varias filas a la vez


◼ Inclusión de una consulta SELECT en la cláusula SET
* Actualizar el número de familiares que tiene cada empleado
UPDATE EMPLEADO SET cuantos_familiares = ( SELECT COUNT(*)
Modificados todos los FROM FAMILIAR
empleados (no hay WHERE) WHERE nssemp = nss );
Modificación de datos en bases de
datos MySQL accedidas vía phpMyAdmin
139

 Cuando se accede a una base de datos MySQL mediante


phpMyAdmin es posible…
 insertar nuevas filas,
 modificar los datos de las filas ya existentes,
 y eliminar filas
 … directamente en las tablas sin escribir instrucciones
INSERT, UPDATE o DELETE
 Seleccionar la tabla en el panel izquierdo
 Insertar: seleccionar pestaña “Insertar” en el panel derecho
 Modificar/Eliminar: seleccionar pestaña “Examinar”, seleccionar la
fila y elegir si “Editar” o “Borrar”
 También se puede crear, alterar y eliminar tablas
directamente, sin redactar las sentencias CREATE, ALTER,
DROP

También podría gustarte

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy