Skip to content

Structured Query Language SQL

SQL te permite obtener información de “conjuntos de datos estructurados”. Estos cuentan con reglas y formatos claros y, a menudo, están organizados en tablas: datos organizados en filas y columnas.

Un ejemplo de datos no estructurados sería un archivo de imagen. Los datos no estructurados no pueden operarse con SQL ni tampoco pueden almacenarse en los conjuntos de datos o tablas de BigQuery (al menos de forma nativa). Para trabajar con datos de imágenes, por ejemplo, deberías usar un servicio como Cloud Vision, quizá directamente a través de su API.

Una base de datos es básicamente una colección de una o más tablas. SQL es una herramienta de administración de bases de datos estructurados, pero con frecuencia se usa para ejecutar consultas en una o varias tablas unidas, no en bases de datos completas.

📦 Definiciones previas: creación y carga de tablas

Nota sobre nombres de dataset en BigQuery: En esta guía, para simplificar la lectura, muchas consultas omiten el nombre del dataset (por ejemplo, FROM orders en lugar de FROM my_dataset.orders). Esto es válido siempre que estés trabajando dentro del mismo dataset.

En los casos donde se crean nuevas tablas (CREATE TABLE, INSERT INTO, CREATE TABLE AS SELECT), se incluye explícitamente my_dataset. para mostrar cómo se especifica correctamente el destino.

Antes de ejecutar consultas, necesitas tener tablas en BigQuery. Aquí te mostramos cómo crearlas y cargarlas.

Crear tabla manualmente desde la UI de BigQuery

  1. Ve a la consola de BigQuery.
  2. Elige tu dataset.
  3. Haz clic en "Crear tabla".
  4. Sube un archivo CSV o JSON desde tu equipo o Cloud Storage.
  5. Define el esquema de forma automática o manual.

Crear tabla con CREATE TABLE

Permite definir una tabla especificando nombre, columnas y tipo de datos.

sql
#standardSQL
CREATE TABLE my_dataset.users (
  id INT64,
  username STRING,
  email STRING
)
CampoTipo
idINT64
usernameSTRING
emailSTRING

Insertar datos con INSERT INTO

Permite ingresar filas directamente en una tabla ya creada.

sql
#standardSQL
INSERT INTO my_dataset.users (id, username, email)
VALUES
  (1, 'alice01', 'alice@example.com'),
  (2, 'bob_dev', 'bob@example.com')

Resultado esperado:

idusernameemail
1alice01alice@example.com
2bob_devbob@example.com

Crear tabla desde una consulta (CREATE TABLE AS SELECT)

Crea una nueva tabla basada en los resultados de una consulta existente.

sql
#standardSQL
CREATE TABLE my_dataset.expensive_orders AS
SELECT * FROM my_dataset.orders
WHERE price > 20

Resultado esperado:

order_iduser_idpriceshipped
101125.99Yes
103342.00Yes

📝 Comandos SQL tratados en esta guía

  • SELECT, FROM
  • WHERE
  • GROUP BY
  • COUNT
  • AS
  • ORDER BY
  • LIMIT
  • HAVING
  • DISTINCT
  • JOIN
  • UNION
  • IN, BETWEEN, LIKE

SELECT - FROM

SQL tiene palabras clave predefinidas que se usan para traducir una pregunta a la sintaxis en seudoinglés de SQL.

  • Usa SELECT para especificar qué columnas deseas extraer.
  • Usa FROM para especificar de qué tabla extraer los datos.

Tabla de ejemplo: users

idusernameemail
1alice01alice@example.com
2bob_devbob@example.com
3charlie88charlie@example.com
4dana21dana@example.com
5elena_kelena@example.com

Tabla de ejemplo: orders

order_iduser_idpriceshipped
101125.99Yes
102210.50No
103342.00Yes
10447.99Yes
105513.49No

Ejemplo 1: seleccionar una columna

Obtener solo los nombres de usuario.

sql
#standardSQL
SELECT username FROM users
username
alice01
bob_dev
charlie88
dana21
elena_k

Ejemplo 2: seleccionar múltiples columnas

Obtener nombre de usuario y correo electrónico.

sql
#standardSQL
SELECT username, email FROM users
usernameemail
alice01alice@example.com
bob_devbob@example.com
charlie88charlie@example.com
dana21dana@example.com
elena_kelena@example.com

WHERE

Filtra filas según condiciones especificadas en columnas.

Ejemplo 3: filtra los usuarios que contienen "dev"

sql
#standardSQL
SELECT username FROM users WHERE username LIKE '%dev%'
username
bob_dev

GROUP BY

Agrupa resultados que comparten un mismo valor en una columna.

Ejemplo 4: agrupa por estado de envío

sql
#standardSQL
SELECT shipped FROM orders GROUP BY shipped
shipped
Yes
No

COUNT

Cuenta el número de registros por grupo o total.

Ejemplo 5: contar pedidos por estado de envío

sql
#standardSQL
SELECT shipped, COUNT(*) AS total FROM orders GROUP BY shipped
shippedtotal
Yes3
No2

AS

Asigna alias a columnas o tablas para facilitar su lectura.

Ejemplo 6: alias a la columna de conteo

sql
#standardSQL
SELECT shipped, COUNT(*) AS total FROM orders GROUP BY shipped
shippedtotal
Yes3
No2

ORDER BY

