Está en la página 1de 10

Herramientas para el

modelamiento de bases de
datos y consultas con SQL
Módulo 4

HERRAMIENTAS PARA EL MODELAMIENTO DE BASES DE DATOS Y CONSULTAS CON SQL - TELEDUC 1


Sentencias para la optimización del filtrado y sumarización de datos

En este documento se encontrarán las consultas realizadas en la clase del módulo 4 y otros
ejemplos que complementan y/o detallan la información entregada.

Tema 1: Queries a tablas simples

USE Empresa;
-- Revisión de los datos de las tablas
SELECT * FROM Cargo;
SELECT * FROM Cliente;
SELECT * FROM Comuna;
SELECT * FROM Empleado;
SELECT * FROM Producto;
SELECT * FROM ProductoCliente;

/* Las columnas numéricas se puede comparar con símbolos:


> mayor que
< menor que
>= mayor o igual que
<= menor o igual que
= igual que (también se utiliza con textos)
<> distinto que (también se utiliza con textos)
!= no es igual que (No es norma ISO)
!> no es mayor que (No es norma ISO)
!< no es menor que (No es norma ISO) */

-- Todos los empleados llamados Jessica


SELECT *
FROM Empleado
WHERE Emp_Nombre = 'Jessica';

-- Todos los clientes de apellidos Perez


SELECT *
FROM Cliente
WHERE Cli_Apellido = 'Perez';

-- Todos los empleados con sueldo entre 200.000 y 600.000


SELECT *

HERRAMIENTAS PARA EL MODELAMIENTO DE BASES DE DATOS Y CONSULTAS CON SQL - TELEDUC 2


FROM Empleado
WHERE Emp_Sueldo BETWEEN 200000 AND 600000;

-- Otro método
SELECT *
FROM Empleado
WHERE Emp_Sueldo >= 200000 AND Emp_Sueldo <= 600000;

-- Todos las ventas entregadas entre junio y julio 2016


SELECT *
FROM ProductoCliente
WHERE Pcl_Fecha_Entrega BETWEEN '2016-06-01' AND '2016-07-31';

-- Todos los sueldos de empleados mayores a 1.000.000


SELECT *
FROM Empleado
WHERE Emp_Sueldo >1000000;

-- Todos las ventas entregadas hasta el 31-Jul-2016


SELECT *
FROM ProductoCliente
WHERE Pcl_Fecha_Entrega <='2016-07-31'
ORDER BY Pcl_Fecha_Entrega DESC;

/* Los textos se pueden comparar de una forma más específica con el uso de LIKE
y luego expresando la manera en la que se hará la comparación: */
/* LIKE
'A%‘ comienza con
'%A‘ termina con
'%A%‘ contiene
'_A%‘ segundo caracter a
'%A_‘ penúltimo caracter a
'__A%‘ tercer caracter a
'_A_E%‘ segundo caracter a y cuarto caracter e */

-- Todos los empleados que su apellido comience con P


SELECT *
FROM Empleado
WHERE Emp_Apellido LIKE 'P%';

-- Todos los empleados que su apellido comience con P y su nombre comience con
M

HERRAMIENTAS PARA EL MODELAMIENTO DE BASES DE DATOS Y CONSULTAS CON SQL - TELEDUC 3


SELECT *
FROM Empleado
WHERE Emp_Apellido LIKE 'P%' AND Emp_Nombre LIKE 'M%';

-- Todas las comunas con nombres de Santos


-- Opción 1: Sólo incluye a los San… deja a fuera a las santas y Santo
SELECT *
FROM Comuna
WHERE Com_Nombre LIKE 'San %';

-- Incluye a las Santas


SELECT *
FROM Comuna
WHERE Com_Nombre LIKE 'San %' OR Com_Nombre LIKE 'Santa %';

-- Incluye a los San, Santa y Santo


SELECT *
FROM Comuna
WHERE Com_Nombre LIKE 'San %' OR Com_Nombre LIKE 'Santa %' OR Com_Nombre
LIKE 'Santo %';

-- Versión Optimizada
SELECT *
FROM Comuna
WHERE Com_Nombre LIKE 'San %' OR Com_Nombre LIKE 'Sant_ %';

