Curso Gratis SQL . Lección 4 – AND, OR, NOT ,ORDER BY,A,GROUP BY

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

 

 

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: