Documente Academic
Documente Profesional
Documente Cultură
INTRODUCCION A SQL
Comenzaremos el estudio de consultas simples a una Base de Datos, en estas
consultas participará solamente una tabla.
Para la realización de consultas se utiliza la sentencia SELECT, la cual recupera
datos de una BD y los devuelve en forma de resultados de la consulta.
Para consultas sencillas, la petición en lenguaje inglés y la sentencia SELECT son
muy similares.
La sentencia SELECT tiene el siguiente formato:
SELECT ítem-seleccionado
ALL ,
DISTINCT *
Cláusula SELECT
La cláusula SELECT que empieza cada sentencia SELECT especifica los ítems de
datos a recuperar por la consulta. Un ítem puede ser:
- Un nombre de columna, identificando una columna de la tabla designada en la
cláusula FROM. Cuando un nombre de columna aparece en el SELECT, SQL
simplemente toma el valor de esa columna de cada fila de la tabla de la BD.
- Una constante, especificando que el mismo valor constante va a aparecer en
todas las filas de los resultados de la consulta.
- Una expresión SQL, indicado que SQL debe calcular el valor a colocar en los
resultados.
Cláusula FROM
Especifica las tablas que intervienen en la consulta. Estas tablas se llaman tablas
fuentes. Todas las consultas que veremos en esta clase tienen una única tabla
fuente.
Resultados de consultas
El resultado de una consulta SQL es siempre una tabla de datos, semejante a
cualquier otra tabla. Si se trabaja con SQL interactivo será una tabla que se
muestra en la pantalla, si se trabaja desde un programa será una tabla que de
alguna manera ese programa deberá manipular. Las columnas de la tabla
corresponden a los items de la cláusula SELECT.
Es importante destacar que aún cuando la consulta devuelva un valor, este
considera una tabla de una fila y una columna.
Consultas Sencillas
Las consultas más sencillas solicitan columnas de datos de una única tabla en la
BD. Generalmente la sentencia SELECT incluye sólo las cláusulas SELECT y
FROM y conceptualmente SQL procesa la consulta recorriendo la tabla nominada
en la cláusula FROM, una fila cada vez. Por cada fila, SQL toma los valores de las
columnas solicitadas en la lista de selección y produce una única fila de
resultados. Los resultados contienen por tanto una fila de datos por cada fila de la
tabla.
Ejemplo:
Listar la ciudad, región e importe de ventas de cada oficina
SELECT ciudad, región, ventas
FROM oficinas
(Los resultados de la consulta parecen consistir en una “frase” distinta por cada
oficina, pero realmente es una tabla de 3 columnas. La segunda columna contiene
la misma cadena de texto para cada una de las filas.)
SELECT *
FROM oficinas
Por ejemplo:
Listar los números de empleados de todos los directores de oficina:
SELECT dir
FROM oficinas
Si un director dirige más de una oficina su número saldría tantas veces como
oficina dirija.
Observar que hasta este momento todas las operaciones que hemos realizado
sobre las tablas corresponden a la operación de proyección del álgebra relacional.
Las consultas SQL que recuperan todas las filas de una tabla no son frecuentes
en las aplicaciones. Generalmente se desea seleccionar parte de las filas de una
tabla.
La cláusula WHERE se emplea para especificar las filas que se desean recuperar.
Esta cláusula consta de la palabra clave WHERE seguida de una condición de
búsqueda que especifica las filas a recuperar. Dicha condición en general es una
expresión lógica
Ejemplos:
Muestra todas las oficinas en donde las ventas excedan al objetivo.
SQL recorre cada fila de la tabla, una a una, y aplica la condición. Se pueden
producir tres casos:
- Si la condición de búsqueda es TRUE (cierta), la fila en cuestión se incluye en
los resultados de la consulta.
- Si la condición de búsqueda es FALSE (falsa), la fila se excluye de los
resultados de la consulta.
- Si la condición de búsqueda tiene un valor NULL (desconocido), la fila se
excluye de los resultados de la consulta.
Condiciones de búsqueda
SQL ofrece un conjunto de condiciones de búsqueda. Se pueden agrupar en cinco
grupos (llamados predicados en el estándar).
a) Test de comparación
b) Test de Rango
NOT
Ejemplo:
El test incluye los puntos extremos del rango, por lo que los pedidos remitidos el 1
de octubre o el 31 de diciembre se incluirán en los resultados de la consulta.
Listar los vendedores cuyas ventas no están entre el 80 y el 120 por ciento
de su cuota.
Una prueba típica de consultas es determinar si un valor de dato coincide con uno
de una lista de valores objetivo. A este tipo de test se le llama test de pertenencia
a conjunto y su diagrama sintáctico se puede ver a continuación:
Ejemplos:
La expresión del test puede ser una expresión cualquiera. Todos los elementos de
la lista deben tener el mismo tipo de datos, y este debe coincidir con el tipo de la
expresión.
Caracteres comodines:
Ejemplos:
Esta consulta busca en la tabla clientes aquellos cuyos nombres comienzan con
Smiths, tiene un carácter luego y después n Corp.
El test LIKE debe aplicarse a columnas con tipo de dato cadenas. Si el valor de
dato en la columna es NULL, el test devuelve el valor NULL.
NOT
SELECT nombres
FROM vededores
WHERE oficina_vend IS NULL
OR
Ejemplo:
Hallar los vendedores que están por debajo de la cuota o con ventas
inferiores a 30000.
Los paréntesis en este caso son opcionales, solo se han puesto para claridad de
la expresión.
Las tablas de verdad, incluyendo los valores nulos, se muestran en las siguientes
tablas:
NOT
TRUE FALSE
FALSE TRUE
NULL NULL
Las posiciones que están en negritas serían las operaciones donde participan
valores nulos.
Al igual que las filas de una tabla en la BD, las filas de los resultados de una
consulta no están dispuestos en ningún orden particular. Se puede pedir a SQL
que ordene los resultados de una consulta incluyendo la cláusula ORDER BY en
la sentencia SELECT.
DESC
,
Mostrar las ventas de cada oficina, ordenadas en orden alfabético por región
y dentro de cada región por ciudad.
Por omisión, SQL ordena los datos en secuencia ascendente. Para solicitar en
secuencia descendente, se incluye la palabra clave DESC en la especificación de
ordenación, como en el siguiente ejemplo:
Se puede utilizar la palabra clave ASC para especificar el orden ascendente, pero
puesto que este es el orden por omisión, la palabra clave se suele omitir.
Ejemplo:
Observar que los resultados estarán ordenados por la tercera columna, que es
una columna calculada.
Ejemplo:
Listar todos los productos en donde el precio del producto exceda de 2000 ó
donde más de 30000 del producto hayan sido incluidos en un solo pedido.
Dividiremos esta consulta en dos partes:
Listar los productos para los cuales más de 30000 del producto hayan sido
incluidos en un solo pedido.
Hay varias restricciones sobre las tablas que pueden combinarse con una
operación UNION:
a) Ambas tablas deben contener el mismo número de columnas.
b) El tipo de datos de cada columna en la primera tabla debe ser el mismo
que el tipo de datos de la columna correspondiente en la segunda tabla.
c) Ninguna de las dos tablas puede estar ordenada con la cláusula ORDER
BY. Sin embargo, los resultados combinados pueden ser ordenados,
según se describe después.
Listar todos los productos en donde el precio del producto exceda de 2000 ó
donde más de 30000 del producto hayan sido incluidos en un solo pedido,
clasificados por fabricante y el identificador del producto..
La operación UNION puede ser utilizada repetidamente para combinar tres o más
conjuntos de resultados, tal como se muestra en la figura siguiente:
Tabla a
Bill Resultados
Tabla b
Mary Bill
Bill
George Mary
Sue
Fred George
Julia UNION
Fred
Harry
Bill Sue
UNION
Tabla c Sue Julia
Mary Julia Harry
George Harry
Bill Mary
Harry George
SELECT *
FROM a
UNION ( SELECT *
FROM b
UNION
SELECT *
FROM c )
Los paréntesis indican el orden en que deben ser realizadas las uniones. En este
caso como todas las uniones eliminan duplicados no importa el orden. Hay que
tener mucho cuidado con el orden cuando una de las operaciones UNION tiene el
ALL.
Funciones de Columna
SUM ( expresión )
DISTINCT nombre columna
AVG ( expresión )
DISTINCT nombre columna
MIN ( expresión )
MAX ( expresión )
SELECT AVG(100*(ventas/cuota))
FROM vendedores
Para procesar esta consulta SQL construye una columna temporal que contiene el
valor de la expresión por cada fila de la tabla, luego calcula el promedio de la
columna temporal.
Ejemplos:
¿Cuáles son las cuotas y ventas totales para todos los vendedores?
SELECT AVG(precio)
FROM productos
WHERE id_fab=´ACI´
SELECT COUNT(nombre)
FROM vendedores
WHERE ventas>cuotas
SELECT COUNT(*)
FROM vendedores
WHERE ventas>cuotas
La siguiente consulta:
arrojará los valores 10, 10 y 9, porque hay un vendedor con cuota nula.
Ignorar los nulos tiene poca importancia en las funciones MAX y MIN, pero puede
producir algunas sutilezas en las funciones SUM y AVG. Por ejemplo la consulta:
Parece que debe dar dos valores similares, sin embargo en nuestro ejemplo
produce resultados diferentes pues hay un vendedor que tiene un valor nulo en su
cuota, por lo tanto es ignorado en SUM(cuota) y en SUM(ventas-cuota), no así el
valor correspondiente de sus ventas que no es nulo.
Al igual que se eliminaban las filas duplicadas en una consulta se pueden eliminar
los valores duplicados de una columna antes de aplicarle una función de columna.
Para ello se utiliza la palabra clave DISTINCT en el argumento de la función como
se indica en el diagrama sintáctico.
Ejercicios:
Desarrollar las siguientes consultas haciendo uso de las clausulas
estudiadas de SQL Server y entregarlo en un reporte.
11. Listar las oficinas cuyas ventas están por debajo del 80% del objetivo.
12. ¿Cuál es el nombre y el límite de crédito del cliente número 2107?
13. Listar los pedidos cuyos importes están entre 30000 y 40000.
14. Listar los pedidos obtenidos por los vendedores 107, 109, 101 y 103.
15. Listar todos lo vendedores cuyos nombres comience con B.
16. Listar todos los productos del fabricante QSA cuyo identificador comience
por XK.
17. Listar los vendedores a los que se ha asignado oficina.
18. Hallar todos los vendedores que están pro debajo de la cuota, pero cuyas
ventas no son inferiores a 150000.
19. Listar los productos ordenados por su precio.
20. Listar los productos ordenador por su fabricante y dentro de estos por su
código.
21. Listar los vendedores en orden decreciente de su edad, dentro de la edad
ordenarlos por el nombre.
22. Listar los productos ordenados por el valor de su inventario.
23. Listar los vendedores que atienden a algún cliente o que han tomado algún
pedido.
24. ¿Cuál es el total de los pedidos aceptados por el vendedor 107?
25. ¿Cuál es la fecha de pedido más antigua en la base de datos?
26. ¿Cuál es el mejor promedio de ventas entre todos los vendedores?
27. ¿Cuántos clientes hay?
28. ¿Cuántos pedidos de más de 25000 hay en los registros?
29. ¿Cuántas oficinas de ventas tienen vendedores que superan sus cuotas?
30. ¿Cuál es el promedio de los objetivos de las oficinas del Este?
31. ¿Cuál es el límite de crédito más pequeño entre los clientes?
32. ¿Cuál es el total de ventas de los vendedores que son Dir Ventas?
33. ¿Cuántos vendedores han tomado algún pedido?
CONSULTAS AGRUPADAS
Ahora supongamos que deseamos el importe medio de los pedidos aceptados por
cada uno de los vendedores.
Aquí tendríamos que agrupar la tabla pedidos según los vendedores que tomaron
los pedidos y sacar el promedio de cada uno de los grupos.
Para realizar tal consulta se utiliza la cláusula GROUP BY que según vimos en la
sintaxis general del SELECT tiene el siguiente diagrama sintáctico:
Ejemplos:
¿Cuál es el rango de cuotas asignadas a cada oficina?
Hay una estrecha conexión entre las funciones de columna de SQL y la cláusula
GROUP BY. Cuando esta cláusula está presente indica a SQL que debe agrupar
las filas y aplicar la función de columna separadamente a cada grupo, produciendo
un único resultado por el grupo.
Según se puede ver en la sintaxis, SQL puede agrupar las filas basándose en
contenidos de dos ó más columnas.
Calcula los pedidos totales por cada cliente y por cada vendedor.
La consulta produce una fila resumen separada por cada pareja vendedor / cliente.
Es imposible crear grupos y subgrupos con dos niveles de subtotales en SQL
estándar.
Calcula los pedidos totales para cada cliente de cada vendedor, ordenados
por vendedor, y dentro de cada vendedor por cliente.
Esta consulta produce una fila de resultados detallados por cada fila de la tabla
Pedidos, ordenados por clie dentro de vend. Además calcula la suma de los
pedidos por cada pareja cliente / vendedor (un subtotal de bajo nivel) y calcula la
suma de pedidos y el tamaño medio de pedido por cada vendedor (un subtotal de
alto nivel). Los resultados tienen por tanto una mezcla de filas de detalles y de filas
resumen, que incluyen tanto subtotales como totales.
El estándar de SQL considera que dos valores NULL son iguales a efectos de la
cláusula GROUP BY. Si dos filas tiene NULL en las mismas columnas de
agrupación y valores idénticos en las columnas de agrupación no NULL, se
agrupan dentro del mismo grupo de filas.
Observar el comportamiento del NULL con los diferentes valores y los grupos que
se forman. Es importante que en los dialectos no siempre se siguen las mismas
reglas (aunque éstas que hemos especificado son las del estándar), por lo que es
importante con ejemplos pequeños probar antes de decidir hacer aplicaciones
importantes.
Al igual que la cláusula WHERE puede ser utilizada para seleccionar y rechazar
filas individuales que participan en una consulta, la cláusula HAVING puede ser
utilizada para seleccionar y rechazar grupos de filas.
Ejemplo:
Aquí la cláusula GROUP BY dispone de los pedidos en grupos por cada vendedor.
Entonces la cláusula HAVING toma solamente los grupos en donde el total de los
pedidos exceden de 30000, finalmente la cláusula SELCT calcule el tamaño de
pedido medio para cada uno de los grupos que quedó y genera los resultados de
la consulta.
Las condiciones de búsqueda de la cláusula HAVING son las mismas que las
estudiadas para la cláusula WHERE.
Para cada oficina con dos o más vendedores calcular la cuota total y las
ventas totales de los vendedores que trabajan en ella.