Está en la página 1de 9

TEORÍA SQL – INFORMÁTICA TÉCNICA APLICADA

Consultas SQL (SELECT)


Las consultas que podemos realizar sobre una base de datos se realizan a través de un lenguaje de
consulta: SQLy puede involucrar a varias tablas o consultar solo sobre una.

Sobre una tabla que contiene los datos de empleados podemos realizar consultas como, por ejemplo:
¿Qué empleados tienen un salario mayor a 1350?

La respuesta es simple: José y Carlos tiene un salario mayor a 1350, al tener solo 4 empleados es
sencillo obtener la respuesta, muy distinto es cuando la base de dato tiene un gran volumen de
información, allí es donde cobra importancia saber generar consultas de manera correcta para obtener
datos relevantes para una toma de decisión. El SQL nos permite responder estas preguntas de forma
rápida y fiable, salvo error al construir la consulta o errores en los propios datos.

Vamos a construir la consulta que nos permita responder a esta cuestión, para ello debemos
considerar:

Para nuestro caso, su uso en Informática Técnica Aplicada, sólo consideraremos las cláusulas marcada
con una flecha. De acuerdo a la gráfica, debemos para crear una consulta en SQL debemos responder
una serie de preguntas:

Preguntas de Construcción

1. Primero hemos de preguntarnos: ¿qué datos nos están pidiendo?

En este caso, el nombre y los apellidos de los empleados.(SELECT CAMPOS)

2. Lo siguiente que nos preguntamos es: ¿dónde están esos datos?

Obviamente están en la tabla empleados.(FROM)


TEORÍA SQL – INFORMÁTICA TÉCNICA APLICADA
3. Y, por último: ¿qué requisitos deben cumplir los registros?

En este caso, que el sueldo del empleado sea superior a 1350.(WHERE)

Consultas sencillas
Devolver todos los campos de una tabla (SELECT *)

SELECT *
FROM CLIENTES
Con el * indicamos que queremos devolver todos los campos. Si CLIENTES dispone de los campos
idCliente, nombre y descripcion, lo anterior sería equivalente a:

SELECT idCliente, nombre, descripcion


FROM CLIENTES
Obviamente, al querer todos los campos, esto es innecesario y es por tanto más conveniente emplear
el asterisco (*). También sería equivalente emplear la notación completa:

SELECT CLIENTES.idCliente, CLIENTES.nombre, CLIENTES.descripcion


FROM CLIENTES
Al tener únicamente UNA tabla involucrada, podemos referirnos a los campos sin calificar, dado que no
hay duda de a qué tabla se refiere. Cuando veamos consultas sobre varias tablas comprenderemos la
necesidad de incluir esta notación calificada (TABLA.campo).

*NOTACION CALIFICADA es indicar delante del campo, la tabla de donde se sacará la información.
EMPLEADO.apellido

Devolver un subconjunto de los campos de una tabla (SELECT DISTINCT)

SELECT cp, ciudad


FROM DIRECCION
Esta consulta devolverá únicamente los campos cp (código postal) y ciudad de la tabla DIRECCION. Al
tener un subconjunto de los campos, éstos no tienen por qué incluir a la clave de la tabla, por lo que
no tienen por qué ser únicos. Así, si tenemos muchos registros referidos a distintas calles y números de
ese mismo código postal y ciudad, nos encontraremos muchos registros repetidos. Esto puede evitarse
haciendo:

SELECT DISTINCTcp, ciudad


FROM CLIENTES
Así se eliminan los registros repetidos, devolviendo únicamente una vez cada par cp, ciudad. Esta
selección de un subconjunto de los datos de la tabla y excluyendo repetidos se denomina en álgebra
relacional proyección.

Devolver un subconjunto de los registros de una tabla (WHERE)

SELECT numero, calle


FROM DIRECCION
WHERE ciudad = ‘Sevilla’
TEORÍA SQL – INFORMÁTICA TÉCNICA APLICADA
Esta consulta devolvería el número y la dirección de todas las direcciones pertenecientes a la ciudad de
Sevilla. Como vemos, con WHERE indicamos la condición que deben cumplir los registros de la tabla
para ser devueltos en la consulta. En este caso tenemos una condición simple dada por la comparación
de igualdad (=) entre al campo (ciudad) y un literal de tipo cadena, entre comillas simples (‘Sevilla’).
SELECT calle, ciudad
FROM DIRECCION
WHERE numero = 12
Esta otra consulta devolvería la calle y ciudad de todos los registros de la tabla con el número 12, en
este caso un literal numérico. Las condiciones empleadas pueden ser mucho más complejas incluyendo
otro tipo de operadores y combinaciones de los mismos.

