Sie sind auf Seite 1von 91

Sistemas Gestores de Bases de Datos

Tema 6: SQL ­ Consulta básica (parte I­2)

 
12. Funciones de agregado

Las funciones de agrega t, o funciones de dominio agregado, son aquellas que sacan un resultado a partir de los valores de un
determinado campo en un conjunto de filas. Así tendremos una función para sumar los valores de una columna, o contar ­los, o sacar la
media , o el máximo , ...

Actuarán sobre un conjunto de filas determinado, que en principio se supone que es toda la tabla (todas las filas de la tabla). En la siguiente
pregunta, veremos que el conjunto de filas sobre el que se calcula una función de agregado, lo podremos cambiar con la cláusula GROUP
BY .

sintaxis

COUNT (* | <expresión>) : cuenta el número de filas; si se pone una columna o expresión, no se contarán los valores nulos.

SUM (<expresión>) : devuelve la suma de la columna o expresión especificada. Ignorar los valores nulos.

AVG (<expresión>) : calcula la media aritmética de la columna o expresión especificada. Ignorar los valores nulos.

VAR_SAMP (<expresión>) : calcula la varianza de una muestra a partir de la columna o expresión especificada.

STDDEV (<expresión>) : desviación típica de una muestra.

MAX (<expresión>) : calcula el máximo.

MIN (<expresión>) : calcula el mínimo.

Por ejemplo, si queremos saber el número de Institutos:

SELECT COUNT (*) AS "Número de Institutos" 
 
FROM INSTITUTOS;

Nota

Es interesante la utilización de alias, para que no aparezcan cabeceras como count

ejemplos

1. Contar el número total de pueblos.

SELECT Count (*) 
 
FROM POBLACIONES;

2. Contar el número de poblaciones de la Plana Alta .

SELECT Count (*) 
 
FROM POBLACIONES 
 
WHERE nom_c = 'Plana Alta';

3. Calcular la media de habitantes de los pueblos de la Plana Alta y Plana Baja .

SELECT AVG (población) 
 
FROM POBLACIONES 
 
WHERE nom_c = 'Plana Alta' OR nom_c = 'Plana Baja'

4. Calcular la media de densidad de las poblaciones. La densidad se calcula como el número de habitantes dividido por la extensión.

SELECT AVG (población / extension) 
 
FROM POBLACIONES;
 

5. Calcular la altura máxima y mínima de todos los pueblos.

SELECT MAX (altura), MIN (altura) 
 
FROM POBLACIONES

 
ejercicios

Ejercicios apartado 12

06:15 Contar el número de clientes que tienen el código postal nulo .

6.16 Contar el número de veces que el artículo  L76104 entra en las líneas de factura, y el número total de unidades vendidas de
este artículo. Sólo os hace falta la tabla LINIA_FAC.

6.17  Sacar la media del stock de los artículos.

6.17b  Modificar el anterior para tener en cuenta los valores nulos, como si fueran 0 . Os vendrá bien la función COALESCE que
convierte los nulos del primer parámetro al valor dado como segundo parámetro (si es diferente de nulo, deja igual el valor). Por lo
tanto la debe utilizar de esta manera: COALESCE (stock, 0) 

06:18  Contar  cuántas facturas  tiene el cliente  375

19.06  Calcular el descuento máximo , el mínimo y el descuento medio de las facturas .
13. La cláusula GROUP BY

Agrupa todas las filas con valores iguales de una o de unas columnas

sintaxis

SELECT <columnas> 
 
FROM <tablas>
 
GROUP BY <columnas>

Por cada fila con valores iguales de las columnas de la cláusula GROUP BY , saca sólo una, es decir, las agrupa.

Las funciones de agregado cogen todo su sentido y potencia combinadas con el GROUP BY : volverán un valor para cada grupo. Así, por
ejemplo, esta sentencia sacará cuantas poblaciones hay en cada comarca:

SELECT COUNT (*) 
 
FROM POBLACIONES 
 
GROUP BY nom_c

Si queremos excluir filas para que no entren en las agrupaciones, lo haremos por medio de la cláusula WHERE . En este ejemplo nos
aprovechamos del código de municipio, que en el caso de los municipios de la provincia de Castellón es 12000 y pico.

SELECT COUNT (*) 
 
FROM POBLACIONES 
 
WHERE cod_m> = 12000 and cod_m <13000 
 
GROUP BY nom_c

Cuando tenemos agrupaciones de filas, bien porque utilizamos la cláusula GROUP BY, bien porque entre las columnas que se eligen en el
SELECT hay alguna función de agregado, o ambas cosas a la vez, se pueden cometer errores con una relativa facilidad . Cuando hay una
agrupación todas las columnas que seleccionamos con el SELECT deberán estar en el GROUP BY, o bien estar dentro de una
función de agregado . De lo contrario nos dará error. Por ejemplo, esta consulta funciona bien, y de hecho es mejor consulta que las de
antes, ya que nos dice la comarca y el numero de pueblos que tiene cada una:

SELECT nom_c, COUNT (*) 
 
FROM POBLACIONES 
 
GROUP BY nom_c

Pero esta no:

SELECT nom_c, COUNT (*), cod_m
 
FROM POBLACIONES 
 
GROUP BY nom_c

Es sintácticamente incorrecta, y aparte no tiene sentido: si agrupamos todos los pueblos de la misma comarca ¿cómo debemos poder sacar
después el código del municipio de cada pueblo ?.

Como es relativamente fácil cometer este error, tendremos que identificar este error, para poder solucionarlo.

Por ejemplo, esta consulta nos da la población más alta de cada comarca:

SELECT nom_c, MAX (altura) 
 
FROM POBLACIONES 
 
GROUP BY nom_c

Pero si intentamos sacar también el nombre de la población más alta de cada comarca:

SELECT nom_c, MAX (altura), nombre
 
FROM POBLACIONES 
 
GROUP BY nom_c

nos daría el siguiente error:
Debemos aprender a identificar este error, y solucionarlo. En este caso el solucionaremos levante el campo Nombre . La sentencia para
poder sacar el nombre de la población más alta de cada comarca es complicada, y aunque no podemos hacerla.

ejemplos

1. Contar el número de institutos de cada población.

SELECT cod_m, COUNT (*) 
 
FROM INSTITUTOS 
 
GROUP BY cod_m

2. Contar el número de comarcas de cada provincia.

SELECT provincia, COUNT (*) 
 
FROM COMARCAS 
 
GROUP BY provincia

3. Calcular la altura máxima, mínima y la altura media de cada comarca.

SELECT nom_c, MAX (altura), MIN (altura), AVG (altura) 
 
FROM POBLACIONES 
 
GROUP BY nom_c

4. Contar el número de institutos de cada población y cada código postal.

SELECT cod_m, codpostal, COUNT (*) 
 
FROM INSTITUTOS 
 
GROUP BY cod_m, codpostal

 
ejercicios

Ejercicios apartado 13

6.20  Contar el número de pueblos de cada provincia (es suficiente sacar el código de la provincia y el número de pueblos).

6:21  Contar el número de facturas de cada vendedor a cada cliente.

22.6  Contar el número de facturas de cada trimestre. Para poder sacar el trimestre y agrupar por él (nos vale el número de
trimestre, que va del 1 al 4), podemos utilizar la función to_char (fecha, 'Q') .

06.23  Calcular el total de cada factura, sin aplicar descuentos ni IVA. Sólo nos hará falta la mesa LINIES_FAC , y consistirá en
agrupar por cada num_f para calcular la suma del precio multiplicado por la cantidad .
14. La cláusula HAVING

Esta cláusula acompaña normalmente a la de GROUP BY , y servirá pera poder elegir algunos grupos que cumplan una determinada
condición.

Puede ir sin el GROUP BY, pero entonces su funcionamiento es como el WHERE, y por lo tanto no vale la pena. Es decir, en la práctica
siempre que encontramos un HAVING estará también GROUP BY y servirá para seleccionar algunos grupos, los que cumplan la condición
del HAVING.

También podríamos decir que el HAVING es el GROUP BY, lo que el WHERE es el SELECT

sintaxis

SELECT <columnas> 
 
FROM <tablas> 
 
[GROUP BY <columnas>] 
 
HAVING <condición>

Únicamente comentaremos el caso en que acompaña al GROUP BY. Y como hemos dicho, lo que hace es filtrar los grupos: los grupos
resultantes del GROUP BY, sólo saldrán los que cumplan la condición.

Esta condición contendrá alguna función de agregado o contendrá columnas incluidas en el GROUP BY. Tenga en cuenta que es lógico, ya
que sirve para elegir grupos una vez hechos, y entonces ya no se podrá ir a un elemento del grupo.

Por ejemplo, esta sentencia servirá para sacar las comarcas donde hay más de 20 pueblos, y el número que hay:

SELECT nom_c, COUNT (*) 
 
FROM POBLACIONES 
 
GROUP BY nom_c 
 
HAVING COUNT (*)> 20;

ejemplos

1. Sacar aquellas poblaciones que tienen más de un de Centros Integrados de Formación Profesional. La manera de saber que es un
Centro Integrado es porque su nombre empieza por CIPFP. De momento sólo sacaremos el código de la población, y así sólo nos
hace falta la tabla INSTITUTOS. Más adelante aprenderemos a coger los datos de más de una mesa, y entonces sacaremos también
el nombre de la población

SELECT cod_m, COUNT (*) 
 
FROM INSTITUTOS 
 
WHERE nombre LIKE 'CIPFP%' 
 
GROUP BY cod_m 
 
HAVING COUNT (*)> 1

Lo que hacemos en esta sentencia es, de la tabla INSTITUTOS seleccionar únicamente los Centros Integrados (utilizando el
operador LIKE para que empiezan por CIPFP) ii después agrupar por el código de municipio. Una vez hechos los grupos,
eliminaremos los grupos que no cumplen la condición de HAVING, es decir, los que tienen 0 o 1 Centro Integrado. Y de estos
grupos seleccionados sacaremos el código del municipio y el número de Centros Integrados (que siempre será igual o mayor que
2).

2. Calcular el número de habitantes máximo, el mínimo y el número de habitantes medio de las poblaciones de las comarcas con más de
20 pueblos.

SELECT nom_c, COUNT (cod_m) AS "Número de pueblos", Max (población) AS Máximo, Min (población) AS
Mínimo, Avg (población) AS Media 
 
