“¡A respirar!, ya acabó el cardio”. JAJAJA
Introducción a SQL
Breve historia de SQL
Álgebra relacional
Instalación de la BD de ejemplo
Qué es una proyección (SELECT)
Origen (FROM)
Productos cartesianos (JOIN)
Selección (WHERE)
Ordenamiento (ORDER BY)
Agregación y limitantes (GROUP BY y LIMIT)
Ejercitando tu SQL
El primero
El segundo más alto
Seleccionar de un set de opciones
En mis tiempos
Seleccionar por año
Duplicados
Selectores de rango
Eres lo máximo
Egoísta (selfish)
Resolviendo diferencias
Todas las uniones
Triangulando
Generando rangos
Regularizando expresiones
Conceptos de SQL Avanzado
Bases de datos distribuidas
Queries distribuídos
Sharding
Window functions
Particiones y agregación
El futuro de SQL
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Israel Vázquez Morales
Aportes 62
Preguntas 3
“¡A respirar!, ya acabó el cardio”. JAJAJA
La expresión regular es la siguiente
~*'[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}'
Experimentando un poco con lpad y rpad, logre dibujar un árbol 😂 🌲
SELECT lpad('\', s.a, rpad(lpad('/', d.e, ' '), s.a, '*'))
FROM generate_series(18, 26) AS s(a),
generate_series(17,0,-2) AS d(e)
LIMIT 10;```
Interesante clase. Tiro un tip: Este símbolo ‘~’ se hace con ALT + 126.
Para los que quieran el filtrado de los ‘’@google’’
~*’[A-Z0-9._%±]+@google[A-Z0-9.-]+.[A-Z]{2,4}’
lo dijo starlord, yo le haria caso
SELECT lpad ('*', generate_series, '*')
FROM generate_series(1,10);```
Código escrito en clase😃.
select email
from platzi.alumnos
where email ~*'[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}';
-- ~*: De forma global
--[A-Z0-9.%+-]: Que vayan de la A a la Z sin contar mayúsculas o minúsculas y que vayan del 0 al 9(alfanuméricos) o que incluyan algunos caracteres como ._%+-
-- @[A-Z0-9.-]: específicamente debe existir el caracter @ y luego los demás caracteres y puede tenr . o -
-- \.[A-Z]{2,4}: termina en . y al final van de 2 a 4 caracteres max.
select email
from platzi.alumnos
where email ~*'[A-Z0-9._%+-]+@google[A-Z0-9.-]+\.[A-Z]{2,4}';
-- filtrar correos de google
Dato: La expresión que va dentro de las comillas no debe tener espacios.
Expresiones regulares será uno de mis próximos cursos, es clave para el análisis de textos.
No pude hallarlo en SQL Server.
¿Alguien pudo realizar el código en SQL Server?
Si a alguien le interesa esta es la expresión regular completa para generar números realistas de teléfonos de Estados Unidos:
[2-9][0-9]{2}-[2-9][0-9]{2}-[0-9]{4}
Regularizando expresiones
Permiten insertar una lógica extensa y compleja de manera sencilla
SELECT email
FROM platzi.alumnos
WHERE email ~*'[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}';
Ejercicio de la clase anterior:
select lpad('*', s.a, '*')
from generate_series(1, 15) AS s(a);
Las expresiones regulares son tremendamente utiles, solamente pensando en los correos, podemos saber de que pais es cada usuario añadiendo un Group by por (.co, .ar, .mx, .ru, etc), esta ha sido la clase que mas me llamo la atencion de lo que va hasta ahora.
ya soy fit?
Este fue el código que se me ocurrió:
SELECT lpad('*', a.id, '*'), s.a
FROM platzi.alumnos AS a
INNER JOIN generate_series(0, (SELECT COUNT(*) FROM platzi.alumnos)) AS s(a)
ON s.a = a.id
LIMIT 30;
Las expresiones regulares son patrones que se utilizan para buscar y manipular texto. Usar expresiones regulares en SQL, específicamente con la función REGEXP o SIMILAR TO, dependiendo del sistema de gestión de bases de datos que estés utilizando.
-- En PostgreSQL utilizando REGEXP
SELECT *
FROM platzi.alumnos
WHERE nombre ~ '^A';
-- En MySQL utilizando REGEXP
SELECT *
FROM platzi.alumnos
WHERE nombre REGEXP '^A';
Para los que usan MySQL Worbench, pueden utilizar el siguiente código:
SELECT email
FROM platzi.alumnos
WHERE email REGEXP ‘[A-Z0-9._%±]+@[A-Z0-9.-]+.[A-Z]{2,4}’;
Ahora las terminaciones de dominio (.com, .travel, .info, .club, .cloud) no son más 2 a 4, pueden ser más extensos. Ojo ahí. Poco comunes, pero los hay.
Curso de expresiones regulares terminando éste 👾
s
sq
sql
sql*
sql**
sql***
sql****
sql*****
sql******
sql*******
(11 filas)
-- Join con secuencia --
SELECT a.id,
a.nombre,
a.apellido,
a.carrera_id,
s.a
FROM platzi.alumnos AS a
INNER JOIN generate_series(0,10) AS s(a)
ON s.a = a.carrera_id
ORDER BY a.carrera_id;
-- reto solucion
WITH RECURSIVE Triangulo AS (
SELECT 1 AS nivel, 1 AS valor
UNION ALL
SELECT t.nivel + 1, t.valor + 1
FROM Triangulo t
WHERE t.nivel < 30 -- Puedes ajustar el número de niveles
)
SELECT
LPAD('', (30 - nivel) * 3, '* ') || array_to_string(ARRAY(SELECT valor FROM Triangulo WHERE nivel = t.nivel), ' ') AS fila
FROM Triangulo t
ORDER BY t.nivel DESC;
La consulta final utiliza LPAD para agregar espacios en blanco al principio de cada fila y array_to_string para concatenar los valores de cada
https://platzi.com/blog/como-funcionan-expresiones-regulares/
ordinality hace casi la misma acción que un SELECT ROW_NUMBER. Aquí mi código:
SELECT *, ROW_NUMBER() OVER() AS row_id
FROM generate_series (10,2,-2)
En MySql, para el uso de expresiones regulares, se utiliza el comando regexp “aquí el patrón”. en este caso para el email quedaría así.
select email, row_number() over()
from alumnos
where email regexp "[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}";
**ESTO ES UNA ESCARMUZA… prender un cigarro AHORA VIENE LA GUERRA. **
Yo lo hice de esta manera:
SELECT lpad('*', t.s, '*')
FROM platzi.alumnos AS a
INNER JOIN generate_series(0, 20) AS t(s)
ON t.s = a.id
WHERE t.s <= 10;
Es muy importante las expresiones regulares sobre todo para manipulacion de datos de tipo String , en mi caso para agilizar las busquedas usaria un like
SELECT email
FROM alumnos
WHERE email LIKE '%@google%'
En la ultima expresión regular de la clase donde se buscan los correos @google, el resultado no muestra todos los correos de google que hay en la tabla.
La expresión regular
'[A-Z0-9._%+-]+@google[A-Z0-9.-]+\.[A-Z]{2,4}'
indica que debe existir al menos un caracter despues de la palabra google y antes del dominio.
Para obtener todos los correos de google la expresión regular debe permitir que tenga o no caracteres despues de la palabra google. Se logra cambiando el ˝+˝ por un ˝?˝. Quedando la expresion regular:
'[A-Z0-9._%+-]+@google[A-Z0-9.-]?\.[A-Z]{2,4}'
SELECT lpad(’’,generate_series(1,10),’*’);
sirve mi codigo?
– GENERAR UN TRIANGULO A TRAVÉS DE GENERATE_SERIES
SELECT LPAD(‘HOLA’, CAST(PLOX.A AS INTEGER), ‘*’)
FROM (
SELECT DISTINCT S.A
FROM PLATZI.ALUMNOS AS A
INNER JOIN GENERATE_SERIES(0, 100) AS S(A)
ON S.A = A.CARRERA_ID
ORDER BY S.A
) AS PLOX;
Excelente cardio!!
Si en una vista se desea ocultar el nombre de usuario en la dirección de correo electrónico se podría usar regex y lpad
así:
SET search_path = 'platzi';
SELECT lpad((regexp_matches(email, '^(.*)(@.*)$'))[2], LENGTH(email), '*') AS token_email FROM alumnos;
puro cardio en zona 1-2 jajaja
Solucion al reto anterior, utilizando ORDINALITY para crear una columna con numeros ordinales, y que se puede utilizar dentro de la funcion lpad
SELECT lpad('*',ordinality::int,'*')
FROM generate_series(100,2,-2) WITH ORDINALITY
Las expresiones regulares se van a utilizar para hacer un filtrado de datos.
Empiezan con ~*
-- Va a filtrar todos los emails de acuerdo al sig. patron
SELECT email FROM platzi.alumnos
WHERE email ~*'[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}';
-- Nos trae filtrado la palabra 'google'
SELECT email FROM platzi.alumnos
WHERE email ~*'[A-Z0-9._%+-]+@google[A-Z0-9.-]+\.[A-Z]{2,4}';
Aquí mi solución 😃!
SELECT LPAD('*', a,'*')
FROM generate_series(1,5) AS s(a)
En la última parte no aparecen todos los correos '…@google…'
Para que arroje todos los correos que sean @google yo borré la última parte de la expresión regular.
(Me arrojó 34 rows)
SELECT email
FROM platzi.alumnos
WHERE email ~*'[A-Z0-9._%+-]+@google[A-Z0-9.-]';
Don’t get discourage! ya casi terminamos:)
–RETO: GENERANDO RANGOS CON LPAD:
SELECT lpad('*', carrera_id, '*')
FROM platzi.alumnos AS a
INNER JOIN generate_series(0,100, 10) AS s(a)
ON s.a = a.carrera_id
ORDER BY a.carrera_id ASC;
RETO CLASE PASADA
SELECT lpad (’*’, s.a, ‘-’)
FROM generate_series(1,15) AS s(a);
Mi propiesta de solución a la prueba del ejercicio anterior fue la más sencilla que se me ocurrió, quedo abierto a sus comentarios.
SELECT lpad('*',generate_series(1,10),'*')
**El resultado que obtuve fue: **
Ahí va el reto de mi parte
SELECT rpad('HOLA',n.id,';)')
FROM generate_series(1,100,1) AS n(id)
SELECT lpad(’’, generate_series(1,5),’’)
select lpad(’’,generate_series(1,10),’’)
No entendí nada jejejejeje
SELECT
alumnos.id,
CONCAT(alumnos.nombre, ' ', alumnos.apellido) as nombre,
alumnos.fecha_incorporacion as fechaOriginal,
alumnos.nroDiasIncremento AS Incremento,
(alumnos.fecha_incorporacion + alumnos.nroDiasIncremento) as nuevaFecha
FROM
(SELECT
id,
nombre,
apellido,
CAST(fecha_incorporacion AS DATE) AS fecha_incorporacion,
CAST((SELECT MAX(s.dias) FROM generate_series(1, alumnos.id) AS s(dias)) AS int) as nroDiasIncremento
FROM alumnos) as alumnos
ORDER BY alumnos.id
Una vez puse mi correo electrónico en mayúsculas para entrar a platzi y me salió que no estaba registrado. Esta es una falla que ocurre aquí.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?