Transcription of Consultas SQL (SELECT) - us
1 Consultas SQL (SELECT) 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 , , 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 ( ).
2 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.
3 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.
4 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.
5 _ 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.
6 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.
7 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.
8 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 * ) 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.
9 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 * 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?
10 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.