0% encontró este documento útil (0 votos)
10 vistas70 páginas

Ejercicios de SQL en Platzi

Este documento presenta varios ejercicios sobre consultas SQL para seleccionar datos de una tabla. En el primer ejercicio, se muestra cómo obtener el primer registro usando FETCH o LIMIT. Posteriormente, se explican formas de obtener los primeros 5 registros usando window functions, y de seleccionar el segundo valor más alto sin repeticiones. Otros ejercicios cubren extraer partes de fechas, filtrar por año, y encontrar registros duplicados.

Cargado por

Michelle Torres
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
10 vistas70 páginas

Ejercicios de SQL en Platzi

Este documento presenta varios ejercicios sobre consultas SQL para seleccionar datos de una tabla. En el primer ejercicio, se muestra cómo obtener el primer registro usando FETCH o LIMIT. Posteriormente, se explican formas de obtener los primeros 5 registros usando window functions, y de seleccionar el segundo valor más alto sin repeticiones. Otros ejercicios cubren extraer partes de fechas, filtrar por año, y encontrar registros duplicados.

Cargado por

Michelle Torres
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

EJERCICIO # 1

- En este caso se busca traer únicamente el primer registro de la tabla “[Link]”


usando FETCH.

- Es posible traer el primer registro de la tabla “[Link]” usando LIMIT.