Ordena los resultados por una columna ascendente (ASC) o descendente (DESC).

Ejemplo 7: ordenar precios de mayor a menor

sql
#standardSQL
SELECT price, shipped FROM orders ORDER BY price DESC
priceshipped
42.00Yes
25.99Yes
13.49No
10.50No
7.99Yes

LIMIT

Restringe la cantidad de resultados devueltos.

Ejemplo 8: mostrar los 3 pedidos más caros

sql
#standardSQL
SELECT * FROM orders ORDER BY price DESC LIMIT 3
order_iduser_idpriceshipped
103342.00Yes
101125.99Yes
105513.49No

HAVING

Filtra resultados DESPUÉS de aplicar GROUP BY.

Ejemplo 9: mostrar estados con más de 2 pedidos

sql
#standardSQL
SELECT shipped, COUNT(*) AS total FROM orders GROUP BY shipped HAVING total > 2
shippedtotal
Yes3

DISTINCT

Elimina valores duplicados en los resultados.

Ejemplo 10: mostrar estados de envío únicos

sql
#standardSQL
SELECT DISTINCT shipped FROM orders
shipped
Yes
No

JOIN

Une datos de dos tablas relacionadas.

Ejemplo 11: unir pedidos con usuarios (INNER JOIN)

sql
#standardSQL
SELECT users.username, orders.price
FROM users
JOIN orders ON users.id = orders.user_id
usernameprice
alice0125.99
bob_dev10.50
charlie8842.00
dana217.99
elena_k13.49

Ejemplo 12: LEFT JOIN para mostrar todos los usuarios aunque no tengan pedidos

sql
#standardSQL
SELECT users.username, orders.price
FROM users
LEFT JOIN orders ON users.id = orders.user_id
usernameprice
alice0125.99
bob_dev10.50
charlie8842.00
dana217.99
elena_k13.49

UNION

Combina los resultados de dos consultas.

Ejemplo 13: unir pedidos de enero y febrero

sql
#standardSQL
SELECT username FROM orders_january
UNION
SELECT username FROM orders_february

IN, BETWEEN, LIKE

Se usan con WHERE para condiciones específicas.

Ejemplo 14: usar IN

Usuarios cuyos pedidos fueron enviados:

sql
#standardSQL
SELECT user_id FROM orders WHERE shipped IN ('Yes')
user_id
1
3
4

Ejemplo 15: usar BETWEEN

Precios entre 10 y 30:

sql
#standardSQL
SELECT price FROM orders WHERE price BETWEEN 10 AND 30
price
25.99
10.50
13.49

Ejemplo 16: usar LIKE

Usuarios cuyo nombre comienza con "a":

sql
#standardSQL
SELECT username FROM users WHERE username LIKE 'a%'
username
alice01

Funciones adicionales de BigQuery

Tabla de ejemplo: raw_data

value
123
abc
456

Ejemplo 17: usar SAFE_CAST para convertir texto a entero sin errores

Convierte un string a tipo INT64 de forma segura.

sql
#standardSQL
SELECT value, SAFE_CAST(value AS INT64) AS converted FROM raw_data
valueconverted
123123
abcNULL
456456

Ejemplo 18: usar ARRAY para crear listas

sql
#standardSQL
SELECT user_id, ARRAY_AGG(price ORDER BY price DESC) AS prices
FROM orders
GROUP BY user_id
user_idprices
1[25.99]
2[10.50]
3[42.00]
4[7.99]
5[13.49]

Ejemplo 19: usar WITH para crear subconsultas temporales (CTEs)

sql
#standardSQL
WITH recent_orders AS (
  SELECT *
  FROM orders
  WHERE price > 20
)
SELECT users.username, recent_orders.price
FROM recent_orders
JOIN users ON users.id = recent_orders.user_id
usernameprice
alice0125.99
charlie8842.00

Este documento resume los comandos más comunes de SQL con ejemplos prácticos. Puedes usarlo como referencia rápida para consultas básicas y agregaciones más complejas en bases de datos relacionales como BigQuery, PostgreSQL, MySQL, etc.

Filas duplicadas

Puedes usar GROUP BY junto con COUNT(*) y HAVING para identificar filas que se repiten completamente o según ciertas columnas clave.

Tabla de ejemplo: orders (con duplicados)

| order_id | user_id | price | shipped |
| -------- | ------- | ----- | ------- |
| 101      | 1       | 25.99 | Yes     |
| 102      | 2       | 10.50 | No      |
| 103      | 3       | 42.00 | Yes     |
| 104      | 4       | 7.99  | Yes     |
| 105      | 5       | 13.49 | No      |
| 101      | 1       | 25.99 | Yes     |
| 102      | 2       | 10.50 | No      |

Ejemplo 20: encontrar filas duplicadas

sql
#standardSQL
SELECT
  order_id,
  user_id,
  price,
  shipped,
  COUNT(*) AS num_duplicates
FROM orders
GROUP BY order_id, user_id, price, shipped
HAVING num_duplicates > 1
| order_id | user_id | price | shipped | num_duplicates |
| -------- | ------- | ----- | ------- | --------------- |
| 101      | 1       | 25.99 | Yes     | 2               |
| 102      | 2       | 10.50 | No      | 2               |

🎯 Este tipo de consulta es útil para detectar registros repetidos que podrían afectar análisis o métricas.