├── .gitignore
└── Notes
├── notes.md
└── src
├── backup_1.jpg
├── backup_2.jpg
├── backup_3.jpg
├── backup_4.jpg
├── bd_proyecto.jpg
├── comandos_1.jpg
├── comandos_10.jpg
├── comandos_11.jpg
├── comandos_12.jpg
├── comandos_13.jpg
├── comandos_14.jpg
├── comandos_15.jpg
├── comandos_2.jpg
├── comandos_3.jpg
├── comandos_4.jpg
├── comandos_5.jpg
├── comandos_6.jpg
├── comandos_7.jpg
├── comandos_8.jpg
├── comandos_9.jpg
├── create_table_1.jpg
├── create_table_10.jpg
├── create_table_11.jpg
├── create_table_2.jpg
├── create_table_3.jpg
├── create_table_4.jpg
├── create_table_5.jpg
├── create_table_6.jpg
├── create_table_7.jpg
├── create_table_8.jpg
├── create_table_9.jpg
├── create_user_1.jpg
├── create_user_10.jpg
├── create_user_2.jpg
├── create_user_3.jpg
├── create_user_4.jpg
├── create_user_5.jpg
├── create_user_6.jpg
├── create_user_7.jpg
├── create_user_8.jpg
├── create_user_9.jpg
├── datos_remotos_1.jpg
├── datos_remotos_2.jpg
├── datos_remotos_3.jpg
├── diagrama_entidad_relacion_proyecto.jpg
├── diagrama_entidad_relacion_proyecto_styled.jpg
├── extensiones_1.jpg
├── extensiones_2.jpg
├── foreign_key_1.jpg
├── foreign_key_2.jpg
├── foreign_key_3.jpg
├── foreign_key_4.jpg
├── foreign_key_5.jpg
├── foreign_key_6.jpg
├── foreign_key_7.jpg
├── foreign_key_8.jpg
├── foreign_key_9.jpg
├── funciones_especiales_1.jpg
├── funciones_especiales_10.jpg
├── funciones_especiales_2.jpg
├── funciones_especiales_3.jpg
├── funciones_especiales_4.jpg
├── funciones_especiales_5.jpg
├── funciones_especiales_6.jpg
├── funciones_especiales_7.jpg
├── funciones_especiales_8.jpg
├── funciones_especiales_9.jpg
├── insersion_masiva_1.jpg
├── insersion_masiva_10.jpg
├── insersion_masiva_2.jpg
├── insersion_masiva_3.jpg
├── insersion_masiva_4.jpg
├── insersion_masiva_5.jpg
├── insersion_masiva_6.jpg
├── insersion_masiva_7.jpg
├── insersion_masiva_8.jpg
├── insersion_masiva_9.jpg
├── insert_1.jpg
├── insert_10.jpg
├── insert_11.jpg
├── insert_12.jpg
├── insert_13.jpg
├── insert_14.jpg
├── insert_15.jpg
├── insert_2.jpg
├── insert_3.jpg
├── insert_4.jpg
├── insert_5.jpg
├── insert_6.jpg
├── insert_7.jpg
├── insert_8.jpg
├── insert_9.jpg
├── join_1.jpg
├── maintenance_1.jpg
├── particiones_1.jpg
├── particiones_2.jpg
├── particiones_3.jpg
├── particiones_4.jpg
├── particiones_5.jpg
├── particiones_6.jpg
├── particiones_7.jpg
├── particiones_8.jpg
├── pgadmin_1.jpg
├── pgadmin_2.jpg
├── pgadmin_3.jpg
├── pgadmin_4.jpg
├── pgadmin_5.jpg
├── pgadmin_6.jpg
├── pl_1.jpg
├── pl_10.jpg
├── pl_11.jpg
├── pl_12.jpg
├── pl_13.jpg
├── pl_14.jpg
├── pl_2.jpg
├── pl_3.jpg
├── pl_4.jpg
├── pl_5.jpg
├── pl_6.jpg
├── pl_7.jpg
├── pl_8.jpg
├── pl_9.jpg
├── postgre_instal_1.jpg
├── postgre_instal_10.jpg
├── postgre_instal_11.jpg
├── postgre_instal_12.jpg
├── postgre_instal_13.jpg
├── postgre_instal_14.jpg
├── postgre_instal_15.jpg
├── postgre_instal_16.jpg
├── postgre_instal_17.jpg
├── postgre_instal_18.jpg
├── postgre_instal_19.jpg
├── postgre_instal_2.jpg
├── postgre_instal_3.jpg
├── postgre_instal_4.jpg
├── postgre_instal_5.jpg
├── postgre_instal_6.jpg
├── postgre_instal_7.jpg
├── postgre_instal_8.jpg
├── postgre_instal_9.jpg
├── replicas_1.jpg
├── replicas_10.jpg
├── replicas_11.jpg
├── replicas_12.jpg
├── replicas_13.jpg
├── replicas_14.jpg
├── replicas_15.jpg
├── replicas_16.jpg
├── replicas_17.jpg
├── replicas_2.jpg
├── replicas_3.jpg
├── replicas_4.jpg
├── replicas_5.jpg
├── replicas_6.jpg
├── replicas_7.jpg
├── replicas_8.jpg
├── replicas_9.jpg
├── tipos_join.jpg
├── transacciones_1.jpg
├── transacciones_2.jpg
├── transacciones_3.jpg
├── transacciones_4.jpg
├── transacciones_5.jpg
├── transacciones_6.jpg
├── trigger_1.jpeg
├── trigger_1.jpg
├── trigger_10.jpg
├── trigger_2.jpg
├── trigger_3.jpg
├── trigger_4.jpg
├── trigger_5.jpg
├── trigger_6.jpg
├── trigger_7.jpg
├── trigger_8.jpg
├── trigger_9.jpg
├── views_1.jpg
├── views_2.jpg
├── views_3.jpg
├── views_4.jpg
├── views_5.jpg
└── views_6.jpg
/.gitignore:
--------------------------------------------------------------------------------
1 | Examen Curso Postgres.pptx
2 | .vscode
--------------------------------------------------------------------------------
/Notes/notes.md:
--------------------------------------------------------------------------------
1 | # Curso de PostgreSQL
2 |
3 | - [Curso de PostgreSQL](#curso-de-postgresql)
4 | - [Modulo 1 Configurar Postgres](#modulo-1-configurar-postgres)
5 | - [Clase 1 Introduccion](#clase-1-introduccion)
6 | - [Clase 2 Que es Postgresql](#clase-2-que-es-postgresql)
7 | - [Clase 3 Instalacion y configuración de la Base de Datos](#clase-3-instalacion-y-configuración-de-la-base-de-datos)
8 | - [Clase 4 Interacción con Postgres desde la Consola](#clase-4-interacción-con-postgres-desde-la-consola)
9 | - [Comandos importantes PostgreSQL](#comandos-importantes-postgresql)
10 | - [Clase 5 PgAdmin: Interaccion con Postgres desde la Interfaz Grafica](#clase-5-pgadmin-interaccion-con-postgres-desde-la-interfaz-grafica)
11 | - [Clase 6 Archivos de Configuracion](#clase-6-archivos-de-configuracion)
12 | - [Clase 7 Comandos mas utilizados en PostgreSQL](#clase-7-comandos-mas-utilizados-en-postgresql)
13 | - [Comandos de ayuda](#comandos-de-ayuda)
14 | - [Comandos de navegacion y consulta de informacion](#comandos-de-navegacion-y-consulta-de-informacion)
15 | - [Comandos de inspeccion y ejecucion](#comandos-de-inspeccion-y-ejecucion)
16 | - [Comandos para debug y optimizacion](#comandos-para-debug-y-optimizacion)
17 | - [Comandos para cerrar la consola](#comandos-para-cerrar-la-consola)
18 | - [Ejecutando consultas en la base de datos usando la consola](#ejecutando-consultas-en-la-base-de-datos-usando-la-consola)
19 | - [Clase 8 Presentación del Proyecto](#clase-8-presentación-del-proyecto)
20 | - [Clase 9 Tipos de Datos](#clase-9-tipos-de-datos)
21 | - [Clase 10 Diseñando nuestra base de datos: estructura de las tablas](#clase-10-diseñando-nuestra-base-de-datos-estructura-de-las-tablas)
22 | - [Clase 11 Jerarquia de Bases de Datos](#clase-11-jerarquia-de-bases-de-datos)
23 | - [Modulo 2 Gestión de la información en bases de datos](#modulo-2-gestión-de-la-información-en-bases-de-datos)
24 | - [Clase 12 Creación de Tablas](#clase-12-creación-de-tablas)
25 | - [clase 13 Particiones](#clase-13-particiones)
26 | - [Clase 14 Creacion de Roles](#clase-14-creacion-de-roles)
27 | - [Creando roles desde SQL Shell](#creando-roles-desde-sql-shell)
28 | - [Creando roles desde PGAdmin](#creando-roles-desde-pgadmin)
29 | - [Clase 15 Llaves foraneas](#clase-15-llaves-foraneas)
30 | - [Clase 16 Insercion y consulta de datos](#clase-16-insercion-y-consulta-de-datos)
31 | - [Clase 17 Insercion masiva de datos](#clase-17-insercion-masiva-de-datos)
32 | - [Modulo 3 Generar consultas avanzadas](#modulo-3-generar-consultas-avanzadas)
33 | - [Clase 18 Cruzar tablas: SQL JOIN](#clase-18-cruzar-tablas-sql-join)
34 | - [Clase 19 Funciones Especiales Principales](#clase-19-funciones-especiales-principales)
35 | - [Clase 20 Funciones Especiales Avanzadas](#clase-20-funciones-especiales-avanzadas)
36 | - [Clase 21 Vistas](#clase-21-vistas)
37 | - [Vista volatil](#vista-volatil)
38 | - [Vista Materializada](#vista-materializada)
39 | - [Clase 22 PL/SQL](#clase-22-plsql)
40 | - [Creando funciones con PL](#creando-funciones-con-pl)
41 | - [Creando funciones con PGAdmin](#creando-funciones-con-pgadmin)
42 | - [Clase 23 Triggers](#clase-23-triggers)
43 | - [Modulo 4 Integrar bases de datos con servicios externos](#modulo-4-integrar-bases-de-datos-con-servicios-externos)
44 | - [Clase 24 Simulando una conexion a Bases de Datos remotas](#clase-24-simulando-una-conexion-a-bases-de-datos-remotas)
45 | - [Clase 25 Transacciones](#clase-25-transacciones)
46 | - [Clase 26 Otras Extensiones para Postgres](#clase-26-otras-extensiones-para-postgres)
47 | - [Modulo 5 Implementar mejores prácticas](#modulo-5-implementar-mejores-prácticas)
48 | - [Clase 26 Backups y Restauracion](#clase-26-backups-y-restauracion)
49 | - [Clase 29 Mantenimiento](#clase-29-mantenimiento)
50 | - [Clase 29 Introduccion a Replicas](#clase-29-introduccion-a-replicas)
51 | - [Clase 30 Implementacion de Replicas en Postgres](#clase-30-implementacion-de-replicas-en-postgres)
52 | - [Configuracion Master](#configuracion-master)
53 | - [Configuracion Replica](#configuracion-replica)
54 | - [Clase 31 Otras buenas Practicas](#clase-31-otras-buenas-practicas)
55 |
56 | ## Modulo 1 Configurar Postgres
57 |
58 | ### Clase 1 Introduccion
59 |
60 | Introduccion por el profesor
61 |
62 | ### Clase 2 Que es Postgresql
63 |
64 | Postgre es un motor de base de datos open source y usa el Objeto-Relacional, existen tres conceptos importantes acerca de las bases de datos
65 |
66 | - lenguaje
67 | - motor: Permite estructurar toda la información dentro de un servidor
68 | - servidor
69 |
70 | Esta base de datos cumple con el estándar ACID (reglas para bases de datos para tener buenas practicas)
71 |
72 | **• A: Atomicity – Atomicidad** -> Separar las funciones desarrolladas en la BD como pequeñas tareas y ejecutarlas como un todo. Si alguna tarea falla se hace un rollback(Se deshacen los cambios)
73 |
74 | **• C: Consistency – Consistencia** -> Todo lo que se desarrolló en base al objeto relacional. Los datos tienen congruencia (gracias a PK y FK)
75 |
76 | **• I: Isolation – Aislamiento** -> Varias tareas ejecutándose al mismo tiempo dentro de la BD (o varias instancias)
77 |
78 | **• D: Durability – Durabilidad** -> Puedes tener seguridad que la información no se perderá por un fallo catastrófico. PostgreSQL guarda la información en una Bitácora y luego guarda el cambio efectivo en la base de datos.
79 |
80 | Por Que PostgreSQL
81 |
82 | - Tipos de Datos
83 | - Integridad de Datos
84 | - Concurrencia, Rendimiento
85 | - Fiabilidad, recuperación ante desastres
86 | - Seguridad
87 | - Extensibilidad
88 | - Internacionalizacion
89 | - Búsqueda de Texto
90 | - Funciones com PostGIS y PL
91 |
92 | ### Clase 3 Instalacion y configuración de la Base de Datos
93 |
94 | Vamos a instalar PostgreSQL en nuestra computadora. A continuación veremos el paso a paso y algunos consejos útiles para instalar y configurar correctamente PostgreSQL en nuestro equipo. En éste caso, usaremos Windows, pero los pasos son bastante similares entre los diferentes sistemas operativos.
95 |
96 | Primer paso: ir a y descargar la version acorde a tu sistema operativo, una vez dentro de esa seccion haz click en **download installer**.
97 |
98 | Es altamente recomendable seleccionar la penúltima o antepenúltima versión. Si bien la última versión estable está disponible, en éste caso la 2.0, no es recomendable instalarla en nuestro equipo, ya que al momento de instalarla o usar un servicio en la Nube para Postgres, lo más seguro es que no esté disponible y sólo esté hasta la versión.5, que no es la última versión. Esto porque todos los proveedores de Infraestructura no disponen de la versión de Postgres más actual siempre (tardan un poco en apropiar los nuevos lanzamientos).
99 |
100 | Si tienes un equipo con Linux, la instalación la puedes hacer directamente desde los repositorios de Linux, EDB ya no ofrece soporte para instaladores en Linux debido a que se ha vuelto innecesario, el repositorio de Linux con PostgreSQL ofrece una manera mucho más sencilla y estándar para instalar PostgreSQL en linux.
101 |
102 | Segundo paso: descargamos la versión “Windows x86-64” (porque nuestro sistema operativo es de 64 bits). En caso de que tu equipo sea de 32 bits debes seleccionar la opción “Windows x86-32”.
103 |
104 | Vamos a descargar la versión.5. Hacemos clic en Download y guardamos el archivo que tendrá un nombre similar a:
105 | “postgresql-.5-2-windows-x64.exe”
106 |
107 | Ahora vamos a la carpeta donde descargamos el archivo .exe, debe ser de aproximadamente 90 MB, lo ejecutamos.
108 |
109 | 
110 |
111 | Hacemos clic en siguiente. Si deseas cambiar la carpeta de destino, ahora es el momento:
112 |
113 | 
114 |
115 | Seleccionamos los servicios que queremos instalar. En este caso dejamos seleccionados todos menos “Stack Builder”, pues ofrece la instalación de servicios adicionales que no necesitamos hasta ahora. Luego hacemos clic en siguiente:
116 |
117 | 
118 |
119 | Ahora indicamos la carpeta donde iran guardados los datos de la base de datos, es diferente a la ruta de instalación del Motor de PostgreSQL, pero normalmente será una carpeta de nuestra carpeta de instalación. Puedes cambiar la ruta si quieres tener los datos en otra carpeta. Hacemos clic en siguiente.
120 |
121 | 
122 |
123 | Ingresamos la contraseña del usuario administrador. De manera predeterminada, Postgres crea un usuario super administrador llamado **postgres** que tiene todos los permisos y acceso a toda la base de datos, tanto para consultarla como para modificarla. En éste paso indicamos la clave de ese usuario super administrador.
124 |
125 | Debes ingresar una clave muy segura y guardarla porque la vas a necesitar después. Luego hacemos clic en siguiente.
126 |
127 | 
128 |
129 | Ahora si queremos cambiar el puerto por donde el servicio de Postgresql estará escuchando peticiones, podemos hacerlo en la siguiente pantalla, si queremos dejar el predeterminado simplemente hacemos clic en siguiente.
130 |
131 | 
132 |
133 | La configuración regional puede ser la predeterminada, no es necesario cambiarla, incluso si vamos a usarla en español, ya que las tildes y las eñes estarán soportadas si dejas la configuración regional predeterminada. Es útil cambiarla cuando quieras dejar de soportar otras funciones de idiomas y lenguajes diferentes a uno específico. Luego hacemos clic en siguiente:
134 |
135 | 
136 |
137 | En pantalla aparecerá el resumen de lo que se va a instalar:
138 |
139 | 
140 |
141 | Al hacer clic en siguiente se muestra una pantalla que indica que PostgreSQL está listo para instalar, al hacer clic de nuevo en siguiente iniciará la instalación, espera un par de minutos hasta que la aplicación termine.
142 |
143 | Una vez terminada la instalación, aparecerá en pantalla un mensaje mostrando que PostgreSQL ha sido instalado correctamente.
144 |
145 | 
146 |
147 | Podemos cerrar ésta pantalla y proceder a comprobar que todo quedó instalado correctamente.
148 |
149 | Vamos a buscar el programa PgAdmin, el cual usaremos como editor favorito para ejecutar en él todas las operaciones sobre nuestra base de datos.
150 |
151 | También vamos a buscar la consola… Tanto la consola como PgAdmin son útiles para gestionar nuestra base de datos, una nos permite ingresar comando por comandos y la otra nos ofrece una interfaz visual fácil de entender para realizar todas las operaciones.
152 |
153 | En el menú de Windows (o donde aparecen instalados todos los programas) buscamos “PgAdmin…”
154 |
155 | 
156 |
157 | Ahora buscamos “SQL Shell…”
158 |
159 | 
160 |
161 | Efectivamente, ahora aparecen las herramientas que vamos a utilizar en éste curso.
162 | Ahora vamos a crear una base de datos de prueba usando la consola y comprobaremos si existe usando PgAdmin, la crearemos para validar que la conexión con el servicio de base de datos interno funciona correctamente.
163 |
164 | Para ello abrimos la consola, buscamos SQL Shell y lo ejecutamos. Veremos algo así:
165 |
166 | 
167 |
168 | Lo que vemos en pantalla es la consola esperando que ingresemos cada parámetro para la conexión.
169 |
170 | Primero está el nombre del parámetro. En éste caso es “Server” seguido de unos corchetes que contienen el valor predeterminado. Si presionamos “Enter” sin digitar nada la consola asumirá que te refieres al valor predeterminado, si en éste caso presionamos “Enter” el valor asumido será “Localhost”. Localhost se refiere a nuestra propia máquina, si instalaste la base de datos en el mismo pc que estás usando para la consola, el valor correcto es Localhost o 27.0.0. (representan lo mismo).
171 |
172 | Podemos dejar todos los valores predeterminados (presionando “Enter”) hasta que la consola pregunte por la clave del usuario maestro:
173 |
174 | 
175 |
176 | Debemos ingresar la clave que usamos cuando estábamos instalando Postgres, de lo contrario no podremos acceder. Presionamos Enter y veremos a continuación una pantalla que nos indica que estamos logueados en la base de datos y estamos listos para hacer modificaciones.
177 |
178 | De manera predeterminada, la base de datos instalada es Postgres, la cual no debemos tocar, ya que ejecuta funciones propias del motor. Es usada por el Motor de PostgreSQL para interactuar con todas las bases de datos que vayamos a crear en el futuro.
179 |
180 | La siguiente imagen indica que estamos conectados a la base de datos Postgres. Vamos a crear una base de datos nueva y luego saltar el cursor a ésta base de datos recién creada.
181 |
182 | 
183 |
184 | Para ello escribimos el comando “**CREATE DATABASE transporte_publico;**” y presionamos “Enter”. Veremos:
185 |
186 | 
187 |
188 | El mensaje **“CREATE DATABASE”** justo después de la línea que acabamos de escribir indica que la base de datos fue creada correctamente.
189 |
190 | Para saltar a la base de datos recién creada ejecutamos el comando “**\c transporte_publico**”, el cursor mostrará lo siguiente:
191 |
192 | 
193 |
194 | Ahora vamos a validar desde PgAdmin que la base de datos fué creada correctamente. Abrimos PgAdmin y nos encontramos con una lista de items a la izquierda, lo que significa que de manera predeterminada PgAdmin ha creado un acceso a nuestra base de datos local, el cual llamó “PostgreSQL”:
195 |
196 | 
197 |
198 | Al hacer hacer doble clic sobre éste elemento (“PostgreSQL”) nos pedirá ingresar la clave que hemos determinado para el super usuario postgres, al igual que la consola, hasta no ingresarla correctamente no nos podremos conectar:
199 |
200 | 
201 |
202 | Ingresamos la clave. Te recomiendo seleccionar la opción “Save Password” o “Guardar Contraseña”. Si la máquina sobre la que estás trabajando es de confianza, que seas sólo tú o tu equipo quien tenga acceso a ella, de lo contrario, no guardes la contraseña para mantenerla segura.
203 |
204 | Veremos la lista de bases de datos disponibles, la predeterminada “postgres” y la que acabamos de crear usando la consola, lo que comprueba que la base de datos y la consola funcionan correctamente.
205 |
206 | 
207 |
208 | Ahora procedemos a eliminar la base de datos recién creada para comprobar que PgAdmin está correctamente configurada y si pueda realizar cambios sobre la base de datos.
209 |
210 | Para ello hacemos clic derecho sobre el elemento “transporte_publico” y seleccionamos la opción “Delete/Drop”. Al mensaje de confirmar hacemos clic en OK.
211 |
212 | Con ello, si el elemento “transporte_publico” desaparece del menú de la izquierda comprobamos que PgAdmin funcionan correctamente.
213 |
214 | ### Clase 4 Interacción con Postgres desde la Consola
215 |
216 | Vamos a aprender los comandos mas útiles en la shell, al iniciar siempre encontramos los siguientes puntos
217 |
218 | Server [localhost]: valor predeterminado o del server al que queremos conectarnos
219 |
220 | Database [postgres]: Escribe aquí la base de datos a la que quieres ingresar o enter para la predeterminada
221 |
222 | Port [5432]: Idem conceptos anteriores
223 |
224 | Username [postgres]: Idem conceptos anteriores
225 |
226 | Contraseña para usuario postgres:
227 |
228 | #### Comandos importantes PostgreSQL
229 |
230 | - **\l**: lista las bases de datos del sistema (siempre va a haber por default 3 bases de datos propias de postgre + las que agreguemos).
231 |
232 | - **\dt**" muestra las tablas de la base de datos de postgresql
233 |
234 | - **\c + nombre base de datos**: usar una base de datos
235 |
236 | - **\d + nombre tabla consultar**: describe el contenido de una tabla especifica.
237 |
238 | - **\h SELECT**: ayuda para funciones estándar SQL.
239 |
240 | - **SELECT version();**: ver la version de PostgreSQL
241 |
242 | - **\g** permite volver a ejecutar la funcion previa ejecutada en consola (repetir lo anterior).
243 |
244 | - **\timing**: muestra el tiempo de ejecución de un comando, algo muy importante para las optimizaciones.
245 |
246 | ### Clase 5 PgAdmin: Interaccion con Postgres desde la Interfaz Grafica
247 |
248 | Esta clase retoma los comandos anteriores del shell ahora con la interfaz grafica.
249 |
250 | Para conectarnos tenemos el item PostgreSQL( ), a diferencia de la shell PGAdmin permite hacer cosas custom como colores y tags.
251 |
252 | Creamos una base de datos propia usando la parte de server del arbol del admin.
253 |
254 | En el dashboard podemos observar como Postgres usa el mismo motor de forma redundante para hacerse consultas a si mismo y saber que esta pasando en el entorno de ejecución para esta base de datos.
255 |
256 | En la parte del Admin en Server podemos crear una base de datos desde cero a partir del servidor y conectarla al localhost o a una base de datos alojada en un server local o remoto.
257 |
258 | 
259 |
260 | 
261 |
262 | 
263 |
264 | 
265 |
266 | Podemos usar en el menu de tools el Query tools
267 |
268 | 
269 |
270 | 
271 |
272 | ### Clase 6 Archivos de Configuracion
273 |
274 | Antes de crear tablas o hacer diseños es importante conocer 3 archivos de configuracion que muchas veces son el origen de los problemas cuando estamos agregando nuevos servicios o configurando la base de datos
275 |
276 | Los archivos de configuración son tres principales:
277 |
278 | - **postgreql.conf**: en este archivo podemos cambiar puerto, numero de conexiones maxima, accesos para ip únicas. (un pro en bases de datos siempre ha leído todo el documento). En este archivo también se encuentra la información de las replicas
279 |
280 | - **pg.hba.conf**: contiene los roles, tipos de usuarios, permisos, direcciones, métodos de acceso con MD5, también puedo negar a otros hosts a conectarnos,este archivo es muy importante dado que nos permite no solo dar acceso a usuarios y a las replicas sino protegernos de ataques o personas mal intencionados
281 |
282 | - **pg_ident.conf**
283 |
284 | La ruta de los mismos depende del sistema Operativo, para saber que que ruta están, basta con hacer una Query
285 |
286 | **SHOW config_file**;
287 |
288 | NOTA: siempre es bueno hacer una copia original de los archivos antes de modificarlos por si movemos algo que no.
289 |
290 | ### Clase 7 Comandos mas utilizados en PostgreSQL
291 |
292 | La consola en PostgreSQL es una herramienta muy potente para crear, administrar y depurar nuestra base de datos. podemos acceder a ella después de instalar PostgreSQL y haber seleccionado la opción de instalar la consola junto a la base de datos.
293 |
294 | PostgreSQL está más estrechamente acoplado al entorno UNIX que algunos otros sistemas de bases de datos, utiliza las cuentas de usuario nativas para determinar quién se conecta a ella (de forma predeterminada). El programa que se ejecuta en la consola y que permite ejecutar consultas y comandos se llama psql, psql es la terminal interactiva para trabajar con PostgreSQL, es la interfaz de línea de comando o consola principal, así como PgAdmin es la interfaz gráfica de usuario principal de PostgreSQL.
295 |
296 | Después de emitir un comando PostgreSQL, recibirás comentarios del servidor indicándote el resultado de un comando o mostrándote los resultados de una solicitud de información. Por ejemplo, si deseas saber qué versión de PostgreSQL estás usando actualmente, puedes hacer lo siguiente:
297 |
298 | ```sql
299 | SELECT version()
300 |
301 | ```
302 |
303 | #### Comandos de ayuda
304 |
305 | En consola los dos principales comandos con los que podemos revisar el todos los comandos y consultas son:
306 |
307 | **\?** Con el cual podemos ver la lista de todos los comandos disponibles en consola, comandos que empiezan con backslash()
308 |
309 | 
310 |
311 | **\h** Con este comando veremos la información de todas las consultas SQL disponibles en consola. Sirve también para buscar ayuda sobre una consulta específica, para buscar información sobre una consulta específica basta con escribir \h seguido del inicio de la consulta de la que se requiera ayuda, así: \h ALTER
312 |
313 | De esta forma podemos ver toda la ayuda con respecto a la consulta ALTER
314 |
315 | 
316 |
317 | #### Comandos de navegacion y consulta de informacion
318 |
319 | **\c** Saltar entre bases de datos
320 |
321 | **\l** Listar base de datos disponibles
322 |
323 | **\dt** Listar las tablas de la base de datos
324 |
325 | **\d ** Describir una tabla
326 |
327 | **\dn** Listar los esquemas de la base de datos actual
328 |
329 | **\df** Listar las funciones disponibles de la base de datos actual
330 |
331 | **\dv** Listar las vistas de la base de datos actual
332 |
333 | **\du** Listar los usuarios y sus roles de la base de datos actual
334 |
335 | #### Comandos de inspeccion y ejecucion
336 |
337 | **\g** Volver a ejecutar el comando ejecutando justo antes
338 |
339 | **\s** Ver el historial de comandos ejecutados
340 |
341 | **\s ** Si se quiere guardar la lista de comandos ejecutados en un archivo de texto plano
342 |
343 | **\i ** Ejecutar los comandos desde un archivo
344 |
345 | **\e** Permite abrir un editor de texto plano, escribir comandos y ejecutar en lote. \e abre el editor de texto, escribir allí todos los comandos, luego guardar los cambios y cerrar, al cerrar se ejecutarán todos los comandos guardados.
346 |
347 | **\ef** Equivalente al comando anterior pero permite editar también funciones en PostgreSQL\
348 |
349 | #### Comandos para debug y optimizacion
350 |
351 | **\timing** Activar / Desactivar el contador de tiempo por consulta
352 |
353 | #### Comandos para cerrar la consola
354 |
355 | **\q** Cerrar la consola
356 |
357 | #### Ejecutando consultas en la base de datos usando la consola
358 |
359 | De manera predeterminada PostgreSQL no crea bases de datos para usar, debemos crear nuestra base de datos para empezar a trabajar, verás que existe ya una base de datos llamada **postgres** pero no debe ser usada ya que hace parte del CORE de PostgreSQL y sirve para gestionar las demás bases de datos.
360 |
361 | Para crear una base de datos debes ejecutar la consulta de creación de base de datos, es importante entender que existe una costumbre no oficial al momento de escribir consultas; consiste en poner en mayúsculas todas las palabras propias del lenguaje SQL cómo **CREATE**, **SELECT**, **ALTER**, etc y el resto de palabras como los nombres de las tablas, columnas, nombres de usuarios, etc en minúscula. No está claro el porqué de esta especie de “estándar” al escribir consultas SQL pero todo apunta a que en el momento que SQL nace, no existían editores de consultas que resaltaran las palabras propias del lenguaje para diferenciar fácilmente de las palabras que no son parte del lenguaje, por eso el uso de mayúsculas y minúsculas.
362 |
363 | Las palabras reservadas de consultas SQL usualmente se escriben en mayúscula, ésto para distinguir entre nombres de objetos y lenguaje SQL propio, no es obligatorio, pero podría serte útil en la creación de Scripts SQL largos.
364 |
365 | Vamos ahora por un ligero ejemplo desde la creación de una base de datos, la creación de una tabla, la inserción, borrado, consulta y alteración de datos de la tabla.
366 |
367 | Primero crea la base de datos, **“CREATE DATABASE transporte;”** sería el primer paso.
368 |
369 | 
370 |
371 | Ahora saltar de la base de datos **postgres** que ha sido seleccionada de manera predeterminada a la base de datos transporte recién creada utilizando el comando \c transporte.
372 |
373 | 
374 |
375 | Ahora vamos a crear la tabla tren, el SQL correspondiente sería:
376 |
377 | ```sql
378 | CREATE TABLE tren ( id serial NOT NULL, modelo character varying, capacidad integer, CONSTRAINT tren_pkey PRIMARY KEY (id) );
379 | ```
380 |
381 | La columna id será un número autoincremental (cada vez que se inserta un registro se aumenta en uno), modelo se refiere a una referencia al tren, capacidad sería la cantidad de pasajeros que puede transportar y al final agregamos la llave primaria que será id.
382 |
383 | 
384 |
385 | Ahora que la tabla ha sido creada, podemos ver su definición utilizando el comando `\d tren`
386 |
387 | 
388 |
389 | PostgreSQL ha creado el campo id automáticamente cómo integer con una asociación predeterminada a una secuencia llamada ‘tren_id_seq’. De manera que cada vez que se inserte un valor, id tomará el siguiente valor de la secuencia, vamos a ver la definición de la secuencia. Para ello, \d `tren_id_seq` es suficiente:
390 |
391 | 
392 |
393 | Vemos que la secuencia inicia en uno, así que nuestra primera inserción de datos dejará a la
394 | columna id con valor uno.
395 |
396 | ```sql
397 | INSERT INTO tren( modelo, capacidad ) VALUES (‘Volvo ’, 00);
398 | ```
399 |
400 | 
401 |
402 | ```sql
403 | SELECT * FROM tren;
404 | ```
405 |
406 | Consultamos ahora los datos en la tabla:
407 |
408 | 
409 |
410 | Vamos a modificar el valor, establecer el tren con id uno que sea modelo Honda 0726. Para ello ejecutamos la consulta tipo **UPDATE tren SET modelo = 'Honda 0726' Where id = 1**;
411 |
412 | 
413 |
414 | Verificamos la modificación **SELECT * FROM tren;**
415 |
416 | 
417 |
418 | Ahora borramos la fila: **DELETE FROM tren WHERE id = ;**
419 |
420 | 
421 |
422 | Verificamos el borrado **SELECT * FROM tren;**
423 |
424 | 
425 |
426 | El borrado ha funcionado tenemos 0 rows, es decir, no hay filas. Ahora activemos la herramienta que nos permite medir el tiempo que tarda una consulta **\timing**
427 |
428 | 
429 |
430 | Probemos cómo funciona al medición realizando la encriptación de un texto cualquiera usando el algoritmo md5:
431 |
432 | 
433 |
434 | La consulta tardó 0.0mili-segundos
435 |
436 | Ahora que sabes como manejar algunos de los comandos más utilizados en PostgreSQL es momento de comenzar a practicar!!!
437 |
438 | ### Clase 8 Presentación del Proyecto
439 |
440 | El proyecto consiste en el modelado de un sistema de transporte de personas mediante trenes.
441 |
442 | Reto
443 |
444 | - Pasajero
445 | - Trayecto
446 | - Estación
447 | - Tren
448 | - Viaje
449 |
450 | ### Clase 9 Tipos de Datos
451 |
452 | PostgreSQL soporta los siguientes tipos de datos
453 |
454 | Principales y comunes en SQL:
455 |
456 | - Numéricos(Números enteros, Números Decimales, Seriales)
457 | - Monetarios(cantidad de moneda)
458 | - Texto(almacenar cadenas y texto, existen tres VARCHAR, CHAR, TEXT)
459 | - Binario(1 Y 0)
460 | - Fecha/Hora(Para almacenar Fechas y/o Horas, DATE TYPE, TIME TYPE, TIMESTAMP, INTERVAL)
461 | - Boolean(Verdadero o Falso)
462 |
463 | Especiales propios de postgres
464 |
465 | - Geométricos: Permiten calcular distancias y áreas usando dos valores X y Y.
466 | - Direcciones de Red: Cálculos de máscara de red
467 | - Texto tipo bit: Cálculos en otros sistemas, ejm(hexadecimal, binario)
468 | XML, JSON: Postgres no permite guardar en estos formatos
469 | - Arreglos: Vectores y Matrices
470 |
471 | ### Clase 10 Diseñando nuestra base de datos: estructura de las tablas
472 |
473 | 
474 |
475 | ### Clase 11 Jerarquia de Bases de Datos
476 |
477 | Toda jerarquía de base de datos se basa en los siguientes elementos:
478 |
479 | - **Servidor de base de datos:** Computador que tiene un motor de base de datos instalado y en ejecución.
480 |
481 | - **Motor de base de datos:** Software que provee un conjunto de servicios encargados de administrar una base de datos.
482 |
483 | - **Base de datos:** Grupo de datos que pertenecen a un mismo contexto.
484 |
485 | - **Esquemas de base de datos en PostgreSQL:** Grupo de objetos de base de datos que guarda relación entre sí (tablas, funciones, relaciones, secuencias).
486 |
487 | - **Tablas de base de datos:** Estructura que organiza los datos en filas y columnas formando una matriz.
488 |
489 | **PostgreSQL es un motor de base de datos**.
490 |
491 | La estructura de la base de datos diseñada para el reto corresponde a los siguientes
492 | elementos:
493 |
494 | 
495 |
496 | La base de datos se llama transporte, usaremos su esquema predeterminado public.
497 |
498 | El esquema public contiene las siguientes tablas:
499 |
500 | - Estación
501 | - Pasajero
502 | - Tren
503 |
504 | Y las tablas de relaciones entre cada uno de los elementos anteriores son:
505 |
506 | - Trayecto
507 | - Viaje
508 |
509 | El esquema relacional entre las tablas corresponde al siguiente diagrama:
510 |
511 | 
512 |
513 | **Estación**
514 | Contiene la información de las estaciones de nuestro sistema, incluye datos de nombre con tipo de dato texto y dirección con tipo de dato texto, junto con un número de identificación único por estación.
515 |
516 | **Tren**
517 | Almacena la información de los trenes de nuestro sistema, cada tren tiene un modelo con tipo de dato texto y una capacidad con tipo de dato numérico que representa la cantidad de personas que puede llevar ese tren, también tiene un ID único por tren.
518 |
519 | **Trayecto**
520 | Relaciona los trenes con las estaciones, simula ser las rutas que cada uno de los trenes pueden desarrollar entre las estaciones
521 |
522 | **Pasajero**
523 | Es la tabla que contiene la información de las personas que viajan en nuestro sistema de transporte masivo, sus columnas son nombre tipo de dato texto con el nombre completo de la persona, dirección_residencia con tipo de dato texto que indica dónde vive la persona, fecha_nacimiento tipo de dato texto y un ID único tipo de dato numérico para identificar a cada persona.
524 |
525 | **Viaje**
526 | Relaciona Trayecto con Pasajero ilustrando la dinámica entre los viajes que realizan las personas, los cuales parten de una estación y se hacen usando un tren.
527 |
528 | ## Modulo 2 Gestión de la información en bases de datos
529 |
530 | ### Clase 12 Creación de Tablas
531 |
532 | Las tablas en PostgreSQL siguen el estándar SQL para las tablas
533 |
534 | - CREATE
535 | - ALTER
536 | - DROP
537 |
538 | **Creación una base de datos en pgAdmin**.
539 |
540 | En el arbol del server damos click derecho en nuestra BD_PRUEBAS/databases en la opcion CREATE y asignamos un nombre.
541 |
542 | 
543 |
544 | PGAdmin también nos muestra la sentencia que ejecutara por debajo en consola.
545 |
546 | 
547 |
548 | Se crea todo el arbol relacionado a la base de datos, dentro de este se encuentran los Schemas, de manera predeterminada se crea el Schema public en el vamos a crear nuestra primera tabla
549 |
550 | 
551 |
552 | Le asignamos el nombre de pasajero (aunque como practica común las tablas se nombren en plural)
553 |
554 | 
555 |
556 | Y creamos las columnas definidas en nuestro diagrama entidad-relacion
557 |
558 | 
559 |
560 | Nota:
561 |
562 | **Serial** es un tipo de dato de postgreSQL y corresponde a un tipo de dato Integer Autoincremental.
563 |
564 | **Character Varying** es un tipo de dato similar a Varchar en otros manejadores, si no estamos seguros de la longitud podemos dejar el area vacía.
565 |
566 | **Date** Corresponde a fechas.
567 |
568 | Ahora definimos los constraints para definir nuestra llave primaria, el **estándar de postgres** es **nombre_de_la_tabla_pkey**
569 |
570 | 
571 |
572 | Al final podemos ver la sentencia SQL y guardamos nuestra tabla.
573 |
574 | 
575 |
576 | Con ello creamos la tabla pasajero, ahora usaremos PGAdmin para crear el script de inserción dando click derecho a la tabla y seleccionando insert, esto crear el script automáticamente para (INSERT INTO de SQL) agregar los datos.
577 |
578 | 
579 |
580 | 
581 |
582 | Borramos **id** por ser autoincremental
583 |
584 | Para obtener la fecha actual escribimos y saber en que formato insertar los datos
585 |
586 | ```sql
587 | SELECT current_date;
588 | ```
589 |
590 | Insertamos el registro seleccionado solo el query a realizar y usamos el boten de play o F5.
591 |
592 | 
593 |
594 | Podemos verificar que los datos yendo a los query tools y hacemos la consulta de la tabla.
595 |
596 | **Reto:** crear las tablas faltantes del diagrama entidad-relacion.
597 |
598 | Aquí los scripts del reto
599 |
600 | ```sql
601 | -- Crear tabla tren
602 | CREATE TABLE public.tren
603 | (
604 | id serial,
605 | modelo character varying(20),
606 | capacidad character varying,
607 | CONSTRAINT tren_pkey PRIMARY KEY (id)
608 | )
609 | WITH (
610 | OIDS = FALSE
611 | );
612 |
613 | ALTER TABLE public.tren
614 | OWNER to postgres;
615 |
616 |
617 | -- Crear tabla estacion
618 | CREATE TABLE public.estacion
619 | (
620 | id serial,
621 | nombre character varying,
622 | direccion character varying,
623 | CONSTRAINT estacion_pkey PRIMARY KEY (id)
624 | )
625 | WITH (
626 | OIDS = FALSE
627 | );
628 |
629 | ALTER TABLE public.estacion
630 | OWNER to postgres;
631 |
632 | -- Crear tabla trayecto
633 | CREATE TABLE public.trayecto
634 | (
635 | id serial,
636 | id_estacion integer,
637 | id_tren integer,
638 | nombre character varying,
639 | CONSTRAINT trayecto_pkey PRIMARY KEY (id)
640 | )
641 | WITH (
642 | OIDS = FALSE
643 | );
644 |
645 | -- Crear tabla trayecto
646 | ALTER TABLE public.trayecto
647 | OWNER to postgres;
648 |
649 | CREATE TABLE public.viaje
650 | (
651 | id serial,
652 | id_pasajero integer,
653 | id_trayecto integer,
654 | inicio date,
655 | fin date,
656 | CONSTRAINT viaje_pkey PRIMARY KEY (id)
657 | )
658 | WITH (
659 | OIDS = FALSE
660 | );
661 |
662 | ALTER TABLE public.viaje
663 | OWNER to postgres;
664 | ```
665 |
666 | ### clase 13 Particiones
667 |
668 | En ocasiones llega un punto en elq ue tienes mucha informacion en una sola tabla, y al momento de consultarla la base de datos tendrá que hacer el recorrido de toda la informacion para encontrar el contenido que estas buscando.
669 |
670 | Imagina que nuestra tabla de viajes tiene cien mil registros, y que quieres consultar los viajes realizados en un rango de fechas, esa consulta ocupara un espacio en memoria que deberá ser leída para obtener la respuesta, en este punto entran las particiones.
671 |
672 | Las particiones tiene como ventaja lo siguiente:
673 |
674 | - Separación física de datos
675 | - Conservan la Estructura Lógica
676 |
677 | La separacion física hace referencia a que es posible guardar varias parte de la misma tabla en diferentes espacios de disco o incluso en otros discos, internamente Postgre usando el mismo nombre de la tabla asigna otras pequeñas tablas que tienen un rango definido, en nuestro caso le diríamos que el rango son las fechas o las horas, por ejemplo una partición para junio, otra para julio y al hacer la consulta con el mismo **SELECT** de siempre Postgre buscaría la informacion solo en la partición correspondiente, esto reduce el tiempo de ejecucion de la consulta y a su vez evita que la tabla se bloquee al ser consultada o escrita demasiadas veces en periodos de tiempo cortos.
678 |
679 | En esta clase vamos a crear una tabla, asignarle particiones y después hacer un **INSERT** común y corriente y hacer una consulta común y corriente con pgAdmin.
680 |
681 | Creamos la tabla bitacora_viaje con toda la informacion de los viajes tendra los campos id, id_viaje, fecha, fecha sera el campo por el cual vamos a particionar la tabla.
682 |
683 | 
684 |
685 | **Como lo hacemos?**
686 |
687 | Primero indicamos a la tabla que haremos la partición y luego por cual campo seria, para después agregar cada una de las particiones por separado para ello iremos al apartado **Partition**.
688 |
689 | Dejamos constraints vacío, y en General indicamos que es una tabla particionada.
690 |
691 | 
692 |
693 | Con ello nos pide una llave para hacer la partición, la asignamos en la tabla partitions
694 |
695 | 
696 |
697 | 
698 |
699 | Creamos un **INSERT** para dicha tabla.
700 |
701 | 
702 |
703 | Observamos el error al no existir ninguna partición, ahora hay que crearla, esto lo hacemos creando una nueva tabla
704 |
705 | ```sql
706 | CREATE TABLE bitacora_viaje_200_0 PARTITION OF bitacora_viaje
707 | FOR VALUES FROM ('200-0-0') TO ('209-0-3')
708 | ```
709 |
710 | Creamos la tabla de partición para 200 del mes de enero ahora todos los **INSERT** correspondientes a ese rango de tiempo se guardaran en esa tabla.
711 |
712 | 
713 |
714 | Ejecutamos el INSERT con un rango de la partición.
715 |
716 | 
717 |
718 | Pero en contraste de que si queremos insertar datos fuera de ese rango de tiempo la operación nos arrojara un error como al principio, por lo tanto tendremos que crear una nueva partición.
719 |
720 | Observa que las particiones si existen físicamente.
721 |
722 | 
723 |
724 | Nota final, no es posible crear llaves primarias en tablas particionadas ya que la informacion esta toda dividas, no te preocupes estas tablas se utilizan para guardar informacion en masa como bitácoras y hacen referencia a tablas que si tienen estas llaves primarias (miralo como un pivot table)
725 |
726 | Si vas a crear un proyecto donde tengas informacion histórica es buena practica iniciarla como una tabla particionada para mejorar el performance de nuestra aplicación
727 |
728 | En mi ejemplo use un rango de 9 años de 200 a 209, pero si la data es enorme podemos hacer particiones en unidades de meses, semanas o dias.
729 |
730 | Una vez aprendido este concepto borramos la tabla, ya que no es necesaria para el proyecto.
731 |
732 | ### Clase 14 Creacion de Roles
733 |
734 | Hemos creado la tablas, ahora debemos mirar los roles, estos igual que las tablas tienen la capacidad de ser creados y eliminados, sin embargo tiene las siguientes caracteristicas especiales.
735 |
736 | - Crear y eliminar otros roles
737 | - Asignar atributos
738 | - Agrupar con otros roles (conjunto global de permisos)
739 | - Roles predeterminados
740 | - Son independientes de las bases de datos
741 |
742 | Hasta ahora hemos estado utilizando el usuario predeterminado de postgres, lo cual sabemos que es muy peligroso ya que al ser un usuario de tipo root este tiene todos los privilegios para borrar todo, lo ideal es crear un usuario para trabajar con los roles y permisos adecuados.
743 |
744 | #### Creando roles desde SQL Shell
745 |
746 | Crearemos un rol con la terminal que tenga la capacidad de hacer login
747 |
748 | ```sql
749 | \H CREATE ROLE
750 |
751 | CREATE ROLE nombre [ [ WITH ] opción [ ... ] ]
752 |
753 | donde opción puede ser:
754 |
755 | SUPERUSER | NOSUPERUSER
756 | | CREATEDB | NOCREATEDB
757 | | CREATEROLE | NOCREATEROLE
758 | | INHERIT | NOINHERIT
759 | | LOGIN | NOLOGIN
760 | | REPLICATION | NOREPLICATION
761 | | BYPASSRLS | NOBYPASSRLS
762 | | CONNECTION LIMIT limite_conexiones
763 | | [ ENCRYPTED ] PASSWORD 'contraseña' | PASSWORD NULL
764 | | VALID UNTIL 'fecha_hora'
765 | | IN ROLE nombre_de_rol [, ...]
766 | | IN GROUP nombre_de_rol [, ...]
767 | | ROLE nombre_de_rol [, ...]
768 | | ADMIN nombre_de_rol [, ...]
769 | | USER nombre_de_rol [, ...]
770 | | SYSID uid
771 | ```
772 |
773 | CREATE USER es un alias de CREATE ROLE
774 |
775 | ```sql
776 | postgres=# CREATE ROLE usuario_consulta;
777 | CREATE ROLE
778 | postgres=# \dg
779 | Lista de roles
780 | Nombre de rol | Atributos | Miembro de
781 | ------------------+------------------------------------------------------------+------------
782 | postgres| Superusuario, Crear rol, Crear BD, Replicacion, Ignora RLS | {}
783 | usuario_consulta | No puede conectarse | {}
784 |
785 |
786 | postgres=#
787 | ```
788 |
789 | En este punto hemos creado un nuevo usuario/role, pero este no tiene atributos/permisos para realizar ninguna acción, solucionamos esto igual que una tabla con el comando ALTER.
790 |
791 | ```sql
792 | postgres=# ALTER ROLE usuario_consulta WITH LOGIN;
793 | ALTER ROLE
794 |
795 |
796 | postgres=# \dg
797 | Lista de roles
798 | Nombre de rol | Atributos | Miembro de
799 | ------------------+------------------------------------------------------------+------------
800 | postgres| Superusuario, Crear rol, Crear BD, Replicacion, Ignora RLS | {}
801 | usuario_consulta | | {}
802 |
803 | ```
804 |
805 | Observamos ahora que desaparece la leyenda de que el usuario no puede conectarse, ahora realizamos la misma operación para darle los atributos de un superusuario.
806 |
807 | ```SQL
808 | postgres=# ALTER ROLE usuario_consulta SUPERUSER;
809 | ALTER ROLE
810 | postgres=# \dg
811 | Lista de roles
812 | Nombre de rol | Atributos | Miembro de
813 | ------------------+------------------------------------------------------------+------------
814 | postgres| Superusuario, Crear rol, Crear BD, Replicacion, Ignora RLS | {}
815 | usuario_consulta | Superusuario | {}
816 | ```
817 |
818 | Ahora asignamos la contraseña a la base de datos.
819 |
820 | ```sql
821 | postgres=# ALTER ROLE usuario_consulta WITH PASSWORD 'etc23';
822 | ```
823 |
824 | Ahora ya nos podemos cambiar nuestro rol accediendo con otra consola accediendo con el usuario_consulta
825 |
826 | ```sql
827 | Server [localhost]:
828 | Database [postgres]:
829 | Port [5432]:
830 | Username [postgres]: usuario_consulta
831 | Contraseña para usuario usuario_consulta:
832 | psql ( .9)
833 | ADVERTENCIA: El código de página de la consola (850) difiere del código
834 | de página de Windows (252).
835 | Los caracteres de 8 bits pueden funcionar incorrectamente.
836 | Vea la página de referencia de psql «Notes for Windows users»
837 | para obtener más detalles.
838 | Digite «help» para obtener ayuda.
839 | postgres=#
840 | ```
841 |
842 | Ahora hacemos la operación de borrado desde otro perfil de superusuario en este caso el default postgres
843 |
844 | ```sql
845 | postgres=# DROP ROLE usuario_consulta;
846 | DROP ROLE
847 | postgres=# \dg
848 | Lista de roles
849 | Nombre de rol | Atributos | Miembro de
850 | ---------------+------------------------------------------------------------+------------
851 | postgres | Superusuario, Crear rol, Crear BD, Replicacion, Ignora RLS | {}
852 |
853 | postgres=#
854 |
855 | ```
856 |
857 | #### Creando roles desde PGAdmin
858 |
859 | 
860 |
861 | 
862 |
863 | Asignamos un password
864 |
865 | 
866 |
867 | Asignamos permisos para solo lectura
868 |
869 | 
870 |
871 | 
872 |
873 | Ahora vamos a darle permisos a nuestras tablas para que el usuario_consulta pueda tener acceso a interactuar informacion y consultarla, este no podrá acceder a la estructura de la misma ni borrar informacion
874 |
875 | 
876 |
877 | 
878 |
879 | Damos click en next y seleccionamos los permisos que se otorgaran en este caso insert, select y update
880 |
881 | 
882 |
883 | 
884 |
885 | Verificamos que en las otras tablas.
886 |
887 | 
888 |
889 | ### Clase 15 Llaves foraneas
890 |
891 | Ya tenemos las tablas con sus llaves primarias, hemos creado los roles, ahora tenemos que crear las llaves foraneas estas hacen referencia a la informacion que existe entre las tablas y corresponde con nuestro ACID estándar en la parte de consistencia , es decir que todas las tablas corresponden entre si y la informacion es congruente.
892 |
893 | Para ello tenemos que entender que las llaves foraneas siguen una estructura muy básica:
894 |
895 | - Tabla de origen
896 | - Tabla destino
897 | - Acciones en caso de modificación en la tabla de origen
898 |
899 | Vamos a definir la primer relacion con el trayecto y sus relaciones con las otras tablas, vemos en los constraints donde nos indica cual valor es una llave primaria y asegura que ese valor sea único, y a continuación damos click en Foreign Key para definir las relaciones con las otras tablas.
900 |
901 | 
902 |
903 | Damos click en el símbolo de + para que acepte los cambios, la pestaña de Action es la mas importante ya que se indica que acciones se llevaran a cabo cuando ocurra un cambio en la tabla principal.
904 |
905 | 
906 |
907 | 
908 |
909 | A continuación creamos la relacion de trayecto con tren usando el Query Tool
910 |
911 | ```sql
912 | ALTER TABLE trayecto ADD CONSTRAINT trayecto_tren_fk FOREIGN KEY (id_tren)
913 | REFERENCES public.tren (id) MATCH SIMPLE
914 | ON UPDATE CASCADE
915 | ON DELETE CASCADE
916 | ```
917 |
918 | 
919 |
920 | Aplicaremos lo mismo con la tabla de viaje
921 |
922 | 
923 |
924 | 
925 |
926 | 
927 |
928 | ```sql
929 | ALTER TABLE public.viaje
930 | ADD CONSTRAINT viaje_trayecto_fkey FOREIGN KEY (id_trayecto)
931 | REFERENCES public.trayecto (id) MATCH SIMPLE
932 | ON UPDATE CASCADE
933 | ON DELETE CASCADE
934 |
935 | ```
936 |
937 | 
938 |
939 | Comprobamos que los cambios se hayan realizado en la tabla.
940 |
941 | 
942 |
943 | ### Clase 16 Insercion y consulta de datos
944 |
945 | Vamos a insertar datos en la tabla estacion, para ello damos de nuevo click derecho en la tabla deseada, vamos al menu Scripts y después al apartado INSERT Script
946 |
947 | 
948 |
949 | Creamos dos INSERT
950 |
951 | 
952 |
953 | 
954 |
955 | ```sql
956 | INSERT INTO public.estacion(
957 | nombre, direccion)
958 | VALUES ('Estacion Centro', 'St #2');
959 | ```
960 |
961 | ```sql
962 | INSERT INTO public.estacion(
963 | nombre, direccion)
964 | VALUES ('Estacion Norte', 'St 00#2');
965 | ```
966 |
967 | Y verificamos que se hayan insertado los datos
968 |
969 | 
970 |
971 | Insertamos la informacion de la tabla de trenes
972 |
973 | 
974 |
975 | A continuación viene la parte interesante que es relacionar la informacion de las tablas tren y estacion en la tabla trayecto.
976 |
977 | 
978 |
979 | En caso de querer agregar un tren o una estacion que no existe PGAdmin/la consola no informara acerca del tipo de error
980 |
981 | 
982 |
983 | Finalmente borramos la informacion de la tabla tren para el primer id
984 |
985 | 
986 |
987 | Ahora veamos el efecto en la tabla de trayectos
988 |
989 | 
990 |
991 | Observamos que se elimino la informacion (por la acción CASCADE) del trayecto ya que se elimino el id (llave primaria) del tren, ahora una peculiaridad es que si creamos otro tren sin definir explícitamente el valor del id tendremos un tren id 2, y el id del trayecto también cambiara.
992 |
993 | 
994 |
995 | 
996 |
997 | 
998 |
999 | 
1000 |
1001 | Ahora que pasa si cambiamos el ID del tren? Eso lo logramos con el comando UPDATE o UPDATE Script de PGAdmin
1002 |
1003 | 
1004 |
1005 | 
1006 |
1007 | ### Clase 17 Insercion masiva de datos
1008 |
1009 | Para esta clase usaremos el servicios para generar datos y después hacer las consultas y los temas avanzados de este curso.
1010 |
1011 | El servicio es intuitivo, por lo que deben quedar los campos de la siguiente manera.
1012 |
1013 | 
1014 |
1015 | Hacemos click en el botón download y descargamos el script SQL, lo abrimos en nuestro editor de texto, copiamos y pegamos en el Script insert de estacion.
1016 |
1017 | pero antes reiniciamos limpiamos las tablas
1018 |
1019 | ```sql
1020 | TRUNCATE estacion CASCADE;
1021 | TRUNCATE tren CASCADE;
1022 | TRUNCATE trayecto CASCADE;
1023 | TRUNCATE pasajero CASCADE;
1024 | TRUNCATE viaje CASCADE;
1025 | ```
1026 |
1027 | y reiniciamos el serial el serial de las tablas
1028 |
1029 | ```sql
1030 | TRUNCATE TABLE tren, trayecto, viaje, estacion, pasajero RESTART IDENTITY;
1031 | ```
1032 |
1033 | 
1034 |
1035 | Ahora hacemos lo mismo para la tabla de trenes.
1036 |
1037 | 
1038 |
1039 | 
1040 |
1041 | 
1042 |
1043 | 
1044 |
1045 | Creamos la data para trayecto y para viaje
1046 |
1047 | 
1048 |
1049 | 
1050 |
1051 | ## Modulo 3 Generar consultas avanzadas
1052 |
1053 | ### Clase 18 Cruzar tablas: SQL JOIN
1054 |
1055 | Ya tenemos informacion en nuestra base de datos, ahora podemos implementar joins para unir las tablas y extraer informacion de valor, recordemos que los joins implementan toda la teoría de conjuntos, si vienes de un background con python los joins son iguales a los sets.
1056 |
1057 | Los siguientes son los tipos de joins
1058 |
1059 | - JOIN(INNER)
1060 | - LEFT(OUTER)
1061 | - RIGHT(OUTER)
1062 | - FULL OUTER
1063 |
1064 | 
1065 |
1066 | lectura recomendada
1067 |
1068 | Consultas de la clase
1069 |
1070 | ```sql
1071 | -- Inner Join o join
1072 | select * from pasajero
1073 | join viaje on (viaje.id_pasajero = pasajero.id);
1074 |
1075 | -- que pasajeros no han tomado ningun viaje
1076 | select * from pasajero
1077 | LEFT JOIN viaje on (viaje.id_pasajero = pasajero.id)
1078 | WHERE viaje.id IS NULL;
1079 | ```
1080 |
1081 | 
1082 |
1083 | ### Clase 19 Funciones Especiales Principales
1084 |
1085 | Postgres tiene una lista de funciones especiales que están diseñadas exclusivamente para ayudarte a desarrollar tu aplicación mucho mas rápido algunas de ellas son:
1086 |
1087 | - **ON CONFLICT DO:** Nos ayuda cuando queremos insertar o modificar los datos en una tabla que no podamos y justamente después hacemos la actualización correcta, es decir si queremos insertar un dato que ya existe un conflict do no permite hacer una actualización sobre el mismo dato.
1088 |
1089 | - **RETURNING:** Nos permite devolver todos los cambios que hemos hecho sobre la base de datos, es decir si hacemos un insert nos devuelve todos los datos que fueron insertados en la base de datos, y si hay un campo de tipo serial devuelve el valor asignado.
1090 |
1091 | - **LIKE/ALIKE:** nos sirve para hacer búsquedas al estilo de regex por ejemplo buscar nombres que comiencen con la letra o
1092 |
1093 | - **IS/IS NOT:** nos permite comparar dos tipos de datos que no sean estándar como numérico y alfanumérico sino que sean de tipo objeto o especiales como Null, en este podemos saber por ejemplo si un campo es nulo o no lo es.
1094 |
1095 | Veremos como hacer esto con PGAdmin.
1096 |
1097 | Primer Ejemplo: Insertar un dato en la tabla estacion con id = .
1098 |
1099 | **ON CONFLICT DO NOTHING**.
1100 |
1101 | 
1102 |
1103 | ```SQL
1104 | INSERT INTO public.estacion(
1105 | id, nombre, direccion)
1106 | VALUES (, 'Nombre', 'Dire')
1107 | ON CONFLICT DO NOTHING;
1108 | ```
1109 |
1110 | **ON CONFLICT (COLUMNA) DO UPDATE SET**.
1111 |
1112 | 
1113 |
1114 | ```SQL
1115 | INSERT INTO public.estacion(
1116 | id, nombre, direccion)
1117 | VALUES (, 'Nombre', 'Dire')
1118 | ON CONFLICT(ID) DO UPDATE SET nombre = 'Nombre', direccion = 'Dire';
1119 | ```
1120 |
1121 | **RETURNING**.
1122 |
1123 | 
1124 |
1125 | ```SQL
1126 | INSERT INTO public.estacion(
1127 | nombre, direccion)
1128 | VALUES ('RET', 'RETDRI')
1129 | RETURNING *;
1130 | ```
1131 |
1132 | **LIKE**.
1133 |
1134 | 
1135 |
1136 | ```SQL
1137 | SELECT nombre
1138 | FROM public.pasajero
1139 | WHERE nombre ILIKE 'o%';
1140 |
1141 | -- % buscar 1 o cualquier valor
1142 | -- _ buscar solamente 1
1143 | -- I buscar mayus o minusc por igual
1144 | ```
1145 |
1146 | ****IS/IS NOT:****.
1147 |
1148 | 
1149 |
1150 | ```SQL
1151 | SELECT *
1152 | FROM public.tren
1153 | WHERE modelo is NULL;
1154 | ```
1155 |
1156 | ### Clase 20 Funciones Especiales Avanzadas
1157 |
1158 | Funciones mas comunes en postgres:
1159 |
1160 | - **COALESCE:** permite comprar dos valores y retornar cual de los dos no es nulo
1161 |
1162 | - **NULLIF:** permite comparar dos valores y retorna Null si son iguales
1163 |
1164 | - **GREATEST:** permite comprar un arreglo de valores y retorna el mayor
1165 |
1166 | - **LEAST:** permite comprar un arreglo de valores y retorna el menor
1167 |
1168 | - **BLOQUES ANÓNIMOS:** permite ingresar condicionales dentro de una consulta de base de datos.
1169 |
1170 | **Ejemplo COALESCE**.
1171 |
1172 | Primero modificar tabla pasajero para tener un dato como nulo.
1173 |
1174 | 
1175 |
1176 | ```sql
1177 | SELECT id, COALESCE(nombre, 'No Aplica') nombre, direccion_residencia, fecha_nacimiento
1178 | FROM public.pasajero WHERE id = 1;
1179 | ```
1180 |
1181 | **Ejemplo NULLIF**.
1182 |
1183 | 
1184 |
1185 | ```sql
1186 | SELECT NULLIF (0,0);
1187 | ```
1188 |
1189 | **Ejemplo GREATEST**.
1190 |
1191 | 
1192 |
1193 | ```sql
1194 | SELECT GREATEST (0, 1,2,3,4,5,6);;
1195 | ```
1196 |
1197 | **Ejemplo LEAST**.
1198 |
1199 | 
1200 |
1201 | ```sql
1202 | SELECT LEAST (0, 1,2,3,4,5,6);;
1203 | ```
1204 |
1205 | **Ejemplo BLOQUES ANÓNIMOS**.
1206 |
1207 | 
1208 |
1209 | ```sql
1210 | SELECT id, nombre, direccion_residencia, fecha_nacimiento,
1211 | CASE --inicia bloque anónimo
1212 | WHEN fecha_nacimiento > '2015-01-01' THEN
1213 | 'niño'
1214 | ELSE
1215 | 'Mayor'
1216 | END --termina bloque anónimo
1217 | FROM public.pasajero;
1218 | ```
1219 |
1220 | **Reto:** Consultar la informacion de los pasajeros agregando una columna adicional que nos diga quienes comienzan su nombre por la letra O y tiene mas de 18 años.
1221 |
1222 | ```sql
1223 | SELECT id, nombre, direccion_residencia, fecha_nacimiento,
1224 | CASE
1225 | --inicia bloque anónimo
1226 | WHEN nombre ILIKE 'o%' THEN '1'
1227 | ELSE '0'
1228 | END as nombre_inicia_o,
1229 | --termina bloque anónimo
1230 | CASE
1231 | --inicia bloque anónimo
1232 | WHEN EXTRACT(YEAR FROM current_date)- EXTRACT(YEAR FROM fecha_nacimiento) <= 18 THEN
1233 | 'Mayor de 18 años'
1234 | ELSE
1235 | 'Menor de 18 años'
1236 | END as Mayoria_de_edad
1237 | --termina bloque anónimo
1238 | FROM public.pasajero;
1239 | ```
1240 |
1241 | ### Clase 21 Vistas
1242 |
1243 | Cuando necesitamos extraer la informacion de una base de datos en forma de consulta muchas veces como por ejemplo para generar reportes es conveniente utilizar las vistas, existen dos tipos.
1244 |
1245 | - Vista: Volátil (trae informacion reciente)
1246 |
1247 | - Vista Materializada: Persistente (trae informacion de memoria con la ultima consulta histórica)
1248 |
1249 | Cuando la construimos usaremos la sintaxis SELECT vista
1250 |
1251 | #### Vista volatil
1252 |
1253 | Creamos la vista en PGAdmin dando click derecho en views y luego en create
1254 |
1255 | 
1256 |
1257 | 
1258 |
1259 | ```sql
1260 | SELECT *,
1261 | CASE
1262 | WHEN fecha_nacimiento > '2015-01-01' THEN
1263 | 'Mayor'
1264 | ELSE
1265 | 'niño'
1266 | END as tipo
1267 | FROM public.pasajero
1268 | ORDER BY tipo;
1269 | ```
1270 |
1271 | 
1272 |
1273 | Guardamos la vista y ahora hacemos la consulta
1274 |
1275 | 
1276 |
1277 | Estas vistas volatiles son muy útiles ya que podemos pasar la consulta raw (haciendo referencia a django) a nuestro backend para entregar el estado actual de los datos de nuestra aplicación.
1278 |
1279 | #### Vista Materializada
1280 |
1281 | Para ello hacemos click derecho en Materialized Views y seguimos los pasos del ejemplo anterior.
1282 |
1283 | ```sql
1284 | SELECT * from viaje WHERE inicio > '2020-01-01';
1285 | ```
1286 |
1287 | Nota: El ejemplo del curso utiliza horas, en mi caso particular utilice fechas.
1288 |
1289 | Hacemos la consulta
1290 |
1291 | 
1292 |
1293 | Y observamos el error de que la vista no cuenta con datos, por lo que procedemos a aplicar la sentencia recomendada.
1294 |
1295 | 
1296 |
1297 | Si borramos algún registro de nuestra tabla de viaje (29 al inicio 28 al borrar) la vista materializada seguirá conteniendo el total original (29 registros), estas vistas las usamos cuando queremos obtener la informacion 1 vez, esta quedara guardada en memoria.
1298 |
1299 | ### Clase 22 PL/SQL
1300 |
1301 | Las PL o procedimientos almacenados hacen parte del motor de postgres y es una de las caracteristicas mas importantes y el porque las personas empiezan a usar este motor, ella nos ayuda a desarrollar código directamente sobre la base su estructura es bastante sencilla, se asemeja a una funcion de cualquier lenguaje de programación (declaración, uso de variables y un fin) y se permite ejecutar dentro de la base de datos.
1302 |
1303 | 
1304 |
1305 | #### Creando funciones con PL
1306 |
1307 | El primer ejemplo declara una PL nota que todas las PL inician con DO $$ y terminan con $$, este ejemplo levanta un mensaje solamente en la consola, esto con el keyword **RAISE NOTICE**
1308 |
1309 | 
1310 |
1311 | Segundo ejemplo usando variables y tipos de datos, esto se hace con la seccion **DECLARE**, **record** nos permite almacenar el tipo de dato de una fila, y si queremos un valor de inicio lo hacemos con ":=" en el lenguaje de postgres y "=" solo esta reservado para las consultas.
1312 |
1313 | 
1314 |
1315 | Ahora contaremos los registros en la tabla incorporando un contador
1316 |
1317 | 
1318 |
1319 | Como te habrás dado cuenta no es posible llamar a este PL de esta manera, para ello es necesario encapsularlo de la siguiente forma.
1320 |
1321 | 
1322 |
1323 | Void indica que no retorna valores, para ejecutar nuestra funcion basta con usar lo siguiente
1324 |
1325 | ```sql
1326 | SELECT importantePL();
1327 | ```
1328 |
1329 | 
1330 |
1331 | No retorna ningun dato, pero si los mensajes de lo que ejecutamos.
1332 |
1333 | 
1334 |
1335 | Si queremos retornar algún dato lo podemos declarar después de **RETURNS** y muy importante como nuestra funcion ya existe debemos hacer uno de la expresión **CREATE OR REPLACE FUNCTION** para nuestra funcion importantePL()
1336 |
1337 | 
1338 |
1339 | **tip: La mayoria de las PL tienen que ver con consultas**.
1340 |
1341 | #### Creando funciones con PGAdmin
1342 |
1343 | Al igual que los demás ejercicios en el arbol del menu damos click derecho en functions y después en CREATE
1344 |
1345 | Nombramos a nuestra funcion
1346 |
1347 | 
1348 |
1349 | 
1350 |
1351 | 
1352 |
1353 | 
1354 |
1355 | Guardamos la PL y la ejecutamos igual que la forma anterior a traves del select.
1356 |
1357 | 
1358 |
1359 | 
1360 |
1361 | ### Clase 23 Triggers
1362 |
1363 | Los Triggers son herramientas muy útiles que nos permiten ejecutar funciones dependiendo de acciones que se ejecuten sobre una tabla, esa acciones pueden ser:
1364 |
1365 | - INSERT
1366 | - UPDATE
1367 | - DELETE
1368 |
1369 | Veremos con PGAdmin como concatenar nuestra pl a una funcion de INSERT, UPDATE O DELETE de la tabla de pasajeros.
1370 |
1371 | Crearemos ua bitacora que nos apoye a la clase, para ello haremos una tabla de nombre "cont_pasajero" con dos columnas "total" con valor integer y "tiempo" en formato time with time zone y una pk de nombre id (si tienes dudas revisa la primer seccion de las notas).
1372 |
1373 | Ahora la tabla la modificaremos unicamente con la PL que acabamos de crear.
1374 |
1375 | Primero modificamos la ultima PL en las propiedades/code
1376 |
1377 | ```sql
1378 | DECLARE
1379 | rec record;
1380 | contador integer := 0;
1381 | BEGIN
1382 | FOR rec IN SELECT * FROM pasajero LOOP
1383 | -- accedes con dot notation a las propiedades de la variable rec
1384 | RAISE NOTICE 'Un pasajero se llama % con el id %', rec.nombre, rec.id;
1385 | contador := contador + 1;
1386 | END LOOP;
1387 | INSERT INTO cont_pasajero (total,tiempo)
1388 | VALUES (contador, now());
1389 | RETURN contador;
1390 | END
1391 | ```
1392 |
1393 | Ejecutamos nuestra PL y traemos los datos de la ultima tabla creada
1394 |
1395 | 
1396 |
1397 | Borramos un registro de la tabla de pasajeros, volvemos a ejecutar nuestro trigger y consultamos de nuevo los datos.
1398 |
1399 | 
1400 |
1401 | Ahora vamos a hacer que esa funcion sea de tipo Trigger y la adjuntamos al insert de la tabla de pasajeros.
1402 |
1403 | Para ello modificamos la funcion, donde ahora deberá detornar un trigger, para ello borramos la funcion que teníamos y la volvemos a escribir.
1404 |
1405 | 
1406 |
1407 | Ese trigger de cierta forma lo podemos adjuntar a las acciones sobre una tabla, las acciones compatibles son INSERT, UPDATE, DELETE Y TRUNCATE, para este ejemplo vamos a hacerlo sobre el nivel de INSERT para ello creamos la funcion CREATE TRIGGER
1408 |
1409 | 
1410 |
1411 | Intentamos hacer un insert a pasajeros.
1412 |
1413 | 
1414 |
1415 | Observamos en el error que el trigger no esta retornando nada, por lo que hay que modificarlo en el apartado del arbol triggers lo buscamos y damos click en CREATE y modificamos el trigger.
1416 |
1417 | Un trigger contiene informacion de lo que se esta cambiando debemos confirmar al motor de la base de datos si el cambio se esta llevando a cabo o no.
1418 |
1419 | Los triggers tiene dos variables globales muy importantes **OLD** lo que estaba antes del cambio y **NEW** lo que esta después del cambio, si queremos que el trigger proceda con el nuevo valor usamos NEW, si queremos quedarnos como estábamos usamos OLD, al igual que la variable rec también podemos acceder a las propiedades con dot notation asi tendremos OLD.id o NEW.nombre donde se almacenan los cambios en el estado, estas tienen mucho sentido cuando hacemos un UPDATE, pero para insert lo adecuado siempre sera NEW.
1420 |
1421 | Seguiremos los siguientes pasos
1422 |
1423 | 1 Borramos el Trigger
1424 |
1425 | 2.- Borramos la funcion en CASCADE para eliminar el disparador también.
1426 |
1427 | ```sql
1428 | DROP FUNCTION public.importante_pl2() CASCADE ;
1429 | ```
1430 |
1431 | 3.- Creamos el trigger
1432 |
1433 | 
1434 |
1435 | ```sql
1436 |
1437 | CREATE FUNCTION public.importante_pl2()
1438 | RETURNS trigger
1439 | LANGUAGE 'plpgsql'
1440 | COST 100
1441 | VOLATILE NOT LEAKPROOF
1442 | AS $BODY$
1443 | DECLARE
1444 | rec record;
1445 | contador integer := 0;
1446 | BEGIN
1447 | FOR rec IN SELECT * FROM pasajero LOOP
1448 | contador := contador + 1;
1449 | END LOOP;
1450 | INSERT INTO cont_pasajero (total,tiempo)
1451 | VALUES (contador, now());
1452 | RETURN NEW;
1453 | END
1454 | $BODY$;
1455 | ```
1456 |
1457 | 4.- Creamos el Trigger
1458 |
1459 | 
1460 |
1461 | Ahora procedemos de nuevo a insertar un valor nuevo en la tabla pasajero
1462 |
1463 | 
1464 |
1465 | Consultamos la tabla cont_pasajeros para confirmar
1466 |
1467 | 
1468 |
1469 | **Reto:** Crear un trigger similar al anterior donde se registre cuando se eliminan los pasajeros
1470 |
1471 | **Solución**.
1472 |
1473 | Funcion pl_on_delete_pasajero
1474 |
1475 | ```sql
1476 | CREATE FUNCTION public.pl_on_delete_pasajero()
1477 | RETURNS trigger
1478 | LANGUAGE 'plpgsql'
1479 |
1480 | AS $BODY$
1481 | DECLARE
1482 | rec record;
1483 | contador integer := 0;
1484 | BEGIN
1485 | FOR rec IN SELECT * FROM pasajero LOOP
1486 | contador := contador + 1;
1487 | END LOOP;
1488 | INSERT INTO cont_pasajero (total,tiempo)
1489 | VALUES (contador, now());
1490 | RETURN NEW;
1491 | END
1492 | $BODY$;
1493 | ```
1494 |
1495 | Se crea Trigger con la funcion, el nombre del trigger lo encuentras en los triggers de la tabla pasajero.
1496 |
1497 | ```sql
1498 | CREATE TRIGGER mitrigger_2
1499 | AFTER DELETE
1500 | ON public.pasajero
1501 | FOR EACH ROW
1502 | EXECUTE PROCEDURE pl_on_delete_pasajero();
1503 | ```
1504 |
1505 | Verificamos haciendo el DELETE de cualquier usuario y observamos el resultado.
1506 |
1507 | 
1508 |
1509 | ## Modulo 4 Integrar bases de datos con servicios externos
1510 |
1511 | ### Clase 24 Simulando una conexion a Bases de Datos remotas
1512 |
1513 | Postgres ofrece un servicio llamado **dblink**, permite conectarte a servidores remotos dentro de una consulta, en el cual puedes hacer **SELECT** una tabla local y hacer incluso un **JOIN** a una base de datos remota.
1514 |
1515 | Para ello crearemos una base de datos en nuestro propio servidor simulando que sea una base de datos remota siguiendo los pasos que ya conocemos y la denominamos como "remota" con una tabla llamada vip, esta tendra dos columnas ID (serial) y Fecha (date), finalmente le damos todos los permisos al usuario que se conectara a la base de datos en forma remota en este caso nuestro **usuario_consulta**.
1516 |
1517 | Insertamos un par de datos para probar.
1518 |
1519 | ```sql
1520 | INSERT INTO public.vip(
1521 | id, fecha)
1522 | VALUES (50, '2010-01-01');
1523 | ```
1524 |
1525 | Y nos desconectamos de esa base de datos para conectarnos después desde la tabla pasajero de la base de datos transporte.
1526 |
1527 | Antes de todo verificamos tener instalado dblink
1528 |
1529 | ```sql
1530 | SELECT * FROM
1531 | dblink ('dbname=remota
1532 | port=5432
1533 | host=127.0.0.1
1534 | user=usuario_consulta
1535 | password=etc123'
1536 | 'SELECT id, fecha FROM vip')
1537 | ```
1538 |
1539 | Al ejecutar obtendremos un error si no tenemos instalado db link, lo instalamos con lo siguiente
1540 |
1541 | ```sql
1542 | CREATE EXTENSION dblink;
1543 | ```
1544 |
1545 | Volvemos a intentar la conexion.
1546 |
1547 | 
1548 |
1549 | Ya obtuvimos acceso remoto a una base de datos, ahora hagamos un join de nuestros datos locales para saber quien es el usuario VIP
1550 |
1551 | ```sql
1552 | SELECT * FROM pasajero
1553 | JOIN
1554 | dblink ('dbname=remota
1555 | port=5432
1556 | host=127.0.0.1
1557 | user=usuario_consulta
1558 | password=etc123',
1559 | 'SELECT id, fecha FROM vip'
1560 | ) as datos_remotos (id integer, fecha date)
1561 | ON (pasajero.id = datos_remotos.id);
1562 | ```
1563 |
1564 | Usamos **USING** cuando los dos campos de una consulta **JOIN** son iguales, esto es especial de las consultas esto nos devuelve la misma informacion de la tabla
1565 |
1566 | ```sql
1567 | SELECT * FROM pasajero
1568 | JOIN
1569 | dblink ('dbname=remota
1570 | port=5432
1571 | host=127.0.0.1
1572 | user=usuario_consulta
1573 | password=etc123',
1574 | 'SELECT id, fecha FROM vip'
1575 | ) as datos_remotos (id integer, fecha date)
1576 | -- ON (pasajero = datos_remotos)
1577 | USING (id);
1578 | ```
1579 |
1580 | 
1581 |
1582 | **Reto** Haz la conexion de forma inversa.
1583 |
1584 | **Solución**.
1585 |
1586 | ```sql
1587 | SELECT * FROM vip
1588 | JOIN
1589 | dblink ('dbname=transporte
1590 | port=5432
1591 | host=127.0.0.1
1592 | user=usuario_consulta
1593 | password=etc123',
1594 | 'SELECT id, nombre, direccion_residencia, fecha_nacimiento FROM pasajero'
1595 | ) as datos_remotos (id integer,
1596 | nombre character varying,
1597 | direccion_residencia character varying,
1598 | fecha_nacimiento date)
1599 | -- ON (vip.id = datos_remotos.id)
1600 | USING (id)
1601 | ;
1602 | ```
1603 |
1604 | 
1605 |
1606 | ### Clase 25 Transacciones
1607 |
1608 | Tomando el ejemplo de un cajero automático, cuando uno de sus procesos falla este debe devolver todos los cambios, postgres hace lo mismo, cuando tiene un proceso si alguna de las tareas que lo componen falla este debe poder devolver todos los cambios automáticamente (hacer un rollback)
1609 |
1610 | El proceso se ilustra como
1611 |
1612 | ```md
1613 |
1614 | BEGIN
1615 |
1616 | COMMIT (si todo salio bien) | ROLLBACK (si algo salio mal)
1617 | ```
1618 |
1619 | En PGAdmin primero desactivamos el auto commit, este viene activo por default, y ejecutamos las siguientes consultas iniciando con **BEGIN**
1620 |
1621 | 
1622 |
1623 | Como puedes observar (y marcado con un recuadro naranja) en la interfaz de PGAdmin aparecieron 2 botones "commit" y "rollback" si damos commit deben guardarse los datos, y en el caso opuesto deshacer la transacción, pero como esta es una consulta esto no afecta a la base de datos.
1624 |
1625 | Ahora probemos que pasa con un insert creando una nueva estacion.
1626 |
1627 | 
1628 |
1629 | En este punto la informacion esta almacenada en memoria, si quitamos el comentario de algunas de las opciones (no es necesario ejecutar los inserts ya que los datos están en staging) y ejecutamos esa linea se confirmaran o devolverán los cambios, también lo puedes hacer en forma manual con los botones de la interface, aceptamos los cambios y comprobamos la informacion insertada.
1630 |
1631 | 
1632 |
1633 | 
1634 |
1635 | Hasta ahora todos los datos han sido correctos y el commit se ejecuta sin problemas, ahora haremos un ejemplo usando un id que se encuentra repetido usando un INSERT.
1636 |
1637 | 
1638 |
1639 | Al ejecutar los inserts dentro del bloque de código **BEGIN / COMMIT** nos aseguramos que todas las operaciones sean congruentes, si hubiésemos ejecutado las sentencias con la selección la primera se habría ejecutado y guardado, y la segunda hubiera fallado, pero al estar dentro del bloque de transacción con una consulta que sea errónea se hace el **ROLLBACK** y no se guarda ninguna informacion en la base de datos, ya que postgres siempre lo hace de manera implícita sin mostrarlo en pantalla, una forma explicita seria usándolo con las PL para limitar el numero de vip's en nuestros servicios.
1640 |
1641 | 
1642 |
1643 | ### Clase 26 Otras Extensiones para Postgres
1644 |
1645 | Postgres tiene muchas extensiones pre-instaladas pero no activas en tu sistema operativo, y estas te sirven para hacer cálculos, análisis, prototipado inclusive para machine learning.
1646 |
1647 | Activaremos una funcion que te permite comprar dos palabras letra por letra y como suenan cuando se pronuncian en Ingles, todo usando PGAdmin.
1648 |
1649 | Aquí todas las extensiones disponibles
1650 |
1651 | Vamos a PGAdmin para instalar leveshtein (la funcion matemática para medir la distancia entre dos palabras)
1652 |
1653 | **Levenshtein**.
1654 |
1655 | 
1656 |
1657 | Vemos el resultado es 1, es decir el numero de caracteres que es necesario cambiar para que ambas palabras sean iguales.
1658 |
1659 | **Difference**.
1660 |
1661 | Esta funcion es utilizada junto con algoritmos de machine learning y procesamiento de lenguaje natural el cual sabe que palabra quisiste decir, nos entrega un valor entre 0 y 4 donde 0 diferencia amplia.
1662 |
1663 | 
1664 |
1665 | Estas dos funciones si nuestra aplicaciones implementan análisis de texto o análisis de voz no es necesario desarrollarlas desde cero ya que postgres lo implementa al nivel de la base de datos.
1666 |
1667 | ## Modulo 5 Implementar mejores prácticas
1668 |
1669 | ### Clase 26 Backups y Restauracion
1670 |
1671 | Ha llegado el momento de guardar todo nuestro trabajo hasta el momento y tener una copia de seguridad en caso de que algo catastrófico ocurra, para eso Postgres tiene los servicios de restauracion, usaremos los siguientes comandos
1672 |
1673 | - pg_dump
1674 | - pg_restore[psql]
1675 |
1676 | Tenemos nuestra base de datos con mucha informacion delicada, y vamos a crear una copia de seguridad, para ello vamos en PGAdmin a nuestra base de datos **"transporte"** haciendo click derecho y seleccionamos la opcion Backup... y se abrirá un formulario para preguntarnos que es lo que queremos hacer.
1677 |
1678 | 
1679 |
1680 | Tenemos los siguientes campos:
1681 |
1682 | - **Filename:** Para indicar el nombre de tu archivo y el icono con tres puntos nos abre una ventana para seleccionar el directorio donde queremos guardar la el backup
1683 |
1684 | - **Format:** Este tiene 4 opciones.
1685 | - custom: Solo se puede usar con PGAdmin.
1686 | - Tar: archivo comprimido .tar que contienen la estructura de la base de datos.
1687 | - plain: sql plano, tendrás toda la informacion como una gran query con las sentencias (create table, insert, etc) y los datos.
1688 | - Directory: tiene la estructura sin comprimir de la base de datos.
1689 |
1690 | - **Compression ratio:** el numero de veces que se ejecuta el ciclo de compresión para que quede un archivo mas pequeño.
1691 |
1692 | - **Encoding:** La codificación de la base de datos por ejemplo UTF-8.
1693 |
1694 | - **Number of jobs:** no lo podemos modificar, lo define PGAdmin.
1695 |
1696 | - Role name: Dueño de quien sera el DUMP.
1697 |
1698 | En la pantalla de opciones podemos solicitar la data y el schema, o solo uno de ellos, los blobs se refiere a los datos de tipos binarios (imagen o archivo de texto), haz click en el símbolo ? para ver a detalle cada una de las opciones.
1699 |
1700 | 
1701 |
1702 | 
1703 |
1704 | Ahora para realizar el paso de Restauracion creamos una base de datos nueva (simulando que ya no existe la base transporte), damos click derecho y seleccionamos la opcion de Restore.
1705 |
1706 | 
1707 |
1708 | Con ello recuperamos nuestras tablas y la informacion que estas contenían.
1709 |
1710 | **Nota:** es importante resaltar que cuando se hace un backup para ser restaurado en una versión diferente se debe de usar la opción plana dado que el custom varia de versión a versión.
1711 |
1712 | Como hacer backup desde la consola
1713 |
1714 | Crear un fichero con las sentencias SQL listas para cargar el contenido de
1715 | una db en otra db distinta (modo simple)
1716 |
1717 | ```sql
1718 | postgres=# pg_dump source_db_name > db_data.sql
1719 | ```
1720 |
1721 | Cargar un fichero con las sentencias SQL listas de una db en otra db
1722 | nueva y distinta (modo simple)
1723 |
1724 | ```sql
1725 | postgres=# psql -d new_db_name -f db_data.sql
1726 | ```
1727 |
1728 | Otras opciones disponibles:
1729 |
1730 | ```sql
1731 | postgres=#\q
1732 | ...$ psql --help
1733 | ```
1734 |
1735 | ### Clase 29 Mantenimiento
1736 |
1737 | Este es un tema importante y que postgres realiza por debajo en segundo plano, en este proceso de vacuum (vaciado) quita todas las filas, columnas e items del disco duro que no están funcionando para optimizar los servicios.
1738 |
1739 | Postgres tiene dos niveles de limpieza.
1740 |
1741 | - Liviano: se ejecuta todo el tiempo para lograr las optimizaciones descritas anteriormente.
1742 |
1743 | - Completo (full): que es capaz de bloquear las tablas para hacer la limpieza y luego las desbloquea, es importante cuando tenemos una tabla muy grande y tenemos problemas de indexacion.
1744 |
1745 | El mantenimiento en PGAdmin lo llevamos a cabo dando click derecho sobre la base de datos o sobre una de las tablas, pero es muy diferente ya que solo afectamos una tabla, mientras a nivel de base de datos podemos llegar a bloquear todas las tablas hasta que la tarea de mantenimiento termine, este es su menu con sus caracteristicas, la mas importante es vacuum.
1746 |
1747 | 
1748 |
1749 | - Full: quiere decir que la tabla que vas a limpiar (en este caso estacion) quedara limpia en su totalidad, es decir se realizara la revision de todo el espacio en memoria para que todas las filas que ya no son aplicables se eliminen y todos los indices también.
1750 |
1751 | - Freeze: incluye que durante ese proceso se va a congelar, pero hay que tener en cuenta que un cuando se hace un vacuum full si no es posible hacerlo en lo que llega una consulta nueva esa tabla queda congelada y tendra un lot quiere decir que ninguna tabla podrá acceder a ella hasta que termine el proceso de limpieza.
1752 |
1753 | - Analyze: ejecuta una revision pero no hace cambios en la tabla.
1754 |
1755 | - Verbose Messages. Nos da el feedback de lo que esta sucediendo.
1756 |
1757 | - Reindex: aplica para tablas que tienen indices, entre ellos las llaves primarias, que los motores crean como indices porque son normalmente usados para búsquedas.
1758 |
1759 | - Custer: es decirle al motor de la base de datos que reorganice la el almacenamiento.
1760 |
1761 | Estas 4 opciones no es recomendable hacerlo a mano ya que postgres tiene mas de 20 años optimizando estos procesos, aunque eventualmente si puede llegar a ser necesario hacerlo hazlo en un horario que no afecte a tus usuarios o servicios.
1762 |
1763 | ### Clase 29 Introduccion a Replicas
1764 |
1765 | Las replicas son mecanismos que nos permiten evitar problemas de entrada y salida en los sistemas operativos.
1766 |
1767 | Ten en cuenta esta frase.
1768 |
1769 | 
1770 |
1771 | Cuando tu aplicación crece en usuarios/operaciones te vas a topar con limites en términos de física y electronica, es decir los recursos de tu servidor (disco, ram, cpu) tienen limites, ellos no pueden ser sobrepasados en sus procesos de lectura y escritura que no pueden llevarse al mismo tiempo, por este motivo postgres bloquea la tabla para escritura mientras la lees y viceversa, esto para conservar la consistencia de datos, aquí entran las replicas a solucionar este problema.
1772 |
1773 | **Estrategia de Replicas**.
1774 |
1775 | Tendremos la base de datos principal se hacen todas las modificaciones y tener una base de datos secundaria donde solamente se hacen las lecturas, separa las acciones nos permite separar todas las tareas que hace internamente postgres es decir los cambios los hace en "A" y automáticamente se llevan a la tabla donde se leen los datos "B", este proceso lo hace postgres no tiene que hacer nada a mano, solamente es necesario configurar al menos 2 servidores de postgres (por lo menos 2, ya que puedes tener una cantidad ilimitada de replicas) uno como maestro y otro como esclavo, deberás modificar tu aplicación para que todas las modificaciones las haga sobre la base de datos principal o "master" y que todas las lecturas las haga sobre la replica (copia en caliente de la base de datos).
1776 |
1777 | IPS (In operation per second) es la limitante a nivel de sistemas operativos, como saber que nivel nos sirve (10,20, 40 iops)
1778 |
1779 | ### Clase 30 Implementacion de Replicas en Postgres
1780 |
1781 | Usaremos la plataforma para crear dos servidores 1 de postgres que sera el maestro y 1 en postgres que sera el esclavo/replica, jelastic es un SaaS
1782 |
1783 | Primero nos registramos aquí , nos registramos y creamos dos bases de datos hacemos lo mismo para master1 y replica1.
1784 |
1785 | 
1786 |
1787 | Esperamos a que termine su proceso y recibiremos por email los datos de conexion para usar en PAAdmin donde crearemos un servidor como los locales, lo nombramos master, pero en los datos de host y password utilizaremos los datos que recibimos por correo ya que IPV4 ya no esta disponible en la version trial, para la parte del nodo debemos ir al servicio de jelastic y dar click en el engrane amarillo a la altura de la base de datos y configurar un endpoint y reemplazar ese dato en el puerto.
1788 |
1789 | Datos del correo
1790 |
1791 | 
1792 |
1793 | Configurar endpoint
1794 |
1795 | 
1796 |
1797 | **Aquí ATENTO es muy importante que selecciones el nodo de tu base de datos** (tuve el error de seleccionar el nodo del server y nunca me conecte) la imagen es solo referencia, el nodo lo encuentras en el apartado con el icono de Postgres.
1798 |
1799 | 
1800 |
1801 | Después de hacer clic en ADD nos asigna el Port que Podemos usar para accede a la BD usando el host en forma de nombre de dominio y no IP, en éste caso fué 11031.
1802 |
1803 | 
1804 |
1805 | Este proceso lo realizamos también para la base replica, bien ahora contamos con dos bases de datos independientes.
1806 |
1807 | 
1808 |
1809 | #### Configuracion Master
1810 |
1811 | Ahora vamos a configurar ambas bases de datos, una como maestro y la otra como esclavo.
1812 |
1813 | Primero vamos a configurar master, aplicaremos cambios al archivo **postgresql.conf** cambiando varios parámetros para que entienda que va a ser una base de datos de replica y que va a recibir conexiones desde otra base de datos para copiar informacion.
1814 |
1815 | Buscamos los siguientes campos
1816 |
1817 | - **wal_level**(wall ahead log) que es como la bitacora de la base de datos, lo establecemos en para que se comporte en modo **hot_standby**, es decir una base de datos que mantiene sus archivos hasta que sus replicas se las lleven y los ejecuten.**Básicamente las replicas funcionan leyendo estos archivos de bitacora y copiando la informacion para no bloquear la base de datos maestra;**
1818 |
1819 | 
1820 |
1821 | Buscamos el parámetro **max_wal_senders** que corresponde a la cantidad de replicas que vamos a tener, lo dejamos como 2 a futuro.
1822 |
1823 | 
1824 |
1825 | Siguiente parámetro es **archive_mode** y refiere a como vamos a guardar los archivos de esa bitacora, indica que no los vamos a eliminar sino simplemente a archivar, lo dejamos en **on** para que als copias de replica las puedan leer desde ahi.
1826 |
1827 | 
1828 |
1829 | Por ultimo para master tenemos **archive_command**, le indicamos con un comando de linux que es para copiar archivos y dejarlos en una carpeta temporal **'cp %p /tmp/%f'**
1830 |
1831 | 
1832 |
1833 | Con esto tenemos la configuracion principal en nuestra base de datos maestra, ahora reiniciamos el servicio, pero antes recuerdas que existe en un archivo para permitir la conexion remota entre servicios **pg_hba.cong**, agregaremos la siguiente configuracion para un host con intenciones de replicacion con todas las bases de datos se va a conectar desde una Ip y confiarle lo que haga sin contraseña (solo para estos efectos de practica, y usaremos la IP interna de la replica) y le ponemos la mascara 32 para que sepa que no es un rango de ips sino una sola ip
1834 |
1835 | 
1836 |
1837 | Ahora reiniciamos el nodo de postgres.
1838 |
1839 | #### Configuracion Replica
1840 |
1841 | Procedemos a los cambios para ello haremos un par de ajustes en el archivo.conf lo primero es copiar todo lo que esta en master, nos conectamos con shh en el icono de terminal
1842 |
1843 | 
1844 |
1845 | Ejecutamos el siguiente comando para detener el servicio de replica y hacer la copia de seguridad de los archivos directamente de la master hacia la esclava, con esto tendremos a las dos en un estado idéntico y posterior la reiniciamos en modo replica
1846 |
1847 | Detenemos el servicio
1848 |
1849 | ```bash
1850 | sudo service postgresql stop
1851 | ```
1852 |
1853 | Borramos los datos existentes
1854 |
1855 | ```bash
1856 | rm -rf /var/lib/pgsql/data/*
1857 | ```
1858 |
1859 | Copiamos los datos de por conexion remota
1860 |
1861 | ```bash
1862 | pg_basebackup -U webadmin -R -D /var/lib/pgsql/data/ --host=192.168.6.255 --port=5432
1863 | ```
1864 |
1865 | Ahora hacemos un cambio en la en el archivo **postgresql.conf** de la base de datos replica al parámetro **hot_standby** lo indicamos en **on**
1866 |
1867 | 
1868 |
1869 | Ahora reiniciamos el servicio
1870 |
1871 | ```bash
1872 | sudo service postgresql start
1873 | ```
1874 |
1875 | Ahora lo interesante, comprobamos la configuracion maestro/replica, pero primero debes actualizar la contraseña de replica que ahora es la de master dado que clonamos sus datos, ahora si podemos acceder dado que tenemos una misma configuracion.
1876 |
1877 | Creamos una base de datos en master
1878 |
1879 | 
1880 |
1881 | Unos segundos después y de manera automática, ya la tengo en replica
1882 |
1883 | 
1884 |
1885 | Pero si nosotros intentamos escribir en replica no nos va a dejar ya que replica es solo de lectura.
1886 |
1887 | ### Clase 31 Otras buenas Practicas
1888 |
1889 | **Problema:** Evitar bloqueos por inserciones y borrados en la misma tabla.
1890 |
1891 | **solución:** renombrar tablas, decirle a sistema que ataque dos tablas, ejemplo con un **ALTER TABLE** cambia la tabla **viajes** a **viajes_temporal** y crea una tabla de **viajes "nueva"** mientras que la aplicación sigue utilizando la tabla de viajes para insertar las operaciones del dia/turno, esto permitirá a tu algoritmo de consolidación realizar el borrado y indexado mucho mas rápido, mientras la tabla viajes sigue con registrando las operaciones de la aplicación, esta operación se realiza dependiendo el flujo de informacion a consolidar.
--------------------------------------------------------------------------------
/Notes/src/backup_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/backup_1.jpg
--------------------------------------------------------------------------------
/Notes/src/backup_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/backup_2.jpg
--------------------------------------------------------------------------------
/Notes/src/backup_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/backup_3.jpg
--------------------------------------------------------------------------------
/Notes/src/backup_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/backup_4.jpg
--------------------------------------------------------------------------------
/Notes/src/bd_proyecto.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/bd_proyecto.jpg
--------------------------------------------------------------------------------
/Notes/src/comandos_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_1.jpg
--------------------------------------------------------------------------------
/Notes/src/comandos_10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_10.jpg
--------------------------------------------------------------------------------
/Notes/src/comandos_11.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_11.jpg
--------------------------------------------------------------------------------
/Notes/src/comandos_12.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_12.jpg
--------------------------------------------------------------------------------
/Notes/src/comandos_13.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_13.jpg
--------------------------------------------------------------------------------
/Notes/src/comandos_14.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_14.jpg
--------------------------------------------------------------------------------
/Notes/src/comandos_15.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_15.jpg
--------------------------------------------------------------------------------
/Notes/src/comandos_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_2.jpg
--------------------------------------------------------------------------------
/Notes/src/comandos_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_3.jpg
--------------------------------------------------------------------------------
/Notes/src/comandos_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_4.jpg
--------------------------------------------------------------------------------
/Notes/src/comandos_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_5.jpg
--------------------------------------------------------------------------------
/Notes/src/comandos_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_6.jpg
--------------------------------------------------------------------------------
/Notes/src/comandos_7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_7.jpg
--------------------------------------------------------------------------------
/Notes/src/comandos_8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_8.jpg
--------------------------------------------------------------------------------
/Notes/src/comandos_9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_9.jpg
--------------------------------------------------------------------------------
/Notes/src/create_table_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_1.jpg
--------------------------------------------------------------------------------
/Notes/src/create_table_10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_10.jpg
--------------------------------------------------------------------------------
/Notes/src/create_table_11.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_11.jpg
--------------------------------------------------------------------------------
/Notes/src/create_table_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_2.jpg
--------------------------------------------------------------------------------
/Notes/src/create_table_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_3.jpg
--------------------------------------------------------------------------------
/Notes/src/create_table_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_4.jpg
--------------------------------------------------------------------------------
/Notes/src/create_table_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_5.jpg
--------------------------------------------------------------------------------
/Notes/src/create_table_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_6.jpg
--------------------------------------------------------------------------------
/Notes/src/create_table_7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_7.jpg
--------------------------------------------------------------------------------
/Notes/src/create_table_8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_8.jpg
--------------------------------------------------------------------------------
/Notes/src/create_table_9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_9.jpg
--------------------------------------------------------------------------------
/Notes/src/create_user_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_1.jpg
--------------------------------------------------------------------------------
/Notes/src/create_user_10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_10.jpg
--------------------------------------------------------------------------------
/Notes/src/create_user_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_2.jpg
--------------------------------------------------------------------------------
/Notes/src/create_user_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_3.jpg
--------------------------------------------------------------------------------
/Notes/src/create_user_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_4.jpg
--------------------------------------------------------------------------------
/Notes/src/create_user_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_5.jpg
--------------------------------------------------------------------------------
/Notes/src/create_user_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_6.jpg
--------------------------------------------------------------------------------
/Notes/src/create_user_7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_7.jpg
--------------------------------------------------------------------------------
/Notes/src/create_user_8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_8.jpg
--------------------------------------------------------------------------------
/Notes/src/create_user_9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_9.jpg
--------------------------------------------------------------------------------
/Notes/src/datos_remotos_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/datos_remotos_1.jpg
--------------------------------------------------------------------------------
/Notes/src/datos_remotos_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/datos_remotos_2.jpg
--------------------------------------------------------------------------------
/Notes/src/datos_remotos_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/datos_remotos_3.jpg
--------------------------------------------------------------------------------
/Notes/src/diagrama_entidad_relacion_proyecto.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/diagrama_entidad_relacion_proyecto.jpg
--------------------------------------------------------------------------------
/Notes/src/diagrama_entidad_relacion_proyecto_styled.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/diagrama_entidad_relacion_proyecto_styled.jpg
--------------------------------------------------------------------------------
/Notes/src/extensiones_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/extensiones_1.jpg
--------------------------------------------------------------------------------
/Notes/src/extensiones_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/extensiones_2.jpg
--------------------------------------------------------------------------------
/Notes/src/foreign_key_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/foreign_key_1.jpg
--------------------------------------------------------------------------------
/Notes/src/foreign_key_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/foreign_key_2.jpg
--------------------------------------------------------------------------------
/Notes/src/foreign_key_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/foreign_key_3.jpg
--------------------------------------------------------------------------------
/Notes/src/foreign_key_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/foreign_key_4.jpg
--------------------------------------------------------------------------------
/Notes/src/foreign_key_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/foreign_key_5.jpg
--------------------------------------------------------------------------------
/Notes/src/foreign_key_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/foreign_key_6.jpg
--------------------------------------------------------------------------------
/Notes/src/foreign_key_7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/foreign_key_7.jpg
--------------------------------------------------------------------------------
/Notes/src/foreign_key_8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/foreign_key_8.jpg
--------------------------------------------------------------------------------
/Notes/src/foreign_key_9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/foreign_key_9.jpg
--------------------------------------------------------------------------------
/Notes/src/funciones_especiales_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_1.jpg
--------------------------------------------------------------------------------
/Notes/src/funciones_especiales_10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_10.jpg
--------------------------------------------------------------------------------
/Notes/src/funciones_especiales_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_2.jpg
--------------------------------------------------------------------------------
/Notes/src/funciones_especiales_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_3.jpg
--------------------------------------------------------------------------------
/Notes/src/funciones_especiales_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_4.jpg
--------------------------------------------------------------------------------
/Notes/src/funciones_especiales_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_5.jpg
--------------------------------------------------------------------------------
/Notes/src/funciones_especiales_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_6.jpg
--------------------------------------------------------------------------------
/Notes/src/funciones_especiales_7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_7.jpg
--------------------------------------------------------------------------------
/Notes/src/funciones_especiales_8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_8.jpg
--------------------------------------------------------------------------------
/Notes/src/funciones_especiales_9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_9.jpg
--------------------------------------------------------------------------------
/Notes/src/insersion_masiva_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_1.jpg
--------------------------------------------------------------------------------
/Notes/src/insersion_masiva_10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_10.jpg
--------------------------------------------------------------------------------
/Notes/src/insersion_masiva_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_2.jpg
--------------------------------------------------------------------------------
/Notes/src/insersion_masiva_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_3.jpg
--------------------------------------------------------------------------------
/Notes/src/insersion_masiva_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_4.jpg
--------------------------------------------------------------------------------
/Notes/src/insersion_masiva_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_5.jpg
--------------------------------------------------------------------------------
/Notes/src/insersion_masiva_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_6.jpg
--------------------------------------------------------------------------------
/Notes/src/insersion_masiva_7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_7.jpg
--------------------------------------------------------------------------------
/Notes/src/insersion_masiva_8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_8.jpg
--------------------------------------------------------------------------------
/Notes/src/insersion_masiva_9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_9.jpg
--------------------------------------------------------------------------------
/Notes/src/insert_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_1.jpg
--------------------------------------------------------------------------------
/Notes/src/insert_10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_10.jpg
--------------------------------------------------------------------------------
/Notes/src/insert_11.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_11.jpg
--------------------------------------------------------------------------------
/Notes/src/insert_12.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_12.jpg
--------------------------------------------------------------------------------
/Notes/src/insert_13.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_13.jpg
--------------------------------------------------------------------------------
/Notes/src/insert_14.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_14.jpg
--------------------------------------------------------------------------------
/Notes/src/insert_15.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_15.jpg
--------------------------------------------------------------------------------
/Notes/src/insert_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_2.jpg
--------------------------------------------------------------------------------
/Notes/src/insert_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_3.jpg
--------------------------------------------------------------------------------
/Notes/src/insert_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_4.jpg
--------------------------------------------------------------------------------
/Notes/src/insert_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_5.jpg
--------------------------------------------------------------------------------
/Notes/src/insert_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_6.jpg
--------------------------------------------------------------------------------
/Notes/src/insert_7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_7.jpg
--------------------------------------------------------------------------------
/Notes/src/insert_8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_8.jpg
--------------------------------------------------------------------------------
/Notes/src/insert_9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_9.jpg
--------------------------------------------------------------------------------
/Notes/src/join_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/join_1.jpg
--------------------------------------------------------------------------------
/Notes/src/maintenance_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/maintenance_1.jpg
--------------------------------------------------------------------------------
/Notes/src/particiones_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/particiones_1.jpg
--------------------------------------------------------------------------------
/Notes/src/particiones_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/particiones_2.jpg
--------------------------------------------------------------------------------
/Notes/src/particiones_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/particiones_3.jpg
--------------------------------------------------------------------------------
/Notes/src/particiones_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/particiones_4.jpg
--------------------------------------------------------------------------------
/Notes/src/particiones_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/particiones_5.jpg
--------------------------------------------------------------------------------
/Notes/src/particiones_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/particiones_6.jpg
--------------------------------------------------------------------------------
/Notes/src/particiones_7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/particiones_7.jpg
--------------------------------------------------------------------------------
/Notes/src/particiones_8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/particiones_8.jpg
--------------------------------------------------------------------------------
/Notes/src/pgadmin_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pgadmin_1.jpg
--------------------------------------------------------------------------------
/Notes/src/pgadmin_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pgadmin_2.jpg
--------------------------------------------------------------------------------
/Notes/src/pgadmin_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pgadmin_3.jpg
--------------------------------------------------------------------------------
/Notes/src/pgadmin_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pgadmin_4.jpg
--------------------------------------------------------------------------------
/Notes/src/pgadmin_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pgadmin_5.jpg
--------------------------------------------------------------------------------
/Notes/src/pgadmin_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pgadmin_6.jpg
--------------------------------------------------------------------------------
/Notes/src/pl_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_1.jpg
--------------------------------------------------------------------------------
/Notes/src/pl_10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_10.jpg
--------------------------------------------------------------------------------
/Notes/src/pl_11.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_11.jpg
--------------------------------------------------------------------------------
/Notes/src/pl_12.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_12.jpg
--------------------------------------------------------------------------------
/Notes/src/pl_13.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_13.jpg
--------------------------------------------------------------------------------
/Notes/src/pl_14.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_14.jpg
--------------------------------------------------------------------------------
/Notes/src/pl_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_2.jpg
--------------------------------------------------------------------------------
/Notes/src/pl_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_3.jpg
--------------------------------------------------------------------------------
/Notes/src/pl_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_4.jpg
--------------------------------------------------------------------------------
/Notes/src/pl_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_5.jpg
--------------------------------------------------------------------------------
/Notes/src/pl_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_6.jpg
--------------------------------------------------------------------------------
/Notes/src/pl_7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_7.jpg
--------------------------------------------------------------------------------
/Notes/src/pl_8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_8.jpg
--------------------------------------------------------------------------------
/Notes/src/pl_9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_9.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_1.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_10.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_11.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_11.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_12.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_12.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_13.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_13.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_14.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_14.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_15.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_15.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_16.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_16.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_17.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_17.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_18.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_18.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_19.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_19.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_2.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_3.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_4.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_5.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_6.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_7.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_8.jpg
--------------------------------------------------------------------------------
/Notes/src/postgre_instal_9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_9.jpg
--------------------------------------------------------------------------------
/Notes/src/replicas_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_1.jpg
--------------------------------------------------------------------------------
/Notes/src/replicas_10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_10.jpg
--------------------------------------------------------------------------------
/Notes/src/replicas_11.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_11.jpg
--------------------------------------------------------------------------------
/Notes/src/replicas_12.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_12.jpg
--------------------------------------------------------------------------------
/Notes/src/replicas_13.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_13.jpg
--------------------------------------------------------------------------------
/Notes/src/replicas_14.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_14.jpg
--------------------------------------------------------------------------------
/Notes/src/replicas_15.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_15.jpg
--------------------------------------------------------------------------------
/Notes/src/replicas_16.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_16.jpg
--------------------------------------------------------------------------------
/Notes/src/replicas_17.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_17.jpg
--------------------------------------------------------------------------------
/Notes/src/replicas_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_2.jpg
--------------------------------------------------------------------------------
/Notes/src/replicas_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_3.jpg
--------------------------------------------------------------------------------
/Notes/src/replicas_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_4.jpg
--------------------------------------------------------------------------------
/Notes/src/replicas_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_5.jpg
--------------------------------------------------------------------------------
/Notes/src/replicas_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_6.jpg
--------------------------------------------------------------------------------
/Notes/src/replicas_7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_7.jpg
--------------------------------------------------------------------------------
/Notes/src/replicas_8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_8.jpg
--------------------------------------------------------------------------------
/Notes/src/replicas_9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_9.jpg
--------------------------------------------------------------------------------
/Notes/src/tipos_join.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/tipos_join.jpg
--------------------------------------------------------------------------------
/Notes/src/transacciones_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/transacciones_1.jpg
--------------------------------------------------------------------------------
/Notes/src/transacciones_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/transacciones_2.jpg
--------------------------------------------------------------------------------
/Notes/src/transacciones_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/transacciones_3.jpg
--------------------------------------------------------------------------------
/Notes/src/transacciones_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/transacciones_4.jpg
--------------------------------------------------------------------------------
/Notes/src/transacciones_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/transacciones_5.jpg
--------------------------------------------------------------------------------
/Notes/src/transacciones_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/transacciones_6.jpg
--------------------------------------------------------------------------------
/Notes/src/trigger_1.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_1.jpeg
--------------------------------------------------------------------------------
/Notes/src/trigger_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_1.jpg
--------------------------------------------------------------------------------
/Notes/src/trigger_10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_10.jpg
--------------------------------------------------------------------------------
/Notes/src/trigger_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_2.jpg
--------------------------------------------------------------------------------
/Notes/src/trigger_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_3.jpg
--------------------------------------------------------------------------------
/Notes/src/trigger_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_4.jpg
--------------------------------------------------------------------------------
/Notes/src/trigger_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_5.jpg
--------------------------------------------------------------------------------
/Notes/src/trigger_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_6.jpg
--------------------------------------------------------------------------------
/Notes/src/trigger_7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_7.jpg
--------------------------------------------------------------------------------
/Notes/src/trigger_8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_8.jpg
--------------------------------------------------------------------------------
/Notes/src/trigger_9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_9.jpg
--------------------------------------------------------------------------------
/Notes/src/views_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/views_1.jpg
--------------------------------------------------------------------------------
/Notes/src/views_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/views_2.jpg
--------------------------------------------------------------------------------
/Notes/src/views_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/views_3.jpg
--------------------------------------------------------------------------------
/Notes/src/views_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/views_4.jpg
--------------------------------------------------------------------------------
/Notes/src/views_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/views_5.jpg
--------------------------------------------------------------------------------
/Notes/src/views_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/views_6.jpg
--------------------------------------------------------------------------------