Lenguajes de BD’s:
SQL
Bases de Datos
SQL: Structured Query Language
Es el lenguaje estándar internacional que se
utiliza casi universalmente con las BD
relacionales para realizar consultas (es decir,
para solicitar información que satisfaga ciertos
criterios y para manipular datos).
Permite la definición y manipulación de los
datos de una BD relacional.
Versión original: San Jose Research Laboratory
de IBM, mediados de los 70’s.
SQL: Structured Query Language
Implementado por primera vez en un prototipo
de IBM llamado System R.
El American National Standard Institute (ANSI)
publicó el estándar SQL en 1986.
Es un lenguaje declarativo (basado en las
matemáticas y en la lógica).
Se puede utilizar de manera interactiva en
asociación con interfaces gráficas o lenguajes
de programación (C, java, PHP).
SQL: Structured Query Language
Permite interrogar una BD relacional sin
preocuparse por la representación física de los
datos.
Características:
Estructuras de datos simples
Operadores potentes
Periodos de aprendizaje inicial cortos
Mejora de la independencia de datos
Modo de uso dual (interactivo o inmerso)
Optimización
SQL: Structured Query Language
El lenguaje SQL puede dividirse en tres
sublenguajes:
DDL: Data Definition Language
SQL DML: Data Manipulation Language
DCL: Data Control Language
DDL : Lenguaje de Definición de
Datos
Conjunto de instrucciones que permiten:
definir, modificar y eliminar esquemas de
relaciones.
crear índices.
definir vistas.
especificar restricciones de integridad.
Ejemplo: CREATE, ALTER, DROP, …
DML : Lenguaje de Manipulación
de Datos
Conjunto de instrucciones que permite:
Consultar, actualizar y eliminar los elementos
creados con el DDL, como tablas, índices,
etc.
Esta basado en álgebra y cálculo relacional.
Ejemplos: SELECT, INSERT, UPDATE,
DELETE, …
DCL : Lenguaje de Control de
Datos
Conjunto de instrucciones que permiten:
definir permisos de acceso a la BD.
especificar controles de seguridad a los datos
almacenados como definición de vistas.
comprobación de condiciones de integridad.
control de concurrencia.
Ejemplos: GRANT, REVOKE
Operadores de SQL
Lógicos:
AND Es el “y” lógico. Evalúa dos
condiciones y devuelve un valor de verdad
solo si ambas son ciertas.
OR Es el “o” lógico. Evalúa dos
condiciones y devuelve un valor de verdad si
alguna de las dos es cierta.
NOT Negación Lógica. Devuelve el valor
contrario de la expresión.
Operadores de SQL
De Comparación:
Operador Uso
< Menor que
> Mayor que
<> ó != Distinto de
<= Menor ó igual que
>= Mayor o igual que
= Igual que
Operadores de SQL
Operador Uso
BETWEEN Usado para especificar un
intervalo de valores
LIKE Usado en la comparación de un
modelo
IN Usado para especificar registros
de una lista de datos
DML
Lenguaje de Manipulación de
Datos
Introducción
Permite acceder a la información contenida en
la BD para su consulta y actualización:
SELECT: Utilizado para consultar registros de la base
de datos que satisfagan un criterio determinado.
INSERT: Utilizado para cargar lotes de datos en la
base de datos en una única operación.
UPDATE: Utilizado para modificar los valores de los
campos y registros especificados.
DELETE: Utilizado para eliminar registros de una tabla
de una base de datos.
Extracción de Datos: SELECT
En su forma básica tiene 3 elementos
principales: select, from, where
SELECT A1, A2, A3, ... , An Lista de atributos
FROM R1, R2, R3, ... , Rm Lista de relaciones (tablas)
WHERE condición; La condición se hace sobre los
atributos de las tablas indicadas
en la cláusula FROM
Extracción de Datos: SELECT
SELECT:
corresponde a la operación de Proyección
Permite listar los atributos que se desean en el resultado de
la consulta
FROM:
Especifica los nombres de la(s) tabla(s) de donde los datos
serán seleccionados.
Cuando son varias tablas las que aparecen en el FROM el
sistema ejecuta una operación de Producto Cartesiano o de
join.
WHERE:
corresponde a la operación de Selección
La condición se hace sobre los atributos de las tablas del
FROM
Extracción de Datos: SELECT
Forma general:
SELECT <nombre_campos>
FROM <nombre_tablas>
WHERE <condiciones>
Forma básica:
SELECT * FROM nombreDeTabla
La lista de atributos puede ser sustituida por un
asterisco (*) para denotar TODOS los atributos.
Extracción de Datos: SELECT
Una consulta SQL “selecciona” filas y columnas
de una o más tablas en una BD.
El resultado de la ejecución de una sentencia
SELECT es siempre otra tabla.
Las columnas de la tabla resultante serán las
que figuren enumeradas tras la cláusula
SELECT, y en el mismo orden en el que figuran
tras ella.
Extracción de Datos: SELECT
Equivalencia SQL y Álgebra Relacional:
SELECT A1, A2, A3, ... , An
FROM R1, R2, R3, ... , Rm
WHERE condición;
A1, A2, A3, ..., An ( (R1
condición x R2 x R3x ... x Rm))
Extracción de Datos: SELECT
Ejemplo: Supongamos la relación EMPLEADO:
Código Nombre Edad Depto
1 Jorge Campos 33 1
2 Enrique Muñoz 25 1
3 Esteban Paz 21 1
8 Jorge Arias 30 2
10 Juan Martínez 19 2
12 Anselmo Rodas 28 6
Sea la consulta:
SELECT nombre, edad FROM empleado WHERE edad >= 28
Extracción de Datos: SELECT
La respuesta es también una relación, así:
Nombre Edad
Jorge Campos 33
Jorge Arias 30
Anselmo Rodas 28
Extracción de Datos: SELECT
DISTINCT vs ALL:
SQL no elimina tuplas duplicadas a menos que se
indique con la cláusula opcional.
Se pueden eliminar tuplas duplicadas en una consulta
colocando explícitamente DISTINCT después de
SELECT.
Nota: SQL NO es cerrado relacionalmente ya que puede
producir tuplas repetidas
Ejemplo: SELECT DISTINCT codigo_p, cantidad FROM
suministros;
Si explícitamente se quieren ver los duplicados, se
coloca ALL después de SELECT.
Nota: ALL es la opción por defecto, rara vez se usa !!!
Extracción de Datos: SELECT
La claúsula Where puede contener:
Los operadores de comparación <, >, <=, >=, =, <>
ó !=.
Se permiten consultas tan complejas como sea
necesario, usando conectores lógicos AND, OR, NOT
Ej: SELECT *
FROM empleado
WHERE edad < 28 AND depto = 1
Extracción de Datos: SELECT
Se puede usar un operador especial denominado
BETWEEN, para especificar un rango de valores
sobre el cual puede variar el dominio de un atributo
Ej: SELECT *
FROM empleado
WHERE edad BETWEEN 18 AND 30
Se puede expresar una lista de valores de dominio
específicos con el operador IN
Ej: SELECT *
FROM empleado
WHERE nombre IN (‘Jorge Campos’, ‘Esteban
Paz’)
el Where anterior equivale a :
nombre=‘Jorge Campos’OR nombre=‘Esteban Paz’
Extracción de Datos: SELECT
IN y BETWEEN se pueden negar con NOT
BETWEEN puede lograrse por medio de <= y >=
Para realizar comparaciones especiales de cadenas
de caracteres aparte de la igualdad(=) y el
diferente(<>), se puede utilizar el operador LIKE,
así:
El carácter % remplaza cualquier subcadena.
El carácter _ remplaza un carácter.
Ej:
atributo LIKE ‘Ing%’ : todo lo que comience por Ing
atributo LIKE ‘%eniería%’ : todo lo que contenga eniería
atributo LIKE ‘_ _ _%’ : todo lo que tenga al menos 3
letras
Extracción de Datos: SELECT
Ej: SELECT idAutor, nombrePila, apellidoPaterno
FROM autores
WHERE apellidoPaterno LIKE ‘D%’
Ej: SELECT idAutor, nombrePila, apellidoPaterno
FROM autores
WHERE apellidoPaterno LIKE ‘_i%’
Observación: Algunas BD utilizan el carácter ‘?’ en lugar del carácter
_ en un patrón.
Extracción de Datos: SELECT
Se puede usar IS NULL si queremos
consultar los datos que no contienen valores.
Devuelve verdadero si una expresión
contiene un nulo.
Ej:
SELECT nombre, apellidos FROM personas
WHERE teléfono IS NULL
Esa instrucción selecciona a la gente que no
tiene teléfono.
Extracción de Datos: SELECT
Para realizar la Reunión Natural o Join Para
unir los datos de varias tablas es necesario
establecer la(s) condiciones de enlace entre
las tablas, luego se incorporan los criterios
(opcionales) de filtrado de la consulta.
SELECT nombreColumna1, nombreColumna2,...
FROM nombreDeTabla(s)
WHERE condiciones de enlace + AND +
criterios de filtrado de filas
Extracción de Datos: SELECT
Ejemplo:
SELECT Empresa.idempresa, Empresa.nomempresa,
Planilla.numeroPlanilla, Planilla.Fechaempresa
FROM Empresa, Planilla
WHERE Empresa.idempresa=Planilla.idempresa
AND Planilla.totalsalarios>50000
Extracción de Datos: SELECT
Ejemplo:
Empleado
Código Nombre Edad Depto Departamento
1 Jorge Campos 33 1
2 Enrique Muñoz 25 1 Depto Descripción
3 Esteban Paz 21 1 1 Administración
8 Jorge Arias 30 2 2 Producción
10 Juan Martínez 19 2 3 Ventas
12 Anselmo Rodas 28 6 4 Finanzas
SELECT * FROM empleado, departamento
WHERE empleado.depto = departamento.depto
Extracción de Datos: SELECT
Ej: SELECT *
FROM proveedores, suministros
WHERE proveedores.codigo_p=suministros.codigo_p
Recordar: el “poder” de las relaciones radica en la
“conexión” entre una clave primaria y su respectiva clave
externa.
Extracción de Datos: SELECT
Renombramiento con AS: Se puede emplear la
cláusula AS para generar alias en las diferentes
tablas.
Ej: SELECT *
FROM empleado AS e, departamento AS d
WHERE e.depto = d.depto
Ej: SELECT *
FROM proveedores P, suministros S
WHERE P.codigo_p=S.codigo_p
Nota: El SQL estándar exige siempre el uso de AS, aunque
algunos SGBD como Oracle y Access lo suprimen…
Extracción de Datos: SELECT
La claúsula Order By: El resultado de una
consulta puede ordenarse en forma ascendente
o descendente, mediante el uso de la cláusula
ORDER BY opcional.
La forma básica para ordenar ascendentemente es:
SELECT nombreColumna1, nombreColumna2, ...
FROM nombreDeTabla
ORDER BY columna ASC
Extracción de Datos: SELECT
La forma básica para ordenar en forma descendente
es:
SELECT nombreColumna1, nombreColumna2, ...
FROM nombreDeTabla
ORDER BY columna DESC
Ejemplo:
SELECT idAutor, nombrePila, apellidoPaterno
FROM autores
ORDER BY apellidoPaterno ASC
Extracción de Datos: SELECT
Funciones de Agregación: Se usa en un grupos de
registros para devolver un único valor que se aplica a
dicho grupo de registros, es decir, un solo valor que
resume la información de varias filas.
Función Descripción
AVG Utilizada para calcular el promedio de los valores
de un campo determinado
COUNT Utilizada para devolver el número de registros de
la selección
SUM Utilizada para devolver la suma de todos los
valores de un campo determinado
Extracción de Datos: SELECT
Función Descripción
MAX Utilizada para devolver el valor más alto de un campo
especificado.
MIN Utilizada para devolver el valor más bajo de un
campo especificado.
Se puede usar GROUP BY con estas funciones para
consolidar por grupos comunes.
Extracción de Datos: SELECT
Ejemplos:
1.- Obtener la suma de los importes de las ordenes de
compra:
SELECT SUM(importe) FROM orden;
2.- Numero de productos que se fabrican
SELECT COUNT(DISTINCT cod_prod)
FROM productos;
3.- Empleados que trabajan en el departamento 10;
SELECT COUNT(*) FROM empleados
WHERE num_dpto=10;
Extracción de Datos: SELECT
Ejemplos:
4.- Numero de empleados de cada departamento
SELECT num_dept, COUNT(*) FROM empleados
GROUP BY num_dpto;
Extracción de Datos: SELECT
Cláusula HAVING: selecciona alguno de los
grupos definidos por GROUP BY, según una
condición.
Se puede usar HAVING para establecer
condiciones para los grupos (HAVING es para
los grupos lo que el WHERE es para las tuplas)
Ej: Lista de los departamentos en que trabaja mas de
50 empleados:
SELECT num_dpto, COUNT(*) FROM empleados
GROUP BY num_dpto HAVING COUNT(*)>50;
Extracción de Datos: SELECT
Muchas veces interesa hacer una consulta sobre el
resultado de otra consulta realizada previamente.
Esto son las subconsultas o consultas anidadas,
consultas sobre cuyo resultado se hace otra
consulta.
SELECT campos
FROM tablas
WHERE campo operador_comparativo (
SELECT campos
FROM tablas
WHERE condición
)
Extracción de Datos: SELECT
Primero se ejecuta la subconsulta más interior.
Si lo que se obtiene es un único valor, el
operador comparativo puede ser (>,<,>=,<=,!=,
=). Pero si lo que se obtiene es una lista de
valores se utiliza el operador IN.
Si se utiliza un operador aritmético y lo que
devuelve la subconsulta es una lista de valores
dara error.
Extracción de Datos: SELECT
Se puede colocar el SELECT dentro de las
cláusulas WHERE, HAVING o FROM.
SELECT nombre_empleado, paga
FROM empleados
WHERE paga < (
SELECT paga
FROM empleados
WHERE nombre_empleado='Martina‘
)
Extracción de Datos: SELECT
CLAUSULAS QUE NOS PUEDEN AYUDAR CON
SUBCONSULTAS:
ANY: puede acompañar a los comparadores aritméticos,
para que podamos comprobar si ALGÚN elemento del
conjunto/lista, cumple la comparación.
ALL: puede acompañar a los comparadores aritméticos,
para que podamos comprobas si TODOS los elemenos
del conjunto/lista, cumplen la comparación.
SELECT nombre_empleado, paga
FROM empleados
WHERE paga < ALL (
SELECT paga
Extracción de Datos: SELECT
Agrupamientos:
UNION: Junta el resultado de dos consultas,
eliminando los elementos duplicados del resultado.
permite añadir el resultado de un SELECT a otro
SELECT.
Para ello ambas instrucciones tienen que utilizar el
mismo número y tipo de columnas.
SELECT Columna1 FROM Tabla1 UNION
SELECT Columna1 FROM Tabla2;
Ej:
SELECT nombre FROM provincias UNION
SELECT nombre FROM comunidades
Extracción de Datos: SELECT
UNION ALL: Junta el resultado de dos consultas, sin
eliminar los elementos duplicados del resultado.
SELECT Columna1 FROM Tabla1 UNION ALL
SELECT Columna1 FROM Tabla2;
INTERSECT: solo devuelve los elementos comunes
a ambas selecciones.
SELECT Columna1 FROM Tabla1 INTERSECT
SELECT Columna1 FROM Tabla2;
Extracción de Datos: SELECT
MINUS: devuelve las filas resultantes de la primera
consulta que no este presentes en la segunda
consulta.
SELECT Columna1 FROM Tabla1 MINUS
SELECT Columna1 FROM Tabla2;
Nota: Se podrían hacer varias combinaciones anidadas
(una unión cuyo resultado se intersectara con otro
SELECT por ejemplo), en ese caso es conveniente
utilizar paréntesis para indicar qué combinación se hace
primero.
Extracción de Datos: SELECT
Ejemplo: Obtener el nombre de los alumnos que
han aprobado la asignatura de código 1.
SELECT Nombre, Apellidos
FROM Alumno
WHERE N_mat IN (
SELECT N_mat
FROM Matriculados
WHERE (Notas >= 5 AND Cod_asig = 1)
)
Extracción de Datos: SELECT
Ejemplo: Obtener el número de matrícula de los
alumnos que han aprobado Programación en
Lenguajes Estructurados (PLE).
SELECT N_mat
FROM Matriculados
WHERE Cod_asig = (
SELECT Cod_asig
FROM Asignatura
WHERE Nombre_asig = ‘PLE’
)
Extracción de Datos: SELECT
Ejercicio:
socio (codsocio, nombre, dirección, teléfono)
película (codpeli, titulo, genero)
copia (codcopia, codpeli)
préstamo (codsocio, codcopia, fecha, pres_dev)
lista_espera (codsocio, codpeli, fecha)
Extracción de Datos: SELECT
1.- Presentar el título de las películas que nunca
se han prestado:
SELECT DISTINCT pel.titulo
FROM pelicula AS pel
WHERE pel.titulo NOT IN (
SELECT pel.titulo
FROM pelicula AS pel, prestamo AS pr, copia AS co
WHERE pr.codcopia=co.codcopia
AND co.codpeli=pel.codpeli
)
Extracción de Datos: SELECT
Otra manera de realizar la anterior consulta, que
evita la realización de uno de los joins es:
SELECT DISTINCT pel.titulo
FROM pelicula AS pel
WHERE pel.codpeli NOT IN (
SELECT co.codpeli
FROM prestamo AS pr, copia AS co
WHERE pr.codcopia=co.codcopia
)
Extracción de Datos: SELECT
2.- Calcular el número de veces que se ha
prestado la película más prestada.
SELECT MAX(cuenta) AS numero_veces
FROM (
SELECT DISTINCT COUNT(*) AS cuenta
FROM pelicula AS pe, prestamo AS pr, copia AS co
WHERE pr.codcopia=co.codcopia
AND co.codpeli=pe.codpeli
GROUP BY pe.codpeli
)
Extracción de Datos: SELECT
La sentencia SELECT tiene el siguiente
formato:
SELECT [ALL | DISTINCT] campos
FROM tablas
[WHERE condiciones]
[ORDER BY campos [ASC | DESC] ]
[HAVING condiciones]
[GROUP BY campos]
Inserción de Datos: INSERT
Sintaxis:
INSERT INTO NombreTabla VALUES (Valor1,
Valor2, Valor3)
Si utiliza el mismo orden en que los campos se listan en
la relación.
También puede usar:
INSERT INTO NombreTabla (campo1, campo2,
campo3) VALUES (valor1, valor2, valor3)
Si no se recuerda el orden de los campos.
Inserción de Datos: INSERT
Sintaxis:
INSERT INTO NombreTabla (SUBCONSULTA)
La subconsulta debe devolver tantos campos y del
mismo tipo como la tabla NombreTabla contiene.
INSERT INTO HISTORIALCLIENTES
(SELECT *
FROM clientes
WHERE fecha_alta>'2018-01-01')
Inserción de Datos: INSERT
Ejemplos:
INSERT INTO Departamento
VALUES (50, ‘Análisis’, 30, NULL)
INSERT INTO Departamento (Id_dpto, Nombre,
nº_empleados)
VALUES (50, ‘Análisis’, 30) el resto de los valores de
los campos que quedan los inserta con valores nulos.
Borrado de Datos: DELETE
Sintaxis:
DELETE FROM nombre_tabla
WHERE condición
Ejemplo:
DELETE FROM empleado WHERE id=15
DELETE FROM Departamentos
WHERE Fecha_creac < ‘1/1/2000’
Actualización de Datos: UPDATE
Cuando se desea cambiar un valor dentro de
una fila, sin cambiar todos los valores de la
misma, se utiliza UPDATE.
Sintaxis:
UPDATE NombreTabla
SET campo1=valor1
[WHERE condicion]
Actualización de Datos: UPDATE
Ejemplo: Si se quiere realizar el pago de intereses
anuales y todos los saldos se incrementasen en un 5%:
UPDATE cuenta
SET saldo = saldo * 1.05
No se pone ninguna condición esta actualización se
aplica una vez a cada tupla o fila de la tabla cuenta.
Ejemplo:
UPDATE departamento
SET nombre = ‘G. INFORMA’
WHERE id_depto = 20
Preferencia de Operadores
A veces las expresiones que se producen en los
SELECT son muy extensas y es difícil saber
que parte de la expresión se evalúa primero, por
ello se indica la siguiente tabla de precedencia:
Orden de precedencia Operador
1 * (Multiplicar) / (Dividir)
2 + (Suma) – (Resta)
3 || (Concatenación)
4 Comparaciones (>, <, !=, ...)
Preferencia de Operadores
Orden de precedencia Operador
5 IS [NOT] NULL, [NOT] LIKE, IN
6 NOT
7 AND
8 OR