Apuntes de SQL para Gestión de Información y Contenidos Digitales (PDF)
Document Details
Uploaded by ThumbUpForgetMeNot
Universidad de Murcia
Tags
Summary
Estos apuntes detallan el lenguaje relacional SQL, enfatizando conceptos para la asignatura de Bases de Datos. Se incluye información sobre la sintaxis del lenguaje, sentencias de definición y manipulación de datos y creación de tablas. Los apuntes son de la Universidad de Murcia.
Full Transcript
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 s...
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: >, =, , 10) = TRUE ◼ (8 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 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=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 (nssjefenss) 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); ); 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 =, , >, >=, 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)