0% encontró este documento útil (0 votos)
4 vistas174 páginas

Tutorial SQL: Selección y Alias de Columnas

Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
4 vistas174 páginas

Tutorial SQL: Selección y Alias de Columnas

Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

1.

Seleccionando columnas (7 / 7)

2. Seleccionando filas (21 / 21)

3. Ordenando resultados (orden y limit) (7 / 7)

4. Limit (3 / 3)

5. Operaciones con strings (6 / 10)

6. Operaciones con fechas (0 / 7)

7. Funciones de agregación (0 / 10)

8. Distinct (0 / 6)

9. Introducción a grupos (0 / 11)

10. Having (0 / 6)

11. Subconsultas (0 / 9)

12. Combinación de consultas (0 / 5)

13. Inserción de registros (0 / 10)

14. Borrado y modificación de registros (0 / 5)

15. Tablas (0 / 6)

16. Restricciones (0 / 11)

17. Consultas en múltiples tablas (0 / 6)

18. Tipos de join (0 / 4)


Seleccionando columnas
• Tutorial
• Seleccionando todas las columnas de una tabla
• Seleccionando una columna de la tabla
• Seleccionando múltiples columnas de una tabla
• Asignando un alias a una columna con "AS"
• Asignando alias a varias columnas con "AS"
• Asignando un alias con AS y comillas dobl

Tutorial

La plataforma SQL interactivo es una plataforma de microlearning diseñada para aprender a utilizar
bases de datos SQL.

Cada ejercicio está compuesto de 3 partes.

• Introducción: enunciado que proporciona contenido y detalles relevantes para que puedas
entender el objetivo del ejercicio.
• Problema a resolver: ejercicio que se debe resolver utilizando SQL y relacionado con el
contenido de la introducción.
• Editor de código: cuadro de texto donde deberás ingresar el código que resuelve el problema.

Por ejemplo:

Introducción

Una de las acciones que más realizaremos sobre nuestra base de datos es consultar todos los datos de
una tabla. Esto lo podemos hacer con la instrucción:

SELECT * FROM nombre_tabla;

Por ejemplo si tenemos una tabla llamada usuarios podemos obtener todos los datos de los usuarios
escribiendo select * from usuarios.

Problema

Tenemos una tabla llamada asistentes.


Escribe la consulta SELECT * FROM asistentes; en el editor para responder el ejercicio y luego presiona el
botón ejecutar consulta.

Si quieres hacer otras pruebas, ten en cuenta que sólo puedes escribir una consulta a la vez, por lo que
si ya escribiste select * from asistentes y quieres probar algo distinto, debes borrar esa linea y escribir
tu nuevo código.

Con esto ya estás listo para comenzar.

¡Vamos con todo!

Seleccionando todas las columnas de una tabla

En SQL, los datos se guardan en tablas. A la hora de consultar los datos, podemos traer la información
de todas las columnas o sólo de algunas que necesitemos. En este ejercicio, aprenderemos a
seleccionar todas las columnas de una tabla en SQL utilizando el comodín *.

La instrucción SELECT * FROM nombre_tabla; nos permite seleccionar todas las columnas de la tabla
nombrada. Esto es útil cuando queremos obtener toda la información de una tabla sin filtrar ninguna
columna en particular.

En SQL estas insrucciones se componen de claúsulas. En este caso nuestra consulta se compone
de SELECT * que selecciona todo y from tabla que indica desde qué tabla se seleccionará.

Ejercicio

Selecciona todas las columnas de la tabla llamada productos

Recuerda también que puedes equivocarte y recibir pistas. Si todavía no has probado esta
herramienta, prueba en este ejercicio con:

SELECT * FROM nombre_tabla_equivocada;

Seleccionando una columna de la tabla

En el ejercicio anterior aprendimos que podemos seleccionar toda la información de una tabla
utilizando el comodín *, pero también es posible seleccionar una única columna de la tabla.
Por ejemplo si la tabla usuarios tiene email, nombre y apellido, podríamos seleccionar solamente los
emails con:

SELECT email FROM usuarios;

Esto puede ser útil en situaciones donde no necesitamos toda la información de la tabla y sólo
queremos obtener un subconjunto de los datos.

Ejercicio

En este ejercicio se tiene una tabla llamado usuarios que tiene las columnas nombre, apellido, email y
telefono.

Selecciona sólo los nombres de la tabla usuarios.

Seleccionando múltiples columnas de una tabla

En este ejercicio aprenderemos a seleccionar múltiples columnas de una tabla utilizando SELECT.
Para lograrlo, simplemente tenemos que nombrar cada columna de la tabla por separado. Por
ejemplo, si tenemos una tabla llamada alumnos, y en esta tabla las columnas nombre, apellido y edad,
podemos seleccionar estas 3 columnas con:

SELECT nombre, apellido, edad FROM nombre_tabla;

También, es importante destacar que SQL es un lenguaje insensible a las mayúsculas, es decir,
podemos escribir la misma instrucción como:

select nombre, apellido, edad from nombre_tabla;

Sólo los nombres de las palabras reservadas son insensibles a las mayúsculas. En el caso de los
nombres de las columnas y las tablas debemos respetar el cómo fueron creados para mantener la
consistencia.

A medida que avances aprenderás nuevas palabras reservadas.

Ejercicio

Supongamos que tenemos una tabla llamada productos con las columnas 'nombre', 'precio',
'cantidad' y 'proveedor'. Selecciona sólo el nombre, precio y el proveedor
Asignando un alias a una columna con "AS"

En SQL, podemos asignar un alias o nombre alternativo a una columna en el resultado de la consulta,
utilizando la cláusula AS.

Por ejemplo, si tenemos una tabla con la columna 'col1', podemos asignarle un alias de la siguiente
forma:

SELECT col1 AS col_nombre1 FROM tabla;

En este ejemplo estamos seleccionando la columna 'col1' y asignándole el nombre alternativo


'col_nombre1' en el resultado de la consulta.

Ejercicio

Se tiene una tabla llamada usuarios con las columnas nombre, apellido, email y teléfono. Selecciona
todos los nombres bajo el alias "cliente"

Asignando alias a varias columnas con "AS"

Se puede cambiar el nombre a múltiples columnas en la misma consulta. Por ejemplo, podemos
cambiar el nombre de la columna 'col1' a 'col_nombre1' y el nombre de la columna 'col2' a
'col_nombre2' utilizando la siguiente consulta:

SELECT col1 AS col_nombre1, col2 AS col_nombre2 FROM tabla;

Ejercicio

Cambia el nombre de la columna 'nombre' a 'nombre_usuario' y el nombre de la columna 'apellido' a


'apellido_usuario' en la tabla usuarios.

Asignando un alias con AS y comillas dobles

En SQL, podemos utilizar la cláusula AS junto con comillas dobles para cambiar el nombre de una
columna en los resultados de una consulta. Esto es útil cuando queremos dar un nombre más
descriptivo o cuando el nombre de la columna contiene espacios o tildes.
Por ejemplo, consideremos una tabla llamada 'empleados' con las columnas 'nombre_completo' y
'sueldo'. Si deseamos cambiar el nombre de la columna 'sueldo' a 'Salario de empleados', podemos
utilizar la siguiente consulta:

SELECT nombre_completo, sueldo AS "Salario de Empleados" FROM empleados;

Ejercicio

Selecciona el nombre y el email de los usuarios de la tabla usuarios, y asigna el nombre 'Correo
electrónico' a la columna 'email'.
Seleccionando filas
• Utilizando el operador mayor que
• Ejercitando el uso del operador mayor que
• Utilizando el operador mayor o igual que
• Utilizando el operador "menor que"
• Utilizando el operador "menor o igual que" en una condición
• Seleccionando multiples filas bajo una condición
• Seleccionando filas bajo una condición de igualdad
• Seleccionando filas bajo una condición de igualdad (tipo de dato string)
• Seleccionando filas bajo una condición de igualdad (tipo de dato string) parte 2
• Seleccionando filas bajo una condición de igualdad (tipo de dato booleano true)
• Seleccionando filas bajo una condición de igualdad (tipo de dato booleano false)
• Utilizando dos condiciones con operador "and"
• Utilizando dos condiciones con operador "and" parte 2
• Utilizando operador "OR"
• Utilizando dos condiciones con operador "or"
• Seleccionando una fecha
• Seleccionando datos entre dos valores con "between"
• Seleccionando filas con "like"
• Seleccionando con comodin al principio
• Seleccionando registros sin valores nulos
• Seleccionando registros con valores nulos

Utilizando el operador mayor que

La cláusula WHERE en SQL se utiliza para filtrar los registros de una tabla según una condición
específica.

Por ejemplo, si disponemos de una tabla llamada "productos" con la columna precio, podemos
recuperar todas las filas en las que el precio sea mayor a 100.

SELECT * FROM productos WHERE precio > 100;

Cuando se utiliza where, se utiliza en conjunto con un operador que nos ayuda a comparar los datos.
En el ejemplo anterior se utilizó el operador mayor que (>)

Un detalle importante es que las claúsulas tienen un orden.

1. select,
2. from
3. where

Si cambiamos el orden de estas claúsulas obtendremos un error de sintaxis.


Ejercicio

Se tiene una tabla llamada productos, con las columnas id, nombre, precio y descuento. Selecciona
todos los registros cuyo descuento sea mayor a 10.

Ejercitando el uso del operador mayor que

Se tiene una tabla llamada productos, con las columnas id, nombre, precio y descuento.

Selecciona todos los registros cuyo precio sea mayor a 200.

Utilizando el operador mayor o igual que

El operador mayor o igual que (>=) se utiliza para seleccionar registros en los que el valor de una
columna sea mayor o igual a un valor específico. Por ejemplo, podemos seleccionar todos los
productos cuyo precio sea mayor o igual a $100 utilizando la siguiente consulta:

SELECT * FROM productos WHERE precio >= 100;

Ejercicio

Selecciona todos los registros de la tabla productos en los que el valor de la columna 'precio' sea
mayor o igual a 50.

Si mostraras sólo los productos con precio a mayor a 50, se mostaría la Lámpara de escritorio?

Utilizando el operador "menor que"

El operador menor que (<) se utiliza para comparar valores y seleccionar filas donde el valor de una
columna sea estrictamente menor que un valor específico. Este operador es útil cuando queremos
filtrar registros y obtener aquellos que tienen un valor menor a un límite determinado.

Por ejemplo, si tenemos una tabla de productos con las columnas col1, col2 y col3, podemos utilizar la
siguiente consulta para seleccionar todas las columnas donde el valor de col1 sea menor a 10:

SELECT * FROM productos WHERE col1 < 10;


Ejercicio

Se tiene una tabla usuarios con las columnas id, nombre, apellido, email y telefono. Selecciona todas
los registros de la tabla usuarios donde el valor de la columna id sea menor a 3.

Utilizando el operador "menor o igual que" en una condición

Podemos utilizar el operador 'menor o igual que' (<=) en una condición para seleccionar registros en
los que el valor de una columna sea menor o igual a un valor dado. Por ejemplo, si tenemos una tabla
de productos con una columna 'precio', podemos seleccionar todos los productos cuyo precio sea
menor o igual a x utilizando la consulta.

SELECT * FROM productos WHERE precio <= x;

Ejercicio

Selecciona todos los registros de la tabla productos en los que el valor de la columna 'precio' sea
menor o igual a 100.

Seleccionando multiples filas bajo una condición

En algunas situaciones seleccionaremos ciertas columnas y a la vez aplicaremos condiciones.

Por ejemplo, si tenemos una tabla llamada 'productos' con las columnas 'id', 'nombre', 'precio' y
'cantidad', podemos seleccionar el id y nombre de todos los productos cuyo precio sea mayor a 30
utilizando la siguiente consulta:

SELECT id, nombre FROM productos WHERE precio > 30;

Como vemos, este ejercicio se resuelve con las mismas reglas que hemos visto hasta ahora, aplicando
la claúsulas en el siguiente orden:

1. SELECT,
2. FROM
3. WHERE

Ejercicio

Selecciona el nombre, precio y cantidad de la tabla productos cuya cantidad sea mayor a 6.
Seleccionando filas bajo una condición de igualdad

Para seleccionar un valor en específico utilizaremos el operador =

Ejemplo:

SELECT * FROM productos WHERE precio = 100;

Ejercicio

Selecciona el nombre del usuario de la tabla usuarios con id igual a 2

Seleccionando filas bajo una condición de igualdad (tipo de dato


string)

En SQL, para comparar textos debemos utilizar comillas simples ('') o comillas dobles (""). Por
ejemplo, si tenemos una tabla productos con un producto con nombre Camiseta podemos
seleccionarlo utilizando:

SELECT * FROM productos WHERE nombre = 'Camiseta';

Al comparar un string en una condición WHERE, debemos asegurarnos de encerrar el valor buscado
entre comillas.

¿Por qué debemos envolver los textos en comillas?

Cuando envolvemos un texto entre comillas en SQL, estamos indicando que no se trata de una palabra
clave ni de un nombre de tabla o columna, sino que es un valor que debe ser tomado literalmente.

Ejercicio

Selecciona todas las filas de la tabla productos donde el nombre del producto sea 'Pantalón'.

Seleccionando filas bajo una condición de igualdad (tipo de dato


string) parte 2

Es importante recordar que al trabajar con strings, la comparación es sensible a mayúsculas y


minúsculas. Por lo tanto, 'Camiseta' y 'camiseta' se considerarán diferentes valores en la comparación.
Si deseamos realizar una comparación sin considerar la distinción entre mayúsculas y minúsculas, se
pueden utilizar funciones o cláusulas específicas proporcionadas por el motor de base de datos.

Ejercicio

Selecciona todos los productos de la tabla productos que tengan el nombre 'Silla de Oficina'.

Puedes probar con 'c' y observar que no obtendrás ningún resultado.

Seleccionando filas bajo una condición de igualdad (tipo de dato


booleano true)

Hasta el momento hemos trabajado con dos tipos de datos: números enteros, como el precio del
producto, y strings, como 'Camiseta'. En este ejercicio introduciremos el tipo de dato Boolean, el cual
puede guardar como valor verdadero o falso, TRUE o FALSE.

Supongamos que tenemos una tabla de productos con una columna 'destacado' de tipo booleano que
indica si un producto está destacado o no. Para seleccionar todos los productos que están marcados
como destacados, podemos usar la siguiente consulta:

SELECT * FROM productos WHERE destacado = true;

Adicionalmente se pueden ocupar los valores 1 y 0 en lugar de las palabras reservadas true o false,
por ejemplo la siguiente consulta es identica a la anterior.

SELECT * FROM productos WHERE destacado = 1;

Ejercicio

Se tiene una tabla de usuarios con los campos id, nombre, apellido, email, teléfono y status. La
columna status es de tipo booleano.

Selecciona todos los usuarios de la tabla usuarios cuyo status es activo.

Seleccionando filas bajo una condición de igualdad (tipo de dato


booleano false)

Supongamos que queremos seleccionar todos los usuarios cuyo status es inactivo en una tabla
llamada 'usuarios'. Podemos hacer esto utilizando la siguiente consulta:
SELECT * FROM usuarios WHERE status = false;

En esta consulta, estamos utilizando la cláusula WHERE para buscar todos los usuarios que tengan el
valor 'false' en la columna 'status'.

Ejercicio

Selecciona todos los productos de la tabla productos que no están destacados.

Utilizando dos condiciones con operador "and"

La claúsula WHERE se puede combinar con el operador AND para juntar múltiples condiciones en una
consulta SQL. Por ejemplo, si queremos seleccionar todos los usuarios cuyo nombre es 'Juan' y
apellido es 'Pérez', podemos utilizar la siguiente consulta:

SELECT * FROM usuarios WHERE nombre = 'Juan' AND apellido = 'Pérez';

Cuando se utiliza el operador AND se deben cumplir ambas condiciones, en este caso el nombre debe
ser 'Juan' y el apellido debe ser Pérez. En caso de que cualquiera de ellos sea distinto, no se mostrará.

Ejercicio

Se tiene una tabla de usuarios con los campos id, nombre, apellido, email y teléfono.

Selecciona todos los usuarios cuyo nombre es 'María' y su email es 'mariagarcia@[Link]' de la


tabla de usuarios.

Utilizando dos condiciones con operador "and" parte 2

Ejercicio

Se tiene una tabla llamada productos que tiene los campos id, nombre, agotado y precio. La columna
precio es de tipo Integer mientras que la columna agotado es de tipo Boolean.

Selecciona los productos de la tabla productos que estén agotados y tengan un precio mayor a 100.
Utilizando operador "OR"

El operador OR se utiliza para combinar múltiples condiciones en una cláusula WHERE en SQL.
Cuando se usa el operador OR, al menos una de las condiciones debe ser verdadera para que el
registro se incluya en el resultado.

Por ejemplo, si deseamos seleccionar todos los productos que sean de color 'Azul' o 'Verde', podemos
usar la siguiente consulta:

SELECT * FROM productos WHERE color = 'Azul' OR color = 'Verde';

Esto seleccionará todos los registros de la tabla 'productos' que tengan el color 'Azul' o el color
'Verde'.

Ejercicio

Se tiene una tabla productos con los campos id, nombre, precio y descuento. El campo precio y el
campo descuento son de tipo integer.

Selecciona todos los productos cuyo precio sea mayor a 1000 o su descuento sea igual a 20.

Utilizando dos condiciones con operador "or"

Se tiene una tabla clientes con los campos id, nombre, ciudad y saldo. La ciudad es de tipo texto, el
saldo es número entero.

Selecciona aquellos clientes de la tabla clientes que sean de la ciudad 'Madrid' o que su saldo sea
negativo.

Seleccionando una fecha

Otro tipo de dato es el de fecha, Date en inglés. Por defecto, las fechas se guardan en un formato YYYY-
MM-DD, indicando primero el año en 4 dígitos, luego el mes con dos dígitos y finalmente el día con dos
dígitos. Un ejemplo de una fecha en este formato sería 2022-01-01

Sobre las fechas podemos hacer distinto tipo de operaciones, pero primero aprenderemos a utilizarlas
para filtrar. Por ejemplo, podemos obtener todos los productos de una tabla cuya fecha sea mayor o
igual al primero de enero de 2022:
SELECT * FROM productos WHERE fecha_de_creación >= '2022-01-01';

Ejercicio

Se tiene una tabla de productos con los campos id, nombre, precio y fecha_de_creación. El campo
fecha_de_creacion es de tipo Date.

Selecciona todos los productos de la tabla productos que fueron creados después de '2021-05-01'.

Seleccionando datos entre dos valores con "between"

El operador BETWEEN se utiliza para seleccionar registros cuyos valores se encuentren dentro de un
rango específico.

Por ejemplo, podemos seleccionar todos los productos cuyo stock se encuentre entre 10 y 50
utilizando la siguiente consulta:

SELECT * FROM productos WHERE stock BETWEEN 10 AND 50;

Un detalle importante a mencionar es que el operador between es inclusivo. Es decir, en el ejemplo se


incluirían los valores de 10 o 50.

Si quieres buscar con otro tipo de intervalo, por ejemplo que incluya el valor 10 y no el valor 50
puedes utilizar dos condiciones unidas con un operador and SELECT * productos WHERE stock >= 10 and
stock < 50

Ejercicio

Se tiene la tabla productos con los campos id, nombre y stock. Dentro de los registros hay 5
productos con distintos stocks como se muestra a continuación:

ID NOMBRE STOCK

1 Producto 10

2 Producto 25

B
ID NOMBRE STOCK

3 Producto 30

4 Producto 40

5 Producto 50

Selecciona todos los productos cuyo stock se encuentre entre 20 y 30.

Seleccionando filas con "like"

Supongamos que queremos buscar todos los usuarios cuyo nombre empiece con la letra 'J' en la tabla
de usuarios. Podemos hacer esto utilizando la siguiente consulta:

SELECT * FROM usuarios WHERE nombre LIKE 'J%'

En esta consulta, estamos utilizando el operador LIKE para buscar todos los nombres de usuarios que
comiencen con la letra 'J'.

El símbolo '%' es un comodín que representa cualquier cantidad de caracteres adicionales. En este
caso, estamos utilizando '%' después de la letra 'J' para indicar que queremos buscar cualquier
nombre que comience con 'J' y tenga cualquier número de caracteres adicionales después de ella.

Ejercicio

Se tiene una tabla usuarios con los campos id, nombre, apellido, email y teléfono. El campo nombre
es de tipo texto.

Se pide seleccionar todos los usuarios cuyo apellido empiece con 'Ma'

Seleccionando con comodin al principio

Supongamos que queremos buscar todos los usuarios cuyo nombre termine con la letra 's' en la tabla
de usuarios. Podemos hacer esto utilizando la siguiente consulta:
SELECT * FROM usuarios WHERE nombre LIKE '%s'

En esta consulta, estamos utilizando la cláusula LIKE para buscar todos los nombres de usuarios que
terminen con la letra 's'. El símbolo '%' es un comodín que representa cualquier cantidad de
caracteres adicionales. En este caso, estamos utilizando '%' antes de la letra 's' para indicar que
queremos buscar cualquier nombre que termine con 's' y tenga cualquier número de caracteres
adicionales antes de ella.

Ejercicio

Selecciona todos los usuarios de la tabla usuarios cuyo nombre termine con la letra 'o'

Seleccionando registros sin valores nulos

Algunos registros pueden tener valores nulos para algunos de sus campos. Por ejemplo, podríamos
tener una tabla de usuarios con nombres y emails pero no tener todos los nombres de cada uno de los
registros como ilustra la siguiente tabla.

ID NOMBRE EMAIL

1 Juan [Link]@[Link]

Perez

2 María [Link]@[Link]

Gomez

3 [Link]@[Link]

4 [Link]@[Link]

5 Luis [Link]@[Link]

Mendez

Para seleccionar todos los valores no nulos utilizaremos IS NOT NULL

Por ejemplo, en la tabla usuarios previamente mostrada podemos seleccionar todos los nombres no
nulos utilizando SELECT * FROM empleados WHERE nombre IS NOT NULL;
Esto nos devolverá todos los usuarios cuyo nombre no sea nulo.

ID NOMBRE EMAIL

1 Juan [Link]@[Link]

Perez

2 María [Link]@[Link]

Gomez

5 Luis [Link]@[Link]

Mendez

Ejercicio

Se tiene una tabla productos con id, nombre, precio y descuento, siendo descuento de tipo integer.

Selecciona todos los registros de la tabla productos cuyo campo descuento no sea nulo.

Seleccionando registros con valores nulos

Así como podemos seleccionar valores no nulos, también podemos seleccionar valores nulos.

Por ejemplo, si queremos encontrar todos los usuarios que no tengan un número de teléfono
registrado en la tabla de usuarios, podemos utilizar la siguiente consulta:

SELECT * FROM usuarios WHERE telefono IS NULL;

Ejercicio

Se tiene una tabla usuarios con id, nombre, apellido, email y teléfono

Selecciona todos los usuarios que no tengan un email registrado en la tabla de usuarios.
Ordenando resultados (orden y limit)
• Ordenando filas
• Ordenando filas asc explicito
• Ordenando filas desc
• Ordenando filas con valores nulos
• Ordenando con nulos al final
• Combinaciones de orden
• Combinaciones de orden asc y desc

Ordenando filas

En este ejercicio, aprenderemos a ordenar las filas de una tabla en SQL, y para esto, estudiaremos una
nueva cláusula llamada ORDER BY.

ORDER BY se utiliza para ordenar los resultados de una consulta según una o más columnas. Por
defecto, se ordena de forma ascendente.

Por ejemplo, si tenemos una tabla de productos con los campos 'id', 'nombre' y 'precio', podemos
ordenar los productos por precio del menor al mayor con:

SELECT * FROM productos ORDER BY precio;

Es importante tener en cuenta que las claúsulas tienen que especificarse justo en este orden:

1. SELECT
2. FROM
3. ORDER BY

El orden de los resultados dependerá del tipo de dato: los números se ordenan de menor a mayor, los
textos alfabéticamente y las fechas cronológicamente.

Ejercicio

Ordena los registros de la tabla usuarios por el campo 'nombre'

Ordenando filas asc explicito

Con la claúsula ORDER BY podemos especificar la dirección de los resultados. Se puede ordenar en
orden ascendente (ASC) o descendente (DESC).
En el ejercicio anterior aprendimos que implícitamente (si no lo indicamos en la consulta) los
resultados se ordenan de menor a mayor, es decir, de forma ascendente. Para hacer nuestras
consultas claras en su intención, indicaremos la dirección al momento de hacer la consulta:

SELECT * FROM productos ORDER BY precio ASC;

Con esta consulta obtendremos el mismo resultado que utilizando:

SELECT * FROM productos ORDER BY precio;

Ejercicio

En este ejercicio se tiene una tabla usuarios con los campos id, nombre, apellido, email y teléfono. Se
te pide ordenar los registros de la tabla 'usuarios' por el campo 'nombre' en orden ascendente.

Ordenando filas desc

La cláusula ORDER BY se utiliza para ordenar los resultados de una consulta. Por defecto el orden es
ascendente, pero se puede especificar que sea descendente utilizando la palabra clave DESC. Por
ejemplo:

SELECT * FROM productos ORDER BY precio DESC;

Ejercicio

Se tiene una tabla productos con los campos id, nombre, precio y stock. Selecciona sólo los precios de
la tabla 'productos' ordenados de forma descendente.

Ordenando filas con valores nulos

En SQL los registros nulos se consideran con el valor mas bajo, por lo que al ordenar ascendentemente
los veremos al principio y al ordenar descendentemente los veremos al final.

En este ejercicio, no aprenderemos ninguna instrucción nueva, únicamente se te pedirá que ordenes
una tabla por una columna específica y observes cómo se ordenan los valores nulos.

Ejercicio

Ordena la tabla empleados por la columna 'salario' de manera ascendente.


Ordenando con nulos al final

A veces necesitamos que los valores nulos queden al principio o al final de la lista independiente de en
cual direccion ordenemos. Para lograrlo utilizarmos ORDER BY junto con NULLS FIRST o NULLS LAST para
especificar cómo queremos que se ordenen las filas con valores nulos.

Con NULLS FIRST se muestran los nulos primeros y con NULLS LAST se muestran al final

La consulta completa tendría la siguiente forma: SELECT * FROM tabla ORDER BY campo NULLS FIRST

Ejercicio

Dada una tabla productos con las columnas 'id', 'nombre' y 'precio' con los siguientes registos.

ID NOMBRE PRECIO

1 Producto 100

2 Producto NULL

3 Producto 50

4 Producto NULL

5 Producto 200

Ordena las filas de la tabla en función del precio de forma ascendente. Asegúrate de que las filas con
valores nulos en la columna 'precio' aparezcan al final de la lista ordenada.

Combinaciones de orden

En algunas situaciones vamos a querer ordenar en función de múltiples columnas. Por ejemplo, si
queremos obtener una lista de todos los productos ordenados por su stock y luego por su color,
podemos seleccionar todos los campos de la tabla y ordenarlos primero por el campo stock y luego por
el campo color de la siguiente manera:

SELECT * FROM productos ORDER BY stock ASC, color ASC

Ejercicio

Se tiene la tabla empleados con la siguiente información:

ID NOMBRE SALARIO

1 Juan 4800

Perez

2 María 5500

Lopez

3 Pedro 5500

García

4 Ana 5500

Martínez

5 Luis 4800

Rodríguez

Selecciona una lista de todos los empleados ordenados por su salario y por su nombre.

Combinaciones de orden asc y desc

Supongamos que queremos obtener una lista de todos los productos cuyo precio sea mayor a $100 y
ordenarlos primero por su precio de forma descendente y luego por su nombre de forma ascendente.
Podemos hacer esto utilizando la siguiente consulta:

SELECT * FROM productos WHERE precio > 100 ORDER BY precio DESC, nombre ASC;
Ejercicio

Se tiene la tabla productos con la siguiente información:

ID NOMBRE STOCK COLOR

1 Silla 10 Rojo

2 Mesa 5 Verde

3 Lampara 15 Azul

4 Escritorio 8 Blanco

5 Estantería 12 Negro

Selecciona todos los registros de la tabla 'productos' y ordénalos primero por 'stock' de forma
descendente y luego por 'color' de forma ascendente.
Limit

Limitando la cantidad de resultados

La cláusula LIMIT se utiliza para limitar la cantidad de resultados devueltos por una consulta. Esto es
útil cuando sólo necesitamos ver una cierta cantidad de registros en lugar de todos los registros que
cumplan con la condición de la consulta.

Por ejemplo, si queremos obtener sólo los primeros 5 registros de una tabla, podemos usar la cláusula
LIMIT de la siguiente manera:

SELECT * FROM tabla LIMIT 5

Esto devolverá sólo los primeros 5 registros de la tabla.

La claúsula LIMIT se agrega al final de la consulta, por ejemplo

SELECT * FROM tabla WHERE campo > 10 ORDER BY campo2 LIMIT 5

Ejercicio

Selecciona los primeros 3 usuarios de la tabla de usuarios.

Obtener los primeros alumnos con mejor nota

En SQL, la combinación de las cláusulas ORDER BY y LIMIT nos permite obtener el valor o valores
máximos de una columna en una tabla.

Una vez que hemos ordenado los registros, podemos utilizar la cláusula LIMIT para limitar la cantidad
de resultados obtenidos. Por ejemplo: SELECT * FROM notas ORDER BY nota DESC LIMIT 3 corresponderán
a los tres alumnos con las mejores notas en la tabla 'notas'.

Ejercicio

Se tiene una tabla de puntajes con las columnas id y puntaje. Utiliza lo aprendido para obtener el
puntaje más alto de la tabla utilizando ORDER BY y LIMIT

Obtener el nombre del concierto con más entradas vendidas


Se tiene una base de datos con la tabla conciertos en la cual se almacena información sobre cada
concierto, incluyendo el nombre del concierto y la cantidad de entradas vendidas. Los datos dentro de
la base de datos corresponden a la siguiente tabla.

NOMBRE_CONCIERTO ENTRADAS_VENDIDAS

Concierto A 150

Concierto B 200

Concierto C 180

Concierto D 250

Encuentra el nombre del concierto que ha vendido la mayor cantidad de entradas (utiliza ORDER BY y
LIMIT).
Operaciones con strings
• Transformando un string a mayúsculas
• Trasformando un string a minúsculas
• Quitando espacios en blanco de un string
• Combinando funciones
• Obteniendo el largo de un string
• Obteniendo el nombre mas largo de la tabla
• Ordenando todos los datos y la funcion
• Concatenar strings
• Seleccionando caracteres de un string con SUBSTR
• Seleccionando caracteres

Transformando un string a mayúsculas

Para transformar un string a mayúsculas en SQLITE podemos utilizar la función UPPER().

Por ejemplo, si tenemos una tabla de usuarios con el campo 'nombre', podemos seleccionar todos los
nombres transformándolos a mayúsculas utilizando la siguiente consulta:

SELECT UPPER(nombre) FROM usuarios;

Esto nos devolverá una lista de todos los nombres en la tabla 'usuarios', pero en mayúsculas. La
función UPPER() no modifica los datos en la tabla, sólo los transforma para los resultados de la
consulta.

Al utilizar funciones de este tipo, será frecuente que renombremos la columna utilizando un alias.

SELECT UPPER(nombre) as nombre_en_mayus FROM usuarios;

Ejercicio

Se tiene una tabla de usuarios con las columnas nombre, apellido, email y teléfono.

Selecciona los emails de la tabla usuarios con el alias email_upper. Todos los emails deben ser
mostrados en mayúsculas.

Trasformando un string a minúsculas

La función LOWER() en SQLite se utiliza para convertir todos los caracteres de un texto a minúsculas.
Por ejemplo, si tenemos una tabla 'usuarios' con un campo 'nombre' que contiene nombres en
mayúsculas, podemos convertir todos los nombres a minúsculas utilizando la siguiente consulta:
SELECT LOWER(nombre) AS nombre_minusculas FROM productos;

Esto nos devolverá una lista de todos los nombres en la tabla 'usuarios', pero en minúsculas. La
función LOWER() no modifica los datos en la tabla, sólo los transforma para los resultados de la
consulta.

Ejercicio

Se tiene una tabla de usuarios con los campos id, nombre, e email. El campo email es de tipo texto y
contiene algunas mayúsculas, lo que puede ocasionar errores en la base de datos.

Selecciona los emails de la tabla usuarios con el alias email_lower. Todos los emails deben ser
mostrados en minúsculas.

Quitando espacios en blanco de un string

En SQLite la función TRIM() se utiliza para eliminar los espacios en blanco iniciales y finales de un
string.

Por ejemplo, si tenemos una tabla de productos con una columna 'nombre' que contiene espacios en
blanco al inicio y final de cada nombre, podemos utilizar la siguiente consulta para quitar esos
espacios:

SELECT TRIM(nombre) FROM productos;

Esto nos devolverá los nombres de los productos sin los espacios en blanco al inicio y final.

Ejercicio

Se tiene una tabla de usuarios con las columnas nombre, apellido, email y teléfono. Los nombres y
correos poseen espacios en blanco tanto al inicio como al final de su valor. Utiliza la función TRIM()
para seleccionar los nombres e emails y quitar los espacios en blanco.

Combinando funciones

En SQL podemos combinar funciones. Veamos un ejemplo combinando LOWER y TRIM :

SELECT LOWER(TRIM(email)) as email_limpios from usuarios;


Esta consulta selecciona los correos electrónicos de la tabla "usuarios", los convierte a minúsculas y
elimina cualquier espacio en blanco adicional alrededor de ellos. El resultado será una lista de correos
electrónicos "limpios" y en minúsculas.

Ejercicio

Se tiene una tabla de usuarios con las columnas nombre, apellido, email y teléfono. Los nombres,
apellidos y correos poseen espacios en blanco tanto al inicio como al final y algunos de ellos tienen
mayúsculas.

Utiliza lo aprendido para seleccionar los nombres, emails y apellidos, limpiando cada uno de estos
campos. Para que el resultado sea correcto debes ocupar los alias nombre_limpio, apellido_limpio e
email_limpio respectivamente.

Obteniendo el largo de un string

En SQL, podemos utilizar la función LENGTH() para obtener la longitud de una cadena de caracteres.
Por ejemplo, si queremos obtener la longitud del nombre de todos los usuarios en la tabla 'usuarios',
podríamos utilizar la siguiente consulta:

SELECT nombre, LENGTH(nombre) FROM usuarios;

Esto nos devolverá una lista de nombres junto con su longitud respectiva.

Ejercicio

Selecciona el largo del apellido de todos los usuarios en la tabla usuarios.

Obteniendo el nombre mas largo de la tabla

Ya vimos en el ejercicio anterior que, para calcular el largo de una cadena de caracteres, debemos
utilizar la función LENGTH(). Si queremos obtener la cadena más corta de la columna, debemos
combinar la función LENGTH() con ORDER BY y LIMIT.

Por ejemplo, si queremos seleccionar el largo del nombre más corto de la tabla usuarios, la consulta
quedaría así:

SELECT LENGTH(nombre) as largo_nombre FROM usuarios ORDER BY LENGTH(nombre) LIMIT 1 ;


Por otro lado, si queremos obtener el largo del nombre más largo, invertiremos el orden de la
selección.

SELECT LENGTH(nombre) as largo_nombre FROM usuarios ORDER BY LENGTH(nombre) DESC LIMIT 1 ;

Esto nos devolverá la longitud del nombre más largo en la tabla 'usuarios'.

Ejercicios

Se tiene una tabla usuarios con las columnas nombre, apellido, email y teléfono.

Utiliza lo aprendido para seleccionar el largo de los 3 correos más largos de la tabla. La columna
resultante debe mostrar sólo el largo (cantidad de caracteres) de estos correos.

Ordenando todos los datos y la funcion

En el ejercicio previo, habíamos optado por seleccionar únicamente la longitud (largo) de una
columna. No obstante, en ciertos casos, puede ser necesario recuperar tanto la información de la
columna en sí como su longitud. Por ejemplo, ¿qué ocurriría si se nos solicita el correo electrónico más
largo en lugar de simplemente su longitud?

Para esto podemos hacer una consulta como la siguiente:

SELECT email FROM usuarios ORDER BY LENGTH(email) DESC LIMIT 1;

Además, es posible que se nos solicite seleccionar todos los campos del usuario cuyo correo sea el más
largo. Para lograrlo, podemos utilizar la siguiente consulta:

SELECT * FROM usuarios ORDER BY LENGTH(email) DESC LIMIT 1;

Esta consulta nos devolverá todas las filas de la tabla "usuarios" donde la longitud del correo
electrónico sea igual a la longitud máxima encontrada en toda la tabla.

Asimismo, podrían requerir que seleccionemos todos los campos de la tabla y, además, incluir el largo
del correo electrónico. La idea es similar, simplemente agregamos la función al SELECT:

SELECT *, LENGTH(email) as largo_email FROM usuarios ORDER BY LENGTH(email) DESC LIMIT 1;

Lo importante es entender qué nos están pidiendo para poder realizar las consultas correctas.
Ejercicios

Se tiene una tabla usuarios con las columnas nombre, apellido, email y teléfono.

Utiliza lo aprendido para seleccionar los 3 correos más largos de la tabla. El resultado debe mostrar
dos columnas: una con los emails y otra con sus largos respectivos.

Concatenar strings

En este ejercicio aprenderemos a juntar textos. Por ejemplo, si tenemos una columna con un nombre y
otra con un apellido, podemos generar una única columna con el nombre y apellido. A esto se le
llama concatenar y utilizaremos el operador ||

Un ejemplo de consulta con concatenación sería la siguiente:

SELECT nombre || ' ' || apellido AS nombre_completo FROM empleados;

En esta consulta, estamos concatenando el nombre y el apellido de cada empleado, separados por un
espacio, y utilizando el alias 'nombre_completo' para la nueva columna creada.

Ejercicio

Supongamos que tienes una tabla llamada productos con los campos 'producto', 'marca' y 'precio'.
Selecciona una lista de todos los productos con su nombre, seguido de un guion ("-"), y su marca.
Asigna el alias 'marca_producto' a la columna creada.

Seleccionando caracteres de un string con SUBSTR

La función SUBSTR() se utiliza para seleccionar una determinada cantidad de caracteres de un string:

SUBSTR( string, inicio, largo )

En la sintaxis podemos observar que la función tiene 3 argumentos. 1. String: el nombre de la columna
o palabra que será utilizada 2. Inicio: un integer que especifica la posicion de inicio desde la cual se
extraerán caracteres al string. 3. Largo: la cantidad de caracteres extraidos

Por ejemplo, si tenemos una tabla de productos con el campo 'nombre' y queremos seleccionar sólo la
primera letra de cada nombre, podemos utilizar la siguiente consulta:
SELECT SUBSTR(nombre, 1, 1) AS primera_letra FROM productos;

En este ejemplo estamos indicando que en la columna nombre, partiendo desde su primera letra, nos
devuelva sólo 1 caracter que corresponderá a la primera letra de cada nombre.

Es importante recordar que algunas funciones tienen distintos nombres dependiendo del motor de
base de datos. Por ejemplo, para lograr este mismo objetivo en PostgreSQL, deberíamos usar la
función LEFT()

Ejercicio

Se tiene una tabla usuarios con las columnas id, nombre, apellido, email y teléfono. Utiliza la función
SUBSTR para seleccionar las tres primeras letras del apellido de cada usuario en la tabla 'usuarios'.
Asigna el nombre 'primeras_letras' a la columna creada.