FROM POBLACIONES 
 
GROUP BY nom_c 
 
HAVING COUNT (cod_m)> 20;
 

3. Sacar la altura media, total de población y población media, de aquellas comarcas que tienen una altura media superior a 800 metros.

SELECT nom_c, AVG (altura) AS "Altura media", SUM (población) AS "Total población", Avg
(población) AS "Población media" 
 
FROM POBLACIONES 
 
GROUP BY nom_c 
 
HAVING AVG (altura)> 800;

 
ejercicios

Ejercicios apartado 14

24.6  Calcular la media de cantidades demandadas de aquellos artículos que se han pedido más de dos veces. Obsérvese que la
tabla que nos hace falta es LINIA_FAC, y que la condición (en el HAVING) es sobre el número de veces que entra el artículo en una
línea de factura, pero el resultado que se debe mostrar es la media de la cantidad.

06:25  Sacar los pueblos que tienen entre 3 y 7 clientes. Sacar sólo el código del pueblo y este número

06:26  Sacar las categorías que tienen más de un artículo "caro" (de más de 100 €). Obsérvese que también nos saldrá la categoría
NULL, es decir, aparecerá como una categoría aquellos artículos que no están catalogados.
15. La cláusula ORDER BY

Ordenar las filas del resultado respecto al orden especificado

sintaxis

SELECT <columnas> 
FROM <tablas>   
 
ORDER BY campo1 [ASC | DESC] {, camp2 [ASC | DESC]}

Aquí tenemos un ejemplo:

SELECT nom_c, provincia 
 
FROM COMARCAS 
 
ORDER BY nom_c

Se ordenarán las filas por el campo, en el orden marcado ascendente o descendente (por defecto, ascendente). Si hubiera un segundo
campo de ordenación, este entraría en juego en caso de valores iguales del primero. Este segundo podrá ser en orden ascendente o
descendente, independientemente del orden del primer campo.

SELECT nom_c, provincia 
 
FROM COMARCAS 
 
ORDER BY provincia DESC, nom_c

Se podrá ordenar por cualquier campo de la tabla, esté indexada por este campo o no. La ventaja de estar indexada respecto a un campo
es la rapidez en la ordenación. Así, si tenemos una mesa grande y ordenamos por un determinado campo, se perderá tiempo en esta
ordenación. Si continuamente estamos ordenando por este campo, perderemos este tiempo muchas veces. Entonces sería conveniente
crear un índice. Pero debemos recordar que la creación de un índice ocupa espacio. Por lo tanto no es buena solución indexar por todos los
campos. Únicamente, en todo caso, por aquellos que más se ordene. Veremos la creación de índice en la tercera parte de este tema.

Y se puede especificar en la ordenación, una expresión que coja uno o más de un campo con operadores y funciones. Se puede poner un
campo o una expresión que no esté en la lista de campos o expresiones que se quieren visualizar (junto al SELECT), aunque normalmente
sí lo visualizaremos, para poder comprobar que realmente está ordenado por el que se ha especificado. Por ejemplo, si queremos ordenar
por la densidad de habitantes de las poblaciones, que se calcula dividiendo el número de habitantes por la extensión:

SELECT nombre, poblacion, extension 
 
FROM POBLACIONES 
 
ORDER BY población / extension DESC

Obsérvese que estamos ordenando por un campo ( población / extension ) que no estamos visualizando, aunque sería mucho
más ilustrativo mostrarlo

Opcionalmente, en el momento de especificar el campo o la expresión por la que queremos ordenar, si ésta aparece en la lista de columnas
a visualizar, podremos poner sencillamente el número de orden de la columna. Así, por ejemplo, podemos hacer lo siguiente:

SELECT nombre, poblacion, extensión, población / extension 
 
FROM POBLACIONES 
 
ORDER BY 4 DESC

Dónde estamos indicando que ordene de forma descendente por la cuarta columna que va a visualizarse, es decir, para p
oblación / extension

Debemos observar que la cláusula ORDER BY es la última, y   que en caso de haber cláusula GROUP BY, se intentará ordenar después de
haber agrupado. Por lo tanto en caso de que la sentencia contenga un GROUP BY o se haya utilizado alguna función de agregado (que
implica hacer grupos), sólo podremos poner en el ORDER BY campos que estén en el GROUP BY o que forman parte de una función de
agregado. El razonamiento es el mismo que el hecho en la cláusula GROUP BY o HAVING y el error en caso de no respetar esto sería el
matiex que el visto en ese apartado.

ejemplos

1. Sacar toda la información de las poblaciones ordenadas por el nombre de la población.
SELECT * 
 
FROM POBLACIONES 
 
ORDER BY nombre

2. Sacar toda la información de las poblaciones, ordenadas por el nombre de la comarca, y dentro de ésta por la altura (de forma
descendente).

SELECT * 
 
FROM POBLACIONES 
 
ORDER BY nom_c, altura DESC

3. Sacar las comarcas con el número de pueblos y total de habitantes, de aquellas que tienen más de 10 pueblos, ordenadas por el
número de pueblos, y dentro de este por el total de población de forma descendente.

SELECT nom_c, COUNT (*), SUM (población) 
 
FROM POBLACIONES 
 
GROUP BY nom_c 
 
HAVING COUNT (*)> 10 
 
order by COUNT (*), SUM (población) DESC

SELECT nom_c, COUNT (*), SUM (población) 
 
FROM POBLACIONES 
 
GROUP BY nom_c 
 
HAVING COUNT (*)> 10 
 
order by 2, 3 DESC

 
ejercicios

Ejercicios apartado 15

06:27  Sacar todos los clientes ordenados por código de población, y dentro de estos por código postal.

06:28  Sacar todos los artículos ordenados por la categoría, dentro de este por el stock, y dentro de éste por precio (de forma
descendente)

06:29  Sacar los códigos de vendedor con el número de facturas vendidas en el segundo semestre de 2015, ordenadas por este
número de forma descendente
16. El predicado DISTINCT

Por defecto, si no especificamos el contrario, saldrán todas las filas de la tabla o tablas que cumplan las condiciones. Así, por ejemplo, si de
la tabla de institutos quisiéramos sacar únicamente el código de la población, nos saldría por ejemplo 12040 (el código de Castellón) en
tantas filas como institutos de Castellón tengamos (concretamente 14). Es el mismo resultado que si hubiéramos puesto el predicado ALL
frente a las columnas, ya que este es el predicado por defecto:

SELECT ALL cod_m 
 
FROM INSTITUTOS

Este resultado no es el correcto, si queremos consultas como "Poblaciones donde hay institutos". Sería mejor si saliera 12040 sólo una vez.
Esto lo conseguiremos con el predicado DISTINCT.

En definitiva lo que hará el predicado DISTINCT será sacar las filas diferentes del resultado que pedimos. Si sólo pedimos un campo, sacará
los valores distintos de este campo. Si pedimos más de un campo, sacará los valores diferentes para el conjunto de los campos (es decir las
filas diferentes, que en un campo pueden coincidir, pero no en el conjunto de todos los campos)

sintaxis

SELECT DISTINCT <columnas> 
 
FROM <tablas>

Así, en el ejemplo anterior:

SELECT DISTINCT cod_m 
 
FROM INSTITUTOS

Hay una variante del DISTINCT que suparta PostgreSQL, pero que no soportan otros SGBD más sencillos, como Access. Es poner el
DISTINCT dentro de una función de agregado, como por ejemplo COUNT. El resultado es que contará (o la función implicada: sumará
calculará la media, ...) los valores diferentes del campo que vaya a continuación.

Así por ejemplo, si queremos contar en cuántas poblaciones diferentes tenemos institutos, la consulta es tan sencilla como esta:

SELECT COUNT (DISTINCT cod_m) 
 
FROM INSTITUTOS

ejemplos

1. Sacar las diferentes provincias.

SELECT DISTINCT provincia 
 
FROM COMARCAS

2. Sacar los distintos distritos (códigos postales) de Castellón (código de municipio 12040) donde hay institutos

SELECT DISTINCT codpostal 
 
FROM INSTITUTOS 
 
WHERE cod_m = 12040

3. Sacar las distintas comarcas y lenguas que se hablan en ellas

SELECT DISTINCT nom_c, lengua 
 
FROM POBLACIONES 
 
ORDER BY 1

 
ejercicios

Ejercicios apartado 16

06:30  Sacar los vendedores que han vendido algo el mes de enero de 2015.

06:31 Sacar los diferentes fines de vendedores (evitar que aparezca el valor nulo)

06:32  Contar en cuantas poblaciones tenemos clientes
17. La cláusula LIMIT .. OFFSET

Por medio de la cláusula LIMIT ­ OFFSET podremos hacer que no aparezcan todas las filas que devuelve la sentencia, sino varias.

LIMIT número : especificaremos cuántas filas queremos que se vuelven
OFFSET número : especificaremos a partir de qué posición queremos que se vuelven las filas

Si no ponemos la parte del OFFSET, aparecerán las primeras, y si especificamos OFFSET, se saltarán las primeras, tantas como se indica
en OFFSET. Para que realmente tenga sentido esta cláusula, es conveninet ordenar la información, ya que al decir las primeras ya se está
asumiendo que serán las primeras respecto algún orden. Así, por ejemplo nos podremos plantear sacar cosas como las 10 poblaciones más
altas, o las más habitadas.

El orden implícito que acabamos de comentar deberá hacerse por medio de la cláusula ORDER BY. Así, si queremos sacar los clientes más
jóvenes tendremos que ordenar por la fecha de nacimiento en orden descendente, para luego sacar los primenrs. Por lo tanto es muy difícil
ver una cláusula LIMIT si no tenemos una cláusula ORDER BY.

Nota

En el SQL de Access no existe la cláusula LIMIT. Para hacer cosas similar dispone del predicado TOP , que se pone inmediatamente
después del SELECT, pero siempre sacará las primeras, no tiene posibilidad de OFFSET.

sintaxis

SELECT <columnas> 
 
FROM <tablas> 
 
[LIMIT n ] [OFFSET m ]

El número n debe ser un entero, y se seleccionarán únicamente las n primeras filas (las de arriba). En caso de puesto OFFSET se saltarán 
m filas. En caso de no poner LIMIT , se saltarán m filas y se sacarán todas las demás hasta el final.

