Tutorial SQL: Selección y Alias de Columnas
Tutorial SQL: Selección y Alias de Columnas
Seleccionando columnas (7 / 7)
4. Limit (3 / 3)
8. Distinct (0 / 6)
10. Having (0 / 6)
11. Subconsultas (0 / 9)
15. Tablas (0 / 6)
Tutorial
La plataforma SQL interactivo es una plataforma de microlearning diseñada para aprender a utilizar
bases de datos SQL.
• 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:
Por ejemplo si tenemos una tabla llamada usuarios podemos obtener todos los datos de los usuarios
escribiendo select * from usuarios.
Problema
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.
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
Recuerda también que puedes equivocarte y recibir pistas. Si todavía no has probado esta
herramienta, prueba en este ejercicio con:
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:
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.
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:
También, es importante destacar que SQL es un lenguaje insensible a las mayúsculas, es decir,
podemos escribir la misma instrucción como:
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.
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:
Ejercicio
Se tiene una tabla llamada usuarios con las columnas nombre, apellido, email y teléfono. Selecciona
todos los nombres bajo el alias "cliente"
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:
Ejercicio
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:
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
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.
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 (>)
1. select,
2. from
3. where
Se tiene una tabla llamada productos, con las columnas id, nombre, precio y descuento. Selecciona
todos los registros cuyo descuento sea mayor a 10.
Se tiene una tabla llamada productos, con las columnas id, nombre, precio y descuento.
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:
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?
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:
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.
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.
Ejercicio
Selecciona todos los registros de la tabla productos en los que el valor de la columna 'precio' sea
menor o igual a 100.
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:
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
Ejemplo:
Ejercicio
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:
Al comparar un string en una condición WHERE, debemos asegurarnos de encerrar el valor buscado
entre 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'.
Ejercicio
Selecciona todos los productos de la tabla productos que tengan el nombre 'Silla de Oficina'.
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:
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.
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.
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
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:
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.
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:
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.
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.
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'.
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:
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
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:
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'
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'
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
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.
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:
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:
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
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:
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.
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:
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.
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
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:
Ejercicio
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.
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
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
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:
Ejercicio
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
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
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:
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.
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.
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.
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:
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
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.
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:
Esto nos devolverá una lista de nombres junto con su longitud respectiva.
Ejercicio
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í:
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.
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?
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:
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:
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 ||
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.
La función SUBSTR() se utiliza para seleccionar una determinada cantidad de caracteres de un string:
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
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.
También es posible indicar explícitamente a la función que la fecha deseada es la de hoy. Ejemplo:
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 .
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:
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.
Es importante aclarar que cuando no especificamos el signo, se asume que es positivo, esto quiere
decir que
es lo mismo que
Ejercicio
Supongamos que tenemos una tabla llamada ganancias con las columnas "id" (identificador único),
"fecha" (fecha de registro) y "monto" (ganancia del día).
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.
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
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
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:
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
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
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
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.
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:
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
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.
Por ejemplo, se tiene una tabla llamada empleados con los siguientes datos:
Perez
Gonzalez
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.
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.
Ejercicio
Perez
Gonzalez
• MAX()
• MIN()
En este ejercicio introduciremos la función de agregación SUM(). Con esta podemos sumar todos los
elementos de una columna.
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
Perez
Gonzalez
• 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
Perez
Gonzalez
• 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.
Ejercicio
Perez
EMAIL NOMBRE EDAD SUELDO
Gonzalez
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.
Ejercicio
Utilizando la tabla empleados, calcula la suma de sueldos de todas las personas mayores a 27 años.
Perez
Gonzalez
Ejercicio
Utilizando la tabla empleados, calcula el promedio de los sueldos de todas las personas que ganan
más de 50,000
Perez
Gonzalez
Ejercicio
Humanos
NOMBRE APELLIDO SUELDO DEPARTAMENTO
Ejercicio
Humanos
Ejercicio
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
En SQL el keyword DISTINCT nos permite filtrar los resultados repetidos de una consulta.
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
Ejercicio
Prueba en el editor la misma instrucción aprendida para ver cual sería el resultado de la consulta.
Ejercicio
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
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:
Sin embargo, para asegurarnos de obtener años únicos, podemos agregar la cláusula DISTINCT a
nuestra consulta de la siguiente manera:
Ejercicio
Utilizando la misma tabla de ventas previamente utilizada, selecciona todos los meses distintos,
asignándole a la columna el alias "mes_unico".
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)
Humanos
Ejercicio
Crea una consulta que muestre los teléfonos únicos de la tabla. La columna mostrada debe llamarse
telefonos_unicos
Ejercicio
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
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.
3 Carlos IT Desarrollador
4 Ana IT Desarrollador
6 Carmen IT Gerente
7 Jose IT Desarrollador
Luego podemos obtener todas las combinaciones únicas de Departamento y Puesto utilizando la
siguiente consulta:
SELECT DISTINCT departamento, puesto FROM empleados;
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"
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
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.
COLOR
Rojo
Azul
Verde
Amarillo
Naranja
Morado
Rosa
COLOR
Cafe
Gris
Negro
Blanco
Rojo
Azul
Verde
Amarillo
COLOR
Amarillo
Azul
Blanco
Cafe
Gris
Morado
COLOR
Naranja
Negro
Rojo
Rosa
Verde
Ejercicio
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.
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
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
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
Humanos
Agrupar y sumar
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
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
X
PRODUCTO MONTO CATEGORIA
Mesa de 90 Mobiliario
Cafe
Elegante
Bolso de 70 Accesorios
Viaje
Run
Camisa 40 Ropa
Casual
Licuadora 60 Electrodomesticos
Max
Compacto
Libro de 20 Libros
Cocina
Novela 15 Libros
Misterio
Audífonos 50 Electronicos
Plus
Lampara 45 Mobiliario
Moderna
PRODUCTO MONTO CATEGORIA
Bolso de 70 Accesorios
Viaje
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.
Ejercicio
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.
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:
Ejercicio
Mesa de 90 Mobiliario
Cafe
Elegante
Bolso de 70 Accesorios
Viaje
Run
Camisa 40 Ropa
Casual
Licuadora 60 Electrodomesticos
Max
Compacto
Libro de 20 Libros
Cocina
Novela 15 Libros
Misterio
PRODUCTO MONTO CATEGORIA
Audífonos 50 Electronicos
Plus
Lampara 45 Mobiliario
Moderna
Bolso de 70 Accesorios
Viaje
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.
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:
Ejercicio
Mesa de 90 Mobiliario
Cafe
Elegante
Bolso de 70 Accesorios
Viaje
Run
Camisa 40 Ropa
Casual
Licuadora 60 Electrodomesticos
Max
Compacto
Libro de 20 Libros
Cocina
Novela 15 Libros
Misterio
Audífonos 50 Electronicos
Plus
PRODUCTO MONTO CATEGORIA
Lampara 45 Mobiliario
Moderna
Bolso de 70 Accesorios
Viaje
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.
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
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.
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".
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)
De esta manera, puedes lograr la misma agrupación y ordenamiento sin repetir la expresión de la
cláusula SELECT.
Ejercicio
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.
Ejercicio
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.
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.
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
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
Humanos
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
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.
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.
columnas que
se deben
retornar en el
resultado.
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.
registros
retornados
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
Having y order 2
Ejercicio
Supongamos que tienes una tabla de empleados con los siguientes datos:
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.
Humanos
Se nos pide seleccionar a todas las personas que ganan sobre el promedio.
Ejercicio
Utilizando los mismos datos de la tabla empleados, selecciona todos los registros cuyo sueldo sea
menor o igual al promedio.
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
Humanos
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
Humanos
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
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
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')
SELECT *
FROM table
WHERE columna IN (SELECT * from otra_tabla)
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.
Ejercicio
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
Ejercicio
LIBRO_ID NOMBRE
1 La Odisea
2 Cien
Anos de
Soledad
LIBRO_ID NOMBRE
3 El
Principito
4 Moby
Dick
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.
Ejercicio
PACIENTE_ID NOMBRE
1 Roberto
2 Carmen
3 Luisa
PACIENTE_ID NOMBRE
4 Esteban
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
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.
Si queremos saber los promedios, primero tenemos que saber los totales, para eso necesitamos sumar
por empleado.
EMPLEADO_ID TOTAL_VENTA
1 250
2 450
EMPLEADO_ID TOTAL_VENTA
3 650
4 400
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
Ejercicio
Se tiene la tabla goles que registra los goles logrados por cada jugador en distintos partidos.
1 Juan 2
1 Juan 1
2 María 1
2 María 1
JUGADOR_ID NOMBRE GOLES
3 Pedro 3
4 Ana 1
El operador UNION en SQL se utiliza para combinar el resultado de dos o más SELECT en un solo
conjunto de resultados.
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;
APELLIDO
Rodríguez
Sanchez
Castillo
Vargas
Garrido
Mendoza
Ejercicio
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'.
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
Crea una consulta que nos muestre cada correo una única vez. La columna mostrada debe
llamarse correos_unicos
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
NOMBRE EDAD
Juan 30
Maria 25
Carlos 40
Juan 30
Luis 30
NOMBRE EDAD
Carmen 25
Ejercicio
empleados1
Juan Perez 30
María Gonzalez 25
Carlos Rodríguez 40
empleados2
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.
Tabla clientes1:
NOMBRE
Juan
Maria
Carlos
Ana
Luis
Tabla clientes2:
NOMBRE
Ana
Luis
Pedro
Carmen
Juan
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:
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
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:
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
• id: 7
• nombre: Lucía
• apellido: Sanchez
• email: luciasanchez@[Link]
• telefono: 555-5555
Ejercicio
COLUMNA TIPO
id INT
nombre VARCHAR
precio INT
stock INT
• id: 7
• nombre: Bolso
• Precio: 1000
• Stock: 10
COLUMNA TIPO
id INT
nombre VARCHAR
precio INT
stock INT
Ejercicio
COLUMNA TIPO
id INT
nombre VARCHAR
precio INT
stock INT
• 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:
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
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]
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.
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:
Ejercicio
• nombre: Bolso
• stock: 10
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
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.
Ejercicio
COLUMNA TIPO
nombre TEXT
precio INT
stock INT
fecha DATE
• nombre: Bolso
• stock: 10
• fecha: fecha_con_formato
La fecha del producto debe ser del primero de enero del 2023.
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
Gorro 5 1000
Camiseta 10 500
Pantalon 8 1500
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:
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".
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:
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:
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]
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
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:
Ejercicio
Editar registros
La sentencia UPDATE se utiliza para realizar modificaciones en datos ya existentes de una tabla.
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:
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
Edita la columna "registrado" para que todos los usuarios tengan el valor TRUE
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.
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:
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
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
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
•
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:
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:
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
• nombre: Lucía
Pista: Para poder ingresar las dos queries requeridas, recuerda añadir punto y coma al final de cada
una.
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:
Ejercicio
TIPO
COLUMNA DE
DATO
nombre texto
apellido texto
telefono texto
• 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.
Adicionalmente a los datos de tipo Texto podemos utilizar otros tipos de datos, en este ejercicio
abordaremos los 3 siguientes tipos.
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
En este ejercicio veremos el tipo de dato REAL, que permite almacenar números con decimales.
Ejercicio
TIPO
COLUMNA DE
DATO
temperatura_celsius real
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:
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
Aires 01-01
Aires 01-02
01-01
01-02
Importante: para poder ingresar las queries requeridas, recuerda añadir punto y coma al final de
cada una.
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.
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:
Ejercicio
En este ejercicio, vamos a modificar la tabla productos para agregar la columna descripcion de
tipo TEXT.
TIPO
COLUMNA DE
DATO
nombre TEXT
precio REAL
manga corta
mezclilla
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 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
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,
(nombre, [Link]
apellido)
VALUES
(NULL,
'Perez');
INSERT No funciona,
(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
apellido TEXT
• nombre: Pedro
• apellido: Perez
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.
2.
Ejercicio
TIPO
COLUMNA DE RESTRICCIONES
DATO
patente TEXT
ABC123
ABC124
En SQLite borrar una restricción tiene las mismas limitaciones que modificarla y el procedimiento es
similar.
Para el ejemplo tendremos una tabla llamada temperaturas con la siguiente estructura:
TIPO
COLUMNA DE RESTRICCIONES
DATO
1.
2.
Ejercicio
TIPO DE
COLUMNA RESTRICCIONES
DATO
Edad INTEGER
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:
Pongamos a prueba nuestra restricción con distintas consultas y observemos los resultados.
QUERY FUNCIONA
'[Link]@[Link]');
'[Link]@[Link]'); failed:
[Link]
'[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
001
001
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.
• 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:
QUERY FUNCIONA
INSERT Funciona
INTO
empleados
QUERY FUNCIONA
(nombre,
salario)
VALUES
('Juan',
3000);
INSERT No funciona,
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
0)
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.
Ejercicio
COLUMN DATA
CONSTRAINTS
NAME TYPE
title TEXT
content TEXT
1 Introduccion ¡Bienvenido al
mundo de la
programacion!
2 Primeros Sumergete en
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.
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:
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
TIPO DE
COLUMNA RESTRICCIONES
DATO
fecha_creacion DATE
NOMBRE FECHA_CREACION
Ana 2024-01-01
Gonzalo 2024-01-02
Juan 2024-01-03
María 2024-01-04
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.
1 Ana
2 Gonzalo
3 Juan
ID NOMBRE
1 Ana
2 Gonzalo
3 Juan
10 María
11 Pedro
Ejercicio
TIPO DE
COLUMNA RESTRICCIONES
DATO
fecha DATE
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.
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:
Ejercicio
COLUMN DATA
CONSTRAINTS
NAME TYPE
NOT NULL
nombre TEXT
apellido TEXT
Clave Foránea
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
nombre TEXT
apellido TEXT
autos
TIPO DE
COLUMNA RESTRICCIONES
DATO
patente TEXT
TIPO DE
COLUMNA RESTRICCIONES
DATO
(persona_id)
REFERENCES
personas(id)
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.
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:
La clave foránea debe hacer referencia a una columna que tenga una restricción de clave primaria
Ejercicio
articulos
TIPO DE
COLUMNA RESTRICCIONES
DATO
nombre TEXT
precio REAL
categorias
TIPO DE
COLUMNA RESTRICCIONES
DATO
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
transacciones
TIPO DE
COLUMNA RESTRICCIONES
DATO
monto REAL
TIPO DE
COLUMNA RESTRICCIONES
DATO
(usuario_id)
REFERENCES
usuarios(id)
usuarios
TIPO DE
COLUMNA RESTRICCIONES
DATO
nombre TEXT
apellido TEXT
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
[Link]@[Link] Juan 30
Perez
[Link]@[Link] Maria 25
Gonzalez
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
[Link]@[Link] Juan 30
Perez
EMAIL1 NOMBRE EDAD
[Link]@[Link] Maria 25
Gonzalez
tabla notas
EMAIL2 NOTAS
[Link]@[Link] 90
[Link]@[Link] 100
[Link]@[Link] 80
[Link]@[Link] 0
[Link]@[Link] 100
[Link]@[Link] 100
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.
Tabla usuarios
EMAIL NOMBRE EDAD
[Link]@[Link] Juan 30
Perez
[Link]@[Link] Maria 25
Gonzalez
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
[Link]@[Link] Juan 30
Perez
[Link]@[Link] Maria 25
Gonzalez
Tabla notas
EMAIL NOTAS
[Link]@[Link] 90
[Link]@[Link] 100
[Link]@[Link] 80
[Link]@[Link] 0
[Link]@[Link] 100
EMAIL NOTAS
[Link]@[Link] 100
Tabla usuarios
[Link]@[Link] Juan 30
Perez
[Link]@[Link] Maria 25
Gonzalez
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
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
usuarios
[Link]@[Link] Juan 30
Perez
[Link]@[Link] Maria 25
Gonzalez
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.
¿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
[Link]@[Link] Juan 30
Pérez
[Link]@[Link] Maria 25
González
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.
Orden de cláusulas
Cuando queremos utilizar joins con las otras claúsulas que hemos aprendido, tenemos que considerar
el orden de estas.
SE LEE
COMANDO
COMO:
SELECT Selecciona
estos
datos.
FROM De esta
tabla.
esta tabla.
SE LEE
COMANDO
COMO:
valores
que
cumplan
tal
condicion.
resultados
por este
criterio.
estos
criterios
agrupados.
resultados
por este
otro
criterio.
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
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.
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.
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"
Tabla Productos
Producto 10 1
Producto 15 2
Producto 20 3
Tabla Ventas
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,
es lo mismo que
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
[Link]@[Link] Juan 30
Perez
[Link]@[Link] Maria 25
Gonzalez
Tabla notas
EMAIL NOTAS
[Link] Join 90
Tabla usuarios
[Link]@[Link] Juan 30
Perez
[Link]@[Link] Maria 25
Gonzalez
Tabla notas
EMAIL NOTAS
[Link]@[Link] 90
[Link]@[Link] 100
EMAIL NOTAS
[Link]@[Link] 80
[Link]@[Link] 100
[Link]@[Link] 100
Ejercicio
@[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
[Link]@[Link] Juan 30
Perez
[Link]@[Link] Maria 25
Gonzalez
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,
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:
[Link]@[Link] Juan 30
Perez
[Link]@[Link] Maria 25
Gonzalez
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.
SELECT *
FROM tabla1
LEFT JOIN tabla2 ON [Link] = [Link]
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.
Tabla usuarios
[Link]@[Link] Juan 30
Perez
[Link]@[Link] Maria 25
Gonzalez
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:
Perez
Perez
Gonzalez
Gonzalez
En cambio, con SELECT * FROM Notas RIGHT JOIN Usuarios ON [Link] = [Link]; obtendríamos:
Perez
Perez
Gonzalez
EMAIL NOTAS EMAIL NOMBRE EDAD
Gonzalez
Para obtener los resultados en el mismo orden simplemente podemos especificar el orden que
queremos.
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.