¡Hola! Dejo por aqui la lista de sentencias SQL que compilé a lo largo del curso.
.
¡Mucho éxito en tus estudios!
" * " (asterisco)
significa todo el contenido (alt+42)
.
Ejemplo:
SELECT *
FROM people;
Selecciona todos los campos de la tabla people.
.
`` (acento grave)
Lo que esté encerrado entre estos se evalúa como un schema, tabla, o columna (alt+96)
.
Ej:
`people`
’…’ (apostrofes simple)
Lo que esté encerrado entre estos se evalúa como una string de texto.
.
Ej:
'Manuel'
Insertar notas en un archivo .sql
Se pueden insertar comentarios simples en una línea empezandola con “–” (dos guiones)
.
Ejemplo:
--Comentario
Tambien es posible insertar notas más largas y complejas en un documento .sql cuando lo encierras entre “/* … */”
.
Todas las líneas dentro de estos códigos se leen como comentarios.
.
Ejemplo:
/*Comentarios 1
Comentarios 2
Comentarios 3
*/
<h1>2. Tipos de datos</h1>
Texto
1. CHAR(n): almacena caracteres y cadenas de caracteres del tamaño que indiques (ej: 8 caracteres) OJO: estrictamente el tamaño que le indiques.
.
2. VARCHAR(n): Almacena caracteres y cadenas de caracteres de cualquier tamaño dentro del límite máximo que especifiques, o 255 caracteres. (OJO: puede almacenar menos, pero solo hasta el máximo que indiques)
.
3. TEXT: Almacena cadenas de texto muy largas, mayores a 255 caracteres.
.
Números (puedes operar con ellos)
1. lNTEGER: Enteros
1.1 BIGINT: Enteros muy muy grandes
1.2 SMALLINT: Enteros muy pequeños (<99) (usarlos mejora el performance)
.
2. DECIMAL(n, s): Decimales. n=parte entera. s=parte decimal.
.
3. NUMERIC(n, s): Números mas complejos. n=parte entera. s=parte decimal.
Fecha/hora
1. DATE: contiene año, mes y día.
.
2. TIME: Hora del día.
.
3. DATETIME: Fecha y hora del día
.
4. TIMESTAMP: Fecha y hora del día cuando algo ocurrió.
Lógicos
1. BOOLEAN: 1 o 0. Si o no. Cierto o falso.
Son reglas que aplican a los campos de tu base de datos.
.
NOT NULL: Obliga a que los registros no puedan ser 0.
.
UNIQUE: Obliga a que el registro sea unico y no una repetición de uno anterior.
.
PRIMARY KEY: Combina NOT NULL con UNIQUE. Este ayuda a hacer relaciones entre entidades.
.
FOREIGN KEY: Toma los valores PRIMARY KEY de otra tabla para crear una relación entre ellas.
.
CHECK: Asegura que el campo cumpla una condición dada por ti.
.
DEFAULT: Coloca un valor por defecto cuando no hay un valor especificado. El preestablecido siempre suele ser Nulo, pero puedes cambiarlo.
.
INDEX: Se crea por columna para permitir busquedas mas rapidas. El index por defecto suele ser la primary key.
.
Ojo, INDEX hace lenta la base de datos cuando ingresas datos. Es de mucha utilidad si constantemente sacas información de la base de datos, pero no ingresas datos casi nunca.
.
Evitalas si ingresas datos muy seguido y casi no sacas información.
CREATE DATABASE
Se utiliza para crear bases de datos
.
Ojo, SCHEMA es la representación estructural de una base de datos.
.
Dependiendo del cliente gráfico, puedes usar CREATE SCHEMA en lugar de CREATE DATABASE.
.
Ojo, luego de crear una, es posible que tengas que actualizar el navegador del cliente grafico para visualizarla.
.
Escritura:
CREATE DATABASE + Database-name + complementos + ;
Complementos
1. “DEFAULT CHARACTER SET utf8”
Ejemplos
CREATE DATABASE test_db;
CREATE DATABASE test_db
DEFAULT CHARACTER SET utf-8;
USE DATABASE
Declara a la base de datos que indiques a continuación como la base de datos por defecto.
.
Esto se usa para no tener que repetir el nombre de tu base de datos en cada uno de los comandos que ingresas.
.
Ojo, esto es importante en el ambiente de consola. Necesitas usarlo para que la terminal sepa a cual base de datos aplicar tus comandos.
.
Escritura
USE + database-name + “;”
.
Ejemplo
USE hurdles_practicedb;
CREATE TABLE
Se utiliza para crear tablas donde almacenar información.
.
Al usarlo se declara la tabla, el nombre de sus columnas, el tipo de dato a almacenar, y el constraint.
.
Escritura
CREATE TABLE table-name (
Campo1 data-type constraint(limits),
Campo2 data-type constraint(limits),
PRIMARY KEY (id)
);
Ejemplo
CREATE TABLE people (
person_id int,
last_name VARCHAR(255),
first_name VARCHAR(255),
address varchar(255),
city VARCHAR(255),
PRIMARY KEY (person_id)
);
Agregar llaves foraneas
Para agregar llaves foraneas durante la creación de una tabla, se anexa una sentencia constraint con el nombre de la relación, y luego se define el campo que será llave foranea, su referencia externa, y las acciones a tomar on update y on delete.
.
De igual forma, donde se colocan llaves foraneas se suelen colocar tambien indices (INDEX).
.
Ojo, esto es más sencillo de construir en un cliente grafico como MySQL workbench.
.
Ejemplo:
CREATE TABLE `hurdlesdb`.`locations` (
`ID` INT NOT NULL AUTO_INCREMENT,
`landID` INT NULL,
`name` VARCHAR(70) NOT NULL,
`description` TEXT NULL,
PRIMARY KEY (`ID`),
INDEX `lands_locations_idx` (`landID` ASC) VISIBLE,
CONSTRAINT `lands_locations`
FOREIGN KEY (`landID`)
REFERENCES `hurdlesdb`.`lands` (`ID`)
ON DELETE NO ACTION
ON UPDATE CASCADE
);
CREATE VIEW
Se utiliza para crear queries preestablecidos para visualizar información de la base de datos, sin necesidad de escribir el código de nuevo.
.
Ojo, por buenas practicas, el nombre de los views suele empezar por “v_” para diferenciarlos de las tablas.
.
OJO, Puedes cambiar la sentencia CREATE VIEW por CREATE OR REPLACE VIEW para modificar un view.
.
Escritura
CREATE VIEW v_view-name AS
query
;
Ejemplo
CREATE VIEW v_brazil_customers AS
SELECT customer_name, contact name
FROM customers
WHERE country = "Brazil"
;
<h3>ALTER TABLE</h3>
Se utiliza para alterar los campos de una tabla.
.
Se usa de tres formas:
.
ADD COLUMN
Agrega columnas a una tabla que ya existe.
Ejemplo
ALTER TABLE people
ADD COLUMN nationality VARCHAR(75)
AFTER city
;
Inserta una columna a la tabla “people” justo despues de la columna “city”.
.
La nueva columna se llamará “nationality”, será de tipo VARCHAR(75) y no tendrá constraint.
.
CHANGE COLUMN
Cambia los parametros de una columna
.
Ejemplo
ALTER TABLE people
CHANGE COLUMN nationality country
;
Cambia el nombre de la columna “nationality” por “country”
.
Ojo, tambien puedes cambiar los tipos de datos y constraints:
ALTER TABLE people
CHANGE COLUMN nationality country VARCHAR(45) NOT NULL
;
DROP COLUMN
Borra columnas
.
OJO, PELIGRO, EJECUTAR CON CUIDADO CUANDO ESTES TRABAJANDO.
.
Ejemplo
ALTER TABLE people
DROP COLUMN prueba
;
Borra la columna “prueba” de la tabla “people”
.
DROP TABLE
Borra una tabla entera
.
OJO, PELIGRO, EJECUTAR CON CUIDADO CUANDO ESTES TRABAJANDO.
.
Ejemplo
DROP TABLE people;
DROP DATABASE/SCHEMA
Borra toda una base de datos.
.
OJO, PELIGRO, EJECUTAR CON CUIDADO CUANDO ESTES TRABAJANDO.
.
Ejemplo
DROP SCHEMA platzi_tests;
<h1>5. Sentencias DML (Data manipulation Language)</h1>
INSERT INTO
Inserta información en una tabla.
.
Ojo, los valores se insertan encerrados entre apostrofes " ’ " (alt+39)
.
OJO, los espacios que dejes vacíos se guardaran con valor NULL.
.
Escritura
INSERT INTO tabla (
Campo1,
Campo2,
)
VALUES (
Valor1
Valor2
)
;
Ejemplo
INSERT INTO people (
last_name,
First_name,
Address,
City
)
VALUES (
'Hernández',
'Laura',
'Calle 21',
'Monterrey'
)
;
UPDATE
Actualiza registros ya existentes en la base de datos.
.
Para usarla, debes tambien usar SET para indicar el nuevo valor, y WHERE para ubicar los registros que se van a actualizar.
.
OJO, ADVERTENCIA, si no indicas un where, entonces se actualizarán todos los registros de la tabla.
.
Ejemplo 1
UPDATE people
SET last_name = 'chávez', city = 'Mérida'
WHERE person_id = 1
;
Actualiza en la tabla people todos los registros donde person_id = 1; y actualiza el contenido del campo last_name
a “Chavez” y el contenido de city
a “mérida”.
.
Ejemplo 2
UPDATE people
SET nationality = 'Brazilian'
WHERE country = 'Brazil'
;
Actualiza la tabla people de modo que todos los registros que tengan country
= “Brazil” ahora tambien tengan nationality
= “Brazilian”.
.
DELETE
Borra los registros que indiques a continuación.
.
Esta se debe usar en conjunto con FROM para indicar la tabla donde se borraran registros, y WHERE para identificar los registros a borrar.
.
OJO, ADVERTENCIA, No usar WHERE puede resultar en borrar todos los registros de una tabla.
.
Ejemplo
DELETE FROM people
WHERE person_id = 1;
<h1>6. Opciones al usar llaves foraneas</h1>
Cuando creas una Foreign key, tienes que declarar algunas opciones:
.
On update
Estas se ejecutan cuando ocurre una actualización en la llave foranea.
1. No action: no ocurre nada cuando hay un cambio en la tabla de origen.
.
2. Cascade: cuando hay un cambio en la tabla origen, entonces la tabla destino se actualiza con la información nueva.
.
3. Set null: cuando haya un cambio en la tabla origen, su valor en la tabla destino se convierte en nulo.
.
4. Restrict: Hace que los datos en la tabla origen no puedan ser modificados.
.
On delete
Estas se ejecutan cuando el registro en la tabla original es borrado.
.
1. No action: nada cambia en la tabla destino cuando el registro de la tabla origen es borrado.
.
2. Cascade: borra el registro en la tabla destino cuando borren su registro asociado en la tabla origen.
.
3. Set null: hace que el valor destino se convierta en nulo cuando borren el registro asociado en la tabla origen.
.
4. Restrict: Hace que los registros asociados en la tabla origen no puedan ser borrados.
La estructura básica de query es la siguiente:
.
SELECT: Lo que quieres mostrar.
FROM: De donde voy a tomar los datos
WHERE: Los filtros de los datos que quieres mostrar
GROUP BY: Los rubros por los que me interesa agrupar la información
ORDER BY: El orden en que quiero presentar mi información.
HAVING: Los filtros que quiero que mis datos agrupados tengan.
.
Ejemplo
SELECT city, COUNT(*) AS total
FROM people
WHERE active = true
GROUP BY city
ORDER BY total DESC
HAVING total >= 2
;
Muestra dos columnas: city y total. Ambas salen de la tabla people, pero solo se toman en cuenta las que sean “true” en la columna active
.
.
“total” cuenta el número de registros en city
y los agrupa por los valores presentes en city
.
Los registros resultantes se ordenan en orden decreciente, y solo se muestran los valores que tengan total
>= 2.
.
CREATE VIEW
Se utiliza para crear queries preestablecidos para visualizar información de la base de datos, sin necesidad de escribir el código de nuevo.
.
Ojo, por buenas practicas, el nombre de los views suele empezar por “v_” para diferenciarlos de las tablas.
.
OJO, Puedes cambiar la sentencia CREATE VIEW por CREATE OR REPLACE VIEW para modificar un view.
.
Escritura
CREATE VIEW v_view-name AS
query
;
.
Ejemplo
CREATE VIEW v_brazil_customers AS
SELECT customer_name, contact name
FROM customers
WHERE country = "Brazil"
;
AS
Es una forma de definir un Alias. Se utiliza para dar nombres personalizados a los campos que aparecerán en el query.
.
Ojo, estos alias pueden utilizarse para simplificar nombres a fin de simplificar la escritura de un query.
.
Ejemplo 1
SELECT título AS encabezado
FROM platziblog.posts;
Esto trae los registros en el campo “titulo” y los llama “encabezado” en el reporte.
.
Ejemplo 2
SELECT c.nombre_categoria, COUNT(*) AS cant_posts
FROM categorias AS c
INNER JOIN posts AS p ON c.id = p.categoria_id
GROUP BY c.id
ORDER BY cant_posts DESC
;
cuenta el número de posts asignados en cada categoria. Este ejemplo renombra categorias
como c
y posts
como p
para simplificar el código.
.
SELECT
Selecciona los datos que van a aparecer como resultado en el query.
.
Puedes seleccionar multiples campos al separarlos entre si con una coma (" , ").
.
Ojo, no debe haber una " , " antes del FROM.
.
Ojo, puedes emplear funciones en el SELECT para generar columnas calculadas en el Query final
.
Ojo, no deben haber espacios entre las funciones y el parentesis que contiene sus parametros. COUNT() está bien, pero COUNT () dará error.
.
Ejemplo 1
SELECT título AS encabezado, usuario
FROM posts;
Muestra las columnas titulo
y usuario
de la tabla posts
como resultado del query.
.
La columna titulo
aparecerá con el nombre encabezado
.
Ejemplo 2
SELECT COUNT(*) AS numero_posts
FROM posts;
El query muestra un campo único que cuenta el número de registros en la tabla posts. (Y como no hay agrupación, solo aparece una celda con el conteo total).
.
Indica la tabla de donde saldrán los datos del query.
.
Ojo, puedes sacar los datos de multiples tablas combinando FROM con la sentencia JOIN. Esto es util cuando usas llaves foraneas.
.
Ejemplo
SELECT título AS encabezado, usuario
FROM posts;
<h3>JOIN</h3>
Es una sentencia que se usa en conjunto con FROM. Esta permite que tus queries tomen datos de múltiples tablas a la vez.
.
JOIN, por definición, une las tablas para crear una gran piscina de datos de donde tomarás lo que necesitas para el query.
.
Ojo, Hay varios tipos de JOIN:
.
LEFT JOIN y RIGHT JOIN
La sentencia LEFT JOIN toma los datos de la tabla que indicas luego de escribir FROM, y considera su intersección con la que indicas luego del JOIN.
.
En cambio, RIGHT JOIN toma los datos de la tabla que indiques luego del JOIN, y considera su intersección con la que indicas luego del FROM.
.
Ejemplo LEFT JOIN con intersección
SELECT *
FROM usuarios
LEFT JOIN posts
ON usuarios.id = posts.usuario_id;
Genera una vista que muestra todos los usuarios a la izquierda y todos sus posts asociados a la derecha. Incluso carga uno que no tienen ningun post a su nombre.
.
Ejemplo LEFT JOIN sin intersección
SELECT *
FROM usuarios
LEFT JOIN posts
ON usuarios.id = posts.usuario_id
WHERE posts.usuario_id IS NULL;
Genera una vista que solo muestra los usuarios que no han hecho ningun post.
.
Ejemplo RIGHT JOIN con intersección
SELECT *
FROM usuarios
RIGHT JOIN posts
ON usuarios.id = posts.usuario_id
Genera una vista que muestra todos los post a la derecha, y los usuarios que los escribieron a la izquierda. Incluso muestra si hay posts que no tienen usuarios a su nombre.
.
Ojo, esta vista se centra en los posts, aún cuando se muestran a la derecha.
.
Ejemplo RIGHT JOIN sin intersección
SELECT *
FROM platziblog.usuarios
RIGHT JOIN platziblog.posts
ON platziblog.usuarios.id = platziblog.posts.usuario_id
WHERE platziblog.posts.usuario_id IS NULL;
Muestra solo los posts que no tienen ningun usuario asociado.
.
INNER JOIN
Trae solo los datos que forman la intersección de las dos tablas
.
Ejemplo
SELECT *
FROM platziblog.usuarios
INNER JOIN platziblog.posts
ON platziblog.usuarios.id = platziblog.posts.usuario_id
Trae todos los valores de ambas tablas que estén relacionados entre si.
.
Este suele ser el JOIN más utilizado, seguido por LEFT y RIGHT.
.
OUTER JOIN
Trae los datos completos de ambas tablas.
.
Ojo, algunos RDBMS tienen una función llamada FULL OUTER JOIN que simplifica esta sentencia. Pero no es estandar.
.
Para ejecutarlo del modo estandar, un outer JOIN se ejecuta al unir un LEFT JOIN con un RIGHT JOIN a través de la sentencia UNION.
.
Ejemplo FULL OUTER JOIN
SELECT *
FROM platziblog.usuarios
FULL OUTER JOIN platziblog.posts
ON platziblog.usuarios.id = platziblog.posts.usuario_id
Ejemplo estandar
SELECT *
FROM platziblog.usuarios
LEFT JOIN platziblog.posts
ON platziblog.usuarios.id = platziblog.posts.usuario_id
UNION
SELECT *
FROM platziblog.usuarios
RIGHT JOIN platziblog.posts
ON platziblog.usuarios.id = platziblog.posts.usuario_id;
Ejemplo OUTER JOIN sin incluir la intersección
SELECT *
FROM platziblog.usuarios
LEFT JOIN platziblog.posts
ON platziblog.usuarios.id = platziblog.posts.usuario_id
WHERE platziblog.posts.usuario_id IS NULL
UNION
SELECT *
FROM platziblog.usuarios
RIGHT JOIN platziblog.posts
ON platziblog.usuarios.id = platziblog.posts.usuario_id
WHERE platziblog.posts.usuario_id IS NULL;
Al indicar que traiga todo lo que tenga llave foranea nula, este query trae todo lo que no esté conectado entre si.
.
UNION
Permite combinar querys para obtener una sola vista compuesta con columnas de diferentes tablas.
.
Esta se usa principalmente para hacer OUTER JOIN.
.
Ejemplo
SELECT *
FROM platziblog.usuarios
LEFT JOIN platziblog.posts
ON platziblog.usuarios.id = platziblog.posts.usuario_id
UNION
SELECT *
FROM platziblog.usuarios
RIGHT JOIN platziblog.posts
ON platziblog.usuarios.id = platziblog.posts.usuario_id;
<h3>WHERE</h3>
Se utiliza durante el query para filtrar las tablas origen de los datos, con el fin de que datos no deseados se queden fuera query.
.
Esta puede emplear condiciones con funciones, condiciones númericas númericas (=, >, <, etc.), y filtrar strings. Tambien se utiliza en conjunto con las sentencias LIKE, BETWEEN, IS NULL y IS NOT NULL.
.
Ojo, cuando quieres filtrar fechas, estas se manejan como strings (es decir, entre comillas “”), pero los comandos se interpretan de la manera correcta.
.
las fechas se escriben año-mes-dia + hora. Puedes ser tan especifico como desees en el tiempo.
.
OJO, WHERE no funciona para filtrar agrupaciones que creas en un query. Solo aplica filtros en la tabla de origen.
.
Ojo, se pueden unir varias condiciones con la sentencia AND.
.
Ejemplo filtro númerico
SELECT *
FROM platziblog.posts
WHERE id <= 50;
Muestra solo los posts cuyo ID sea menor o igual a 50.
.
Ejemplo filtro de string
SELECT *
FROM platziblog.posts
WHERE platziblog.posts.estatus != "activo";
Muestra los valores que no tengan la palabra “activo” en el campo estatus.
.
Ejemplo con fechas
SELECT *
FROM platziblog.posts
WHERE platziblog.posts.fecha_publicacion > "2025-3";
Esto trae los post publicados despues del 1ro de marzo del 2025
.
Ejemplo con funciones
SELECT *
FROM platziblog.posts
WHERE month(platziblog.posts.fecha_publicacion) = "04"
;
LIKE
Se utiliza para filtrar en busca de partes de un string.
.
Esta sentencia se usa en conjunto con “%%” del siguiente modo:
.
LIKE “%escandalo”: filtra lo que termine en la palabra “escandalo”.
.
LIKE “Escandalo%”: Filtra lo que empiece por la palabra escandalo.
.
LIKE %escandalo%: Filtra por lo que sea que tenga escandalo en alguna parte del string.
.
Ejemplo
SELECT *
FROM posts
WHERE posts.titulo LIKE "%escandalo%";
Trae los posts que tengan la palabra escandalo en el titulo.
.
BETWEEN… AND
Ayuda a filtrar entre un valor y otro. Funciona para números, fechas, y algunas funciones.
.
Ejemplo BETWEEN con fechas:
SELECT *
FROM posts
WHERE posts.fecha_publicacion
BETWEEN "2025-01-01" AND "2025-12-31";
Ejemplo funciones 1
SELECT *
FROM posts
WHERE YEAR (posts.fecha_publicacion)
BETWEEN "2023" AND "2024";
Trae los posts publicados entre el 2023 y el 2024
.
IS (NOT) NULL
Puedes plantear que la condición en un WHERE sea que un valor sea nulo, o no nulo.
.
Sin embargo, NULL es un estado que existe cuando el campo está vacío. No es igual a “0”, no es un string, simplemente es un valor vacío. Y escribir algo como “= NULL” causa un error.
.
Para escribir está condición, se debe escribir IS NULL o IS NOT NULL.
.
Ejemplo IS NULL
SELECT *
FROM posts
WHERE posts.usuario_id IS NULL
;
Muestra los posts que no tengan un usuario asociado.
.
Ejemplo IS NOT NULL
SELECT *
FROM posts
WHERE posts.usuario_id IS NOT NULL;
Muestra los posts que tienen usuarios asociados
.
AND
Se usa en conjunto con WHERE, y se utiliza para aplicar varios filtros a la tabla donde se obtienen los datos.
.
Ojo, se puede usar esta sentencia para aplicar tantos filtros como necesites.
.
Ejemplo
SELECT *
FROM platziblog.posts
WHERE usuario_id IS NOT NULL
AND estatus = "activo"
AND id < 50
;
Muestra los posts que tienen un usuario asociado, que estan activos y que tengan un id menor a 50.
.
Agrupa los resultados del query según los valores del campo que indiques.
.
Se usa en conjunto con ORDER BY y HAVING para ordenar los resultados finales.
.
Ejemplo 1
SELECT estatus, COUNT(*) AS post_quantity
FROM platziblog.posts
GROUP BY estatus
;
Esto cuenta cuantos posts están activos y cuantos están inactivos.
.
Ejemplo 2
SELECT YEAR(fecha_publicacion) AS post_year,
COUNT(*) AS post_quantity
FROM posts
GROUP BY post_year
;
Cuenta la cantidad de posts publicados por año.
.
Ejemplo 3
SELECT MONTHNAME(fecha_publicacion) AS post_month,
COUNT(*) AS post_quantity
FROM posts
GROUP BY post_month
;
Cuenta el número de posts publicados por mes (incluye todos los años)
.
Ejemplo 4
SELECT estatus, MONTHNAME(fecha_publicacion) AS post_month,
COUNT(*) AS post_quantity
FROM platziblog.posts
GROUP BY estatus, post_month
;
Cuenta los posts publicados cada mes (incluye todos los años) y los agrupa por estatus y por el nombre del mes.
.
ORDER BY
Ordena los datos de la columna que indiques en orden ascendente o descendente.
.
• ASC sirve para ordenar de forma ascendente
• DESC Sirve para ordenar de forma descendente
.
Tambien puede usarse en conjunto con la sentencia LIMIT para limitar el número de registros que se mostraran en el query.
.
Ejemplo 1
SELECT *
FROM posts
ORDER BY fecha_publicacion ASC
;
Ordena los posts por fecha de publicación desde el más antiguo al más reciente.
.
Ejemplo 2
SELECT *
FROM posts
ORDER BY fecha_publicacion DESC
LIMIT 5
;
Muestra los 5 posts más recientes.
.
LIMIT
Limita el número de registros extraidos en el query al número de indiques.
.
Esto es bueno para filtrar cosas como un Top 10, o simplemente para limitar los registros a solo los más relevantes.
.
Ejemplo
SELECT *
FROM posts
ORDER BY fecha_publicacion DESC
LIMIT 5
;
Muestra los 5 posts más recientes
.
HAVING
Se usa exactamente igual a WHERE y tiene la misma función. Sin embargo, mientras que WHERE solo filtra las tablas de origen, HAVING filtra los registros resultantes den query.
.
Se utiliza luego del GROUP BY para trabajar con campos y agrupaciones nuevas que creamos en el query.
.
Ejemplo 1
SELECT
MONTHNAME(fecha_publicacion) AS post_month,
estatus,
COUNT(*) AS post_quantity
FROM posts
GROUP BY
estatus,
post_month
HAVING post_quantity > 1
ORDER BY post_month ASC
;
Muestra solo los meses con más de 1 post, y los ordena de menor a mayor
.
NESTED QUERIES (Queries anidados)
Literalmente significa hacer un query dentro de otro query.
.
Esto puede usarse para combinar las columnas de dos queries distintos, para usar el primer query como entrada para el segundo, entre otras.
.
OJO, los nested queries traen complicaciones de peso y carga.
.
Es decir, cuando se insertan datos en las tablas, esto modifica al primer query, y por ende luego modifica al segundo.
.
Esto crea una cadena de operaciones que se vuelve más grande entre más crece el número de registros en tu base de datos. Y, como consecuencia, consume poder de procesamiento y hace más lenta la carga.
.
Si esto no se controla, podrías empezar a ver errores de falta de memoria, o de que se acabó el tiempo de ejecución.
.
Por eso es necesario ser muy cuidadoso respecto a cuándo se usa uno y cuando no.
.
En este sentido, los nested queries resultan mas viables en bases de datos cuyos registros no vayan a aumentar considerablemente en un tiempo finito (ej: un crecimiento del 5% cada año).
.
Ejemplo 1
SELECT
new_table_projection.date,
COUNT(*) AS posts_count
FROM (
SELECT
DATE(MIN(fecha_publicacion)) AS date,
YEAR(fecha_publicacion) AS post_year
FROM posts
GROUP BY post_year
) AS new_table_projection
GROUP BY new_table_projection.date
ORDER BY new_table_projection.date ASC
;
Cuenta los posts agrupados por fecha que vienen de una tabla creada en el primer query, la cual selecciona solo la fecha más antigua de la columna fecha_publicacion de la tabla posts de platziblog.
.
Ejemplo 2
SELECT *
FROM posts
WHERE fecha_publicacion = (
SELECT MAX(fecha_publicacion)
FROM posts
)
;
Selecciona todo de la tabla platziblog.posts donde la fecha de publicación sea la más futura posible.
<h1>8. Funciones</h1>COUNT()
Cuenta el número de registros en la columna indicada.
.
Si se usa " * ", se cuentan todos los registros extraidos de las tablas origen.
.
Ojo, es muy importante agrupar sus resultados de algun modo con GROUP BY. De lo contrario, el resultado es una sola casilla con el conteo total.
.
Ejemplo
SELECT city, COUNT(*) AS total
FROM people
WHERE active = true
GROUP BY city
ORDER BY total DESC
HAVING total >= 2
;
Cuenta todos los registros extraidos en el query con el fin de contar el número de personas activas y agruparlas por ciudad.
.
YEAR()
Extrae el número del año indicado en el campo dentro del parentesis.
.
(El campo debe ser de tipo fecha).
.
Ejemplo
SELECT *
FROM posts
WHERE YEAR (posts.fecha_publicacion)
BETWEEN "2023" AND "2024";
Filtra los posts por todo lo que se publicó entre el 2023 y el 2024.
.
MONTH()
Extrae el número del mes indicado en el campo dentro del parentesis.
.
(El campo debe ser de tipo fecha).
.
Ejemplo
SELECT *
FROM platziblog.posts
WHERE month(platziblog.posts.fecha_publicacion) = "04"
;
Trae los posts publicados en abril (de cualquier año).
.
MONTHNAME()
Extrae el nombre del mes del campo indicado dentro del parentesis.
.
(El campo debe ser de tipo fecha).
.
Ejemplo
SELECT MONTHNAME(fecha_publicacion) AS post_month,
COUNT(*) AS post_quantity
FROM posts
GROUP BY post_month
;
Cuenta el número de posts publicados por mes (incluye todos los años)
.
MAX()
Extrae el valor más alto del campo indicado dentro.
.
Ejemplo
SELECT *
FROM posts
WHERE fecha_publicacion = (
SELECT MAX(fecha_publicacion)
FROM posts
)
;
Selecciona todo de la tabla platziblog.posts donde la fecha de publicación sea la más futura posible.
.
MIN()
Extrae el valor más pequeño del campo indicado dentro
.
Ejemplo
SELECT
new_table_projection.date,
COUNT(*) AS posts_count
FROM (
SELECT
DATE(MIN(fecha_publicacion)) AS `date`,
YEAR(fecha_publicacion) AS post_year
FROM platziblog.posts
GROUP BY post_year
) AS new_table_projection
GROUP BY new_table_projection.date
ORDER BY new_table_projection.date ASC
;
Cuenta los posts agrupados por fecha que vienen de una tabla creada en el primer query que seleccionaba solo la fecha más antigua de la columna fecha_publicacion de la tabla posts de platziblog.
.
GROUP_CONCAT()
Es una función que toma los diferentes valores asociados a las otras columnas del query, y los concatena en una columna separandolos con comas (" , ")
.
Ejemplo
SELECT posts.titulo, GROUP_CONCAT(nombre_etiqueta)
FROM posts
INNER JOIN posts_etiquetas
ON posts.id = posts_etiquetas.post_id
INNER JOIN etiquetas
ON etiquetas.id = posts_etiquetas.etiqueta_id
GROUP BY posts.id
;
Lista todas las etiquetas asociadas a los posts en el mismo campo y separandolas por una coma entre si. (las etiquetas salen de etiquetas.nombre_etiqueta)
.
Esta estructura aparece porque la tabla posts y la tabla etiquetas estan conectadas a través de una tabla transitiva llamada posts_etiquetas.
.
Escrito por Jhonkar Sufia (@mistofjoy)
Gracias por el aporte! Buen resumen de las funciones básicas que son las más utilizadas por las RDB.