Hoy Consultas por temas del parcial de mañana
Hangout
En esta sección, trataremos de comprender cómo se realiza la recuperación de datos de una base de datos relacional.Utilizaremos el lenguaje estándar SQL (Structure Query Language o Lenguaje de Consulta Estructurado).
Para ver la descripción de una tabla, utilizaremos la sentencia
DESCRIBE <tabla>
- <tabla> es el nombre de la tabla que queremos inspeccionar. Este nombre debe respetar las mayúsculas.
Nos concentraremos en la sentencia SELECT que nos permite seleccionar datos de una o mas tablas de la base de datos.
El formato básico que utilizaremos por el momento es:
SELECT * FROM <tabla>
- SELECT es la sentencia. La orden que queremos que el cliente le solicite al servidor.
- FROM es una cláusula que indica al motor de bases de datos de qué tabla o tablas tiene que sacar los registros.
- <tabla> es la tabla de donde queremos extraer los datos
¿Qué obtuvimos?
Ahora complicaremos un poco mas la sentencia
SELECT <lista de atributos> FROM <tabla>
- <lista de atributos> indica que tenemos que explicitar una lista de los atributos que queremos obtener (es una lista de elementos separados por una coma).
Por ejemplo:
SELECT id_cliente, id_vendedor, id_sector, id_provincia FROM CLIENTES
Veamos éstos ejemplos que tienen algunos errores
SELECT id_clientes FROM CLIENTES
SELECT id_cliente FROM CLIENTE
Resolver ejercicios 1 y 2 de la guía
Condiciones simples
Una condición simple es una comparación que se realiza entre dos elementos del mismo tipo
El resultado de una comparación arroja un valor Verdadero o Falso
<elemento> <comparador> <elemento>
Los comparadores, tienen una relación con los tipos de elementos comparados (números, cadenas, fechas, etc)
Para comparar números usaremos los comparadores >, <, =, >=, <=, <> o !=
por ejemplo:
7 = 7 arroja un valor Verdadero
7 > 16 arroja un valor Falso
Podemos comparar los valores de los atributos de la tabla con un valor conocido
por ejemplo:
id_vendedor = 3
id_sector < 4
O valores de un atributo con valores de otro atributo
por ejemplo:
cheque > efectivo
Podemos incorporar la condición simple en la sentencia SELECT utilizando la cláusula WHERE
La consulta devolverá lo registros para los cuales la condición simple sea Verdadera
por ejemplo:
SELECT * FROM CLIENTES WHERE id_vendedor != 2
SELECT * FROM CTACTE WHERE cheque > efectivo
Esta consulta devolverá los registros de la tabla clientes cuyo número de vendedor es distinto de 2
Resolver ejercicio 3
Los mismos comparadores, pueden ser utilizados para campos de tipo alfanuméricos, solo que al expresar una constante la encerramos entre comillas
por ejemplo:
id_provincia = "CBA"
id_provincia = "cba"
¿ se obtiene el mismo resultado?
Resolver ejercicio 5
Condiciones Compuestas
Una condición compuesta está formada por dos condiciones (que pueden ser simples o compuestas) unidas por un operador lógico binario o bien por un operador lógico unario y una condición.
Al igual que las condiciones simples, las compuestas también arrojan un valor Verdadero o Falso
<condición> <operador lógico> <condición>
Los operadores lógicos binarios mas frecuentes son AND (Y), OR (O)
El operador lógico unario es NOT (NO)
Por ejemplo:
7 = 7 AND 7 > 3 devuelve un valor Verdadero
9 = 9 AND 5 = 4 devuelve un valor Falso
NOT 7=7 devuelve un valor Falso
Observe que Not 7=7 es equivalente a 7 != 7
Podemos componer condiciones como por ejemplo:
id_vendedor = 1 AND id_sector = 2
id_vendedor = 1 AND NOT id_provincia = "CBA"
Cuando compongamos mas de dos condiciones, SIEMPRE UTILIZAREMOS PARÉNTESIS, de esta manera no habrá dudas del orden de precedencia de los operadores. una condición simple no necesita paréntesis.
id_vendedor = 3 AND (ciudad_cli = "ONCATIVO" OR limite_credito > 400)
(id_vendedor = 3 AND ciudad_cli = "ONCATIVO") OR limite_credito > 400
Resolver ejercicios 4, 6 y 7
Ordenamiento de los datos de salida
La cláusula ORDER BY nos permite establecer un criterio de ordenamiento en las filas obtenidas por la consulta SQL
SELECT <lista de atributos> FROM <tabla> ORDER BY <criterio>
Donde <criterio> puede ser
- El nombre de un atributo no necesariamente incluido en <lista de atributos> seguido de [ASC|DESC]
- Select nombre_cliente from CLIENTES ORDER BY id_provincia
- Select nombre_cliente from CLIENTES ORDER BY id_provincia ASC
- Select nombre_cliente from CLIENTES ORDER BY id_provincia DESC
- Un conjunto de atributos separados por coma. Para cada atributo se puede especificar si el orden es ascendente o descendente
- SELECT * FROM CLIENTES ORDER BY id_provincia DESC, id_sector ASC
Es el orden por defecto
DESC (de Descendente)
Realiza el orden inverso
Alias
En la lista de atributos se pueden especificar Alias para los atributos o fórmulas y utilizar estos alias en otras cláusulas de la sentencia SQL
- SELECT *, limite_credito - saldo_actual FROM CLIENTES
- SELECT *, limite_credito - saldo_actual AS credito FROM CLIENTES ORDER BY credito DESC
La cláusula LIKE
Nos permite seleccionar registros por aproximación en un atributo alfanumérico
Para lograr la aproximación, tenemos dos caracteres especiales
- "_" que coincide con cualquier caracter
- "%" que coincide con cualquier conjunto de caracteres
Ejemplos
- SELECT * FROM CLIENTES WHERE nombre_cliente LIKE "%carlos%"
- SELECT * FROM CLIENTES WHERE nombre_cliente LIKE "%carlos"
- SELECT * FROM CLIENTES WHERE cod_postal_cli LIKE "_000"
- SELECT * FROM CLIENTES WHERE cod_postal_cli LIKE "_0%"
Las cláusulas IN y BETWEEN
- IN o pertenencia a un conjunto
- BETWEN a AND b Pertenencia a un rango
- SELECT * FROM CLIENTES WHERE id_vendedor IN (1,2,3,4,5)
- SELECT * FROM CLIENTES WHERE id_vendedor BETWEEN 1 AND 5
Funciones de agregación
En la lista de campos de las consultas SQL podemos utilizar algunas funciones
En este caso, las funciones se aplican a todos los registros devueltos
- SUM (Suma)
- AVG (Promedio)
- MAX (Máximo)
- MIN (Mínimo)
- COUNT (Cantidad)
Ejemplos
- SELECT SUM(saldo_actual) FROM CLIENTES
- SELECT AVG(limite_credito) FROM CLIENTES
- SELECT MAX(saldo_actual) FROM CLIENTES
- SELECT MIN(saldo_actual) FROM CLIENTES
- SELECT COUNT(*) FROM CLIENTES
Grupos
Podemos agrupar los registros según algún criterio para que las funciones se apliquen a cada grupo
SELECT <lista de atributos> FROM <tabla> GROUP BY <atributo>
Carece de sentido incorporar en la lista de grupos atributos no agrupados
- SELECT * FROM CLIENTES GROUP BY id_vendedor
- SELECT id_vendedor FROM CLIENTES GROUP BY id_vendedor
- SELECT id_vendedor, COUNT(*) FROM CLIENTES GROUP BY id_vendedor
- SELECT id_vendedor, COUNT(*) AS cantidad FROM CLIENTES GROUP BY id_vendedor
- SELECT id_vendedor, COUNT(*), SUM(sldo_actual) FROM CLIENTES GROUP BY id_vendedor
La cláusula HAVING
Nos permite establecer una condición sobre los grupos que serán devueltos por el motor de base de datos
SELECT <lista de atributos> FROM <tabla> GROUP BY <atributo> HAVING <condición>
- SELECT id_vendedor, COUNT(*) AS cantidad FROM CLIENTES GROUP BY id_vendedor
- SELECT id_vendedor, COUNT(*) AS cantidad FROM CLIENTES GROUP BY id_vendedor HAVING cantidad > 2
- SELECT id_vendedor, COUNT(*) AS cantidad FROM CLIENTES WHERE cod_postal_cli != 1000 GROUP BY id_vendedor HAVING cantidad > 2
Aclaración
La condición de la cláusula WHERE es aplicada para determinar los registros que serán tenidos en cuenta para formar los grupos.
La condición de la cláusula HAVING es aplicada para determinar los grupos que serán devueltos por la consulta
¿Qué es el producto cartesiano?
El producto cartesiano de dos tablas
SELECT <lista de atributos> FROM <tabla1>,<tabla2>
El problema es que generalmente el producto cartesiano de dos tablas carece de sentido
Ejemplos
- SELECT nombre_cliente,apellido_vendedor FROM CLIENTES,VENDEDORES
- SELECT id_vendedor,nombre_cliente,apellido_vendedor FROM CLIENTES,VENDEDORES
- SELECT CLIENTES.id_vendedor,nombre_cliente,apellido_vendedor FROM CLIENTES,VENDEDORES
Unión de tablas (JOIN)
¿Para qué nos sirve la unión de tablas?
¿Para qué nos sirve la unión de tablas?
Para darle sentido a las tuplas listadas podemos utilizar la cláusula WHERE para seleccionar un subconjunto coherente del producto cartesiano de las tablas. A ésta consulta la llamaremos Unión de tablas.
- SELECT CLIENTES.id_vendedor,nombre_cliente,apellido_vendedor FROM CLIENTES,VENDEDORES WHERE CLIENTES.id_vendedor=VENDEDORES.id_vendedor
¡¡¡ IMPORTANTE !!!
Como el atributo id_vendedor está presente en las dos tablas, debemos indicar a cuál de ellos nos referimos. Caso contrario será considerado un nombre ambiguo y el motor no podrá procesar la consulta.
Material de la cátedra
Aplicación de Pruebas
Es una aplicación cliente que se comunica con un servidor de bases de datos ejecutando las consultas que ingresamos y mostrando su resultado.
Ejercicios de SQL
Ejercicios adicionales
Ejercicios adicionales resueltos
No revisé los resultados. Si tienen dudas escriban.
Es una aplicación cliente que se comunica con un servidor de bases de datos ejecutando las consultas que ingresamos y mostrando su resultado.
Ejercicios de SQL
Ejercicios adicionales
Ejercicios adicionales resueltos
No revisé los resultados. Si tienen dudas escriban.