Seleccionando caracteres

Se tiene una tabla de usuarios con las columnas nombre y apellido. Utilizando la función SUBSTR(),
selecciona 3 caracteres del apellido de María, partiendo desde el segundo caracter. Asigna el alias
'tres_caracteres_del_apellido' a la columna creada.
Operaciones con fechas
• Obteniendo la fecha de hoy
• Obteniendo la fecha de mañana
• Obteniendo la fecha de ayer
• Extracción del año
• Extracción del mes
• Extracción del mes y año
• Extracciones y where

Obteniendo la fecha de hoy

Con la función DATE() podemos obtener la fecha de hoy. Por ejemplo, la podemos utilizar en la claúsula
WHERE para obtener todos lo registros de hoy.

SELECT * FROM usuarios WHERE fecha_registro = DATE();

También es posible indicar explícitamente a la función que la fecha deseada es la de hoy. Ejemplo:

SELECT * FROM usuarios WHERE fecha_registro = DATE('now');

Todo lo que hemos aprendido de SQL hasta ahora sirve en todos los motores de base de datos como
SQLITE, PostgreSQL o MySQL. Esta función es un caso especial ya que recibe distintos nombres en
cada uno de los motores. Por ejemplo, en MySQL se utiliza CURDATE(), y en Microsoft SQL Server se
utiliza GETDATE() A la hora de buscar documentación es importante dejar claro que motor se está
ocupando. En este tutorial interactivo estamos ocupando SQLite.

Ejercicio

Se tiene una tabla llamada tareas con las siguientes columnas: "id" (identificador único),
"descripcion" (descripción de la tarea) y "fecha_limite" (fecha límite para completar la tarea).

Obtén la descripción de todas las tareas que tengan fecha_limite igual a la fecha actual .

Obteniendo la fecha de mañana

EN SQL es posible sumar fechas para obtener fechas futuras. En SQLite lo podemos lograr pasando un
segundo argumento a la función DATE. Esto suena complicado pero es mas sencillo de lo que parece:

DATE('now', '1 day')


En este ejemplo, estamos sumando 1 día a la fecha de hoy (now). Si queremos sumar más días, por
ejemplo 5 días, utilizaremos DATE('now', '5 day').

También es posible sumar semanas y meses con:

2 Semanas: DATE('now', '2 week') 3 Meses: DATE('now', '3 month')

En una consulta esto se vería de la siguiente forma:

SELECT * FROM tabla where fecha > DATE('now', '2 week')

Al sumar el intervalo de tiempo, el sistema calculará automáticamente la fecha correcta.

Ejercicio

Se tiene una tabla de tareas con los campos id, descripcion y fecha_limite. Se pide seleccionar todos
los campos de las tareas que tienen como fecha límite el día de mañana.

Obteniendo la fecha de ayer

Así como es posible sumar fechas, también es posible restarlas:

DATE('now', '-1 day') DATE('now', '-1 week')

Es importante aclarar que cuando no especificamos el signo, se asume que es positivo, esto quiere
decir que

DATE('now', '1 day')

es lo mismo que

DATE('now', '+1 day')

Ejercicio

Supongamos que tenemos una tabla llamada ganancias con las columnas "id" (identificador único),
"fecha" (fecha de registro) y "monto" (ganancia del día).

Muestra el monto correspondiente al día de ayer.


Extracción del año

Para ciertos reportes, es muy probable que nos pidan extraer información de una fecha, como, por
ejemplo, el año en que se hizo una transacción.

Analicemos el siguiente escenario:

Se tiene la tabla ventas con la siguiente información:

ID_VENTA MONTO FECHA_VENTA

1 200 2010-01-15

2 150 2011-02-20

3 300 2012-03-10

4 250 2013-04-05

5 100 2014-05-25

6 350 2015-06-18

7 400 2015-07-22

8 180 2015-08-09

9 220 2018-09-30

10 275 2019-10-11

Nos piden mostrar toda la información de la tabla y adicionalmente agregar una columna con el año
de la venta.

SELECT *, strftime('%Y', fecha_venta) as año_venta FROM ventas El resultado de esta consulta será el

siguiente:
ID_VENTA MONTO FECHA_VENTA AÑO_VENTA

1 200 2010-01-15 2010

2 150 2011-02-20 2011

3 300 2012-03-10 2012

4 250 2013-04-05 2013

5 100 2014-05-25 2014

6 350 2015-06-18 2015

7 400 2015-07-22 2015

8 180 2015-08-09 2015

9 220 2018-09-30 2018

10 275 2019-10-11 2019

Para mostrar los resultados de este tipo de funciones, es necesario asignar un nombre a la nueva
columna, ya que, de lo contrario, la columna resultante mantendrá el nombre de "strftime('%Y',
fecha_venta)", lo cual resultaría en una denominación poco legible para un informe.

Ejercicio

Dada una tabla ventas con las columnas monto y fecha_venta, crea una consulta que muestre
únicamente el monto y el año de la venta. La columna que muestre el año de la venta debe
llamarse año_venta

Extracción del mes

Podemos extraer el mes de una fecha de manera similar a la extracción del año, utilizando
nuevamente la función strftime.
Siguiendo con nuestro ejemplo de la tabla de ventas, si deseamos agregar una columna que indique
únicamente el mes de la venta, podemos utilizar la siguiente consulta:

ID_VENTA MONTO FECHA_VENTA

1 200 2010-01-15

2 150 2011-02-20

3 300 2012-03-10

4 250 2013-04-05

5 100 2014-05-25

6 350 2015-06-18

7 400 2015-07-22

8 180 2015-08-09

9 220 2018-09-30

10 275 2019-10-11

SELECT strftime('%m', columna) FROM tabla

En este caso, para obtener el mes, pasamos %m como argumento a la función strftime.

Ejercicio

Dada la tabla ventas previamente presentada con las columnas monto y fecha_venta, crea una
consulta que muestre una tabla con el monto, el mes de la venta y el año de la venta, en ese mismo
orden. La columna para el mes de la venta debe llamarse mes_venta y aquella para el año de la venta
debe llamarse año_venta

Extracción del mes y año


Ya aprendimos a extraer el mes y el año de una fecha. Sin embargo, cómo podriamos extraer ambos
datos en una sola columna?

Para extraer tanto el mes como el año de una fecha en una sola columna, puedes utilizar la
función strftime('%Y-%m'). Esto te permitirá obtener un resultado en el formato "año-mes". Veamos un
ejemplo utilizando una tabla de ventas:

Ejercicio

Dada la tabla ventas con las columnas monto y fecha_venta, crea una consulta que muestre las
siguientes dos columnas:

• Monto
• El mes y ano de la fecha de venta. Esta columna debe llamarse ano_mes

ID_VENTA MONTO FECHA_VENTA

1 200 2010-01-15

2 150 2011-02-20

3 300 2012-03-10

4 250 2013-04-05

5 100 2014-05-25

6 350 2015-06-18

7 400 2015-07-22

8 180 2015-08-09

9 220 2018-09-30

10 275 2019-10-11

Extracciones y where
Previamente aprendimos a filtrar utilizando como parámetro una fecha. Ahora utilizaremos lo
aprendido para filtrar fechas de un año o mes en específico.

Se tiene la tabla ventas con la siguiente información:

ID_VENTA MONTO FECHA_VENTA

1 200 2010-01-15

2 150 2011-02-20

3 300 2012-03-10

4 250 2013-04-05

5 100 2014-05-25

6 350 2015-06-18

7 400 2015-07-22

8 180 2015-08-09

9 220 2018-09-30

10 275 2019-10-11

Nos piden mostrar todas las ventas del año 2012. Para esto utilizaremos la función strftime para
extraer el año de las fechas, y luego filtraremos por el año indicado:

SELECT * FROM ventas WHERE strftime('%Y', fecha_venta) = '2012';

Ejercicio

Dada una tabla ventas con las columnas monto y fecha_venta, selecciona toda la información de las
ventas del 2015
Funciones de agregación
• El mayor valor de una columna
• El menor valor de una columna
• Suma de elementos en una columna
• Promedio de una columna
• Contando elementos en una tabla
• Ejercicio 1 : Funciones de agregacion con where
• Ejercicio 2 : Funciones de agregacion con where
• Ejercicio 3 : Funciones de agregacion con where
• Ejercicio 4 : Funciones de agregacion con where
• Conteo con condiciones con string

El mayor valor de una columna

En SQL hay funciones que nos permiten ejecutar operaciones sobre un conjunto de resultados. Estas
reciben el nombre de funciones de agregación.

En este ejercicio trabajaremos con la función MAX() la cual nos permite encontrar el valor más alto del
campo que especifiquemos.

Una consulta con la función max se ve de la siguiente forma:

SELECT MAX(columna) FROM tabla

Por ejemplo, se tiene una tabla llamada empleados con los siguientes datos:

EMAIL NOMBRE EDAD SUELDO

[Link]@[Link] Juan 30 50,000

Perez

[Link]@[Link] Maria 25 55,000

Gonzalez

[Link]@[Link] John Doe 40 60,000

francisco@[Link] Francisco 22 45,000

Podemos encontrar el salario más alto utilizando:


SELECT MAX(salario) FROM empleados;

Cuando usamos funciones de agregación, no podemos seleccionar directamente otros elementos de la


misma tabla. Por ejemplo, SELECT email, MAX(salario) FROM empleados; arrojaría error ya que estaríamos
seleccionando email junto a la función. Pero no te preocupes, ya que aprenderemos cómo hacerlo
apropiadamente cuando veamos la cláusula group by más adelante.

Ejercicio

Utilizando los mismos datos previos selecciona la mayor edad de la tabla empleados

Tip: Aunque en SQL es válido escribir tanto MAX (columna) como MAX(columna), el corrector de
ejercicios considerará la primera opción como incorrecta debido al espacio adicional. Por lo tanto,
escribe la función sin espacios.

El menor valor de una columna

Otra función de agregación frecuentemente utilizada es MIN(). Esta función toma como argumento el
nombre de la columna y devuelve el valor más pequeño en esa columna.

SELECT MIN(columna) FROM tabla

Ejercicio

Utilizando la tabla empleados, encuentra el menor sueldo presente.

EMAIL NOMBRE EDAD SUELDO

[Link]@[Link] Juan 30 50,000

Perez

[Link]@[Link] Maria 25 55,000

Gonzalez

[Link]@[Link] John Doe 40 60,000

francisco@[Link] Francisco 22 45,000

Suma de elementos en una columna


Hasta el momento hemos estudiado dos funciones de agregación:

• MAX()
• MIN()

En este ejercicio introduciremos la función de agregación SUM(). Con esta podemos sumar todos los
elementos de una columna.

SELECT SUM(columna) FROM tabla

Es importante tener en cuenta que la columna sobre la cual se aplica la función SUM() debe contener
valores numéricos, de lo contrario, la consulta puede generar un error o un resultado inesperado.

Ejercicio

Utilizando la tabla empleados, encuentra la suma de todos los sueldos.

EMAIL NOMBRE EDAD SUELDO

[Link]@[Link] Juan 30 50,000

Perez

[Link]@[Link] Maria 25 55,000

Gonzalez

[Link]@[Link] John Doe 40 60,000

francisco@[Link] Francisco 22 45,000

Promedio de una columna

Hasta el momento hemos estudiado tres funciones de agregación:

• MAX()
• MIN()
• SUM()

En este ejercicio aprenderemos a calcular promedios con la función de agregación AVG(). El nombre de
la función viene del término en inglés average

SELECT AVG(columna) FROM tabla


Ejercicio

Utilizando la tabla empleados, encuentra el promedio de todos los sueldos.

EMAIL NOMBRE EDAD SUELDO

[Link]@[Link] Juan 30 50,000

Perez

[Link]@[Link] Maria 25 55,000

Gonzalez

[Link]@[Link] John Doe 40 60,000

francisco@[Link] Francisco 22 45,000

Contando elementos en una tabla

Hasta el momento hemos estudiado cuatro funciones de agregación:

• MAX()
• MIN()
• SUM()
• AVG()

Ahora introduciremos la función de agregación COUNT(). Con esta podemos contar la cantidad de
registros dentro de una tabla.

SELECT COUNT(*) FROM tabla

Ejercicio

Encuentra la cantidad de registros (cantidad de filas) que tiene la tabla empleados.

EMAIL NOMBRE EDAD SUELDO

[Link]@[Link] Juan 30 50,000

Perez
EMAIL NOMBRE EDAD SUELDO

[Link]@[Link] Maria 25 55,000

Gonzalez

[Link]@[Link] John Doe 40 60,000

francisco@[Link] Francisco 22 45,000

Ejercicio 1 : Funciones de agregacion con where

Las funciones de agregación se pueden combinar con las claúsulas previamente estudiadas.
Simplemente tenemos que respetar el orden establecido de las claúsulas.

A la hora de extraer datos de base de datos será muy común que utilicemos las funciones de
agregación en conjunto con where.

SELECT AVG(columna1) FROM tabla WHERE columna2 < valor

Ejercicio

Utilizando la tabla empleados, calcula la suma de sueldos de todas las personas mayores a 27 años.

EMAIL NOMBRE EDAD SUELDO

[Link]@[Link] Juan 30 50,000

Perez

[Link]@[Link] Maria 25 55,000

Gonzalez

[Link]@[Link] John Doe 40 60,000

francisco@[Link] Francisco 22 45,000


Ejercicio 2 : Funciones de agregacion con where

Ejercicio

Utilizando la tabla empleados, calcula el promedio de los sueldos de todas las personas que ganan
más de 50,000

EMAIL NOMBRE EDAD SUELDO

[Link]@[Link] Juan 30 50,000

Perez

[Link]@[Link] Maria 25 55,000

Gonzalez

[Link]@[Link] John Doe 40 60,000

francisco@[Link] Francisco 22 45,000

Tip: Tienen que ganar estrictamente más de 50,000.

Ejercicio 3 : Funciones de agregacion con where

Ejercicio

Dada la siguiente tabla empleados

NOMBRE APELLIDO SUELDO DEPARTAMENTO

Juan Perez 3000 Ventas

María Gonzalez 3500 Marketing

Carlos Rodríguez 4000 Tecnología

Ana Martínez 2800 Recursos

Humanos
NOMBRE APELLIDO SUELDO DEPARTAMENTO

Luis García 3200 Finanzas

Carmen Lopez 3100 Administracion

Jose Hernandez 2900 Operaciones

Francisco Martín 3400 Legal

Laura Sanchez 3300 Compras

Antonio Díaz 3600 Produccion

Sofía Ruiz 2750 Ventas

Jorge Vargas 3900 Tecnología

Elena Castro 3050 Marketing

Pedro Ortega 3150 Finanzas

Calcula cuantas personas trabajan en el área de marketing

Tip: Utiliza COUNT(*)


Ejercicio 4 : Funciones de agregacion con where

Ejercicio

Dada la siguiente tabla empleados

NOMBRE APELLIDO SUELDO DEPARTAMENTO

Juan Perez 3000 Ventas

María Gonzalez 3500 Marketing

Carlos Rodríguez 4000 Tecnología

Ana Martínez 2800 Recursos

Humanos

Luis García 3200 Finanzas

Carmen Lopez 3100 Administracion

Jose Hernandez 2900 Operaciones

Francisco Martín 3400 Legal

Laura Sanchez 3300 Compras

Antonio Díaz 3600 Produccion

Sofía Ruiz 2750 Ventas

Jorge Vargas 3900 Tecnología

Elena Castro 3050 Marketing

Pedro Ortega 3150 Finanzas

Calcula cuantas personas trabajan en total en las areas de finanzas y marketing


Conteo con condiciones con string

Ejercicio

Se tiene la tabla usuarios con la siguiente información:

ID NOMBRE APELLIDO EMAIL TELEFONO

1 Juan Perez juanperez@[Link] 555-1234

2 María García mariagarcia@[Link] 555-5678

3 Pedro Lopez pedrolopez@[Link] 555-9876

4 Lucía Sanchez luciasanchez@[Link] 555-5555

5 Jorge Martínez jorgemartinez@[Link] 555-4321

Cuenta la cantidad de usuarios cuyo nombre termina con la letra 'a' en la tabla de usuarios.
Distinct
• Seleccionar filtrando datos repetidos
• Seleccionando correos únicos
• Seleccionar distintos años
• Contar los valores distintos
• Contando correos únicos
• Distinct con múltiples columnas

Seleccionar filtrando datos repetidos

En SQL el keyword DISTINCT nos permite filtrar los resultados repetidos de una consulta.

Supongamos que tenemos la siguiente tabla llamada colores

COLOR

Rojo

Azul

Verde

Amarillo

Rojo

Verde

Rojo

Verde

Rojo

Negro

Blanco

Rojo
COLOR

Azul

Verde

Amarillo

Nos piden crear una consulta que nos muestre cada color una única vez. Para esto utilizaremos la
siguiente consulta

SELECT DISTINCT color AS color_unico


FROM colores

Ejercicio

Prueba en el editor la misma instrucción aprendida para ver cual sería el resultado de la consulta.

Seleccionando correos únicos

Ejercicio

Dada la siguiente tabla de usuarios

CORREO

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]
CORREO

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

Crea una consulta que nos muestre cada correo una única vez. La columa mostrada debe
llamarse correo_unico

Seleccionar distintos años

Se tiene la tabla ventas con la siguiente información:

ID_VENTA MONTO FECHA_VENTA

1 200 2010-01-15

2 150 2011-02-20

3 300 2012-04-10

4 250 2013-04-05

5 100 2014-04-25

6 350 2015-06-18

7 400 2015-06-22

8 180 2015-06-09

9 220 2018-07-30
ID_VENTA MONTO FECHA_VENTA

10 275 2019-07-11

Se nos ha solicitado crear una consulta que muestre los años en los que se han realizado
transacciones, excluyendo repeticiones.

Como ya aprendimos en ejercicios anteriores, para obtener el año a partir de la fecha de venta,
podemos utilizar el siguiente código:

SELECT strftime('%Y', fecha_venta) as año_venta FROM ventas

Sin embargo, para asegurarnos de obtener años únicos, podemos agregar la cláusula DISTINCT a
nuestra consulta de la siguiente manera:

SELECT DISTINCT strftime('%Y', fecha_venta) as año_unico FROM ventas

Ejercicio

Utilizando la misma tabla de ventas previamente utilizada, selecciona todos los meses distintos,
asignándole a la columna el alias "mes_unico".

Contar los valores distintos

Si queremos contar los valores distintos en una columna de una tabla, podemos combinar las
funciones COUNT y DISTINCT de la siguiente manera:COUNT(DISTINCT columna)

Veamos un ejemplo con la siguiente tabla de empleados:

NOMBRE APELLIDO SUELDO DEPARTAMENTO

Juan Perez 3000 Ventas

María Gonzalez 3500 Marketing

Carlos Rodríguez 4000 Tecnología


NOMBRE APELLIDO SUELDO DEPARTAMENTO

Ana Martínez 2800 Recursos

Humanos

Luis García 3200 Finanzas

Carmen Lopez 3100 Administracion

Jose Hernandez 2900 Operaciones

Francisco Martín 3400 Legal

Laura Sanchez 3300 Compras

Antonio Díaz 3600 Produccion

Sofía Ruiz 2750 Ventas

Jorge Vargas 3900 Tecnología

Elena Castro 3050 Marketing

Pedro Ortega 3150 Finanzas

Podemos contar la cantidad de departamentos únicos de la empresa con:

SELECT COUNT(DISTINCT Departamento) FROM Empleados;

Ejercicio

Se tiene la tabla usuarios con la siguiente información:

ID NOMBRE APELLIDO EMAIL TELEFONO

1 Juan Perez juanperez@[Link] 555-1234

2 María García mariagarcia@[Link] 555-5678