- En este ejercicio se busca obtener los primero 5 REGISTROS USANDO WINDOW FUNCTIONS.
(Es importante dentro del FROM agregar otro SELECT.
- En la función WHERE si solo se usa “= 5” únicamente traera el dato 5, por eso se usa <=5,
para que traiga los primeros 5 datos.
- El OVER () vacío indica toda la tabla
- El FROM completo (subquery) AS alumnos_with_row_num = alumnos con número de
registro.
- Este ejercicio nos va a traer todos los alumnos con un ROW NUMBER, en este caso el row
number es igual al ID, pero puede ser igual a otros criterios si se ordena de manera distinta.

- Esta es la función para traer únicamente el primer registro, ya que se tiene un ROW ID
independiente del ID y de todos los demás campos.

EJERCICIO # 2

En este ejercicio se busca traer la colegiatura más alta, la segunda colegiatura más alta, pero no
nos interesa que este repetida múltiples veces, solamente cual es la segunda mayor.
- Se usa DISTINC porque solo nos interesan los valores distintos.
- Se le asigna el alias AS a1
- FROM la tabla que se está explorando
- WHERE con un subquery que queremos el segundo registro
- SELECT COUNT va a traer un conteo de las distintas colegiaturas, (DISTINCT va contar cuales
son las colegiaturas y contarlas una por una.
- Se le llama “a2” para diferenciarla de la tabla de arriba porque se va usar un JOIN.
- Se hace un WHERE de la tabla principal (a1) sea igual (<=) a la tabla a2, esto es como una
especia de JOIN para traer únicamente los datos que coincidan.
- La clausula sea menor o igual (<=) porque se está haciendo un conteo acumulado.

Lo anterior también se puede hacer de una forma más sencilla o más directa usando con LIMIT
y OFFSET:
- Se especifica que se ordene de manera DESC (descendiente) ya que por default se ordena
de forma ascendente, por eso es importante para de traer de mayor a menor. (Ya que nos
interesa traer la segunda mayor).
- Para traer únicamente la segunda se usa LIMIT va ser 1 porque solo nos interesa traer una
colegiatura.
- Se usa OFFSET porque se necesita la segunda mas alta. (Lo que quiere decir que necesita
brincarse 1).

Si nos interesa agregar otra variable como lo sería el tutor, el tutor que tenga la colegiatura mas
alta.
- = 20, es el tutor que se selecciono

Se puede hacer de una tercera forma usando un subquery:

- Se pone un alias datos_alumnos


- Lo que se busca es unir los datos de alumnos con esa segunda_mayor_colegiatura, por lo
cual para unirlos se usa el comando ON que nos va a decir a través de cual campo se va
hacer los JOINS, en este caso se va poner datos_alumnos que es la tabla que trae todos los
datos en su campo colegiatura.
- En este caso se traen la colegiatura mas alta y cuales son los alumnos que la tienen.
- De esta forma no se trae únicamente el número sino otros datos.

La última forma no se hará el subquery en el FROM y sino en el JOIN.

- Colegiatura =subquery, quiere decir que me traiga de [Link] todos los alumnos cuya
colegiatura sea = al resultado del subquery en este caso 4800.
Ejercicio: Traer la segunda mitad de los registros de la tabla.

- Se usa SELECT COUNT ya que nos vamos a saltar cierta cantidad de ROWS y se van a traer
los demás. Lo que va hacer este SELECT COUNT este va a contar todos los registros de la
tabla y los va a dividir en 2, y esa mitad la va usar como el OFFSET para que a partir de ahí
traiga los demás registros.
- Se usa de nuevo FROM [Link] porque se necesita que cuente los ROWS de esa tabla
para después poder sacar la mitad de esa misma tabla.
- La tabla [Link] generalmente tiene 1000 ROWS, pero como se busca solo la segunda
mitad se evidencian desde el 501 que es la segunda mitad.
EJERCICIO # 3 / SELECCIONAR DE UN SET DE OPCIONES

En este ejercicio se busca como hacer SELECT con un grupo de opciones en particular.

- A este subquery se le va a llamar alumnos_with_row_num que es la convención que se ha


seguido anteriormente.
- En este ejercicio se busca traer una serie de registros, ejemplo los alumnos que este en el
ROW ID 5, 10, 7
- Cuando son registros específicos no se puede usar LIMIT o < ,> porque son variables.
- Para hacer el SELECT en forma de arreglo se usa la cláusula IN.
- IN recibe una serie de valores separados por “,” ejemplo: IN (1,5,10,12,20) esos son los
valores que se buscan traer.

Hay otra función que simplifica lo anterior:


- WHERE va a traer los id que se encuentren en una lista en este caso la lista (1,2,3)

En este caso no sabemos cuales son los ID que nos interesan pero si sabemos cual es la consulta que
nos interesa hacer.
- Traer solo la columna ID de la tabla [Link], pero que el tutro_id = 30

- Si solo corremos el subquery solo, solo va a traer a los alumnos que tienen el tutor 30.
Ejercicio: Seleccionar los datos que no se encuentren en la lista.

- Se usa NOT ya que es una negación y en este caso se indica donde el ID no se encuentre
en: WHERE id NOT IN (…) (Todos los que estén en ese subquery no los tome en cuenta)
- Entonces se verán reflejados los datos en donde el tutor no sea 30.

Ejercicio #4 / CAMPOS DE FECHA Y HORA

- Para extraer una parte de un date time generalmente se utiliza una propiedad de SELECT
con un comando que va en conjunto con EXTRACT.
- SELECT nos ayuda a decir que queremos extraer, cual parte de las tablas.
- EXTRACT trae una parte de un campo, en este caso se va a jugar con el campo de
fecha_incorporacion.
- Para sacar el año se debe indicar que se quiere sacar de ese campo, de donde lo va a
extraer FROM. (Este FROM esta dentro del comando EXTRACT no es tabla en este caso
FROM va decir de que campo y el campo es fecha_incorporacion).
- Se pone un AS (alias) por si mas adelante se necesita hacer algún tipo de filtrado.
- Después si se usa el FROM global que es el que indica de que tabla se van a extraer los
datos.
- Este query nos va a mostrar los años de cada ROW, nos trajo el año de incorporación.

Otra forma de hacerlo es con la función DATE_PART (esta función es similar trae solo una parte de
la fecha.
Para extraer otras partes en este caso el mes y día:

- En este caso es cuando un alumno se unió a platzi o a una escuela.

Para extraer los datos de la hora, minutos, segundos:


EJERCICIO #5 / SELECCIONAR POR AÑO

En este caso se utiliza para hacer filtros y no para proyección de tablas

- Estas son las proyecciones de tablas:

Extraer datos con EXTRACT:

- En este caso se utiliza para hacer filtros y no para proyección de tablas.


- Después se filtra desde la cláusula WHERE.
- Esto nos va seguir trayendo todos los campos de la tabla sin modificar nada pero se filtra
específicamente por esta sección =2019
- Al hacer esto trae un query de 336 de 1000 registros que se tienen.
-

Otra forma de hacerlo es con DATE_PART:

Otra forma de hacer es con un subquery:


- Se le añade el DATE_PART para seleccionar el año.
- Esto se convierte en una tabla. (NOTA: Cuando se pone un subquery como en el FROM se
le debe asignar un nombre para que se pueda referenciar como tabla).

Con lo anterior se pueden hacer filtros en donde se puedan referir específicamente al año que se
está haciendo referencia.

- Se inserta un WHERE para no poner el DATE_PART se pone el AS anio_incorporacion.


EJERCICIO: EXTRAER LOS DOS CAMPOS, QUIERO SABER CUALES FUERON LOS ALUMNOS QUE SE
INCORPORARON EN MAYO DEL 2018.

EJERCICIO #6 / DOUBLE TROUBLE (DUPLICADOS)

En este caso se busca encontrar los duplicados, en este caso no existen duplicados en la tabla de
alumnos, por lo anterior se tomará le último registro y se duplicará el último registro. (Se modifica
el registro ID 1000 a 1001 para que crear el duplicado).
INSERT INTO [Link] (id, nombre, apellido, email, colegiatura, fecha_incorporacion,
carrera_id, tutor_id)

VALUES (1001, 'Pamelina', null, 'pmylchreestrr@[Link]', 4800, '2020-04-26 10:18:51', 12, 16);

Primera forma de encontrar un registro duplicado:


- Se hace un SELECT de todos porque no nos interesa filtrar columnas
- Se pone el alias “ou” porque es tabla que se encuentra out (afuera)
- Después de la sentencia WHERE hacemos un subquery otra sentencia SELECT COUNT total
(para contar) en este caso “*” porque es de todos los elementos que tengamos ahí.
- FROM [Link] pero se le pone otro AS inr (para que sepamos que es la tabla interna
que esta en el subquery.
- Después lo vamos a igualar a la tabla externa que es [Link] = [Link] esto lo que que va atratar
de hacer es tratar de seleccionar aquel registro que esta repetido en tanto al id. Al igualarlos
va a contar más de uno entonces el resultado del WHERE va ser >1.
- Normalmente todos los registros tendrían 1 porque son únicos, pero aquellos que están
repetidos van a contar más de 1 vez.
- Sin embargo, en esta propiedad al correrla nos va a regresar una tabla vacía, porque lo único
que se cambio en el registro duplicado fue el ID.
- Generalmente cuando se encuentra un registro duplicado raramente es en el ID, esto se
debe a que casi siempre el ID es un consecutivo que va cambiando que se va insertando un
nuevo registro.
- Para este caso le vamos hacer un SELECT a la tabla [Link], normalmente esto va en
el FROM pero en este caso quiero seleccionar todos lo campos de la tabla [Link] y
lo vamos a convertir en un texto.
- Los “::” es un equivalente hacer un CAST en SQL incluso en otros lenguajes es básicamente
conviérteme estos campos en un texto; después se agrega un COUNT de todo (*).
- Después los agrupamos con GROUP BY. (*) agrupar por la combinación de todos los
campos.
- Lo que nos muestra es la combinación separada por comas (,) de todos los campos como si
fuera un texto y del conteo que exite de la combinación de todos esos campos.
- Por último se filtra el HAVING (En este caso esto se ejecuta después del WHERE, por lo
anterior ejecutamos un HAVING COUNT de todo lo que sea > 1, después de esto nos debería
mostrar los registro duplicados.
- Sin embargo, se tiene nuevamente una tabla vacía.
- Procedemos hacer algo muy similar pero en este caso se le dirá que campos exactamente,
y esto se hace seleccionando un campo a la vez, se hace tanto para SELECT como para el
campo GROUP BY, donde se le mencionan los campos pero sin contar el ID.
- Al correrlo nos debe dar la concatenación de todos los campos menos el ID.
- En este caso ya se debe encontrar al menos un repetido porque se insertó a breve que
justamente era el último y nos dice que tenemos dos versiones de ella, entonces al tener
dos versiones significa que si tenemos un registro duplicado.

- La última forma de hacerlo es con subquerys que incluyen WINDOS FUNCTIONS


- El subquery lo que va a traer es un SELECT id, y después se hace un ROW_NUMBER, EL row
number es independiente del orden y de la partición, por lo cual nos va a regresar el row
number sin importar el id que justamente no se debe tomar en cuenta.
- En este caso se le va indicar que tenga OVER la siguiente estructura en este caso va ser una
PARTITION (Que es una sección de datos que obedece a ciertos criterios), la PARTITION va
incluir todos los datos menos el id.
- Se hace un ORDER BY id para tener todo en orden (ASC – ASCENDENTE).
- Y se hace un “*” FROM [Link] que es donde donde se han tomado los datos.
- Toda esta data que era el subquery se va a nombas AS duplicados.
- Finalmente ya que se tiene toda la consulta se va a filtrar WHERE [Link] (row el
que se puso arriba) sea >1, esto nos va ayudar a contar justamente aquellos que tengan más
de una repetición por partición.
- Al ejecutar este código se encuentran todos los datos del alumno que este duplicado y en
ROW nos dice cuantas veces se encuentra en nuestra tabla en este caso son dos.
EJERCICIO: HACER BORRADO DE DUPLCIADOS DE ESTA TABLA, ESTO QUIERE DECIR DEJARLA
COMO ESTABA AL PRINCIPIO.
- Solo se necesita el id (SELECT Id) y se quita la partición de todos los campos “*”.
- Y para borrarlo necesitamos una sentencia DELETE FROM [Link]
- Y ponemos una cláusula WHERE donde se limita que es lo que queremos que borre, en este
caso solo se requiriere que borre cullo id se encuentre en este arreglo IN.
- Cuando le decimos IN a un WHERE le estamos diciendo borra todo lo que tenga adentro
este subquery.
- En el subquery solo nos va a regresar el campo id.
- Si se tuvieran más duplicados se regresarían más valores, pero en este caso solo va generar
el único que se generó.

EJERCICIO #7 / SELECTORES DE RANGO.

- Los rangos son útiles para el manejo de información y ya no se verán como SETS sino como
se interrelacionan.
- Normalmente cuando se quiere seleccionar una serie de valores de la tabla se usa
SELECT,FROM, WHERE y va a traer una serie de registros.
- Lo que se esta haciendo es traer los registros cuyo tutor_id se encuentre en el rango
(1,2,3,4).
- Otra forma de hacerlo es haciendo un SELECT pero esta vez no se utiliza el rango especifico
sino que se encuentre en el rango de 1 y 10.
- En este caso nos va a traer los primero 10 tutores.
- También se puede usar BETWEEN que este entre 1 AND 10.

- Rango sin utilizar tabla, es un SELECT con una tabla que se llama INT4RANGE, en este caso
se le dice (10,20) esto lo que va hacer es generar un rango de enteros cortos por eso es el 4
es un smalling, se pueden generar entre 10 y 20. Esto quiere decir que va a generar 10, 11,
12, 13….20, y sobre ese rango le puedo decir si existe el rango 3 y como en este ejemplo no
se encuentra el rango nos regresa un FALSE.
- Si se modifica de 1 a 20, nos regresaría un TRUE.

- Se hace otro SELECT en este caso se va hacer un rango numérico (NUMRANGE), se usa un
tipo de dato con punto decima (11.1) y va a llegar hasta el 22.2
- Y que se encuentre también (&&) el numrange. En este caso cuando utilizamos el operador
“&&” (and, and) entre los dos rangos lo que estas diciendo es si se solapan estos dos rangos,
en este caso nos arroja un true.
- En este ejemplo nos regresa un FALSE porque no solapan.

- En este caos vamos hacer una función que nos traiga el valor más alto. Por ejemplo, UPPER
lo que nos va a traer el es valor más alto de un rango, y como parámetro va a recibir un
rango de entero normal que son los de 8 (int8range) y se genera un rango de 15 a 25.
- En este caso vamos a utilizar LOWER porque necesitamos el rango más bajo, y nos va
regresar en este caso el límite más bajo.
- Vamos a general un rango smallint , lo que nos va a regresar es la intersección entre ambos
rangos.
- Lo que se obtiene son los limites inferior y superior de los valores que se tienen en común.
(En este caso los valores que tienen en común son del 15 al 20).

- Otra función que se puede utilizar con rangos, es saber si ese rango es un rango vacío.
- ISEMPTY: lo que nos indica es si un rango esta vacío o no.
- En este caso el rango es del 1 al 5, si tiene valores en ella debe tener (2,3,4) por lo cual nos
regresa un FALSE, si estuviera completamente vacío nos regresaría un verdadero.

- En el WHERE podemos utilizar int4range para generar un rango (10,20), y este int4range le
- vamos a decir que si tutor_id se encuentra en ese rango lo muestre.
- Es básicamente lo que se hizo anterior, pero en este caso queremos que nos muestre el
rango de 10 a 20 pero el tutor id también se encuentra en el rango 10 a 20.

LOS TIPOS DE RANGO QUE VIENEN EN POSTGRESQL SON:

- int4range: Que trae un rango de enteros.


- int8range: Es un rango de enteros grandes.
- numrange: Es un rango numérico.
- tsrange: Es un rango del tipo timestamp pero sin la zona horaria.
- tstzrange: Es un rango del tipo timestamp con la zona horaria
- daterange: Es un rango del tipo fecha

EJERCICIO: VER LA INTERSECCION O VALORES QUE TIENEN EN COMÚN ENTRE DOS RANGOS,
EXTRAERLOS DE LA TABLA [Link], PARA VER QUE VALORES HAY EN COMÚN ENTRE
LOS ID DE TUTORES Y LOS ID DE CARRERAS.

- Para seleccionar cual es rango se harán subquerys, para empezar se hace un SELECT del MIN
tutor_id, esto nos va a traer el tutor_id más bajo que existe en cuanto a números de la tabla
FROM [Link].
- Hacemos lo mismo pero con MAX, esto lo que nos va a dar es un rango entre el MIN y el
MAX de id de tutores.
- Se hace una segunda intersección con un numrange pero esta vez se hace con el campo
carrera a través del operado ‘*’ de los rangos.
- Nos indica que los números que tienen en común tanto los tutores como las carreras en
nuestra tabla es entre el 1 y el 30.
EJERCICIO #8 / MINIMOS Y MAXIMOS

- Para sacar el MAX en una tabla, la forma más sencilla es mediante limites, en este caso nos
va a traer las fechas más antiguas.
- En este caso se usa DESC para que traiga las fechas más recientes.
- Se obtiene el MAX con LIMIT 1, con esto se trae la fecha de incorporación más reciente.

- Si se quieren agrupar y quiero saber cual es la fecha de incorporación más reciente pero por
el grupo de carreras.
- Se hace un SELECT de carrera_id que es lo que nos va a ayudar agrupar, después ponemos
MAX para que nos traiga el máximo valor de ese grupo en el campo fecha_incorporacion.
- FROM (para indicarle cual es nuestra fuente de datos).
- Después hacemos un GROUP BY y se le indica únicamente que se quiere agrupar por
carrera_id
- Finalmente se pone un ORDER BY para ver cómo se están ordenando esas carreras.
- Esto nos arroja las carreras de forma ordenada y cada carrera tiene la fecha más actual en
que un alumno se incorporo a ella, de esta forma se puede extraer cual es la carrera que
tiene la fecha de incorporación más reciente.
- LA DIFERENCIA ENTRE MAX Y LIMIT, ES QUE LIMIT TE PERMITE SACARLOS SOLAMENTE DE
LA TABLA COMPLETA Y MAX TE PERMITE JUGAR CON DIVERSOS GRUPOS Y AGRUPARLOS
POR DIVERSOS CRITERIOS.
EJERCICIO: SACAR EL MINIMO NOMBRE ALFABETICAMENTE QUE EXISTE EN NUESTRA TABLA Y SE
DEBE HACER DE LAS DOS FORMAS, SACAR EL MINIMO DE TODA LA TABLA Y HACER EL MIN POR
id_tutor.
EJERCICIO #9 / SELF JOINS

- Los self joins, es hacer un join con la propia tabla.


- Se le da un AS a la tabla (alias) tabla a.
- De la misma tabla a se seleccionará el apellido.
- Los alias nos sirven para diferenciarlos.
- Después se le dice de donde queremos sacar los datos (esa parte va en el FROM)
- Se le asigna un alias a [Link].
- Vamos hacer un INNER JOIN con la misma tabla por eso es un SELF JOIN.
- Se hace la unión (ON) a través de sus dos campos para el caso de ‘a’ que van hacer nuestros
alumnos en general va a ser a través de su llave foránea a.tutor_id y se asume que es igual
[Link] en el campo id; esto quiere decir que el id del alumno sea igual al id del tutor del otro
alumno. (A ESTO ES LO QUE SE LE CONOCE COMO UN SELF JOIN)
- Nos da como resultado el nombre del alumno primero y quien es su tutor.
- Se uso la misma tabla en ambos casos es un self join.
- CONCAT (concatenación) concatena los strings que se vayan separando con (,) dentro de los
paréntesis.
- En este caso se va a concatenar el nombre un espacio (‘ ‘) y el apellido, y se le pone un AS
en este caso se dice que la primera versión que viene de la tabla es el alumno.
- Se obtiene al alumno y al tutor con su nombre y apellido.
- Ahora que se tiene unido el alumno con el tutor se pueden agrupar todos los registros por
tutor.
- En este caso se busca saber cuantos alumnos tiene asignado cada tutor, esto para saber que
tutor tiene más carga de trabajo.
- El COUNT (*) con asterisco, es el conteo de todos los elementos que existan en la
agrupación. Se le asigna un AS alumnos_por_tutor, para saber que nos esta indicando ese
COUNT.
- Posterior a la agrupación se hace un ordenamiento, esto con el fin de saber cual es el tutor
que tiene más alumnos; y como se quiere saber cual es el mayor se hará en orden DES
(descendiente – de mayor a menor).
- Para sacar el top 10 se hace un LIMIT.

EJERCICIO: SACAR EL PROMEDIO GENERAL POR TUTOR DE ALUMNOS.

- No sirve ORDER BY tampoco LIMIT porque se necesita saber de todos los tutores sin
importar el orden en el que esten.
- Se hace AVG (average / promedio) y se le pone un AS.
- La fuente de datos ya no será directamente la tabla sino el subquerie y sele pone también
un alias en este caso será alumnos_tutor
- Nos da el promedio total de alumnos por tutor 33,3.
EJERCICIO #10/ LAS DIFERENCIAS (RESOLVIENDO LAS DIFERENCIAS)

- Las diferencias son los elementos que se encuentran en una tabla que no se encuentran en
una tabla distinta, en este caso se va usar la tabla carreras.
- Se necesita saber cuantos alumnos tenemos por carrera por eso se usa COUNT (*) que
cuenta todos los elementos que hay en ese grupo.

- Para que haya una diferencia se eliminaran algunos elementos.


- Se procede hacer el JOIN entre las dos tablas.
- Tabla carrera se abrevia con la letra “c”.
- Después se le dice de donde lo vamos a extraer, en este caso la fuente de datos son dos
tablas.
- Después hacemos un LEFT JOIN que significa que nos interesa la tabla que está a la izquierda
en este caso la primera [Link].
- ON: Se indica a través de que campo se va hacer el JOIN en este caso carreras_id de nuestra
tabla [Link] que va ser igual a la tabla carrera a su id principal.
- Se agrega una clausula (WHERE) que es lo que hace un EXCLUSIVE LEFT JOIN. Que es poner
cuando la tabla carrera id sea nulo IS NULL. (Esto quiere decir que debe traer todos los
alumnos en donde el id de carrera sea nulo). Trae los datos que se borraron anteriormente
para el ejercicio.
- Hacemos un ordenamiento por [Link] que fueron los que se borraron del lado
derecho (LEFT JOIN).
- Se evidencia que no existe ese registro por lo tanto cumple con la función. WHERE [Link] IS
NULL.
- Esto es un LEFT JOIN EXCLUSIVE.

- Solamente la parte de la primera tabla A estaba llena, pero tanto la intersección como la
tabla B no se encontraban coloreadas por lo tanto se excluían todos esos valores en común
con B y solo se sacaban los que tenían en común con A que no tenían ningún equivalente
en la tabla B. Esto es justamente de lo que se tratan las diferencias.
EJERCICIO: HACER LEFT JOIN PERO SIN EXCLUIR GENTE SE VA TRATAR DE INCLUIR LO QUE HABIA,
POR ENDE NO IMPORTA SI ESTA O NO EN LA PARTE DE LA DERECHA, SINO QUE SOLAMENTE ESTE
EN LA TABLA ALUMNOS.
- Se usa el FULL OUTER JOIN ya que sirve para traer el JOIN completo de los elementos, ya
sea que estén internamente o no, no importa que sean los comunes, sino el completo de
los que están en la intersección o no.
- A partir del ID 30 (carrera_id es la llave foránea, y el ID de la tabla carrera que es nuestra
llave principal). Es importante recordar que se borraron los elementos del ID del 30 al 40,
por lo tanto nos aparecen nulos.

- Al final de la tabla, la tabla carreras tiene carreras adicionales, se puede decir que son
carreras nuevass (las que van del 50 al 60).
- No existe ningún alumno todavía inscrito en esas carreras.
- Al usar el FULL OUTER JOIN nos trae ambas partes de ambas tablas sin importar si esta nulo,
ya sea que tengan coincidencia del otro lado.
EJERCICIO # 11 / TODAS LAS UNIONES / TODOS LOS JOINS

- En este caso vamos hacer el LEFT JOIN EXCLUSIVO y se indica la segunda tabla en este caso
carreras.
- Finalmente le decimos cual es el campo que nos permite unirlas (ON).
- Para hacerlo exclusivo agregamos la clausula WHERE.
- Nos regresa aquellos alumnos que tienen una carrera que ya no existe en la tabla carreras.
Esto es un LEFT JOIN EXCLUSIVO.
- Para a ver un LEFT JOIN INCLUSIVO o normal lo único que se debe hacer en este caso es
eliminar la ultima parte. WHERE [Link] ID NULL.
- Lo cual nos va atraer lo que corresponde al Diagrama de VENN donde esta coloreado todo
el circulo izquierdo incluyendo la intersección.
- En este caso se puede ver que trae justamente las carreras ya sea que se incluya la carrera
o no.
- LA DIFERENCIA CON LA QUE SE HABIA VISTO INICIALMENTE. Si se hace un ORDER BY, nos
arroja la parte nula pero también se tiene la parte que viene desde el 50 para bajo.
- En la parte carreras también se tenia del 50 al 60 pero como es un LEFT JOIN está excluyendo
esa parte. Ya que el LEFT JOIN trae todo lo que este del lado de la tabla alumnos ya sea que
tenga su equivalente o no en la tabla carrera. Si no existe en la tabla alumnos entonces no
está en el LEFT por lo tanto no lo trae. ESA ES LA DIFERENCIA.
- Ahora se hará el contrario, se hará un RIGHT JOIN en este caso simplemente es cambiar la
palabra LEFT por la palabra RIGHT.
- En este caso se evidencia todo lo contrario, vamos a traer las carreras sin importar si existe
un alumno para ellas o no.
- En este caso se tienen los valores del 60 al 50 porque se hizo de manera DESCENDIENTE.
Pero se tienen esos valores que no tienen ningún alumno inscrito pero que sin embargo
están a la derecha.
- Si vamos a la parte en donde queda loa diferencia entre 30 y 40, La carrera se salta del 29
al 41, porque en la tabla carrera se borraron los registros que iban del 30 al 40 porque se
supuso que esas carreras no se daban más en la facultad.
- Si se quisiera convertir este RIGHT JOIN en uno EXCLUSIVO es agregando la cláusula WHERE
y con esto se logra traer que no tienen alumnos, las que existen a la derecha pero que no
existen a la izquierda.
- Este es el JOIN mas común y es el JOIN que generalmente se ve por default. Cuando no se
especifica que tipo de JOIN se esta utilizando, simplemente se usa JOIN la mayoría de bases
de datos lo que hacen internamente es hacer un INNER JOIN.
- INNER JOIN: En el Diagrama de VENN se refiere a la parte que tienen en común ambas
tablas, esto es la parte intermedia en la que se solapan ambos círculos y eso quiere decir
INNER JOIN es el JOIN interno, lo que quiere decir los elementos que pertenecen a AMBAS
tablas.
- En este caso no se evidencian nulos en ninguno de los dos lados, se salta la parte del 30 al
40 que no tiene del lado derecho.
- Tampoco trae del 50 al 60 porque no está del lado izquierdo. SIMPLEMENTE NOS TRAEN
LAS QUE EXISTEN EN AMBAS TABLAS.
- Ahora se hará la inversa a la anterior se llama DIFERENCIA ASIMETRICA (Lo que se encuentra
en A o se encuentra en B pero no se encuentra en ambas. Para esto vamos a utilizar el FULL
OUTER JOIN (Este trae todo lo que existe en una tabla en la otra y en el medio)
- Lo que va a condicionar que sea un FULL OUTER JOIN EXCLUSIVO, por lo cual se debe usar
el WHERE y OR. Esto quiere decir que ya sea no exista en el lado izquierdo o no exista en el
lado derecho, pero no las que si existen en ambos.
- Procedemos hacer un ordenamiento por carrera esto para explorar los datos de manera
más fácil.
- Se evidencia del lado derecho del 60 al 50 que son las solo existen del lado derecho pero no
tienen su correspondiente del lado izquierdo.
- Después se evidencian del 40 al 30 que son las que se tienen del lado izquierdo, pero no
existe su correspondiente del lado derecho.
EJERCICIO: CODIGOS QUE CORRESPONDE A CADA UNO DE LOS DIAGRAMAS DE VENN.

EJERCICIO # 12 / TRIANGULANDO

- Para generar triángulos se necesita de la función LPAD.


- Lo que genera una serie de **** y después sql. (Es decir que se quiere un campo en este
caso sql, y se quiere que el campo mida forzosamente 15 espacios de cadena, ósea se quiere
que sea una cadena de 15 caracteres que diga sql, y se rellena con lo que se diga en el tercer
parámetro en este caso *.
- LPAD= Left padding. Es como agregarle acolchonamiento a la izquierda.

- También se puede con +.


- Vamos hacer un LPAD, que se llene con id.
- Se pone la clausula del id sea < 10. Cuando el id es 1 recorta sql y así sucesivamente.

- Para hacer el triangulo se reemplaza la palabra sql por *.


- También es posible hacer sin límites.
- Ahora se quiere ordenar por carrera_id.
- El triangulo es el mismo pero se encuentra desordenado.
- Para solucionar lo anterior debemos usar una windows functions ROW NUMBER, y un OVER
sin ningún parámetro lo que quiere decir que va ser un orden por defecto para toda la tabla.
- Esto nos trae la nueva columna del row_id del 1 al 5.
- Para que evidencia el triángulo usamos lpad y es necesario reemplazar para que row_id, sea
un intersect usamos un CAST.

BASES DE DATOS DISTRIBUIDAS


- Las bases de datos distribuidas son una colección de múltiples bases de datos separadas
físicamente que comunican mediante una red informática. (Es decir que no están en el
mismo sitio geográficamente).

VENTAJAS:

- Desarrollo modular (Se pueden destinar a diferentes usos o a diferentes usuarios)


- Incrementar la confiabilidad
- Mejora el rendimiento
- Mayor disponibilidad
- Rapidez de respuesta

DESVENTAJAS:
- Manejo de seguridad
- Complejidad de procesamiento (Por lo que se encuentran distribuidas)
- Integridad de datos más compleja
- Costo

Tipos de bases de datos distribuidas:

- Homogéneas: Son las bases de datos que tenemos con el mismo tipo de bases de datos,
manejador y sistema operativo. (Se considera homogénea porque todos son iguales).
- Heterogéneas: Pueden variar las bases de datos. (Puede que una base de datos este
corriendo en posgre en Windows y la otra este en posgre Linux)

Estrategias de diseño:

Cuando se piensa en una base de datos distribuida se pueden hacer de dos maneras:

- TOP DOWN: Se configura según las necesidades


- BOTTOM UP: Unir bases de datos.

Almacenamiento distribuido:

- Fragmentación: Horizontal, Vertical, Mixta

Horizontal: Se conoce como sharding, consiste en segmentar la tabla que se esta utilizando en
diferentes partes horizontales.

Vertical: Es cuando se maneja algo columnar, cuando se dividen en columnas.

- Replicación: Completa, parcial, sin replicación.

Completa: Toda la base de datos siempre esta en varias versiones, toda la información esta igual en
todas las bases de datos.

Parcial: Algunos datos están compartidos y replicados en varias zonas geográficas.

Sin replicación: No se replica ningún dato, todos los datos están completamente separados, y no
dependen del otro para sincronizar datos.

- Distribución: Centralizada, particionada, replicada.

Si se va a distribuir la base de datos desde un punto central a todas las demás, o si ya está
particionada en cada una de las diversas zonas geográficas. Replicada es tener la misma información
en todas y entre ellas se hablan para siempre tener la misma versión entre todas.

QUERIES DISTRIBUIDOS:

Los QD tienen que tomar en cuenta todos los retos a los que se enfrenta la base de datos distribuida.

También podría gustarte