La precedencia y asociatividad es la habitual definida en
la Lógica. En cualquier caso, cuando
la Lógica. En cualquier caso, cuando
incluya expresiones que empleen varios de estos
operadores es recomendable usar paréntesis
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
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
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
mayor precedencia la adopta el operador
NOT sobre la condición cp = 14010; a continuación los
AND se aplican sobre ciudad = ‘Sevilla’
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
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:
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
el paréntesis interior, a nuestra
gusto siempre conservando el significado que queríamos
dar la operación.
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
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
provincia en orden ascendente, y
dentro de los de la misma provincia ordenaría las
ciudades por orden descendente del número
ciudades por orden descendente del número
de habitantes. Si no indicamos ASC ni DESC, el
comportamiento por defecto será el orden
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
dentro del mes, ya que NOW() nos
devuelve la fecha/hora actual, de la cual extraemos el
día con DAY, y posteriormente
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
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).
elevado a 3, POW es power, potencia).
Se puede combinar naturalmente la potencia de este
lenguaje de expresiones usando
lenguaje de expresiones usando
operadores y funciones sobre los datos de los registros
de una tabla:
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
mostraban información a nivel de
cada registro individual de la base de datos. Así, si
tenemos un producto con un determinado
tenemos un producto con un determinado
precio, podemos devolver el precio mediante SELECT
precioLinea o bien operar sobre él como
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
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
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
pedido, etc. Para ello, debemos emplear
funciones agregadas y en la mayoría de los casos agrupar
por algún campo.
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
por pedido, debemos indicar que
agrupe por idPedido, lo que contará todos los registros
con el mismo idPedido y calculará su
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
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
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
la media, para dejar 4 decimales, y
aplicarle un alias (AS) para el nombre del dato de
salida.
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
dato agrupado (HAVING), de forma que
solamente se muestren las medias menores o iguales que
10. Existe una gran cantidad de
10. Existe una gran cantidad de
funciones de agregación definidas en SQL, pero hay que
tener precaución porque pueden
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
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:
de agregación estándar:
Checa la Lección 1 – Bases de datos relacionales
Checa la lección anterior : Lección 2 – Comandos SQL Básicos.
Leccion Anterior: Lección 3 – Consutas SQL I (Sencillas)