ID NOMBRE APELLIDO EMAIL TELEFONO

3 Pedro Lopez pedrolopez@[Link] 555-5678

4 Lucía Sanchez luciasanchez@[Link] 555-5555

5 Jorge Martínez jorgemartinez@[Link] 555-5678

Crea una consulta que muestre los teléfonos únicos de la tabla. La columna mostrada debe llamarse
telefonos_unicos

Contando correos únicos

Ejercicio

Dada la siguiente tabla de usuarios

CORREO

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]
CORREO

[Link]@[Link]

[Link]@[Link]

Crea una consulta para contestar cuantos correos únicos existen en la tabla. La columna resultante
debe llamarse correos_cant

Distinct con múltiples columnas

Podemos usar DISTINCT con más de una columna para obtener combinaciones únicas de esas
columnas. Supongamos que tienes una tabla llamada empleados con las columnas departamento y
puesto.

Para este ejemplo trabajaremos con la siguiente tabla empleados

ID_EMPLEADO NOMBRE DEPARTAMENTO PUESTO

1 Juan Ventas Vendedor

2 María Ventas Vendedor

3 Carlos IT Desarrollador

4 Ana IT Desarrollador

5 Luis Ventas Gerente

6 Carmen IT Gerente

7 Jose IT Desarrollador

8 Francisco Ventas Vendedor

Luego podemos obtener todas las combinaciones únicas de Departamento y Puesto utilizando la
siguiente consulta:
SELECT DISTINCT departamento, puesto FROM empleados;

Con esto obtendremos la siguiente tabla resultante.

DEPARTAMENTO PUESTO

Ventas Vendedor

IT Desarrollador

Ventas Gerente

IT Gerente

Ejercicio

Para la siguiente tabla "productos" deseamos obtener todas las combinaciones únicas de "Categoria" y
"Precio"

NOMBRE CATEGORIA PRECIO

Laptop Electronica 1000

Telefono Electronica 500

Camiseta Ropa 20

Pantalon Ropa 40

Auriculares Electronica 50

Libro Libros 15

Mochila Accesorios 30
Introducción a grupos
• Agrupando valores con GROUP BY
• Agrupar y contar
• Ejercitando agrupar y contar
• Agrupar y sumar
• Agrupar y promediar
• Máximo por grupo
• Mínimo por grupo
• Funciones de agregación y fechas
• Ejercitando funciones de agregación con fechas
• Agrupando sin indicar el nombre de las columnas
• Agrupando por múltiples columnas

Agrupando valores con GROUP BY

La cláusula GROUP BY es una poderosa herramienta en SQL que se utiliza para agrupar filas con
valores idénticos en una o varias columnas específicas, permitiendo realizar operaciones de
agregación en cada grupo.

En este primer ejercicio aprenderemos a utilizar GROUP BY para obtener todos los elementos
distintos de una tabla, lo mismo que previamente hicimos con distinct.

Tenemos la siguiente tabla colores:

COLOR

Rojo

Azul

Verde

Amarillo

Naranja

Morado

Rosa
COLOR

Cafe

Gris

Negro

Blanco

Rojo

Azul

Verde

Amarillo

Podemos seleccionar los elementos únicos utilizando GROUP BY de la siguiente forma:

SELECT color as color_unico FROM colores GROUP BY color

Como resultado obtendremos:

COLOR

Amarillo

Azul

Blanco

Cafe

Gris

Morado
COLOR

Naranja

Negro

Rojo

Rosa

Verde

Ejercicio

Dada la siguiente tabla de usuarios

CORREO

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]
CORREO

[Link]@[Link]

[Link]@[Link]

Crea una consulta que nos muestre cada correo una única vez. La columa mostrada debe
llamarse correo_unico

Agrupar y contar

GROUP BY es comúnmente utilizada junto con funciones de agregación como COUNT, MAX, MIN, SUM
y AVG para obtener información resumida de un conjunto de datos.

En este ejercicio aprenderemos a agrupar y contar.

Tenemos la siguiente tabla colores:

COLOR

Rojo

Azul

Verde

Amarillo

Naranja

Morado

Rosa

Cafe

Gris
COLOR

Negro

Blanco

Rojo

Azul

Verde

Amarillo

Queremos saber cuantas veces aparece cada color. Esto lo podemos lograr combinando GROUP BY y la
función de agregación COUNT

SELECT color, COUNT(color) as Repeticiones FROM colores GROUP BY color

COLOR REPETICIONES

Amarillo 2

Azul 2

Blanco 1

Cafe 1

Gris 1

Morado 1

Naranja 1

Negro 1

Rojo 2
COLOR REPETICIONES

Rosa 1

Verde 2

Ejercicio

Dada la siguiente tabla de usuarios

CORREO

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

Crea una consulta que nos muestre cada correo una única vez junto a la cantidad de repeticiones. Las
columnas deben llamarse correo y repeticiones.
Ejercitando agrupar y contar

Ejercicio

Dada la siguiente tabla empleados

NOMBRE APELLIDO SUELDO DEPARTAMENTO

Juan Perez 3000 Ventas

María Gonzalez 3500 Marketing

Carlos Rodríguez 4000 Tecnología

Ana Martínez 2800 Recursos

Humanos

Luis García 3200 Finanzas

Carmen Lopez 3100 Administracion

Jose Hernandez 2900 Operaciones

Francisco Martín 3400 Legal

Laura Sanchez 3300 Compras

Antonio Díaz 3600 Produccion

Sofía Ruiz 2750 Ventas

Jorge Vargas 3900 Tecnología

Elena Castro 3050 Marketing

Pedro Ortega 3150 Finanzas


Se pide contar cuantas personas trabajan en cada departamento. Las columnas resultantes deben
llamarse departamento y cantidad_empleados

Agrupar y sumar

En este ejercicio agruparemos y sumaremos. La lógica de la consulta es la misma previamente


mencionada, solo cambia la funcion de agrupacion a utilizar. Por ejemplo, tenemos la tabla pedidos
con los siguientes datos:

CLIENTE MONTO

Cliente A 1200

Cliente A 800

Cliente B 150

Cliente C 200

Cliente B 90

Si queremos calcular cuanto ha gastado cada cliente, podemos realizar la siguiente consulta

SELECT Cliente, SUM(Monto) AS Monto_Total FROM pedidos GROUP BY Cliente;

Ejercicio

Utilizando la siguiente tabla ventas de una empresa, crea una consulta que muestre cuanto se vendió
en total por cada cateogría. Las columnas de la consulta deben llamarse categoria y monto_total

PRODUCTO MONTO CATEGORIA

Laptop Pro 1200 Electronicos

Smartphone 800 Electronicos

X
PRODUCTO MONTO CATEGORIA

Silla Ergo 150 Mobiliario

Mesa de 90 Mobiliario

Cafe

Reloj 250 Accesorios

Elegante

Bolso de 70 Accesorios

Viaje

Zapatillas 100 Ropa

Run

Camisa 40 Ropa

Casual

Licuadora 60 Electrodomesticos

Max

Horno 110 Electrodomesticos

Compacto

Libro de 20 Libros

Cocina

Novela 15 Libros

Misterio

Audífonos 50 Electronicos

Plus

Lampara 45 Mobiliario

Moderna
PRODUCTO MONTO CATEGORIA

Laptop Pro 1200 Electronicos

Silla Ergo 150 Mobiliario

Bolso de 70 Accesorios

Viaje

Zapatillas 100 Ropa

Run

Agrupar y promediar

Previamente aprendimos que AVG nos permite calcular el promedio de los elementos de una columna
en una tabla. En este ejercicio lo utilizaremos para calcular promedios por grupo.

SELECT grupo, AVG(columna) FROM tabla GROUP by grupo

Ejercicio

Dada la siguiente tabla de estudiantes

NOMBRE_COMPLETO NOTA

Juan Perez 7

Juan Perez 8

Juan Perez 6

María Rodríguez 9

María Rodríguez 7

María Rodríguez 8

Carlos García 6
NOMBRE_COMPLETO NOTA

Carlos García 5

Carlos García 7

Ana Fernandez 8

Ana Fernandez 9

Ana Fernandez 8

Luis Morales 7

Luis Morales 6

Luis Morales 5

Encuentra el promedio de notas de cada estudiante. Las columnas deben tener el nombre de
Nombre_Completo y Promedio_Notas respectivamente.

Este ejercicio tiene un supuesto importante: que no hay dos estudiantes con el mismo nombre y
apellido. Discutiremos este tipo de supuestos más adelante cuando revisemos el concepto de
integridad.

Máximo por grupo

En este ejercicio combinaremos la función de agregación MAX() con group by para poder obtener el
monto mas alto de cada grupo. La sintaxis de la consulta será igual a las vistas previamente, es decir:

SELECT grupo, MAX(columna) FROM tabla GROUP by grupo

Ejercicio

Dada la siguiente tabla de ventas:


PRODUCTO MONTO CATEGORIA

Laptop Pro 1200 Electronicos

Smartphone 800 Electronicos

Silla Ergo 150 Mobiliario

Mesa de 90 Mobiliario

Cafe

Reloj 250 Accesorios

Elegante

Bolso de 70 Accesorios

Viaje

Zapatillas 100 Ropa

Run

Camisa 40 Ropa

Casual

Licuadora 60 Electrodomesticos

Max

Horno 110 Electrodomesticos

Compacto

Libro de 20 Libros

Cocina

Novela 15 Libros

Misterio
PRODUCTO MONTO CATEGORIA

Audífonos 50 Electronicos

Plus

Lampara 45 Mobiliario

Moderna

Laptop Pro 1200 Electronicos

Silla Ergo 150 Mobiliario

Bolso de 70 Accesorios

Viaje

Zapatillas 100 Ropa

Run

Crea una consulta para calcular el monto mas alto por cada categoría. La tabla resultante debe tener
dos columnas: categoria y monto_mas_alto.

Mínimo por grupo

En este ejercicio combinaremos la función MIN() con GROUP BY para poder obtener el monto mas
bajo de cada [Link] sintaxis de la consulta será igual a las vistas previamente, es decir:

SELECT grupo, MIN(columna) FROM tabla GROUP by grupo

Ejercicio

Dada la tabla ventas:

PRODUCTO MONTO CATEGORIA

Laptop Pro 1200 Electronicos


PRODUCTO MONTO CATEGORIA

Smartphone 800 Electronicos

Silla Ergo 150 Mobiliario

Mesa de 90 Mobiliario

Cafe

Reloj 250 Accesorios

Elegante

Bolso de 70 Accesorios

Viaje

Zapatillas 100 Ropa

Run

Camisa 40 Ropa

Casual

Licuadora 60 Electrodomesticos

Max

Horno 110 Electrodomesticos

Compacto

Libro de 20 Libros

Cocina

Novela 15 Libros

Misterio

Audífonos 50 Electronicos

Plus
PRODUCTO MONTO CATEGORIA

Lampara 45 Mobiliario

Moderna

Laptop Pro 1200 Electronicos

Silla Ergo 150 Mobiliario

Bolso de 70 Accesorios

Viaje

Zapatillas 100 Ropa

Run

Crea una consulta para calcular el monto más bajo por cada categoría. La tabla resultante debe tener
dos columnas: categoria y monto_mas_bajo.

Funciones de agregación y fechas

A la hora de construir informes, frecuentemente necesitaremos entregar información agrupada en un


periodo de tiempo. Para lograr esto utilizaremos una combinación de GROUP BY con la función
strftime.

Tenemos la tabla "ventas" con la siguiente información:

ID_VENTA MONTO FECHA_VENTA

1 200 2010-01-15

2 150 2011-02-20

3 300 2012-03-10

4 250 2012-04-05

5 100 2014-05-25
ID_VENTA MONTO FECHA_VENTA

6 350 2015-06-18

7 400 2015-07-22

8 180 2015-08-09

9 220 2018-09-30

10 275 2018-10-11

Se nos solicita determinar el monto total de ventas por año. Para resolverlo tenemos que agrupar por
fecha y sumar los montos de la siguiente forma:

SELECT SUM(monto), strftime("%Y", fecha_venta) AS año FROM ventas GROUP BY strftime("%Y", fecha_venta)

Ejercicio

Utilizando esta nueva tabla de ventas.

ID_VENTA MONTO FECHA_VENTA

1 200 2010-01-15

2 150 2010-02-20

3 300 2010-02-10

4 250 2010-04-05

5 100 2010-04-25

6 350 2010-04-18

7 400 2010-06-22

8 180 2010-06-09
ID_VENTA MONTO FECHA_VENTA

9 220 2010-09-30

10 275 2010-10-11

Calcula el total de ventas por mes. El nombre de las columnas resultantes será "suma_ventas" y "mes"
respectivamente.

Pista: utiliza la función strftime con %m.

Ejercitando funciones de agregación con fechas

Ejercicio

Se tiene una tabla llamada inscripciones con distintas fechas de inscripciones de un usuario a un sitio
web.

FECHA_INSCRIPCION

2022-01-15

2022-01-20

2022-02-10

2022-02-05

2022-03-25

2022-03-18

2022-04-22

2022-04-09

2022-05-30
FECHA_INSCRIPCION

2022-05-11

2022-06-19

2022-06-29

2022-07-12

2022-07-21

2022-08-08

2022-08-17

2022-09-13

2022-09-26

2022-10-14

2022-10-28

Cuenta cuántos usuarios se registraron cada mes. Las columnas resultantes deben llamarse "mes" y
"cantidad_usuarios".

Tip: Utiliza la función strftime con %m.

Agrupando sin indicar el nombre de las columnas

Cuando se trata de agrupar datos en una consulta SQL, existe una forma de evitar la redundancia de la
cláusula SELECT. Por ejemplo, considera la siguiente consulta:

SELECT strftime("%Y", fecha_venta) AS año, SUM(monto) FROM ventas GROUP BY strftime("%Y", fecha_venta)

Puedes simplificarla de la siguiente manera:

SELECT strftime("%Y", fecha_venta) AS año, SUM(monto) FROM ventas GROUP BY 1


Esta notación se interpreta como "agrupa por el primer criterio". También es posible aplicar esta
sintaxis en la cláusula ORDER BY:

SELECT strftime("%Y", fecha_venta) AS año, SUM(monto) FROM ventas GROUP BY 1 ORDER BY 1

De esta manera, puedes lograr la misma agrupación y ordenamiento sin repetir la expresión de la
cláusula SELECT.

Ejercicio

Dada la siguiente tabla de usuarios

CORREO

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]
Crea una consulta que nos muestre cada correo una única vez acompañado del número de veces que
se repite. Las columnas deben llevar los nombres "correo" y "repeticiones", respectivamente, y deben
estar ordenadas alfabéticamente.

Agrupando por múltiples columnas

En SQL es posible agrupar por múltiples columnas utilizando la siguiente sintaxis:

SELECT columna1, columna2, funcion_agrupado(columna3) FROM tabla GROUP BY columna1, columna2

Y como aprendimos en el ejercicio anterior, también podemos escribir la consulta de la siguiente


manera:

SELECT columna1, columna2, funcion_agrupado(columna3) FROM tabla GROUP BY 1, 2

Ejercicio

Tenemos la siguiente tabla estudiantes

CORREO MATERIA NOTA

estudiante1@[Link] Matematicas 8.5

estudiante2@[Link] Matematicas 9.0

estudiante3@[Link] Matematicas 7.5

estudiante1@[Link] Ciencias 8.0

estudiante2@[Link] Ciencias 9.5

estudiante3@[Link] Ciencias 7.0

estudiante1@[Link] Historia 8.7

estudiante2@[Link] Historia 9.2

estudiante3@[Link] Historia 7.8


Calcula el promedio de cada estudiante en cada materia. Las columnas deben llamarse correo, materia
y promedio_notas
Having
• Introducción a Having
• Buscando duplicados
• Having y cuenta
• Having y promedio
• Having y order
• Having y order 2

Introducción a Having

En SQL, la cláusula GROUP BY nos permite agrupar datos. Si queremos filtrar la información obtenida
utilizaremos HAVING.

HAVING se emplea para filtrar los resultados de una consulta que involucra funciones agregadas. En
otras palabras, HAVING permite aplicar condiciones de filtrado a los resultados de funciones como
COUNT, MAX, MIN, SUM y AVG después de que se han agrupado los datos con la cláusula GROUP BY.

Por ejemplo, si tenemos la siguiente tabla de inscripciones

FECHA_INSCRIPCION

2022-01-15

2022-01-20

2022-02-10

2022-02-05

2022-03-25

2022-03-18

2022-04-22

2022-04-09

2022-05-30
FECHA_INSCRIPCION

2022-05-11

2022-06-19

2022-06-29

2022-07-12

2022-07-21

2022-08-08

2022-08-17

2022-09-13

2022-09-26

2022-10-14

2022-10-28

Nos piden crear un reporte mostrando los meses y la cantidad de inscritos, pero solo donde hayan 2 o
más inscritos.

SELECT strftime("%m", Fecha_Inscripcion) AS mes, COUNT(Fecha_Inscripcion) cantidad_usuarios


FROM inscripciones
GROUP BY strftime("%m", Fecha_Inscripcion)
HAVING cantidad_usuarios >= 2

En esta consulta, primero utilizamos GROUP BY para agrupar por mes. Luego, utilizamos la función de
agregación COUNT(Fecha_Inscripcion) para contar la cantidad de [Link]és de haber
agrupado los datos y calculado el total de inscritos, aplicamos la cláusula HAVING para filtrar los
resultados.
Ejercicio

Crea un reporte mostrando los meses y la cantidad de inscritos pero solo donde haya 1 inscrito. Las
columnas deben llamarse mes y cantidad_usuarios respectivamente.

Buscando duplicados

Uno de los usos mas recurrentes de HAVING es buscar duplicados. Por ejemplo, dada una tabla de
correos ver cuales están más de 1 vez.

Ejercicio

Se tiene la tabla correos_corporativos

CORREO

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]

[Link]@[Link]
CORREO

[Link]@[Link]

Muestra los correos que aparezcan en más de una ocasión. La tabla resultante debe tener dos
columnas: una llamada correo, y otra llamada cuenta_correos que muestra la cantidad de repeticiones
correspondiente a cada correo.

Having y cuenta

Ejercicio

Dada la siguiente tabla empleados

NOMBRE APELLIDO SUELDO DEPARTAMENTO

Juan Perez 3000 Ventas

María Gonzalez 3500 Marketing

Carlos Rodríguez 4000 Tecnología

Ana Martínez 2800 Recursos

Humanos

Luis García 3200 Finanzas

Carmen Lopez 3100 Administracion

Jose Hernandez 2900 Operaciones

Francisco Martín 3400 Legal

Laura Sanchez 3300 Compras

Antonio Díaz 3600 Produccion


NOMBRE APELLIDO SUELDO DEPARTAMENTO

Sofía Ruiz 2750 Ventas

Jorge Vargas 3900 Tecnología

Elena Castro 3050 Marketing

Pedro Ortega 3150 Finanzas

Crea una consulta que muestre la cantidad de usuarios y el departamento en donde haya más de un
empleado. Las columnas deben llamarse cantidad_de_usuarios y departamento, respectivamente.

Having y promedio

Ejercicio

Se tiene la siguiente tabla notas:

EMAIL NOTAS

Alumno1@[Link] 90

Alumno1@[Link] 50

Alumno1@[Link] 30

Alumno2@[Link] 90

Alumno2@[Link] 20

Alumno3@[Link] 80

Alumno2@[Link] 50

Alumno3@[Link] 30

Alumno3@[Link] 10
Crea una consulta para determinar cuales son los estudiantes que aprobaron. El criterio de
aprobación es promedio de notas >= 50.

Las columnas a mostrar deben ser email y promedio_notas.

Having y order

