Platzi
Platzi

¡Invierte en ti y celebremos! Adquiere un plan Expert o Expert+ a precio especial.

Antes:$349
$259
Currency
Antes:$349
Ahorras:$90
COMIENZA AHORA
1

Librería de sentencias SQL (con instrucciones y ejemplos)

¡Hola! Dejo por aqui la lista de sentencias SQL que compilé a lo largo del curso.
.
¡Mucho éxito en tus estudios!

<h1>Indice</h1>
  1. Símbolos recurrentes
  2. Tipos de datos
  3. Constraints
  4. Sentencias DDL (Data Definition Language)
  5. Sentencias DML (Data Manipulation Language)
  6. Opciones al usar llaves foraneas
  7. Sentencias para hacer queries
  8. Funciones
<h1>1. Símbolos recurrentes</h1>

" * " (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.

<h1>3. Constraints</h1>

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.

<h1>4. Sentencias DDL (Data definition Language)</h1>

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.

<h1>7. Sentencias para hacer queries</h1>

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).
.

<h3>FROM</h3>

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.
.

<h3>GROUP BY</h3>

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)

Escribe tu comentario
+ 2