-- También se puede negar algunas instrucciones para realizar una búsqueda por
descarte
SELECT *
FROM Comuna
WHERE Com_Nombre LIKE 'San%' AND Com_Nombre NOT LIKE 'Santiago%';

-- Todos los empleados que su rut comience con uno y su cargo sea 3
SELECT *
FROM Empleado
WHERE Emp_Rut LIKE '1%' AND Emp_ID_Cargo = 3;

-- Todos los empleados que su apellido tenga como segunda letra una o
SELECT *
FROM Empleado
WHERE Emp_Apellido LIKE '_o%';

HERRAMIENTAS PARA EL MODELAMIENTO DE BASES DE DATOS Y CONSULTAS CON SQL - TELEDUC 4


-- Todos los empleados que su apellido tenga como segunda letra una o y en su
nombre tenga como segunda letra una a
SELECT *
FROM Empleado
WHERE Emp_Apellido LIKE '_o%' AND Emp_Nombre LIKE '_a%';

/*IN se utiliza para generar un "filtro" de datos totalmente conocidos por uno mismo
Acá filtramos a todos los cargos que requieren estudios para realizarse */
SELECT *
FROM Empleado
WHERE Emp_ID_Cargo IN(1, 4, 5);

-- Empleados de cargo tipo 4 ordenados Asc por nombre


SELECT *
FROM Empleado
WHERE Emp_ID_Cargo = 4
ORDER BY Emp_Nombre ASC;

-- Empleados de cargo tipo 4 ordenados Asc por nombre y por apellido Desc
SELECT *
FROM Empleado
WHERE Emp_ID_Cargo = 4
ORDER BY Emp_Nombre ASC, Emp_Apellido DESC;

-- SELECCIONAR DATOS ESPECÍFICOS, NO TODOS


-- Seleccionar rut cliente desde ProductoCliente y su saldo
SELECT Pcl_Cli_Rut, Pcl_Saldo
FROM ProductoCliente;

-- Seleccionar el nombre y el apellido del cliente, acá se agregó el nombre de la tabla


pero no es necesario en todos los casos
SELECT Cliente.Cli_Nombre, Cliente.Cli_Apellido
FROM Cliente;

-- Seleccionar el nombre y el apellido del cliente, Alias para la tabla


SELECT C.Cli_Nombre, C.Cli_Apellido
FROM Cliente AS C;

-- Seleccionar el nombre y el apellido del cliente, Alias para la tabla donde la comuna
sea 4
SELECT C.Cli_Nombre, C.Cli_Apellido

HERRAMIENTAS PARA EL MODELAMIENTO DE BASES DE DATOS Y CONSULTAS CON SQL - TELEDUC 5


FROM Cliente AS C
WHERE C.Cli_ID_Comuna = 4;

-- Seleccionar el nombre y el apellido del cliente, Alias para la tabla donde la comuna
sea 4 y alias para los campos
SELECT C.Cli_Nombre AS Nombre, C.Cli_Apellido AS Apellido
FROM Cliente AS C
WHERE C.Cli_ID_Comuna = 4;

-- Seleccionar rut cliente desde ProductoCliente y su saldo ordenado por Rut


SELECT Pcl_Cli_Rut, Pcl_Saldo
FROM ProductoCliente
ORDER BY Pcl_Cli_Rut;

-- Seleccionar el rut con la suma de su saldo (21)


SELECT Pcl_Cli_Rut, SUM(Pcl_Saldo) AS Saldo_Total
FROM ProductoCliente
GROUP BY Pcl_Cli_Rut
ORDER BY Pcl_Cli_Rut ASC;

-- Contar cuantas veces se repiten los apellidos de los empleados


SELECT Emp_apellido, COUNT(*) AS Cant_Repetidos
FROM Empleado
GROUP BY Emp_Apellido
ORDER BY Cant_Repetidos;

/* Seleccionar los tres apellidos más repetidos ordenados alfabéticamente


descendente
COUNT(*) por si mismo limita la salida de una sola fila, COUNT(*) cuenta */
SELECT COUNT(*) AS Repetido, Emp_apellido
FROM Empleado
GROUP BY Emp_Apellido
ORDER BY Repetido DESC, Emp_Apellido DESC
LIMIT 3;

