El modelos de datos relacional

Anuncio
CAPÍTULO 1
El modelos de datos relacional
1.
Definiciones
D EFINICI ÓN 1.1. LLamaremos atributo a cualquier elemento de información del
”mundo”que vamos a representar.
D EFINICI ÓN 1.2. Llamaremos dominio Di al conjunto de valores que puede tomar
un determinado atributo Ai .
D EFINICI ÓN 1.3. Consideremos los atributos Ai , i ∈ {1, . . . , n} con dominios
asociados Di (no necesariamente distintos). Decimos que R es relación asociada
a los atributos A1 , . . . , An si R es un subconjunto finito del producto cartesiano
D1 × · · · × Dn .
Al conjunto de atributos lo escribiremos de la forma [A1 , . . . , An ] y a los elementos
de la R de la forma t = (x1 , . . . , xn ).
Si queremos solamente obtener los atributo Ai1 , . . . , Air de una tupla t escribiremos
t[Ai1 , . . . , Air ].
D EFINICI ÓN 1.4. Una base de datos relacional es un conjunto finito de relaciones.
Propiedades de las relaciones:
No hay orden en las tuplas.
No hay orden en los atributos.
Los valores que puede tomar un atributo en una relación son atómicos, en el
sentido de que no tiene estructura, son escalares.
No hay tupla duplicadas en una misma relación.
La última propieadad hace que podamos dar la siguiente definición.
D EFINICI ÓN 1.5. Consideremos una relación R [A1 , . . . , An ] y CC ⊆ {A1 , . . . , An }.
Diremos que CC es una clave candidata de R si verifica lo siguiente:
Unicidad: para todo t1 ,t2 tuplas de R se tiene que t1 [CC] 6= t2 [CC].
Minimalidad: No existe CC0 ( CC tal que verifique la condición anterior.
D EFINICI ÓN 1.6. De entre todas las claves candidatas el diseñador elegirá una a
la que llamaremos clave primaria.
Más propiedades de las relaciones:
Toda relación tiene un clave primaria.
1
2
1. EL MODELOS DE DATOS RELACIONAL
2.
Reglas de integridad
D EFINICI ÓN 1.7. Llamamos regla de integridad a toda propiedad que ha verificar
los elementos de las relaciones para mantener la coherencia de los datos.
D EFINICI ÓN 1.8. Decimos que una regla de integridad es especı́fica si proviene
de la semántica del atributo. Son propias de cada base de datos concreta. Por ejemplo
si un atributo es EDAD las tupla no pueden tomar valores negativos en ese atributo.
Existen reglas de integridad genéricas aplicables a toda base de datos.
D EFINICI ÓN 1.9. Regla de integridad de entidad: los atributos que forman parte
de una clave primaria no pueden tomar valores nulos, ni siquiera parcialmente.
D EFINICI ÓN 1.10. Sea R [A1 , . . . , An ] una relación con clave primaria CP,
S [B1 , . . . , B p ] otra relación y CE ⊆ {B1 , . . . , B p } tal que #CP = #CE con dominios
iguales (CP, que es un conjunto de atributos, coincide con CE que también es un conjunto de atributos). Decimos que CE es clave externa con respecto a CP si se verifica
lo siguiente:
Para toda tupla t ∈ S , existe una tupla t 0 ∈ R tal que t[CE] = t 0 [CP].
D EFINICI ÓN 1.11. Regla de integridad referencial: Si una relación incluye una
clave externa conectada a una clave primaria, el valor de la clave externa debe ser
igual a un valor ya existente de la clave primaria o completamente nulo (esto último
únicamente si el problema lo permite).
Si incluimos en una relación S un la clave primaria de otra relación R , ese subconjunto de atributos de S se convierte en clave externa con respecto a la clave primaria
de R .
Mantenimiento de las reglas de integridad de entidad:
Mantenimiento de la integridad de en entidad: Se debe comprobar que el valor
de los atributos que forman parte de una clave primaria no es nulo y que el valor
conjunto de ellos no se repite en los procesos de inserción y de actualización.
Manteinimiento de integridad referencial:
En una inserción se debe comprobar que el valor de una clave externa sea nulo
o concuerde con un valor de la clave primaria de la relación a la que hace
referencia.
En una actualización si se actualiza la clave externa se deben comprobar las
condiciones de clave externa. Si se actualiza la clave primaria se deben actualizar en cadena las claves externas que tomen los valores antiguos de dicha clave
primaria.
En una operación de borrado se deben borrar en cadena las tuplas cuyas claves
externas concuerden con la clave primaria de la tupla borrada o poner a nulo
en cadena el valor de la clave externa si las demás restricciones de integridad
lo permiten.
2. REGLAS DE INTEGRIDAD
3
La integridad ha de ser mantenida por el sistema de gestión de bases de datos que
tengamos (a veces esto no sucede).
CAPÍTULO 2
Álgebra relacional
Operaciones que tenemos en una base de datos relacional: selección σ, proyección
π, unión ∪, intersección ∩, diferencia −, producto cartesiano ×, θ-reunión o
nθ , división
÷, alias ρ. Usaremos también los operadores lógicos ∧, ∨, ¬ y comparadores de valores
numéricos =, ≤, ≥, <, >, 6=.
El resultado obtenido es de nuevo una relación y le podremos aplicar más operaciones.
R [A1 , . . . , An ] S [B1 , . . . , Bm ] relaciones, Θ una propiedad asociada a {A1 , . . . , An }, θ
una propiedad asociada a A1 , . . . , An , B1 , . . . , Bm . En las operaciones los atributos de una
relación se podrán nombrar siempre de la forma R .A1 , por ejemplo ALUMNOS.dni,
si ası́ evitamos confusiónes.
Selección σΘ (R ): Conjunto de tuplas de R en las que Θ se cumple. Por ejemplo σ(EDAD<20)∧(PESO>50) (ALUMNOS)
Proyección πAi1 ,...,Air (R ): De los elementos de R nos quedamos solamente
con los atributos Ai1 , . . . , Air . Por ejemplo πDNI,EDAD (ALUMNOS).
Producto cartesiano R × S : Relación que contiene a todos los elementos de la
forma (t,t 0 ) con t ∈ R y t 0 ∈ S , con atributos A1 , . . . , An , B1 , . . . , Bm y cardinal
igual al producto de los cardinales de R y S . Podremos acceder a sus atributos
de la forma R .Ai ó S .B j .
θ-reunión R o
nθ S : Subconjunto de R × S que verifica la propiedad θ. Equivale
a σθ (R × S ).
Alias ρ(R ) = T : Obtenemos una relación T idéntica a R . Sirve por ejemplo
para realizar un producto cartesiano de R consigo mismo. Es un requisito que
normalmente exigen las bases de datos.
Reunión natural R o
n S : Si los atributos de R y S coinciden en Aik = B jk con
k ∈ {1, . . . ,t}, definimos
R o
n S = π{A1 ,...,An }∪{B1 ,...,Bm }−{Ai ,...,Ai } σ(R .Ai =S .B j )∧(R .Ait =S .B jt ) (R × S ).
1
1
1
k
Hay que tener en cuenta que la proyección final mantiene todos los atributos
Bi1 , . . . , Bit .
Unión R ∪ S : Sólo puede hacerse si las relaciones tienen los mismos atributos.
Nos da como resultado una relación nueva que tiene todas las tuplas de R y de
S (si hay alguna en ambas sólo aparecerá una sola vez en la relación obtenida).
Podemos realizar órdenes como σΘ (R )∪σΨ (R ), la cual equivale a σΘ∨Ψ (R ).
5
6
2. ÁLGEBRA RELACIONAL
Intersección R ∩ S : Como la anterior pero realiza la intersección de las relaciones. Para la intersección se tiene σΘ (R ) ∩ σΨ (R ) = σΘ∧Ψ (R ).
Diferencia R − S : Como las dos anteriores pero realiza la diferencia entre R
y S . Para la diferencia se tiene σΘ (R ) − σΨ (R ) = σΘ∧¬Ψ (R ).
División R ÷ S : Se ha de cumplir que {B1 , . . . , Bm } ⊂ {A1 , . . . , An }. El resultado es el conjunto de tuplas t[{A1 , . . . , An } − {B1 , . . . , Bm }] de R que
verifican que para todo t 0 ∈ S existe t 00 ∈ R tal que t 0 = t 00 [B1 , . . . , Bm ] y
t 00 [{A1 , . . . , An } − {B1 , . . . , Bm }] = t[{A1 , . . . , An } − {B1 , . . . , Bm }].
La composición de operadores puede realizarse para obtener nuevas relaciones (o
tablas).
Las relaciones de los ejemplos son:
ALUMNOS(DNI,NOMALUM,FECHANAC,DIRECCION,PROVINCIA,BECA)
ASIGNATURAS(CODASIG,NOMASIG,CREDITOS,CARACTER,CURSO)
PROFESORES(NRP,NOMPROF,CATEGORIA,AREA,CODDEP)
DEPARTAMENTO(CODDEP,NOMDEP,DIRECTOR)
AULAS(CODAULA,CAPACIDAD)
GRUPOS(CODASIG,CODGRUP,TIPO,NRP,MAXAL)
CLASE(CODAULA,DIZ,HORA,CODGRUP,CODASIG,TIPO)
MATRICULAS(CODASIG,CODGRUP,TIPO,DNI,CALIFICACION,CONVOCATORIA)
Ejemplos:
Profesores con categorı́a igual a ASOCIADO.
Tabla de en la que aparezca el nombre y la categorı́a de un profesor.
Listado con las diferentes categorı́as en el profesorado.
Tabla con N.R.P. y nombre de los profesores del departamento de matemáticas.
Tabla con nombre del departamento y nombre de su director.
Tabla con DNI y nombre de los alumnos de la asignatura topologı́a que son
becarios.
Tabla con nombre y DNI de los alumnos que no sean de Cádiz y que estén
matriculados en alguna asignatura de primero.
Tabla con DNI y nombre de los alumnos de edad mayor o igual que la del
alumno ”José Fernández Fernández”.
Lista de profesores que imparten la asignatura topologı́a.
Lista con las asignaturas optativas de tercero o cuarto.
Lista de códigos de las asignaturas en las que no se ha matriculado ningún
alumno.
Tabla con nombre y DNI de los alumnos de Sevilla que no estén matriculados
de asignaturas obligatorias.
Listado con las aulas que estén ocupadas todos los dı́as de la semana.
Listado con los departamentos que tengan profesores de todas las categorı́as.
CAPÍTULO 3
El lenguaje de consultas SQL
1.
Creación de tablas
Tipos de datos que tenemos:
INT: Entero con signo,
FLOAT: Número con parte decimal,
CHAR(n): Cadena de n caracteres,
VARCHAR(n): Cadena de caracteres de longitud variable y con un máximo de
n caracteres,
DECIMAL(p,s): Número de p dı́gitos s de las cuales son cifras decimales,
LONG: Entero largo,
DATE: Fecha,
TIME: Hora.
Ejemplos de creación de tablas:
Lo más simple
CREATE TABLE alumnos(
DNI CHAR(8), nomalum VARCHAR(50),
fechanac DATE, direccion VARCHAR(40),
provincia VARCHAR(20), beca VARCHAR(2)
);
Con clave primaria
CREATE TABLE alumnos(
DNI CHAR(8) PRIMARY KEY,
nomalum VARCHAR(50),
fechanac DATE, direccion VARCHAR(40),
provincia VARCHAR(20), beca VARCHAR(2)
);
Con clave primaria sobre varios atributos
CREATE TABLE matriculas(
codasig CHAR(4), codgrupo CHAR(4),
tipo CHAR(1), DNI CHAR(8), convocatoria INT,
calificacion DECIMAL(3,1),
PRIMARY KEY(codasig, codgrupo, tipo, DNI,
convocatoria)
);
7
8
3. EL LENGUAJE DE CONSULTAS SQL
Con control sobre las claves candidatas (control de unicidad)
CREATE TABLE asignaturas(
codasig CHAR(4) PRIMARY KEY,
nomasig VARCHAR(30) UNIQUE,
creditos DECIMAL(4,1), caracter CHAR(2), curso
DECIMAL(1,0)
);
Control de valores nulos
CREATE TABLE profesores(
NRP CHAR(8) PRIMARY KEY,
nomprof VARCHAR(35) NOT NULL,
categoria CHAR(2) CHECK (categoria IN
(’AS’,’TE’,’TU’,’CU’)),
area VARCHAR(20), coddep CHAR(4)
);
Control de rango en columna
CREATE TABLE aulas(
codaula CHAR(4) PRIMARY KEY,
capacidad DECIMAL CHECK ((capacidad>=0)AND(capacidad<=150)
AND(capacidad<>0))
);
CREATE TABLE aulas(
codaula CHAR(4) PRIMARY KEY,
capacidad DECIMAL CHECK (capacidad BETWEEN 0 AND 150)
);
CREATE TABLE asignaturas(
codasig CHAR(4) PRIMARY KEY,
nomasig VARCHAR(30) UNIQUE, creditos DECIMAL(4,1),
caracter CHAR(2) CHECK (caracter IN (’tr’,’ob’,’op’)),
curso DECIMAL CHECK (curso BETWEEN 1 AND 5)
);
Claves externas
CREATE TABLE matriculas(
codasig CHAR(4), codgrupo CHAR(4), tipo CHAR(1),
DNI CHAR(8) REFERENCES alumnos(DNI),
convocatoria DECIMAL, calificacion DECIMAL,
PRIMARY KEY (codasig, codgrupo, tipo, DNI,
convocatoria),
FOREIGN KEY(codasig, codgrupo, tipo) REFERENCES
grupos(codasig,codgrupo,tipo)
);
CREATE TABLE grupos(
2. ELIMINACIÓN DE TABLAS
9
codgrupo CHAR(4), codasig CHAR(4),
tipo CHAR(1) CHECK (tipo IN (’T’,’P’)),
NRP CHAR(4),
maxal INT CHECK (maxal BETWEEN 10 AND 150),
PRIMARY KEY (codasig, codgrupo, tipo),
FOREIGN KEY (codasig) REFERENCES asignaturas(codasig),
FOREIGN KEY (NRP) REFERENCES profesores(NRP)
);
Mantenimiento de la integridad
CREATE TABLE grupos(
codgrupo CHAR(4), codasig CHAR(4),
tipo CHAR(1) CHECK (tipo IN (’T’, ’P’)),
NRP CHAR(4),
maxal INT CHECK (maxal BETWEEN 10 AND 150),
PRIMARY KEY (codasig,codgrupo, tipo),
FOREIGN KEY (codasig) REFERENCES asignaturas(codasig)
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY (NRP) REFERENCES profesores(NRP)
ON DELETE SET NULL
ON UPDATE CASCADE
);
Valores por defecto
CREATE TABLE matriculas(
codasig CHAR(4), codgrupo CHAR(4), tipo CHAR(1),
DNI CHAR(8) REFERENCES alumnos(DNI),
convocatoria DECIMAL DEFAULT 1,
calificacion DECIMAL CHECK ((calificacion>=0)AND(calificacion<=10)),
PRIMARY KEY (codasig,codgrupo,tipo,DNI,convocatoria),
FOREIGN KEY(codasig,codgrupo, tipo) REFERENCES grupos
(codasig,codgrupo,tipo)
);
Para ver como se ha definido una tabla se usa la orden
DESCRIBE id tabla
2.
Eliminación simple
DROP TABLE alumnos;
Eliminación de tablas
10
3. EL LENGUAJE DE CONSULTAS SQL
3.
4.
Alteración de tablas
Inserción, borrado y actualización
Inserción:
INSERT INTO id tabla VALUES (valor1,valor2,...,valorn);
INSERT INTO id tabla(id columna1,...,id columnan) VALUES
(valor1,valor2,...,valorn);
INSERT INTO id tabla(id columna1,...,id columnan) consulta;
Puede comprobarse si el gestor mysql tiene en cuenta las restricciones impuestas a los
atributos de una tabla.
Borrado:
DELETE FROM id tabla [WHERE condición]
Ejemplos:
DELETE FROM alumnos;
DELETE FROM alumnos WHERE beca=’SI’;
Actualización:
UPDATE id tabla SET id columna=expresión [,id columna=expresión]
[WHERE condición].
5.
Consultas
La consulta general es de la forma
SELECT <id columna>[,<id columna] FROM <id tabla>
[WHERE <condicion>];
Esto es como hacer
π<id
columna>,...,<id columna> (σ<condicion> (< id
tabla >))
Se pueden usar condicionales como en la creación de una tabla. Podemos buscar valores de una forma determinada con los comodines * (selección de todos los atributos), %
(cualquier conjunto de caracteres o ninguno) y (exactamente un carácter), junto con
LIKE. Veamos algunos ejemplos.
SELECT NRP,nomprof,categoria FROM profesores;
SELECT * FROM AULAS;
SELECT * FROM profesores WHERE categoria=’AS’;
SELECT * FROM profesores WHERE categoria<>’AS’ AND
(area=’FISICA’ OR area=’QUIMICA’);
SELECT * FROM aulas WHERE CAPACIDAD BETWEEN 30 AND 50;
SELECT nomalum FROM alumnos WHERE provincia IN
(’Cadiz’,’Malaga’) AND beca=’SI’;
5. CONSULTAS
11
SELECT nomalum FROM alumnos WHERE nomalum<’Juan’;
SELECT * FROM alumnos WHERE nomalum LIKE ’H %’;
SELECT * FROM alumnos WHERE nomalum LIKE ’ H %’;
SELECT nomasig, creditos*10 FROM asignaturas;
SELECT codasig, nomasig WHERE (creditos IS NULL);
Los resultados pueden ordenarse con la clausula ORDER BY. Se coloca tras el WHERE y
su sintaxis es
ORDER BY id columna [ASC|DESC] [{,id columna
[ASC,DESC]}]
Algunos ejemplos son los siguientes:
SELECT nomalum FROM alumnos WHERE beca=’SI’ ORDER BY
nomalum;
SELECT provincia, nomalum FROM alumnos ORDER BY provincia
DESC, nomalum ASC;
Las consultas sobre varias tablas se hacen de la siguiente forma
SELECT <id columna>[{,<id columna>}] FROM
<id tabla>[{,<id tabla>}] [WHERE <condicion>]
lo cual es equivalente a
π<id
columna>,...,<id columna> σ<condicion> (< id
tabla > × . . . × < id tabla >)
Tenemos ası́ que las operaciones π, σ y × pueden realizarse con las órdenes:
πA1,A2,A3 (T 1) =SELECT A1,A2,A3 FROM T1.
σΘ (T 1) =SELECT * FROM T1 WHERE Θ
T 1 × T 2 =SELECT * FROM T1,T2;
Más opciones:
Uso de DISTINCT (eliminación de tuplas duplicadas): SELECT DISTINCT
categorias FROM profesores;
Escritura en un fichero de los datos de una tabla:
SELECT * FROM profesores
INTO OUTFILE ’’C:/AA.TXT’’
FIELDS TERMINATED BY ’\t’
LINES TERMINATED BY ’\r\n’;
Los distintos campos aparecerán separados por un tabulador y las lı́neas separadas con un carácter retorno de carro y otro de nueva lı́nea.
Cargar datos de una tabla:
LOAD DATA LOCAL INFILE ’C:/AA.TXT’ INTO TABLE profesores
LINES TERMINATED BY ’\r\n’;
El formato del fichero ha de ser el mismo que el del punto anterior.
Ejemplos
Mostrar los códigos de todas las aulas.
Profesores con categorı́a ’AS’ (asociado).
12
3. EL LENGUAJE DE CONSULTAS SQL
Profesores que no sean asociados y cuya área sea ’MATEMATICAS’ o ’FISICA’.
Alumnos de Cádiz o Málaga con beca.
Alumnos que precedan por su nombre a ’Juan’
Alumnos cuyo nombre empieze con H.
Alumnos cuyo nombre contenga una H.
Alumnos cuyo nombre tenga como segunda letra una H.
Precio de las asignaturas si el crédito vale 20.55 euros.
Asignaturas cuyos créditos estén entre 5 y 7.
Asignaturas de créditos desconocido (NULL).
Listado con las provincias de los alumnos (usar DISTINCT antes del atributo
provincia).
Nombre y NRP de cada profesor junto con el nombre del departamento al que
pertenece.
Lista de profesores de igual categorı́a que su director de departamento.
5.1.
Subconsultas.
SELECT DNI FROM matriculas WHERE codasig IN
(SELECT codasig FROM asignaturas WHERE caracter=’OP’);
SELECT DNI FROM alumnos WHERE provincia=(SELECT provincia
FROM alumnos WHERE nomalum=’JUAN LOPEZ’));
SELECT nomasig FROM asignaturas WHERE EXISTS
(SELECT * FROM matriculas where matriculas.codasig=asignatura.codasig);
SELECT nomasig, creditos FROM
(SELECT DISTINCT codasig FROM clase,aula WHERE
clase.codaula=aula.codaula AND capacidad>100) a1,
asignaturas
WHERE a1.codasig=asignaturas;
SELECT DNI FROM matriculas WHERE codasig=ANY
(SELECT codasig FROM asignaturas WHERE curso=3);
SELECT DNI FROM matriculas WHERE codasig=IN
(SELECT codasig FROM asignaturas WHERE curso=3);
SELECT DNI FROM matriculas WHERE codasig=’FMSDD’ AND
calificacion>=
ALL (SELECT calificacion FROM matriculas WHERE
codasig=’FMSDD’);
select * from alumnos, alumnos a1 where alumnos.dni=a1.dni;
select * from alumnos where not exists (select * from
matriculas);
5.2.
Operadores de conjunto.
(SELECT * FROM alumnos WHERE provincia=’cadiz’) UNION
(SELECT * FROM alumnos WHERE provincia=’sevilla’);
7. CONSULTAS DESDE UN FICHERO DE TEXTO
13
Asignaturas en las que están matriculados todos los alumnos de provincia=’cadiz’:
SELECT codasig FROM asignaturas WHERE NOT EXISTS(
SELECT * FROM alumnos WHERE provincia=’cadiz’ AND
NOT EXISTS(
SELECT * FROM matriculas WHERE asignatura.codasig=matricula.codasig
AND alumnosDNI=matricula.DNI ));
6.
Manejo de claves, fecha, hora y funciones matemáticas y aleatorias
Functions and Operators. El uso de estas funciones puede hacerse como sigue:
• SELECT SUM(capacidad) FROM aulas;
• SELECT AVG(creditos) FROM asignaturas WHERE curso=1;
• SELECT VAR POP(creditos) FROM asignaturas WHERE curso=1;
• SELECT MAX(creditos), MIN(creditos) FROM asignaturas;
• SELECT ATAN(2);
• SELECT COUNT(*) FROM profesores;
• SELECT COUNT(DISTINCT nomprof) RFOM profesores;
• SELECT AVG(capacidad) FROM aulas;
• SELECT FLOOR(RAND()*1000);
Date and Time Functions. Ejemplos:
• SELECT CURRENT DATE();
• SELECT NOW();
• SELECT CURRENT TIME();
Encryption and Compression Functions. Ejemplos:
• SELECT PASSWORD(’hola’);
• SELECT COMPRESS(’hola’);
String Functions. Ejemplos:
• SELECT LOWER(’aAbBcC’);
• SELECT CHAR LENGTH(COMPRESS(’01234567890123456789012345678901234567890));
7.
Consultas desde un fichero de texto
Es posible poner comandos SQL en un fichero y decirle a mysql que lea las entradas de ese fichero. Para ello, cree un fichero fichero.txt que contenga el comando
que quiera ejecutar. En ese fichero puede seleccionar la base de datos a usar o también
puede insertar la orden USE en el fichero. Pruebe a ejecutar las siguientes órdenes:
Dentro de mysql: source fichero.txt;
Desde la lı́neas de comandos del sistema operativo:
mysql -u root -p <fichero.txt
Desde la lı́neas de comandos del sistema operativo:
mysql -u root -p -e ’’source fichero.txt’’
Las funciones y los procedimientos podrán definirse y usarse en ficheros de texto. Un
pequeño fichero de comandos puede encontrarse aquı́.
14
3. EL LENGUAJE DE CONSULTAS SQL
8.
Uso de variables en la lı́nea de comandos de mysql
Podemos definir una o varias variables con la orden
SET @a=’hola’,@b=111, @c=75;
Su valor lo podemos ver con la orden
SELECT @a;
SELECT @b+@c;
SELECT @b=@b+1;
SELECT @b,@b+1=11;
SELECT @b,@b:=@b+1;
SELECT * FROM aulas WHERE capacidad=@b;
SET @n=0; SELECT codaula,@n:=@n+1 FROM aulas;
SELECT codaula INTO @cc from aulas LIMIT 1;
SELECT COUNT(*) INTO @a from AULAS;
SET @nfila=0; SELECT @nfila:=@nfila+1 numero, DNI FROM
alumnos;
9.
Uso de GROUP BY
Realiza agrupaciones en las salidas de una consulta. Se puede considerar que la
divide en varias consultas diferentes. Ejemplo:
SELECT COUNT(DNI),DNI FROM alumnos GROUP BY provincia
ORDER BY provincia ASC;
Con la opción GROUP BY podemos usar la opción HAVING:
SELECT DNI, SUM(creditos) FROM matriculas, asignaturas
WHERE asignaturas.codasig=matriculas.codasig
GROUP BY DNI
HAVING SUM(creditos)>=100;
SELECT codasig FROM matriculas WHERE calificacion>=5
GROUP BY codasig
HAVING COUNT(*)>= ALL (
SELECT COUNT(*) FROM matriculas WHERE calificacion>=5
GROUP BY codasig);
10.
1.
2.
3.
4.
5.
Ejercicios sobre consultas
Mostrar todas las aulas que tengan una capacidad comprendida entre 30 y 50.
Nombre de los alumnos procedentes de fuera de la provincia de Cádiz.
Nombre de los alumnos con DNI comenzando con 35.
Alumnos que no estén matriculados de ninguna asignatura optativa.
Alumnos matriculados en alguna asignatura de cuarto. Mostrar a los alumnos
en orden descendente de edad.
11. DEFINICIÓN Y USO DE FUNCIONES Y PROCEDIMIENTOS EN MYSQL
6.
7.
8.
9.
10.
11.
12.
13.
15
NRP de los profesores que impartan una única asignatura.
Alumnos que estén matriculados tan solo en asignaturas de segundo curso.
Profesores que impartan más de una asignatura diferente.
Nombre de los alumnos que hayan obtenido la peor calificación en la asignatura con código ’0001’.
Aulas donde no se imparte la asignatura de código ’0001’.
Profesores que impartan clase a todos los alumnos matriculados en alguna
asignatura de cuarto.
Alumnos que tienen como profesores todos los profesores del departamento
con código ’dep1’.
Alumnos de tercero con todas sus calificaciones superiores a 8.
11.
Definición y uso de funciones y procedimientos en mysql
Todos las rutinas se guardan en la BD ’information schema’ más concretamente en
la tabla ’routines’. De esta manera si lo que quieren ver son todas las rutinas creadas
en nuestras bases de datos, estarı́a bien hacer una consulta como esta:
SELECT specific name FROM information schema.routines;
Si lo que quieren ver es el código de alguna rutina, para este ejemplo le vamos a llamar
’nombre rutina’:
SELECT routine definition FROM
information schema.routines WHERE specific name =
’nombre rutina’;
Si lo que deseamos es saber de que tipo es, es decir, si es función o procedimiento
entonces:
SELECT routine type FROM information schema.routines
WHERE specific name = ’nombre rutina’;
Si quieres más información basta con que le eches un vistazo a las columnas de la tabla
’routines’ del esquema ’information schema’, puedes hacer esta consulta:
SHOW columns FROM information schema.routines;
Para crear una función o un procedimiento se deben usar las instrucciones CREATE
FUNCTION o CREATE PROCEDURE. Ejemplo:
delimiter //
CREATE FUNCTION age (date1 DATE, date2 DATE)
RETURNS INT
BEGIN
DECLARE age INT;
SET age =
(YEAR(date2)-YEAR(date1))-IF(RIGHT(date2,5)<RIGHT(date1,5),1,0);
RETURN age;
END//
delimiter ;
16
3. EL LENGUAJE DE CONSULTAS SQL
Después de haber desarrollado la función anterior, podemos usarla de la siguiente manera:
SELECT age(’1985-12-25, CURDATE()) as Edad;
Un procedimiento es similar a una función, con la diferencia de que no puede
regresar ningún valor, ası́ que no incluye ninguna instrucción RETURN. Ejemplo:
DROP PROCEDURE IF EXISTS nacio en anio;
CREATE PROCEDURE nacio en anio (anio nacimiento INT)
SELECT nombre, ap paterno, nacimiento, muerte FROM
presidentes WHERE YEAR(nacimiento) =
anio nacimiento;
El resultado de el procedimiento anterior no es regresado como valor, sino como resultset al cliente que lo manda llamar. Para invocar un procedimiento se debe utilizar
la instrucción CALL. Ejemplo:
CALL nacio en anio(1908);
El ejemplo anterior ilustra una cosa que los procedimientos pueden hacer y que las
funciones no: Los procedimientos pueden acceder a tablas. A su vez, se puede definir
un procedimiento que realiza alguna operación determinada en una tabla y que incluya
en su definición un parámetro como IN o INOUT para regresar el valor del procedimiento cuando éste regrese. Esta técnica también es utilizada si se necesita regresar
más de un valor, ya que una función no puede regresar más de un valor.
De manera predeterminada, un parámetro de un procedimiento es de tipo IN; un
parámetro definido de esta manera se recibe en el procedimiento pero cualquier modificación realizada en él no se conservará una vez que el procedimiento termine. Un
parámetro OUT es lo contrario: el procedimiento asignará algún valor al parámetro, el
cual podrá ser accedido una vez que el procedimiento haya regresado. Un parámetro
INOUT permite mandar un valor al procedimiento y obtenerlo de vuelta. El siguiente
ejemplo ilustra lo anterior:
delimiter //
CREATE PROCEDURE cuenta nacimientos
(anio nacimiento INT, OUT cuantos INT)
BEGIN
DECLARE c CURSOR FOR
SELECT COUNT(*) FROM presidentes WHERE
YEAR(nacimiento) = anio nacimiento;
OPEN c;
FETCH c into cuantos;
CLOSE c;
END//
delimiter ;
11. DEFINICIÓN Y USO DE FUNCIONES Y PROCEDIMIENTOS EN MYSQL
17
El procedimiento anterior no solamente invoca la instrucción SELECT y asigna el valor de COUNT(*) a una variable. Si hiciera eso, el resultado del query hubiera sido
desplegado en la pantalla del cliente.
11.1. Estructuras de control. Las estructuras de control permiten, como su
nombre lo indica, controlar el flujo de las instrucciones dentro de un procedimiento
o una función.
BEGIN ... END:
BEGIN [instrucción(es)] END
etiqueta: BEGIN [instrucción(es)] END [etiqueta]
La estructura BEGIN - END se utiliza para agrupar un conjunto de instrucciones. Si un procedimiento o una función necesita contener más de una intrucción, éstas deberán aparecer dentro de un BEGIN - END. De la misma manera,
si el procedimiento o función contienen una rutina DECLARE, ésta deberá aparecer al principio del bloque BEGIN - END.
CASE:
CASE [expresion]
WHEN expresion1 THEN instruccion(es)
[WHEN expresion2 THEN instruccion(es)]
...
[ELSE instruccion(es)]
END CASE;
IF:
IF expr1 THEN instruccion(es)
[ELSEIF expr2 THEN instruccion(es)]
...
[ELSE instruccion(es)]
END IF
ITERATE
ITERATE etiqueta
ITERATE solamente puede aparecer dentro de un LOOP, REPEAT y WHILE. Lo
que realmente significa es: ”Haz el ciclo de Nuevo”. Por ejemplo:
delimiter // CREATE PROCEDURE doiterate(p1 INT) BEGIN label1:
LOOP SET p1 = p1 + 1; IF p1 ¡10 THEN ITERATE label1; END IF;
LEAVE label1; END LOOP label1; SET @x = p1; END// delimiter ;
LEAVE:
LEAVE etiqueta
Esta instrucción es utilizada para salir de alguna estructura de control. Puede
ser usada dentro de un BEGIN - END o dentro de algún ciclo.
LOOP
[etiqueta inicio:] LOOP
instruccion(es)
END LOOP [etiqueta fin]
18
3. EL LENGUAJE DE CONSULTAS SQL
LOOP implementa un ciclo simple, permitiendo que una instrucción o conjunto
de instrucciones se repitan. Las instrucciones dentro de este ciclo se repetirán
hasta que se ocasione alguna salida, lo cual se hace generalmente con una
instrucción LEAVE. Un ciclo LOOP puede ser etiquetado. etiqueta fin no puede
estar presente a menos que etiqueta inicio también lo está y, si ambos están
presentes, deberán ser iguales.
REPEAT:
[etiqueta inicio:] REPEAT
instruccion(es)
UNTIL condicion
END REPEAT [etiqueta fin];
La instrucción o instrucciones dentro de un ciclo REPEAT se repetirán hasta que
la condicion sea verdadadera. Un ciclo REPEAT puede ser etiquetado. etiqueta fin no puede estar presente a menos que etiqueta inicio también lo está y, si
ambos están presentes, deberán ser iguales.
RETURN:
RETURN expresión;
La instrucción RETURN se utiliza solamente dentro de una función. Al ejecutarse, terminará por completo la función dentro de la que se encuentra.
WHILE:
[etiqueta inicio:]
WHILE condición DO
instruccion(es)
END WHILE [etiqueta fin]
La instrucción o instrucciones dentro de un WHILE serán repetidas mientras la
condición sea verdadera. Un ciclo WHILE puede ser etiquetado. etiqueta fin no
puede estar presente a menos que etiqueta inicio también lo está y, si ambos
están presentes, deberán ser iguales.
11.2. Declaraciones de variables. La declaración de una variable local, una
condición, un cursor o un manejador solamente puede aparecer al principio de un bloque BEGIN - END.
Las variables locales se pueden declarar dentro de alguna rutina en la misma lı́nea
(siempre y cuando sean del mismo tipo), separando cada una por una coma. Para darle
un valor a éstas o para inicializarlas, se utilzará la instrucción SET.
DECLARE nombre de variable [, nombre de variable,...]
TIPO [valor predeterminado ];
Veamos algunos ejemplos:
DELIMITER //
CREATE FUNCTION holaMundo() RETURNS VARCHAR(20)
BEGIN
RETURN ’HolaMundo’;
11. DEFINICIÓN Y USO DE FUNCIONES Y PROCEDIMIENTOS EN MYSQL
END
//
Su uso es como sigue:
SELECT holaMundo();
Otro forma de definir la función podrı́a ser la que sigue.
DELIMITER //
CREATE FUNCTION holaMundo() RETURNS VARCHAR(30)
BEGIN
DECLARE salida VARCHAR(30) DEFAULT ’Hola mundo’;
;
SET salida = ’Hola mundo con VARIABLES’;
RETURN salida;
END
//
Y otra:
DROP FUNCTION IF EXISTS holaMundo
CREATE FUNCTION holaMundo(entrada VARCHAR(20)) RETURNS
VARCHAR(20)
BEGIN
DECLARE salida VARCHAR(20);
SET salida = entrada;
RETURN salida;
END
Otro ejemplo más.
CREATE FUNCTION divide(dividendo int,divisor int)
returns int
begin
declare aux int;
declare contador int;
declare resto int;
SET contador = 0;
SET aux = 0;
while (aux + divisor) <= dividendo do
SET aux = aux + divisor ;
SET contador = contador + 1;
end while;
SET resto = dividendo - aux ;
RETURN contador;
end;
//
19
20
3. EL LENGUAJE DE CONSULTAS SQL
SELECT divide(20,2)
12.
Ejercicio sobre funciones y procedimientos
Crear las siguientes funciones para la base de datos de gestión universitaria:
Procedimiento que inserte datos de alumnos que compruebe ningún campo es
nulo.
Procedimiento que inserte datos de profesores y que compruebe la integridad
del campo categoria.
Igual que el anterior pero para aulas, asignaturas y matriculas.
Procedimiento que nos devuelva todos los datos de un alumno a partir de su
dni.
Procedimiento que inserte un determinado número de valores aleatorios en la
tabla alumnos.
Crear una tabla de atributos (clave,at1,at2).
Crea un procedimiento que introduzca datos aleatorias donde el valor de clave
esté comprendido entre dos valores dados.
Para la tabla anterior crea un procedimiento que nos devuelva el número de
valores de la tabla, la media de los valores at1 y de los valores de at2 y sus
varianzas.
Haz un procediento que devuelva la suma de los cuadrados de las medias entre
los atributos at1 y at2.
13.
mysqldump
Realiza copias de seguridad de las bases de datos.
Guardar datos de una tabla:
mysqldump -u root -p myDatabase tabla >tabla.sql
Guardar base de datos:
mysqldump -u root -p myDatabase >myDatabase.sql
Guardar base de datos:
mysqldump -u root -p --routines myDatabase >myDatabase.sql
Guardar todas la bases de datos:
mysqldump -u root -p --all-databases >alldb.sql
Para restaurar el contenido basta con realizar una llamada al fichero con la orden
source ya que los ficheros generados con mysqldump contienen órdenes en SQL.
En la página mysqldump se explican todas las opciones de este programa. Además
con orden mysqldump puedes ver también sus opciones.
14.
Librerı́a libmysql
Uso de la librerı́a ”libmysql.lib”. Información extraida de las páginas ”MySQL C
API programming tutorial” y de la página ”MySQL con Clase”.
14. LIBRERÍA LIBMYSQL
14.1.
Primer ejemplo. Veamos algunas funciones de la librerı́a mysql.
#include <windows.h>
#include <winsock2.h>
#include <iostream>
#include <mysql.h>
#include <ctime>
using namespace std;
MYSQL *connection, mysql;
MYSQL_RES *result, *r1;
MYSQL_ROW row;
int query_state;
int main() {
int num_fields,numrows;
//inicializamos la variable mysql para crear una conexion
mysql_init(&mysql);
//conectamos con la base de datos indicando clave y base de datos a utilizar
connection = mysql_real_connect(&mysql,"localhost","root","holaroot","bd2",0,0,0);
if (connection == NULL) {
cout << mysql_error(&mysql) << endl;
return 1;
}
//pedimos version de la base de datos
cout<<mysql_get_server_version(connection)<<endl;
//ejecutamos la consulta "CALL ALUMNOS()"
query_state = mysql_query(connection, "call alumnos()");
//si query_state no es 0 ha habido un error
if (query_state !=0) {
cout << mysql_error(connection) << "<<<<"<<endl;
return 1;
}
//el resultado de la consulta se almacena en la variable result
result = mysql_store_result(connection);
//vemos cuantos atributos tiene cada fila devuelta
num_fields = mysql_field_count(connection);
//miramos el numero de filas
numrows=mysql_num_rows(result);
cout<<"campos: "<<num_fields<<" "<<"filas: "<<numrows<<endl;
//en row almacemos la filas de la consulta
//accedemos a los valores de los distintos campos con row[i]
while ( ( row = mysql_fetch_row(result)) != NULL ) {
int i=0;
for(i=0;i<num_fields;i++)
cout<<row[i]<<" : ";
cout<<endl;
}
//liberamos result que es la variable que almacena el resultado de la consulta
mysql_free_result(result);
//cerramos la conexion con la base de datos
mysql_close(connection);
return 0;
}
21
22
3. EL LENGUAJE DE CONSULTAS SQL
14.2.
Varias consultas.
Descargar