Por ejemplo, si queremos sacar las 10 poblaciones más altas, tendremos que coger las 10 primeras, ordenando por altura en forma
descendente:

SELECT nombre, altura 
 
FROM POBLACIONES 
 
ORDER BY altura DESC 
 
LIMIT 10

El ejemplo anterior parece correcto, pero no funciona del todo bien porque con los datos que tenemos, hay 3 poblaciones que no tienen
altura, y el valor nulo lo pone al final de todos los otros valores, en orden ascendente, y por tanto al principio en orden descendente.

Lo podemos arreglar sencillamente saltando las 3 primeras (que son las del nulo)

SELECT nombre, altura 
 
FROM POBLACIONES 
 
ORDER BY altura DESC 
 
LIMIT 10 OFFSET 3

Aunque parece mejor quitar las de altura nula, así no estamos obligados a saber cuántas poblaciones con altura nula hay

SELECT nombre, altura 
 
FROM POBLACIONES 
 
WHERE altura IS NOT NULL 
 
ORDER BY altura DESC 
 
LIMIT 10 

Si quiera sacar todas las poblaciones y alturas, excepto las que tienen nulo, y sabemos que estas son 3, podemos poner OFFSET sin LIMIT,
para saltar las 3 primeras, y sacar todas hasta el final

SELECT nombre, altura 
 
FROM POBLACIONES 
 
ORDER BY altura DESC 
 
OFFSET 3

ejemplos

1. Sacar las 5 poblaciones más pobladas

SELECT nombre, poblacion 
 
FROM POBLACIONES 
 
ORDER BY población DESC 
 
LIMIT 5

2. Sacar las 4 comarcas con más pueblos.

SELECT nom_c, COUNT (*) 
 
FROM POBLACIONES 
 
GROUP BY nom_c 
 
ORDER BY 2 DESC 
 
LIMIT 4

3. Sacar las 10 poblaciones con más institutos, saltándonos las 3 primeras.

SELECT cod_m, COUNT (*) 
 
FROM INSTITUTOS 
 
GROUP BY cod_m 
 
ORDER BY 2 DESC 
 
LIMIT 10 OFFSET 3

 
ejercicios

Ejercicios apartado 17

06:33  Sacar toda la información de los dos artículos más caros.

06:34  Sacar el código de las tres ciudades con más clientes

06:35  Sacar el vendedor que ha vendido menos facturas
18. Consulta de creación de tablas

Aparte  de  poder  consultar  información  de  una  o  más  de  una  mesa,  la  sentencia  SELECT  puede  servir  para  crear  una  nueva  tabla,  con
estructura y datos (las que vienen de la propia sentencia SELECT). Eso sí, no podremos definir de esta manera ni clave principal, ni claves
externas, ni ninguna otra restricción de las conocidas.

Además, esta característica escapa del estándar ANSI SQL, por lo que no le daremos excesiva importancia.

sintaxis

SELECT <columnas> INTO nova_taula 
 
FROM <tablas>

La sentencia puede llevar cualquier cláusula o predicado de los vistos hasta ahora, y el resultado que dé esta sentencia, se guardará en una
nueva tabla, con el nombre especificado.

El  nombre  de  los  campos  de  la  nueva  tabla  serán  los  especificados  en  el  apartado  <columnas>.  Por  lo  tanto  es  especialmente
recomendable la utilización de alias, ya que si ponemos serán los nombres de los campos de la nueva tabla.

Los tipos de datos de los campos serán los heredados de la consulta SELECT.

En caso de existir ya una tabla con el nombre especificado nos avisará de este hecho, dándonos la posibilidad de borrar la tabla anterior y
crear la nueva o cancelar.

Nota

Es  muy  recomendable,  como  de  otras  sentencias  de  manipulación  de  datos  que  veremos  más  adelante,  ejecutar  primero  la
sentencia  sin  el  INTO  ,  para  no  crear  la  mesa  todavía.  Cuando  estemos  seguros  de  que  el  resultado  es  lo  que  deseamos,
añadimos el INTO, y la mesa se creará además garantías.

ejemplos

1. Crear una copia de la tabla comarcas llamada COMARQUES_COPIA.

SELECT * INTO COMARQUES_COPIA 
 
FROM COMARCAS

Para no "ensuciar" la Base de Datos, podemos borrarla después de haber visto su creación con la sentencia

DROP TABLE COMARQUES_COPIA

2. Crear una tabla llamada RESUM_COMARQUES que contenga el nombre de la comarca, el número de pueblos, el total de población y
la altura media

SELECT nom_c, COUNT (*) AS num_pobles, SUM (población) AS poblacion, SUM (extension) AS extension,
AVG (altura) AS altura_mitjana INTO RESUM_COMARQUES 
 
FROM POBLACIONES 
 
GROUP BY nom_c

Al igual que en la anterior, después de haber visto su creación y contenido, podemos borrarla con la sentencia

DROP TABLE RESUM_COMARQUES
ejercicios

Ejercicios apartado 18

06:36  Crear una tabla llamada ARTICLE_36 , que sea una copia de la tabla ARTÍCULO, pero sustituyendo los valores nulos de
stock y stock_min por ceros.

06:37  Utilizar la tabla anterior para sacar el stock máximo, el mínimo y el promedio de stocks. Obsérvese que si utilizamos la tabla
ARTÍCULO, los resultados no serían los mismos (excepto el máximo), sobre todo la media, ya que los valores nulos no entrarían en
los cálculos de esta media.
19. Orden con que se ejecuta una sentencia SQL

Como hemos visto, y como veremos en la Parte II de este tema, la sentencia SELECT es muy completa y muy potente. Puede hacer
muchas cosas.

Quizás nos convenga saber en qué orden se ejecutan las cláusulas de que se compone, porque esto nos puede prevenir de posibles errores
en el momento de construir una sentencia de una cierta envergadura. La orden de ejecución es el siguiente:

Primero se toman los datos desde la mesa o las mesas especificadas en el FROM . No podremos tratar información que no
tengamos en este origen de datos.

Después se eliminan las filas que no cumplen la condición del WHERE , en caso de que tengamos esta cláusula.

Después las filas resultantes se agrupan por el o los campos especificados en el GROUP BY , en caso de que tengamos esta
cláusula.

Una vez hechos los grupos, se eliminan los que no cumplan la condición del HAVING , en caso de que tengamos esta cláusula.

Después se selecciona la información especificada en las columnas, que en caso de haber alguna función de agregado actuará
sobre los grupos que quedan (si teníamos cláusula GROUP BY) o sobre el total del origen de datos.

Posteriormente se ordena por los campos especificados en el ORDER BY , en caso de que tengamos esta cláusula.

Después aplica los predicado DISTINCT en caso de tenerlo especificado.

Por último se cogen tantas filas como indica la cláusula LIMIT , desplazadas tantas como indique OFFSET , si es que tenemos
esta cláusula especificada ..

Si tenemos cláusula INTO se procederá a crear una nueva tabla con el resultado anterior (la veremos más adelante)

Tener claro este orden nos puede clarificar algo, y poder evitar algunos errores. El error de la siguiente sentencia ya se había explicado en la
pregunta 13.

SELECT nom_c, COUNT (*), cod_m
 
FROM POBLACIONES 
 
GROUP BY nom_c

nos dará el siguiente error:

Pero si analizamos el orden en que se ejecutan es lógico: cuando llegamos a mostrar los campos (entre ellos cod_m ) los grupos
ya se han hecho, y para valores iguales de nom_c . En este momento no puedo sacar algo individual de cada grupo como es el
código de municipio, porque ya se ha agrupado. En este momento sólo se puede intentar sacar el nombre de la comarca (ya que
tiene el mismo valor para todo el grupo, es el campo por el que hemos agrupado), o alguna función de agregado, que calcula
sobre el grupo. Y de eso nos intenta avisar PostgreSQL.
Para solucionarlo podemos incluir el cod_m en el GROUP BY , y entonces haremos un grupo para cada comarca y población
diferente,  pero  seguramente  eso  no  nos  valdrá  de  nada  en  este  ejemplo,  porque  cada  grupo  sólo  contendrá  un  elemento  (un
municipio), aunque en otros ejemplos sí puede tener sentido. O  si  no  era  eso  lo  que  pretendíamos,  sencillamente  quitamos  el
campo cod_m de la sentencia, y nos funcionará bien.

Otro  ejemplo  ilustrativo  (que  ya  lo  pusimos  muy  parecido  en  la  pregunta  13)  puede  ser  el  siguiente:  podríamos  intentar  sacar  la  altura
máxima de todos los pueblos, y la población que tiene esta altura. Podríamos estar tentados de hacerlo de esta manera:

SELECT MAX (altura), nombre 
 
FROM POBLACIONES;

Nos dará el mismo error que antes, ya que como tenemos una función de agregado intentará hacer grupos, y como no tenemos
cláusula GROUP BY toda la mesa será un grupo. Y podrá calcular el máximo sin problemas, pero no podrá sacar algo individual
del grupo, como es el nombre. Y en este caso no se puede solucionar incluyendo el nombre en el GROUP BY, porque entonces
haremos  un  grupo  para  cada  población.  De  momento,  antes  de  ver  las  subconsultas,  sólo  podemos  resolver  este  ejemplo
ordenando por la altura de forma descendente, y hacer LIMIT 1 .

Podemos  observar  que  si  tenemos  cláusula  GROUP  BY  ,  a  partir  de  este  momento  todos  los  campos  que  ponemos  deben  estar  en  el
GROUP BY o en una función de agregado, tanto en la condición del HAVING , como en las columnas como en el ORDER BY . En cambio
no habrá para la cláusula WHERE , ya que ésta se realiza antes de que el GROUP BY
Ejercicios de todo el tema, con los resultados

En la BD factura , conectando como usuario factura :

6.1 Sacar toda la información de los pueblos (nómbrala Ex_6_1.sql ).

Un total de 1.663 filas

6.2 Sacar el código postal, el nombre y la dirección, por este orden, de todos los vendedores (nómbrala Ex_6_2.sql ).

6.3 Sacar el código de artículo, la descripción, precio y precio incrementado en un 5%, de todos los artículos.

Un total de 812 filas

6.4 Sacar la información de los clientes con el siguiente formato (debe ir todo en una columna):

