Bienvenida conceptos básicos y contexto histórico de las Bases de Datos

1

Bienvenida conceptos básicos y contexto histórico de las Bases de Datos

Introducción a las bases de datos relacionales

2

Historia de las bases de datos relacionales

3

Entidades y atributos

4

Entidades de Platzi Blog

5

Relaciones

6

Múltiples muchos

7

Diagrama ER

8

Diagrama Físico: tipos de datos y constraints

9

Diagrama Físico: normalización

10

Formas normales en Bases de Datos relacionales

11

Diagrama Físico: normalizando Platziblog

RDBMS (MySQL) o cómo hacer lo anterior de manera práctica

12

¿Qué es RDB y RDBMS?

13

Instalación local de un RDBMS (Windows)

14

Instalación local de un RDBMS (Mac)

15

Instalación local de un RDBMS (Ubuntu)

16

Clientes gráficos

17

Servicios administrados

SQL hasta en la sopa

18

Historia de SQL

19

DDL create

20

CREATE VIEW y DDL ALTER

21

DDL drop

22

DML

23

¿Qué tan standard es SQL?

24

Creando Platziblog: tablas independientes

25

Creando Platziblog: tablas dependientes

26

Creando Platziblog: tablas transitivas

Consultas a una base de datos

27

¿Por qué las consultas son tan importantes?

28

Estructura básica de un Query

29

SELECT

30

FROM

31

Utilizando la sentencia FROM

32

WHERE

33

Utilizando la sentencia WHERE nulo y no nulo

34

GROUP BY

35

ORDER BY y HAVING

36

El interminable agujero de conejo (Nested queries)

37

¿Cómo convertir una pregunta en un query SQL?

38

Preguntándole a la base de datos

39

Consultando PlatziBlog

Introducción a la bases de datos NO relacionales

40

¿Qué son y cuáles son los tipos de bases de datos no relacionales?

41

Servicios administrados y jerarquía de datos

Manejo de modelos de datos en bases de datos no relacionales

42

Top level collection con Firebase

43

Creando y borrando documentos en Firestore

44

Colecciones vs subcolecciones

45

Recreando Platziblog

46

Construyendo Platziblog en Firestore

47

Proyecto final: transformando tu proyecto en una db no relacional

Bases de datos en la vida real

48

Bases de datos en la vida real

49

Big Data

50

Data warehouse

51

Data mining

52

ETL

53

Business intelligence

54

Machine Learning

55

Data Science

56

¿Por qué aprender bases de datos hoy?

Bonus

57

Bases de datos relacionales vs no relacionales

58

Elegir una base de datos

Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Utilizando la sentencia WHERE nulo y no nulo

33/58
Recursos

El valor nulo en una tabla generalmente es su valor por defecto cuando nadie le asignó algo diferente. La sintaxis para hacer búsquedas de datos nulos es IS NULL. La sintaxis para buscar datos que no son nulos es IS NOT NULL

Aportes 166

Preguntas 27

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Para los que necesiten generar datos ficticios en sus tablas

https://www.generatedata.com/

Generalmente a este tipo de datos se les conoce como “dummy data”

Si tu intensión es comparar multiples valores en una misma columna (OR anidado), lo recomendable es usar el operador IN

SELECT * FROM libros WHERE categorias IN ("Informática","Inglés","Diseño");

Si un query contiene muchas condiciones encadenadas por diferentes operadores lógicos, es importante establecer la prioridad de su evaluación mediante el uso de paréntesis

SELECT * FROM posts WHERE 
titulo like "%se%" 
AND 
(id < 60 OR estatus = 'inactivo')

es diferente que

SELECT * FROM posts WHERE 
titulo like "%se%" 
AND 
id < 60 
OR estatus = 'inactivo'

Como OR se evalúa después de AND con el uso de paréntesis indicamos que se evalúe antes.

Ahora un ejemplo con el operador lógico de negación NOT

SELECT * FROM posts WHERE
NOT estatus = 'activo'
AND
NOT id > 60
AND
NOT YEAR(fecha_publicacion) <> 2025;

NOT invierte el resultado de la condición. Todos los post cuyo estatus no sea activo (toma en cuenta inactivos), que su id no sea superior a 60 (toma todos los menores o iguales a 60) y que su año de publicación no sea diferente de 2025 (toma los de 2025).

Un ejemplo con operador lógico O

SELECT * FROM libros WHERE
precio < 1000
OR
autor LIKE "%González%"
OR
editorial = "Anaya Multimedia"
OR
YEAR(fecha_publicacion) > 2016;

