Tema Claro 
Lenguajes de programación · Lectura & Comprensión

Python & PHP SKool

Aprende a leer, entender y corregir código real. Dos lenguajes, en paralelo, desde las primeras instrucciones hasta las librerías profesionales. Pulsa ▶ en cualquier bloque para ver la ejecución paso a paso.

🐍 Python real (Pyodide ≈10 MB) · haz clic en ▶ para activarlo
🐘 PHP real (WASM ≈5 MB) · haz clic en ▶ para activarlo · avisa si algo no funciona
🗄️ SQLite real (sql.js ≈1 MB) · haz clic en ▶ para activarlo · corre 100% en tu navegador
01

Variables & Tipos de datos

Una variable es una caja con nombre donde guardamos un valor. En Python el tipo se deduce solo; en PHP toda variable empieza con $. Ambos son tipado dinámico: la caja cambia de tipo según lo que metes.

Concepto clave — Tipado dinámico: no hace falta declarar qué tipo va dentro. El lenguaje lo averigua en tiempo de ejecución. Ventaja: menos código. Riesgo: si metes un número donde esperabas texto, el error aparece al ejecutar, no antes.
Python

        
salida
PHP

        
salida
ConceptoPythonPHP
Declarar variablenombre = "Ana"$nombre = "Ana";
Enteroedad = 25$edad = 25;
Decimalprecio = 3.14$precio = 3.14;
Booleanoactivo = True$activo = true;
Sin valorx = None$x = null;
Saber el tipotype(x)gettype($x)
Imprimirprint(x)echo $x;
Fin de línea— (salto de línea); obligatorio
02

Estructuras de control

Condicionales y bucles son el esqueleto de cualquier programa. En Python el bloque se define por indentación (espacios); en PHP por llaves { }. Ambos funcionan igual en lógica, distinto en forma.