Damborenea Corbato, Alicia. CALLE MADRID, 83 (12425)

Tenga en cuenta que está todo en una columna, y por lo tanto deberá concatenar de la forma adecuada. Fíjese también que en en el
nombre sólo las iniciales están en mayúsculas
Un total de 49 filas

6.5 Sacar el num_f, fecha y cod_ven de las facturas con las siguientes cabeceras respectivamente: Número Factura , fecha y Código
Vendedor (llámelo Ex_6_5 )

Un total de 105 filas

6.6 Dar alias en los campos que lo necesitan de la tabla ARTÍCULO (llámelo Ex_6_6 )

Un total de 812 filas

6.7 Sacar los clientes de la ciudad con código 12309 .

6.8 Sacar todas las facturas del mes de marzo de 2015 .
6.9 Sacar todos los artículos de la categoría  BjcOlimpia con un stock entre 2 y 7 unidades.

06:10 Sacar todos los clientes que no tienen introducido el código postal .
 

06:11  Sacar todos los artículos con el stock introducido pero que no tienen introducido el stock mínimo .

06:12 Sacar todos los clientes , el primer apellido de los cuales es VILLALONGA .

6.13.a Modificar el anterior para sacar todos los que son VILLALONGA de primer o de segundo apellido.

6.13.b Modificar el anterior para sacar todos los que no son VILLALONGA ni de primer ni de segundo apellido.
Un total de 46 filas

06:14 Sacar los artículos " Pulsador " (la descripción contiene esta palabra), el precio de los que oscila entre 2 y 4 € y de los que tenemos
un stock estrictamente mayor que el stock mínimo .
 

06:15 Contar el número de clientes que tienen el código postal nulo .

6.16 Contar el número de veces que el artículo  L76104 entra en las líneas de factura, y el número total de unidades vendidas de este
artículo. Sólo os hace falta la tabla LINIA_FAC.

6.17  Sacar la media del stock de los artículos.

6.17b  Modificar el anterior para tener en cuenta los valores nulos, como si fueran 0. Os vendrá bien la función COALESCE que convierte
los nulos del primer parámetro al valor dado como segundo parámetro (si es diferente de nulo, deja igual el valor). Por lo tanto la debe
utilizar de esta manera: COALESCE (stock, 0)

06:18  Contar cuántas facturas tiene el cliente 375

19.06  Calcular el descuento máximo , el mínimo y el descuento medio de las facturas .

6.20  Contar el número de pueblos de cada provincia (es suficiente sacar el código de la provincia y el número de pueblos).
6:21  Contar el número de facturas de cada vendedor a cada cliente.

Un total de 96 filas

De estas 96 filas, relativamente poque tienen un valor distinto de 1 en el número de facturas: la fila 29 (455, 30, 2) o la fila 34 (5, 342, 3)

22.6  Contar el número de facturas de cada trimestre. Para poder sacar el trimestre y agrupar por él (nos vale el número de trimestre, que va
del 1 al 4), podemos utilizar la función to_char (fecha, 'Q') .

No aparece ordenado, y quiere decir que en el trimestre 2 hay 25 facturas, en el trimestre 4 hay 35, en el trimestre 3 hay 33 y en el trimestre
1 hay 22

06.23  Calcular el total de cada factura, sin aplicar descuentos ni IVA. Sólo nos hará falta la mesa LINIES_FAC , y consistirá en agrupar por
cada num_f para calcular la suma del precio multiplicado por la cantidad .

Un total de 105 filas

24.6  Calcular la media de cantidades demandadas de aquellos artículos que se han pedido más de dos veces. Obsérvese que la tabla que
nos hace falta es LINIA_FAC, y que la condición (en el HAVING) es sobre el número de veces que entra el artículo en una línea de factura,
pero el resultado que se debe mostrar es la media de la cantidad.
06:25  Sacar los pueblos que tienen entre 3 y 7 clientes. Sacar sólo el código del pueblo y este número

06:26  Sacar las categorías que tienen más de un artículo "caro" (de más de 100 €). Obsérvese que también nos saldrá la categoría NULL,
es decir, aparecerá como una categoría aquellos artículos que no están catalogados.

06:27  Sacar todos los clientes ordenados por código de población, y dentro de estos por código postal.

Un total de 49 filas

06:28  Sacar todos los artículos ordenados por la categoría, dentro de este por el stock, y dentro de éste por precio (de forma descendente)
Un total de 812 filas

06:29 Sacar los códigos de vendedor con el número de facturas vendidas en el segundo semestre de 2015, ordenadas por este número de
forma descendente

06:30 Sacar los vendedores que han vendido algo el mes de enero de 2015.

06:31 Sacar los diferentes fines de vendedores (evitar que aparezca el valor nulo)

06:32 Contar en cuantas poblaciones tenemos clientes

06:33  Sacar toda la información de los dos artículos más caros.
06:34  Sacar el código de las tres ciudades con más clientes

06:35  Sacar el vendedor que ha vendido menos facturas

06:36  Crear una tabla llamada  ARTICLE_36 , que sea una copia de la tabla ARTÍCULO, pero sustituyendo los valores nulos de  stock  y 
stock_min  por ceros.

El resultado debe ser la creación de la tabla. Si consulte su contenido debe ser el siguiente:

Un total de  812 filas

06:37    Utilizar  la  tabla  anterior  para  sacar  el  stock  máximo,  el  mínimo  y  el  promedio  de  stocks.  Obsérvese  que  si  utilizamos  la  tabla
ARTÍCULO,  los  resultados  no  serían  los  mismos  (excepto  el  máximo),  sobre  todo  la  media,  ya  que  los  valores  nulos  no  entrarían  en  los
cálculos de esta media.
Licenciado bajo la Licencia Creative Commons Reconocimiento NoComercial CompartirIgual 3.0
Sistemas Gestores de Bases de Datos

Tema 6: SQL ­ Consulta básica (parte I)

 
 
Objetivos y Conocimientos previos

objetivos

El objetivo primordial es dominar el lenguaje SQL , para poder hacer sentencias de dificultad media­alta. En particular deberán
saber hacer:

Consultas DDL para crear, modificar y borrar tablas y vistas.
Consultas DML para insertar, modificar o borrar filas de una tabla.
Consultas SELECT, para sacar información de las tablas. Concretamente deberá conocer a la perfección todas sus
cláusulas.
Consultas SELECT con combinaciones o reuniones de tablas, incluyendo las combinaciones externas (LEFT JOIN).
Consultas de unión
subconsultas

Otro objetivo es el de conocer la arquitectura cliente­servidor , y para conseguir esto trabajaremos en PostgreSQL . 

Para la extensión del tema, lo dividiremos en 3 partes.

Por motivos didácticos empezaremos por la sentencia SELECT, en su forma más sencilla.

Continuaremos con las consultas más complicadas del SELECT.

Por último veremos las sentencias DDL y las de manipulación de datos.
conocimientos previos

Los conocimientos previos estrictas del tema son los del tema: Administración básica de PostgreSQL  y  el Modelo Relacional,
aunque este último, no lo podremos desatar de todo el entorno que nos estamos construyendo a la hora de diseñar una Base de
Datos, y así el tema del Modelo Entidad­Relación también nos vendrá muy bien.
1. Introducción

SQL es un lenguaje para organizar, gestionar y recuperar datos almacenados en una Base de Datos. El nombre " SQL " es una
abreviatura de SQL (Lenguaje Estructurado de Consultas), y como su nombre indica, es un lenguaje informático que se puede utilizar para
interacciones con una Base de Datos de tipo relacional.

SQL se utiliza para controlar todas las funciones que un SGBD proporciona a sus usuarios, incluyendo:

Definición de datos . SQL permite a un usuario definir la estructura y organización de los datos almacenados y las relaciones
existentes entre ellas (las llaves).

Recuperación de datos . SQL permite a un usuario oa un programa de aplicación recuperar los datos almacenados de la base de
datos y utilizarlas.

Manipulación de datos . SQL permite a un usuario oa un programa de aplicación actualizar la base de datos añadiendo nuevos
datos, suprimiendo datos antiguos y modificando datos previamente almacenados.

Control de acceso . SQL puede ser utilizado para restringir la capacidad de un usuario para recuperar, añadir y modificar datos,
protegiendo así los datos guardados ante accesos no autorizados.

Compartición de datos . SQL se utiliza para coordinar la compartición de datos por parte de usuarios concurrentes, asegurando que
no interfieren entre sí.

Integridad de datos . SQL define restricciones de integridad en la base de datos, protegiéndola contra corrupciones causadas por
cambios inconsistentes o por fallos del sistema.

SQL no es realmente un lenguaje informático completo tal como JAVA, C o PASCAL. SQL no dispone de la sentencia IF para examinar
condiciones,  ni  de  las  sentencias  WHILE  o  FOR  para  hacer  bucles,  por  ejemplo.  En  lugar  de  ello,  SQL  es  un  sublenguaje  de  base  de
datos, que consta de unas treinta sentencias especializadas para tareas de gestión de bases de datos, pero sólo 7 son las sentencias
principales .

También se dice que es un lenguaje de cuarta generación para que en él se dice qué información se quiere, sin especificar exactamente
cómo se consigue esta información.

También se dice que es un lenguaje orientado a conjunto de registros , ya que una sentencia puede devolver un conjunto de registros.
Esto es una gran ventaja con los lenguajes de tercera generación, que sólo podían trabajar registro a registro.

Dos son las maneras de ejecutar sentencias SQL.

De forma interactiva : se escribe una sentencia SQL, y se ejecuta, volviendo normalmente un conjunto de registros que se
presentarán en forma tabular.

Dentro de un programa escrito en otro lenguaje, que actuará como lenguaje anfitrión (y el SQL sería el lenguaje host, " huesped "). 

 A todos, absolutamente a todos los SGBD Relacionales comerciales se puede acceder por SQL.
2. DDL y DML

Como se ha comentado en la pregunta anterior, SQL nos permite definir, controlar y acceder a una Base de Datos.

Haremos una distinción principal entre estas funciones, separando lo que son las estructuras de las tablas y el contenido de las tablas. En
este sentido tendremos 2 subtipos de lenguajes:

DDL ( Data Definition Language o Lenguaje de Definición de Datos ): permite definir, modificar o borrar las estructuras, como pueden
ser tablas, vistas, índices, ... e incluso Bases de Datos. Básicamente las sentencias son 3:
 