Cuando utilizo números se escriben directamente al lado del operador, si es un texto se escribe entre
comillas: nombre=”Camila”

Operadores relacionales
Al margen del signo de igualdad empleado anteriormente, se pueden usar n las condiciones simples de
las consultas los operadores relacionales habituales, devolviendo siempre un valor booleano (lógico); o
sea si el resultado es VERDADEROo FALSO
Operador Significado
< Menor que
> Mayor que
<> Distinto de
<= Menor ó Igual
que
>= Mayor ó Igual
que
= Igual que

SELECT nombre
FROM CLIENTES
WHERE edad <= 32

Adicionalmente, disponemos de operadores de comparación adicionales, también devolviendo valores


booleanos (lógicos) True o False según si se cumplen o no las condiciones:

BETWEEN: para indicar un intervalo de valores.


SELECTnombre
FROM CLIENTES
WHEREedadBETWEEN 20 AND 35

Muestra todos los clientes que tienen entre 20 y 35 años

LIKE: empleado para comparar patrones de textopudiendo incluir comodines como los siguientes:
Comodín Descripción
% Sustituto para cero o más caracteres.
_ Sustituto para exactamente un carácter
[lista caracteres] Cualquier carácter de la lista
[^lista caracteres] Cualquier carácter que no esté en la lista
TEORÍA SQL – INFORMÁTICA TÉCNICA APLICADA

[!lista caracteres] Cualquier carácter que no esté en la lista

SELECT num, calle, cp


FROM DIRECCION
WHERE ciudad LIKE ‘Val%’
Esta consulta devolvería los datos de las direcciones de toda ciudad que comience por Val y siga por
cualquier número de caracteres, incluyendo cero caracteres. Por ejemplo, Valladolid o Valencia. En el
enlace anterior sobre patrones de texto podemos practicar directamente desde la web.

IN: empleado para comparar con una lista de valores fijados de modo que devuelva True si el campo
indicado pertenece a la lista.
SELECTnum, calle, direccion
FROM DIRECCION
WHERE ciudad IN (‘Sevilla’, ’Córdoba’, ‘Huelva’, ‘Cádiz’)

Operadores lógicos (AND, OR, NOT)


Los operadores lógicosnos sirven para componer expresiones de filtrado a partir de las anteriores:
Operador Significado
AND Y lógico , ambas condiciones deben cumplirse para que sea
verdadero.
OR O lógico, una u otra condición deben cumplirse para que sea
verdadero, incluso ambas arroja un resultado verdadero
NOT Negación lógica

La precedencia y asociatividad es la habitual definida en la Lógica. En cualquier caso, cuando incluya


expresiones que empleen varios de estos operadores es recomendable usar paréntesis para evitar
errores. Por ejemplo:

SELECT *
FROM DIRECCION
WHERE ciudad = ‘Sevilla’ ANDcp= 41009 OR ciudad = ‘Córdoba’ AND NOTcp= 14010
Devuelve los registros pertenecientes a direcciones que tengan el código postal 41009 de Sevilla o bien
que no tengan el 14010 de Córdoba. La mayor precedencia la adopta el operador NOT sobre la
condición cp = 14010; a continuación los AND se aplican sobre ciudad = ‘Sevilla’ AND cp = 41009 y
ciudad = ‘Córdoba’ AND NOT cp = 14010; por último se aplica el OR sobre la fórmula completa. La
misma consulta se puede expresar de forma más clara con paréntesis: SELECT *
FROM DIRECCION
WHERE (ciudad = ‘Sevilla’ AND cp = 41009) OR
(ciudad = ‘Córdoba’ AND (NOTcp= 14010))
O bien si el NOT nos parece más evidente, podemos excluir el paréntesis interior, a nuestra gusto
siempre conservando el significado que queríamos dar la operación.