Una vez que hemos agrupado datos utilizando la cláusula GROUP BY, es común que necesitemos
ordenar esos grupos según algún criterio específico. Por lo general, queremos ordenar los grupos en
función de alguna métrica agregada, como la suma, el conteo, el promedio, etc. Para hacer esto,
usamos la cláusula ORDER BY junto con las funciones de agregación.

El orden de las clausulas en una consulta debe ser el siguiente:

ORDEN CLAUSULA DESCRIPCIÓN

1 SELECT Especifica las

columnas que

se deben

retornar en el

resultado.

2 FROM Especifica las

tablas de las

cuales se

extraeran los

datos.

3 WHERE Filtra

registros

antes de

cualquier

agregacion o

agrupacion.
ORDEN CLAUSULA DESCRIPCIÓN

4 GROUP BY Agrupa

registros por

una o mas

columnas.

5 HAVING Filtra

registros

despues de la

agregacion.

6 ORDER BY Ordena los

registros

retornados

por una o mas

columnas.

7 LIMIT Limita el

numero de

registros

retornados.

Ejercicio

Dada la siguiente tabla ventas, escribe una consulta SQL para obtener los productos que se han
vendido en una cantidad total mayor a 1000, ordenados en orden descendente de cantidad vendida.

PRODUCTO CANTIDAD

A 500

B 2000

C 300
PRODUCTO CANTIDAD

D 1500

E 700

A 600

B 800

C 1200

D 400

E 300

La tabla resultante debe tener dos columnas: 'producto' y 'cantidad_total'.

Having y order 2

Ejercicio

Supongamos que tienes una tabla de empleados con los siguientes datos:

ID_EMPLEADO NOMBRE DEPARTAMENTO SALARIO

1 Juan Ventas 3000

2 Maria Marketing 3500

3 Carlos Ventas 4000

4 Ana Marketing 2800

5 Luis Ventas 3200

Tu tarea es escribir una consulta SQL que devuelva los departamentos cuyo salario promedio es
mayor a 3000, ordenados de mayor a menor salario promedio. Los resultados deben mostrar el
nombre del departamento y el salario promedio, con los nombres de las columnas
como Departamento y Salario_Promedio respectivamente.
Subconsultas
• Introduccion a subconsultas
• Subconsultas y where parte 1
• Subconsultas y where parte 2
• Subconsultas y where parte 3
• Subconsultas con IN
• Subconsultas con IN parte 2
• Subconsultas con IN parte 3
• Subconsultas en el FROM
• Subconsultas en el FROM parte2

Introduccion a subconsultas

Las subconsultas, también conocidas como "subqueries", nos permiten utilizar los resultados de una
consulta dentro de otra consulta.

Veamos un ejemplo práctico.

Dada la siguiente tabla empleados

NOMBRE APELLIDO SUELDO DEPARTAMENTO

Juan Perez 3000 Ventas

María Gonzalez 3500 Marketing

Carlos Rodríguez 4000 Tecnología

Ana Martínez 2800 Recursos

Humanos

Luis García 3200 Finanzas

Carmen Lopez 3100 Administracion

Jose Hernandez 2900 Operaciones

Francisco Martín 3400 Legal


NOMBRE APELLIDO SUELDO DEPARTAMENTO

Laura Sanchez 3300 Compras

Antonio Díaz 3600 Produccion

Sofía Ruiz 2750 Ventas

Jorge Vargas 3900 Tecnología

Elena Castro 3050 Marketing

Pedro Ortega 3150 Finanzas

Se nos pide seleccionar a todas las personas que ganan sobre el promedio.

Este tipo de preguntas podemos contestarlas utilizando subconsultas.

La idea para contestar esto es la siguiente.

1. Calculamos el promedio SELECT avg(sueldo) FROM empleados


2. Seleccionamos todos los empleados cuyo sueldo es mayor a la consulta anterior. SELECT * FROM
empleados WHERE sueldo > (SELECT AVG(sueldo) FROM empleados)

Ejercicio

Utilizando los mismos datos de la tabla empleados, selecciona todos los registros cuyo sueldo sea
menor o igual al promedio.

Subconsultas y where parte 1

Dentro de las subconsultas, podemos utilizar las mismas cláusulas que hemos aprendido hasta ahora,
como la cláusula WHERE. Esto significa que podemos aplicar la cláusula WHERE tanto dentro de la
subconsulta como fuera de ella.

Ejercicio

Dada la siguiente tabla empleados


NOMBRE APELLIDO SUELDO DEPARTAMENTO

Juan Perez 3000 Ventas

María Gonzalez 3500 Marketing

Carlos Rodríguez 4000 Tecnología

Ana Martínez 2800 Recursos

Humanos

Luis García 3200 Finanzas

Carmen Lopez 3100 Administracion

Jose Hernandez 2900 Operaciones

Francisco Martín 3400 Legal

Laura Sanchez 3300 Compras

Antonio Díaz 3600 Produccion

Sofía Ruiz 2750 Ventas

Jorge Vargas 3900 Tecnología

Elena Castro 3050 Marketing

Pedro Ortega 3150 Finanzas

Selecciona toda la información de los registros que sean mayores al promedio del departamento de
finanzas.

Tip:

• Se pide el promedio exclusivamente del departamento de finanzas por lo que no hay necesidad de
agrupar los datos.
• Para este tipo de problema usualmente hay mas de una solucion.
Subconsultas y where parte 2

Ejercicio

NOMBRE APELLIDO SUELDO DEPARTAMENTO

Juan Perez 3000 Ventas

María Gonzalez 3500 Marketing

Carlos Rodríguez 4000 Tecnología

Ana Martínez 2800 Recursos

Humanos

Luis García 3200 Finanzas

Carmen Lopez 3100 Administracion

Jose Hernandez 2900 Operaciones

Francisco Martín 3400 Legal

Laura Sanchez 3300 Compras

Antonio Díaz 3600 Produccion

Sofía Ruiz 2750 Ventas

Jorge Vargas 3900 Tecnología

Elena Castro 3050 Marketing

Pedro Ortega 3150 Finanzas

Utilizando los datos de la tabla empleados, selecciona todos los empleados cuyo sueldo sea mayor al
empleado que tiene el mayor sueldo del departamento de finanzas.
Subconsultas y where parte 3

Ejercicio

Se tiene la siguiente tabla notas:

EMAIL NOTAS

Alumno1@[Link] 90

Alumno1@[Link] 50

Alumno1@[Link] 30

Alumno2@[Link] 90

Alumno2@[Link] 20

Alumno3@[Link] 80

Alumno2@[Link] 50

Alumno3@[Link] 30

Alumno3@[Link] 10

Selecciona todos los registros superiores al promedio de nota.


Subconsultas con IN

El operador IN es un operador muy útil en subconsultas. Para entenderlo, primero probaremos una
consulta sencilla utilizandolo directamente sin subconsultas.

CÓDIGO
PAÍS
TELÉFONO

Argentina +54

Brasil +55

Chile +56

Colombia +57

Espana +34

Estados +1

Unidos

Mexico +52

Queremos seleccionar todos los códigos de Argentina, Brasil, Chile o Colombia. Una forma de abordar
el problema sería combinar todas las opciones con where y múltiples operadores or. Otra opción es
utilizando el operador IN de la siguiente manera:

SELECT *
FROM paises
WHERE pais IN ('Argentina', 'Brasil', 'Chile', 'Colombia')

De la misma forma podemos hacer una consulta como la siguiente:

SELECT *
FROM table
WHERE columna IN (SELECT * from otra_tabla)

Operador IN con subconsultas

Se tiene la siguiente tabla de estudiantes


ESTUDIANTE_ID NOMBRE

1 Juan

2 María

3 Pedro

4 Ana

y la tabla de notas

ESTUDIANTE_ID PROMEDIO_NOTAS

1 85

2 65

3 49

4 38

Se nos pide mostrar los nombres de todas las personas que tengan un promedio de notas menor que
50.

1. Seleccionamos los ids de la tabla notas con promedio_notas <= 50


2. Seleccionamos los nombres de de la tabla estudiantes cuyo id este dentro de la subconsulta anterior.

SELECT nombre from estudiantes


WHERE estudiante_id IN (SELECT estudiante_id from notas where promedio_notas <= 50)

Ejercicio

Se tiene una tabla estudiantes con un código y un nombre

ESTUDIANTE_ID NOMBRE

1 Juan

2 María
ESTUDIANTE_ID NOMBRE

3 Pedro

4 Ana

Y se tiene una tabla promedios con el código del estudiante y su promedio de notas.

ESTUDIANTE_ID PROMEDIO_NOTAS

1 85

2 65

3 49

4 38

Muestra los nombres de todos los estudiantes que tengan un promedio de notas sobre 50

Tip 1: No necesitas agrupar ni promediar ni contar Tip 2: Hay más de una forma de resolver este
ejercicio, no te adelantes a joins e intenta resolverlo utilizando subqueries

Subconsultas con IN parte 2

Ejercicio

Se tiene la tabla libros

LIBRO_ID NOMBRE

1 La Odisea

2 Cien

Anos de

Soledad
LIBRO_ID NOMBRE

3 El

Principito

4 Moby

Dick

Y se tiene la tabla valoraciones

LIBRO_ID VALORACION_PROMEDIO

1 4.5

2 4.7

3 4.2

4 3.9

Crea una consulta que muestre todos los títulos con valoración_promedio > 4. La columna resultante
debe llamarse nombres_seleccionados.

Subconsultas con IN parte 3

Ejercicio

Se tiene una tabla de pacientes

PACIENTE_ID NOMBRE

1 Roberto

2 Carmen

3 Luisa
PACIENTE_ID NOMBRE

4 Esteban

Se tiene una tabla de consultas

PACIENTE_ID FECHA_CONSULTA

1 2023-05-10

2 2023-05-15

3 2023-05-20

4 2023-05-25

Se pide obtener los nombres de todos los pacientes que tuvieron su última consulta antes del 16 de
mayo de 2023. La columna se debe llamar nombres_pacientes.

Subconsultas en el FROM

Las subconsultas, también conocidas como "subqueries", nos permiten utilizar los resultados de una
consulta dentro de otra consulta. En los ejercicios anteriores utilizamos las subconsultas dentro de la
claúsula WHERE, pero también es posible utilizarlas dentro de otras claúsulas. En este ejercicio
abordaremos como utilizarla dentro de FROM

Una subconsulta en el FROM tiene la siguiente forma.

SELECT *
FROM (
SELECT * FROM tabla1
)

En este caso no parece tan útil ya que simplemente estamos seleccionando lo mismo, pero veamos un
caso donde si sería necesario.

Se tiene la tabla ventas que tiene el código de vendedor y el monto de cada venta realizada. Nos piden
saber cuanto es el promedio total vendido.
EMPLEADO_ID MONTO

1 100

1 150

2 200

2 250

3 300

3 350

4 400

Para esto primero necesitamos sumar los montos por vendedor y luego sobre estos
resultados sacamos el promedio de las ventas.

SELECT AVG(total_venta) as promedio_ventas


FROM (
SELECT empleado_id, SUM(monto) as total_venta
FROM ventas
GROUP BY empleado_id
)

¿Cómo llegamos a esto?

Si queremos saber los promedios, primero tenemos que saber los totales, para eso necesitamos sumar
por empleado.

SELECT empleado_id, SUM(monto) as total_venta


FROM ventas
GROUP BY empleado_id

El código anterior nos generará los siguientes resultados.

EMPLEADO_ID TOTAL_VENTA

1 250

2 450
EMPLEADO_ID TOTAL_VENTA

3 650

4 400

Luego sacamos el promedio de los montos de esta nueva tabla.

SELECT AVG(total_venta) as promedio_ventas


FROM (
SELECT empleado_id, SUM(monto) as total_venta
FROM ventas
GROUP BY empleado_id
)

Este tipo de ejercicio suele ser un poco mas complejo de pensar y escribir y requiere de cierta práctica
dominar, por lo mismo el primer ejercicio consistirá en escribir el mismo query. Intenta hacerlo sin
mirar la respuesta.

Ejercicio

Se tiene la tabla ventas que tiene el código de vendedor y el monto de la venta. Nos piden saber cuanto
es el promedio total vendido. El resultado debe estar en la columna promedio_ventas

Subconsultas en el FROM parte2

Ejercicio

Se tiene la tabla goles que registra los goles logrados por cada jugador en distintos partidos.

JUGADOR_ID NOMBRE GOLES

1 Juan 2

1 Juan 1

2 María 1

2 María 1
JUGADOR_ID NOMBRE GOLES

3 Pedro 3

4 Ana 1

Nos piden una consulta para calcular el promedio total de goles.


Combinación de consultas
• Introducción a la cláusula unión de SQL
• Eliminar duplicados con union
• Union vs Union all
• Introducción a intersección
• El operador Except

Introducción a la cláusula unión de SQL

El operador UNION en SQL se utiliza para combinar el resultado de dos o más SELECT en un solo
conjunto de resultados.

La sintaxis básica de UNION es la siguiente:

SELECT columna1, columna2


FROM tabla1
UNION SELECT columna1, columna2
FROM tabla2;

Las columnas que se seleccionan en los SELECT deben tener los mismos nombres de columna,
secuencia y tipos de datos.

Veamos un ejemplo:

Supongamos que tenemos dos tablas: 'Estudiantes' y 'Profesores', que contienen una lista de apellidos
en cada una. Queremos crear una lista que combine los apellidos de ambas tablas.

Estudiantes

ID NOMBRE APELLIDO

1 Juan Rodríguez

2 María Sanchez

3 Pedro Castillo

Profesores
ID NOMBRE APELLIDO

1 Alberto Vargas

2 Carla Garrido

3 Diego Mendoza

Al hacer la consulta:

SELECT apellido
FROM Estudiantes
UNION
SELECT apellido
FROM Profesores;

Nos daría el resultado:

APELLIDO

Rodríguez

Sanchez

Castillo

Vargas

Garrido

Mendoza

Ejercicio

Dadas las tablas estudiantes

NOMBRE

Juan
NOMBRE

Maria

Pedro

y profesores

NOMBRE

Carlos

Ana

Luis

Escribe una consulta SQL que use UNION para combinar los nombres de ambas tablas. La columna
resultante debe llamarse 'nombres'.

Eliminar duplicados con union

El operador UNION se utiliza para combinar los resultados de dos o más consultas SELECT en un solo
conjunto de resultados. La principal característica de UNION es que elimina las filas duplicadas del
resultado final.

Ejercicio

Se tiene la tabla usuarios con la siguiente información:

ID NOMBRE APELLIDO EMAIL TELEFONO

1 Juan Perez juanperez@[Link] 555-1234

2 María García mariagarcia@[Link] 555-5678

3 Pedro Lopez pedrolopez@[Link] 555-5678


ID NOMBRE APELLIDO EMAIL TELEFONO

4 Lucía Sanchez luciasanchez@[Link] 555-5555

5 Jorge Martínez jorgemartinez@[Link] 555-5678

Y la tabla clientes con la siguiente información:

ID NOMBRE APELLIDO EMAIL TELEFONO

1 Juan Perez juanperez@[Link] 555-1234

2 María García mariagarcia@[Link] 555-5678

3 Pedro Lopez pedrolopez@[Link] 555-5678

4 Lucía Sanchez luciasanchez@[Link] 555-5555

5 Jorge Martínez jorgemartinez@[Link] 555-4321

Crea una consulta que nos muestre cada correo una única vez. La columna mostrada debe
llamarse correos_unicos

Union vs Union all

En los ejercicios anteriores aprendimos que el operador UNION se utiliza para combinar los
resultados de dos o más consultas SELECT en un solo conjunto de resultados, eliminando las filas
duplicadas.

Si queremos obtener las filas duplicadas en el resultado, utilizaremos el operador UNION ALL.

Por ejemplo, si tenemos dos tablas, 'tabla1' y 'tabla2', con los siguientes datos:

tabla1
NOMBRE EDAD

Juan 30

Maria 25

Carlos 40

tabla2

NOMBRE EDAD

Juan 30

Luis 30

Carmen 25

Observa que Juan está en ambas tablas.

Podemos combinar ambas tablas utilizando UNION ALL de la siguiente forma:

SELECT * FROM tabla1 UNION ALL SELECT * FROM tabla2;

Como resultado obtendremos:

NOMBRE EDAD

Juan 30

Maria 25

Carlos 40

Juan 30

Luis 30
NOMBRE EDAD

Carmen 25

Ejercicio

Dadas las siguientes tablas empleados1 y empleados2

empleados1

NOMBRE APELLIDO EDAD

Juan Perez 30

María Gonzalez 25

Carlos Rodríguez 40

empleados2

NOMBRE APELLIDO EDAD

Ana Martínez 22

María Gonzalez 25

Carmen Lopez 25

Crea una consulta que combine ambas tablas incluyendo las filas duplicadas.

Introducción a intersección

El operador INTERSECT se utiliza para combinar dos SELECT y devolver los resultados que se
encuentran en ambas consultas.

Por ejemplo, si tenemos las siguientes dos tablas, clientes1 y clientes2:

Tabla clientes1:
NOMBRE

Juan

Maria

Carlos

Ana

Luis

Tabla clientes2:

NOMBRE

Ana

Luis

Pedro

Carmen

Juan

Podemos encontrar los clientes en común utilizando INTERSECT de la siguiente forma:

SELECT nombre FROM clientes1 INTERSECT SELECT nombre FROM clientes2

Como resultado obtendremos:

NOMBRE

Ana

Juan
NOMBRE

Luis

Ejercicio

Dadas las siguientes tablas, lista1 y lista2, encuentra los clientes que están en ambas listas.

Lista1:

CLIENTE

Juan

Maria

Carlos

Ana

Luis

Pedro

Carmen

Lista2:

CLIENTE

Ana

Luis

Pedro

Carmen
CLIENTE

Juan

Maria

Sofia

El operador Except

El operador EXCEPT en SQL se utiliza para devolver todas las filas en la primera consulta que no están
presentes en la segunda consulta. En otras palabras, EXCEPT devuelve solo las filas, que son parte de
la primera consulta pero no de la segunda consulta.

Por ejemplo, si tenemos dos tablas, 'Tabla1' y 'Tabla2', que contienen los siguientes datos:

Tabla1

ID NOMBRE

1 Juan

2 María

3 Carlos

Tabla2

ID NOMBRE

1 Juan

4 Ana

5 Luis
Podemos usar EXCEPT para encontrar los nombres que están en 'Tabla1' pero no en 'Tabla2' con la
siguiente consulta:

SELECT nombre FROM Tabla1 EXCEPT SELECT nombre FROM Tabla2;

Esto daría como resultado:

NOMBRE

María

Carlos

Ejercicio

Dadas las siguientes tablas, 'empleados' y 'gerentes', que contienen los siguientes datos:

empleados

ID NOMBRE

1 Juan

2 María

3 Carlos

4 Ana

5 Luis

gerentes

ID NOMBRE

1 Juan
ID NOMBRE

2 María

Crea una consulta que muestre los nombres de los empleados que no son gerentes.
Inserción de registros
• Añadir un registro en una tabla
• Añadir un registro en una tabla parte 2
• Especificando valores nulos
• Añadir un registro especificando columnas
• Añadir un registro especificando solo algunas columnas
• Añadir fecha de hoy a un registro
• Añadiendo fecha y hora al insertar
• Añadir múltiples valores
• Crear un registro con un campo autoincremental
• Añadir un registro asumiendo un valor por defecto

Añadir un registro en una tabla

Con SQL podemos ingresar datos nuevos a tablas existentes. Para lograrlo utilizaremos la
instrucción INSERT .

La instrucción INSERT la acompañaremos de las palabra clave INTO para especificar en qué tabla
queremos insertar un valor y VALUES para especificar los valores que queremos insertar.

Por ejemplo. Si tenemos una tabla llamada productos con las columnas id, nombre y precio, podemos
agregar un nuevo producto a la tabla usando utilizando:

INSERT INTO productos VALUES (1, 'Camiseta', 2000);

Para cada columna en la tabla debemos ingresar los valores correspondientes en el mismo orden en
que se definen en la sentencia. Debemos utilizar comillas simples para valores de tipo de datos de
texto.

Ejercicio

Dada la tabla usuarios con las columnas id, nombre, apellido, email y telefono:

TIPO DE
COLUMNA
DATO

id INTEGER

nombre TEXT
TIPO DE
COLUMNA
DATO

apellido TEXT

email TEXT

telefono TEXT

Crea un nuevo usuario con los siguientes datos:

• id: 7
• nombre: Lucía
• apellido: Sanchez
• email: luciasanchez@[Link]
• telefono: 555-5555

Añadir un registro en una tabla parte 2

Ejercicio

Se tiene la tabla productos:

COLUMNA TIPO

id INT

nombre VARCHAR

precio INT

stock INT

Inserta un nuevo producto con los siguientes datos:

• id: 7
• nombre: Bolso
• Precio: 1000
• Stock: 10

Especificando valores nulos


A la hora de insertar datos, si hay un valor que no conocemos, o es un valor que no queremos
especificar, podemos ingresar un valor nulo.

Ejemplo: Se tiene la tabla productos:

COLUMNA TIPO

id INT

nombre VARCHAR

precio INT

stock INT

Podemos ingresar solo el id y nombre con:

INSERT INTO productos VALUES (1, 'Camiseta', NULL, NULL);

Ejercicio

Se tiene la tabla productos:

COLUMNA TIPO

id INT

nombre VARCHAR

precio INT

stock INT

Inserta un nuevo producto con los siguientes datos:

• id: 7
• nombre: Bolso
• Precio: 1000
Añadir un registro especificando columnas

A la hora de insertar datos es posible mencionar específicamente las columnas que se van a insertar,
en lugar de mencionar todos los valores en el orden en que se definen en la tabla.

Veamos un ejemplo:

Se tiene la tabla productos:

COLUMNA TIPO

id INT

nombre VARCHAR

precio INT

stock INT

Se pide insertar un nuevo producto con los siguientes datos, pero especificando las columnas

• id: 7
• nombre: Bolso
• Precio: 1000
• Stock: 10

INSERT INTO productos (id, precio, nombre, stock) VALUES (7, 1000,'Bolso', 10);

Una ventaja de este método es que no es necesario ingresar los valores en el mismo orden en que se
definen en la tabla.

Ejercicio

Se tiene la tabla usuarios:

TIPO DE
COLUMNA
DATO

id INTEGER
TIPO DE
COLUMNA
DATO

nombre TEXT

apellido TEXT

email TEXT

telefono TEXT

Prueba agregando los siguientes datos a la tabla usuarios, puedes notar que tienen el orden alterado
en relación a la tabla.

• id: 7
• apellido: Sanchez
• nombre: Lucía
• telefono: 333-3333
• email: luciasanchez@[Link]

Añadir un registro especificando solo algunas columnas

Otro beneficio de especificar las columnas al momento de insertar datos es que se insertarán valores
nulos en las columnas no mencionadas automáticamente.

Supongamos que tenemos una tabla llamada productos:

COLUMNA TIPO

nombre TEXT

precio INT

stock INT

Podemos ingresar el producto "Gorro" con un precio de 1000 y dejar el stock en nulo de la siguiente
manera:

INSERT INTO productos (nombre, precio) VALUES ('Gorro', 1000);


Mas adelante aprenderemos que algunas columnas pueden tener restricciones que no permiten
valores nulos.

Ejercicio

Inserta un nuevo item en la tabla productos con los siguientes datos:

• nombre: Bolso
• stock: 10

Añadir fecha de hoy a un registro

Si queremos insertar la fecha actual al momento de crear un registro, podemos utilizar la


función CURRENT_DATE para obtenerla.

Ejemplo: INSERT INTO usuarios (nombre, fecha_creacion) VALUES ('Gonzalo', CURRENT_DATE);

Ejercicio

COLUMNA TIPO

nombre TEXT

precio INT

stock INT

fecha DATE

Si tenemos la tabla productos, inserta un nuevo producto con los siguientes datos:

• nombre: Bolso
• stock: 10
• fecha: CURRENT_DATE

Añadiendo fecha y hora al insertar

Si queremos insertar una fecha cualquiera al momento de crear un registro, simplemente debemos
hacerlo especificando la fecha en el formato esperado.
El formato de fecha es: YYYY-MM-DD, o sea año-mes-día, donde el año es de 4 dígitos, el mes es de 2
dígitos y el día es de 2 dígitos.

Ejemplo: INSERT INTO usuarios (nombre, fecha_creacion) VALUES ('Gonzalo', '2021-01-01');

Ejercicio

Se tiene la tabla productos:

COLUMNA TIPO

nombre TEXT

precio INT

stock INT

fecha DATE

Inserta un nuevo producto con los siguientes datos:

• nombre: Bolso
• stock: 10
• fecha: fecha_con_formato

La fecha del producto debe ser del primero de enero del 2023.

Añadir múltiples valores

Podemos ingresar varios registros en una tabla en una sola sentencia INSERT. Para lograrlo, debemos
especificar los valores de cada registro separados por comas.

Por ejemplo, si tenemos una tabla llamada ventas con las columnas producto, cantidad y precio,
podemos agregar varios registros a la tabla usando:

INSERT INTO ventas VALUES ('Camiseta', 5, 2000), ('Pantalón', 3, 1500), ('Zapatos', 2, 3000);

Ejercicio

Inserta los siguientes registros en la tabla ventas:


PRODUCTO CANTIDAD PRECIO

Gorro 5 1000

Camiseta 10 500

Pantalon 8 1500

Crear un registro con un campo autoincremental

En una base de datos SQL, es posible agilizar el proceso de inserción de datos en una tabla mediante el
uso de un campo autoincremental. Este tipo de campo es especialmente útil cuando se trata de
gestionar identificadores únicos, como por ejemplo el campo "id" de una tabla. La característica de
autoincremento se logra empleando la cláusula AUTOINCREMENT en la definición del campo.

Para ilustrar este proceso, consideremos una tabla llamada "empleados" con tres columnas: "id"
(autoincremental), "nombre" y "apellido". Esta es la forma en que se crea la tabla:

CREATE TABLE empleados (id INTEGER PRIMARY KEY AUTOINCREMENT, nombre TEXT,apellido TEXT);

Aquí, hemos definido la columna "id" como un campo autoincremental utilizando la cláusula
AUTOINCREMENT, lo que asegura que se generará automáticamente un valor único y creciente para
cada nuevo registro.

Supongamos que deseamos insertar un nuevo empleado en esta tabla. Podemos utilizar la siguiente
consulta SQL:

INSERT INTO empleados (nombre, apellido) VALUES ('John', 'Doe');

Al ejecutar esta consulta, se creará un nuevo empleado en la tabla "empleados". La columna "id" se
incrementará automáticamente, mientras que los valores proporcionados para "nombre" y "apellido"
serán almacenados en las columnas correspondientes. Esto garantiza que cada nuevo empleado
tendrá un identificador único y que el proceso de inserción sea más eficiente.
Ejercicio

Dada la tabla empleados con las columnas id, nombre y apellido, crea un nuevo empleado con el
nombre "Jane" y el apellido "Smith".

Añadir un registro asumiendo un valor por defecto

Al crear una tabla en SQL, puedes asignar valores predeterminados a sus columnas. Esto implica que
al insertar nuevos datos, si no se proporciona un valor específico para una columna, se usará
automáticamente el valor por defecto asignado.

Supongamos que queremos crear una tabla llamada "Productos" con las siguientes columnas:

• ID (identificador unico del producto)


• Nombre (nombre del producto)
• Precio (precio del producto, con un valor por defecto de 10)

CREATE TABLE Productos (ID INTEGER PRIMARY KEY AUTOINCREMENT, Nombre TEXT, Precio INTEGER DEFAULT

10);

Si insertamos un nuevo producto sólo con el nombre, se utilizará automáticamente el valor por
defecto del precio:

INSERT INTO Productos (Nombre) VALUES ('Ejemplo Producto');

En este caso, el producto se insertará con el valor 10 en la columna Precio.

Si deseamos insertar un producto con un precio diferente, simplemente proporcionamos el valor


correspondiente:

INSERT INTO Productos (Nombre, Precio) VALUES ('Otro Producto', 25);

Ejercicio

Dada la tabla usuarios con las columnas id, nombre, apellido, email y telefono, crea un nuevo usuario
con los valores:

• nombre: Lucía
• apellido: Sanchez
• email: luciasanchez@[Link]

La columna telefono tendrá el valor por defecto 111-1111


Borrado y modificación de registros
• Borrar todos los registros de una tabla
• Borrar un registro con where
• Editar registros
• Editar todos los registros utilizando where
• Editar múltiples columnas

Borrar todos los registros de una tabla

En SQL, la cláusula DELETE se utiliza para eliminar registros de una tabla. Cuando se ejecuta la
instrucción DELETE FROM nombre_tabla, se eliminan todos los registros de la tabla especificada.

Es importante tener en cuenta que esta operación es irreversible y eliminará permanentemente los
datos de la tabla, por lo que debes tener mucho cuidado al usar esta instrucción.

Ejercicios

Borra todos los datos de la tabla 'productos'.

Borrar un registro con where

La sentencia DELETE se utiliza para eliminar datos de una tabla. Si queremos eliminar filas específicas
en lugar de todos los datos de la tabla, podemos usar la cláusula WHERE junto con la sentencia
DELETE. Esto nos permite especificar una condición para determinar qué filas se eliminarán.

Por ejemplo, si tenemos una tabla de productos y queremos eliminar solo aquellos productos cuyo
precio sea igual a 1000, podemos usar la siguiente consulta:

DELETE FROM productos WHERE precio = 1000

Ejercicio

Dada la tabla usuarios con los siguientes datos:

ID NOMBRE APELLIDO EMAIL TELEFONO

1 Juan Perez juanperez@[Link] 555-1234

2 María García mariagarcia@[Link] 555-5678


ID NOMBRE APELLIDO EMAIL TELEFONO

3 Pedro Lopez pedrolopez@[Link] 555-9876

4 Lucía Sanchez luciasanchez@[Link] 555-5555

5 Jorge Martínez jorgemartinez@[Link] 555-4321

Borra el usuario cuyo id sea igual a 2.

Editar registros

La sentencia UPDATE se utiliza para realizar modificaciones en datos ya existentes de una tabla.

Se utiliza de la siguiente forma

UPDATE nombre_tabla SET nombre_columna = nuevo_valor

Supongamos que tenemos una tabla ventas con una columna llamada "total". Si queremos aumentar
en un 10% el total de todas las ventas registradas en la tabla, podemos hacerlo de la siguiente manera:

UPDATE ventas SET total = total * 1.10;

La instrucción UPDATE afecta todas las filas de la tabla, ya que no hemos utilizado la cláusula WHERE
para establecer una condición de filtro.

Ejercicio

Se tiene una tabla usuarios con los siguientes datos:

ID NOMBRE APELLIDO EMAIL REGISTRADO

1 Juan Perez juanperez@[Link] FALSE

2 María García mariagarcia@[Link] FALSE

3 Pedro Lopez pedrolopez@[Link] FALSE


ID NOMBRE APELLIDO EMAIL REGISTRADO

4 Lucía Sanchez luciasanchez@[Link] FALSE

5 Jorge Martínez jorgemartinez@[Link] FALSE

Edita la columna "registrado" para que todos los usuarios tengan el valor TRUE

Editar todos los registros utilizando where

Si queremos editar solamente algunas filas de nuestra tabla, podemos utilizar UPDATE en conjunto
con WHERE. De esta forma solo se modificarán los registros que cumplan con la condición
especificada.

UPDATE nombre_tabla SET nombre_columna = nuevo_valor WHERE condicion;

Supongamos que gestionamos una tabla llamada empleados que contiene información sobre los
empleados de una empresa. Entre las columnas se encuentran id_empleado, nombre, salario y
departamento. Si deseamos aumentar el salario en un 15% solamente para los empleados que
trabajan en el departamento de "Ventas", podríamos emplear la instrucción UPDATE junto con
WHERE de la siguiente manera:

UPDATE empleados SET salario = salario * 1.15 WHERE departamento = 'Ventas';

Es importante ser precavido al elegir la condición de filtrado para tus filas. De esta manera, te
aseguras de no alterar accidentalmente datos equivocados.

Ejercicio

Se tiene una tabla usuarios con los siguientes datos:

ID NOMBRE APELLIDO EMAIL TELEFONO

1 Juan Perez juanperez@[Link] 555-1234

2 María García mariagarcia@[Link] 555-5678


ID NOMBRE APELLIDO EMAIL TELEFONO

3 Pedro Lopez pedrolopez@[Link] 555-9876

4 Lucía Lopez luciasanchez@[Link] 555-5555

5 Jorge Martínez jorgemartinez@[Link] 555-4321

Asignales el telefono 123-456 al usuario con id 4.

Editar múltiples columnas

En SQL es posible editar múltiples columnas de un registro utilizando la cláusula SET. Para lograrlo,
debemos especificar el nombre de cada columna que queremos modificar, seguido del nuevo valor
que queremos asignarle.

UPDATE tabla
SET
columna1 = 'nuevo_valor',
columna2 = 'nuevo_valor',
columna3 = 'nuevo_valor'
WHERE
condicion;
UPDATE usuarios
SET
nombre = 'Juan',
apellido = 'Pérez'
WHERE
id = 1;

También es posible escribir la consulta en una sola línea, pero es recomendable utilizar saltos de línea
para mejorar la legibilidad del código.

Ejercicio

Se tiene una tabla de posts con las siguientes columnas:


TIPO DE
COLUMNA
DATO

id INTEGER

titulo TEXT

contenido TEXT

autor TEXT

fecha TEXT

Edita el post con id 1 para que tenga el título "Aprendiendo SQL" y el contenido "SQL es un lenguaje de
programación para gestionar bases de datos relacionales".
Tablas
• Nuestra primera tabla
• Una tabla con múltiples columnas
• Tablas con distintos tipos de datos
• Tipos reales
• Borrar un tabla
• Actualizar una tabla

Nuestra primera tabla

Hasta este punto, hemos aprendido cómo realizar consultas en tablas predefinidas, e incluso cómo
insertar datos a las tablas, pero ¿cómo creamos nuestras propias tablas?

Para crear una tabla en SQL, se utiliza la sentencia CREATE TABLE de la siguiente forma:

CREATE TABLE nombre_tabla (nombre_columna1 tipo_de_dato)

Esta sentencia permite definir la estructura de la tabla, incluyendo el nombre de las columnas y sus
tipos de datos. Veamos un ejemplo de cómo crear una tabla de productos que incluye diferentes tipos
de datos para las columnas:

CREATE TABLE productos (nombre TEXT);

Luego, una vez creada la tabla, podemos insertar datos tal como aprendimos en ejercicios anteriores:

