Antes de aprender qué significa cada sentencia de SQL conviene aprender cómo está escrita. Igual que en cualquier idioma, existen reglas ortográficas y gramaticales que, si desconoces, te harán perder horas frente a mensajes de error crípticos. Esta lección desmonta una sentencia SQL en sus piezas elementales —palabras clave, identificadores, literales, operadores y expresiones— y te explica las reglas del lenguaje: el punto y coma, el tratamiento de mayúsculas y minúsculas, los comentarios, las convenciones de estilo profesional, la precedencia de operadores y, muy importante, cómo interpretar un mensaje de error de PostgreSQL para localizar el fallo en segundos.
Aquí usaremos sentencias muy simples como vehículo. No es el objetivo aprender aún qué hace SELECT o WHERE —eso es el módulo 2—; el objetivo es entender las reglas ortográficas con las que se escribe cualquier sentencia SQL.
Contenido
- Anatomía de una sentencia SQL
- El punto y coma
- Mayúsculas y minúsculas
- Identificadores entrecomillados
- Comentarios
- Convenciones de estilo y formato
- Operadores y su precedencia
- Literales: cadenas, números, fechas, booleanos y NULL
- Cómo leer un mensaje de error de PostgreSQL
- Errores Comunes y Consejos
- Ejercicios
- Conclusión
- Anatomía de una sentencia SQL
Toda sentencia SQL se compone de un puñado de tipos de elemento. Veamos una y etiquetemos cada pieza:
SELECT nombre, precio * 1.21 AS precio_con_iva
FROM productos
WHERE activo = TRUE AND precio > 10.00;| Elemento | En el ejemplo | Qué es |
|---|---|---|
| Palabras clave | SELECT, FROM, WHERE, AS, AND, TRUE |
Términos reservados del lenguaje |
| Identificadores | nombre, precio, productos, activo, precio_con_iva |
Nombres de tablas, columnas, alias, esquemas |
| Literales | 1.21, 10.00, TRUE |
Valores escritos directamente en el texto |
| Operadores | *, =, >, AND |
Símbolos o palabras que combinan valores |
| Expresiones | precio * 1.21, activo = TRUE AND precio > 10.00 |
Combinaciones de lo anterior que producen un valor |
| Cláusulas | SELECT ..., FROM ..., WHERE ... |
Bloques que estructuran la sentencia |
| Terminador | ; |
Marca el final de la sentencia |
Merece la pena detenerse en la diferencia entre palabra clave e identificador, porque es la fuente de la mitad de los errores de principiante:
- Una palabra clave forma parte del lenguaje. No la eliges tú:
SELECTsiempre significa lo mismo. - Un identificador es un nombre que alguien puso a un objeto: la tabla
productosse llama así porque quien diseñó TiendaVerde lo decidió.
Reglas de los identificadores en PostgreSQL:
- Empiezan por letra o
_, y siguen con letras, dígitos,_o$. - Longitud máxima: 63 caracteres (lo que sobra se trunca en silencio).
- No pueden coincidir con una palabra reservada... salvo que los entrecomilles (sección 4).
- Se recomienda
snake_caseen minúsculas:lineas_pedido,fecha_pedido,referido_por_id.
Una expresión es cualquier cosa que se evalúa y produce un valor. Puedes comprobarlo sin ninguna tabla:
| ?column? |
|---|
| 5 |
En PostgreSQL, SELECT sin FROM es perfectamente válido y es la mejor forma de experimentar con expresiones sueltas. Lo usaremos mucho en esta lección.
- El punto y coma
El ; marca el final de una sentencia. Su papel es doble:
- Separar varias sentencias en un mismo fichero o bloque.
- Indicar al cliente que ya puede enviar la sentencia al servidor.
Esas son tres sentencias independientes. Sin los puntos y coma, PostgreSQL leería SELECT 1 SELECT 2 SELECT 3 e informaría de un error de sintaxis.
Si en psql pulsas Intro sin haber cerrado la sentencia, el símbolo del sistema cambia:
Ese guion (-#) significa "sigo esperando". No es un error: puedes repartir una sentencia en tantas líneas como quieras.
| Situación | ¿Hace falta ;? |
|---|---|
| Una sola sentencia en un cliente gráfico | Opcional, pero recomendable |
Varias sentencias en un fichero .sql |
Obligatorio |
Metacomandos de psql (\dt, \l, \q) |
No, no son SQL |
| Última sentencia de un fichero | Recomendable (evita sorpresas al concatenar ficheros) |
Consejo: ponlo siempre. Es gratis y te ahorra depurar por qué un script se ejecutó "a medias".
- Mayúsculas y minúsculas
Aquí hay dos reglas distintas que conviene no mezclar.
3.1. Las palabras clave no distinguen mayúsculas
Estas cuatro sentencias son idénticas para PostgreSQL:
SELECT nombre FROM productos;
select nombre from productos;
Select Nombre From Productos;
sELeCt nombre FrOm productos;Aun así, la convención universal es escribir las palabras clave en MAYÚSCULAS, porque hace la consulta mucho más legible: de un vistazo distingues la estructura del lenguaje de los nombres de tu esquema.
3.2. Los identificadores sin comillas se convierten a minúsculas
Esta es la parte que sorprende. El estándar SQL dice que los identificadores sin comillas deben plegarse a mayúsculas; PostgreSQL, por razones históricas, los pliega a minúsculas. El efecto práctico es que:
es exactamente lo mismo que:
porque PostgreSQL convierte internamente Nombre → nombre y Productos → productos.
Compáralo entre motores:
| SGBD | Palabras clave | Identificadores sin comillas | Nombres de tabla |
|---|---|---|---|
| PostgreSQL | Insensibles | Se pliegan a minúsculas | Insensibles (por el plegado) |
| MySQL en Linux | Insensibles | Se conservan tal cual | Sensibles a mayúsculas |
| MySQL en Windows/macOS | Insensibles | Se conservan tal cual | Insensibles (por el sistema de ficheros) |
| SQLite | Insensibles | Se conservan tal cual | Insensibles |
| Oracle | Insensibles | Se pliegan a MAYÚSCULAS | Insensibles (por el plegado) |
Moraleja práctica: usa siempre minúsculas y snake_case en tus identificadores. Así tu SQL se comporta igual en todos los motores y te ahorras el problema entero.
Ojo: la insensibilidad a mayúsculas afecta a la sintaxis, no a los datos. Los valores sí distinguen:
| ?column? |
|---|
| false |
- Identificadores entrecomillados
Si rodeas un identificador con comillas dobles, PostgreSQL lo toma literalmente: respeta mayúsculas, espacios y caracteres especiales.
-- Estas dos tablas serían DISTINTAS para PostgreSQL
CREATE TABLE productos (...); -- se llama internamente: productos
CREATE TABLE "Productos" (...); -- se llama internamente: ProductosY a partir de ahí, cualquier referencia a la segunda obliga a repetir las comillas:
SELECT * FROM "Productos"; -- funciona
SELECT * FROM Productos; -- ERROR: relation "productos" does not existEse error es de los más desconcertantes: la tabla existe, se ve en \dt, y aun así el motor dice que no la encuentra. La causa es siempre la misma: alguien la creó entrecomillada con mayúsculas.
| Uso de comillas dobles | Cuándo es legítimo |
|---|---|
Identificador que coincide con palabra reservada ("order", "user") |
Aceptable, aunque es mejor renombrarlo |
Identificador con espacios ("nombre del cliente") |
Evitar siempre |
Identificador con mayúsculas ("FechaPedido") |
Evitar siempre |
Alias que quieres mostrar bonito en un informe (AS "Precio con IVA") |
Uso razonable |
Regla del curso: todas las tablas y columnas de TiendaVerde están en minúsculas y
snake_caseprecisamente para que nunca necesites comillas dobles. La única excepción aceptable serán los alias de presentación.
Y no lo olvides: comillas dobles = identificador; comillas simples = cadena de texto. No son intercambiables (volveremos a ello en la sección 8).
- Comentarios
SQL admite dos formas de comentario:
-- Comentario de una línea: desde los dos guiones hasta el fin de línea
/* Comentario de bloque:
puede ocupar varias líneas
y es útil para desactivar trozos de consulta */
SELECT nombre, -- el nombre comercial del producto
precio /* precio de venta al público, sin IVA */
FROM productos;| Forma | Sintaxis | Uso típico |
|---|---|---|
| Línea | -- texto |
Anotar una columna o una condición |
| Bloque | /* texto */ |
Cabeceras de script, desactivar temporalmente varias líneas |
En PostgreSQL los comentarios de bloque se pueden anidar, algo que no todos los motores permiten:
Buenas prácticas con los comentarios:
- Comenta el porqué, no el qué.
-- filtramos activossobra si la línea ya diceWHERE activo = TRUE. En cambio-- los inactivos son productos descatalogados que conservamos por históricosí aporta. - Encabeza los scripts largos con un bloque que explique qué hacen y quién los mantiene.
- Usa
--para desactivar una línea mientras depuras, pero limpia esos restos antes de dar la consulta por buena.
- Convenciones de estilo y formato
SQL ignora los saltos de línea y los espacios de más, así que el formato es enteramente para las personas. Y sí, importa: una consulta de veinte líneas mal formateada es imposible de revisar.
Antes (todo en una línea, palabras clave en minúsculas, sin estructura):
select p.nombre, c.nombre, p.precio from productos p join categorias c on p.categoria_id = c.id where p.activo = true and p.precio between 5 and 20 order by p.precio desc;Después (una cláusula por línea, palabras clave en mayúsculas, alineación clara):
SELECT p.nombre,
c.nombre AS categoria,
p.precio
FROM productos AS p
JOIN categorias AS c ON p.categoria_id = c.id
WHERE p.activo = TRUE
AND p.precio BETWEEN 5 AND 20
ORDER BY p.precio DESC;Las dos hacen exactamente lo mismo. La segunda se puede leer, revisar y modificar.
Convenciones que sigue este curso (y que son las más extendidas del sector):
| Regla | Ejemplo |
|---|---|
| Palabras clave en MAYÚSCULAS | SELECT, FROM, WHERE, AND |
Identificadores en minúsculas y snake_case |
lineas_pedido, fecha_pedido |
| Una cláusula principal por línea | SELECT / FROM / WHERE / ORDER BY en líneas propias |
Condiciones adicionales indentadas bajo WHERE |
AND p.precio > 10 |
| Listas largas de columnas, una por línea | Facilita ver los cambios en Git |
| Tablas en plural, columnas en singular | Tabla clientes, columna nombre |
Claves foráneas como <tabla_singular>_id |
cliente_id, producto_id, categoria_id |
| Sin espacios ni tildes en identificadores | resenas, no reseñas |
Nunca SELECT * en código de producción |
Nombra las columnas explícitamente |
Fíjate en que la tabla se llama
resenasy noreseñas. Es deliberado: evitarñy tildes en identificadores previene problemas de codificación, de portabilidad entre motores y de escritura en teclados no españoles.
- Operadores y su precedencia
7.1. Aritméticos
| Operador | Significado | Ejemplo | Resultado |
|---|---|---|---|
+ |
Suma | SELECT 10 + 3; |
13 |
- |
Resta | SELECT 10 - 3; |
7 |
* |
Multiplicación | SELECT 10 * 3; |
30 |
/ |
División | SELECT 10 / 3; |
3 |
% |
Módulo (resto) | SELECT 10 % 3; |
1 |
^ |
Potencia | SELECT 2 ^ 10; |
1024 |
La trampa está en /: si ambos operandos son enteros, la división es entera.
| division_entera | division_decimal |
|---|---|
| 3 | 3.3333333333333333 |
Con solo escribir 10.0 en lugar de 10 cambias el tipo del literal y con él el resultado. Es una fuente clásica de descuadres al calcular porcentajes.
7.2. De comparación
| Operador | Significado | Ejemplo |
|---|---|---|
= |
Igual | precio = 10 |
<> o != |
Distinto | estado <> 'cancelado' |
<, > |
Menor, mayor | stock > 0 |
<=, >= |
Menor o igual, mayor o igual | precio <= 20 |
BETWEEN ... AND ... |
Dentro de un rango, extremos incluidos | precio BETWEEN 5 AND 20 |
IN (...) |
Pertenece a una lista | pais IN ('España','Francia') |
IS NULL / IS NOT NULL |
Es (o no) nulo | empleado_id IS NULL |
<> es la forma estándar de "distinto"; != funciona en PostgreSQL y en casi todos los motores, pero <> es más portable. Los operadores BETWEEN, IN, LIKE y IS NULL se estudian a fondo en el módulo 4.
7.3. Lógicos
| Operador | Devuelve verdadero cuando... |
|---|---|
AND |
Ambas condiciones son verdaderas |
OR |
Al menos una condición es verdadera |
NOT |
La condición es falsa |
7.4. Precedencia
Cuando mezclas operadores, PostgreSQL los evalúa en este orden (de mayor a menor prioridad):
| Nivel | Operadores |
|---|---|
| 1 | () paréntesis |
| 2 | :: conversión de tipo |
| 3 | - unario (signo negativo) |
| 4 | ^ potencia |
| 5 | *, /, % |
| 6 | +, - |
| 7 | BETWEEN, IN, LIKE |
| 8 | =, <>, <, >, <=, >= |
| 9 | IS NULL, IS NOT NULL |
| 10 | NOT |
| 11 | AND |
| 12 | OR |
Lo que más problemas causa es que AND tiene mayor prioridad que OR. Compara:
SELECT TRUE OR FALSE AND FALSE; -- se evalúa como: TRUE OR (FALSE AND FALSE)
SELECT (TRUE OR FALSE) AND FALSE; -- forzamos otro orden con paréntesis| Consulta | Resultado |
|---|---|
TRUE OR FALSE AND FALSE |
true |
(TRUE OR FALSE) AND FALSE |
false |
Traducido a un caso real de TiendaVerde: "quiero los pedidos de Francia o Portugal que estén entregados". Escrito ingenuamente:
-- MAL: se interpreta como pais='Francia' OR (pais='Portugal' AND estado='entregado')
... WHERE pais = 'Francia' OR pais = 'Portugal' AND estado = 'entregado'
-- BIEN
... WHERE (pais = 'Francia' OR pais = 'Portugal') AND estado = 'entregado'La primera versión te devolvería todos los pedidos franceses, entregados o no. No da error: da un resultado incorrecto en silencio, que es mucho peor.
Consejo profesional: aunque te sepas la tabla de precedencia, pon paréntesis siempre que mezcles
ANDyOR. Cuestan dos caracteres y eliminan la ambigüedad para quien lea tu consulta después.
- Literales: cadenas, números, fechas, booleanos y NULL
Un literal es un valor escrito directamente en la sentencia.
8.1. Cadenas de texto: comillas SIMPLES
Las cadenas van entre comillas simples. Siempre. Este es probablemente el error número uno de quien viene de otros lenguajes de programación, donde "texto" y 'texto' son equivalentes:
El mensaje delata lo que ha pasado: PostgreSQL ha entendido las comillas dobles como un identificador, ha buscado una columna llamada Alimentación y no la ha encontrado.
¿Y si el texto contiene una comilla simple, como en "L'Eliana"? Se duplica:
| poblacion |
|---|
| L'Eliana |
PostgreSQL también admite las dollar-quoted strings, muy cómodas para textos con muchas comillas:
8.2. Numéricos
SELECT 42; -- entero
SELECT -17; -- entero negativo
SELECT 12.50; -- decimal exacto (tipo numeric)
SELECT 1.2e3; -- notación científica: 1200Los números no llevan comillas. Si escribes '12.50' estás creando una cadena de texto que PostgreSQL a veces convertirá por ti y a veces no, con resultados sorprendentes.
8.3. Fechas y horas
Las fechas se escriben como cadenas de texto, entre comillas simples, en formato ISO 8601 (AAAA-MM-DD):
SELECT DATE '2026-02-14' AS fecha;
SELECT TIMESTAMP '2026-02-14 18:30:00' AS momento;
SELECT '2026-02-14'::DATE AS fecha_con_cast;| fecha |
|---|
| 2026-02-14 |
Escribe siempre en formato ISO. Si escribes '14/02/2026', el motor lo interpretará según su configuración regional (DateStyle), y en un servidor configurado a la americana '03/04/2026' puede significar 3 de abril o 4 de marzo. Es un error que no salta nunca: simplemente produce datos incorrectos. Las funciones de fecha se ven a fondo en el módulo 6.
8.4. Booleanos
PostgreSQL acepta varias formas de escribirlos: TRUE/FALSE, 't'/'f', 'yes'/'no', '1'/'0'. Usa TRUE y FALSE a secas: es lo más claro.
Nota de dialecto: MySQL no tiene un tipo booleano real;
BOOLEANes un alias deTINYINT(1)dondeTRUEes 1 yFALSEes 0. SQLite tampoco tiene booleano nativo: los guarda como 0 y 1.
8.5. NULL
NULL no es un valor: es la ausencia de valor. En TiendaVerde, pedidos.empleado_id es NULL cuando el pedido llegó por la web y ningún comercial lo gestionó.
Lo que importa ahora, sintácticamente, es que NULL no se compara con =:
| con_igual | con_is_null |
|---|---|
| (null) | true |
NULL = NULL no da ni verdadero ni falso: da NULL, porque comparar dos incógnitas no permite concluir nada. Por eso existe el operador IS NULL. La semántica completa de los nulos se estudia en la lección 04-03; aquí basta con que retengas la regla: para nulos, IS NULL; nunca = NULL.
8.6. Resumen de literales
| Tipo | Cómo se escribe | Ejemplo correcto | Error típico |
|---|---|---|---|
| Cadena | Comillas simples | 'Cosmética natural' |
"Cosmética natural" (sería un identificador) |
| Número | Sin comillas | 12.50 |
'12.50' |
| Fecha | Comillas simples, formato ISO | '2026-02-14' |
'14/02/2026' |
| Booleano | Sin comillas | TRUE |
'TRUE' |
| Nulo | Palabra clave NULL |
IS NULL |
= NULL |
- Cómo leer un mensaje de error de PostgreSQL
Los mensajes de PostgreSQL son de los mejores del sector, pero hay que saber leerlos. Tienen hasta cuatro partes:
| Parte | Significado |
|---|---|
ERROR: |
La descripción del problema |
at or near "FORM" |
El token donde el analizador se atascó |
LINE 2: |
La línea de tu sentencia |
^ |
La columna exacta |
La clave está en la expresión "at or near" ("en o cerca de"). PostgreSQL señala dónde detectó el problema, que muy a menudo es una posición después de donde realmente está el error. Si el cursor apunta a algo que parece correcto, mira siempre el token anterior.
Ejemplo real:
El cursor apunta a FROM, pero FROM está perfectamente escrito. El error real es que falta una coma entre nombre y precio: PostgreSQL interpretó precio como un alias de nombre (un alias puede escribirse sin AS), y al llegar a FROM ya no encajaba nada más.
Los errores más frecuentes al empezar y su traducción:
| Mensaje | Qué significa realmente | Cómo se arregla |
|---|---|---|
syntax error at or near "X" |
Gramática rota en X o justo antes | Revisa el token anterior: comas, paréntesis, palabras mal escritas |
relation "productos" does not exist |
La tabla no existe, o está en otro esquema, o se creó con comillas y mayúsculas | \dt para ver el nombre real; comprueba a qué base estás conectado |
column "Alimentación" does not exist |
Usaste comillas dobles para una cadena de texto | Cambia a comillas simples |
column "prcio" does not exist |
Errata en el nombre de la columna | \d productos para ver los nombres exactos |
operator does not exist: text > integer |
Estás comparando tipos incompatibles | Revisa el tipo de la columna; usa CAST (módulo 6) |
unterminated quoted string at or near "'..." |
Falta cerrar una comilla simple | Cuenta las comillas; si estás en psql, el símbolo '# te avisa |
division by zero |
Divides entre 0 | Protege el divisor (NULLIF, módulo 6) |
Procedimiento recomendado ante cualquier error:
- Lee el mensaje entero, no solo la primera palabra.
- Localiza la línea y la columna con el
^. - Si lo señalado parece correcto, mira lo anterior.
- Comprueba lo básico: comas, paréntesis equilibrados, comillas cerradas, tipo de comilla.
- Si es un nombre, verifícalo con
\d. - Si la consulta es larga, redúcela: quita cláusulas hasta que funcione y añádelas de nuevo una a una.
Errores Comunes y Consejos
- Usar comillas dobles para texto.
"Valencia"es un identificador;'Valencia'es una cadena. Si el error habla de una "column ... does not exist" con el texto que querías buscar, es esto. - Olvidar la coma entre columnas. Produce un
syntax error at or near "FROM"que despista mucho, porqueFROMestá bien. - Crear objetos con
"MayúsculasEntrecomilladas". Te condena a repetir las comillas para siempre. Usasnake_caseen minúsculas. - Confiar en la precedencia de
AND/OR. No da error, da resultados equivocados. Pon paréntesis. - División entera inesperada.
10 / 3es3. Convierte a decimal antes de calcular porcentajes o medias. - Fechas en formato local. Escribe siempre
'AAAA-MM-DD'. - Comparar con
= NULL. No devuelve filas nunca, y no avisa. UsaIS NULL. - Consejo: formatea antes de depurar. Una consulta de una sola línea es imposible de revisar; ponla en varias líneas y el error suele saltar a la vista.
- Consejo: prueba las expresiones con
SELECTsinFROM. Antes de meter un cálculo en una consulta grande, verifícalo aislado:SELECT 12.50 * 1.21;. - Consejo: cuando algo falle, simplifica. Quita mitad de la consulta y comprueba si el error persiste. Es la forma más rápida de acotar.
Ejercicios
Ejercicio 1
Localiza y corrige cuatro errores de sintaxis en la siguiente sentencia. Indica qué mensaje daría PostgreSQL en cada caso.
Ejercicio 2
Sin ejecutar nada, predice el resultado de estas cinco expresiones y explica por qué. Después compruébalas con SELECT.
SELECT 7 / 2;
SELECT 7.0 / 2;
SELECT TRUE OR FALSE AND FALSE;
SELECT 'Valencia' = 'valencia';
SELECT NULL = NULL;Ejercicio 3
Reescribe esta consulta aplicando las convenciones de estilo del curso (palabras clave en mayúsculas, una cláusula por línea, indentación de las condiciones) y corrige el fallo lógico que contiene: la intención era obtener los pedidos pagados o enviados cuyos gastos de envío superen los 5 €.
select id, estado, gastos_envio from pedidos where estado = 'pagado' or estado = 'enviado' and gastos_envio > 5;Soluciones
Solución 1
Los cuatro errores, en orden de aparición:
| # | Error | Mensaje de PostgreSQL | Corrección |
|---|---|---|---|
| 1 | Falta la coma entre nombre y precio |
syntax error at or near "precio" (o cerca de FORM) |
SELECT nombre, precio, stock |
| 2 | FORM en lugar de FROM |
syntax error at or near "FORM" |
FROM productos |
| 3 | Comillas dobles en la cadena "Valencia" |
column "Valencia" does not exist |
= 'Valencia' |
| 4 | Falta el punto y coma final | En psql, el símbolo se queda en -# esperando |
Añadir ; |
Hay además un problema semántico: la tabla productos de TiendaVerde no tiene columna ciudad (esa columna está en clientes y en empleados). PostgreSQL respondería column "ciudad" does not exist. Versión corregida:
Solución 2
| Expresión | Resultado | Motivo |
|---|---|---|
7 / 2 |
3 |
Ambos operandos son enteros → división entera, se trunca (no se redondea) |
7.0 / 2 |
3.5000000000000000 |
7.0 es numeric, así que la división es decimal |
TRUE OR FALSE AND FALSE |
true |
AND tiene más prioridad: se evalúa TRUE OR (FALSE AND FALSE) = TRUE OR FALSE |
'Valencia' = 'valencia' |
false |
Los datos sí distinguen mayúsculas, aunque la sintaxis no |
NULL = NULL |
NULL |
Comparar dos ausencias de valor no permite concluir nada; hay que usar IS NULL |
Fíjate en el contraste entre las filas 3, 4 y 5: en SQL la insensibilidad a mayúsculas es cosa de la gramática, nunca de los valores, y NULL no se comporta como un valor normal.
Solución 3
El fallo lógico es la precedencia: AND se evalúa antes que OR, de modo que la consulta original significa estado = 'pagado' OR (estado = 'enviado' AND gastos_envio > 5), y devolvería todos los pedidos pagados, incluso los de envío gratuito. Versión corregida y formateada:
SELECT id,
estado,
gastos_envio
FROM pedidos
WHERE (estado = 'pagado' OR estado = 'enviado')
AND gastos_envio > 5;Los paréntesis agrupan la alternativa de estados antes de aplicar el filtro de importe. En el módulo 4 verás una forma todavía más legible de escribir esa primera condición: estado IN ('pagado', 'enviado').
Conclusión
Ya conoces las reglas ortográficas del lenguaje:
- Una sentencia se compone de palabras clave, identificadores, literales, operadores y expresiones, organizados en cláusulas y cerrados por
;. - Las palabras clave no distinguen mayúsculas, pero los identificadores sin comillas se pliegan a minúsculas en PostgreSQL: por eso el curso usa
snake_caseen minúsculas y evita las comillas dobles. - Comentas con
--y/* */, y formateas con una cláusula por línea porque el SQL se escribe una vez y se lee muchas. - Dominas los operadores aritméticos, de comparación y lógicos, y sabes que
ANDprecede aOR: por eso pones paréntesis. - Distingues los literales: comillas simples para texto y fechas ISO, nada de comillas para números y booleanos, y
IS NULLpara los nulos. - Sabes leer un error de PostgreSQL: mensaje, token, línea y cursor, recordando que el fallo suele estar justo antes de lo señalado.
En la siguiente lección, Entendiendo bases de datos y tablas, pasaremos de la forma al contenido: qué es exactamente una base de datos, un esquema, una tabla, una fila y una columna; qué tipos de datos ofrece PostgreSQL y cómo elegir el adecuado (incluido por qué el dinero nunca debe guardarse en un FLOAT); y cómo inspeccionar la estructura de tablas que ya existen.
Curso de SQL
Módulo 1: Introducción a SQL
- ¿Qué es SQL?
- Configurando tu entorno SQL
- Sintaxis básica de SQL
- Entendiendo bases de datos y tablas
- El modelo relacional: claves primarias y foráneas
- La base de datos del curso: TiendaVerde
Módulo 2: Consultas básicas de SQL
- Instrucción SELECT
- Alias, expresiones y columnas calculadas
- Filtrando datos con WHERE
- DISTINCT y eliminación de duplicados
- Ordenando datos con ORDER BY
- Limitando resultados con LIMIT
Módulo 3: Trabajando con múltiples tablas
- Operaciones JOIN
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
- FULL OUTER JOIN
- SELF JOIN y CROSS JOIN
- Uniones de conjuntos: UNION, INTERSECT y EXCEPT
Módulo 4: Filtrado avanzado de datos
- Usando LIKE para coincidencia de patrones
- Operadores IN y BETWEEN
- Valores NULL y IS NULL
- Funciones de agregación: COUNT, SUM, AVG, MIN y MAX
- Agregando datos con GROUP BY
- Cláusula HAVING
Módulo 5: Manipulación de datos
- Creando tablas y restricciones con CREATE TABLE
- Instrucción INSERT
- Instrucción UPDATE
- Instrucción DELETE
- Instrucción UPSERT (MERGE)
- Modificando el esquema: ALTER TABLE y migraciones seguras
Módulo 6: Funciones avanzadas de SQL
- Funciones de cadena
- Funciones numéricas
- Funciones de fecha y hora
- Conversión de tipos y manejo de NULL: CAST y COALESCE
- Expresiones condicionales
Módulo 7: Subconsultas y consultas anidadas
- Introducción a subconsultas
- Subconsultas correlacionadas
- EXISTS y NOT EXISTS
- Usando subconsultas en cláusulas SELECT, FROM y WHERE
- Subconsultas o JOIN: cuál elegir
Módulo 8: Índices y optimización de rendimiento
- Entendiendo los índices
- Creación y gestión de índices
- Tipos de índice y cuándo no indexar
- Técnicas de optimización de consultas
- Análisis del rendimiento de consultas
Módulo 9: Transacciones y concurrencia
- Introducción a las transacciones
- Propiedades ACID
- Instrucciones de control de transacciones
- Niveles de aislamiento y anomalías de concurrencia
- Manejo de concurrencia: bloqueos e interbloqueos
Módulo 10: Temas avanzados
- Vistas
- Expresiones de tabla comunes (CTE)
- Funciones de ventana
- Procedimientos almacenados
- Triggers
- JSON y datos semiestructurados
Módulo 11: SQL en la práctica
- Casos de uso en el mundo real
- Mejores prácticas
- Seguridad: inyección SQL, permisos y roles
- SQL para análisis de datos
- SQL en desarrollo web
