Alonso Pablo
Posted on November 2, 2021
Fuente: https://www.youtube.com/watch?v=jxIEDKzGrOs&list=PL8gxzfBmzgex2nuVanqvxoTXTPovVSwi2
Programas utilizados: Pgadmin4 y Postgres.
CREATE DATABASE
CREATE DATABASE nombre_database;
Creamos una base de datos
llamada: nombre_database
.
-- Este es el script que se genera si lo hacemos a traves de la interfaz grafica de pgadmin4:
CREATE DATABASE nombre_database
WITH
OWNER = ownername
ENCODING = 'UTF8'
CONNECTION LIMIT = -1;
Creamos una base de datos
llamada: nombre_database
, damos el nombre del dueño de la base de datos: ownername
(para este ejemplo). La codificación, en este caso es UTF8
y el límite de conexiones en -1.
DROP DATABASE IF EXISTS
DROP DATABASE IF EXISTS "nombre_database";
-- Tenemos que estar desconectados de la base de datos a borrar.
Borramos la base de datos si existe
llamada: nombre_database
.
CREATE TABLE
CREATE TABLE
persona(
id_persona int NOT NULL,
nombre varchar(20),
dni varchar(10)
);
Creamos una tabla
llamada persona
que tiene 3 columnas: id_persona
, nombre
y dni
.
INSERT
INSERT INTO
persona
VALUES
('3', 'Maria', '12345');
Insertamos dentro
de la tabla persona
los valores en todas las columnas que tiene la tabla (id_persona
, nombre
y dni
).
INSERT INTO
persona(nombre, dni)
VALUES
('Maria', '12345');
Insertamos dentro
de la tabla persona
únicamente los valores en las columnas previamente dichas: nombre
y dni
.
SELECT
SELECT
*
FROM
persona;
Lista todos los registros con todas las columnas (ya que seleccionamos
con el carácter *
que refiere a todo
) de la tabla persona
.
WHERE AND
SELECT
*
FROM
persona
WHERE
id > 2;
Lista todos los registros donde
el id
de la entidad sea mayor a 2.
--... igual al anterior
WHERE
id > 2 AND nombre = 'Jose';
Lista todos los registros donde
el id
de la entidad sea mayor a 2 y
la columna nombre
sea igual a Jose
.
UPDATE
UPDATE
persona
SET
nombre = 'Jose'
WHERE
id = 2;
Actualiza
la tabla persona
actualizando
, valga la redundancia, la columna nombre
al valor Jose
donde
el id
sea igual a 2.
ALTER
ALTER TABLE
ALTER TABLE persona
ADD COLUMN apellido varchar(20);
-- No se puede poner NOT NULL si ya la tabla persona contiene registros/datos agregados.
Alteramos la tabla persona
y añadimos una columna apellido
con límite de 20 caracteres.
ALTER TABLE persona
RENAME COLUMN apellido TO nombre;
Alteramos la tabla persona
y renombramos una columna de apellido
a nombre
.
ALTER TABLE persona
DROP COLUMN nombre;
Alteramos la tabla persona
y eliminamos la columna nombre
ALTER COLUMN
ALTER TABLE persona
ALTER COLUMN nombre SET NOT NULL;
Alteramos la columna nombre
para decir que no puede tener NULL
como valor.
ALTER TABLE persona
ALTER COLUMN nombre DROP NOT NULL;
Alteramos la columna nombre
para borrar la restricción de la columna de no poder tener NULL
como valor. Ahora acepta NULL
como valor
ALTER TABLE persona
ALTER COLUMN nombre TYPE character varying;
-- No se puede poner tipos de datos que no acepten el tipo de dato al que pertenece el dato ya existente en la columna (en el caso de que dicho dato exista)
Alteramos la columna nombre
para cambiar el tipo de dato aceptado a character varying
.
SERIAL
CREATE TABLE
persona(
id serial PRIMARY KEY NOT NULL,
-- Otras columnas...
);
Creamos una tabla donde la columna id es de tipo serial
, esto quiere decir que va a generar automáticamente e incrementándose cuando insertemos datos.
DELETE DROP TRUNCATE
DELETE
DELETE FROM persona;
Vacía la tabla persona
(borra todos los registros). Cuando se agregan nuevos registros los id generados automáticamente no empiezan desde 1, sino que siguen desde el último id de la entidad borrada. 1, 2, 3; new=> 4, 5, 6.
DROP
DROP TABLE persona;
Borra la tabla persona
con sus registros. Se tiene que volver a crear la tabla y los id generados automáticamente empiezan desde 1.
TRUNCATE
TRUNCATE TABLE persona;
Vacia la tabla persona
como DELETE
.
TRUNCATE TABLE persona RESTART IDENTITY;
Vacía la tabla persona
. Cuando se agregan nuevos registros los id generados automáticamente empiezan desde 1.
VALORES POR DEFAULT
CREATE TABLE
persona(
--... otras columnas
telefono varchar(10) DEFAULT 'Unknown'
);
Creamos una tabla con una columna llamada telefono
con un valor por default
de 'Unknown'
COLUMNAS CALCULADAS
SELECT
nombre,
salario,
(salario + 1500) AS bono
FROM
plantilla;
Lista los registros con 3 columnas, la última es una creada a partir del salario
+ 1500 y es nombrada como bono
ORDER BY
SELECT
*
FROM
persona
ORDER BY
nombre DESC;
Lista todos los registros ordenadas por nombre
de forma descendente
.
--... igual que el anterior.
ORDER BY
salario ASC;
Lista todos los registros ordenadas por salario
de forma ascendente.
LIKE
SELECT
nombre
FROM
persona
WHERE
nombre LIKE '%e%';
Muestra los nombres de personas que tengan una letra e
minúscula en el campo nombre
.
--... igual que el anterior
nombre LIKE 'e%';
Muestra los nombres de las personas que tengan una letra e
minúscula como primera letra en el campo nombre
.
--... igual que el anterior
nombre LIKE '%E';
Muestra los nombres de las personas que tengan una letra e
mayúscula como última letra en el campo nombre
.
--... igual que el anterior
nombre LIKE '%e_';
Muestra los nombres de las personas que tengan una letra e
minúscula como anteúltima letra en el campo nombre
.
COUNT
SELECT
COUNT(*)
FROM
plantilla;
Muestra una columna de la suma de los registros dentro de plantilla
SUM
SELECT
SUM(salario)
FROM
planilla;
Muestra en una columna la suma total de todos los valores de salario
.
MIN MAX
-- Usando MIN
SELECT
MIN(salario)
FROM
plantilla;
Muestra en una columna el salario
con el valor más bajo.
-- Usando MAX
SELECT
MAX(salario)
FROM
plantilla;
Muestra en una columna el salario
con el valor más alto.
AVG
SELECT
AVG(salario)
FROM
planilla;
Saca el promedio entre todos los números de la columna.
SELECT
nombre,
AVG(salario)
FROM
plantilla
GROUP BY
nombre;
Saca el promedio dentro de cada grupo por nombre.
HAVING
Para usarlo necesitamos la cláusula GROUP BY
.
WHERE
trabaja con SELECT
y HAVING
trabaja con GROUP BY
.
SELECT
nombre, salario
FROM
plantilla
WHERE
nombre = 'Jose'
GROUP BY
nombre, salario
HAVING
salario > 3000;
Muestra los registros de nombre
'Jose' que en salario
tengan más de 3000.
DISTINCT
SELECT
DISTINCT nombre
FROM
persona;
Lista los nombres de las diferentes registros. Si uno o muchos registros tienen el mismo nombre solo se muestra 1 vez. No muestra nombres
repetidos.
BETWEEEN
SELECT
*
WHERE
salario
BETWEEN
2000 AND 5000;
Lista todos los registros donde
el valor de la columna salario sea entre
2000 y 5000.
-- ... igual que el anterior
NOT BETWEEN
2000 AND 5000;
Lista todos los registros donde
el valor de la columna salario no sea entre
2000 y 5000.
UNIQUE
ALTER TABLE persona
ADD CONSTRAINT uq_salario
UNIQUE(salario)
Restringe que la columna salario
de la tabla persona
no pueda tener valores repetidos, tienen que ser único
.
DROP CONSTRAINT
ALTER TABLE persona
DROP CONSTRAINT uq_salario
Elimina la restricción uq_salario
. En este ejemplo quitamos la restricción de valor único
en la columna de salario
FOREIGN KEY
-- Añadimos una columna llamada codigo_empresa en la tabla 'planilla'.
ALTER TABLE planilla
ADD codigo_empresa integer
-- Añadimos una llave foranea tomando el id de la tabla 'empresa' para podes añadirla en la columna 'codigo_empresa'.
ALTER TABLE planilla
ADD CONSTRAINT test_fk
FOREIGN KEY(codigo_empresa)
REFERENCES empresa (id)
UPDATE planilla SET codigo_empresa = '2'
Creamos una llave foránea para la tabla planilla
en la columna codigo_empresa
, a partir de la columna id
de la tabla empresa
. Ahora en la columna codigo_empresa
de la tabla planilla
solo se pueden poner valores que tenga la columna id
de la tabla empresa
, de otra forma nos daría error.
FUNCTION (stored procedure)
Funcion con parametros con nombre:
-- Creamos la funcion o la reemplazamos en el caso de que exista, y la guardamos.
CREATE OR REPLACE FUNCTION
Suma (num1 int, num2 integer)
RETURNS
integer AS
$$
SELECT num1 + num2;
$$
LANGUAGE SQL;
-- Ejecutamos la funcion guardada y retornaria una columna 'suma' con valor 200.
SELECT Suma ('50', '150');
Creamos una funcion
llamada suma
con dos parametros de tipo int
e integer
llamados num1
y num2
respectivamente.
Declaramos que retorna
un integer
y entre pares de símbolo $
indicamos la lógica de la función.
Luego indicamos el lenguaje utilizado.
Finalmente llamamos la funcion suma
y le pasamos los dos argumentos que necesita.
Funcion con parametro sin nombre:
CREATE FUNCTION
SearchSalary(varchar)
RETURNS
integer AS
$$
SELECT salary FROM company
WHERE name = $1
$$
LANGUAGE SQL
SELECT SearchSalary('Eduard')
Creamos una funcion
llamada SearchSalary
, decimos que va a tener un parámetro de tipo varchar
y que retornara un integer
.
Hacemos referencia al primer parámetro con $1
(si queremos hacer referencia al segundo parámetro, si hubiera, lo haríamos con $2 y así).
Finalmente llamamos a la función y le pasamos el nombre para que nos retorne su salario.
Funcion sin parametros y sin retornar resultado:
CREATE FUNCTION
InsertPersons ()
RETURNS
void AS
$$
INSERT INTO planilla VALUES ('Armando','3','65000');
INSERT INTO planilla VALUES ('Esteban','4','46000');
INSERT INTO planilla VALUES ('Quito','5','92000');
$$
LANGUAGE SQL
SELECT InsertPersons()
Creamos una función
sin parámetros y no retorna ningún valor. Solo inserta los datos en la tabla planilla
.
CREATE FUNCTION
SearchInfo (int)
RETURNS
planilla AS
$$
SELECT * FROM planilla
WHERE id = $1
$$
LANGUAGE SQL
SELECT SearchInfo(1)
Creamos una función
que retorna una columna que solo tiene una fila y esta contiene todas las columnas de la tabla planilla
con los datos encontrados según el id
que hayamos pasado a la función SearchInfo
.
LIMIT (Top) OFFSET
LIMIT
SELECT
*
FROM
planilla
LIMIT
5
Lista los primeros 5 o el número que pongamos después de LIMIT
. Sirve para limitar el número de resultados/registros.
OFFSET
SELECT
*
FROM
planilla
LIMIT
3
OFFSET
4
A partir de la 4 fila/registro lista las 3 filas/registros siguientes.
-- 1 Pepe < OFFSET (Ignora)
-- 2 Juan < OFFSET (Ignora)
-- 3 Roberto < OFFSET (Ignora)
-- 4 Julio < OFFSET (Ignora)
-- 5 German < LIMIT (Lista)
-- 6 Ana < LIMIT (Lista)
-- 7 Sandra < LIMIT (Lista)
-- 8 Eduardo
-- 9 Maria
-- OUTPUT:
-- 5 German
-- 6 Ana
-- 7 Sandra
TRIGGER
-- Esta funcion se va a guardar dentro de 'Trigger Functions'
CREATE FUNCTION
SP_Test()
RETURNS
TRIGGER AS
$$
BEGIN
-- A la hora de hacer el UPDATE
-- 'old': Si quiero guardar la informacion que ya estan en la planilla.
-- 'new': Si quiero guardar la informacion nueva que se ingresa a la tabla.
INSERT INTO "Log_Triggers" VALUES (old.nombre, old.dni, old.salario);
-- Para que el Trigger haga algo es necesario un RETURN
RETURN NEW;
END
$$
-- Indicamos que vamos a usar codigo mas de postrgreSQL
LANGUAGE PLPGSQL;
-- Creamos el trigger, asignamos cuando se acciona y que ejecuta.
CREATE TRIGGER
TR_Update
BEFORE UPDATE ON
planilla
FOR EACH ROW
EXECUTE PROCEDURE SP_Test();
-- Para probar el trigger:
UPDATE
planilla
SET
nombre = 'Eduardo',
dni = '123456',
salario = '20000'
WHERE nombre = 'Eduard';
Creamos una función la cual va a ser ejecutada por el Trigger
. Esta función en el caso de usar old
toma los datos que estaban en la tabla planilla
antes de ser actualizados y los guarda dentro de la tabla Log_Triggers
. O en el caso de usar new
guarda los datos nuevos que se ingresan a la tabla.
Creamos el Trigger
, le decimos que se ejecute antes
de actualizar
la tabla planilla
y que por cada
fila
ejecute
el procedimiento
SP_Test()
. En este caso es la función que creamos líneas arriba.
CREATE FUNCTION
SP_TR_Insert()
RETURNS
TRIGGER AS
$$
-- Para declarar variables usamos 'DECLARE'
DECLARE
-- User => es reemplazado por el nombre de usuario que esta usando la BD.
username Varchar(250) := User;
datenow date := current_date;
timenow Time := current_time;
BEGIN
INSERT INTO
"Log_Triggers"
VALUES (new.nombre, new.dni, new.salario, username, datenow, timenow);
RETURN NEW;
END
$$
LANGUAGE PLPGSQL;
CREATE TRIGGER
TR_Insert
AFTER INSERT ON
planilla
FOR EACH ROW
EXECUTE PROCEDURE SP_TR_Insert();
Creamos una funcion
llamada SP_TR_Insert
. Dentro declaramos variables y guardamos el nombre del usuario que utiliza la base de datos, la fecha y la hora en la que se ejecuta la función.
En la lógica de la función hacemos que guarde los nuevos datos que se van a ingresar y las variables que declaramos líneas arriba.
Finalmente creamos el Trigger
que va a activarse después
de insertar
en la tabla planilla
. Por cada fila que ingresamos ejecuta la función SP_TR_Insert
.
OR IN
OR
SELECT
*
FROM
planilla
WHERE
dni = '2' OR dni = '11' OR dni = '3'
Listamos de la tabla planilla
todos los registros que en la tabla dni
tengan como valor 2, 11 o 3. Usando el operador lógico OR
IN
SELECT
*
FROM
planilla
WHERE
dni IN ('2','11','3')
Listamos de la tabla planilla
todos los registros que en la tabla dni
tengan como valor 2, 11 o 3. Pero esta vez usando IN
y al lado un paréntesis con el o los valores que deben tener para ser listados.
VIEW
-- Creamos una vista a partir de determinadas columnas de la tabla planilla:
CREATE VIEW
view_dataperson
AS SELECT
nombre,dni
FROM
planilla;
Creamos una vista
llamada view_dataperson
que muestre solo las columnas que nosotros le digamos. Si se realiza un cambio en la tabla planilla
también se va a cambiar en la vista view_dataperson
.
-- Podemos consultar la vista como si fuera una tabla normal:
SELECT
*
FROM
view_dataperson
UNION
SELECT
nombre,
dni
FROM
planilla
-- Si queremos no filtre los repetidos usamos 'UNION ALL' en vez de 'UNION'
UNION
SELECT
nombre,
id
FROM
persona;
Lista todos los registros que haya en la tabla planilla
y persona
con las columnas que seleccionemos. En este caso usamos UNION
por lo tanto los registros repetidos van a ser filtrados.
Si queremos que no se filtren los registros repetidos hay que agregar ALL
luego de UNION
quedando: UNION ALL
.
SELECT
nombre,
dni,
'Planilla' AS Origen
FROM
planilla
UNION ALL
SELECT
nombre,
id,
'Persona'
FROM
persona;
Lista todos los registros (hasta los repetidos) que haya en la tabla planilla
y persona
con las columnas que seleccionemos. Además creamos una columna nueva llamada Origen
la cual contiene el nombre de la tabla de la cual pertenece el registro 'Planilla' o 'Persona'.
CREATE VIEW
view_union
AS SELECT
nombre,
dni
FROM
planilla
UNION
SELECT
nombre,
id
FROM
persona;
Por último podemos crear una vista para guardar los registros y consultarlo después sin tener que armar la unión de las dos tablas.
INNER JOIN (Simple join)
SELECT
*
FROM
planilla
INNER JOIN
persona
ON
planilla.dni = persona.id
Lista los registros que en las columnas de las tablas seleccionadas tienen el mismo valor.
En este caso hacemos un INNER JOIN
entre las tablas planilla
y persona
donde la relación sea entre la columna dni
de planilla
y la columna id
de persona
.
( A | AB | B )
LEFT JOIN
SELECT
*
FROM
planilla
-- Es lo mismo escribir 'LEFT JOIN' que 'LEFT OUTER JOIN'
LEFT JOIN
persona
ON
planilla.dni = persona.id;
Lista todos los registro que existen en la tabla de la izquierda
que en este caso seria planilla
y los registros que comparten el mismo valor en la columna dni
e id
de la tabla planilla
y persona
respectivamente.
( A | AB | B )
RIGHT JOIN
SELECT
*
FROM
planilla
-- Es lo mismo escribir 'RIGHT JOIN' que 'RIGHT OUTER JOIN'
RIGHT JOIN
persona
ON
planilla.dni = persona.id;
Lista todos los registro que existen en la tabla de la derecha
que en este caso seria persona
y los registros que comparten el mismo valor en la columna dni
e id
de la tabla planilla
y persona
respectivamente.
( A | AB | B )
FULL JOIN
SELECT
*
FROM
planilla
-- Es lo mismo escribir 'FULL JOIN' que 'FULL OUTER JOIN'
FULL JOIN
persona
ON
planilla.dni = persona.id;
Muestra todas las columnas de la tabla planilla
y persona
una al lado de la otra con todos los registros de ambas tablas. Donde no haya relación entre la columna dni
de la tabla planilla
y la columna id
de la tabla persona
los campos van a ser rellenados con [null]
.
( A | AB | B )
CROSS JOIN
SELECT
*
FROM
planilla
CROSS JOIN
persona
Lista cada registro de la tabla de la izquierda
por el número de registros totales de la tabla derecha
.
CROSS JOIN
no utiliza ON
Ejemplo:
-- nombre dni salario id nombre cedula
-- Jose 2 2500 20 Francisco 12345
-- Jose 2 2500 21 Daniel 21354
-- Jose 2 2500 22 Pedro 35421
-- Maria 3 4500 20 Francisco 12345
-- Maria 3 4500 21 Daniel 21354
-- Maria 3 4500 22 Pedro 35421
-- David 4 6500 20 Francisco 12345
-- David 4 6500 21 Daniel 21354
-- David 4 6500 22 Pedro 35421
WITH CHECK OPTION
CREATE VIEW
view_person
AS SELECT
*
FROM
"Persona"
WHERE
"Pais" = 'Costa Rica';
Primero necesitamos una vista
INSERT INTO
view_person
VALUES
('12345', 'Manuel', 'Vargas', 'Colombia', '43');
Insertamos un registro en la vista view_person
el cual el 'Pais' del registro no es 'Costa Rica' sino 'Colombia'. Esto hará que no se inserte en la vista view_person
sino en la tabla "Persona" causando un registro "fantasma" y posiblemente generando errores a largo plazo.
Para evitar esto se utiliza WITH CHECK OPTION
:
CREATE VIEW
view_person
AS SELECT
*
FROM
"Persona"
WHERE
"Pais" = 'Costa Rica'
WITH CHECK OPTION;
Antes de realizar un UPDATE o un INSERT primero se va a fijar en el criterio de la vista, que "Pais" solo tenga de valor 'Costa Rica'. Si cumple va a seguir con la operación, pero si no, nos va a dar un error.
ABS CBRT CEILING FLOOR
ABS
SELECT ABS(-30);
-- Salida esperada: 30
Devuelve el valor absoluto
del número ingresado.
CRBT
SELECT CBRT(27);
-- Salida esperada: 3
Devuelve la raíz cubica
del número ingresado.
CEILING
SELECT CEILING(15.33);
-- Salida esperada: 16
Devuelve el número ingresado redondeado para arriba
.
FLOOR
SELECT FLOOR(15.58);
-- Salida esperada: 15
Devuelve el número ingresado redondeando para abajo
.
POWER ROUND SIGN SQRT
POWER
SELECT POWER(2,4);
-- Salida esperada: 16
Devuelve el primer número
ingresado (2) elevado a la potencia
del segundo número
ingresado (4).
ROUND
SELECT ROUND(24.82);
-- Salida esperada: 25
SELECT ROUND(24.824,2);
-- Salida esperada: 24.82
SELECT ROUND(24.825,2);
-- Salida esperada: 24.83
SELECT ROUND(24.8,4);
-- Salida esperada: 24.8000
Devuelve el primer número
ingresado redondeado, si se ingresa un segundo número
este va a determinar cuantos números decimales va a tener luego del punto.
Redondea para arriba a partir del 5.
Redondea para abajo a hasta el 4.
Si se necesitan mas decimales se le agregan 0 hasta cumplir con el segundo número ingresado
.
SIGN
SELECT SIGN(0);
-- Salida esperada: 0
SELECT SIGN(234);
-- Salida esperada: 1
SELECT SIGN(-234);
-- Salida esperada: -1
Devuelve 1 si el número ingresado es positivo.
Devuelve 0 si el número ingresado es 0.
Devuelve -1 si el número ingresado es negativo.
SQRT
SELECT SQRT(9);
-- Salida esperada: -1
Devuelve la raíz cuadrada
del número ingresado.
MOD PI RANDOM TRUNC
MOD
SELECT MOD(33,2);
-- Salida esperada: 1
Devuelve el resto de la división
del primer número
ingresado con respecto al segundo número
ingresado.
PI
SELECT PI();
-- Salida esperada: 3.141592653589793
Devuelve el número Pi
.
RANDOM
SELECT RANDOM();
-- Salida esperada: 0.699286726400242
-- Salida esperada: 0.6155701055762748
-- Salida esperada: 0.2833145983469656
Devuelve un número aleatorio
entre 0 y 1.
TRUNC
SELECT TRUNC(-57.35)
-- Salida esperada: -57
SELECT TRUNC(-57.35736434,2)
-- Salida esperada: -57.35
Si no se ingresa un segundo número, se retorna el primer número ingresado sin decimal.
Si se ingresa un segundo número, se retorna el primer número ingresado con tantos decimales según el segundo número ingresado.
CHAR_LENGTH UPPER LOWER POSITION
CHAR_LENGTH
SELECT CHAR_LENGTH('Hola mundo');
-- Salida esperada: 10
Retorna el número de caracteres
del texto ingresado.
UPPER
SELECT UPPER('Hola mundo');
-- Salida esperada: 'HOLA MUNDO'
Devuelve el texto ingresado pero en mayúsculas
LOWER
SELECT LOWER('Hola Mundo');
-- Salida esperada: 'hola mundo'
Devuelve el texto ingresado pero en minúscula
POSITION
SELECT POSITION('mundo' in 'Hola mundo');
-- Salida esperada: 6
Devuelve la posición del primer texto
ingresado dentro del segundo texto
ingresado.
Si no encuentra la palabra devuelve 0.
SUBSTRING TRIM
SUBSTRING
SELECT SUBSTRING('Hello World' FROM 2 FOR 6);
-- Salida esperada: 'ello W'
Desde la posición 2 (empieza a contar desde el 1) toma los caracteres hasta la posición 6 y lo retorna.
Sirve para extraer una sección del texto pasándole dos números refiriendo a la posición de inicio y fin de la extracción.
TRIM
SELECT TRIM(' Hola Mundo ');
-- Salida esperada: 'Hola Mundo'
Retorna el texto pero sin espacios
al principio
ni al final
.
SELECT TRIM(LEADING '-' FROM '--Hola Mundo---');
-- Salida esperada: 'Hola Mundo---'
Retorna el texto, pero sin el carácter escogido
al principio
del texto, si hay un carácter al final este va a seguir estando.
SELECT TRIM(TRAILING '-' FROM '--Hola Mundo---');
-- Salida esperada: '--Hola Mundo'
Retorna el texto, pero sin el carácter escogido
al final
del texto, si hay un carácter al principio este va a seguir estando.
SELECT TRIMG(BOTH '-' FROM '--Hola Mundo---');
-- Salida esperada: 'Hola Mundo'
Retorna el texto pero sin el carácter escogido
en ambos
lados, al principio y al final.
LTRIM RTRIM SUBSTR LPAD RPAD
LTRIM
SELECT LTRIM(' Hola Mundo');
-- Salida esperada: 'Hola Mundo'
SELECT LTRIM('___Hola Mundo', '_');
-- Salida esperada: 'Hola Mundo'
Retorna el texto, pero sin espacios a la izquierda
y si queremos remover un carácter
en específico a la izquierda
del texto lo hacemos pasándole el carácter
luego del texto separado con una coma.
RTRIM
SELECT LTRIM('Hola Mundo ');
-- Salida esperada: 'Hola Mundo'
SELECT LTRIM('Hola Mundo___', '_');
-- Salida esperada: 'Hola Mundo'
Retorna el texto, pero sin espacios a la derecha
y si queremos remover un carácter
en específico a la derecha
del texto lo hacemos pasándole el carácter
luego del texto separado con una coma.
SUBSTR
SELECT SUBSTR('Hola Mundo___', 5);
-- Salida esperada: ' Mundo___'
Retorna el texto a partir de la posición que le digamos, en este caso a partir de la posición 5.
SELECT SUBSTR('Hola Mundo___', 5, 8);
-- Salida esperada: ' Mundo__'
Retorna el texto a partir de la posicion que le digamos, en este caso a partir de la posicion 5. Y hasta la posicion del segundo numero que le pasemos, en este caso 8.
LPAD
SELECT LPAD('Hola Mundo',15,'-');
-- Salida esperada: '-----Hola Mundo'
Retorna el texto, pero le agrega a la izquierda
(al principio) del mismo el carácter que le indiquemos.
Siempre se va a detener cuando el largo o el número de caracteres sea el número que le pasemos o en este caso el 15.
RPAD
SELECT RPAD('Hola Mundo',15,'-');
-- Salida esperada: 'Hola Mundo-----'
Retorna el texto, pero le agrega al la derecha
(al final) del mismo el carácter que le indiquemos.
Siempre se va a detener cuando el largo o el número de caracteres sea el número que le pasemos o en este caso el 15.
DATE TIME TIMESTAMP EXTRACT()
DATE
SELECT CURRENT_DATE;
-- Salida esperada: 2021-11-01
Retorna la fecha
en la que se corre esta consulta.
Año-Mes-Día
TIME
SELECT CURRENT_TIME;
-- Salida esperada: 02:52:07.291573+00:00
Retorna la hora
en la que se corre esta consulta.
Hora:Minutos:Segundos:Milisegundos+ZonaHoraria
TIMESTAMP
SELECT CURRENT_TIMESTAMP;
-- Salida esperada: 2021-11-01 02:54:04.825941+00
Retorna la fecha
y hora
en la que se corre esta consulta.
Año-Mes-Día Hora:Minutos:Segundos:Milisegundos+ZonaHoraria
EXTRACT()
-- Retorna en que año estamos:
SELECT EXTRACT(YEAR FROM CURRENT_TIMESTAMP);
-- Salida esperada: 2021
-- Retorna en que mes estamos:
SELECT EXTRACT(MONTH FROM CURRENT_TIMESTAMP);
-- Salida esperada: 11
-- Retorna en que dia estamos:
SELECT EXTRACT(DAY FROM CURRENT_TIMESTAMP);
-- Salida esperada: 1
-- Retorna la hora:
SELECT EXTRACT(HOUR FROM CURRENT_TIMESTAMP);
-- Salida esperada: 3
-- Retorna en que siglo estamos:
SELECT EXTRACT(CENTURY FROM CURRENT_TIMESTAMP);
-- Salida esperada: 21
-- Retorna en que parte del cuarto del año estamos:
SELECT EXTRACT(QUARTER FROM CURRENT_TIMESTAMP);
-- Salida esperada: 4
-- Retorna en que numero de dia de la semana estamos:
SELECT EXTRACT(DOW FROM CURRENT_TIMESTAMP);
-- Salida esperada: 1
-- Retorna el numero de dias que pasaron desde principio del año:
SELECT EXTRACT(DOY FROM CURRENT_TIMESTAMP);
-- Salida esperada: 305
-- Retorna el numero de meses que pasaron desde principio del año:
SELECT EXTRACT(WEEK FROM CURRENT_TIMESTAMP);
-- Salida esperada: 44
NULL
SELECT
*
FROM
person
WHERE
pais IS NULL;
Retorna todos los registros donde la columna pais
no tenga el valor NULL
SELECT
*
FROM
person
WHERE
pais IS NULL;
Retorna todos los registros donde la columna pais
tenga como valor NULL
SEQUENCE
-- Creamos la secuencia
CREATE SEQUENCE
sec_index
START WITH
1
INCREMENT BY
20
MINVALUE
1
MAXVALUE
100
CYCLE;
Si no ponemos valores MINVALUE
Y MAXVALUE
se setean los de por defecto: -9223372036854775808
y 9223372036854775807
.
Si no queremos que sea CYCLE
agregamos un NO
al inicio: NO CYCLE
. O simplemente lo quitamos.
-- Verificamos la secuencia creada
SELECT * FROM "sec_index";
-- Salida esperada:
-- sequence_name last_value start_value increment_by max_value min_value cache_value >>
-- sec_index 1 1 20 100 1 1
-- >> log_cnt is_cycled is_called
-- 0 true false
-- A mi me salio:
-- last_value log_cnt is_called
-- 1 0 false
En last_value
indica cuál es el número actual.
En is_called
indica si la secuencia fue iniciada/llamada.
-- Para iniciar/llamar la secuencia:
SELECT NEXTVAL('sec_index');
-- Salida esperada: 1
-- Salida esperada: 21
-- Salida esperada: 41
-- Salida esperada: 61
-- Salida esperada: 81
-- Salida esperada: 1
-- Salida esperada: 21
-- ... ya que es un ciclo vuelve a reiniciarse.
-- Si no es 'CYCLE' nos devolveria un error al querer superar el valor maximo.
DROP SEQUENCE sec_index;
Eliminamos la secuencia sec_index
.
SUBCONSULTA
DENTRO DE SELECT
SELECT
nombre,
apellido,
pais_residencia,
(
SELECT
MAX(precio) AS precio_max
FROM
precios
WHERE
pais = pais_residencia
)
FROM
persona;
Lista las columnas nombre
, apellido
, pais_residencia
y precio_max
. En este último tenemos el precio máximo de la tabla precios
coincidiendo el valor de la columna pais_residencia
de la tabla persona
con el valor de la columna pais
de la tabla precios
.
DENTRO DE WHERE
SELECT
nombre,
apellido
pais_residencia
FROM
persona
WHERE
pais_residencia = (SELECT pais FROM precios LIMIT 1);
Lista los registros si coincide que algún registro de la tabla persona tenga en la columna pais_residencia
el mismo valor que la subconsulta
, del valor de la columna pais
del primer registro de la tabla precios
.
DENTRO DE WHERE IN
SELECT
nombre,
apellido,
pais_residencia
FROM
persona
WHERE
pais IN (SELECT pais FROM precios WHERE pais LIKE '%C%');
Lista los registros que coinciden que la columna pais
de la tabla persona
tengan el mismo valor que los resultados de la subconsulta
de países que tengan C mayuscula
en la columna pais
de la tabla pais
.
Ejemplo:
-- nombre apellido pais_residencia
-- Alex Chacon Colombia
-- Maria Solis Costa Rica
-- Ana Alfaro Costa Rica
-- Otto Solano Colombia
DELETE UPDATE CON SUBCONSULTA
UPDATE
UPDATE
persona
SET
pais_residencia = (SELECT pais FROM precios ORDER BY precio LIMIT 1 OFFSET 10)
WHERE
pais_residencia IS NULL;
Actualiza los campos que tengan NULL
de la columna pais_residencia
de la tabla persona
con los datos de la subconsulta
sacado de la columna pais
de la tabla precios
ignorando los primeros 10 registros y solo trayendo 1 registro.
DELETE
DELETE FROM
persona
WHERE pais_residencia IN (SELECT pais FROM precios WHERE pais LIKE '%er%');
Borra los registros de la tabla persona
donde los registros tengan en la columna pais_residencia
el valor de los resultados de la subconsulta
. La subconsulta trae la columna pais
de la tabla precios
donde en su valor contenga: er
.
INSERT CON SUBCONSULTA
-- Existe una tabla llamada "precios"
-- Existe una tabla vacia llamada "precios_maximos"
INSERT INTO
precios_maximos
SELECT
pais, max(precio)
FROM
precios
GROUP BY
pais
Insertamos en la tabla vacía de precios_maximos
los resultados de la subconsulta
, la misma trae el precio maximo
de cada pais
sin repetir el valor de la columna pais
de la tabla precios
.
VARIABLES
-- NO SE PUEDE DECLARAR VARIABLES FUERA DE UN BLOQUE.
DECLARE @variable int;
SET @variable = 50;
SELECT @variable;
-- Nos da error.
Retornaría un error, ya que las variables tienen que declararse dentro de una estructura de bloque.
DO $$
DECLARE x int := 50;
y int := 500;
z int;
BEGIN
z := x * y;
-- Para que retorne el valor de z utilizamos '%':
RAISE NOTICE '%',z;
END
$$;
-- Salida esperada: NOTICE: 2500
-- DO
IF
DO $$
BEGIN
IF EXISTS(SELECT pais FROM precios WHERE pais = 'Iraq') THEN
RAISE NOTICE 'El pais SI ha sido encontrado';
ELSE
RAISE NOTICE 'El pais NO ha sido encontrado';
END IF;
END $$
Retorna 'El país SI ha sido encontrado' o 'El país NO ha sido encontrado' según si la condición dentro de los paréntesis de EXISTS
es true o falsa.
WHILE
DO
$$
DECLARE x int := (SELECT COUNT(id) FROM precios) -- x = 396
y int := 0;
BEGIN
WHILE (y < x)
LOOP
RAISE NOTICE 'Vuelta # %', y;
y := y + 1;
END LOOP;
END
$$
-- Salida esperada:
-- NOTICE: Vuelta # 0
-- NOTICE: Vuelta # 1
-- NOTICE: Vuelta # 2
-- NOTICE: Vuelta # 3
-- NOTICE: Vuelta # 4
-- NOTICE: Vuelta # 5
-- NOTICE: Vuelta # 6
-- NOTICE: Vuelta # 7
-- NOTICE: Vuelta # 8
-- NOTICE: Vuelta # 9
-- NOTICE: Vuelta # 10
-- ...
-- NOTICE: Vuelta # 393
-- NOTICE: Vuelta # 394
-- NOTICE: Vuelta # 395
-- DO
CASE
SELECT
pais,
precio,
CASE WHEN pais = 'Spain' THEN 'Vuelo con Escalas'
WHEN pais = 'Turkey' THEN 'Vuelo Retrasado'
ELSE 'Vuelo Normal'
END AS travel_status
FROM
precios;
-- Salida esperada:
-- pais precio travel_status
-- Turkey $89.28 Vuelo con Escalas
-- Spain $9.87 Vuelo Retrasado
-- Brazil $95.24 Vuelo Normal
-- Italy $12.22 Vuelo Normal
EXPORTAR IMPORTAR BASE DE DATOS PGADMIN4
EXPORTAR
Click derecho en la base de datos > Backup...
> Elegimos una dirección donde se guardara el backup > Role name
: postgres
> Y para terminar le damos al botón: Backup
IMPORTAR
Click derecho en Databases
> Create
> Database...
> Le damos un nombre > Finalizamos la creación con Save
.
Click izquierdo en la nueva base de datos que creamos y luego click derecho > Restore...
> En la fila de Filename
le damos a los tres puntitos (...
) para elegir el archivo que queremos importar > Para poder ver el archivo hay que cambiar el Format
a sql
> Seleccionamos el archivo de extensión .sql
> Seleccionamos en Role name
: postgres
> Y para terminar le damos al botón: Restore
.
EXPORTAR IMPORTAR UNA TABLA A CSV
EXPORTAR
Click derecho a la tabla > Import/Export...
> Le damos click en los tres puntitos (...
) para ubicar donde se va a guardar el archivo exportado > Format
: csv
> Header
: Yes
> Delimiter
: ,
> Para finalizar le damos al botón OK
.
IMPORTAR
Click derecho a la tabla > Import/Export...
> Cambiamos a importar en Import/Export
: Import
> Seleccionamos el archivo con los tres puntitos (...
) > Format
: csv
> Delimiter
: ,
> Para finalizar le damos al botón OK
.
CURSOR
Es una variable donde vamos a guardar el contenido de una registro resultado de una consulta
DO
$$
DECLARE
registro Record;
cur_precios CURSOR FOR SELECT * FROM precios ORDER BY pais;
BEGIN
OPEN cur_precios;
FETCH cur_precios INTO registro;
RAISE NOTICE 'Pais: % , Precio: %', registro.pais, registro.precio;
END
$$
LANGUAGE PLPGSQL;
Creamos un cursor
llamado cur_precios
que consulta las columnas de la tabla precios
ordenados por la columna pais
.
Abrimos el cursor
y luego hacemos un FETCH
para insertar un registro de cur_precios
dentro de la variable registro
.
Por último damos una noticia de cuanto vale registro.pais
y registro.precio
cada vez que ejecutemos este script.
Al ejecutar el script va a insertar un registro a la tabla registro
, hasta que el cursor
no tenga registros a que apuntar en cur_precios
.
Cabe destacar que el FETCH
va haciendo que el CURSOR
vaya apuntando al siguiente registro dentro de cur_precios
. Si hacemos dos FETCH
seguidos va a correr el primer FETCH
, se guarda un registro dentro de registro
y luego va a correr el segundo FETCH
con el registro que le sigue al primero dentro de cur_precios
para guardarlo dentro de registro
.
CURSOR CON WHILE
DO
$$
DECLARE
registro Record;
cur_precios CURSOR FOR SELECT * FROM precios ORDER BY pais;
BEGIN
OPEN cur_precios;
-- Mientras que encuentre registros el WHILE va a seguir funcionando.
-- Cuando no encuentre registros el WHILE va a terminar.
WHILE (FOUND) LOOP
FETCH cur_precios INTO registro;
END LOOP;
RAISE NOTICE 'Pais: % , Precio: %', registro.pais, registro.precio;
END
$$
LANGUAGE PLPGSQL;
El script esta vez toma todos los registros dentro del cursor
cur_precios
y los inserta dentro de la tabla registro
.
El script se detiene solo, ya que el WHILE
se va a detener cuando el cursor
no tenga registros a que apuntar dentro de cur_precios
.
CURSOR CON FOR
DO
$$
DECLARE
registro Record;
cur_precios CURSOR FOR SELECT * FROM precios ORDER BY pais;
BEGIN
-- Por cada registro dentro de 'cur_precios' lo guarde dentro de 'registro'
FOR registro IN cur_precios LOOP
RAISE NOTICE 'Pais: % , Precio: %', registro.pais, registro.precio;
END LOOP;
END
$$
LANGUAGE PLPGSQL;
Con FOR no hace falta abrir el cursor. Hace lo mismo que el WHILE pero en forma más resumida.
Posted on November 2, 2021
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.