CREATE  para crear la estructura
 
ALTER para modificarla
DROP para borrarla

DML ( lenguaje de manipulación de datos o Lenguaje de Manipulación de Datos ): permite acceder al contenido de las estructuras, a
los datos. Este acceso puede ser de dos tipos: para consultar o para modificar los datos
 

Para consultar:
 
SELECT 
 

Para modificar
 
INSERT inserta nuevas filas
UPDATE  modifica el contenido de filas ya existentes
 
DELETE borra filas
El  lenguaje  SQL  es  más  extenso  que  las  sentencias  anteriores,  incorporando  también  los  llamados  DCL  (  Data  Control  Language  o
Lenguaje  de  Control  de  Datos  ),  que  permite  controlar  los  datos  para  dar  permisos  o  quitarlos  sobre  los  datos,  o  controlar  las
transacciones, ..., pero de momento nos aconformarem con las sentencias de DML y DDL, y estas últimas, sobre todo, para definir tablas.
 
3. Entornos de trabajo

Como ya se ha comentado, en este tema utilizaremos el Sistema Gestor de Bases de Datos  PostgreSQL . Este SGBD utiliza la
arquitectura  cliente­servidor . Esto significa que hay un servidor central con el PostgreSQL instalado, y habrá muchos clientes que se
conectarán a este servidor. Se puede hacer desde la misma máquina donde está instalado el servidor, o desde otra.

En nuestro caso, el servidor ya está en marcha y funcionando. Se trata de un servidor que hemos instalado en local y que ya tenemos en
funcionamiento.

El entorno de trabajo será a aquel programa o conjunto de programas que utilizaremos para conectarnos al servidor y poder hacer
consultas SQL. En definitiva desde donde poder trabajar.

Tres serán los entornos que nos plantearemos, aunque el único que utilizaremos con posterioridad será el segundo:

psql : es un programa en forma línea de comandos, pero con sentencias SQL, en lugar de comandos de Sistema Operativo.
Comprobaremos que es muy árido y incómodo, y por eso se impondrá encontrar otros entornos que nos puedan permitir trabajar de
forma más cómoda.

PgAdmin 4 : es un entorno muy universal, que se ha impuesto mucho para poder trabajar cómodamente con PostgreSQL. Se
instalará en el cliente.

PhpPgAdmin : es un entorno muy similar a  phpMyAdmin ( que sirve para utilizar y administrar MySql, y está muy extendida su
utilización). phpPgAdmines un conjunto de páginas php que permiten utilizar y administrar PostgreSQL. Como es un conjunto de
páginas php debe haber instalado un servidor web. Aunque sirve también para administrar, nosotros sólo lo veremos aquí para
utilizarlo como clientes, como usuarios normales. Y no instalaremos nada, sino que supondremos que está ya instalado
(seguramente en la misma máquina donde está PostgreSQL), y desde cualquier máquina accederemos vía web (con un navegador).
Como estamos supasant que está instalado el servidor web y el mismo phpPgAdmin, lo que no depende de nosotros, lo vemos aquí
únicamente de manera ilustrativa. El programa que utilizaremos será PgAdmin
3.1 PgAdmin

Nos permitirá disponer de editores SQL y de procedimientos mucho más agradables que los vistos con psql , aparte de la posibilidad de
poder administrar la Base de Datos desde aquí.

Ya tenemos creada una conexión a la base de datos geo

Le hemos especificado:

Host name / address : nombre o IP del servidor a que nos conectamos. En nuestro caso: localhost. Si nos conectamos a un servidor
externo, la dirección es  la IP del servidor.
Puerto : puerto al que nos conectamos. El puerto por defecto de PostrgreSQL es 5432.
BBDD de mantenimiento : Lo podemos ver como la Base de Datos a la que nos conectaremos. Todas las pruebas las haremos
sobre la Base de Datos llamada geo que ya hemos creado en el tema de administración.

Una vez hemos entrado, podremos navegar por los objetos en la parte de la izquierda. Por ejemplo nos interesará ver las tablas que hay
creadas en la Base de Datos. Entonces entramos dentro de la conexión que hemos hecho, dentro de la Base de Datos geo.  En la Base de
Datos, entramos en Esquemas , concretamente en el esquema Public . Ahí es donde veremos todos los objetos de esta Base de Datos, y
veremos en el apartado de tablas que esta Base de Datos tiene 3 mesas. En la imagen estamos situados encima de la mesa poblaciones.
En la parte superior veremos que algunos botones están activados, y otros no, dependiendo de las acciones que se puedan hacer. El
significado de algunos de ellos se explica en la imagen:

pgAdmin III
Lo  que  más  nos  interesa  es  la  ejecución  de  sentencias  SQL.  Si  apretamos  el  botón  correspondiente  se  abrirá  una  ventana  donde
podremos  escribir  cómodamente  la  sentencia  (con  colorines:  azul  para  palabras  reservadas,  azul  clarito  para  constantes  numéricas,
moradet  pera  constantes  alfanuméricas,  ...),  y  la  podremos  guardar  o  abrir  una  ya  guardada,  ...  Esta  imagen  explica  las  partes  más
importantes:
 
pgAdmin 4

También podremos crear tablas utilizando el asistente. Aparte de ser más o menos cómodo que recordar SQL, tiene la ventaja de poder
elegir el tipo de las columnas entre todos los tipos disponibles en PostgreSQL. 

  

pgAdmin 4
4. Datos de los ejemplos y los ejercicios

Todos los ejemplos que se mostrarán en este tema se intentarán hacer sobre la conexión que ya tenemos hecha, es decir, en la Base de
Datos geo . Es una Base de Datos muy sencillita, con sólo 3 mesas, lo que ayudará a una fácil comprensión de su estructura. Este es el
esquema en el Modelo Entidad­Relación y en el Modelo Relacional:

Para los ejercicios trabajaremos sobre otra base de datos más completa que nos de más juego a la hora de hacer las sentencias SQL. Se
trata del ejercicio hecho en el tema 2 sobre una tienda, pero un poco más desarrollado. La Base de Datos denomina factura . Esta sería su
estructura, también en Modelo Entidad­Relación y Modelo Relacional.
En el tema de Administración, ya me configurado la primera conexión: base de datos geo
En la práctica guiada vamos a configurar la segunda. 

 
5. Práctica guiada

En el tema: Introducción básica a PostgreSQL  , ya me configurado la primera conexión: base de datos  geo

Partimos de esta situación:

En la práctica guiada vamos a configurar la segunda conexión: base de datos  factura

En esta práctica guiada vamos a importar una base de datos, pero primero vamos a crear la base de datos y el usuario. En este caso,
tanto la Base de datos como el usuario deben existir (no los crea esta restauración)

Una vez creados, ya podremos importar los datos a partir de un archivo llamado factura.sql  que os he dejado en el curso. Por tanto, lo
que vamos a hacer es:

Crear el usuario factura
Crear la Base de Datos factura, cuidando que el propietario sea factura
Importar los datos a partir del fichero factura.sql
1. Guardamos el fichero factura.sql para tenerlo disponible (lo tenéis en el curso en el apartado ­recursos­)

2. Ejecutamos el psql.  

Podemos hacerlo también desde un terminal. Para conectar directamente como usuario postgres: 

3. Creamos el usuario factura 

postgres = # CREATE ROLE factura LOGIN PASSWORD 'factura';

4. Creamos la base de datos

postgres = # CREATE DATABASE factura OWNER factura;
5. Importamos los datos. 

Nos conectamos a la base de datos y ejecutamos el archivo que nos hemos bajado (en mi caso está en / tmp)

postgres = # \ c factura 
 
You are now connected to database "factura" as user "postgres".

factura = # \ y /tmp/factura.sql

Recuerde que para importar la Base de Datos, también se puede hacer desde fuera, tal como hemos visto en el tema de administración.

administrador @ Ubuntu $ psql ­h localhost ­U postgres factura </tmp/factura.sql

NOTA.

En el momento de abrir una ventana para ejecutar sentencias SQL, debemos ser conscientes en cuál de las 2 conexiones se ha abierto, es
decir a qué Base de Datos hemos conectado. Eso o podemos ver fácilmente en el título de la ventana. 
 
6. Operadores

Los operadores que se gastan en el SQL de PostgreSQL son muchísimos. Cada tipo de datos tiene una serie de operadores, y el mismo
operador, aplicado a tipos distintos puede hacer cosas diferentes.

Se pueden ver todos los operadores en la tabla PG_OPERATOR , donde tendremos el nombre del operador, los tipos de datos de los
operandos y del resultado y el procedimiento que implementa el operador. Aquí tenemos una vista de esta tabla, aunque hay tantísimos
operadores que marea y todo (los que están repetidos es para especificar la actuación sobre operandos de diferentes tipos).
Podríamos incluso definir nuestros operadores, con la sentencia CREATE OPERATOR , donde definiríamos el tipo del operador de la
izquierda, el de la derecha, la función que implementa el operador, ... Lo intentaremos en el tema siguiente , cuando ya sepamos crear
funciones.

No haremos un repaso extenso de todos los operadores. Sólo los más habituales, y alguno de un tipo de datos especial. Los tipos de datos
los veremos en la tercera parte de este tema, cuando las sentencias de creación de tablas.

Por lo tanto, fíjese sobre todo en los opradors aritméticos , de cadena y de comparación .
operadores aritméticos

+ suma ­ resto * multiplicación / división

^ exponenciació | / raíz cuadrada ! factorial % Módulo  (rest  de  la


división)

ejemplos

SELECT | / 16;

SELECT 5 ^ 3;

SELECT 5 !;

Operadores de cadena

|| concatenación

ejemplos

SELECT 'Fecha y hora actual:' || Now ();

Operadores de comparación

= igual <> distinto ! = distinto


> mayor > = Mayor o igual < menor <= Menor o igual

Se utilizan principalmente en las condiciones. Vuelven siempre un valor booleano (true o false)

Operador conversor de tipo

:: tipo

Servirá para convertir algún dato a algún tipo de datos.

Así, por ejemplo,

'25 ­4­2012 ':: date estamos convirtiendo una cadena de texto en un dato de tipo date.

'(0,0)' :: point estamos convirtiendo el texto en un punto.