Ordenación
Ordenar según criterios (ORDER BY)
Podemos ordenar los registros devueltos por una consulta por el campo o campos que estimemos
oportunos:
TEORÍA SQL – INFORMÁTICA TÉCNICA APLICADA
SELECT *
FROM CIUDAD
ORDERBY provincia ASC, numhabitantesDESC
Esta consulta devolvería todas las ciudades ordenadas por provincia en orden ascendente, y dentro de
los de la misma provincia ordenaría las ciudades por orden descendente del número de habitantes. Si
no indicamos ASC ni DESC, el comportamiento por defecto será el orden ascendente (ASC).

Devolución de expresiones
Asignación de un alias a un dato devuelto (AS)
SELECT idClienteAS id, nombre AS cliente, descripcionASdescFROM CLIENTES

Uso de expresiones empleando operadores y/o funciones


Podemos practicar en SQLzooa usar expresiones con operadores y funciones. Por ejemplo:

SELECT MOD(DAY(NOW()),7) AS numSemana, POW(2,3) AS potencia8


Devuelve el número de semana en la que nos encontramos dentro del mes, ya que NOW() nos
devuelve la fecha/hora actual, de la cual extraemos el día con DAY, y posteriormente calculamos el
módulo 7 de dicho día (de modo que para un día 26 devolvería un 5, por ejemplo). El dato con alias
potencia8 devolvería 8 (2 elevado a 3, POW es power, potencia).

Se puede combinar naturalmente la potencia de este lenguaje de expresiones usando operadores y


funciones sobre los datos de los registros de una tabla:
SELECT DAY(fechaLinea) ASdia, FLOOR(precioLinea* 0.85) ASprecioDtoRedondeadoFROM
LINEAPEDIDO

Consultas agrupadas (GROUP BY)


Las consultas anteriores recuperaban, trabajaban con, y mostraban información a nivel de cada
registro individual de la base de datos. Así, si tenemos un producto con un determinado precio,
podemos devolver el precio mediante SELECT precioLinea o bien operar sobre él como en SELECT
precioLinea * 0.85.

Ahora bien, podemos querer obtener información que no proviene de un registro individual sino de la
agrupación de información, como es el caso de contar el número de líneas de pedido, sumar el precio
de todas las líneas por cada pedido, etc. Para ello, debemos emplear funciones agregadas y en la
mayoría de los casos agrupar por algún campo.

Así, para ver el número total de registros podemos hacer:


SELECT COUNT(*)
FROM LINEAPEDIDO

Si por el contrario deseamos obtener el total de líneas por pedido, debemos indicar que agrupe por
idPedido, lo que contará todos los registros con el mismo idPedido y calculará su cuenta:
SELECT idPedido, COUNT(*)
FROM LINEAPEDIDO
GROUP BY idPedido

Lo mismo se puede aplicar a otras funciones como la suma, indicando en ese caso aparte de la
agrupación el campo que queremos sumar:
SELECT idPedido, SUM(precioLinea)
FROM LINEAPEDIDO
TEORÍA SQL – INFORMÁTICA TÉCNICA APLICADA
GROUP BY idPedido

¿Y si queremos hallar la media de los precios por cada pedido? En ese caso necesitamos de nuevo
agrupar (GROUP BY) por pedido.
SELECT idPedido, AVG(precioLinea)
FROM LINEAPEDIDO
GROUP BY idPedido

Igualmente, podríamos aplicar un redondeo (ROUND) sobre la media, para dejar 4 decimales, y
aplicarle un alias (AS) para el nombre del dato de salida. SELECT idPedido, ROUND(AVG(precioLinea),4)
AS media
FROM LINEAPEDIDO
GROUP BY idPedido

Function Usage
Calcula el valor promedio de una columna acorde a la
AVG(expression)
expresión

CORR(dependent, independent) Calcula un coeficiente de realción

COUNT(expression) Cuentas las filas que cumplen con la expresión.


COUNT(*) Cuenta todas las filas de la tabla.
Encuentra el valor mínimo en una columna
MIN(expression) expression.
Encuentra el valor máximo en una columna
MAX(expression) expression.

Devolución de filas nulas/no nulas (IS NULL / IS NOT NULL)


