{"id":28386740,"url":"https://github.com/rociobenitez/sql-cheatsheet","last_synced_at":"2026-02-03T23:32:48.007Z","repository":{"id":294068321,"uuid":"985892390","full_name":"rociobenitez/sql-cheatsheet","owner":"rociobenitez","description":"Resumen práctico de SQL: definición de datos, consultas, manipulación, control y transacciones.","archived":false,"fork":false,"pushed_at":"2025-05-18T18:39:46.000Z","size":82,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-06T18:08:12.632Z","etag":null,"topics":["cheatsheet","dcl","dcl-commands","ddl","ddl-commands","dml","dml-commands","dql-commands","sql","sql-cheatsheet","tcl","tcl-commands"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rociobenitez.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-18T18:28:39.000Z","updated_at":"2025-05-18T18:41:12.000Z","dependencies_parsed_at":null,"dependency_job_id":"ef745b28-26fa-4e21-bce5-d310f4fc28a1","html_url":"https://github.com/rociobenitez/sql-cheatsheet","commit_stats":null,"previous_names":["rociobenitez/sql-cheatsheet"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/rociobenitez/sql-cheatsheet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rociobenitez%2Fsql-cheatsheet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rociobenitez%2Fsql-cheatsheet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rociobenitez%2Fsql-cheatsheet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rociobenitez%2Fsql-cheatsheet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rociobenitez","download_url":"https://codeload.github.com/rociobenitez/sql-cheatsheet/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rociobenitez%2Fsql-cheatsheet/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29061571,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-03T23:14:54.203Z","status":"ssl_error","status_checked_at":"2026-02-03T23:14:50.873Z","response_time":96,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cheatsheet","dcl","dcl-commands","ddl","ddl-commands","dml","dml-commands","dql-commands","sql","sql-cheatsheet","tcl","tcl-commands"],"created_at":"2025-05-30T15:38:05.674Z","updated_at":"2026-02-03T23:32:48.001Z","avatar_url":"https://github.com/rociobenitez.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e📘 SQL Cheatsheet\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  Todo lo esencial de \u003cstrong\u003eSQL\u003c/strong\u003e en una sola hoja. \u003cbr/\u003e\n  Consultas, comandos y operaciones clave explicadas de forma clara, ordenada y con ejemplos prácticos. \n\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/SQL-CheatSheet-blue.svg\" alt=\"SQL Badge\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Práctico-100%25-green.svg\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Formato-Markdown-lightgrey.svg\"/\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n## 📚 Índice de contenido\n\n#### **1. DDL _(Data Definition Language)_**\n\n- [`CREATE`](#create), [`DROP`](#drop), [`ALTER`](#alter), [`TRUNCATE`](#truncate)\n\n#### **2. DQL _(Data Query Language)_**\n\n- [`SELECT`](#select)\n  - [`TOP`/`LIMIT`](#top-limit) | [`AS`](#as)\n  - **Filtros:** [`WHERE`](#where) | [`AND`/`OR`](#and-or) | [`NULL`](#null) | [`BETWEEN`](#between) | [`LIKE`](#like) | [`IN`](#in) | [`EXISTS`](#exists)\n  - **Orden y agrupación:** [`ORDER BY`](#order-by) | [`DISTINCT`](#distinct) | [`GROUP BY`](#group-by) | [`HAVING`](#having)\n  - **Agregaciones:** [`COUNT`|`SUM`|`AVG`|`MIN`|`MAX`](#count-sum-avg-min-max)\n- **Joins:** [`INNER`](#join) | [`LEFT`](#left-join) | [`RIGHT`](#right-join) | [`FULL OUTER`](#full-join) | [`CROSS`](#cross-join) | [`SELF`](#self-join) | [`NATURAL`](#natural-join)\n- **Operadores de conjunto:** [`UNION`/`UNION ALL`](#union) | [`INTERSECT`](#intersect) | [`EXCEPT`/`MINUS`](#except)\n- **Subconsultas avanzadas:** [`ANY`/`ALL`](#any-all) | [`WITH`](#with)\n\n#### **3. DML _(Data Manipulation Language)_**\n\n- [`INSERT`](#insert) | [`UPDATE`](#update) | [`DELETE`](#delete)\n- [`CALL`](#call) | [`LOCK`](#lock)\n\n#### **4. DCL _(Data Control Language)_**\n\n- [`GRANT`](#grant) | [`REVOKE`](#revoke)\n\n#### **5. TCL _(Transaction Control Language)_**\n\n- [`BEGIN TRANSACTION`/`START TRANSACTION`](#begin-start-transaction) | [`COMMIT`](#commit) | [`SAVEPOINT`](#savepoint) | [`ROLLBACK`](#rollback) | [`SET TRANSACTION`](#set)\n\n\u003cbr\u003e\n\n## 1. DDL - `CREATE`**,**`DROP`**,**`ALTER`**,**`TRUNCATE`\n\nLos comandos **DDL _(Data Definition Language)_** permiten **definir, modificar y eliminar estructuras** de bases de datos como esquemas, tablas y vistas.\n\n\u003ca name=\"create\"\u003e\u003c/a\u003e\n\n### **CREATE** (crear tablas, esquemas...)\n\n#### Crear un **esquema** o **base de datos**:\n\n```sql\nCREATE SCHEMA nombre_esquema;\n-- o (MySQL):\nCREATE DATABASE nombre_base_datos;\n```\n\n\u003e [!NOTE] \u003e `SCHEMA` ≠ `DATABASE` en algunos motores (como MySQL/PostgreSQL). En **PostgreSQL**, el esquema es un contenedor lógico para objetos de base de datos como tablas, vistas, secuencias, etc. En **MySQL**, el esquema es equivalente a una base de datos.\n\n#### Crear una **tabla**:\n\n```sql\nCREATE TABLE tabla (\n   col1 datatype,\n   col2 datatype,\n   col3 datatype,\n   col4 datatype,\n);\n```\n\nTambién se puede hacer:\n\n```sql\nCREATE TABLE IF NOT EXISTS tabla ( ... );\n```\n\n```sql\nCREATE TABLE IF NO EXISTS books (\n   id     SERIAL PRIMARY KEY,\n   title  VARCHAR(100) NOT NULL,\n   author VARCHAR(100) NOT NULL\n);\n```\n\n#### Crear una **tabla** en un esquema (PostgreSQL):\n\n```sql\nCREATE TABLE nombre_esquema.tabla (\n   col1 datatype,\n   col2 datatype\n);\n```\n\n#### Crear una **vista** (vista virtual)\n\n```sql\nCREATE VIEW nombre_vista AS\nSELECT columna1, columna2 FROM tabla;\n```\n\n```sql\nCREATE VIEW vista_ventas AS\nSELECT fecha, SUM(total) AS total_diario\nFROM ventas\nGROUP BY fecha;\n```\n\n\u003ca name=\"drop\"\u003e\u003c/a\u003e\n\n### **DROP** - Eliminar objetos\n\n```sql\nDROP TABLE IF EXISTS tabla;\nDROP VIEW IF EXISTS nombre_vista;\nDROP SCHEMA IF EXISTS nombre_esquema CASCADE;\nDROP DATABASE IF EXISTS nombre_base_datos;\n```\n\n\u003ca name=\"alter\"\u003e\u003c/a\u003e\n\n### **ALTER** - Modificar estructuras existentes\n\n#### **`ADD`** - Añadir una nueva columna\n\n```sql\nALTER TABLE tabla ADD nueva_columna tipo;\n```\n\n#### **`RENAME`** - Renombrar una columna\n\n```sql\nALTER TABLE tabla RENAME COLUMN antigua_columna TO nueva_columna;\n```\n\n#### **`MODIFY`** _(MySQL)_ | `ALTER TYPE` _(PostgreSQL)_ - Cambiar el tipo de dato de la columna\n\n```sql\n-- En MySQL\nALTER TABLE tabla MODIFY columna tipo;\n\n-- En PostgreSQL\nALTER TABLE tabla ALTER COLUMN columna TYPE nuevo_tipo;\n```\n\n#### **`DROP`** - Eliminar una columna existente\n\n```sql\nALTER TABLE tabla DROP COLUMN columna;\n```\n\n\u003ca name=\"truncate\"\u003e\u003c/a\u003e\n\n### **TRUNCATE** - Vaciar una tabla (sin eliminar su estructura)\n\nBorra todas las filas de una tabla existente.\n\n```sql\nTRUNCATE TABLE tabla;\nTRUNCATE TABLE tabla RESTART IDENTITY;  -- PostgreSQL: reinicia IDs auto\n```\n\n\u003cbr\u003e\n\n## 2. DQL - `SELECT`\n\nDQL (Data Query Language) se utiliza para **consultar datos** de una base de datos. La palabra clave principal es `SELECT`, acompañada de múltiples cláusulas opcionales que permiten **filtrar, agrupar, ordenar y combinar** resultados.\n\n\u003ca name=\"select\"\u003e\u003c/a\u003e\n\n### **`SELECT`** - Consultar datos\n\n```sql\nSELECT * FROM tabla;\nSELECT col1, col2 FROM tabla;\n```\n\nSeleccionar / Usar una vista (view):\n\n```sql\nSELECT * FROM vista_ventas WHERE fecha = '2024-01-01';\n```\n\n\u003ca name=\"top-limit\"\u003e\u003c/a\u003e\n\n### **`TOP` / `LIMIT`** - Limitar registros\n\nEspecificar el número de registros a devolver desde la parte superior de la tabla.\n\n```sql\n-- SQL Server\nSELECT TOP 10 * FROM tabla;\nSELECT TOP number columnas FROM tabla WHERE condicion;\nSELECT TOP percent columnas FROM tabla WHERE condicion;\n\n-- PostgreSQL / MySQL / SQLite\nSELECT * FROM tabla LIMIT 10;\nSELECT * FROM tabla LIMIT 10 OFFSET 5;\n```\n\n\u003e [!NOTE]\n\u003e No todos los sistemas de bases de datos soportan `SELECT TOP`.\n\u003e El equivalente en MySQL es la cláusula`LIMIT`.\n\n\u003ca name=\"as\"\u003e\u003c/a\u003e\n\n#### **`AS`** - Alias de columnas o tablas\n\nUn _alias_ es el nombre temporal que toma una tabla o columna\n\n```sql\nSELECT columna AS alias FROM tabla;\nSELECT columna FROM tabla AS alias;\n```\n\n```sql\nSELECT col1 AS alias1, col2 AS alias2;\nSELECT col1 AS alias1, col2 AS alias2 FROM tabla AS alias3;\nSELECT t.col1, t.col2 FROM tabla AS t;\n```\n\n\u003ca name=\"where\"\u003e\u003c/a\u003e\n\n#### **`WHERE`** - Filtro condicional\n\n```sql\nSELECT * FROM tabla WHERE columna = valor;\nSELECT col1, col2 FROM tabla WHERE condicion;\nSELECT * FROM tabla WHERE NOT condicion;\nSELECT * FROM tabla WHERE EXISTS (SELECT 1 FROM otra_tabla WHERE condicion);\n```\n\n\u003ca name=\"and-or\"\u003e\u003c/a\u003e\n\n#### **`AND \u0026 OR`** - Múltiples condiciones\n\n```sql\nSELECT * FROM tabla WHERE condicion1 AND condicion2;\nSELECT * FROM tabla WHERE condicion1 AND condicion2 AND ...;\nSELECT * FROM tabla WHERE condicion1 OR condicion2;\nSELECT * FROM tabla WHERE condicion1 OR condicion2 OR ...;\nSELECT * FROM tabla WHERE condicion1 AND (condicion2 OR condicion3);\n```\n\n```sql\nSELECT * FROM tabla WHERE col1 = 'A' AND col2 \u003e 10;\nSELECT * FROM tabla WHERE col1 = 'B' OR col2 \u003c 5;\nSELECT * FROM tabla WHERE col1 = 'X' AND (col2 = 'Y' OR col3 = 'Z');\n```\n\n\u003ca name=\"null\"\u003e\u003c/a\u003e\n\n#### **`NULL`** - Valores nulos\n\n```sql\nSELECT * FROM tabla WHERE columna IS NULL;\nSELECT * FROM tabla WHERE columna IS NOT NULL;\n```\n\n\u003ca name=\"between\"\u003e\u003c/a\u003e\n\n#### **`BETWEEN`** - Rango de valores\n\n```sql\nSELECT col1, col2 FROM tabla WHERE columna BETWEEN value1 AND value2;\nSELECT * FROM tabla WHERE columna BETWEEN 10 AND 20;\nSELECT * FROM ventas WHERE fecha BETWEEN '2024-01-01' AND '2024-12-31';\n```\n\n\u003ca name=\"like\"\u003e\u003c/a\u003e\n\n#### **`LIKE`** - Busqueda por patrón\n\n```sql\nSELECT * FROM tabla WHERE columna LIKE 'a%';      -- empieza por 'a'\nSELECT * FROM tabla WHERE columna LIKE '%a';      -- termina por 'a'\nSELECT * FROM tabla WHERE columna LIKE '%texto%'; -- contiene 'texto'\nSELECT * FROM tabla WHERE columna LIKE '_r%';     -- segundo carácter es 'r'\nSELECT * FROM tabla WHERE columna LIKE 'a%b';     -- empieza por 'a' y termina por 'b'\nSELECT * FROM tabla WHERE columna LIKE 'a%b%c';   -- empieza por 'a', termina por 'c' y tiene 'b' en cualquier posición\n```\n\n- `%` (signo porcentaje) - carácter comodín que representa cero, uno o varios caracteres.\n- `\\_` (underscore) - carácter comodín que representa un único carácter.\n\n\u003ca name=\"in\"\u003e\u003c/a\u003e\n\n#### **`IN`** - Lista de valores o subconsulta\n\n_Esencialmente, el operador `IN` es una abreviatura de las condiciones `OR` múltiples._\n\n```sql\nSELECT columnas FROM tabla WHERE columna IN (value1, value2, …);\nSELECT * FROM tabla WHERE columna IN ('A', 'B', 'C');\nSELECT columnas FROM tabla WHERE columna IN (SELECT columna FROM otra_tabla);\n```\n\n\u003ca name=\"exists\"\u003e\u003c/a\u003e\n\n#### **`EXISTS`** - Subconsulta\n\n```sql\nSELECT * FROM tabla\nWHERE EXISTS (\n   SELECT 1\n   FROM otra_tabla\n   WHERE condicion\n);\n```\n\n```sql\nSELECT name\nFROM countries\nWHERE EXISTS (\n   SELECT *\n   FROM cities\n   WHERE country_id = countries.id\n)\n```\n\n\u003ca name=\"order-by\"\u003e\u003c/a\u003e\n\n#### **`ORDER BY`** - Orden de resultados (**ascendente** o **descendente**)\n\n```sql\nSELECT * FROM tabla ORDER BY column;\nSELECT * FROM tabla ORDER BY column DESC;\nSELECT * FROM tabla ORDER BY col1 ASC, col2 DESC;\n```\n\n\u003ca name=\"distinct\"\u003e\u003c/a\u003e\n\n#### **`DISTINCT`** - Eliminar duplicados\n\n```sql\nSELECT DISTINCT col1, col2 FROM tabla;\n```\n\n\u003ca name=\"group-by\"\u003e\u003c/a\u003e\n\n#### **`GROUP BY`** – Agrupar resultados\n\n```sql\nSELECT columna, COUNT(*) FROM tabla GROUP BY columna;\nSELECT departamento, COUNT(*) FROM empleados GROUP BY departamento;\n```\n\n```sql\nSELECT col1, COUNT(col2) FROM tabla WHERE condicion\nGROUP BY col1 ORDER BY COUNT(col2) DESC;\n```\n\n\u003ca name=\"having\"\u003e\u003c/a\u003e\n\n#### **`HAVING`** - Filtro para grupos (con agregaciones)\n\n```sql\nSELECT columna, COUNT(*) FROM tabla GROUP BY columna HAVING COUNT(*) \u003e 10;\nSELECT COUNT(col1), col2 FROM tabla GROUP BY col2 HAVING COUNT(col1) \u003e 5;\nSELECT departamento, COUNT(*) FROM empleados GROUP BY departamento HAVING COUNT(*) \u003e 10;\n```\n\n\u003ca name=\"count-sum-avg-min-max\"\u003e\u003c/a\u003e\n\n#### **`COUNT`, `SUM`, `AVG`, `MIN`, `MAX`**\n\n```sql\nSELECT COUNT(*) FROM tabla;\nSELECT COUNT(DISTINCT columna) FROM tabla;\nSELECT SUM(total) FROM ventas;\nSELECT AVG(salario) FROM empleados;\nSELECT MIN(precio), MAX(precio) FROM productos;\n```\n\n### Joins\n\nA continuación un set de **tablas de ejemplo** y cómo quedan los resultados tras cada tipo de `JOIN`.\n\n**`empleados`**\n\n| id  | nombre | dep_id | supervisor_id |\n| --- | ------ | ------ | ------------- |\n| 1   | Juan   | 1      | NULL          |\n| 2   | María  | 2      | 1             |\n| 3   | Pedro  | 3      | 1             |\n| 4   | Ana    | 2      | 2             |\n\n**`departamentos`**\n\n| id  | departamento     |\n| --- | ---------------- |\n| 1   | Marketing        |\n| 2   | Ventas           |\n| 3   | Recursos Humanos |\n| 4   | Finanzas         |\n\n\u003ca name=\"inner-join\"\u003e\u003c/a\u003e\n\n#### **`INNER JOIN`** - Solo los registros que coinciden\n\n```sql\nSELECT columnas\nFROM tabla1\nINNER JOIN tabla2\n   ON tabla1.columna = tabla2.columna;\n\nSELECT tabla1.columna1, tabla2.columna2, tabla3.columna3\nFROM ( ( tabla1\n   INNER JOIN tabla2\n      ON relacion\n   )\nINNER JOIN tabla3\n   ON relacion\n);\n```\n\n```sql\nSELECT e.nombre, d.departamento\nFROM empleados e\nINNER JOIN departamentos d\n  ON e.dep_id = d.id;\n```\n\n**Resultado:**\n\n| nombre | departamento     |\n| ------ | ---------------- |\n| Juan   | Marketing        |\n| María  | Ventas           |\n| Pedro  | Recursos Humanos |\n| Ana    | Ventas           |\n\n\u003ca name=\"left-join\"\u003e\u003c/a\u003e\n\n#### `LEFT JOIN` - Todos los registros de la tabla de la izquierda\n\n```sql\nSELECT e.nombre, d.departamento\nFROM empleados e\nLEFT JOIN departamentos d\n  ON e.dep_id = d.id;\n```\n\n**Resultado:**\n\n| nombre | departamento     |\n| ------ | ---------------- |\n| Juan   | Marketing        |\n| María  | Ventas           |\n| Pedro  | Recursos Humanos |\n| Ana    | Ventas           |\n\n\u003ca name=\"right-join\"\u003e\u003c/a\u003e\n\n#### `RIGHT JOIN` - Todos los registros de la tabla de la derecha\n\n```sql\nSELECT columnas\nFROM tabla1\nRIGHT JOIN tabla2\n   ON tabla1.columna = tabla2.columna;\n```\n\n```sql\nSELECT e.nombre, d.departamento\nFROM empleados e\nRIGHT JOIN departamentos d\n  ON e.dep_id = d.id;\n```\n\n**Resultado:**\n\n| nombre | departamento     |\n| ------ | ---------------- |\n| Juan   | Marketing        |\n| María  | Ventas           |\n| Pedro  | Recursos Humanos |\n| Ana    | Ventas           |\n| NULL   | Finanzas         |\n\n\u003ca name=\"full-join\"\u003e\u003c/a\u003e\n\n#### `FULL [OUTER] JOIN` - Todos los registros de ambas tablas\n\n```sql\nSELECT columnas\nFROM tabla1\nFULL OUTER JOIN tabla2\n   ON tabla1.columna = tabla2.columna;\n```\n\n```sql\nSELECT e.nombre, d.departamento\nFROM empleados e\nFULL OUTER JOIN departamentos d\n  ON e.dep_id = d.id;\n```\n\n**Resultado:**\n\n| nombre | departamento     |\n| ------ | ---------------- |\n| Juan   | Marketing        |\n| María  | Ventas           |\n| Pedro  | Recursos Humanos |\n| Ana    | Ventas           |\n| NULL   | Finanzas         |\n\n\u003ca name=\"cross-join\"\u003e\u003c/a\u003e\n\n#### `CROSS JOIN` - Todas las combinaciones posibles de registros de ambas tablas\n\n```sql\nSELECT e.nombre, d.departamento\nFROM empleados e\nCROSS JOIN departamentos d;\n```\n\n**Resultado (4×4 = 16 filas):** Ejemplo de las primeras 4 filas:\n\n| nombre | departamento     |\n| ------ | ---------------- |\n| Juan   | Marketing        |\n| Juan   | Ventas           |\n| Juan   | Recursos Humanos |\n| Juan   | Finanzas         |\n\n\u003ca name=\"self-join\"\u003e\u003c/a\u003e\n\n#### `SELF JOIN` (empleados y sus supervisores) - Unir una tabla consigo misma\n\n```sql\nSELECT e.nombre      AS empleado,\n       s.nombre      AS supervisor\nFROM empleados e\nJOIN empleados s\n  ON e.supervisor_id = s.id;\n```\n\n**Resultado:**\n\n| empleado | supervisor |\n| -------- | ---------- |\n| María    | Juan       |\n| Pedro    | Juan       |\n| Ana      | María      |\n\n\u003ca name=\"natural-join\"\u003e\u003c/a\u003e\n\n#### `NATURAL JOIN` _(según SGBD)_\n\n\u003e Une automáticamente por columnas de mismo nombre (`dep\\_id = id`). Puede ser inseguro si hay nombres duplicados.\n\n```sql\nSELECT *\nFROM empleados\nNATURAL JOIN departamentos;\n```\n\n**Resultado equivalente a INNER JOIN:**\n\n| id  | nombre | departamento     |\n| --- | ------ | ---------------- |\n| 1   | Juan   | Marketing        |\n| 2   | María  | Ventas           |\n| 3   | Pedro  | Recursos Humanos |\n| 4   | Ana    | Ventas           |\n\n\u003cbr\u003e\n\n### Operadores de conjunto (Set Operators)\n\n\u003ca name=\"union\"\u003e\u003c/a\u003e\n\n#### **`UNION` | `UNION ALL`**\n\n\u003cimg src=\"./src/sql-full-join.jpg\" width=\"300\"\u003e\n\nCombina los resultados de dos o más consultas `SELECT` en un solo conjunto de resultados.\n\n- Cada sentencia `SELECT` debe tener el mismo número de columnas.\n- Las columnas deben tener el mismo tipo de datos.\n- Las columnas en cada `SELECT` deben también estar en el mismo orden.\n\n```sql\nSELECT columnas FROM tabla1\nUNION\nSELECT columna FROM tabla2;\n```\n\nEl operador `UNION` solo selecciona valores distintos, `UNION ALL` permitirá duplicados\n\n```sql\nSELECT columnas FROM tabla1\nUNION ALL\nSELECT columnas FROM tabla3;\n```\n\n_Ejemplo: \"Obtener los nombres de ciclistas y nadadores españoles\"._\n\n```sql\nSELECT name FROM cycling WHERE country = 'ES'\nUNION\nSELECT name FROM swimming WHERE country = 'ES';\n```\n\n\u003ca name=\"insert\"\u003e\u003c/a\u003e\n\n#### **`INTERSECT`**\n\n\u003cimg src=\"./src/sql-inner-join.jpg\" width=\"300\"\u003e\n\nDevuelve los registros que están presentes en ambas tablas. Suele utilizarse del mismo modo que `UNION`.\n\n```sql\nSELECT columnas FROM tabla1\nINTERSECT\nSELECT columna FROM tabla2;\n```\n\n_Ejemplo: \"Obtener los nombres de ciclistas que también hacen triatlón en España\"._\n\n```sql\nSELECT name FROM cycling WHERE country = 'ES'\nINTERSECT\nSELECT name FROM triathlon WHERE country = 'ES';\n```\n\n\u003ca name=\"except\"\u003e\u003c/a\u003e\n\n#### **`EXCEPT` / `MINUS`** _(según SGBD)_\n\n\u003cimg src=\"./src/sql-left-subtrack-join.jpg\" width=\"300\"\u003e\n\nUtilizado para devolver todos los registros de la primera sentencia `SELECT` que no se encuentran en la segunda sentencia `SELECT`. Generalmente se utiliza de la misma manera que **UNION**.\n\n```sql\nSELECT columnas FROM tabla1\nEXCEPT\nSELECT columna FROM tabla2;\n```\n\n_Ejemplo: \"Obtener los nombres de ciclistas que no hacen triatlón en España\"._\n\n```sql\nSELECT name FROM cycling WHERE country = 'ES'\nEXCEPT\nSELECT name FROM triathlon WHERE country = 'ES';\n```\n\n### Subconsultas avanzadas\n\n\u003ca name=\"any-all\"\u003e\u003c/a\u003e\n\n#### **`ANY` / `ALL`** - Subconsultas con operadores de comparación\n\n- `ANY` - Devuelve verdadero si algún valor de la subconsulta cumple la condicion.\n- `ALL` - Devuelve verdadero si todos los valores de la subconsulta cumplen la condicion.\n\n```sql\nSELECT * FROM tabla WHERE columna operator ANY (SELECT * FROM tabla WHERE condicion);\nSELECT * FROM tabla WHERE columna operator ALL (SELECT * FROM tabla WHERE condicion);\n```\n\n```sql\nSELECT * FROM productos\nWHERE precio \u003e ANY (\n   SELECT precio FROM productos WHERE categoria = 'A'\n);\n\nSELECT * FROM productos\nWHERE precio \u003e ALL (\n   SELECT precio FROM productos WHERE categoria = 'B'\n);\n```\n\n- `ANY` - Busca todos los productos cuyo precio sea mayor que al menos uno de los precios de la categoría A (`\u003e mínimo` de los valores).\n- `ALL` - Busca todos los productos cuyo precio sea mayor que todos los precios de la categoría B (`\u003e máximo` de los valores).\n\n\u003ca name=\"with\"\u003e\u003c/a\u003e\n\n#### **`WITH`** - CTE (Common Table Expression)\n\nSubconsultas con alias temporales\n\n```sql\nWITH alias AS (\n   SELECT * FROM tabla WHERE condicion\n)\nSELECT * FROM alias WHERE condicion;\n```\n\n```sql\nWITH empleados_activos AS (\n  SELECT * FROM empleados WHERE activo = TRUE\n)\nSELECT * FROM empleados_activos WHERE salario \u003e 3000;\n```\n\n\u003cbr\u003e\n\n## 3. DML - `INSERT`, `UPDATE`, `DELETE`, `CALL`, `LOCK`\n\n\u003ca name=\"insert\"\u003e\u003c/a\u003e\n\n### **`INSERT INTO`**\n\nInsertar una fila en todas las columnas:\n\n```sql\nINSERT INTO tabla VALUES (value1, value2 …);\nINSERT INTO empleados VALUES (2, 'Rocío', 1, NULL);\n```\n\nInsertar múltiples filas:\n\n```sql\nINSERT INTO tabla (col1, col2) VALUES\n   (value1, value2),\n   (value3, value4),\n   (value5, value6);\n\nINSERT INTO empleados (id, nombre, dep_id) VALUES\n   (2, 'Rocío', 1),\n   (3, 'Elena', 2),\n   (4, 'Ángel', 3);\n```\n\nInsertar desde otra tabla:\n\n```sql\nINSERT INTO tabla (col1, col2)\nSELECT col1, col2\nFROM otra_tabla;\n\nINSERT INTO empleados_ventas (id, nombre)\nSELECT id, nombre\nFROM empleados WHERE dep_id = 2;\n```\n\n\u003ca name=\"update\"\u003e\u003c/a\u003e\n\n### **`UPDATE`**\n\nActualizar columnas con condición:\n\n```sql\nUPDATE tabla\nSET col1 = value1, col2 = value2\nWHERE condicion;\n\nUPDATE empleados\nSET salario = salario * 1.1\nWHERE dep_id = 1;\n```\n\n```sql\n-- UPDATE con JOIN (PostgreSQL)\nUPDATE empleados e\nSET salario = s.nuevo_salario\nFROM ajustes s\nWHERE e.id = s.emp_id;\n```\n\n\u003ca name=\"delete\"\u003e\u003c/a\u003e\n\n### **`DELETE`**\n\nEliminar filas según condición:\n\n```sql\nDELETE FROM tabla WHERE condicion;\nDELETE FROM empleados WHERE id = 7;\n```\n\nEliminar todas las filas de una tabla (mantiene la estructura):\n\n```sql\nDELETE FROM empleados;\n```\n\n\u003ca name=\"call\"\u003e\u003c/a\u003e\n\n### **`CALL`** - _(Stored Procedures)_\n\nLlamar a un procedimiento almacenado:\n\n```sql\nCALL procedimiento(param1, param2);\n```\n\n```sql\nCALL sumar_sueldos(3);\n```\n\n\u003ca name=\"lock\"\u003e\u003c/a\u003e\n\n### **`LOCK`** - _(MySQL)_\n\nBloquear una tabla para lectura/escritura (evitar modificaciones):\n\n```sql\nLOCK TABLES tabla1 READ, tabla2 WRITE;\nLOCK TABLES empleados WRITE;\nUNLOCK TABLES;\n```\n\n\u003e [!NOTE] \u003e _No disponible en BigQuery (gestión de permisos a través de consola IAM y control a nivel dataset)._\n\n\u003cbr\u003e\n\n## 4. DCL - `GRANT`, `REVOKE`\n\n\u003ca name=\"grant\"\u003e\u003c/a\u003e\n\n#### **`GRANT`** - Asigna permisos a determinados usuarios\n\n```sql\n-- Conceder SELECT y INSERT a un usuario\nGRANT SELECT, INSERT ON empleados TO juan;\n\n-- Conceder todos los privilegios con opción de re-grant\nGRANT ALL PRIVILEGES ON base_datos.* TO 'app_user'@'%'\n  WITH GRANT OPTION;\n```\n\n\u003e [!NOTE] \u003e _No disponible en BigQuery (gestión de permisos a través de consola IAM y control a nivel dataset)._\n\n\u003ca name=\"revoke\"\u003e\u003c/a\u003e\n\n#### **`REVOKE`** - Revoca permisos a determinados usuarios\n\n```sql\n-- Revocar permisos\nREVOKE INSERT ON empleados FROM juan;\n```\n\n\u003e [!NOTE] \u003e _No disponible en BigQuery (gestión de permisos a través de consola IAM y control a nivel dataset)._\n\n\u003cbr\u003e\n\n## 5. TCL – Control de Transacciones\n\nTCL (Transaction Control Language) gestiona el control de las transacciones, asegurando la integridad de los datos. Incluye comandos para confirmar, deshacer y establecer puntos intermedios.\n\n\u003ca name=\"begin-start-transaction\"\u003e\u003c/a\u003e\n\n#### `BEGIN TRANSACTION`/ `START TRANSACTION` - Iniciar una transacción\n\n```sql\n-- SQL Server / Oracle\nBEGIN TRANSACTION;\n\n-- MySQL / PostgreSQL (implícito tras cualquier DML)\nSTART TRANSACTION;\n```\n\n\u003ca name=\"commit\"\u003e\u003c/a\u003e\n\n#### `COMMIT` - Confirmar cambios\n\n```sql\nCOMMIT;\n```\n\nGuarda **permanentemente** todas las operaciones realizadas desde el inicio de la transacción.\n\n\u003ca name=\"rollback\"\u003e\u003c/a\u003e\n\n#### `ROLLBACK` - Deshacer una transacción\n\n```sql\nROLLBACK;\n```\n\nCancela **toda** la transacción, dejando la base de datos en el estado previo.\n\n\u003ca name=\"savepoint\"\u003e\u003c/a\u003e\n\n#### `SAVEPOINT` - Establecer un punto intermedio\n\n```sql\nSAVEPOINT nombre_punto;\n```\n\n**`ROLLBACK TO SAVEPOINT` - Deshacer hasta un punto**\n\n```sql\nSAVEPOINT nombre_punto;\n-- .. operaciones intermedias ...\nROLLBACK TO SAVEPOINT nombre_punto;\n```\n\nPermite deshacer hasta un punto específico sin abordar toda la transacción.\n\n**`RELEASE SAVEPOINT` - Eliminar un punto intermedio**\n\n```sql\nSAVEPOINT nombre_punto;\n-- .. operaciones intermedias ...\nROLLBACK TO SAVEPOINT nombre_punto;\nRELEASE SAVEPOINT nombre_punto;\n```\n\n\u003ca name=\"set\"\u003e\u003c/a\u003e\n\n#### `SET TRANSACTION` - Nivel de aislamiento y modo\n\n```sql\n-- Definir nivel de aislamiento (PostgreSQL, MySQL 8+)\nSET TRANSACTION ISOLATION LEVEL SERIALIZABLE;\nSET TRANSACTION ISOLATION LEVEL REPEATABLE READ;\n\n-- Modo de solo lectura\nSET TRANSACTION READ ONLY;\n```\n\nControla concurrencia y visibilidad de datos entre transacciones.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frociobenitez%2Fsql-cheatsheet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frociobenitez%2Fsql-cheatsheet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frociobenitez%2Fsql-cheatsheet/lists"}