La forma utilizada en los ejemplos anteriores es una forma muy habitual de poner las constantes de un determinado tipo: la ponemos como
cadena de caracteres (entre comillas) y luego la convertimos. La única restricción será que PostgreSQL "entienda" lo que hay entre
comillas para hacer la conversión.

Para ver que realmente hay un cambio nos aprovechamos de pgAdmin que dice de qué tipo es un campo, si puede. Obsérvese que en el
primer campo no hemos puesto más que una tira de caracteres, pero en el segundo intentamos reconvertir esta misma tira de caracteres al
tipo POINT. En el resultado se observa como ha entendido que el tipo de dato es POINT.
También nos serviría la función point ( '(0,0)')

operadores Geométricos

operador Descripción utilización

<­> Distancia (deben ser del mismo tipo) point '(1,0) <­> point' (3,0) '

<@ Está contenido en? '(1,1)' :: point @ '((0,0), (2,2))' :: box

@> Contiene? box '((0,0), (2,2)) @> point' (1,1) '


La lista de operadores es mucho más larga, pero aquí sólo queremos mostrar alguno a modo ilustrativo.

Podemos hacer comprobaciones de este tipo:

SELECT '(0,0)' :: point <­> '(3,4)' :: point;

que nos dará la distancia entre el punto (0,0) y el punto (3,4) . Esta distancia debe ser 5.

SELECT '(1,1)' :: point <@ '((0,0), 2)' :: circle;

que nos dirá si el punto (1,1) está dentro del círculo con origen (0,0) y radio 2 . Como sí está devolverá el valor t (de true, verdadero).

 
7. Funciones

Como veremos un poco más adelante, en las sentencias SQL, además de columnas y valores constantes, podremos utilizar funciones.

PostgreSQL tiene muchas funciones ya creadas.

Haremos una recopilación de las funciones más importantes de PostgreSQL, de entre la multitud de funciones que existen. Las
agruparemos por categorías.

Evidentemente esta recopilación no es para aprenderlo de memoria, sino que servirá de consulta.

funciones numéricas

función explicación función explicación

ABS (n) Valor absoluto de n . LOG (m, n) Logaritmo, base m , de n

ACOS (n) Arccosinus de n (inverso del coseno) MOD (m, n) El resto de la división entre m y n

ASIN (n) Arcoseno de n (inverso de senos) POWER (m, n) m elevado a n

Atan (n) Arcotangente de n (inverso de la tangente) RANDOM () número aleatorio entre 0 y 1

Ceil (n) Enter inmediatamente superior o igual a n Round (n, [m]) n redondeado a m cifras decimales 


(por defecto 0)

COS (n) Coseno n . SIN (n) Sinus de n

EXP (n) n SQRT (n)
Exponencial de n (e   ) Raíz cuadrada de n

FLOOR (n) Enter inmediatamente inferior o igual a n TAN (n) Tangente de n

LN (n) Truncado (n, [m]) n truncado a m cifras decimales 


Logaritmo neperiano de n  
(por defecto 0)

Por ejemplo, podríamos simular el lanzamiento de un dado de esta manera:

SELECT truncado (RANDOM () * 6 + 1);

Funciones de caracteres

función explicación función explicación

Vuelve  el  código  ASCII  correspondiente


ASCII (c) REPLACE (c1, c2, c3) Reemplaza en c1 cada ocurrencia de c2 para c3
al carácter c

Vuelve  c1  rellenada  por  la  derecha  hasta  n


CHR (n) Vuelve el carácter con código ASCII n . RPAD (c1, n [c2])
caracteres con la cadena c2
CONCAT (c1, c2) Concatena las dos cadenas (equivalente RTrim (c1 [, set]) Cortar  por  la  derecha  mientras  encuentra  la
al operador || ) cadena set (por defecto blancos)

Vuelve la cadena con la primera letra de
Busca la primera ocurrencia de la subcadena s1
INITCAP (c1) cada  palabra  en  mayúsculas,  y  las Strpos (s, s1)
dentro de la cadena s
demás en minúsculas

Longitud  de  la  cadena.  Si  c1  es  de  tipo Vuelve  una  subcadena  de  c1  que  comienza  en
LENGTH (c1) CHAR,  incluirá  todos  los  espacios  en Sustrato (c1, m [, n]) el  carácter  m  y  consta  de  n  caracteres  (por
blanco del final. defecto hasta el final)

Vuelve  c1  rellenada  por  la  izquierda Vuelve c1 con cada carácter de c2 sustituido por


LPAD (c1, n [c2]) TRANSLATE (c1, c2, c3)
hasta n caracteres con la cadena c2 el correspondiente (en orden) de c3 .

Cortar  por  la  izquierda  mientras LOWER (c1) Vuelve la cadena en minúsculas


LTrim (c1 [, set]) encuentra  la  cadena  set  (por  defecto
blancos) UPPER (c1) Vuelve la cadena en mayúsculas

Por ejemplo, vamos a sacar los grados de la latitud de las poblaciones. Tendremos que coger los 2 primeros caracteres (los de la
izquierda).

SELECT nombre, latitud, sustrato (latitud, 1,2) 
 
FROM POBLACIONES;

Esto lo podríamos mejorar, ya que de esta manera obligamos a que sean siempre dos caracteres, los grados. De forma más genérica, los
grados es el que va delante del símbolo º . Por lo tanto lo que podemos hacer es buscar este símbolo y sacar los de delante (desde el
primero hasta el anterior a él)
SELECT nombre, latitud, sustrato (latitud, 1, strpos (latitud, 'º') ­ 1) 
 
FROM POBLACIONES;

Para coger los minutos de forma sencilla sería sacar los caracteres 4º y 5º, es decir, 2 caracteres a partir del 4.

SELECT nombre, latitud, sustrato (latitud, 4,2) 
 
FROM POBLACIONES;

Pero de forma más genérica (por si no se han puesto 0 no significativos), tendremos que sacar desde después del símbolo º hasta el
carácter anterior a ' (la cometa) que señala los minutos. Tenemos además la dificultad añadida de que la cometa debemos escapar.

SELECT nombre, latitud, sustrato (latitud, strpos (latitud, 'º') + 1, strpos (latitud, '\' ') ­
strpos (latitud,' º ') ­ 1) 
 
FROM POBLACIONES;

Y lo mismo haríamos para los segundos, (entre la comilla simple y la doble) .

Esta sentencia resume lo anterior, separando grados, minutos y segundos.