SELECT idPedido
FROM PEDIDO
WHERE direccionEnvioIS NULL
Devolvería los pedidos que no tienen dirección de envío asociada.

Consultas por intersecciones entre tablas (JOIN)


Podemos generar una consulta que obtenga datos de varias tablas, pudiendo establecer a su vez
criterios sobre otras. Veamos los tipos fundamentales (una buena explicación se puede encontrar
aquí). Por ejemplo, dados los clientes de nuestro concesionario y nuestras ventas de coches a clientes
en los diversos concesionarios,
TEORÍA SQL – INFORMÁTICA TÉCNICA APLICADA
VENTA

CLIENTE

podemos obtener una consulta que obtenga datos del cliente y de la venta. Por ejemplo, nombre,
apellidos, codcoche y color, mediante una consulta del tipo:

SELECT nombre, apellidos, codcoche, color


FROM CLIENTE, VENTA
WHERE CLIENTE.cifcl=VENTA.idCliente

INNER JOIN

INNER JOIN implícito


Por ejemplo, para obtener los datos del cliente y el pedido en la misma consulta:
SELECT nombreCliente, idPedido,fechaPedido
FROM CLIENTE, PEDIDO
WHERE CLIENTE.idCliente=PEDIDOpedido.idCliente
Como vemos, podemos empezar escribiendo tal cuál qué datos nos piden (SELECT), de dónde podemos
obtenerlos (FROM) y qué criterio (WHERE).
PRÁCTICA SQL – INFORMÁTICA TÉCNICA APLICADA
De acuerdo a la siguiente base de datos, considerar sus tablas y resolver las consultas en Lenguaje SQL
indicando cuales serían además, los resultados que dichas consultas devuelven.
TIENDAS

CARROS

MARCAS

PROCEDENCIA

PEDIDOS

CLIENTES
PRÁCTICA SQL – INFORMÁTICA TÉCNICA APLICADA

RESOLVER
Cláusula SELECT
1. Seleccionar todas las filas y columnas de la tabla PROCEDENCIA.
2. Seleccionar todos los nombres de las TIENDAS.
3. Seleccionar el nombre y teléfono de los CLIENTES.
4. Seleccionar el nombre de todas las MARCAS.
5. Listar los PEDIDOS.
6. Listar las tiendas que no tengan teléfonos.
Cláusula WHERE
7. Seleccionar el nombre de las MARCAS de los autos de color negro.
8. Mostrar el nombre de las tiendas que venden autos de color amarillo.
9. Mostrar el precio y nombre de la marca de los autos que valen menos de $22500.
10. Mostrar el país de procedencia de los autos cuya marca es POLO
11. Mostrar cuánto vale cada uno de los autos comprados por los clientes.
12. Mostrar todas las tiendas que venden autos entre $10000 y $50000
13. Indicar el nombre y apellido del cliente que compró el auto más caro.
14. Indicar la dirección de la tienda que vendió el auto más barato.
15. Indicar los clientes que viven sobre la calle Redmond.
16. Mostrar el código postal de las tiendas cuyos nombres comienzan con “amster”
17. Mostrar nombre y apellidos de los clientes que en su nombre apellido contengan una “f”
18. Mostrar las marcas de los autos que sean “Amarillos, negros, verdes”
19. Seleccionar carro_id de los autos que no fueron pedidos.
20. Seleccionar los países de origen que comiencen con “R” y terminen con “A”
21. Indicar precio, marca y nombre de la tienda que vende autos color negro.
22. Listar nombre y apellido de los clientes que compraron autos, la marca, color, precio y
tienda que se los vendió.
23. Contar cuántos autos se vendieron
24. Obtener el monto total recaudado de esa venta.
25. Contar cuántos países distintos venden autos.

Cláusula ORDER BY
26. Mostrar nombre y apellidos de los clientes ordenados por apellido de manera descendente
27. Mostrar el color y precio de los autos ordenados de más caro al más barato.
28. Mostrar un listado de países de origen ordenados de manera ascendente.
29. El nombre de las tiendas ordenados alfabéticamente.
30. Qué datos devuelve la siguiente consulta:
SELECT *
FROM carros, tiendas
WHERE tienda=tienda_id AND nombre LIKE ‘ams%’
ORDER By precio ASC

También podría gustarte