Basta con que una condición se cumpla (parte / todas) para que el registro forme parte del conjunto de resultados

Comparto estos archivos que contienen las sentencias para ingresar los Departamentos y Municipios de Colombia por si alguien los necesita.
.
Solo dan click en los archivos departamento.sql y municipio.sql , luego copian el codigo o lo adaptan a su necesidad.
👍
https://github.com/vafelu/departamentos-y-municipios-colombia-SQL

OJO

El valor nulo no funciona como un valor vacío, funciona como un valor no existente.

El valor nulo significa que no hay nada en el campo mientras que el valor vacío significa que hay algo pero está vacío. Suena un poco contradictorio pero es una aclaración importante.

Apuntes:
NULL no corresponde a ningún valor en particular, sino a una “ausencia” de valor, por lo tanto un NOT NULL correspondería a que no hay una aparente ausencia, es decir, existe un valor así sea un 0. NULL no es igual a nada por lo que en SQL no se le puede asociar con el operador igual que, en vez de esto se le atribuye en un WHERE con un IS NULL. Para valores NOT NULL, también se aplica la misma sintaxis. Para agregar un criterio adicional con WHERE, se usa AND.

Este es mi primer contacto con bases de datos y para ser sincero, tenía más temor antes de comenzar. Es posible!

por si algo, con ctrl + enter se ejecutan los comandos 😃

Para saber que usuarios publicaron posts de categoria “Deportes”.

select *
from usuarios as u
inner join posts as p
on u.id = p.usuario_id

inner join categorias as c
on c.id = p.categoria_id
where c.nombre_categoria = 'Deportes'
;

El valor nulo en una tabla generalmente es su valor por defecto cuando nadie le asignó algo diferente. La sintaxis para hacer búsquedas de datos nulos es IS NULL. La sintaxis para buscar datos que no son nulos es IS NOT NULL
.
Ejemplos:
.
SELECT *
FROM posts
WHERE usuario_id IS NULL;
.
El AND en el WHERE nos permite unir Criterios en nuestra busqueda
.
Ejemplo:
SELECT *
FROM posts
WHERE usuario_id IS NOT NULL
AND estatus = 'activo’
AND id < 20
AND categoria_id = 2
AND YEAR(fecha_publicacion)=‘2025’;

Veo que el profe en algunos casos usa indentación, esto es totalmente necesario? o es la costumbre al programar también en otros lenguajes en los que es obligatorio?

SELECT *
FROM post
WHERE usuario_id IS NOT NULL
AND estatus = 'activo’
AND id < 50
AND categoria_id = 2
AND YEAR(fecha_publicacion) = ‘2025’;

🗣NULL => Representa la ausencia de valor.
👀OJO: NULL es diferente de VACIO.

SELECT 
		payments.amount AS monto, 
		payments.paymentDate AS diaPago, 
		customers.customerNumber AS numeroCLiente, 
		customers.customerName AS nombreCliente
FROM payments
	INNER JOIN customers ON payments.customerNumber = customers.customerNumber
WHERE payments.paymentDate BETWEEN '2004-01-01' AND '2004-12-31'
ORDER BY payments.paymentDate;

Usando la base de datos Sakila:

Saludos.

Increible el nivel de detalle de Platzi como para dedicarle una clase a este tema. ❤️ 😄

"Rule 3 : Systematic treatment of null values: The DBMS must allow each field to remain null (or empty). Specifically, it must support a representation of “missing information and inapplicable information” that is systematic, distinct from all regular values (for example, “distinct from zero or any other number”, in the case of numeric values), and independent of data type. It is also implied that such representations must be manipulated by the DBMS in a systematic way."
Codd’s Rules for RDBMS

Dato Curioso e Innecesario

SABIAS QUE PUEDES ESCRIBIR LAS SENTENCIAS Y ATRIBUTOS DE INTERCALANDO MAYUSCULAS Y MINUSCULAS?

ALGO COMO:

SeLeCT *
fRoM post
wHeRe usuario_id Is nOt nUlL

MUY CHEVERE Y TODO PERO NO LO HAGAS
ESCRIBIR BIEN TU CODIGO DICE MUCHO DE TI
ADIOS 🍃

Es una base de datos para una librería

El siguiente código lo usé para saber qué materiales tengo que estén dentro de un rango de precios y que haya existencias en bodega:

La restricción NOT NULL sirve para especificar que una columna no acepta el valor NULL, es decir, que esa columna siempre tiene que tener algún valor, no puede estar vacía.

Pregunta, en el minuto 6:59 el profesor pone:
categoria_id = 2

Si anterior al WHERE hice un FROM, en el cual uni la tabla post con la tabla categorias ¿Podría poner poner algo cómo categoria_id=‘tecnologia’?

Muy buen curso, sencillo de entender. Muy bien explicado. Felicidades! 😃

Un valor null si es del tipo int no es igual a 0.
En este enlace hay mas informaciom

Buenos Días.
Aquí les presento una consulta que realicé.

La verdad que con el AND se pueden hacer maravillas

WHERE IS NULL y WHERE IS NOT NULL, permite filtrar por campos en una base de datos que contengan ya sea un valor nulo o no nulo, pero aparte de esto, con AND se puede filtrar como tanto se requiera a profundidad dentro de la misma, hasta llegar al dato deseado.

Supongo que esta es la base de las tiendas ONLINE, cuando uno determina que desea un artículo entre X y Y valor o por color, entre otras variables. ¡SUPER, SUPER!

Ejemplo de query en mi base de datos de boletos para viajar en bus.

SELECT boletos.id AS "Número de boleto",boletos.pago AS "Monto",clientes.nom_cliente AS "Nombre",
	   clientes.dni,itinerarios.bus_id AS "Número de bus",itinerarios.fecha_hora_embarque AS "Fecha de embarque",itinerarios.fecha_hora_llegada AS "Fecha de llegada"
FROM boletos
INNER JOIN clientes
ON boletos.cliente_id=clientes.id
INNER JOIN itinerarios
ON boletos.itinerario_id=itinerarios.id
WHERE boletos.pago=80.5
AND YEAR(itinerarios.fecha_hora_embarque)="2020";

select *
from suministros
where presentacion = 'kit’
and estado != 'caducado’
and cantidad_stock > 50
and precio < 200

El valor nulo en una tabla generalmente es su valor por defecto cuando nadie le asignó algo diferente. La sintaxis para hacer búsquedas de datos nulos es IS NULL. La sintaxis para buscar datos que no son nulos es IS NOT NULL

select *
from post
where categoria_id IS NOT NULL
AND status = 'activo’
and categoria_id < 2
and year(fecha_publ) ='2023’
and month(fecha_publ) = ‘12’;

Publicaciones de Usuarios activos sobre ciencia en el año 2026:

SELECT * FROM platziblog2.posts
WHERE estatus = 'activo’
AND categoria_id = '1’
AND Year(fecha_publicacion) = ‘2026’;

SELECT * FROM posts WHERE
estatus = 'inactivo'
AND 
categoria_id = 3
AND
id > 50
AND
YEAR(fecha_publicacion) = 2024;
AND
usuario_id IS NOT NULL;

Mi pregunta fue : ¿en que año fueron los posts mas antiguos y quienes fueron esos usuarios?