SELECT nombre, latitud, 
 
        sustrato (latitud, 1, strpos (latitud, 'º') ­ 1), 
 
        sustrato (latitud, strpos (latitud, 'º') + 1, strpos (latitud, '\' ') ­ strpos (
latitud, 'º') ­ 1), 
 
        sustrato (latitud, strpos (latitud, '\' ') + 1, strpos (latitud, "') ­ strpos
(latitud, '\' ') ­ 1) 
 
    FROM POBLACIONES;

Funciones de fecha

función explicación
NOW () (CURRENT_TIMESTAMP) Vuelve la fecha­hora actual, con la diferencia de horas respecto Todas  las  funciones  que  vuelven
la GMT horas  (con  fecha  o  sin),  lo  harán
hasta  la  micra  de  segundo,  a  no
ser que entre paréntesis indican las
LOCALTIMESTAMP Al igual que el anterior, pero sin la diferencia de la GMT
cifras  decimales  (de  segundo)  que
queremos
CURRENT_DATE Vuelve la fecha actual

CURRENT_TIME Vuelve la hora actual (con diferencia GMT)

localtime Vuelve la hora actual (sin diferencia GMT)

AGE (t) Vuelve la diferencia de la fecha actual y t

AGE (t1, t2) Vuelve la diferencia entre t1 (posterior) y t2 (anterior)

Saca el número correspondiente al campo (que puede ser year , month , day , hour  ,  minute  ,
EXTRACT (campo FROM t)
second , millisecond , microsecond , dow ( day of week ), ...

Por ejemplo, ¿cuánto tiempo ha pasado desde el intento de golpe de estado?

SELECT AGE ('23 / 02/1981 ':: DATE);

U otro, ¿en qué año estamos?

SELECT EXTRACT (year FROM CURRENT_DATE);

funciones geométricas
función explicación función explicación

AREA (o) Área del objeto HEIGTH (r) Altura del rectángulo

CENTER (o) Centro del objeto RADIUS (c) Radio del círculo

DIAMETER (c) Diámetro del círculo WIDTH (r) Anchura del rectángulo

Por ejemplo, el área de un círculo:

SELECT AREA ( '((5,5), 2)' :: CIRCLE);

funciones IP

función explicación ejemplo resultado

HOST (ip) Ojal en formato texto la dirección IP HOST ( '192.168.2.15/24') 192.168.2.15

Maskli (ip) Saca el número de bits de la máscara Maskli ( '192.168.2.15/24') 24

Pon  el  número  de  bits  de  la  máscara  a


SET_MASKLEN (ip, n) SET_MASKLEN ( '192.168.2.15/24',16) 192.168.2.15/16
los especificados
Netmask (ip) Construye la máscara de red Netmask ( '192.168.2.15/24') 255.255.255.0

Funciones de conversión

Servirán para pasar de un tipo a otro, donde uno de ellos será el tipo de cadena (varchar)

función explicación

Convertir una fecha en una tira de caracteres, utilizando el formato especificado (se verá este formato en la
To_char ( fecha, formato )
siguiente pregunta)

To_char  (  número, Convierte un número en una tira de caracteres


formado )

TO_NUMBER  (  exp., Convertir una tira de caracteres en un número, suponiendo que estaba en el formato indicado


Formato )

TO_DATE ( exp., Formato Convertir una tira de caracteres en un fecha
)

TO_DATETIME  (  exp., convierte una tira de caracteres en un fecha­hora


Formato )
7.1 Formatos de las fechas

Este tipo es muy versátil en cuanto al formato, bien sea para la introducción de los datos, o lo que es más habitual, para su presentación.
Se deberá utilizar una función, to_char , que aceptará 2 parámetros: el primero la fecha que se quiere presentar, y el segundo el formato
que queremos. En  el  formato  indicaremos  por  medio  de  determinados  caracteres  el  aspecto  que  queremos.  Por  ejemplo,  para  sacar  la
fecha de hoy con el formato día­mes­año, pondríamos:

SELECT to_char (NOW (), 'DD­MM­YYYY');

El siguiente cuadro resume estos caracteres, agrupado por categorías:

DÍAS MESES AÑOS

D Día de la semana (1­7) MM Mes (1­12) Y Último dígito del año


Mes en letras, utilizando 9
DD Día del mes (1­31) MONTH YY Últimos 2 dígitos del año
caracteres
Mes abreviado, utilizando 3
DDD Día del año (1­366) MON YYY Últimos 3 dígitos del año
caracteres
Día de la semana en letras, utilizando 9 El mes con números romanos
DAY RM YYYY Año con 4 dígitos
caracteres (julio = VII)
Día de la semana abreviado, utilizando 3
DY      
caracteres

En principio los formatos que vuelven letras lo estarán en inglés, pero luego veremos como cambiar de idioma.

HORAS MINUTOS SEGÚN

HH, HH12 Hora (1­12) MI minutos SS según


HH24 Hora (0­23)     SSSS Según desde la medianoche (0­86399)
Antes o después del mediodía (AM y
PM, AM        
  PM respectivamente)

OTROS

Semana del mes (1­5);
W, WW CC Siglo, con 2 cifras Q Cuarto de año, trimestre (1­4)
Semana del año (1­53)
 
/,. ; : ­ 
 
<espacio en Caracteres que pueden aparecer En los formatos que vuelven letras, pueden salir en mayúsculas, minúsculas o
blanco>  acompañante. la primera en mayúscula, si así lo ponemos en las letras del formato.
 
"texto"
Si inmediatamente ante un formato que vuelve letras ponemos FM , saldrán los caracteres justos que ocupan (por ejemplo el día de la
semana o el mes), y en los numéricos no saldrán los 0 no significativos.
Si inmediatamente ante un formato que vuelve letras ponemos TM , lo traducirá al idioma que esté configurado el servidor, que en nuestro
caso es castellano.

ejemplos:

Si ahora es 01/18/16 13:30 (en el servidor, no en su máquina), y hacemos SELECT to_char (NOW (), ' formato ');

formato salida

dd­mm­yy hh: mí 18­01­16 1:30
dd­mm­yy hh24: mi 18­01­16 13:30
dd­MON­yyy 18­JAN­016
dd­TMMON­yyy 18­ENE­016
Day, dd "de" month "de" yyyy Monday, 18 de january de 2016
FMDay, dd "de" FMmonth "de" yyyy. Monday, 18 de january de 2016.
TMDay, dd "de" TMmonth "de" yyyy. Lunes, 18 de enero de 2016.
FMDy PM FMhh­FMmi­FMSS Mon PM 1­30­00
TMDy PM TMhh­TMmi­TMss Lun PM 01­30­00
7.2 Formatos de los números

También podremos utilizar la función to_char para dar el aspecto que queramos a los números. En la siguiente tabla tenemos un resumen
con los diferentes símbolos, un comentario descriptivo de cada símbolo, y un ejemplo de formato con el resultado que daría para un
determinado valor. La sentencia sería SELECT to_char ( valor , ' formato '); :

símbolo comentario formato valor resultado

9 Equivale a una cifra decimal. Vuelve el valor con el número de cifras especificadas, 9999 34   34 


 
sustituyendo los ceros no significativos por espacios en blanco. Únicamente no ­34 ­34
sustituye por espacios en blanco cuando el valor es 0. Los negativos los saca con el
signo, y los positivos sin.
0 Igual al anterior, pero sin sustituir los ceros no significativos por espacios en blanco. 0000 34   0034 
 
­34 ­0,034 mil
S Quitar el signo: ­ para los negativos, + para los positivos. S9990 34   +34 
 
­34 ­34
$ Quitar este símbolo. $ 9990 34 $ 34
. Quitar el punto decimal en la posición indicada 34   34.00 
9990.99   
  0.5   0.50 
 
0.5 .50
9999.99

, Quitar la coma separadora de miles 9,999,990.99 34   34.00 


 
1234.5   1,234.50 
1234567 1,234,567.00
€ Quitar el símbolo monetario del euro 9990 € 34 34 €
 
D Quitar el símbolo separador de la parte decimal del país 9990D99 34   34,00 
 
0.5 0,50
G Quitar el símbolo separador de los miles del país en la posición indicada 9G999G990D99 1234   1.234,00 
 
1234567 1.234.567,00
9G990D99 1234.5 1.234,50
RN Quitar el valor en números romanos (hasta el 3999). RN  1967 mCMLXVII 
 
rn mcmlxvii
8. La consulta SELECT

Como su propio nombre indica SQL ( Structured Query Language ), la consulta o interrogación de la Base de Datos es el alma del SQL. Y
la instrucción que nos lo permite es SELECT .

Es una instrucción muy flexible y de mucha potencia, que permite consultar datos de una o más tablas, filtrar por filas y / o columnas,
ordenar el resultado, agrupar los datos (contando o sumando alguna columna), ... Incluso permite crear tablas nuevas que serían el
resultado de una consulta de otras tablas.

Veremos a continuación la sintaxis general de la instrucción, y posteriormente cada una de las cláusulas:

sintaxis

SELECT [DISTINCT] <columnas> 
  [INTO <cláusula>]   
    FROM <cláusula>  
 
  [WHERE <cláusula>] 
 
  [GROUP BY <cláusula>] 
  [HAVING <cláusula>]   
 
  [ORDER BY <cláusula>] 
 
  [LIMIT num1 OFFSET num2]

Como veis, las únicas cláusulas obligatorias son las columnas que queremos que salgan como resultado y la del FROM (donde se dice de
dónde vienen los datos).

Nota

En PostgreSQL no se distingue entre mayúsculas y minúsculas. Mejor dicho, PostgreSQL pasa de mayúsculas a minúsculas todos los
nombres de tabla o de campo o de lo que sea, a menos que vayan entre comillas dobles, que entonces se respetan maúscules y
minúscules.Com cuestión de estilo, yo no pongo nunca entre comillas los nombres de tablas y campos. Y para una mejor lectura,
intentaré poner siempre los nombres de tabla en mayúsculas, y los nombres de campo en minúsculas. También pondré en mayúsculas
las cláusulas de sentencias SQL (SELECT, FROM, WHERE, ...). Pero recuerde que es para una mejor lectura. Podría ir todo en
minúsculas perfectamente.
9. Consulta básica

Lo mínimo que se debe indicar en una instrucción SELECT es las columnas que queremos y su procedencia, que puede ser una o más de
una tabla.

sintaxis

SELECT <columnas>
FROM <cláusula>

Opcionalmente la sentencia puede terminar en punto y coma . En psql es obligatorio terminar en punto y coma, ya que es la manera que
tiene que saber que termina la instrucción (una instrucción puede ocupar más de una línea)

Y otra consideración importante es que en PostgreSQL los nombres de los objetos (tablas, columnas, ...) pueden constar de más de una
palabra. Si el nombre sólo consta de una palabra se puede poner sin más problemas, pero si consta de más de una palabra (con espías en
blanco por medio) o tiene carácter especial, o coincide con alguna palabra reservada (por ejemplo año ) , deberá ir entre comillas dobles .
Para ahorrar problemas, es una buena práctica hacer los nombres siempre de una palabra (si se quieren poner dos, unidas por el guión
bajo).

En <columnas> podremos poner (separadas por comas ):

nombres de las columnas que queremos; si hay confusión entre nombres de campos de distintas tablas, tendremos que poner
Taula.columna .

* : Indica todas las columnas.

Tabla. * : Indica todas las columnas de la tabla.

Funciones (ver pregunta 6)
Constantes : son valores que ponemos directamente. Los tipos de constantes son:

Numéricas : se ponen tal cual, con punto decimal (no puede ir coma decimal, porque sirve para separar las columnas)
Alfaumèriques : se ponen entre comillas simples
Para otros tipos (como por ejemplo fecha­hora), ponemos la constante entre comillas simples, y PostgreSQL hará la conversión

Expresiones que utilizan operadores para combinar columnas, funciones, constantes numéricas o alfanuméricas, ...

En la <cláusula> del FROM pondremos la mesa o las mesas (separadas por comas) de donde vienen los datos.

Así el siguiente ejemplo ojal toda la información de la tabla COMARCAS, es decir todas las filas y todas las columnas:

SELECT * FROM COMARCAS;

Mientras que la siguiente sólo saca el nombre:

SELECT nom_c FROM COMARCAS;

En el siguiente ejemplo se saca el nombre de cada población, los habitantes, la extensión y la densidad de población (habitantes partido
por extensión):

SELECT nombre, poblacion, extensión, población / extension FROM POBLACIONES;

Y en este sacamos el nombre de cada pueblo, la altura y la mitad de su altura (cosa un poco absurda pero que sirve para remarcar que si
ponemos una constante numérica, debemos poner el  punto decimal , no la coma decimal, ya que la coma sirve para separar los
campos):

SELECT nombre, altura, altura * 0.5 FROM POBLACIONES;

ejemplos

1. Sacar toda la información de la tabla POBLACIONES.

SELECT * FROM POBLACIONES;
 

2. Sacar el nombre y la altura de todas las poblaciones.

SELECT nombre, altura 
 
    FROM POBLACIONES;

3. Sacar el nombre de las poblaciones, el número de habitantes, y este número incrementado en un 5%.

SELECT nombre, poblacion, poblacion * 01:05 
 
    FROM POBLACIONES;

 Observa cómo debemos utilizar el punto decimal y no la coma decimal, ya que la coma sirve para separar los campos de la consulta
SQL

4. Sacar nombre, latitud y los grados de la latitud de todas las poblaciones. Para sacar los grados de la latitud sacaremos los caracteres
de la izquierda, hasta el primero el carácter º.

SELECT nombre, latitud, sustrato (latitud, 1, strpos (latitud, 'º') ­ 1) 
 
    FROM POBLACIONES;

 
ejercicios

Ejercicios apartado 9

 En la BD factura , conectando como usuario factura :

6.1 Sacar toda la información de los pueblos (nómbrala Ex_6_1.sql ).

6.2 Sacar el código postal, el nombre y la dirección, por este orden, de todos los vendedores (nómbrala Ex_6_2.sql ).

6.3 Sacar el código de artículo, la descripción, precio y precio incrementado en un 5%, de todos los artículos.

6.4 Sacar la información de los clientes con el siguiente formato (debe ir todo en una columna):

Damborenea Corbato, Alicia. CALLE MADRID, 83 (12425)

Tenga en cuenta que está todo en una columna, y por lo tanto deberá concatenar de la forma adecuada.
Fíjese también que en en el nombre sólo las iniciales están en mayúsculas

 
10. Alias   en las columnas

Tenemos también la posibilidad de dar nombres ( alias ) en las columnas que aparecerán en la cabecera de las columnas
correspondientes en el resultado.

sintaxis

SELECT columna1 [AS àlias1] [, columna2 [AS àlias2]] 
 
FROM TABLA;

Si queremos que en la cabecera aparezcan más de una palabra, las tendremos que cerrar con comillas dobles ( " ).

Por ejemplo:

SELECT cod_m AS "Código Municipio", nombre 
 
FROM POBLACIONES;

Es especialmente útil la utilización de alias cuando ponemos una expresión, en lugar de una única columna. Si no ponemos alias, aparece
en la cabecera algo parecido a ? Column? .

SELECT nom_c || '(' || provincia || ')' AS "Comarca (provincia)" 
 
FROM COMARCAS;
Y aparte de su valor estético, más adelante veremos sentencias SQL en las que obligatoriamente tendremos que poner alias a las
columnas que sean el resultado de una expresión.

ejemplos

1. Sacar de las poblaciones, el nombre y el número de habitantes (campo población), este último el nombre habitantes .

SELECT nombre, poblacion AS habitantes 
 
FROM POBLACIONES;

2. Sacar todos los campos de la tabla INSTITUTOS de forma elegante.

SELECT código AS "Código Instituto", nombre as Nombre, direccion AS Dirección, numero AS Número,
codpostal AS "Código Postal", cod_m AS "Código Municipio" 
 
FROM INSTITUTOS;

 Si queremos que todas las cabeceras empiezan por mayúscula, tendremos que poner todos los alias entre comillas dobles,
aunque sólo constan de una paruala

SELECT código AS "Código Instituto", nombre as "Nombre", direccion AS "Dirección", numero AS
"Número", codpostal AS "Código Postal", cod_m AS "Código Municipio" 
 
FROM INSTITUTOS;
ejercicios

Ejercicios apartado 10

6.5 Sacar el num_f, fecha y cod_ven de las facturas con las siguientes cabeceras respectivamente: Número Factura , fecha y
Código Vendedor (llámelo Ex_6_5 )

6.6 Dar alias en los campos que lo necesitan de la tabla ARTÍCULO (llámelo Ex_6_6 )
11. La cláusula WHERE

Nos servirá para establecer filtros. Sólo saldrán las filas que satisfagan la condición del filtro.

sintaxis

SELECT <columnas> 
 
FROM <tablas> 
 
WHERE <condición>;

La condición podrá ser una o más de una, unidas en este caso por los operadores lógicos AND , OR y NOT . Cada condición será una
comparación entre expresiones, donde pueden entrar columnas, constantes, parámetros, funciones válidas de PostgreSQL, ... unidas por
operadores aritméticos. Los operadores que se pueden utilizar para hacer las comparaciones son:

<<= => => <> (! =)   (Distinto)

BETWEEN valor1 AND valor2 (los valores comprendidos entre valor1 y valor2)

IN ( llista_de_valors ) si el valor con el que se compara está en la lista de valores (entre paréntesis y valores separados por comas)

También podemos utilizar LIKE en la condición. En los ejemplos 6, 7 y 8 se ve su utilización. El operador LIKE se utiliza junto con los
caracteres " comodín ":
% (Equivale a 0 o más caracteres, los que sea)
_ (1 y sólo un carácter, eso sí, lo que sea).

IS [NOT] es un operador especial para comparar con el valor nulo ( NULL ).
 

Recordemos por otra parte como se escriben las constantes:

las constantes numéricas van tal cual, sin comillas ni nada (con el punto decimal, y no coma decimal)

las constantes alfanuméricas (de texto) van entre comillas simples

las constantes de fecha van entre comillas simples, y PostgreSQL ya hará la conversión

por último el Valur nulo escribe NULL

ejemplos

1. Sacar las comarcas de la provincia de Castellón

SELECT * 
 
FROM COMARCAS 
 
WHERE provincia = 'Castellón';

2. Sacar todas las poblaciones que tienen de lengua el valenciano.

SELECT * 
 
FROM POBLACIONES 
 
WHERE lengua = 'V';

3. Sacar las poblaciones de la comarca de la Plana Alta de más de 300 metros de altura
SELECT * 
 
FROM POBLACIONES 
 
WHERE nom_c = 'Plana Alta' AND altura> 300;

4. Sacar los institutos de los códigos postales 12001, 12002 o 12003.

SELECT * 
 
FROM INSTITUTOS 
 
WHERE codpostal = 12001 OR codpostal = 12002 OR codpostal = 12003;

SELECT * 
 
FROM INSTITUTOS 
 
WHERE codpostal> = 12001 AND codpostal <= 12003;

SELECT * 
 
FROM INSTITUTOS 
 
WHERE codpostal BETWEEN 12001 AND 12003;

SELECT * 
 
FROM INSTITUTOS 
 
WHERE codpostal IN (12001,12002,12003);

 
5. Sacar los pueblos de la comarca Plana de Utiel . Tenemos la dificultad de la comilla simple, que nos sirve siempre para delimitar una
constante alfanumérica. La manera de solucionarlo es ponerla dos veces

SELECT * 
 
FROM POBLACIONES 
 
WHERE nom_c = 'Plana de Utiel';

6. Sacar nombre y provincia de los pueblos que empiezan por G (el primer apellido).

SELECT nombre, nom_c 
 
FROM POBLACIONES 
 
WHERE nombre LIKE 'G%';

7. Sacar las poblaciones que están a 40º 1 '(y los segundos que sean) de latitud norte

SELECT * 
 
FROM POBLACIONES 
 
WHERE latitud LIKE '40 º01 ____ N ';

Hemos puesto los 40º y 1 minuto. A continuación hemos puesto exactamente 4 caracteres, los que sea. Hemos puesto 4, que
serían la cometa que señala los minutos, las 2 cifras de los segundos y la doble cometa que señala los segundos. Obsérvese
como la comilla simple es problemática, ya que es la que sirve para delimitar la constante alfanumérica. Si queremos ponerla, en
la constante deberemos doblar (la tendremos que poner 2 veces seguidas)

SELECT * 
 
FROM POBLACIONES 
 
WHERE latitud LIKE '40 º01 '' __ "N ';

8. Sacar todas las poblaciones, el nombre de las que sólo consta de una palabra (no tendrán espacios en blanco).
SELECT * 
 
FROM POBLACIONES 
 
WHERE nombre NOT LIKE '%%';

9. Sacar los institutos que no tienen introducido el numero de la calle.

SELECT * 
 
FROM INSTITUTOS 
 
WHERE numero IS NULL;
ejercicios

Ejercicios apartado 11

6.7 Sacar los clientes de la ciudad con código 12309 .

6.8 Sacar todas las facturas del mes de marzo de 2015 .

6.9 Sacar todos los artículos de la categoría  BjcOlimpia con un stock entre 2 y 7 unidades.

06:10 Sacar todos los clientes que no tienen introducido el código postal .
 
06:11  Sacar todos los artículos con el stock introducido pero que no tienen introducido el stock mínimo .

06:12 Sacar todos los clientes , el primer apellido de los cuales es VILLALONGA .

6.13.a Modificar el anterior para sacar todos los que son VILLALONGA de primer o de segundo apellido. 
 
6.13.b Modificar el anterior para sacar todos los que no son VILLALONGA ni de primer ni de segundo apellido.

06:14 Sacar los artículos " Pulsador " (la descripción contiene esta palabra), el precio de los que oscila entre 2 y 4 € y de los que
tenemos un stock estrictamente mayor que el stock mínimo .
 
Licenciado bajo la Licencia Creative Commons Reconocimiento NoComercial CompartirIgual 3.0
Ejercicios del tema, con los resultados

Ejercicios de todo el tema, con los resultados

En la BD factura , conectando como usuario factura :

6.1 Sacar toda la información de los pueblos (nómbrala Ex_6_1.sql ).

Un total de 1.663 filas

6.2 Sacar el código postal, el nombre y la dirección, por este orden, de todos los vendedores (nómbrala Ex_6_2.sql ).

6.3 Sacar el código de artículo, la descripción, precio y precio incrementado en un 5%, de todos los artículos.

Un total de 812 filas

6.4 Sacar la información de los clientes con el siguiente formato (debe ir todo en una columna):

Damborenea Corbato, Alicia. CALLE MADRID, 83 (12425)

Tenga en cuenta que está todo en una columna, y por lo tanto deberá concatenar de la forma adecuada. Fíjese también que en en el
nombre sólo las iniciales están en mayúsculas
Un total de 49 filas

6.5 Sacar el num_f, fecha y cod_ven de las facturas con las siguientes cabeceras respectivamente: Número Factura , fecha y Código
Vendedor (llámelo Ex_6_5 )

Un total de 105 filas

6.6 Dar alias en los campos que lo necesitan de la tabla ARTÍCULO (llámelo Ex_6_6 )

Un total de 812 filas

6.7 Sacar los clientes de la ciudad con código 12309 .

6.8 Sacar todas las facturas del mes de marzo de 2015 .
6.9 Sacar todos los artículos de la categoría  BjcOlimpia con un stock entre 2 y 7 unidades.

06:10 Sacar todos los clientes que no tienen introducido el código postal .
 

06:11  Sacar todos los artículos con el stock introducido pero que no tienen introducido el stock mínimo .

06:12 Sacar todos los clientes , el primer apellido de los cuales es VILLALONGA .

6.13.a Modificar el anterior para sacar todos los que son VILLALONGA de primer o de segundo apellido.

6.13.b Modificar el anterior para sacar todos los que no son VILLALONGA ni de primer ni de segundo apellido.
Un total de 46 filas

06:14 Sacar los artículos " Pulsador " (la descripción contiene esta palabra), el precio de los que oscila entre 2 y 4 € y de los que tenemos
un stock estrictamente mayor que el stock mínimo .
 

Das könnte Ihnen auch gefallen