INSERT INTO productos values ('Ipad Pro 2022'), ('Iphone 13 Pro Max'), ('Macbook Pro
2023');

Ejercicio

Crea una tabla llamada alumnos que almacene una columan nombre de tipo texto

TIPO

COLUMNA DE

DATO

nombre texto

Inserta un registro dentro de la tabla creada utilizado los siguientes datos:

• nombre: Lucía
Pista: Para poder ingresar las dos queries requeridas, recuerda añadir punto y coma al final de cada
una.

Una tabla con múltiples columnas

Al momento de crear una tabla podemos especificar múltiples columnas, cada una con su nombre y
tipo de dato. Por ejemplo, si queremos crear una tabla de productos que incluya el nombre,
descripción y precio de cada producto, podemos hacerlo de la siguiente forma:

CREATE TABLE productos (nombre TEXT, descripcion TEXT, precio INT);

Ejercicio

Crea una tabla llamada alumnos con las siguientes columnas:

TIPO

COLUMNA DE

DATO

nombre texto

apellido texto

telefono texto

Inserta un registro dentro de la tabla creada utilizado los siguientes datos:

• nombre: Lucía
• apellido: Sanchez
• telefono: 12345678

Pista: para poder ingresar las dos queries requeridas, recuerda añadir punto y coma al final de cada
una.

Tablas con distintos tipos de datos

Adicionalmente a los datos de tipo Texto podemos utilizar otros tipos de datos, en este ejercicio
abordaremos los 3 siguientes tipos.

• INTEGER para almacenar numeros enteros


• BOOLEAN para almacenar valores de verdadero o falso
• DATE para almacenar fechas
Ejercicio

Crea una tabla llamada usuarios con las siguientes columnas:

TIPO

COLUMNA DE

DATO

nombre text

apellido text

Edad integer

activo boolean

nacimiento date

Luego inserta un registro dentro de la tabla creada utilizado los siguientes datos:

• nombre: Lucía
• apellido: Sanchez
• edad: 25
• activo: true
• nacimiento: 1996-01-01

Pista: para poder ingresar las dos queries requeridas, recuerda añadir punto y coma al final de cada
una.

Tipos reales

Hasta el momento hemos visto los siguientes tipos de datos:

• TEXT para almacenar texto


• INTEGER para almacenar numeros enteros
• BOOLEAN para almacenar valores de verdadero o falso
• DATE para almacenar fechas

En este ejercicio veremos el tipo de dato REAL, que permite almacenar números con decimales.
Ejercicio

Crea una tabla llamada temperaturas con la columna temperatura_celsius:

TIPO

COLUMNA DE

DATO

temperatura_celsius real

Luego inserta los siguientes registros:

TEMPERATURA_CELSIUS

23.4

26.5

27.1

Importante. Para ingresar la parte decimal de los números, utiliza el punto (.) como separador
decimal

Borrar un tabla

En SQL podemos utilizar el comando DROP TABLE para eliminar una tabla.

Por ejemplo, si queremos eliminar la tabla temperaturas que creamos en el ejercicio anterior,
podemos hacerlo con la siguiente query:

DROP TABLE temperaturas;

Si intentamos hacer un SELECT de la tabla temperaturas luego de eliminarla, obtendremos un error.

Ejercicio

En este ejercicio tendremos una tabla con datos que no nos interesan, deberemos borrarla, crearla de
nuevo y poblarla con los datos pedidos.
Borra la tabla temperaturas y vuelve a crearla con las siguientes columnas:

TIPO

COLUMNA DE

DATO

ciudad TEXT

temperatura REAL

Fecha Date

Luego, inserta los siguientes registros:

CIUDAD TEMPERATURA FECHA

Buenos 20.0 2024-

Aires 01-01

Buenos 21.0 2024-

Aires 01-02

Santiago 22.0 2024-

01-01

Santiago 23.0 2024-

01-02

Importante: para poder ingresar las queries requeridas, recuerda añadir punto y coma al final de
cada una.

Actualizar una tabla

En este ejercicio aprenderemos a añadir una columna a una tabla existente. Para ello, utilizaremos la
sentencia ALTER TABLE, que nos permite modificar la definición de una tabla.

La sintaxis para lograrlo es la siguiente:


ALTER TABLE nombre_tabla ADD COLUMN nombre_columna tipo_dato;

donde tenemos que especificar el nombre de la tabla existente, el nombre de la columna nueva y el
tipo de dato que utilizaremos.

Por ejemplo si tenemos la tabla personas con las columnas nombre y apellido, y queremos agregar la
columna edad de tipo INTEGER, podemos hacerlo de la siguiente manera:

ALTER TABLE personas ADD COLUMN edad INTEGER;

Ejercicio

En este ejercicio, vamos a modificar la tabla productos para agregar la columna descripcion de
tipo TEXT.

Actualmente la tabla productos tiene las siguientes columnas:

TIPO

COLUMNA DE

DATO

nombre TEXT

precio REAL

Luego de crearla deberás insertar los siguientes registros:

NOMBRE PRECIO DESCRIPCION

Camisa 1000.00 Camisa de

manga corta

Pantalon 2000.00 Pantalon de

mezclilla

Camisa 1000.00 Camisa de

XL manga larga
Importante: para poder ingresar las queries requeridas, recuerda añadir punto y coma al final de
cada una.
Restricciones
• Introducción a restricciones
• Agregar una restricción a una tabla existente
• Borrar una restricción
• Restricción unique
• Restricciones con check
• Clave unica
• Autoincremental
• Autoincremental parte 2
• Primary key y texto
• Clave Foránea
• Pk y fks

Introducción a restricciones

Al crear tablas, podemos añadir restricciones (En inglés constraints) a las columnas para evitar que
se ingresen datos que no cumplan ciertas condiciones.

En este ejercicio, aprenderemos a usar la restricción NOT NULL, que impide valores nulos en una
columna. Por ejemplo, al crear una tabla de personas con nombre y apellido, podemos hacer que el
nombre sea obligatorio (no nulo) y el apellido opcional.

Para lograrlo crearemos la tabla de la siguiente forma:

CREATE TABLE personas (


nombre TEXT NOT NULL,
apellido TEXT
)

Para agregar una restricción simplemente debemos especificarla junto con la columna.

Para indicar las restricciones utilizaremos una columna adicional llamada Constraints en nuestros
diagramas. Ejemplo con la tabla personas:

DATA
COLUMN CONSTRAINTS
TYPE

nombre TEXT NOT NULL

apellido TEXT
Pongamos a prueba nuestra restricción con distintas consultas y observemos los resultados.

QUERY RESULTADO

INSERT Funciona

INTO

personas

(nombre,

apellido)

VALUES

('Juan',

'Perez');

INSERT No funciona,

INTO error: NOT NULL

personas constraint failed:

(nombre, [Link]

apellido)

VALUES

(NULL,

'Perez');

INSERT No funciona,

INTO error: NOT NULL

personas constraint failed:

(apellido) [Link]

VALUES

('Perez');

En resumen: En esta tabla que acabamos de crear podremos hacer un insert de una persona con
nombre y sin apellido pero no podremos ingresar una persona sin nombre.

Ejercicio

Crea una nueva tabla llamada empleados con las siguientes columnas:
TIPO

COLUMNA DE RESTRICCIONES

DATO

nombre TEXT NOT NULL

apellido TEXT

Luego ingresa los siguientes datos

• nombre: Pedro
• apellido: Perez

Puedes probar un insert sin un nombre para observar el error.

Agregar una restricción a una tabla existente

En SQL también es posible agregar la restricción a una tabla ya creada. Supongamos que tenemos la
siguiente tabla:

personas

TIPO

COLUMNA DE RESTRICCIONES

DATO

nombre TEXT

apellido TEXT

y queremos agregarle la restricción NOT NULL a la columna nombre. El problema es que en SQLite no
podemos agregar restricciones directamente a una tabla existente.

En otros motores de bases de datos como PostgreSQL o MySQL si es posible agregar restricciones a
tablas existentes.

Lo que tenemos que hacer es.


1. Crear una nueva tabla con la restricción.
2. Copiar los datos de la tabla original a la nueva tabla.
3. Borrar la tabla original.
4. Renombrar la nueva tabla con el nombre de la tabla original.
5.

/* 1. Creamos la nueva tabla con la restricción */


CREATE TABLE personas2 (
nombre TEXT NOT NULL,
apellido TEXT
);

2.

/* 2. Copiamos los datos de la tabla original a la nueva tabla */


INSERT INTO personas2 (nombre, apellido)
SELECT nombre, apellido
FROM personas;

/* 3. Borramos la tabla original */


DROP TABLE personas;

/* 4. Renombramos la nueva tabla con el nombre de la tabla original */


ALTER TABLE personas2 RENAME TO personas;

Ejercicio

Se tiene una tabla llamada patentes con las siguientes columnas:

TIPO

COLUMNA DE RESTRICCIONES

DATO

patente TEXT

Con la siguiente información:


PATENTE

ABC123

ABC124

Se pide agregar una restricción de not null a la columna patente.

Borrar una restricción

En SQLite borrar una restricción tiene las mismas limitaciones que modificarla y el procedimiento es
similar.

1. Crear una nueva tabla sin la restriccion.


2. Copiar los datos de la tabla original a la nueva tabla.
3. Borrar la tabla original.
4. Renombrar la nueva tabla con el nombre de la tabla original.

Para el ejemplo tendremos una tabla llamada temperaturas con la siguiente estructura:

TIPO

COLUMNA DE RESTRICCIONES

DATO

temperatura REAL NOT NULL

1.

/* 1. Creamos la nueva tabla sin la restricción */


CREATE TABLE temperaturas2 (
temperatura REAL
);

2.

/* 2. Copiamos los datos de la tabla original a la nueva tabla */


INSERT INTO temperaturas2 (temperatura)
SELECT temperatura
FROM temperaturas;

/* 3. Borramos la tabla original */


DROP TABLE temperaturas;

/* 4. Renombramos la nueva tabla con el nombre de la tabla original */


ALTER TABLE temperaturas2 RENAME TO temperaturas;

Ejercicio

Se tiene una tabla llamada personas con las siguientes columnas:

TIPO DE
COLUMNA RESTRICCIONES
DATO

nombre TEXT NOT NULL

apellido TEXT NOT NULL

Edad INTEGER

Se pide borrar la restricción de not null de las columnas nombre y apellido.

Restricción unique

La restricción de unicidad, o UNIQUE, nos permite evitar duplicados en una columna específica. Un
caso muy popular de esta restricción es evitar personas con el mismo correo electrónico.

Para agregar una restricción de UNIQUE simplemente tenemos que especificar el constraint justo
después de especificar el tipo de dato. Por ejemplo:

CREATE TABLE personas (


nombre text
apellido text
email text UNIQUE
)

Pongamos a prueba nuestra restricción con distintas consultas y observemos los resultados.
QUERY FUNCIONA

INSERT INTO personas Funciona

(nombre, apellido, email)

VALUES ('Juan', 'Perez',

'[Link]@[Link]');

INSERT INTO personas No funciona,

(nombre, apellido, email) error: UNIQUE

VALUES ('María', 'García', constraint

'[Link]@[Link]'); failed:

[Link]

INSERT INTO personas Funciona

(nombre, apellido, email)

VALUES ('Pedro', 'Perez',

'[Link]@[Link]');

En resumen: En esta tabla que acabamos de crear, el correo electrónico de cada persona debe ser
único; no podremos ingresar dos personas con el mismo correo electrónico.

Ejercicio

En este ejercicio, vamos a crear una tabla llamada productos con las siguientes columnas:

TIPO

COLUMNA DE RESTRICCIONES

DATO

nombre TEXT NOT NULL

codigo TEXT UNIQUE

precio REAL NOT NULL

Luego, vamos a insertar los siguientes registros:


NOMBRE PRECIO CODIGO

Camisa 1000.00 CAM-

001

Pantalon 2000.00 PAN-

001

Camisa 1000.00 CAM-

XL 002

Pista: para poder ingresar las dos queries requeridas, recuerda añadir punto y coma al final de cada
una.

Si quieres probar un insert para observar el error puedes hacerlo con el código CAM-001.

Restricciones con check

Hasta el momento hemos aprendido dos tipos de restricciones:

• Not Null, que permite especificar que un valor no puede ser nulo.
• Unique, que permite especificar que un valor debe ser unico.

En este ejercicio aprenderemos a utilizar la restricción CHECK, que nos permite establecer una
condición que los valores de una columna deben cumplir.

Para agregar una restricción de CHECK simplemente tenemos que especificarlo en la definición de la
columna, proporcionando la condición que debe cumplir el valor de la columna. Por ejemplo:

CREATE TABLE empleados (


nombre TEXT,
salario REAL CHECK (salario > 0)
);

QUERY FUNCIONA

INSERT Funciona

INTO

empleados
QUERY FUNCIONA

(nombre,

salario)

VALUES

('Juan',

3000);

INSERT No funciona,

INTO error: CHECK

empleados constraint

(nombre, failed:

salario) empleados

VALUES

('Ana', -

3000);

INSERT Funciona

INTO

empleados

(nombre,

salario)

VALUES

('Luis',

3000);

Ejercicio

En este ejercicio, vamos a crear una tabla llamada productos con las siguientes columnas:

TIPO DE
COLUMNA RESTRICCIONES
DATO

nombre TEXT NOT NULL


TIPO DE
COLUMNA RESTRICCIONES
DATO

precio REAL NOT NULL

stock INTEGER CHECK (stock >=

0)

Luego, vamos a insertar los siguientes registros:

NOMBRE PRECIO STOCK

Camisa 1000.00 10

Pantalon 2000.00 5

Camisa 1000.00 3

XL

Pista: para poder ingresar las dos queries requeridas, recuerda añadir punto y coma al final de cada
una.

Si quieres probar un insert para observar el error puedes hacerlo ingresando un stock negativo.

Clave unica

La clave primaria, o en inglés PRIMARY KEY nos ayuda a identificar de forma única cada registro en
una tabla. Esto lo hace impidiendo que se ingresen valores duplicados o nulos en la columna que es
clave primaria.

MONTO FECHA

ID DE LA DE

BOLETA EMISION

1 10.000 2021-10-

01
MONTO FECHA

ID DE LA DE

BOLETA EMISION

2 12.000 2021-10-

02

3 16.000 2021-10-

03

Si dijeramos que el campo id es la clave primaria, entonces cada registro de la tabla tiene un valor
único para el campo id. Este id no podría ser nulo, ni podría ser el mismo que el de otro registro.

Cuando tenemos una clave primaria, tenemos certeza de que podemos buscar cualquier registro en la
base de datos y luego modificarlo o eliminarlo, y no habrá ningún otro registro modificado o
eliminado que el seleccionado. Esto nos permite cuidar la integridad de los datos.

CREATE TABLE boletas (


id INT PRIMARY KEY,
monto_de_la_boleta REAL,
fecha_de_emision DATE
);

Ejercicio

Crea una tabla llamada posts con las siguientes columnas:

COLUMN DATA
CONSTRAINTS
NAME TYPE

Id INT PRIMARY KEY

title TEXT

content TEXT

inserta los siguientes registros:


ID TITLE CONTENT

1 Introduccion ¡Bienvenido al

mundo de la

programacion!

2 Primeros Sumergete en

Pasos los conceptos

basicos de la

programacion.

3 Temas Explora

Avanzados conceptos y

tecnicas

avanzadas en

programacion.

Pista: para poder ingresar las dos queries requeridas, recuerda añadir punto y coma al final de cada
una.

Si quieres poner a prueba la clave primaria puedes intentar insertar un id nulo o un id que ya hayas
ingresado.

Autoincremental

Los campos autoincrementales nos permiten generar un valor único de forma automática para cada
registro que insertemos en una tabla.

De esta forma si tenemos una tabla como la siguiente:

MONTO FECHA

ID DE LA DE

BOLETA EMISION

1 10.000 2021-10-

01
MONTO FECHA

ID DE LA DE

BOLETA EMISION

2 12.000 2021-10-

02

3 16.000 2021-10-

03

Podemos ingresar un nuevo registro sin tener que especificar el valor del campo id, y la base de datos
se encargará de generar un valor único para ese campo. Para lograrlo simplemente no incluimos el
campo id en la query.

Ejemplo:

INSERT INTO boletas (monto_de_la_boleta, fecha_de_emision) VALUES (20.000, '2021-10-04');

Luego si seleccionamos todos los registros de la tabla, veremos que el campo id del nuevo registro
tiene un valor único y mayor al de los registros anteriores.

MONTO FECHA

ID DE LA DE

BOLETA EMISION

1 10.000 2021-10-

01

2 12.000 2021-10-

02

3 16.000 2021-10-

03

4 20.000 2021-10-

04
Un campo definido como INTEGER (o INT) + PRIMARY KEY se convierte automáticamente en un
campo autoincremental en SQLITE

Ejercicio

Crea una tabla llamada usuarios con las siguientes columnas:

TIPO DE
COLUMNA RESTRICCIONES
DATO

Id INTEGER PRIMARY KEY

nombre TEXT NOT NULL

fecha_creacion DATE

Luego, vamos a insertar los siguientes registros:

NOMBRE FECHA_CREACION

Ana 2024-01-01

Gonzalo 2024-01-02

Juan 2024-01-03

María 2024-01-04

Pista: No ingreses los ids, la base de datos se encargará de generarlos automáticamente.

Autoincremental parte 2

Cuando tenemos campos autoincrementales en una tabla e insertamos un nuevo registro con un valor
mas alto que el de la secuencia actual, la base de datos se encarga de actualizar la secuencia para que
el siguiente registro tenga un valor mayor al del registro que acabamos de insertar.

Por ejemplo, si tenemos una tabla con los siguientes registros:


ID NOMBRE

1 Ana

2 Gonzalo

3 Juan

Luego insertamos un nuevo registro con un id mayor al de la secuencia actual:

INSERT INTO usuarios (id, nombre) VALUES (10, 'María');

Y luego insertamos un nuevo registro sin especificar el id:

INSERT INTO usuarios (nombre) VALUES ('Pedro');

Obtendremos la siguiente tabla:

ID NOMBRE

1 Ana

2 Gonzalo

3 Juan

10 María

11 Pedro

Ejercicio

Crea una tabla llamada transacciones con las siguientes columnas:

TIPO DE
COLUMNA RESTRICCIONES
DATO

id INTEGER PRIMARY KEY


TIPO DE
COLUMNA RESTRICCIONES
DATO

monto REAL NOT NULL

fecha DATE

Luego, vamos a insertar los siguientes registros:

ID MONTO FECHA

1000.00 2024-

01-01

2000.00 2024-

01-02

3000.00 2024-

01-03

10 4000.00 2024-

01-04

5000.00 2024-

01-05

Importante: Al único campo que vamos a agregar un id de forma personalizada va a ser al cuarto
registro, esto con el fin de observar la relación que se genera entre el campo incremental y como
aumenta según el valor que insertemos.

Primary key y texto

La clave primaria no está limitada exclusivamente a valores numéricos; también se pueden utilizar
datos de texto. Tomemos, por ejemplo, una tabla de personas, donde podríamos emplear la dirección
de correo electrónico como clave primaria, ya que cada individuo posee una dirección de correo única.
En SQLite, los campos que son de tipo INTEGER y se designan como PRIMARY KEY no pueden
contener valores nulos. No obstante, a diferencia de otros sistemas de gestión de bases de datos como
MySQL o PostgreSQL, cuando se utiliza PRIMARY KEY con tipos de datos como texto u otros, se
permite que el valor sea nulo.

Por lo tanto, si queremos que un campo sea tanto clave primaria como no nulo, debemos especificarlo
mediante la combinación de PRIMARY KEY y NOT NULL.

Ejemplo:

CREATE TABLE posts (


title text primary key not null
)

Ejercicio

Crea una tabla llamada personas con las siguientes columnas:

COLUMN DATA
CONSTRAINTS
NAME TYPE

email TEXT PRIMARY KEY

NOT NULL

nombre TEXT

apellido TEXT

Inserta los siguientes registros:

EMAIL NOMBRE APELLIDO

example1@[Link] John Doe

example2@[Link] Jane Smith

example3@[Link] Mike Johnson


Puedes probar usando el mismo email en dos registros diferentes para que observes como se
comporta la restricción.

Clave Foránea

En este ejercicio introduciremos el concepto de clave foránea o foreign key.

La clave foránea es una restricción que se le puede agregar a una columna de una tabla para indicar
que los valores que se inserten en esa columna deben existir en otra tabla.

Por ejemplo, si tenemos una tabla de personas y una tabla de autos, podríamos agregar una
columna persona_id a la tabla de autos, y agregarle la restricción de clave foránea para indicar que el
valor de esa columna debe existir en la tabla de personas. De esta forma nos aseguramos que no se
inserten autos de personas que no existen o que se borren personas que tienen autos asignado a su
nombre dejando autos sin dueño.

personas

TIPO DE
COLUMNA RESTRICCIONES
DATO

id INTEGER PRIMARY KEY

nombre TEXT

apellido TEXT

autos

TIPO DE
COLUMNA RESTRICCIONES
DATO

id INTEGER PRIMARY KEY

patente TEXT
TIPO DE
COLUMNA RESTRICCIONES
DATO

persona_id INTEGER FOREIGN KEY

(persona_id)

REFERENCES

personas(id)

Con los siguientes datos:

personas

ID NOMBRE APELLIDO

1 John Doe

2 Jane Smith

autos

ID PATENTE PERSONA_ID

1 ABC123 1

2 DEF456 2

Podemos ver que el auto con patente ABC123 pertenece a la persona con id 1, y el auto con patente
DEF456 pertenece a la persona con id 2. Adicionalmente la clave foránea nos asegura que no podamos
borrar la persona con id 1 mientras exista un auto con persona_id 1. De la misma forma, no podremos
insertar un auto con persona_id 3, ya que no existe una persona con id 3.

Agregando la clave foránea

Para agregar una clave foránea a una tabla existente, debemos especificar la restricción FOREIGN
KEY seguida del nombre de la columna y la tabla a la que hace referencia, y finalmente la columna de
la tabla a la que hace referencia.
La sintaxis es la siguiente:

ALTER TABLE nombre_tabla ADD COLUMN nombre_columna tipo_dato REFERENCES


nombre_tabla_referencia(nombre_columna_referencia);

Se ve complicado, pero veamos un ejemplo con las tablas personas y autos.

ALTER TABLE autos ADD COLUMN persona_id INTEGER REFERENCES personas(id);

La clave foránea debe hacer referencia a una columna que tenga una restricción de clave primaria

Ejercicio

Se tienen las tablas articulos y categorias con la siguiente estructura:

articulos

TIPO DE
COLUMNA RESTRICCIONES
DATO

id INTEGER PRIMARY KEY

nombre TEXT

precio REAL

categorias

TIPO DE
COLUMNA RESTRICCIONES
DATO

id INTEGER PRIMARY KEY

nombre TEXT

Se pide agregar una clave foránea a la tabla articulos para que la columna categoria_id haga
referencia a la columna id de la tabla categorias.
Pk y fks

Los conceptos de clave primaria y clave foránea son fundamentales para el diseño de bases de datos y
los ocuparemos tan frecuentemente que los abreviare como PK Primary Key y FK Foreign
Key respectivamente.

Con la clave primaria podemos identificar de forma única cada registro de una tabla, y con la clave
foránea podemos relacionar dos tablas entre si y evitar que existan registros que no tengan una
relación válida.

PK = Primary Key
FK = Foreign Key

A partir de ahora utilizaremos frecuentemente estas abreviaciones. También veremos que casi todas
las tablas tendrán una clave primaria (PK). Esto se debe a que la clave primaria nos ayuda a
mantener la integridad de los datos, y nos permite identificar de forma única cada registro de
una tabla.

Una práctica común en el diseño de bases de datos es utilizar una columna llamada id como clave
primaria. Esta columna es de tipo INTEGER y tiene la restricción PRIMARY KEY. Además, es común
que esta columna sea autoincremental, es decir, que el valor de la columna se incremente
automáticamente cada vez que se inserta un nuevo registro. Pero esto no es una obligación. Definir
una clave primaria es una decisión de diseño, y en algunos casos puede ser más conveniente utilizar
otra columna como clave primaria.

Ejercicio

Se tiene la tabla transacciones y la tabla usuarios con la siguiente estructuras:

transacciones

TIPO DE
COLUMNA RESTRICCIONES
DATO

id INTEGER PRIMARY KEY

monto REAL
TIPO DE
COLUMNA RESTRICCIONES
DATO

usuario_id INTEGER FOREIGN KEY

(usuario_id)

REFERENCES

usuarios(id)

usuarios

TIPO DE
COLUMNA RESTRICCIONES
DATO

id INTEGER PRIMARY KEY

nombre TEXT

apellido TEXT

Con los siguientes datos:

transacciones

ID MONTO USUARIO_ID

1 100 1

2 200 2

3 300 1

usuarios

ID NOMBRE APELLIDO

1 John Doe
ID NOMBRE APELLIDO

2 Jane Smith

1. En este ejercicio primero intentaremos crear una transacción con un usuario que no existe
para observar el error.
2. Intentaremos borrar un usuario que tiene transacciones asociadas para observar el error.
3. Luego eliminaremos nuestras consultas anteriores y modificaremos la tabla de transacciones
para eliminar la clave foránea. Solo se debe eliminar la clave foránea, no la columna.

TIP: Esto requiere crear una tabla temporal, copiar los datos de la tabla original a la tabla temporal,
borrar la tabla original, y renombrar la tabla temporal con el nombre de la tabla original.

4. Finalmente se deben asociar las transacciones al usuario con id 3. El cual no existe y la idea es
demostrar que sin la FK podemos insertar transacciones sin usuarios asociados.

Los puntos 1 y 2 son para observar que sucede. Para lograr la respuesta correcta tienes que realizar
los puntos 3 y 4 en el editor.
Consultas en múltiples tablas
• Múltiples tablas
• Múltiples tablas: utilizando atributo del mismo nombre
• Seleccionando algunos atributos
• Join sin resultados
• Orden de cláusulas
• Agrupar por múltiples columnas

Múltiples tablas

Cuando trabajamos con bases de datos relacionales, surge con frecuencia la necesidad de combinar
datos de varias tablas.

Veamos un ejemplo:

Tabla usuarios

EMAIL1 NOMBRE EDAD

[Link]@[Link] Juan 30

Perez

[Link]@[Link] Maria 25

Gonzalez

[Link]@[Link] John Doe 40

[Link]@[Link] Test User 22

Tabla datos_contacto

EMAIL2 TELÉFONO

[Link]@[Link] 555-123-

4567

[Link]@[Link] 444-987-

6543
EMAIL2 TELÉFONO

[Link]@[Link] 777-555-

8888

[Link]@[Link] 111-222-

3333

[Link]@[Link] 999-888-

7777

[Link]@[Link] 333-111-

0000

Si nos pidieran obtener todos los email, nombre edad y teléfono de todos los usuarios tendríamos que
unir estas tablas. Para esto existe la claúsula JOIN.

En nuestro ejemplo, podemos unir las tablas con la siguiente consulta: SELECT * FROM usuarios JOIN
datos_contacto ON email1 = email2

Para unir tablas tenemos que establecer un punto de unión. En este caso lo que tienen en común
ambas tablas es el email.

Ejercicio

Utilizando lo aprendido selecciona todos los usuarios junto a sus notas. Observa los resultados antes
de avanzar.

tabla usuarios

EMAIL1 NOMBRE EDAD

[Link]@[Link] Juan 30

Perez
EMAIL1 NOMBRE EDAD

[Link]@[Link] Maria 25

Gonzalez

[Link]@[Link] John Doe 40

[Link]@[Link] Test User 22

tabla notas

EMAIL2 NOTAS

[Link]@[Link] 90

[Link]@[Link] 100

[Link]@[Link] 80

[Link]@[Link] 0

[Link]@[Link] 100

[Link]@[Link] 100

Múltiples tablas: utilizando atributo del mismo nombre

En el ejercicio anterior teníamos los atributos email1 y email2. En este ejercicio aprenderemos que es
posible que dos atributos distintos compartan el mismo nombre, siempre y cuando estén ubicados en
diferentes tablas.

Para ejemplificar esto utilizaremos el nombre email en ambas tablas.

Tabla usuarios
EMAIL NOMBRE EDAD

[Link]@[Link] Juan 30

Perez

[Link]@[Link] Maria 25

Gonzalez

[Link]@[Link] John Doe 40

[Link]@[Link] Test User 22

Tabla datos_contacto

EMAIL TELÉFONO

[Link]@[Link] 555-123-

4567

[Link]@[Link] 444-987-

6543

[Link]@[Link] 777-555-

8888

[Link]@[Link] 111-222-

3333

[Link]@[Link] 999-888-

7777

[Link]@[Link] 333-111-

0000

Uniremos los datos de ambas tablas utilizando JOIN, pero en esta ocasión, cuando especifiquemos el
punto de unión, utilizaremos el nombre de la tabla junto con el del atributo:
SELECT * FROM usuarios JOIN datos_contacto ON [Link] = datos_contacto.email

Al hacerlo de esta forma, SQL puede entender a cual email nos referimos en cada situación.

Ejercicio

Utilizando lo aprendido, selecciona todos los usuarios junto a sus notas. Recuerda que para especificar
la clave de unión debes utilizar el nombre de la tabla para evitar ambiguedad. Observa los resultados
antes de avanzar.

Tabla usuarios

EMAIL NOMBRE EDAD

[Link]@[Link] Juan 30

Perez

[Link]@[Link] Maria 25

Gonzalez

[Link]@[Link] John Doe 40

[Link]@[Link] Test User 22

Tabla notas

EMAIL NOTAS

[Link]@[Link] 90

[Link]@[Link] 100

[Link]@[Link] 80

[Link]@[Link] 0

[Link]@[Link] 100
EMAIL NOTAS

[Link]@[Link] 100

Seleccionando algunos atributos

Si tenemos dos tablas como la de los ejercicios anteriores,

Tabla usuarios

EMAIL NOMBRE EDAD

[Link]@[Link] Juan 30

Perez

[Link]@[Link] Maria 25

Gonzalez

[Link]@[Link] John Doe 40

[Link]@[Link] Test User 22

Tabla datos_contacto

EMAIL TELÉFONO

[Link]@[Link] 555-123-

4567

[Link]@[Link] 444-987-

6543

[Link]@[Link] 777-555-

8888
EMAIL TELÉFONO

[Link]@[Link] 111-222-

3333

[Link]@[Link] 999-888-

7777

[Link]@[Link] 333-111-

0000

puede ser que al seleccionar los datos no deseemos mostrar los emails dos veces. Para esto, en lugar
de utilizar SELECT * utilizaremos

SELECT usuarios.*, datos_contacto.telefono FROM usuarios JOIN datos_contacto ON [Link] =

datos_contacto.email

De esta forma seleccionamos todo lo de la tabla usuarios y sólo los teléfonos de la tabla
datos_contacto.

Ejercicio

Dada las siguientes tablas:

usuarios

EMAIL NOMBRE EDAD

[Link]@[Link] Juan 30

Perez

[Link]@[Link] Maria 25

Gonzalez

[Link]@[Link] John Doe 40

[Link]@[Link] Test User 22


notas

EMAIL NOTAS

[Link]@[Link] 90

[Link]@[Link] 100

[Link]@[Link] 80

[Link]@[Link] 0

[Link]@[Link] 100

[Link]@[Link] 100

Selecciona de la tabla usuarios el email, nombre y edad y de la tabla notas sólo las notas. Une los
registros de ambas tablas utilizando el email.

Join sin resultados

¿Qué sucedería si los emails presentes en una tabla no se encuentran en la otra tabla al momento de
unir los datos?

tabla usuarios

EMAIL NOMBRE EDAD

[Link]@[Link] Juan 30
Pérez

[Link]@[Link] Maria 25
González

[Link]@[Link] John Doe 40

[Link]@[Link] Test User 22

tabla datos_contacto
EMAIL TELÉFONO

[Link]@[Link] 555-123-
4567

[Link]@[Link] 444-987-
6543

[Link]@[Link] 777-555-
8888

La respuesta es bien sencilla: si no hay ningún dato común entre ambas tablas, no obtendremos
resultados.

Utilizando lo aprendido previamente, selecciona todos los registros de la unión de las


tablas usuarios y datos_contacto. Observa el resultado.

Orden de cláusulas

Cuando queremos utilizar joins con las otras claúsulas que hemos aprendido, tenemos que considerar
el orden de estas.

En la siguiente tabla se muestra el orden que debemos seguir:

SE LEE
COMANDO
COMO:

SELECT Selecciona

estos

datos.

FROM De esta

tabla.

JOIN Unelos con

esta tabla.
SE LEE
COMANDO
COMO:

WHERE Filtra los

valores

que

cumplan

tal

condicion.

GROUP BY Agrupa los

resultados

por este

criterio.

HAVING Filtra por

estos

criterios

agrupados.

ORDER BY Ordena los

resultados

por este

otro

criterio.

LIMIT Limita los

resultados

a esta

cantidad.

Ejercicio

Dadas las siguientes tablas, selecciona toda la información del usuario [Link]@[Link]

Tabla usuarios
EMAIL NOMBRE EDAD

[Link]@[Link] Juan 30

Perez

[Link]@[Link] Maria 25

Gonzalez

[Link]@[Link] John Doe 40

[Link]@[Link] Test User 22

Tabla notas

EMAIL NOTAS

[Link]@[Link] 90

[Link]@[Link] 100

[Link]@[Link] 80

[Link]@[Link] 0

[Link]@[Link] 100

[Link]@[Link] 100

Pista: debes seleccionar todo, unir las tablas y filtrar por el email respectivo.

Agrupar por múltiples columnas

Al igual que en las consultas sobre una tabla, podemos utilizar funciones de agregación y agrupado en
consultas sobre múltiples tablas.

Supongamos que tenemos dos tablas: una tabla llamada Clientes que almacena información sobre los
clientes y otra tabla llamada Pedidos que almacena información sobre los pedidos realizados por esos
clientes. Queremos realizar una consulta que nos muestre la cantidad total de pedidos realizados por
cada cliente. Para esto, ejecutaremos una consulta que utilice la cláusula GROUP BY para agrupar los
pedidos por cliente y contaremos la cantidad total de pedidos para cada cliente.

SELECT [Link] AS NombreCliente, COUNT([Link]) AS TotalPedidos


FROM Clientes c
JOIN Pedidos p ON [Link] = [Link]
GROUP BY [Link];

Ejercicio

Tenemos dos tablas: Productos y Ventas. Realiza una consulta que nos muestre el producto más
vendido y la cantidad total de unidades vendidas de ese producto. La columna que muestre el total de
unidades vendidas debe llamarse "total_vendido"

Pista: recuerda el uso de order by y limit

Tabla Productos

NOMBRE PRECIO PRODUCTOID

Producto 10 1

Producto 15 2

Producto 20 3

Tabla Ventas

CANTIDAD FECHAVENTA PRODUCTOID

20 '2023-09-01' 1

15 '2023-09-02' 1

10 '2023-09-03' 2
CANTIDAD FECHAVENTA PRODUCTOID

25 '2023-09-04' 3

30 '2023-09-05' 3
Tipos de join
• Inner Join
• Left Join
• Right Join
• Left Join y Right Join

Inner Join

En SQL existen varias forma de unir tablas. Cuando no se especifica el tipo de join se utiliza INNER JOIN,
es decir,

SELECT * FROM usuarios JOIN datos_contacto ON [Link] = datos_contacto.email

es lo mismo que

SELECT * FROM usuarios INNER JOIN datos_contacto ON [Link] = datos_contacto.email

En una operación de Inner Join se combinan los registros de ambas tablas siempre y cuando la clave
en común esté en ambas tablas. Si en una de las tablas no está la clave ese registro no aparecerá en el
resutlado final.

Ejercicio

Une las tablas utilizando JOIN (o INNER JOIN) para obtener todos los registros de ambas tablas. Mira
las tablas antes de realizar el ejercicio y pon especial atención en Francisco quien no tiene ninguna
nota en el sistema.

Tabla usuarios

EMAIL NOMBRE EDAD

[Link]@[Link] Juan 30

Perez

[Link]@[Link] Maria 25

Gonzalez

[Link]@[Link] John Doe 40


EMAIL NOMBRE EDAD

francisco@[Link] Test User 22

Tabla notas

EMAIL NOTAS

[Link] Join 90

Con los siguientes datos, al hacer un INNER JOIN no


obtendremos dentro de los resultados a Franscisco, lo
cual podría ser un gran error si estuvieramos haciendo
un reporte de todos los estudiantes.

Tabla usuarios

EMAIL NOMBRE EDAD

[Link]@[Link] Juan 30

Perez

[Link]@[Link] Maria 25

Gonzalez

[Link]@[Link] John Doe 40

francisco@[Link] Test User 22

Tabla notas

EMAIL NOTAS

[Link]@[Link] 90

[Link]@[Link] 100
EMAIL NOTAS

[Link]@[Link] 80

[Link]@[Link] 100

[Link]@[Link] 100

Existe un tipo especial de JOIN que nos puede traer


todos los usuarios junto a sus notas. Con LEFT
JOIN podemos obtener todos los registros de los datos

de usuarios y sus correspondientes notas, incluso si


algunos usuarios no tienen notas asociadas.

En un LEFT JOIN, todas las filas de la tabla izquierda (en


este caso, la tabla de usuarios) aparecerán en el
resultado, y si un usuario no tiene una coincidencia en la
tabla derecha (la tabla de notas), los campos
correspondientes en la tabla de notas se llenarán con
valores NULL.

La Sintaxis para utilizar LEFT JOIN es similar a INNER


JOIN. SELECT * FROM tabla1 LEFT JOIN tabla2 ON
[Link] = [Link]

Ejercicio

Se tiene una tabla de empleados y otra de


departamentos. Utilizando lo aprendido selecciona a
todos los empleados junto a sus departamentos
correspondientes, incluyendo a los empleados que aún
no han sido asignados a ningún departamento. En
ambas tablas existe la columna email.

@[Link]
EMAIL NOTAS

[Link]@[Link] 100

[Link]@[Link] 80

[Link]@[Link] 100

[Link]@[Link] 100

Left Join

Con los siguientes datos, al hacer un INNER JOIN no obtendremos dentro de los resultados a
Franscisco, lo cual podría ser un gran error si estuvieramos haciendo un reporte de todos los
estudiantes.

Tabla usuarios

EMAIL NOMBRE EDAD

[Link]@[Link] Juan 30

Perez

[Link]@[Link] Maria 25

Gonzalez

[Link]@[Link] John Doe 40

francisco@[Link] Test User 22

Tabla notas

EMAIL NOTAS

[Link]@[Link] 90

[Link]@[Link] 100
EMAIL NOTAS

[Link]@[Link] 80

[Link]@[Link] 100

[Link]@[Link] 100

Existe un tipo especial de JOIN que nos puede traer todos los usuarios junto a sus notas. Con LEFT
JOIN podemos obtener todos los registros de los datos de usuarios y sus correspondientes notas,

incluso si algunos usuarios no tienen notas asociadas.

En un LEFT JOIN, todas las filas de la tabla izquierda (en este caso, la tabla de usuarios) aparecerán en
el resultado, y si un usuario no tiene una coincidencia en la tabla derecha (la tabla de notas), los
campos correspondientes en la tabla de notas se llenarán con valores NULL.

La Sintaxis para utilizar LEFT JOIN es similar a INNER JOIN. SELECT * FROM tabla1 LEFT JOIN tabla2 ON
[Link] = [Link]

Ejercicio

Se tiene una tabla de empleados y otra de departamentos. Utilizando lo aprendido selecciona a todos
los empleados junto a sus departamentos correspondientes, incluyendo a los empleados que aún no
han sido asignados a ningún departamento. En ambas tablas existe la columna email.

Right Join

Mientras que el LEFT JOIN devuelve todas las filas de la tabla izquierda y las coincidencias
correspondientes de la tabla derecha (rellenando con NULL si no hay coincidencia), el RIGHT JOIN hace
lo contrario: devuelve todas las filas de la tabla derecha y las coincidencias correspondientes de la
tabla izquierda.

Utilizando las tablas previas de "usuarios" y "notas", si quieres obtener todos los registros de las notas
y los correspondientes usuarios, incluso si hay notas que no tienen usuarios asociados (lo cual sería
atípico en este contexto, pero sirve para el ejemplo), puedes utilizar RIGHT JOIN:

SELECT * FROM tabla1 RIGHT JOIN tabla2 ON [Link] = [Link]


Tabla usuarios

EMAIL NOMBRE EDAD

[Link]@[Link] Juan 30

Perez

[Link]@[Link] Maria 25

Gonzalez

francisco@[Link] Test User 22

Tabla notas

EMAIL NOTAS

[Link]@[Link] 90

[Link]@[Link] 100

[Link]@[Link] 100

[Link]@[Link] 100

emilio@[Link] 90

En este ejemplo puntual emilio@[Link] tiene notas pero no tenemos su registro en la tabla de
usuarios. Utilizando RIGHT JOIN podemos mostrar su información.

Ejercicio

Dadas las tablas empleados y departamentos, se pide todos los registros de los departamentos de
una oficina y sus correspondientes empleados, incluso si hay departamentos sin empleados asociados.
En ambas tablas existe la columna email.

Left Join y Right Join


Utilizar LEFT JOIN o RIGHT JOIN depende simplemente de que tabla quieres nombrar primero.

SELECT *
FROM tabla1
LEFT JOIN tabla2 ON [Link] = [Link]

Es prácticamente lo mismo que:

SELECT *
FROM tabla2
RIGHT JOIN tabla1 on [Link] = [Link]

LEFT JOIN y RIGHT JOIN son un reflejo el uno del otro. Sin embargo, existe una pequeña diferencia
cuando los utilizamos en conjunto con SELECT *, dado que los atributos de los primera tabla se
mostrarán primero.

Por ejemplo, si tenemos las siguientes tablas:

Tabla usuarios

EMAIL NOMBRE EDAD

[Link]@[Link] Juan 30

Perez

[Link]@[Link] Maria 25

Gonzalez

francisco@[Link] Test User 22

Tabla notas

EMAIL NOTAS

[Link]@[Link] 90

[Link]@[Link] 100

[Link]@[Link] 100
EMAIL NOTAS

[Link]@[Link] 100

emilio@[Link] 90

Con SELECT * FROM usuarios left join notas on [Link] = [Link]; obtendríamos lo siguiente:

EMAIL NOMBRE EDAD EMAIL NOTAS

[Link]@[Link] Juan 30 [Link]@[Link] 90

Perez

[Link]@[Link] Juan 30 [Link]@[Link] 100

Perez

[Link]@[Link] Maria 25 [Link]@[Link] 100

Gonzalez

[Link]@[Link] Maria 25 [Link]@[Link] 100

Gonzalez

francisco@[Link] Test User 22 NULL NULL

En cambio, con SELECT * FROM Notas RIGHT JOIN Usuarios ON [Link] = [Link]; obtendríamos:

EMAIL NOTAS EMAIL NOMBRE EDAD

[Link]@[Link] 90 [Link]@[Link] Juan 30

Perez

[Link]@[Link] 100 [Link]@[Link] Juan 30

Perez

[Link]@[Link] 100 [Link]@[Link] Maria 25

Gonzalez
EMAIL NOTAS EMAIL NOMBRE EDAD

[Link]@[Link] 100 [Link]@[Link] Maria 25

Gonzalez

NULL NULL francisco@[Link] Test User 22

Para obtener los resultados en el mismo orden simplemente podemos especificar el orden que
queremos.

SELECT usuarios.*, notas.*


FROM Notas
RIGHT JOIN Usuarios ON [Link] = [Link];`

A partir de este ejercicio queda a tu discreción como resolver los problemas, ya sea utilizando LEFT
JOIN o RIGHT JOIN, pero para que las respuestas sean marcadas correctas los atributos deben aparecer

en el orden que las tablas son mencionadas, a menos que se especifique lo contrario.

Ejercicio

Selecciona todos los registros de todos los productos (tabla productos) junto a sus precios (tabla
precios), incluyendo a los productos que no tienen precio asignado. Las tablas se relacionan entre si
por la columna producto_id.

También podría gustarte