BBDD Lenguaje DML
BBDD Lenguaje DML
BBDD Lenguaje DML
U.T.4
Realización de consultas con SQL
El lenguaje DML
Las sentencias DML del lenguaje SQL son consultas
(query) o peticiones a la base de datos del tipo:
SELECT
Extrae información de la base de datos
INSERT
Insertar uno o varios registros en alguna tabla.
DELETE
Borra registros de una tabla
UPDATE
Modifica registros de una tabla.
La sentencia SELECT
Es la sentencia más versátil de SQL y por tanto la más
compleja.
Se utiliza para obtener información de la base de
datos.
Es posible ejecutar sentencias muy sencillas que
muestran todos los registros de una tabla:
#Consulta 1: Obtener todos los campos de
todos los registros de la tabla empleados
SELECT * FROM empleados
La sentencia SELECT
Y también consultas que devuelven información filtrada de
múltiples tablas, utilizando incluso tablas virtuales:
#consulta 2: Obtener el total de los pedidos de los
clientes de una tienda ordenados por dicha cantidad total
SELECT NombreCliente, Tot.Cantidad
FROM Clientes INNER JOIN Pedidos
ON Clientes.NumeroCliente=Pedidos.NumeroCliente
INNER JOIN(SELECT sum(Cantidad*PrecioUnidad) as
Cantidad, NumeroPedido FROM DetallePedidos
GROUP BY NumeroPedido) Tot
ON Pedidos.numeroPedido=Tot.NumeroPedido
ORDER BY Tot.Cantidad.
SELECT – Sentencia básica
SELECT [DISTINCT] select_expr
[,select_expr] ... [FROM tabla]
select_expr:
nombre_columna [AS alias]
| *
| expresion
Operadores lógicos:
AND, OR, NOT
Toman como operandos los valores lógicos cierto (1) y
falso (0), además del valor nulo (null) (tabla pág 139)
Expresiones para filtros
Paréntesis: ()
Alteran la prioridad de los operadores.
Funciones: https://
dev.mysql.com/doc/refman/5.0/en/functions.html
date_add ()
date_sub ()
now()
concat ()
…
Filtros - Expresiones
#expresión 1 (oracle): (2+3)*7
SELECT (2+3)*7 from dual;
(2+3)*7
----------
35
Su sintaxis es:
nombre_columna BETWEEN valor1 AND valor2
Filtros con operador de rango
SELECT Nombre,Nombre_equipo,Peso FROM jugadores
WHERE Peso BETWEEN 270 AND 300;
+----------------+---------------+------+
| Nombre | Nombre_equipo | Peso |
+----------------+---------------+------+
| Chris Richard | Timberwolves | 270 |
| Paul Davis | Clippers | 275 |
| .... | .... | ... |
| David Harrison | Pacers | 280 |
+----------------+---------------+------+
#consulta 2
#¿Cuánto mide el jugador más bajito de la nba?
SELECT min(altura) FROM jugadores;
#consulta 3
#¿Cuántos jugadores tienen los Lakers?
SELECT count(*) FROM jugadores WHERE Nombre_equipo='Lakers';
#consulta 4
#¿Cuánto pesan de media los jugadores de los Blazers?
SELECT avg(peso) FROM jugadores WHERE Nombre_equipo='Blazers';
Consultas resumen
Con las consultas resumen se pueden realizar
agrupaciones de registros.
El agrupamiento se lleva a cabo mediante la cláusula
GROUP BY .
Las columnas seleccionadas en un SELECT con agrupación
deben ser: una constante, una función de grupo, una
columna expresada en el GROUP BY.
Se puede establecer una condición de búsqueda o filtro
para los grupos, mediante la cláusula HAVING .
HAVING controla cual de los grupos se visualiza => Filtra
los resultados calculados mediante agrupaciones.
Agrupaciones
SELECT [DISTINCT] select_expr
[,select_expr] ...
[FROM tabla]
[WHERE filtro]
[GROUP BY expr [, expr].... ]
[ORDER BY {nombre_columna | expr |
posición} [ASC | DESC] , ...]
Agrupaciones
SELECT * FROM vehiculos;
+-----------+----------------+---------+
| matricula | modelo | marca |
+-----------+----------------+---------+
| 1129FGT | ibiza gt | seat |
| 1132GHT | leon tdi 105cv | seat |
| M6836YX | corolla g6 | toyota |
| 7423FZY | coupe | hyundai |
| 3447BYD | a3 tdi 130cv | audi |
+-----------+----------------+---------+
Agrupaciones
SELECT marca, count(*) FROM
vehiculos GROUP BY marca;
+---------+----------+
| marca | count(*) |
+---------+----------+
| audi | 1 |
| hyundai | 1 |
| seat | 2 |
| toyota | 1 |
+---------+----------+
Agrupaciones - Ejemplos
#¿Cuánto pesa el jugador más pesado de
cada equipo?
#¿Cuántos equipos tiene cada conferencia
en la nba?
#¿Cuánto pesan de media los jugadores de
españa, francia e italia?
Agrupaciones – error típico
SELECT count(*),conferencia FROM equipos;
referencias_tablas:
referencia_tabla[, referencia_tabla] ...
| referencia_tabla [INNER | CROSS] JOIN referencia_tabla [ON condición]
| referencia_tabla LEFT [OUTER] JOIN referencia_tabla ON condición
| referencia_tabla RIGHT [OUTER] JOIN referencia_tabla ON condición
referencia_tabla:
nombre_tabla [[AS] alias]
Producto cartesiano
SELECT * FROM propietarios;
+-----------+--------------------+
| dni | nombre |
+-----------+--------------------+
| 51993482Y | José Pérez |
| 2883477X | Matías Fernández |
| 37276317Z | Francisco Martínez |
+-----------+--------------------+
+-----------------+--------------------------------+--------------+
| Nombre | NombreCliente | CodigoPedido |
+-----------------+--------------------------------+--------------+
| Emmanuel | Naturagua | 18 |
| Emmanuel | Beragua | 16 |
.....
| Walter Santiago | DGPRODUCTIONS GARDEN | 65 |
| Walter Santiago | Gardening & Associates | 58 |
+-----------------+--------------------------------+--------------+
Join - Ejemplos
SELECT Empleados.Nombre,COUNT(Pedidos.CodigoPedido) as
NumeroDePedidos
FROM Clientes, Pedidos, Empleados
WHERE Clientes.CodigoCliente=Pedidos.CodigoCliente
AND Empleados.CodigoEmpleado=Clientes.CodigoEmpleadoRepVentas
GROUP BY Empleados.Nombre
ORDER BY NumeroDePedidos;
+-----------------+-----------------+
| Nombre | NumeroDePedidos |
+-----------------+-----------------+
| Michael | 5 |
| Lorena | 10 |
| ... | .. |
| Walter Santiago | 20 |
+-----------------+-----------------+
Consultas multitabla SQL2
Join Interna
De equivalencia (INNER)
Natural (NATURAL)
Producto Cartesiano (CROSS JOIN)
Join Externa
De tabla izquierda (LEFT JOIN)
De tabla derecha (RIGHT JOIN)
Completa (FULL JOIN)
Composiciones internas (INNER JOIN)
SELECT * FROM animales INNER JOIN propietarios
ON animales.propietario = propietarios.dni;
+--------+----------+----- +-------------+-----------+-------------------+
| codigo | nombre | tipo | propietario | dni | nombre |
+--------+----------+----- +-------------+-----------+--------------- ---+
| 1 | Cloncho | gato | 51993482Y | 51993482Y | José Pérez |
| 2 | Yoda | gato | 51993482Y | 51993482Y | José Pérez |
| 3 | Sprocket | perro| 37276317Z | 37276317Z | Francisco Martínez|
+--------+----------+-------+-------------+-----------+-------------------+
| Empleado | jefe |
+-------------------+-------------------------+
| Marcos Magaña | Ruben López |
| Ruben López | Alberto Soria |
....
| Alberto Soria | Kevin Fallmer |
| Kevin Fallmer | Julian Bellinelli |
| Kevin Fallmer | Mariko Kishi |
+-------------------+-------------------------+
Subconsultas correlacionadas
Subconsulta que contiene una referencia externa, es
decir, una referencia en la cláusula FROM a alguna
tabla de cualquiera de las subconsultas contenedoras
de dicha subconsulta correlacionada.
Los resultados de la subconsulta están
correlacionados con cada fila individual de la consulta
principal.
Subconsultas correlacionadas
Lista todas las oficinas cuyos objetivos exceden a la suma
de las cuotas de los vendedores que trabajan en ellas.
SELECT Ciudad
FROM Oficinas
WHERE Objetivo > (SELECT SUM(Cuota)
FROM RepVentas
WHERE Oficina_rep=Oficina)
Consultas con tablas derivadas
Son aquellas que utilizan sentencias SELECT en la cláusula FROM en
lugar de nombres de tablas.
Especie de tabla temporal cuyo contenido es el resultado de
ejecutar una consulta.
Ayudan a obtener información relacionada de forma mucho más
avanzada.
Las tablas derivadas no tienen limitación, es decir, se pueden unir a
otras tablas, filtrar, agrupar, etc. Para facilitar su uso se suelen
identificar con un alias mediante la cláusula AS.
Consultas con tablas derivadas
SELECT * FROM
(SELECT CodigoEmpleado, Nombre
FROM Empleados
WHERE CodigoOficina='TAL-ES')
as tabla_derivada;
Tablas derivadas - ejemplo
Se desea sacar el importe del pedido de menor coste
de todos los pedidos
1º: sacar el total de todos los pedidos
2º: sacar el pedido con menor coste con la función de
columna MIN
Tablas derivadas - ejemplo
#1º calcular el total de cada pedido
SELECT (SUM(Cantidad*PrecioUnidad)) as total, CodigoPedido
FROM DetallePedidos
GROUP BY CodigoPedido;
+-------+--------------+
| total | CodigoPedido |
+-------+--------------+
| 1567 | 1 |
| 7113 | 2 |
| 10850 | 3 |
....
| 154 | 117 |
| 51 | 128 |
+-------+--------------+
Tablas derivadas - ejemplo
#2: Para calcular el menor pedido, se puede hacer una tabla
# derivada de la consulta anterior y con la función MIN
# obtener el menor de ellos:
SELECT MIN(total) FROM (
SELECT SUM(Cantidad*PrecioUnidad) as total, CodigoPedido
FROM DetallePedidos
GROUP BY CodigoPedido) AS TotalPedidos;
+------------+
| MIN(total) |
+------------+
| 4 |
+------------+
#TotalPedidos es la tabla derivada formada
#por el resultado de la consulta entre paréntesis