¡Ojo con la indentación en Python! Si un bloque if tiene 4 espacios, todo su contenido debe tenerlos. Un espacio de más o de menos y el código falla. Es el error más común para quien llega del HTML.
Python
salida
PHP
salida
EstructuraPythonPHP
if / sinoif x > 0: / else:if ($x > 0) { / } else {
else ifelifelseif
Bucle contadofor i in range(5):for ($i=0; $i<5; $i++) {
Bucle mientraswhile condicion:while ($cond) {
Recorrer listafor item in lista:foreach ($arr as $item) {
Bloque de códigoindentación (4 espacios)llaves { }
03

Funciones

Una función es un bloque de código con nombre que puedes reutilizar. Recibe parámetros (entradas) y puede devolver un valor (salida). El principio DRY: Don't Repeat Yourself — si copias código, convierte eso en función.

Anatomía de una función: def (Python) o function (PHP) · nombre · paréntesis con parámetros · bloque de código · return opcional. Si no hay return, devuelve None / null.
Python
salida
PHP
salida
04

Listas & Arrays

Las listas (Python) y arrays (PHP) son colecciones de valores bajo un mismo nombre. Se accede a cada elemento por su índice, que empieza siempre en 0. Son la estructura de datos más usada junto con los diccionarios/arrays asociativos.

Índice base 0 — muy importante: si una lista tiene 5 elementos, los índices son 0, 1, 2, 3, 4. El elemento 5 no existe y da error. En Python el índice -1 accede al último elemento: truco muy útil.
Python
salida
PHP
salida
OperaciónPython (lista)PHP (array)
Crearnums = [1, 2, 3]$nums = [1, 2, 3];
Accedernums[0]$nums[0]
Añadir al finalnums.append(4)$nums[] = 4;
Longitudlen(nums)count($nums)
Eliminar últimonums.pop()array_pop($nums)
¿Contiene?3 in numsin_array(3, $nums)
Ordenarnums.sort()sort($nums)
Clave → valor{"a": 1} dict["a" => 1] assoc array
05

Clases & Objetos

Una clase es una plantilla. Un objeto es una instancia de esa plantilla. Si "Perro" es la clase, "Laika" y "Rex" son objetos. Cada objeto tiene sus propios atributos (datos) y métodos (funciones). Este paradigma se llama POO — Programación Orientada a Objetos.

self (Python) vs $this (PHP): dentro de un método, self / $this es la forma de referirse al objeto actual. Es como decir "yo mismo". Sin él no puedes acceder a los atributos del objeto desde dentro.
Python
salida
PHP
salida
06

Librerías: NumPy, Pandas & más

Una librería es código escrito por otros que importas para no reinventar la rueda. NumPy trabaja con números y matrices; Pandas con tablas de datos (piensa en Excel programable). En PHP las librerías más usadas son las propias del lenguaje para web: base de datos, JSON, fechas.

import vs require/include: en Python import numpy as np carga la librería y le da un alias corto. En PHP require incluye otro fichero PHP (una librería, una clase) en el programa actual. El concepto es el mismo: traer código externo al tuyo.

NumPy — cálculo numérico

Python · NumPy
salida

NumPy no tiene equivalente en PHP

PHP no se usa para cálculo científico. Para ese trabajo existen Python + NumPy, R, o MATLAB.


PHP sí tiene array_sum(), array_map() y funciones matemáticas básicas — pero no operaciones vectorizadas.

Pandas — tablas de datos

Python · Pandas
salida
PHP · Arrays + JSON
salida

Mapa rápido de librerías por uso:

UsoPythonPHP
Cálculo numériconumpy— (no aplica)
Tablas de datospandasarrays asociativos
Gráficasmatplotlib / seaborn— (JS en frontend)
Web / APIflask / fastapinativo + slim
Base de datossqlalchemy / pymysqlPDO / mysqli
JSONjson.loads()json_decode()
FechasdatetimeDateTime / date()
IA / MLscikit-learn / torch— (no aplica)
Peticiones HTTPrequestscurl / file_get_contents
07

Buscar & Filtrar en listas

Buscar un elemento, comprobar si existe y filtrar por condición son las operaciones más frecuentes cuando un LLM te devuelve datos en forma de lista. Python tiene sintaxis muy expresiva para esto; PHP usa funciones de librería estándar.

List comprehension (Python): [x for x in lista if condicion] es la forma pythonica de filtrar en una línea. Equivale a un bucle for + if + append. Cuando veas corchetes con for dentro, es esto.
Python
salida
PHP
salida
OperaciónPythonPHP
¿Contiene?x in listain_array($x, $arr)
Buscar índicelista.index(x)array_search($x, $arr)
Filtrar[x for x in l if cond]array_filter($arr, fn)
Transformar[f(x) for x in l]array_map(fn, $arr)
Contar coincidenciaslista.count(x)array_count_values($arr)
08

Cadenas de texto (Strings)

El texto es el tipo de dato más frecuente cuando trabajas con LLMs. Limpiar, buscar, dividir y recomponer strings es imprescindible. Python trata los strings como objetos con métodos; PHP usa funciones con prefijo str_.

f-strings vs interpolación: f"Hola {nombre}" inserta variables en Python. En PHP las comillas dobles también interpolan: "Hola $nombre". Para concatenar, PHP usa el punto .. Ambas formas aparecen constantemente en código generado por IA.
Python
salida
PHP
salida
OperaciónPythonPHP
Longitudlen(s)strlen($s)
Mayúsculas / Minúsc.s.upper() / s.lower()strtoupper($s) / strtolower($s)
¿Contiene?"sub" in sstr_contains($s, "sub")
Reemplazars.replace("a","b")str_replace("a","b",$s)
Dividirs.split(",")explode(",", $s)
Unir lista",".join(lista)implode(",", $arr)
Quitar espacioss.strip()trim($s)
Interpolaciónf"Hola {var}""Hola $var"
Subcadenas[2:5]substr($s, 2, 3)
09

Manejo de errores

Cuando algo falla, el programa lanza una excepción. Si no la capturas, el programa se detiene. El bloque try/except (Python) o try/catch (PHP) intercepta el error y permite continuar. El código que generan los LLMs casi siempre incluye esto.

Anatomía del try/except: en try va el código que puede fallar. En except/catch va qué hacer si falla. finally se ejecuta siempre — ideal para cerrar archivos o conexiones de base de datos.
Python
salida
PHP
salida
ConceptoPythonPHP
Bloque protegidotry:try {
Capturar errorexcept Exception as e:catch (Exception $e) {
Siempre ejecutarfinally:finally {
Lanzar errorraise ValueError("msg")throw new Exception("msg")
Mensaje del errorstr(e)$e->getMessage()
División por ceroZeroDivisionErrorException (manual)
Tipo incorrectoTypeErrorTypeError
10

JSON & APIs

JSON es el formato universal de intercambio de datos en la web. Cuando un LLM te genera código que llama a una API — o cuando tú llamas a un LLM por API — los datos viajan en JSON. Entender cómo convertir entre JSON y estructuras nativas es esencial.

Serializar vs Deserializar: convertir un objeto/array a texto JSON se llama serializar (json.dumps / json_encode). El proceso inverso — texto JSON a estructura de datos — es deserializar (json.loads / json_decode). Cuando ves estos nombres en código de IA, ya sabes qué hacen.
Python
salida
PHP
salida
OperaciónPythonPHP
JSON → datosjson.loads(texto)json_decode($texto)
Datos → JSONjson.dumps(datos)json_encode($datos)
JSON bonitojson.dumps(d, indent=2)json_encode($d, JSON_PRETTY_PRINT)
Petición GETrequests.get(url)file_get_contents($url)
Petición con cabecerasrequests.get(url, headers={})curl + CURLOPT_HTTPHEADER
Leer respuestar.json()json_decode($respuesta)
11

Expresiones regulares (Regex)

Las expresiones regulares son patrones para buscar, validar y extraer texto. Un LLM las genera con frecuencia para limpiar datos o validar formularios. No hace falta memorizarlas — sí hace falta reconocerlas y saber qué buscar.

Anatomía de una regex: /patron/flags. El patrón describe qué buscar: . cualquier carácter, * cero o más, + uno o más, ^ inicio, $ fin, [abc] uno de esos, \d dígito, \w letra/número, \s espacio. Los flags más comunes: i ignora mayúsculas, g busca todas las ocurrencias.
Python · módulo re
salida
PHP · preg_*
salida
OperaciónPythonPHP
¿Coincide?re.search(pat, s)preg_match($pat, $s)
Todas las coincidenciasre.findall(pat, s)preg_match_all($pat, $s, $m)
Reemplazarre.sub(pat, repl, s)preg_replace($pat, $repl, $s)
Dividirre.split(pat, s)preg_split($pat, $s)
Formato patrónr"patron" (raw string)"/patron/flags"
12

Anatomía de un modelo de IA

Cuando un LLM genera código de machine learning con Keras o TensorFlow, aparecen siempre los mismos bloques. No necesitas ejecutarlo — sí necesitas reconocer qué hace cada parte: dónde están los datos, dónde se define la red, dónde se entrena y dónde se predice.

El flujo siempre es el mismo: datos → modelo → compilar → entrenar → predecir. Si identificas esos 5 pasos en cualquier código de IA, ya entiendes su estructura, aunque no entiendas cada línea.
Python · Keras / TensorFlow
salida
Python · scikit-learn
salida
¿Y PHP? PHP no se usa para entrenar modelos de IA. Su papel en el ecosistema IA es otro: recibir la petición del usuario, llamar a una API de IA (OpenAI, Anthropic, Gemini…), recibir la respuesta en JSON y devolverla al navegador. El entrenamiento y la inferencia pesada ocurren en Python.
Bloque de códigoQué hacePalabras clave
Importar libreríasCargar herramientasimport keras, from tensorflow, import sklearn
Preparar datosCargar, limpiar, dividir train/testtrain_test_split, fit_transform, X_train, y_train
Definir modeloArquitectura de la redSequential(), Dense(), layers, activation
CompilarConfigurar aprendizajemodel.compile(), optimizer, loss, metrics
EntrenarAprender de los datosmodel.fit(), epochs, batch_size
Evaluar / PredecirComprobar y usar el modelomodel.predict(), model.evaluate(), score()
13

Ficheros, buffers & entorno

Leer y escribir archivos es una tarea básica en cualquier backend. Python usa el gestor de contexto with open(); PHP tiene fopen/fclose y funciones de alto nivel. Además veremos el buffer de salida, control de errores, locale y zona horaria — y las cookies en PHP.

Regla de oro — cierra siempre el fichero. En Python el bloque with lo hace automáticamente al salir. En PHP llama a fclose() o usa file_put_contents() que no deja nada abierto.
Python
salida
PHP
salida
Modos de apertura de fichero — el segundo argumento de fopen() / open():
ModoDescripciónPythonPHP
rSolo lectura. El fichero debe existir.open(f,"r")fopen($f,"r")
wSolo escritura. Crea o vacía el fichero.open(f,"w")fopen($f,"w")
aAñadir al final. Crea si no existe.open(f,"a")fopen($f,"a")
r+Lectura y escritura. El fichero debe existir.open(f,"r+")fopen($f,"r+")
w+Lectura y escritura. Crea o vacía.open(f,"w+")fopen($f,"w+")
xCrea exclusivo. Falla si el fichero ya existe.open(f,"x")fopen($f,"x")
rb/wbBinario. Añade b a cualquier modo.open(f,"rb")fopen($f,"rb")
Python · buffer, errores & entorno

io.StringIO() — fichero en memoria, sin disco. Útil para tests y parseo.

try / except / finally — captura FileNotFoundError, PermissionError…

import locale
locale.setlocale(locale.LC_TIME, 'es_ES.UTF-8')


from datetime import datetime
from zoneinfo import ZoneInfo
dt = datetime.now(ZoneInfo('Europe/Madrid'))
print(dt.strftime('%A %d de %B de %Y'))
PHP · buffer, errores, locale & cookie

ob_start() — activa buffer de salida (todo echo queda en RAM).
ob_get_clean() — obtiene el buffer y lo vacía.
ob_end_flush() — vacía y desactiva el buffer.

error_reporting(E_ALL);
ini_set('display_errors', '1');
— muestra todos los errores (solo en desarrollo).

setlocale(LC_TIME, 'es_ES.UTF-8');
date_default_timezone_set('Europe/Madrid');
echo strftime('%A %d de %B de %Y');


Cookies:
setcookie('usuario', 'Ana', time()+86400, '/');
echo $_COOKIE['usuario'] ?? 'sin cookie';
Las cookies se envían ANTES de cualquier echo (en las cabeceras HTTP).
TareaPythonPHP
Leer fichero completoopen(f).read()file_get_contents($f)
Escribir fichero completoopen(f,'w').write(txt)file_put_contents($f, $txt)
Añadir al finalopen(f,'a').write(txt)file_put_contents($f,$txt,FILE_APPEND)
Línea por líneafor linea in f:while($l=fgets($f))
Buffer en memoriaio.StringIO()ob_start() … ob_get_clean()
Zona horariaZoneInfo('Europe/Madrid')date_default_timezone_set('Europe/Madrid')
Locale de fechaslocale.setlocale(LC_TIME,'es_ES.UTF-8')setlocale(LC_TIME,'es_ES.UTF-8')
Leer cookieno aplica (server-side)$_COOKIE['clave']
Escribir cookie—setcookie('c','v',time()+86400,'/')
14

Variables Superglobales: $_POST y $_GET

En PHP, $_POST y $_GET son arrays superglobales que permiten acceder a los datos enviados a través de los métodos HTTP POST y GET, respectivamente.

$_GET: Los datos se envían a través de la URL (ej: pagina.php?nombre=Sergio). Son visibles y se usan para consultas simples.
$_POST: Los datos se envían en el cuerpo de la petición HTTP (no visibles en la URL). Se usan para formularios con información sensible (ej: contraseñas).

⚠️ Seguridad: Siempre valida y sanitiza los datos de $_GET y $_POST con funciones como htmlspecialchars() o filter_var() para evitar ataques como XSS o inyección SQL.
PHP
// Ejemplo de $_GET
if (isset($_GET['nombre'])) {
    echo "Hola, " . htmlspecialchars($_GET['nombre']);
} else {
    echo "No se recibió el parámetro 'nombre' en la URL.";
}

// Ejemplo de $_POST (simulado para el editor)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['edad'])) {
    echo "Tu edad es: " . intval($_POST['edad']);
} else {
    echo "No se recibió el parámetro 'edad' por POST.";
}
          
salida
15

TensorFlow.js: Inteligencia Artificial en el Navegador

TensorFlow.js es una librería de JavaScript que permite ejecutar modelos de Machine Learning directamente en el navegador. Aquí tienes un ejemplo sencillo con tensores locales (sin necesidad de descargar modelos externos).

💡 Tip: Este ejemplo usa tensores simples. Si quieres cargar modelos pre-entrenados, alojalos en tu servidor y actualiza la URL en el código.
JavaScript (TensorFlow.js)
// Ejemplo de TensorFlow.js con tensores locales
async function runTFJSExample() {
  const outputDiv = document.getElementById('out-tfjs');
  outputDiv.innerHTML = '
Cargando TensorFlow.js...
'; try { // Crear un tensor simple const tensor = tf.tensor2d([[1, 2], [3, 4]]); const result = tensor.mul(2); // Multiplicar por 2 // Mostrar resultado en el HTML outputDiv.innerHTML = `
salida
Tensor original: [[1, 2], [3, 4]]
Resultado (x2): [[${result.get(0, 0)}, ${result.get(0, 1)}], [${result.get(1, 0)}, ${result.get(1, 1)}]]
`; } catch (error) { outputDiv.innerHTML = `
Error
${error.message}
`; } }
salida
16

Lectura de CSV con Pandas

Con pandas, puedes leer y manipular archivos CSV directamente en el navegador usando Pyodide. Aquí tienes un ejemplo con datos de ejemplo generados en el código.

💡 Tip: Usa StringIO para simular un archivo CSV sin necesidad de subir ficheros.
Python
import pandas as pd
from io import StringIO

data = "nombre,edad,ciudad\nAna,25,Madrid\nLuis,30,Barcelona"
df = pd.read_csv(StringIO(data))
repr(df)  
# Esto devuelve una cadena con la representación del DataFrame
          
salida
17

SQL & bases de datos: SQLite en el navegador

Hasta ahora has ejecutado Python y PHP directamente en tu navegador, sin servidor. Vamos a hacer lo mismo con una base de datos relacional: aquí corre SQLite real, compilado a WebAssembly (sql.js), igual que Pyodide hace con Python. No hay servidor MySQL/MariaDB detrás, no se toca infodocencia.net para nada: tu base de datos vive solo en tu navegador.

¿Por qué SQLite y no MySQL/MariaDB aquí? MySQL y MariaDB son servidores: un proceso aparte, con usuario/contraseña, escuchando en una red, compartido entre todos los visitantes de la web — darte permiso para crear y borrar tablas ahí sería un riesgo de seguridad para el hosting compartido. SQLite es un fichero, sin servidor: cada visitante recibe su propia base de datos privada, corriendo en su propia máquina, que puedes reiniciar o descartar sin afectar a nadie más. La buena noticia: el SQL que aprendes aquí (DDL y DQL) es ~90% igual en SQLite, MySQL, MariaDB o PostgreSQL. Al final del curso tienes un manual breve con las diferencias para cuando uses MySQL/MariaDB de verdad en un hosting.
Persistencia por sesión: tu base de datos de prácticas se guarda automáticamente en el localStorage de tu navegador tras cada CREATE/INSERT/UPDATE/DELETE. Si cierras y vuelves, sigue ahí. Usa ↺ Reiniciar para volver a los datos de ejemplo, o ⬇ Descargar .sqlite para guardarte una copia real del fichero.
📘 ¿Vas a usar MySQL/MariaDB de verdad en un hosting? Cuando termines estas 6 secciones, revisa el Manual Pareto de MySQL/MariaDB — breve, con lo esencial (20%) para resolver el 80% de los casos reales, más lo que aquí no cabe: usuarios, backups, transacciones e índices.

Para practicar usaremos una mini librería online, con 5 tablas ya cargadas con datos de ejemplo:

TablaColumnas
autoresid, nombre, pais
librosid, titulo, autor_id → autores(id), precio, anio, stock
clientesid, nombre, email, ciudad
pedidosid, cliente_id → clientes(id), fecha, total
pedido_detalleid, pedido_id → pedidos(id), libro_id → libros(id), cantidad
SQL · SQLite
resultado
18

DDL: crear tablas y relaciones (entidad-relación)

DDL (Data Definition Language) es el SQL que define la estructura: qué tablas existen, qué columnas tiene cada una, de qué tipo, y cómo se relacionan entre sí mediante claves. Es el "plano" de la base de datos.

Entidad-relación en una frase: cada tabla es una entidad (un sustantivo: libro, cliente, pedido). La PRIMARY KEY identifica sin ambigüedad cada fila. La FOREIGN KEY es cómo una tabla apunta a otra — así libros.autor_id apunta a autores.id, y decimos "cada libro pertenece a un autor". Sin foreign keys tendrías que repetir el nombre del autor en cada fila de libro; con ellas, lo escribes una vez y lo referencias.
SQL · SQLite
resultado
OperaciónSQL
Crear tablaCREATE TABLE t (id INTEGER PRIMARY KEY, ...)
Clave primariaid INTEGER PRIMARY KEY
Clave foráneaautor_id INTEGER REFERENCES autores(id)
Obligatorionombre TEXT NOT NULL
Únicoemail TEXT UNIQUE
Valor por defectostock INTEGER DEFAULT 0
Añadir columnaALTER TABLE t ADD COLUMN col TEXT
Borrar tablaDROP TABLE t
19

DML: insertar, actualizar y borrar datos

Con la estructura ya creada, el DML (Data Manipulation Language) mete y modifica los datos que viven dentro: INSERT, UPDATE y DELETE.

La cláusula más importante: WHERE. Un UPDATE o DELETE sin WHERE afecta a todas las filas de la tabla, no solo a una. Es el error más caro y más común en SQL — ejecuta siempre primero un SELECT con el mismo WHERE para comprobar qué filas vas a tocar.
SQL · SQLite
resultado
OperaciónSQL
Insertar filaINSERT INTO t (col1,col2) VALUES (a,b)
ActualizarUPDATE t SET col=valor WHERE id=1
Borrar filasDELETE FROM t WHERE id=1
Vaciar tabla enteraDELETE FROM t (¡sin WHERE!)
20

DQL: consultar datos con SELECT

El DQL (Data Query Language) es, en la práctica, un único comando con muchas piezas: SELECT. Filtra con WHERE, ordena con ORDER BY, limita con LIMIT, y busca patrones de texto con LIKE.

LIKE y sus comodines: % significa "cero o más caracteres cualquiera", _ significa "exactamente un carácter". LIKE '%García%' encuentra "García" en cualquier posición del texto. Esto es búsqueda literal (con acentos y mayúsculas según configuración) — no es búsqueda fonética. Para encontrar palabras que suenan parecido aunque estén mal escritas (Gonzalez / Gonzales), MySQL/MariaDB traen la función SOUNDEX(), que no existe en SQLite; la cubrimos en el manual de MySQL al final del curso.
SQL · SQLite
resultado
OperaciónSQL
TodoSELECT * FROM t
Columnas concretasSELECT col1, col2 FROM t
FiltrarWHERE precio > 10
RangoWHERE anio BETWEEN 1960 AND 1980
Lista de valoresWHERE pais IN ('Chile','Argentina')
Patrón de textoWHERE titulo LIKE '%amor%'
Sin valorWHERE autor_id IS NULL
OrdenarORDER BY precio DESC
Limitar filasLIMIT 5 / LIMIT 5 OFFSET 10
21

JOIN & subconsultas

Los datos están repartidos en varias tablas a propósito (para no repetirlos). JOIN las vuelve a juntar en el momento de consultar. Una subconsulta es un SELECT completo metido dentro de otro, para usar su resultado como filtro.

INNER JOIN vs LEFT JOIN: INNER JOIN devuelve solo las filas que coinciden en ambas tablas (un libro sin autor asignado desaparecería). LEFT JOIN devuelve todas las filas de la tabla izquierda, aunque no haya coincidencia a la derecha (rellenando con NULL). Regla práctica: si la pregunta es "¿qué libros no tienen pedidos?", necesitas LEFT JOIN + WHERE ... IS NULL, o una subconsulta con NOT IN.
SQL · SQLite — JOIN
resultado
SQL · SQLite — Subconsulta
resultado
OperaciónSQL
Unir por coincidenciaFROM libros l JOIN autores a ON l.autor_id=a.id
Unir conservando la izquierdaFROM libros l LEFT JOIN pedido_detalle d ON d.libro_id=l.id
Subconsulta como valorWHERE precio > (SELECT AVG(precio) FROM libros)
Subconsulta como listaWHERE id IN (SELECT libro_id FROM pedido_detalle)
Negación de listaWHERE id NOT IN (SELECT ...)
22

Agregación: GROUP BY, HAVING & funciones

Las funciones de agregación resumen muchas filas en una: COUNT, SUM, AVG, MIN, MAX. GROUP BY las aplica por grupo (por autor, por cliente, por ciudad...) en vez de a toda la tabla.

WHERE filtra filas, HAVING filtra grupos. WHERE se aplica antes de agrupar (fila a fila); HAVING se aplica después de agrupar, sobre el resultado ya resumido — por eso HAVING COUNT(*) > 2 funciona y WHERE COUNT(*) > 2 da error. Con esto, más JOIN, LIKE y subconsultas de las secciones anteriores, cubres el 20% de SQL que resuelve el 80% de las consultas del día a día — el resto (índices, transacciones, procedimientos...) está en el manual final, para cuando pases a MySQL/MariaDB en un hosting real.
SQL · SQLite
resultado
OperaciónSQL
Contar filasCOUNT(*)
Sumar / MediaSUM(col) / AVG(col)
Mínimo / MáximoMIN(col) / MAX(col)
AgruparGROUP BY columna
Filtrar gruposHAVING SUM(col) > 20
Texto sin repetidosSELECT DISTINCT pais FROM autores
Progreso
0 / 20 secciones
Certifica que
ha completado el curso
Lectura & Comprensión de código · Python, PHP & SQL
20 secciones · desde variables hasta bases de datos relacionales (SQLite/SQL)
Código de verificación · SHA-256 en binario
Hexadecimal
Código completo (base64 · verificable)

🔍 Verificar diploma

Pega el código base64 de cualquier diploma para comprobar su autenticidad y ver los datos originales.

Otros sitios

SIRSG78

Sitios Infodocencia.net (Prototipos Geek)

Sitios Externos (Prototipos Funcionales)  ©