Postgresql
Postgresql
Postgresql
Una de las tareas más comunes, cuando se trabaja con la base de datos, es consultar los datos de las
tablas mediante la sentencia SELECT.
SELECT
select_list
FROM
table_name;
SELECT
first_name
FROM
customer;
2. Uso de la instrucción SELECT para consultar datos en todas las columnas de un ejemplo de tabla:
SELECT
*
FROM
customer;
SELECT
first_name || ' ' || last_name AS full_name,
email
FROM
customer;
SELECT 5 * 3 AS result;
ORDER BY
La cláusula ORDER BY permite ordenar las filas devueltas de una instrucción SELECT en orden
ascendente o descendente según los criterios especificados.
SELECT DISTINCT
PostgreSQL SELECT DISTINCT para eliminar filas duplicadas de un conjunto de resultados devueltos
por una consulta.
SELECT
DISTINCT column_1
FROM
table_name;
WHERE
En el tutorial anterior, ha aprendido a utilizar la instrucción SELECT para consultar datos de una tabla.
¿Qué ocurre si desea consultar sólo determinadas filas de una tabla que satisfacen una determinada
condición. En este caso, debe usar la cláusula WHERE.
SELECT select_list
FROM table_name
WHERE condition;
LIMIT
PostgreSQL LIMIT es una cláusula opcional de la sentencia SELECT que devuelve un subconjunto de
filas devueltas por la consulta.
SELECT
*
FROM
table_name
LIMIT n;
En caso de que desee omitir varias filas antes de devolver las n filas, utilice la cláusula OFFSET situada
después de la cláusula LIMIT como la siguiente declaración:
SELECT
*
FROM
table
LIMIT n OFFSET m;
FETCH
Para cumplir con el estándar SQL, PostgreSQL proporciona la cláusula FETCH para recuperar una
porción de las filas devueltas por una consulta.
En esta sintaxis:
Debido a que el orden de las filas almacenadas en la tabla es impredecible, debe utilizar la cláusula
FETCH con la cláusula ORDER BY para que el conjunto de resultados sea coherente.
SELECT
film_id,
title
FROM
film
ORDER BY
title
OFFSET 3 ROW
FETCH FIRST 5 ROW ONLY;
IN
Utiliza el operador IN en la cláusula WHERE para comprobar si un valor coincide con algún valor de
una lista de valores. La sintaxis del operador IN es la siguiente:
value IN (value1,value2,...)
La expresión devuelve verdadero si el valor coincide con cualquier valor de la lista, es decir, el valor1 y
el valor2. La lista de valores puede ser una lista de números o cadenas o el conjunto de resultados de
una instrucción SELECT como se muestra en la siguiente consulta:
SELECT
customer_id,
rental_id,
return_date
FROM
rental
WHERE
customer_id IN (1, 2)
ORDER BY
return_date DESC;
NOT IN
Puede combinar el operador IN con el operador NOT para seleccionar filas cuyos valores no coincidan
con los de la lista. La siguiente afirmación encuentra que todos los alquileres con el ID de cliente no
son 1 o 2.
SELECT
customer_id,
rental_id,
return_date
FROM
rental
WHERE
customer_id NOT IN (1, 2);
SELECT
first_name,
last_name
FROM
customer
WHERE
customer_id IN (
SELECT
customer_id
FROM
rental
WHERE
CAST (return_date AS DATE) = '2005-05-27'
);
BETWEEN
Se utiliza el operador BETWEEN para comparar un valor con un rango de valores. A continuación se
ilustra la sintaxis del operador BETWEEN:
Puede reescribir el operador BETWEEN usando los operadores mayor o igual ( >=) o menor o igual
( <=) como la siguiente declaración:
Si quiere comprobar si un valor está fuera de rango, combine el operador NOT con el operador
BETWEEN de la siguiente manera:
Si quiere comprobar un valor contra los rangos de fechas, debe usar la fecha literal en formato ISO
8601, es decir, AAAA-MM-DD. Por ejemplo, para obtener el pago cuya fecha de pago está entre 2007-
02-07 y 2007-02-15, se utiliza la siguiente consulta:
SELECT
customer_id,
payment_id,
amount,
payment_date
FROM
payment
WHERE
payment_date BETWEEN '2007-02-07'
AND '2007-02-15';
LIKE
Supongamos que el gerente de la tienda te pide que encuentres un cliente que no recuerda el nombre
exactamente. Sólo recuerda que el nombre de pila del cliente comienza con algo como Jen. ¿Cómo
encuentras al cliente exacto al que el gerente de la tienda está preguntando? Puedes encontrar al
cliente en la tabla de clientes mirando la columna del nombre para ver si hay algún valor que
comience con Jen. Es algo tedioso porque hay muchas filas en la tabla de clientes.
SELECT
first_name,
last_name
FROM
customer
WHERE
first_name LIKE 'Jen%';
Construye un patrón combinando una cadena con caracteres comodín y utiliza el operador LIKE o NOT
LIKE para encontrar las coincidencias. PostgreSQL proporciona dos caracteres comodín:
PostgreSQL proporciona el operador ILIKE que actúa como el operador LIKE. Además, el operador
ILIKE coincide con el valor de caso insensible. Véase el siguiente ejemplo:
SELECT
first_name,
last_name
FROM
customer
WHERE
first_name ILIKE 'BAR%';
NULL
En el mundo de las bases de datos, NULL significa información perdida o no aplicable. NULL no es un
valor, por lo tanto, no se puede comparar con ningún valor como un número o una cadena. La
comparación de NULL con un valor siempre dará como resultado NULL, lo que significa un resultado
desconocido.
Aunque hay un NULL en la columna telefónica, la expresión NULL = NULL devuelve false. Esto se debe
a que NULL no es igual a ningún valor, ni siquiera a sí mismo.
value IS NULL
SELECT
id,
first_name,
last_name,
email,
phone
FROM
contacts
WHERE
phone IS NULL;
Alias
Un alias PostgreSQL asigna a una tabla o a una columna un nombre temporal en una consulta. Los
alias sólo existen durante la ejecución de la consulta.
SELECT
first_name || ' ' || last_name AS full_name
FROM
customer
ORDER BY
full_name;
Alias de la tabla
SELECT
column_list
FROM
table_name AS alias_name;
JOIN
La unión PostgreSQL se utiliza para combinar las columnas de una (auto-unión) o más tablas en base a
los valores de las columnas comunes entre las tablas. Las columnas comunes suelen ser las columnas
clave primarias de la primera tabla y las columnas clave externas de la segunda tabla.
PostgreSQL admite inner join, left join, right join, full outer join, cross join, natural join, y un tipo
especial de unión llamada self-join.
GROUP BY
La cláusula GROUP BY divide las filas devueltas de la declaración SELECT en grupos. Para cada grupo,
se puede aplicar una función agregada, por ejemplo, SUM() para calcular la suma de elementos o
COUNT() para obtener el número de elementos de los grupos.
SELECT
column_1,
column_2,
aggregate_function(column_3)
FROM
table_name
GROUP BY
column_1,
column_2;
La cláusula GROUP BY es útil cuando se utiliza junto con una función agregada. Por ejemplo, para
obtener el importe que se ha pagado a un cliente, se utiliza la cláusula GROUP BY para dividir la tabla
de pagos en grupos; para cada grupo, se calculan los importes totales mediante la función SUM():
SELECT
customer_id,
SUM (amount)
FROM
payment
GROUP BY
customer_id;
Para contar el número de transacciones de pago que cada personal ha estado procesando, se agrupan
las filas de la tabla de pagos en función de staff_id y se utiliza la función COUNT() para obtener el
número de transacciones como se muestra en la siguiente consulta:
SELECT
staff_id,
COUNT (payment_id)
FROM
payment
GROUP BY
staff_id;
SELECT
customer_id,
staff_id,
SUM(amount)
FROM
payment
GROUP BY
staff_id,
customer_id
ORDER BY
customer_id;
La fecha_de_pago es una columna de marca de tiempo. Para agrupar los pagos por fechas, utilice la
función DATE() para convertir primero las marcas de tiempo en fechas y luego agrupar los pagos por
la fecha de resultado:
SELECT
DATE(payment_date) paid_date,
SUM(amount) sum
FROM
payment
GROUP BY
DATE(payment_date);
HAVING
A menudo utilizamos la Cláusula HAVING junto con la cláusula GROUP BY para filtrar las filas de grupo
que no satisfacen una condición específica.
SELECT
column_1,
aggregate_function (column_2)
FROM
tbl_name
GROUP BY
column_1
HAVING
condition;
La cláusula HAVING establece la condición para las filas de grupo creadas por la cláusula GROUP BY
después de que se aplique la cláusula GROUP BY, mientras que la cláusula WHERE establece la
condición para las filas individuales antes de que se aplique la cláusula GROUP BY. Esta es la principal
diferencia entre las cláusulas HAVING y WHERE.
SELECT
customer_id,
SUM (amount)
FROM
payment
GROUP BY
customer_id
HAVING
SUM (amount) > 200;
SELECT
store_id,
COUNT (customer_id)
FROM
customer
GROUP BY
store_id
HAVING
COUNT (customer_id) > 300;
UNION
El operador UNION combina conjuntos de resultados de dos o más declaraciones SELECT en un único
conjunto de resultados. A continuación se ilustra la sintaxis del operador UNION que combina
conjuntos de resultados de dos consultas:
SELECT
column_1,
column_2
FROM
tbl_name_1
UNION
SELECT
column_1,
column_2
FROM
tbl_name_2;
El operador UNION elimina todas las filas duplicadas a menos que se utilice UNION ALL.
SELECT *
FROM
sales2007q1
UNION ALL
SELECT *
FROM
sales2007q2
ORDER BY
name ASC,
amount DESC;
INTERSET
Al igual que los operadores UNION y EXCEPT, el operador PostgreSQL INTERSECT combina los
conjuntos de resultados de dos o más instrucciones SELECT en un único conjunto de resultados. El
operador INTERSECT devuelve cualquier fila que esté disponible en ambos conjuntos de resultados o
devuelta por ambas consultas.
SELECT
column_list
FROM
A
INTERSECT
SELECT
column_list
FROM
B;
Para utilizar el operador INTERSECT, las columnas que aparecen en las declaraciones SELECT deben
seguir las reglas siguientes:
Para clasificar el conjunto de resultados devueltos por el operador INTERSECT, se coloca la cláusula
ORDER BY al final de la declaración, no al final de cada declaración SELECT.
SELECT
employee_id
FROM
keys
INTERSECT
SELECT
employee_id
FROM
hipos
ORDER BY employee_id;
EXCEPT
Al igual que los operadores UNION e INTERSECT, el operador EXCEPT devuelve las filas comparando
los conjuntos de resultados de dos o más consultas.
El operador EXCEPT devuelve filas distintas de la primera consulta (izquierda) que no están en la salida
de la segunda consulta (derecha). A continuación se ilustra la sintaxis del operador EXCEPT.
SELECT column_list
FROM A
WHERE condition_a
EXCEPT
SELECT column_list
FROM B
WHERE condition_b;
Para combinar las consultas usando el operador EXCEPTO, debe obedecer las siguientes reglas:
SELECT
film_id,
title
FROM
film
EXCEPT
SELECT
DISTINCT inventory.film_id,
title
FROM
inventory
INNER JOIN film ON film.film_id = inventory.film_id
ORDER BY title;
GROUPING SETS
PostgreSQL proporciona el GROUPING SETS que es la subcláusula de la cláusula GROUP BY.
SELECT
c1,
c2,
aggregate_function(c3)
FROM
table_name
GROUP BY
GROUPING SETS (
(c1, c2),
(c1),
(c2),
()
);
CUBE
PostgreSQL CUBE es una subcláusula de la cláusula GROUP BY. El CUBE permite generar múltiples
conjuntos de agrupación.
SELECT
c1,
c2,
c3,
aggregate (c4)
FROM
table_name
GROUP BY
CUBE (c1, c2, c3);
ROLLUP
A diferencia de la subcláusula CUBE, ROLLUP no genera todos los conjuntos de agrupación posibles
basados en las columnas especificadas. Sólo hace un subconjunto de ellos.
El ROLLUP asume una jerarquía entre las columnas de entrada y genera todos los conjuntos de
agrupación que tienen sentido considerando la jerarquía. Esta es la razón por la que ROLLUP se utiliza
a menudo para generar los subtotales y el total general de los informes.
SELECT
c1,
c2,
c3,
aggregate(c4)
FROM
table_name
GROUP BY
ROLLUP (c1, c2, c3);
SUBCONSULTA
Una subconsulta es una consulta anidada dentro de otra consulta como SELECCIONAR, INSERTAR,
BORRAR y ACTUALIZAR. En este tutorial, nos centramos sólo en la declaración SELECT.
Para construir una subconsulta, ponemos la segunda consulta entre paréntesis y la usamos en la
cláusula WHERE como expresión:
SELECT
film_id,
title,
rental_rate
FROM
film
WHERE
rental_rate > (
SELECT
AVG (rental_rate)
FROM
film
);
La consulta dentro de los paréntesis se llama subconsulta o consulta interna. La consulta que contiene
la subconsulta se conoce como una consulta externa.
Una subconsulta puede devolver cero o más filas. Para utilizar esta subconsulta, se utiliza el operador
IN en la cláusula WHERE.
Por ejemplo, para obtener películas que tengan la fecha de devolución entre 2005-05-29 y 2005-05-
30, se usa la siguiente consulta:
SELECT
film_id,
title
FROM
film
WHERE
film_id IN (
SELECT
inventory.film_id
FROM
rental
INNER JOIN inventory ON inventory.inventory_id = rental.inventory_id
WHERE
return_date BETWEEN '2005-05-29'
AND '2005-05-30'
);
EXISTS subquery
Una subconsulta puede ser una entrada del operador EXISTS. Si la subconsulta devuelve cualquier fila,
el operador EXISTS devuelve true. Si la subconsulta no devuelve ninguna fila, el resultado del
operador EXISTS es falso.
El operador EXISTS sólo se preocupa por el número de filas devueltas por la subconsulta, no por el
contenido de las filas, por lo que la convención común de codificación del operador EXISTS es la
siguiente:
SELECT
first_name,
last_name
FROM
customer
WHERE
EXISTS (
SELECT
1
FROM
payment
WHERE
payment.customer_id = customer.customer_id
);
ANY
El operador PostgreSQL ANY compara un valor con un conjunto de valores devueltos por una
subconsulta. A continuación se ilustra la sintaxis del operador ANY:
En esta sintaxis:
SELECT title
FROM film
WHERE length >= ANY(
SELECT MAX( length )
FROM film
INNER JOIN film_category USING(film_id)
GROUP BY category_id );
ALL
El operador PostgreSQL ALL permite consultar los datos comparando un valor con una lista de valores
devueltos por una subconsulta.
El operador ALL debe ser precedido por un operador de comparación como igual (=), no igual (!=),
mayor que (>), mayor o igual a (>=), menor que (<), y menor o igual a (<=).
El operador ALL debe ser seguido por una subconsulta que también debe estar rodeada por los
paréntesis.
SELECT
film_id,
title,
length
FROM
film
WHERE
length > ALL (
SELECT
ROUND(AVG (length),2)
FROM
film
GROUP BY
rating
)
ORDER BY
length;