Curso PostgreSQL
Autor: Luis Fernando Apáez Álvarez
Consultas
Sabemos que si utilizamos, por ejemplo, la siguiente sintaxis
SELECT * FROM empleados
se nos mostrará toda la información de nuestra tabla empleados
. Es decir, podemos traducir el código anterior a la siguiente instrucción: selecciona todas las columnas de la tabla empleados
. De tal manera, cuando colocamos el *
después del SELECT
estamos dando la instrucción de ver todas las columnas de la tabla. Si sólo quisiéramos ver el nombre completo de los empleados (que abarcan las columnas nombre, app, apm
) escribimos
SELECT nombre, app, apm FROM empleados;
De tal manera, se nos mostrarán las columnas que deseemos de una tabla si las colocamos entre el SELECT
y el FROM
. Si queremos ver todas las columnas de una tabla colocamos entonces el *
.
Ahora, podemos ver el resultado particular de una fila de una tabla. Supongamos que deseamos ver la información del empleado cuyo id de trabajador es el 857. Para ello escribimos
SELECT * FROM empleados WHERE id_empleados = 857;
que se “traduce” a : selecciona todas las columnas de la tabla empleados
, donde el id_empleados
es igual a 857, y nos arroja
Podemos combinar lo aprendido escribiendo algo como
SELECT nombre, app, apm, horario FROM empleados WHERE id_empleados = 7;
Además, podemos dar un poco de formato a las consultas. Por ejemplo, podemos concatenar columnas. Supongamos que es de nuestro interés ver el nombre completo de un empleado, pero no de la forma como lo hicimos antes, más bien visualizar el nombre completo junto y no en columnas por separado. Para ello usamos
-- Veamos el nombre completo del empleado con id igual a 1
SELECT nombre || ' ' || app || ' ' || apm FROM empleados WHERE id_empleados = 1;
donde los símbolos ||
indican concatenación, además ' '
hacen alusión a un espacio en blanco. Entonces, estamos concatenando el nombre con un espacio en blanco con el apellido paterno con un espacio con el apellido materno. Notamos que en la salida el nombre de la columna de nuestra consulta resultante es ?column?
pues de hecho, en la columna efectuada estamos combinando varias columnas de manera simultánea, por ello postgres coloca de manera automática dicho nombre. Podemos cambiar esto y para ello utilizaremos lo que se conoce como alias.
Alias
Si bien todas las columnas de nuestras tablas poseen un nombre en concreto, cuando realizamos diversas consultas puede que los resultados arrojen nombres de columnas desconocidos, tales como ?column?
como el caso de la consulta anterior. Por ende, utilizamos los alias para nombrar o renombrar una o más columnas sólo en la consulta efectuada. Es decir, si consideramos la columna nombre
de la tabla empleados
, podemos utilizar un alias para renombrarla, digamos Nombres
, no obstante, dicho renombre sólo será válido en la consulta que efectuemos, pues la etiqueta nombre
siempre será asociada a dicha columna y no Nombres
. De tal manera, puede pensarse a un alias como un nombre o renombre temporal.
Por ejemplo, de la consulta anterior podemos asignarle un alias a la columna ?column?
como sigue
SELECT nombre || ' ' || app || ' ' || apm AS nombre_completo
FROM empleados WHERE id_empleados = 1;
es decir, después de colocar la concatenación de las columnas hemos escrito AS
seguido del alias que queremos asignarle a dicha columna. Notemos que, si volvemos a efectuar la consulta
SELECT nombre || ' ' || app || ' ' || apm FROM empleados WHERE id_empleados = 1;
nuevamente el nombre de la columna resultante de la consulta será ?column?
.
Operador WHERE
Hemos visto anteriormente que WHERE
nos permite seleccionar una fila en particular de una tabla. Por ejemplo, podemos ver todas las ventas en las que intervino el empleado con id igual a 1, esto es
SELECT * FROM ventas WHERE id_empleado = 1;
Ahora bien, podemos utilizar WHERE
no sólo asociándole el símbolo de igualdad (id_empleado = 1
), de hecho, podemos utilizar WHERE
con más símbolos de comparación. Por ejemplo, podemos ver todas las ventas en las cuales se vendieron más de 20 artículos
SELECT * FROM ventas WHERE cantidad > 20;
donde vemos las primeras ocho filas y las últimas 7. En total tenemos que hay 80 ventas en las cuales se vendieron más de 20 artículos. Así como se utilizó el operador >
podemos usar <, <=
y >=
. Adicionalmente tenemos el operador distinto (<>
), por ejemplo podemos hallar todas las ventas cuya cantidad sea distinta de 20:
SELECT * FROM ventas WHERE cantidad <> 20;
OperadorBETWEEN
Podemos traducir la palabra between al español como entre. Lo anterior nos dice cómo funciona el operador BETWEEN
, pues podemos hallar ciertos valores comprendidos entre un rango de valores. Para utilizar la sentencia BETWEEN
nos auxiliaremos también de la sentencia WHERE
. Por ejemplo, podemos hallar todas las ventas en las cuales se han vendido entre los productos 8 y 20:
SELECT * FROM ventas WHERE id_producto_vendido BETWEEN 8 AND 20;
que se traduce como: selecciona todas las ventas de la tabla ventas
donde el id_producto_vendido
está entre los valores 8 y 20
De forma similar podemos utilizar la sentencia NOT BETWEEN
. Por ejemplo, si queremos hallar los empleados que no ganan entre los 10000 y 40000 escribimos
SELECT * FROM empleados WHERE salario NOT BETWEEN 10000 AND 40000;
(sólo mostramos las primeras 8 filas, pero la consulta arrojó más)
Operador LIKE
El operador LIKE
nos permite realizar comparaciones exclusivas de cadenas de texto. Recordemos que en consultas como
SELECT * FROM empleados WHERE nombre = 'Luis';
al emplear nombre = 'Luis'
estamos realizando una búsqueda exacta. Es decir, si fuera el caso que en nuestra tabla empleados
tenemos un empleado con nombre 'Lui'
(que probablemente fue mal ingresado a la tabla empleados
), la consulta anterior no nos mostraría a dicho empleado. Ahora bien, el operador LIKE
nos permite realizar búsquedas no exactas, es decir, nos permite comparar porciones de cadenas.
Por ejemplo, en la tabla empleados
, tenemos que el nombre de dos empleados comienzan con Lui, estos son
Así, si nosotros escribiéramos
SELECT * FROM empleados WHERE nombre = 'Lui';
el resultado de la consulta anterior sería vacía, es decir, no nos mostraría nada. Lo anterior debido a que estamos efectuando una búsqueda exacta. En cambio, al realizar una búsqueda que compare porciones de cadena podemos hallar a todos aquellos empleados cuyos nombres comiencen con Lui y nos arrojen a los empleados que mostramos antes. Para ello escribimos
SELECT * FROM empleados WHERE nombre LIKE 'Lui%';
donde hemos colocado %
después de 'Lui
pues estamos indicando que después de dicha palabra pueden variar los caracteres, como es el caso de Luis y Luise. Entonces, podemos colocar '%is'
después del LIKE
para buscar todos aquellos nombres de los empleados que terminen en is
SELECT * FROM empleados WHERE nombre LIKE '%is';
También, podemos buscar todos aquellos nombres de los empleados que contienen en su nombre la palabra arris, como por ejemplo Farris:
SELECT * FROM empleados WHERE nombre LIKE '%arris%';
Otros ejemplos. Podemos hallar todos los nombres de los empleados que comienzan con la letra N
SELECT * FROM empleados WHERE nombre LIKE 'N%';
o todos los nombres que terminan en s
SELECT * FROM empleados WHERE nombre LIKE '%s';
o todos los nombres que contienen la letra o
SELECT * FROM empleados WHERE nombre LIKE '%o%';
etcétera.
De forma totalmente análoga también podemos:
Hallar todos los nombres de los empleados que NO comienzan con la letra N
SELECT * FROM empleados WHERE nombre NOT LIKE 'N%';
o todos los nombres que NO terminan en s
SELECT * FROM empleados WHERE nombre NOT LIKE '%s';
o todos los nombres que NO contienen la letra o
SELECT * FROM empleados WHERE nombre NOT LIKE '%o%';
Finalmente, dado que con %
estamos sustituyendo en general cualquier tipo de caracteres en las búsquedas, por ejemplo en la búsqueda donde escribimos LIKE 'Lui%'
después de la palabra Lui y al escribir %
estamos indicando que después puede ir cualquier cantidad de letras o caracteres, tenemos que _
sustituirá tan sólo un carácter en especifico. Por ejemplo, si escribimos
SELECT * FROM empleados WHERE nombre LIKE 'Lui_';
estamos especificando que después de Lui sólo debe ir un carácter, de tal manera en donde el nombre es Luise quedará totalmente descartado puesto que después de Lui va específicamente otros dos caracteres.
De tal forma la consulta anterior sólo arroja
Ejercicios
- Realiza 10 consultas empleando el operador
WHERE
en diferentes tablas y seleccionando sólo algunas columnas de la tabla en cuestión (es decir, no ocupesSELECT * FROM
, en su lugar ocupa algo comoSELECT nombre, app, apm FROM
) - Realiza 2 consultas utilizando el operador
WHERE
concatenando las columnas de las tablas que consultarás. - Realiza 2 consultas utilizando el operador
WHERE
con operadores como<,>, <=, >=, <>
. - Realiza una consulta utilizando el operador
WHERE
junto conNOT BETWEEN
. - Realiza una consulta utilizando el operador
WHERE
junto conLIKE
oNOT LIKE
empleando en la comparación%
al inicio%
al final% %
para caracteres intermedios_
al inicio_
al final