Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Lectura 1
Lectura 1
97 98
103 104
SQL-92: Consultas Básicas
• Obtención de los valores de todas las columnas de las filas • Selección incondicional
seleccionadas – Equivale a una condición TRUE para todas las filas
– No es necesario listar todos los nombres tras cláusula SELECT selección de todas las filas de...
una tabla (si la cláusula FROM sólo contiene una tabla), o
– Uso del símbolo * (todas las columnas) el producto cartesiano entre varias tablas (si FROM incluye más de una)
SELECT *
FROM Empleado * Seleccionar todos los nss de empleados
WHERE nd=5; SELECT nss
SELECT * FROM Empleado;
FROM Departamento
WHERE nombred=‘Investigación’; * Obtener todas las combinaciones de nss de empleados y nombres de departamentos
SELECT * SELECT nss, nombred
FROM Empleado, Departamento FROM Empleado, Departamento;
WHERE nombred=‘Investigación’ AND nd=númerod;
109 110
* Salarios distintos de empleados, sin importar cuántos perciban cada cantidad • Para no eliminar duplicados...
SELECT DISTINCT salario 117
– UNION ALL, INTERSECT ALL, EXCEPT ALL
118
FROM Empleado;
t <op> ALL S,, <op> ∈ { >, ≥, <, ≤, ≠, = } Regla: Una columna no calificada se refiere a la tabla
– Compara una fila t con filas resultado de una consulta anidada S declarada en la consulta anidada más interior
– Devuelve TRUE si para toda fila e de S se cumple que t <op> e
Si en una consulta anidada es necesario usar columnas de
* Nombres y apellidos de los empleados cuyo salario es menor que el de todos los empleados de tablas declaradas en una consulta exterior calificar
departamento 5
SELECT nombre, apellido FROM Empleado * Nombre y apellidos de cada empleado con familiares de igual nombre y sexo que él
SELECT nombre, apellido FROM Empleado E
WHERE salario < ALL ( SELECT salario
WHERE nss IN ( SELECT nsse FROM Familiar
FROM Empleado ¿”Mejor” con DISTINCT 123 WHERE nss=nsse AND nombre_familiar=nombre 124
WHERE nd=5 ); en la subconsulta? AND sexo= E.sexo );
SQL-92: Consultas Básicas SQL-92: Consultas Básicas
correlación EXISTS
• Una consulta exterior y otra anidada están correlacionadas si una
condición de la anidada contiene columnas de una tabla declarada en • Operador EXISTS (S): comprobación de tablas vacías
la consulta exterior – Devuelve TRUE si la tabla S contiene al menos una fila
SELECT nombre, apellido FROM Empleado – Devuelve FALSE si S es una tabla vacía (sin filas)
WHERE nss IN ( SELECT nsse FROM Familiar L S suele ser una consulta anidada correlacionada
WHERE nss=nsse AND sexo=‘F’ );
* Nombre y apellido de cada empleado con familiares de igual nombre y sexo que él
• La consulta anidada se evalúa una vez para cada fila (o combinación
SELECT E.nombre, E.apellido FROM Empleado E
de filas) de la consulta exterior
WHERE EXISTS ( SELECT * FROM Familiar
– Evalúa la consulta anidada para cada fila de EMPLEADO,
WHERE nsse=nss AND nombre_familiar=nombre
– Si el valor de nss de la fila EMPLEADO está en el resultado de la consulta anidada,
selecciona la fila EMPLEADO para el resultado final AND sexo=E.sexo );
• Una consulta anidada que use el operador = o IN siempre puede * Nombres de empleados sin familiares
expresarse como una reunión (join) SELECT nombre, apellido FROM Empleado E
SELECT E.nombre, E.apellido WHERE NOT EXISTS (SELECT * FROM Familiar WHERE nsse=nss);
FROM Empleado, Familiar D 125 126
WHERE nss=nsse AND D.sexo=‘F’;
* Nombres y apellidos de los empleados que trabajan en un único proyecto • Operador IS NULL ,, IS NOT NULL
SELECT nombre, apellido FROM Empleado v IS NULL
WHERE UNIQUE ( SELECT nsse – es TRUE si v es NULL
FROM Trabaja_en v IS NOT NULL
WHERE nsse = nss );
– es TRUE si v es un valor no NULL
* Nombres, apellidos y salario de los empleados con un solo familiar
SELECT nombre, apellido, salario FROM Empleado * Nombres de empleados sin supervisores
WHERE UNIQUE ( SELECT *
SELECT nombre, apellido FROM Empleado
FROM Familiar
127 WHERE nssjefe IS NULL; 128
WHERE nsse = nss );
SQL-92: Consultas Básicas SQL-92: Consultas Básicas
Funciones agregadas uso de * y de DISTINCT
• Función COUNT( ) • Uso de *
– Cuenta el número de filas o de valores especificados en una consulta * Número total de empleados de la compañía
• Funciones SUM( ), MAX( ), MIN( ), AVG( ) SELECT COUNT(*) FROM Empleado ( cuenta filas)
– Suma, máximo, mínimo y media aritmética (promedio) * Contar el número de empleados de la compañía que tienen un jefe
– Aplicadas a un multiconjunto (saco, bag) de valores numéricos SELECT COUNT(nssjefe) FROM Empleado;
( cuenta filas con nssjefe no NULL
L Pueden aparecer en cláusula SELECT * Número de empleados en el departamento de Investigación
* Suma de los salarios y salario máximo, mínimo y medio de los empleados SELECT COUNT(*) FROM Empleado, Departamento
SELECT SUM(salario), MAX(salario), MIN(salario), AVG(salario) WHERE nd=númerod AND nombred=‘Investigación’;
FROM EMPLEADO;
* Suma de los salarios y salario máximo, mínimo y medio de empleados del depto. de Investigación • Uso de DISTINCT
SELECT SUM(salario), MAX(salario), MIN(salario), AVG(salario) * Contar el nº de valores distintos de salario que pueden cobrar los empleados
FROM Empleado, Departamento SELECT COUNT(salario) FROM Empleado;
WHERE nd=númerod AND nombred=‘Investigación’; Error: NO se eliminan duplicados, así que COUNT(salario) ≡ COUNT(
129 130
L También pueden aparecer en cláusula HAVING (*se verá*) SELECT COUNT(DISTINCT salario) FROM Empleado; OK !!
• Si existe una fila t1 en R1 y otra fila t2 en R2, tales que • Equi-reunión implícita para cada par de columnas con
cumplen la condición de reunión, la tabla resultado (reunida) igual nombre en una y otra tabla
incluirá la fila obtenida al combinar t1 y t2 ̶ Sólo se incluye una de estas columnas en el resultado
̶ Si no coinciden los nombres de las columnas, es necesario
SELECT E.nombre AS nom_empleado, S.nombre AS nom_supervisor RENOMBRAR una de ellas mediante AS en la cláusula FROM
FROM (Empleado E JOIN Empleado S ON E.nssjefe = S.nss);
– Son excluidas las filas EMPLEADO con NULL en nssjefe SELECT nombre, apellido, direccion
FROM ( Empleado NATURAL JOIN (Departamento AS DEP(nombred, nd, dire, fech)) )
• También puede especificarse como
WHERE nombred=‘Investigacion’;
R1 INNER JOIN R2 ON <condición_reunión> 137 138
– FULL [OUTER] JOIN Reunión externa completa o total FROM <lista tablas> tablas necesarias (incluso las reunidas)
WHERE <condición para filas> condiciones para selección de filas
SELECT E.nombre AS nom_empleado, S.nombre AS nom_supervisor GROUP BY <lista columnas agrupación> especificación del agrupamiento de filas
FROM (Empleado E LEFT OUTER JOIN Empleado S ON E.nssjefe=S.nss); HAVING <condición para grupos> condición para selección de grupos de filas
̶ Obtiene también los empleados sin supervisor (con NULL en nssjefe) ORDER BY <lista columnas ordenación> orden de presentación del resultado
139 140
SQL-92: Consultas Básicas SQL-92: Consultas Básicas
Evaluación de consultas (2) Evaluación de consultas (y 3)
• Orden de evaluación de las cláusulas: • Ventajas e inconvenientes de esta flexibilidad:
1) FROM (es decir, la reunión o join de tablas, si se especifica más de una) ☺ – el usuario elige la técnica o enfoque más cómodo
2) WHERE – Confusión del usuario: ¿qué técnica uso?
3) GROUP BY – Algunas técnicas son más eficientes que otras
4) HAVING el usuario debe determinar cuál
5) SELECT
6) ORDER BY • En condiciones ideales...
– Usuario: se preocupa sólo de especificar la consulta correctamente
– SGBD: se ocupa de ejecutar la consulta de manera eficiente
• Diversas formas de especificar una misma consulta • Pero en la práctica no suele ser así...
conviene saber qué tipos de consulta son más y menos costosos
Ejemplo: es posible expresar una consulta utilizando...
a) condiciones de reunión en cláusula WHERE, o
b) tablas reunidas en la cláusula FROM, o Recomendación (optimización de consultas):
c) consultas anidadas y el operador de comparación IN ... 141 Consultas con mínimo anidamiento correlacionado
142
143 144
SQL-92: Inserción de datos SQL-92: Inserción de datos
Restricciones de Integridad filas resultado de una consulta
• Si SGBD con implementación total de SQL-92 • Carga de una tabla con información sinóptica de la BD
- El SGBD maneja e impone toda RI definida en esquema de BD (LDD) Sea una tabla INFO_DEPTOS vacía. En ella queremos almacenar los nombres de cada
• Si SGBD con implementación de algunas RI departamento, su nº de empleados y el salario conjunto de los empleados del mismo.
- Menor complejidad, mayor eficiencia INFO_DEPTOS ( nombre_depto, num_emps, sal_total)
- SGBD implementa comprobaciones para imponer RI que sí maneja INSERT INTO Info_deptos ( nombre_depto, num_emps, sal_total )
INSERT INTO Empleado (nombre, apellido, nd) VALUES ( 'Roberto', 'Huertas', 2 ) ; SELECT nombred, COUNT(*), SUM(salario)
Inserción rechazada: no se incluye valor para nss, que debe ser NOT NULL FROM Departamento, Empleado
- Programador debe asegurar la no violación de las RI no manejadas por el WHERE númerod=nd
SGBD GROUP BY nombred ;
LSupongamos que no existe departamento con numerod=8
– Es posible hacer SELECT ... FROM Info_deptos ...
INSERT INTO Empleado (nombre, apellido, nss, nif, nd)
VALUES ( 'Roberto', 'Huertas', '980760540222', ‘22333444H’, 8 ) ; – 1 INFO_DEPTOS puede contener información no actualizada
Si el SGBD sí maneja la Integridad Referencial Si se modifica información en EMPLEADO y/o DEPARTAMENTO, los cambios no
Inserción rechazada se reflejarán en la tabla INFO_DEPTOS
Si el SGBD NO soporta la Integridad Referencial
Una vista sí “contiene” siempre los datos más actuales (*se verá*)
Inserción permitida ¡el programador debe asegurar que esto no pase! 145 146
149 150
);
SQL-92: LDD – Definición de Datos SQL-92: LDD – Definición de Datos
LDD: definición de tablas LDD: definición de tablas
Indicación del esquema al que pertenece una tabla
Esquema Explícito
Especificación del tipo de datos de una columna
1. Especificar directamente el tipo de datos tras nombre de la columna
CREATE TABLE Compañia.Empleado ...
CREATE TABLE Empleado (
Esquema Implícito en el contexto
nombre VARCHAR(15) ...
CREATE TABLE Empleado ... ... );
);
SQL-92: LDD – Definición de Datos SQL-92: LDD – Definición de Datos
LDD: definición de tablas LDD: definición de tablas
• Especificación de restricciones de tabla (cont.) • Especificación de restricciones de tabla (cont.)
- Si la restricción afecta sólo a una columna, puede especificarse en la
- Dar nombre a una restricción es opcional, pero muy conveniente
definición de dicha columna (en la misma línea)
CONSTRAINT <nombre_RI> <restricción> - Por ejemplo, si una clave externa no es compuesta, no se necesita la
cláusula FOREIGN KEY
- El nombre de restricción debe ser único dentro del mismo esquema
- Identifica una restricción, por si después debe ser eliminada o sustituida por CREATE TABLE Empleado (
otra nombre VARCHAR(15) NOT NULL,
nss CHAR(12) PRIMARY KEY,
CREATE TABLE Empleado ( nif CHAR(9) NOT NULL UNIQUE,
..., nssjefe CHAR(12) NULL REFERENCES Empleado(nss),
CONSTRAINT pk_empleado PRIMARY KEY ( nss ), nd NUMERIC(2) NOT NULL REFERENCES Departamento(numerod),
CONSTRAINT nif_unico UNIQUE ( nif ), ...,
CONSTRAINT jefe_ok CHECK ( nssjefe <> nss ), CONSTRAINT jefe_ok CHECK ( nssjefe <> nss ),
... );
161
... ); 162
UPDATE Trabaja_en SET nump = (SELECT numerop FROM Proyecto - Por otro lado, algunas actualizaciones a través de vistas
WHERE nombrep = ‘ProductoZ’) carecen de sentido
WHERE nsse = (SELECT nss FROM Empleado UPDATE Info_depto
WHERE apellido = ‘Silva’ AND nombre = ‘José’) SET sal_total = 100000
AND númp = (SELECT numerop FROM Proyecto
WHERE nombred=‘Investigación’ ;
WHERE nombrep = ‘ProductoX’) ;
sal_total
se define como la suma de salarios individuales de los empleados y muchas
☺ Modifica los vínculos en TRABAJA_EN: cada fila que relacionaba las actualizaciones de las tablas base satisfarían esta actualización
filas de ‘José Silva’ en EMPLEADO y de ‘ProductoX’ en PROYECTO, pasa
a relacionar tal empleado con la fila ‘ProductoZ’ de PROYECTO
UPDATE Proyecto SET nombrep = ‘ProductoZ’ Así que no se garantiza que “toda vista sea actualizable”
WHERE nombrep = ‘ProductoX’ ;
Produce igual efecto que pero modifica nombrep en PROYECTO:
al calcular la vista, mostrará ‘ProductoZ’ para todos los que antes 171 172
aparecían con ‘ProductoX’
SQL-92: LMD – Manipulación de Datos SQL-92: LMD – Manipulación de Datos
LMD: Modificación a través de vistas LMD: Modificación a través de vistas
• Una vista sería actualizable si... • En general...
- Una vista con una sola tabla base
- Implicara una única actualización posible de las tablas base, o bien
SÍ es actualizable si sus columnas contienen la clave primaria u otra clave
- Hubiera varias actualizaciones posibles, pero existiera un candidata de la tabla base
procedimiento específico de actualización de tablas base, tal que... Pues se establece una correspondencia entre cada fila de la vista y una única
· El usuario pudiera elegir el procedimiento, especificándolo en la fila de la tabla base
definición de la vista, o bien - Una vista definida sobre varias tablas mediante reuniones
NO es actualizable
· El SGBD pudiera elegir el procedimiento, según la actualización
- Una vista definida mediante agrupación y funciones agregadas
más probable
NO es actualizable
173 174
• Alteración de dominios: – Para introducir un valor para la columna, en cada fila existente:
ALTER DOMAIN <nombre_dominio> ... ; Especificar la cláusula DEFAULT al añadir la columna:
– Eliminación y Adición de valor por defecto ALTER TABLE Empleado
ADD puesto VARCHAR(12) DEFAULT ‘aprendiz’;
– Eliminación y Adición de Restricciones de Dominio
Utilizar después una orden UPDATE
177 178
– Eliminación de una restricción de tabla – Eliminación y Reemplazo del valor por omisión
ALTER TABLE <nombre_tabla> DROP CONSTRAINT <nombre_RI> <opción>; ALTER DOMAIN <nombre_dominio> DROP DEFAULT;
ALTER TABLE Empleado DROP CONSTRAINT jefe_emp CASCADE; ALTER DOMAIN <nombre_dominio> SET DEFAULT <valor>;
• DISEÑO (estructuras de datos y reglas de integridad adecuadas) Respuesta a un intento de violación de la regla
• EJECUCIÓN (corrección de la información) - Indica al SGBD qué hacer si se intenta una operación que viola la RI
6. RI son mantenidas en el INFORMATION_SCHEMA del catálogo - Por defecto RECHAZAR, que implica...
Deshacer los posibles daños causados por la operación
Subsistema de Integridad del SGBD:
·
• Comparación ASSERTION vs. TRIGGER Ejemplo: introducción de valor CHAR en columna definida como INTEGER
- ASSERTION prohibe realizar una actualización que viola el aserto
- Una especificación de tipo de datos puede verse como una “forma primitiva”
(es decir, que hace FALSE la condición)
de restricción de integridad de dominio
- TRIGGER puede permitir la actualización que cumple la condición
- Una violación de una RI de dominio o de tipo de datos se detecta en tiempo
(es decir, que viola una RI), pero ejecuta una acción (que puede
de ejecución
reparar la violación, dejando consistente la BD)
Las condiciones especificadas en una y otro son inversas • SQL rechaza todo intento de INSERT o UPDATE sobre una
vista, si viola la condición de definición de la vista
- Siempre que se haya especificado la “opción de verificación” en la definición
211 212
de la vista (WITH CHECK OPTION)
Comprobación de restricciones Comprobación de restricciones
• En general, el SGBD comprueba una RI de inmediato, como Modos de comprobación
último paso de la ejecución de una sentencia SQL
• En un momento dado, dentro de cierta transacción SQL, toda
– Si la RI es violada por la sentencia, ésta es cancelada y no tiene efecto sobre
la base de datos restricción de integridad debe estar en modo...
• A veces es necesario que ciertas restricciones no sean - INMEDIATE: será comprobada inmediatamente, o
comprobadas hasta pasado un tiempo, pues si se hiciera - DEFERRED: será chequeada al final de la transacción (diferida)
de inmediato siempre fallarían • Para algunas restricciones de integridad, la comprobación
Ciclo referencial EMP DEP Inicialmente, EMP y DEP están vacías
CREATE TABLE EMP CREATE TABLE DEP
diferida no tiene sentido:
( cod_emp ... ( cod_dep ... , • Restricciones de dominio y tipo de datos
depto ... , jefe ... ,
FOREIGN KEY ( depto ) FOREIGN KEY ( jefe ) • Restricción de columna NOT NULL y
REFERENCES DEP ( cod_dep ) ... , REFERENCES EMP ( cod_emp )... , • Restricciones de clave candidata (UNIQUE, PRIMARY KEY)
... ) ; ... ) ;
- Con chequeo inmediato de las RI de clave externa (RI referencial), todo
INSERT de una fila en EMP o en DEP fallaría, pues nunca encontraría la213
fila 214
c. SET DEFAULT » Debe existir una fila en T1 con cada componente de CK a su valor por defecto
Asignar su valor por defecto a cada componente de la FK en toda fila r2, y eliminar r1 d. SET NULL
» Debe existir una fila en T1 con cada componente de CK a su valor por defecto Asignar NULL a los componentes de la FK correspondientes a componentes modificados en
d. SET NULL T1.CK, en todas las filas r2, y actualizar r1
Asignar NULL a cada componente de la FK en todas las filas r2, y eliminar r1 217 » Tales componentes de la FK debe tener nulos permitidos 218
223 224
Tabla USER
Acceso a MySQL
Host localhost localhost % %
User root irv root phpuser
INSTALAR MySQL.
Password 5a1a 5aff 5ffa 4975 EJECUTAR EL SERVIDOR:
Select_priv Y Y Y N • service mysqld restart (mysqld_safe)
Insert_priv Y Y Y N
Update_priv Y Y Y N
• Verificar en /etc/sysconfig/mysqld (--skip-networking)
Delete_priv Y Y Y N • mysqld-nt –u root –install
Create_priv Y Y Y N • Asegurar acceso TCP/IP (vi /etc/sysconfig/mysqld)
Drop_priv Y Y Y N
Reload_priv Y Y Y N
ENTRAR SISTEMA:
Shutdown_priv Y Y Y N mysql –u root –p
Process_priv Y Y Y N EN EL SISTEMA CREAR UNA BD DE DATOS
File_priv Y Y Y N
Grant_priv Y N Y N
mysql> create database db_ejemplo
References_priv Y Y Y N TODOS LOS COMANDOS EN MySql DEBEN
Index_priv Y Y Y N TERMINAR CON ;
Alter_priv Y Y Y N
225 226
227 228
Usar MySQL en modo Batch MySQL: Transacciones
MySQL soporta ejecución de transacciones
En todos los ejemplos mostrados se ha usado mysql de manera Por defecto, MySQL se ejecuta en modo autocommit .
interactiva para ejecutar algunas consultas y ver los resultados. Transacciones seguras: con InnoDB o BDB
Es posible usar mysql en modo batch.
Para hacer esto tenemos que poner los comandos que deseamos START TRANSACTION;
ejecutar dentro de un archivo, y entonces decirle a mysql que lea los SELECT @A:=SUM(salary)
comandos de dicho archivo: FROM table1
shell> mysql < archivo-batch WHERE type=1;
Otra opción: UPDATE table2
mysql> create db_name; SET summmary=@A WHERE type=1;
COMMIT;
mysql> use db_name;
mysql> source archivo.sql
229 230
[ IN | OUT | INOUT ] param_name type type: cualquier MySQL data type mysql> CALL simpleproc(@a);
characteristic: LANGUAGE SQL
| [NOT] DETERMINISTIC mysql> SELECT @a;
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string' routine_body: procedimientos almacenados o comandos
SQL válidos
231 232
Desde MySQL 5.0.3 Nota: Al usar el comando delimiter, evitar el uso de la antibarra ('\') ya
que es el carácter de escape de MySQL.
Función Procedure y Function (cambios)
mysql> delimiter // ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...] characteristic: {
mysql> CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50) CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
-> RETURN CONCAT('Hello, ',s,'!');
-> //
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> SELECT hello('world');
233 234
MySQL: Cursores