Appearance
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
- Ve a la consola de BigQuery.
- Elige tu dataset.
- Haz clic en "Crear tabla".
- Sube un archivo CSV o JSON desde tu equipo o Cloud Storage.
- 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
)
| Campo | Tipo |
|---|---|
| id | INT64 |
| username | STRING |
| STRING |
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:
| id | username | |
|---|---|---|
| 1 | alice01 | alice@example.com |
| 2 | bob_dev | bob@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_id | user_id | price | shipped |
|---|---|---|---|
| 101 | 1 | 25.99 | Yes |
| 103 | 3 | 42.00 | Yes |
📝 Comandos SQL tratados en esta guía
SELECT,FROMWHEREGROUP BYCOUNTASORDER BYLIMITHAVINGDISTINCTJOINUNIONIN,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
SELECTpara especificar qué columnas deseas extraer. - Usa
FROMpara especificar de qué tabla extraer los datos.
Tabla de ejemplo: users
| id | username | |
|---|---|---|
| 1 | alice01 | alice@example.com |
| 2 | bob_dev | bob@example.com |
| 3 | charlie88 | charlie@example.com |
| 4 | dana21 | dana@example.com |
| 5 | elena_k | elena@example.com |
Tabla de ejemplo: orders
| 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 |
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
| username | |
|---|---|
| alice01 | alice@example.com |
| bob_dev | bob@example.com |
| charlie88 | charlie@example.com |
| dana21 | dana@example.com |
| elena_k | elena@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
| shipped | total |
|---|---|
| Yes | 3 |
| No | 2 |
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
| shipped | total |
|---|---|
| Yes | 3 |
| No | 2 |
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
| price | shipped |
|---|---|
| 42.00 | Yes |
| 25.99 | Yes |
| 13.49 | No |
| 10.50 | No |
| 7.99 | Yes |
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_id | user_id | price | shipped |
|---|---|---|---|
| 103 | 3 | 42.00 | Yes |
| 101 | 1 | 25.99 | Yes |
| 105 | 5 | 13.49 | No |
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
| shipped | total |
|---|---|
| Yes | 3 |
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
| username | price |
|---|---|
| alice01 | 25.99 |
| bob_dev | 10.50 |
| charlie88 | 42.00 |
| dana21 | 7.99 |
| elena_k | 13.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
| username | price |
|---|---|
| alice01 | 25.99 |
| bob_dev | 10.50 |
| charlie88 | 42.00 |
| dana21 | 7.99 |
| elena_k | 13.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
| value | converted |
|---|---|
| 123 | 123 |
| abc | NULL |
| 456 | 456 |
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_id | prices |
|---|---|
| 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
| username | price |
|---|---|
| alice01 | 25.99 |
| charlie88 | 42.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.