Bases de Datos
SQL (Structured Query Language)
SQL
Lenguaje de consultas de BD, que está compuesto
por dos submódulos:
Módulo para definición del modelo de datos,
denominado DDL (Data Definition Languaje).
Módulo para la operatoria normal de la BD,
denominado DML (Data Manipulation Languaje).
Bases de Datos SQL
SQL
Estructura básica de una consulta SQL:
SELECT lista_de_atributos
FROM lista_de_tablas
WHERE (predicado) /*Opcional*/
lista_de_atributos indica los nombres de los atributos que
serán presentados en el resultado.
lista_de_tablas indica las tablas de la BD necesarias para
resolver la consulta.
predicado indica que condición deben cumplir las tuplas
de las tablas para estar en el resultado final de la consulta.
Bases de Datos SQL
SQL-Analogía con Algebra Relacional
AR representa la base teórica de SQL, por lo tanto las
consultas expresadas en ambos lenguajes son
similares en aspectos semánticos.
SELECT atr1, atr2, atr3
FROM tabla1, tabla2
WHERE (atr4 = ‘valor’)
Equivale a la siguiente consulta en AR:
atr1, atr2, atr3 (atr4 = ‘valor’ (tabla1 x tabla2))
Bases de Datos SQL
SQL-Operadores
*: indica que todos los atributos de las tablas definidas en
el FROM, serán presentados en el resultado de la
consulta.
SELECT *
FROM medico
DISTINCT: elimina tuplas repetidas.
SELECT DISTINCT(idmateria)
FROM inscripciones
WHERE (resultado > 3)
Bases de Datos SQL
SQL-Operadores
BETWEEN: permite verificar si un valor se encuentra en un
rango determinado de valores.
SELECT nombre
FROM carreras
WHERE (duracion_años BETWEEN 4 and 6)
Se incluyen los extremos.
Bases de Datos SQL
SQL-Operadores
Los atributos utilizados en el SELECT de una consulta
SQL pueden tener asociados operaciones válidas para
sus dominios.
SELECT nombre, precio* 0.9
FROM medicamento
WHERE (nombre= “Aspirina”)
Bases de Datos SQL
SQL-Operadores
Producto Cartesiano (,): para realizar un producto
cartesiano, basta con poner en la cláusula FROM dos o
más tablas separadas por coma.
SELECT [Link] as medico, [Link] as fechaConsulta
FROM medico m, consulta c
WHERE ([Link] = [Link]) AS: Renombre
de atributos.
Se filtran las tuplas con Alias definido para una tabla.
sentido.
Bases de Datos SQL
SQL-Operadores
UNION: misma interpretación que en AR. No retorna
tuplas duplicadas.
UNION ALL: misma interpretación que la UNION pero
retorna las tuplas duplicadas.
EXCEPT: cláusula definida para la diferencia de
conjuntos.
INTERSECT: cláusula para la operación de intersección
Bases de Datos SQL
SQL-Operadores
LIKE: brinda gran potencia para aquellas consultas que
requieren manejo de Strings. Se puede combinar con:
%: representa cualquier cadena de caracteres,
inclusive la cadena vacía.
_ (guión bajo ): sustituye solo el carácter del lugar
donde aparece.
SELECT nombre SELECT nombre
FROM medico FROM medico
WHERE (nombre LIKE “Zap%”) WHERE (especialidad LIKE “traumato _ _ _ _”)
Bases de Datos SQL
SQL-Operadores
ORDER BY: permite ordenar las tuplas resultantes por el
atributo que se le indique. Por defecto ordena de menor a
mayor (operador ASC). Si se desea ordenar de mayor a
menor, se utiliza el operador DESC.
SELECT DISTINCT matricula, nombre, especialidad
FROM medico m, consultas c
WHERE ([Link] =50) AND ([Link]= c. matricula) ORDER BY
matricula DESC
Dentro de la cláusula ORDER BY es posible indicar más de un
criterio de ordenación. El segundo criterio se aplica en caso de
empate en el primero y así sucesivamente.
Bases de Datos SQL
SQL-Operadores
IS NULL (su negación IS NOT NULL): verifica si un
atributo contiene el valor de NULL, valor que se almacena
por defecto si el usuario no define otro.
SELECT nombre
FROM medicamentos
WHERE (precio IS NULL)
Bases de Datos SQL
SQL-Funciones de agregación
Funciones de Agregación: operan sobre un conjunto de
tuplas de entrada y producen un único valor de salida.
AVG: promedio del atributo indicado para todas las tuplas del
conjunto.
COUNT: cantidad de tuplas involucradas en el conjunto de
entrada.
MAX: valor más grande dentro del conjunto de tuplas para el
atributo indicado.
MIN: valor más pequeño dentro del conjunto de tuplas para el
atributo indicado.
SUM: suma del valor del atributo indicado para todas las tuplas
del conjunto.
Bases de Datos SQL
SQL-Funciones de agrupamiento
GROUP BY: agrupa las tuplas de una consulta por
algún criterio con el objetivo de aplicar alguna función
de agregación.
SELECT nombre, AVG(precio_total) as promedio
FROM medico m, consulta c
WHERE ([Link]= [Link])
GROUP BY matricula, nombre
Bases de Datos SQL
SQL-Subconsulta
Subconsulta: consiste en ubicar una consulta SQL
dentro de otra. SQL define operadores de
comparación para subconsultas:
= (igualdad): cuando una subconsulta retorna un único
resultado, es posible compararlo contra un valor simple.
IN (pertenencia): comprueba si un elemento es parte o
no de un conjunto. Negación (NOT IN).
=SOME: igual a alguno.
>ALL: mayor que todos.
<=SOME: menor o igual que alguno
Bases de Datos SQL
SQL-Subconsulta
SELECT DISTINCT m .nombre, [Link]
FROM medicamento m, consulta c, medicacionConsulta
mc
WHERE ([Link]= [Link]) and
([Link]=[Link])
and [Link] =SOME(SELECT matricula FROM
medico WHERE especialidad like ‘Gastr%’)
Bases de Datos SQL
SQL-Cláusula Exist
EXIST: se utiliza para comprobar si una
subconsulta generó o no alguna tupla como
respuesta. El resultado de la cláusula EXIST es
verdadero si la subconsulta tiene al menos una
tupla, y falso en caso contrario. Negación (NOT
EXIST)
Bases de Datos SQL
SQL-Cláusula Exist
SELECT m .nombre
FROM medicamento m
WHERE EXIST (SELECT * FROM medicacionConsulta
mc WHERE [Link]=[Link])
Condición de la consulta
principal
Bases de Datos SQL
SQL-Producto Natural
INNER JOIN: producto natural clásico, reúne las tuplas
de las relaciones que tienen sentido. El producto natural
se realiza en la cláusula FROM indicando la tablas
involucradas en dicho producto, y luego de la sentencia
ON la condición que debe cumplirse.
SELECT [Link], [Link], c.precio_total
FROM medico m
INNER JOIN consulta c ON ([Link]= [Link])
Bases de Datos SQL
SQL-Producto Natural
LEFT JOIN: contiene todos los registros de la tabla de
la izquierda, aún cuando no exista un registro
correspondiente en la tabla de la derecha, para uno de
la izquierda. Retorna un valor nulo (NULL) en caso de
no correspondencia.
RIGHT JOIN: es la inversa del LEFT JOIN.
SELECT [Link], [Link], c.precio_total
FROM medico m
LEFT JOIN consulta c ON ([Link]= [Link])
Bases de Datos SQL
SQL-ABM
INSERT INTO: agrega tuplas a una tabla.
DELETE FROM: borra una tupla o un conjunto de tuplas
de una tabla.
UPDATE … SET: modifica el contenido de uno o varios
atributos de una tabla.
Bases de Datos SQL
SQL-EJEMPLOS
Modelo Físico
Médico (matricula, nombre, especialidad) // médicos
Medicamento (codMed, nombre, stock, precio) //
medicamentos
MedicacionConsulta(codConsulta, codMed,
cantidad, precio) //medicamentos recetados.
Consulta (codConsulta, matricula, precio_total, fecha)
//consultas realizadas.
Bases de Datos SQL
SQL-EJEMPLOS
Mostrar el nombre de todos los medicamentos
usados en consultas con fecha enero 2016.
SELECT DISTINCT [Link]
FROM medicamento m INNER JOIN medicacionConsulta mc ON
([Link]= [Link])
INNER JOIN consulta c ON ([Link]= [Link])
WHERE YEAR ([Link])=2016 and MONTH([Link])=1
Bases de Datos SQL
SQL-EJEMPLOS
Mostrar codConsulta, la fecha y el monto total de
aquellas consultas correspondiente al médico
‘Orlando Garcia’ ordenadas por fecha y luego por
monto total.
SELECT codConsulta, fecha, precio_total
FROM medico m
INNER JOIN consulta c ON ([Link]= [Link])
WHERE ([Link]= ‘Orlando Garcia’)
ORDER BY fecha, precio_total
Bases de Datos SQL
SQL-EJEMPLOS
Presentar el monto total de las consultas
correspondientes a los primeros 15 días del mes
de febrero del 2016
SELECT SUM (precio_total) as monto total
FROM consulta c
WHERE (fecha BETWEEN "2016-01-01" and "2016-01-15")
Bases de Datos SQL
SQL-EJEMPLOS
Informar codConsulta, fecha y precio total de
aquellas consultas que incluyan medicamentos
con costo superior a $30000.
SELECT DISTINCT codConsulta, fecha,precio_total
FROM medicamento m INNER JOIN medicacionConsulta mc ON ([Link]=
[Link])
INNER JOIN consulta c ON ([Link]= [Link])
WHERE precio >30000
Bases de Datos SQL
SQL-EJEMPLOS
Informar para cada médico: la matricula, el
nombre y el monto total de las consultas
realizadas.
SELECT matricula, nombre, SUM(precio_total) as monto total
FROM medico m LEFTJOIN consulta c ON ([Link]= [Link])
GROUP BY matricula, nombre
Otra solución es: usar inner join en vez de left join y luego unir con la
selección de médicos que no tuvieron consultas y total 0
Bases de Datos SQL
SQL-EJEMPLOS
Informar para cada médico: la matricula, el
nombre, de aquellos médicos que el valor total de
sus consultas supere $1000000.
Condiciones de agrupamiento
SELECT matricula, nombre
FROM medico m INNER JOIN consulta c ON ([Link]= [Link])
GROUP BY matricula, nombre
HAVING SUM(precio_total) > 1000000
Porque se usa inner join??
Bases de Datos SQL
SQL-EJEMPLOS
Informar aquellos médicos que recetaron
‘paracetamol’ pero no recetaron en la misma
consulta ‘amoxilina’.
SELECT matricula, [Link]
FROM medicamento m INNER JOIN medicacionConsulta mc ON ([Link]=
[Link]) INNER JOIN consulta c ON ([Link]= [Link])
INNER JOIN medico med ([Link]= [Link])
WHERE [Link]=‘Paracetamol’ and NOT EXIST (
SELECT nombre
FROM medicamento m1 INNER JOIN medicacionConsulta mc1 ON
([Link]= [Link]) WHERE nombre=‘Amoxilina’ and
[Link]=[Link]
)
Bases de Datos SQL
SQL-EJEMPLOS
Informar para cada médico la cantidad de
consultas en las que intervino.
SELECT matricula, nombre, COUNT(codConsulta) as cantidadConsultas
FROM medico med
LEFT JOIN consulta c ON ([Link]= [Link])
GROUP BY matricula, nombre
Bases de Datos SQL
SQL-EJEMPLOS
Informar información de los médico que recetaron
‘paracetamol’ e ‘ibuprofeno’ en sus consultas
SELECT DISTINCT matricula, [Link]
FROM medicamento m INNER JOIN medicacionConsulta mc ON ([Link]=
[Link]) INNER JOIN consulta c ON ([Link]= [Link])
INNER JOIN medico med ([Link]= [Link])
WHERE [Link]=‘Paracetamol’
INTERSECT
SELECT DISTINCT matricula, [Link]
FROM medicamento m INNER JOIN medicacionConsulta mc ON ([Link]=
[Link]) INNER JOIN consulta c ON ([Link]= [Link])
INNER JOIN medico med ([Link]= [Link])
WHERE [Link]=‘Ibuprofeno’
Bases de Datos SQL
SQL
¿Preguntas?
Bases de Datos SQL