Enlace Patrocinado
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.
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
Por ejemplo:
SELECT *FROM DIRECCIONWHERE 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 DIRECCIONWHERE (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 CIUDADORDER 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 descFROM 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 precioDtoRedondeadoFROM 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 LINEAPEDIDOGROUP 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 LINEAPEDIDOGROUP 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 LINEAPEDIDOGROUP 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 mediaFROM LINEAPEDIDOGROUP 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 LINEAPEDIDOGROUP BY idPedidoHAVING AVG(precioLinea) < 10
Para practicar un poco con las más comunes es muy recomendable este tutorial interactivo. En
MySQL tendríamos las que aparecen en este enlace. Este es el desglose completo de las
funciones de agregación estándar:
Checa el primer tutorial : Lección 1 – Bases de datos Relacionales
Checa el segundo tutorial : Lección 2 – Comandos SQL Básicos.
Checa el tercer tutorial : Lección 3 – Consutas SQL (Sencillas)