Queries
Las consultas, el comando select
, es la verdadera razón por la que estamos aquí. Todo lo demás fue una probadita de labores administrativas, de diseño y de desarrollo de bases de datos y los sistemas que lo soportan.
Para poder trabajar en toda esta unidad, vamos a requerir la BD Northwind, que es la que usa Microsoft para demo de sus productos. Igual usaremos durante las siguientes sesiones la BD de Sakila.
Es importante que la BD Northwind se instale en un esquema llamado northwind
, para no batir nuestra base Sakila previamente instalada.
Instalando la BD Northwind
- Descarguen el archivo
northwind/northwind.postgre.sql
. - Creen el esquema
northwind
en su BDpostgres
. - Carguen el archivo
northwind/northwind.postgre.sql
en DBeaver. - Seleccionen el esquema
northwind
para ejecutar el script. - Ejecuten el script con
Alt+X
.
Su base de datos debe quedar así:
De qué trata la BD Northwind?
Es una BD ficticia de una empresa importadora y exportadora de alimentos. Una vista rápida a los primeros 100 registros al catálogo de products
nos revela la naturaleza de esta BD:
select * from products p limit 10;
Jarabe de anís, sazonador cajún, peras deshidratadas, salsa de arándano. Parecen ultramarinos, no?
Ahora un recap dela funcionalidad básica de los queries.
El *
en el comando select
nos indica que vamos a seleccionar todos los atributos o columnas.
La cláusula limit 10
nos permite seleccionar los primeros 10 registros de la tabla. Si queremos seleccionar los últimos 10, entonces debemos de usar el truco de voltear la tabla y seleccionar los primeros 10:
select * from products p order by product_id desc limit 10;
La cláusula order by ProductID desc
es, literal, ordena por el campo ProductID de forma descendente. El campo por el cual vamos a ordenar debe estar incluído en los atributos que vamos a seleccionar con el comando select
. La cláusula desc
significa descending.
IMPORTANTE: el propósito del comando
select
y de las consultas en general es responder preguntas, de modo que haremos estos ejercicios a manera de pregunta.
Queries de ejemplo
Primero vamos a ejecutar algunos ejemplos para que se familiaricen con las variantes de select
.
- Obtener nombre de producto y cantidad de producto por unidad
select p.product_name , p.quantity_per_unit from products p;
- Obtener nombre de producto y su id
"Se deja como ejercicio al lector" xD
- Obtener nombre de producto y su id de productos descontinuados
select p.product_id , p.product_name , p.discontinued from products p where p.discontinued = 1;
- Obtener el nombre y precio unitario del producto más caro y del más barato
select p.product_name , p.unit_price from products p order by p.unit_price desc limit 1;
y
select p.product_name , p.unit_price from products p order by p.unit_price limit 1;
- Obtener el id, el nombre y el precio unitario para productos de menos de $20 en precio unitario
select p.product_id , p.product_name , p.unit_price from products p where p.unit_price < 20;
- Obtener el id, el nombre y el precio unitario para productos que cuesten entre $15 y $25
select p.product_id , p.product_name , p.unit_price from products p where p.unit_price >= 15 and p.unit_price <= 25;
- Obtener nombre y precio unitario de productos por arriba del precio promedio de todo nuestro catálogo
select p.product_name , p.unit_price from products p where p.unit_price > (select avg(p2.unit_price) from products p2);
- Nombres y precios unitarios de 10 productos más caros
select p.product_name , p.unit_price from products p order by p.unit_price desc limit 10;
- Conteo de los productos descontinuados y los que aún se tiene en inventario
select count(p.product_id) from products p where p.discontinued = 1 and p.units_in_stock != 0;
- Obtener el nombre, la cantidad de unidades en órdenes y la cantidad en stock de productos cuya cantidad en órdenes sea mayor a la cantidad en stock
select p.product_name , p.units_in_stock ,p.units_on_order from products p where p.units_on_order > p.units_in_stock;
Si agregamos el campo p.discontinued
a ésta última consulta, podríamos contar la historia de "tenemos una órden de 40 de un producto que tenemos en inventario solo 17 y este producto ha sido descontinuado, por lo que tendremos problemas para hacerle fulfillment a esa orden y tendremos que poner nuestra cara de idiotas y ofrecer reemplazo de producto".
Elementos de un select
Un select tiene los siguientes elementos:
nombre de la cláusula | Propósito |
---|---|
select columna1, columna2,...,columna_n |
Determina las columnas que incluiremos en este espacio de ejecución |
from tabla1 [join tabla2 on (llave copiada)] |
Determina las tablas a las que pertenecen las columnas que seleccionamos arriba |
where condición booleana |
Filtra renglones no deseados para efectos de la consulta |
group by campo a agrupar |
Agrupa y agrega valores utilizando columnas que tengan la misma data |
having condición booleana |
Filtra grupos no deseados para el objetivo de nuestra consulta |
order by campo de ordenamiento [asc/desc] |
Ordena de forma asc y desc los resultados de la consulta |
No todos son obligatorios, pero esta es la base para un query útil que puede responder preguntas.
Ejercicios - Tarea 1
- Qué contactos de proveedores tienen la posición de sales representative?
select s.contact_name from suppliers s where s.contact_title = 'Sales Representative';
- Qué contactos de proveedores no son marketing managers?
select s.contact_name from suppliers s where s.contact_title != 'Marketing Manager';
- Cuales órdenes no vienen de clientes en Estados Unidos?
select o.customer_id from orders o join customers c on (o.customer_id = c.customer_id) where c.country != 'USA';
ó bien
select o.customer_id from orders o where o.ship_country != 'USA';
Podemos comprobar que ambos enfoques son los mismos con este query:
select o.order_id, o.ship_country, c.customer_id, c.country from orders o join customers c on o.customer_id = c.customer_id where c.country != 'USA'
- Qué productos de los que transportamos son quesos?
select distinct od.product_id, p.product_name from order_details od join products p on (od.product_id = p.product_id) where p.category_id = 4;
ó bien, un enfoque más pedestrian:
select * from products p2 where p2.product_name like '%Queso%'
-
Qué ordenes van a Bélgica o Francia?
-
Qué órdenes van a LATAM?
-
Qué órdenes no van a LATAM?
-
Necesitamos los nombres completos de los empleados, nombres y apellidos unidos en un mismo registro
-
Cuánta lana tenemos en inventario?
-
Cuantos clientes tenemos de cada país?