/*

buena explicacion!
★★★★★

No se confundan. Null no es igual a 0.
Aqui podran encontrar mas informacion

He practicado la consulta usando la sentencia LIKE

SELECT *
FROM posts
WHERE usuario_id IS NOT NULL
AND id<60
AND titulo LIKE 'Se%'
;

Solucionada mi pregunta de la otra clase 😃

¿Cuántos usuarios tengo con correo electrónico dentro de mi db?

¿Cuántos usuarios tengo sin correo?

HOla
mi aporte a la clase, estoy estudiando una base de datos sobre el COVID-19 en el mundo.

![](

Les dejo mis QUERYS en mi proyecto 😃

SELECT *
FROM pedido
WHERE fecha_pedido BETWEEN '2019-01-01' AND '2019-03-01';
SELECT * 
FROM marca
WHERE descripcion LIKE '%sephora%';

Mis Outputs 😃

![](

![](

En este caso quise buscar los actores con genero femenino que esten en un elenco con un director llamado Evan o similar

Lo hice de la siguiente manera

SELECT elenco_actor.id, actor.nombre, actor.genero AS genero_actor, elenco.director
FROM elenco_actor 
inner join elenco  ON elenco_actor.id_elenco=elenco.id
inner join actor ON elenco_actor.id_actor=actor.id
WHERE elenco.director LIKE '%Evan%'
AND actor.genero="F";

el resultado fue

Este es mi proyecto hasta el día de hoy. Ha sido un ENORME reto para mí. He invertido muchísimas horas en entender como funciona y he descubierto muchísimas cosas en el camino. La más importante, la integridad de los datos a la hora de importarlos a la BD.

Por fin funcionaaaa!!! Y puedo hacer queries en ella. Por ejemplo, hice la query que me diera cuales cartas de mi BD cuestan 2 manás verdes:

Luego le dije que me trajera todos las cartas legendarias:

Está súper chido todo esto!!! Ando muy emocionado jajajaja!!! Sin embargo, aun falta muchísimo. El curso dice que dura 8 horas, yo le he invertido como 30 y apenas voy aquí.

Les dejo mi diagrama ER y mis tablas. Cualquier sugerencia se los agradeceré.

Utilizando la sentencia WHERE null y not null

Sentencia

select *
from post
where iduser is null;

Muestra los datos de los posts que en el campo de iduser tienen el valor null .

select *
from post
where iduser is not null;

Muestra los datos de los posts que en el campo de iduser no tienen el valor null , es decir, muestra los que tienen un usuario.

select *
from post
where iduser is not null
	and status = 'activo'
  and idpost < 50
  and idcategory = 2
;

Muestra los datos según condiciones que se unen mediante la palabra and para conseguir los datos mas exactos según la necesidad.

Tengo una pregunta: hice este SELECT como el del ejemplo solo que hice un LEFT JOIN entre post y categoria, pero hay informacion redundante como lo es el id de la categoria. Como podria en este ejemplo que coloco en la foto quitar esa columna?

la pregunta qu me hice fue ventas de sudaderas durante los meses de enero a abril y nombre de empleados que han hecho esas ventas.

select nombre_producto, unidades, total, fecha, nombres
from empleados
inner join ventas on empleados.id = ventas.empleados_id
where month (fecha) between 01 and 04
and nombre_producto like ‘%sudadera%’;

Vamos, vamos aprendiendo:

Aca selecciono todas las viviendas, uno la tabla que las contiene con la de subtipos de viviendas y con la de ciudades (donde estan las viviendas). Filtro aquellas que tienen mas de 100 metros cuadrados de superficie y un valor mayor a 3000 por metro cuadrado. Finalmente las ordeno por precio.
En el SELECT indico que campos mostrar.

SELECT subtipos_publicacion.nombre AS subtipo, ciudades.nombre AS ciudad, superficie, cantidadAmbientes, precio
FROM viviendas
INNER JOIN subtipos_publicacion ON subtipos_publicacion.id = viviendas.id_subtipo
INNER JOIN ciudades ON viviendas.id_ciudad = ciudades.id
WHERE superficie > 100
AND precio/superficie > 3000
ORDER BY precio

Muy bien, ahora conocemos lo forma adecuada de filtrar datos tanto NULL como NOT NULL solo debemos recordar usar el IS para esta búsqueda.

Con respecto a las búsquedas de mi proyecto, acá tengo una y es mostrar las ventas realizadas para diciembre y que los artículos vendidos tengan un valor mayor a 20.000, este es el código:

SELECT * FROM pedidos AS tbPedi
INNER JOIN solicitudes AS tbSoli ON tbSoli.Id_solicitud = tbPedi.Id_solicitud
INNER JOIN articulos AS tbArti ON tbArti.Id_articulo = tbSoli.Id_articulo
WHERE MONTH(tbPedi.Fecha) = '12' 
AND tbPedi.Id_estado = 3
AND tbArti.Valor_articulo > 20000

Algo como “retornar la información de equipos, su puntaje por enfrentamiento, la id del enfrentamiento, y el nombre del videojuego, solo para el juego Smash Bros. Ultimate y los equipos que hayan marcado 4 puntos o más”

SELECT equipos.nombre AS equipo, puntajes.puntaje, enfrentamientos.enfrentamiento_id AS "enfrentamiento_no.", videojuegos.nombre AS videojuego
FROM equipos
INNER JOIN puntajes ON equipos.equipo_id = puntajes.equipo_id
INNER JOIN enfrentamientos ON enfrentamientos.enfrentamiento_id = puntajes.enfrentamiento_id
INNER JOIN videojuegos ON enfrentamientos.videojuego_id = videojuegos.videojuego_id
WHERE videojuegos.nombre = "Smash Bros. Ultimate"
AND puntajes.puntaje >= 4;

Un ejemplo utilizados valores numéricos y texto como filtros en el where:

SELECT * FROM dbpractica.alumnos
where ciudad_alu like '%Glasgow%'
and codigo_alu > 4
and upper(direccion_alu) like ‘%BOX%’;

SELECT DISTINCT column1, column2, …
FROM table_name;
SELECT * FROM Customers
WHERE NOT Country=‘Germany’

NULL: Es un valor por defecto que se coloca cuando un campo no contiene ningun tipo de valor esto mismo lo podemos ver aplicado a lenguajes de programacion como Python que existen asignaciones de valores nulos pero con su palabra clave ‘None’

select * from consolas where year(ano_lanzamiento) = 2002;

select id_juego,nombre from juegos left join conso_juego on id_juego = conso_juego.id_juego
where conso_juego.id_consola = 4;

select * from ediciones_juego where version like ‘%coll%’;
select * from juegos right join desarrollador on juegos.id_desarrolla = desarrollador.id_desarrolla
where nombre = ‘sony santamonica’;

SELECT count(*)
FROM posts 
WHERE year(fecha_publicacion) = '2023'
AND estatus = 'ACTIVO'```

No esto yseguro si esto le sirva a alguien, pero queria profundizar mas acerca de las funciones para trabajar con tiempo, encontre ese recurso que me parecio bueno:

https://database.guide/6-functions-to-get-the-day-month-and-year-from-a-date-in-sql-server/

Enjoy 😃

De mi proyecto personal (Paises, datos de este y sus comidas típicas) la pregunte que me hice fue ¿Quiero conocer todos los paises de américa que su comida típica sea el choripán, el código quedo así:

SELECT c.name as Pais, co.name as Continente, l.name as Idioma, tf.name
FROM countries as c
LEFT JOIN continent as co 
    ON c.continent_id = co.id
LEFT JOIN language as l
	ON c.language_id = l.language
LEFT JOIN countries_food as cf
	ON cf.countries_id = c.countries_id
LEFT JOIN typical_food as tf
	ON tf.id = cf.typical_food_id
WHERE co.id = 1
AND tf.name = "Choripán";

Y el resultado:

¿ERROR AL INSERTAR EL POST QUE SE QUEDO HUÉRFANO?
La única manera que encontré para poder insertar el dato con id 64 de la tabla posts que viene en el archivo Estructura_Query.sql, fue alterar los valores “usuario_id” y “categoria_id” desmarcando los valores NN de la tabla posts.

practica

SELECT *
FROM posts
WHERE usuario_id IS NOT NULL
AND estatus = "activo"
AND usuario_id BETWEEN 2 AND 6
AND categoria_id > 1
AND titulo LIKE "%e%"
AND YEAR(fecha_publicacion) = “2025”
;

SELECT	*
FROM usuarios
left join posts  
ON usuarios.id = posts.usuario_id
where titulo is not null
and estatus = 'activo'
and posts.id < 50
;

Aquí está mi ejemplo utilizando INNER JOIN y WHERE en mi proyecto

Dejo estos recursos para encontrar DATA SETS PUBLICOS.

Google Research Datasets
Datos abiertos del Gobierno de Colombia
Datos de muestra de Tableau
Data World
Data .gov
World Bank
GLassdoor

Mi resultado en platziblog, Vamos bien!!!

Excelente video 😃

Excelente explicación!

Muy poderoso se vuelve con los AND.

buenas tardes. La pregunta que me hice es: cuanto vendió la bicicleteria 1 ?
![](

Null es vació. No existe. No tiene valor, así lo entendí mejor.

SELECT*
FROM juego_jugador
WHERE jugador IS NOT NULL
AND juego_id = 1

Cual es la diferencia entre UNION y AND

Aprendido:

¡Hola! Muchas gracias por esta clase. Voy poco a poco aterrizando el proyecto que quiero lograr y es crear una base de datos para la creación de los SKUs que estoy manejando para mi empresa. Subí toda la información para practicar las búsquedas. Aquí va mi aporte:
.
SELECT *
FROM Generador SKUs.Lista_SKUs
WHERE categoria_principal = 'Maletas’
AND Tamano = 'Large’
AND id BETWEEN 45 AND 60;

SELECT *
FROM carro
WHERE year between ‘2010’ and '2015’
and segmento = ‘deportivo’
;

Hola 😄
Les voy a ser sincero, iba a publicar una pregunta sobre como hacer filtros con las etiquetas y antes de publicarla se me ocurrió una idea y no sé si alguien tenía la misma duda pero aquí esta el resultado 🚀

SELECT *
FROM posts
INNER JOIN posts_etiquetas ON posts.id = posts_etiquetas.post_id
INNER JOIN etiquetas ON etiquetas.id = posts_etiquetas.etiqueta_id
WHERE estatus IS NOT NULL
AND etiqueta_id = 9; 

Como hice la unión de tres tablas se puede consultar directamente con el nombre de la etiqueta era necesario, no lo era bastaba con unir dos tablas posts y posts_etiquetas, pero como quería saber el nombre de la categoría decidí que para mi caso era mejor unir las tres tablas.

SELECT *
FROM posts
INNER JOIN posts_etiquetas ON posts.id = posts_etiquetas.post_id
WHERE estatus IS NOT NULL
AND etiqueta_id = 9; 

Esta es otra forma valida y bueno les dejo una imagen para que vean como quedo mi consulta final filtrada por etiquetas😼

  • SELECT
  • FROM joins
  • WHERE and’s

El valor nulo en una tabla generalmente es el valor por defecto. Es el valor que se guarda en un campo cuando no tiene una especificación y por defecto la base de datos lo guarda como nulo. Muchos de los campos dentro de nuestra definición de base de datos le pusimos un constraint que se llama not null que quiere decir no nulo, no se desea que se quede vacío y por tanto es obligatorio.

la pregunta que siempre me surge es de donde venimos y para donde vamos… jejejeje

Sometimes, in a given row, there is no value at all for a given column. For example, a dog does not have a favorite book, so in that case, there is no point in putting a value in the favorite_book column, and the value is NULL. In order to find the rows where the value for a column is or is not NULL, you would use IS NULL or IS NOT NULL.

Selecciona todos los usuarios que tengan post en economia

SELECT 
	nick_name AS 'USUARIO',
    email AS 'EMAIL',
    title AS 'TITULO',
    category_name AS 'CATEGORIA',
    post_status AS 'ESTATUS'
FROM post 
	INNER JOIN category ON post.category_id = category.id 
    INNER JOIN users ON post.user_id = users.id
WHERE post_status LIKE 'a%' AND category_name LIKE 'Eco%'   
;

Mi ejemplo usando NULL con mi base de datos de One Piece.
Mi código te muestra algunos personajes de One Piece que tienen apodo y que no tiene fruta del diablo.

SELECT * FROM one_piece.personajes
WHERE apodo IS NOT NULL and fruta_id IS NULL;

WHERE es como el comando GREP de Ubuntu😅

one query

// get expired products
create view v_pinner_vvpp as select vd.name as NOMBRE_VENDEDOR, vn.vendedor_id, monto, ventas_id, producto_id, ppv.cantidad, p.name AS NOMBRE_PRODUCTO, p.fecha_vencimiento from vendedores as vd inner join ventas
as vn on vd.id = vn.vendedor_id;
select * from v_inner_vvpp where year(fecha_vencimiento) = '2021' && month(fecha_vencimiento) = '10';

Que gracioso, jajaja…

SELECT *
FROM alumno as a
WHERE a_paterno = 'Zavaleta '
and nombre like ‘%Jose%’;

Las sentencias siempre deben de ser en mayuscula ?

En este caso al colocar NOT NULL, estaríamos filtrando igual que con un INNER JOIN

El valor nulo también ocupa espacio en memoria, ?

Por ejemplo cuántos entrenamientos realizó un atleta en un mes o en un año, qué ejercicios fueron los que más usó, cuántas veces llegó al fallo en los ejercicios,…

Con AND puedes encadenar varias condicionales para filtrar tuplas a tu encesidad especifica.

Podemos hacer muchas preguntas y responderlas con los datos interpretados gracias al código SQL, esto me recuerda a los filtros de Microsoft Excel

SELECT count(usuario_id),nickname from posts INNER JOIN usuarios ON usuarios.id = posts.usuario_id where posts.usuario_id = 1

SELECT * FROM students WHERE status_id = ‘active’;

<SELECT * 
FROM users
    WHERE phone IS NOT NULL
   AND sex ='m'
    AND name like 'm%'
    ;
>

Obtener todas las facturas cuyo importe sea mayor a 1000, aun estén abiertas (sin pagar), que sean de venta y creadas en el tercer trimestre.

SELECT *
FROM account_invoice
WHERE amount_untaxed > 1000
	AND state = 'open'
	AND type = 'out_invoice'
	AND EXTRACT(MONTH FROM create_date) BETWEEN '07' AND '09';