-- Seleccionar el registro que tiene el máximo saldo pero sólo rut y saldo
SELECT Pcl_Cli_Rut AS Run_Cliente, Pcl_Saldo AS Venta_Maxima
FROM ProductoCliente
ORDER BY Pcl_Cli_Rut DESC
LIMIT 1;

HERRAMIENTAS PARA EL MODELAMIENTO DE BASES DE DATOS Y CONSULTAS CON SQL - TELEDUC 6


Tema 2: Queries multitabla

-- Seleccionar el nombre, apellido y la comuna con su nombre


SELECT Empleado.Emp_Nombre, Empleado.Emp_Apellido, Comuna.Com_Nombre
FROM Empleado
INNER JOIN Comuna
ON Empleado.Emp_ID_Comuna = Comuna.Com_ID;

/* Seleccionar el nombre, apellido y la comuna de todos los empleados


que residen en comunas que comienzan con "P" */
SELECT Empleado.Emp_Nombre, Empleado.Emp_Apellido, Comuna.Com_Nombre
FROM Empleado
INNER JOIN Comuna
ON Empleado.Emp_ID_Comuna = Comuna.Com_ID
WHERE Com_Nombre LIKE 'P%';

/* Este método no se considera la manera oficial de resolver el problema porque


cualquier condición
extra debe ser expresada en un WHERE pero hay motores de Bases de Datos en los
que este método
entrega los resultados con menor demora*/
SELECT Empleado.Emp_Nombre, Empleado.Emp_Apellido, Comuna.Com_Nombre
FROM Empleado
INNER JOIN Comuna
ON Empleado.Emp_ID_Comuna = Comuna.Com_ID AND Com_Nombre LIKE
'P%';

-- Seleccionar Productos junto a sus registros de venta (Tabla ProductoCliente)


SELECT * FROM Producto AS p
LEFT JOIN ProductoCliente AS pc
ON pc.Pcl_ID_Prod = p.Prd_ID;

-- Seleccionar Productos que no han sido vendidos (2)


SELECT * FROM Producto AS p
LEFT JOIN ProductoCliente AS pc
ON pc.Pcl_ID_Prod = p.Prd_ID
WHERE pc.Pcl_ID_Prod IS NULL;

-- Seleccionar cantidad de ventas de cada Producto (10)


SELECT p.*, COUNT(pc.Pcl_ID_Prod) AS Cantidad_Ventas FROM Producto AS p
LEFT JOIN ProductoCliente AS pc
ON pc.Pcl_ID_Prod = p.Prd_ID

HERRAMIENTAS PARA EL MODELAMIENTO DE BASES DE DATOS Y CONSULTAS CON SQL - TELEDUC 7


