Consultas SQL

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 5

Consultas SQL

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).

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 DISTINCT cp, 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’
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.

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):

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.


SELECT nombre
FROM CLIENTES
WHERE edad BETWEEN 20 AND 35

LIKE: empleado para comparar patrones de texto pudiendo 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
[!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.
SELECT num, calle, direccion
FROM DIRECCION
WHERE ciudad IN (‘Sevilla’, ’Córdoba’, ‘Huelva’, ‘Cádiz’)

Operadores lógicos (AND, OR, NOT)


Los operadores lógicos nos sirven para componer expresiones de filtrado a partir de las
anteriores:

Operador Significado
AND Y lógico
OR O lógico
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’ AND cp = 41009 OR ciudad = ‘Córdoba’ AND NOT cp = 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 (NOT cp = 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:

SELECT *
FROM CIUDAD
ORDER BY provincia ASC, numhabitantes DESC
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 idCliente AS id, nombre AS cliente, descripcion AS desc
FROM CLIENTES

Uso de expresiones empleando operadores y/o funciones


Podemos practicar en SQLzoo a 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) AS dia, FLOOR(precioLinea * 0.85) AS precioDtoRedondeado
FROM 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
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

O podríamos establecer una condición sobre el dato agrupado (HAVING), de forma que
solamente se muestren las medias menores o iguales que 10. Existe una gran cantidad de
funciones de agregación definidas en SQL, pero hay que tener precaución porque pueden
diferir de un SGBD a otro.

SELECT idPedido, ROUND(AVG(precioLinea),4)


FROM LINEAPEDIDO
GROUP BY idPedido
HAVING AVG(precioLinea) < 10

También podría gustarte