GROUP BY p.Prd_ID, p.Prd_Nombre;
/* Seleccionar Productos que han sido vendidos sólo una vez
HAVING se utiliza como un WHERE exclusivo para las funciones de agregación
y es requerido cuando usamos cláusulas de agregación (Aggregation)/*
SELECT p.*, COUNT(Pcl_ID_Prod) AS Cantidad_Ventas FROM Producto AS p
LEFT JOIN ProductoCliente AS pc
ON pc.Pcl_ID_Prod = p.Prd_ID
GROUP BY p.Prd_ID, p.Prd_Nombre
HAVING COUNT(Pcl_ID_Prod) = 1;

-- Seleccionar Productos que no han sido vendidos (Parte 2)


SELECT p.*, COUNT(Pcl_ID_Prod) AS Cantidad_Ventas FROM Producto AS p
LEFT JOIN ProductoCliente AS pc
ON pc.Pcl_ID_Prod = p.Prd_ID
GROUP BY p.Prd_ID, p.Prd_Nombre
HAVING COUNT(Pcl_ID_Prod) = 0;

-- Seleccionar Productos que han sido vendidos más de una vez


SELECT p.*, COUNT(pc.Pcl_ID_Prod) AS Cantidad_Ventas FROM Producto AS p
LEFT JOIN ProductoCliente AS pc
ON pc.Pcl_ID_Prod = p.Prd_ID
GROUP BY p.Prd_ID
HAVING COUNT(pc.Pcl_ID_Prod) > 1;

-- Seleccionar Productos y sus ventas entre el 01/04/2016 y el 30/06/2016


SELECT * FROM Producto AS p
JOIN ProductoCliente AS pc
ON pc.Pcl_ID_Prod = p.Prd_ID
WHERE pc.Pcl_Fecha_Entrega BETWEEN '2016-04-01' AND '2016-06-30';

-- Seleccionar Productos y cantidad de ventas entre el 01/04/2016 y el 30/06/2016


SELECT p.*, COUNT(pc.Pcl_ID_Prod) AS Cantidad_Ventas FROM Producto AS p
JOIN ProductoCliente AS pc
ON pc.Pcl_ID_Prod = p.Prd_ID
WHERE pc.Pcl_Fecha_Entrega BETWEEN '2016-04-01' AND '2016-06-30'
GROUP BY p.Prd_ID;

HERRAMIENTAS PARA EL MODELAMIENTO DE BASES DE DATOS Y CONSULTAS CON SQL - TELEDUC 8


/* Seleccionar todas las ventas complementando la información
con el detalle del producto y los datos de los clientes.

Contendrá información de las siguientes tablas:


Producto: ID, Nombre.
Cliente: Rut, Nombre, Apellido.
ProductoCliente: Fecha entrega, Saldo.

Poner alias en las columnas para quitar los prefijos


*/
SELECT P.Prd_ID AS "ID Producto",
P.Prd_Nombre AS "Nombre Producto",
PC.Pcl_Cli_Rut AS "Rut Cliente",
C.Cli_Nombre AS "Nombre Cliente",
C.Cli_Apellido AS "Apellido Cliente",
PC.Pcl_Fecha_Entrega AS "Fecha Venta",
PC.Pcl_Saldo AS "Monto Venta"
FROM ProductoCliente AS PC
INNER JOIN Cliente AS C
ON PC.Pcl_Cli_Rut = C.Cli_Rut
LEFT JOIN Producto AS P
ON PC.Pcl_ID_Prod = P.Prd_ID;

/* Cambiando la posición de las tablas e incluyendo la información no coincidente


el resultado puede ser diferente */
SELECT P.Prd_ID AS "ID Producto",
P.Prd_Nombre AS "Nombre Producto",
PC.Pcl_Cli_Rut AS "Rut Cliente",
C.Cli_Nombre AS "Nombre Cliente",
C.Cli_Apellido AS "Apellido Cliente",
PC.Pcl_Fecha_Entrega AS "Fecha Venta",
PC.Pcl_Saldo AS "Monto Venta"
FROM Producto AS P
LEFT JOIN ProductoCliente AS PC
ON PC.Pcl_ID_Prod = P.Prd_ID
LEFT JOIN Cliente AS C
ON PC.Pcl_Cli_Rut = C.Cli_Rut;

HERRAMIENTAS PARA EL MODELAMIENTO DE BASES DE DATOS Y CONSULTAS CON SQL - TELEDUC 9


Tema 3: Subconsultas

-- Ventas máximas de cada producto con su nombre


SELECT P.Prd_Nombre,
(SELECT MAX(PC.Pcl_Saldo)
FROM ProductoCliente AS PC
WHERE p.Prd_ID = PC.Pcl_ID_Prod) AS Precio_Max
FROM Producto AS P
ORDER BY Precio_Max DESC;

-- Todas las ventas que su precio total de venta sea


-- mayor al promedio de ventas de la tabla
SELECT P.Prd_Nombre, PC.Pcl_Saldo
FROM Producto AS P
LEFT JOIN ProductoCliente AS PC
ON PC.Pcl_ID_Prod = P.Prd_ID
WHERE PC.Pcl_Saldo > (SELECT AVG(Pcl_Saldo)FROM ProductoCliente);

-- Total de ventas de cada producto con su nombre


SELECT P.Prd_Nombre,
(SELECT SUM(PC.Pcl_Saldo)
FROM ProductoCliente AS PC
WHERE P.Prd_ID = PC.Pcl_ID_Prod
GROUP BY PC.Pcl_ID_Prod) AS Precio_Total
FROM Producto AS P
ORDER BY Precio_Total DESC;

HERRAMIENTAS PARA EL MODELAMIENTO DE BASES DE DATOS Y CONSULTAS CON SQL - TELEDUC 10

También podría gustarte