Está en la página 1de 17

SQL en forma simple

Adaptado de artículos publicados en http://www.codecoffee.com

¿Qué es SQL?
SQL significa "Structured Query Language"

¿Qué significa eso?


Hay una gran cantidad de motores de bases de datos disponibles en el mercado, tales como
PostgreSQL, MySQL, Oracle, SQL Server y muchas otras. Para escribir programas que interactúan
con estos con facilidad, tiene que haber una forma donde se puede conseguir la información de
nuestras bases de datos utilizando el mismo método. Para este propósito se desarrolló SQL. Es un
tipo de lenguaje (simple si se compara con lenguajes como Python, PHP o C), que permite que usted
haga todas sus consultas a una base de datos sin preocuparse por el tipo exacto del motor de base
de datos que la contiene.

No entiendo…. ¿Tienes algún ejemplo?


Suponga que tiene una base de datos que tiene una tabla llamada personas. (Espero que sepas lo
que son tablas). Ahora supón que desea obtener los detalles de todas las personas cuyo apellido
es Reena. Por lo tanto se puede utilizar una instrucción SQL como la siguiente:

SELECT * FROM personas WHERE nombre = 'Reena'

Cuando se utiliza esta consulta, el motor de base de datos en primer lugar trata de encontrar la
tabla llamada personas. Entonces trata de encontrar una columna llamada nombre. Lo siguiente
que hace es comparar todos los valores de esa columna con Reena. Finalmente devuelve todos los
detalles siempre que encuentra una coincidencia para el nombre.

¿Y para qué sirve?


Cuando se escribe un programa en Python, NodeJS, PHP o cualquier otro lenguaje de programación,
se haría una conexión de base de datos y luego podría consultar la base de datos mediante consultas
SQL. Cuando se consulta la base de datos con cualquier consulta SQL de la base de datos devuelve
un conjunto de registros. Un conjunto de registros es básicamente un conjunto de filas (todas las
entradas que devuelve la consulta). Este conjunto de registros es recibido en su programa en alguna
estructura de datos - definida en el lenguaje - que representa un conjunto de registros. Una vez que
tiene esta estructura de datos es posible utilizar algo como un ciclo for o while para recorrer todas
las entradas.

¿Y cómo se conecta a una base de datos a través de mi programa?


Este es un tutorial sobre SQL ... Así que no se centra en aquellos aspectos en esta serie. De todas
formas ya lo has visto ligeramente al conectarte a tu instancia de Heroku en DBeaver. Básicamente
necesitas el host, puerto, nombre de base de datos, usuario y clave.
¿Y ahora?
Ahora aprenderá estados básicos de SQL como SELECT, INSERT, UPDATE y DELETE. Estos son los
cuatro elementos que conforman el CRUD de datos: Create (Insert en SQL), Retrieve (Select en
SQL), Update y Delete, qué básicamente nos dice que para usar datos primero hay que crearlos.
Una vez creados podemos obtenerlos y/o actualizarlos. Finalmente, si no los queremos más los
podemos borrar.

Para todos los ejemplos de este artículo usaremos la tabla de ejemplo de una base de datos que se
muestra a continuación:

Tabla: people
lastname firstname age address city
Pai Kiran 22 Mahavir Nagar Mumbai
Hunter Jason 41 Oak Street San Jose
Kanetkar Yashwant 38 Rajabhai Street Nagpur
¿Qué es la instrucción SELECT? ¿Cómo se usa?
La instrucción SELECT le permite seleccionar un conjunto de valores de una tabla en una base de
datos. Los valores seleccionados de la tabla de base de datos dependerán de las diversas condiciones
que se especifican en la consulta SQL. Aquí hay algunas maneras de utilizar la instrucción SELECT.
He enumerado las sentencias SQL y los respectivos resultados que se obtendrían si se ejecutaría
esas consultas.

SELECT lastname, firstname FROM people

Devolvería un conjunto de registros con 3 registros. Cada registro tendría 2 valores.

El primer registro tendría 2 valores "Pai" y "Kiran". Mientras que el segundo tendría 2 valores
'Hunter' y 'Jason'. ¿El tercero? Lo puedes deducir tú.

SELECT * FROM people WHERE firstname='Jason'

Devolvería un conjunto de registros con 1 registro. El registro tendría 5 valores en que, a saber
'Hunter', 'Jason', '41', 'Oak Street' y 'San José'.

SELECT * FROM people WHERE age>25

Devolvería un conjunto de registros con 2 registros. ¿Cuáles serían?

Nota: cada vez que usted está comparando un varchar el valor debe estar encerrado entre
comillas simples (''). Mientras que cuando se compara un número entero el valor no debe estar
encerrada entre comillas simples.
¿Cómo se puede comparar una parte del nombre en lugar de todo el nombre?

SELECT * FROM people WHERE firstname LIKE '%an%'

Devolvería un conjunto de registros con 2 registros. Esta declaración volvería 2 registros ya que la
secuencia 'an' aparece en 2 valores de firstname, 'Kiran' y 'Yashwant'.

¿Puedo utilizar operadores booleanos como AND u OR para realizar consultas


complejas de forma similar a C o Python?
Sí. Es más, una vez que comiencen el desarrollo de aplicaciones de bases de datos profesionales
casi siempre usarán dichos operadores booleanos para realizar consultas eficaces.

SELECT address FROM people WHERE (firstname='Kiran' OR city='Nagpur') AND age>30

Devolvería un conjunto de registros que consiste en 1 registro con sólo 1 valor. La condición inicial
del WHERE especifica que el nombre de la persona (firstname) podría ser "Kiran" o su ciudad (city)
podría ser 'Nagpur', pero al agregar el AND decimos que esa persona tiene que tener edad (age)
mayor a 30. El conjunto de registros sólo tendría valor 1 en ella: 'Rajabhai Street'.

¿Qué es la instrucción INSERT? ¿Cómo se usa?


La sentencia INSERT le permite insertar información en una base de datos. Algunos ejemplos se
muestran a continuación:

INSERT INTO people VALUES ('Trump', 'Donald', 72 , 'White House', 'Washington')

Inserta una nueva fila en la parte inferior de la tabla people que consiste en los valores entre
paréntesis escritos en la declaración anterior en el orden en que la tabla fue descrita: el primer
valor corresponde a lastname, el segundo a firstname, y así sucesivamente.

INSERT INTO people (lastname, city) VALUES ('Gates', 'Redmond')

Si desean insertar una nueva fila en la parte inferior de la tabla people que consiste de sólo 2 valores,
'Gates' y 'Redmond', deben especificar las columnas que corresponden a esos valores. En este caso,
'Gates' corresponde al apellido y 'Redmond' a la ciudad donde vive. Las columnas restantes para ese
registro en particular se dejan en blanco (nulo).

Nota: Un valor nulo es diferente de 0 o '' (cadena vacía). Un ejemplo perfecto de esto sería una
columna que describe el color de cabello para muchas personas. En caso de que la persona es calvo
entonces el valor del color debe ser nulo en lugar de vacío. Esto sería perfecto desde el punto de
vista de diseño de base de datos. Una entidad particular que no existe debe estar representado de
manera similar y no por cadenas vacías.

¿Cómo se elimina un registro de una base de datos?


Se utiliza la instrucción DELETE para eliminar registros o cualquier valor de columna en particular a
partir de una base de datos.

DELETE FROM people WHERE lastname = 'Hunter'

Borra los registros que representen a cualquier persona cuyo apellido es 'Hunter'. En nuestro caso
eliminará 1 registro de la tabla people.

¿Hay una manera de actualizar cualquier registro en una base de datos?


Sí. Se podría utilizar la instrucción UPDATE. Las sentencias UPDATE reemplazan aquellos valores
que se han especificado en la instrucción SQL con los nuevos valores dados.

UPDATE people SET age = 50, city = 'Mumbai' WHERE (lastname = 'Hunter' AND firstname='Jason')

Cambiaría la edad de Jason Hunter de 41 a 50 y le haría cambiar su residencia de 'San José' a


'Bombay'.

¿Hay mejores maneras de utilizar SELECT?


Sí, hay. Ahora van a aprender algunas de las mejores maneras de utilizar el SELECT junto con
algunos otros términos de SQL tales como DISTINCT, ORDER BY, MAX, MIN, AVG, etc ..

Para el resto de los ejemplos asumamos que nuestra tabla ahora luce de la siguiente manera:

Table Name : people


lastname firstname age address city
Gates Anthony 11 Circuit City Bangalore
Hunter Jason 41 Oak Street San Jose
Gates Bill 59 Microsoft Corp. Redmond
Kanetkar Yashwant 38 Rajabhai Street Nagpur

¿Cómo podría conseguir entradas distintas de una tabla, o sea, que no se repita un
dato pedido?
La instrucción SELECT en conjunción con DISTINCT le permite seleccionar un conjunto de valores
distintos de una tabla en una base de datos. Los valores seleccionados de la tabla de base de datos
dependerán de las diversas condiciones que se especifican en la consulta SQL. Aquí hay algunas
maneras de utilizar la palabra clave DISTINCT.
SELECT DISTINCT lastname FROM people

Devolvería un conjunto de registros con 3 registros. Cada registro tendría un valor: El primer
registro contendría 'Gates', el segundo contendría 'Hunter' y la tercera contendría 'Kanetkar'. A
pesar que el apellido 'Gates' está presente dos veces en la tabla, se considerará una sola
ocurrencia de este dado que se utiliza la palabra clave DISTINCT en la instrucción SQL.

¿Hay una manera de obtener los resultados de una consulta ordenada de alguna
forma?
Sí hay maneras de clasificar los resultados y devolverlos ordenados a su programa (lo que le ahorra
el dolor de cabeza de llevar a cabo el orden por su cuenta). ORDER BY es la palabra clave que se
utiliza para esto.

SELECT firstname, age, city FROM people ORDER BY firstname

Esta consulta devolvería un conjunto de registros con 4 registros. Cada registro tendría 3 valores
correspondientes al primer nombre, edad y ciudad. Pero la gracia de esta consulta es que los
registros se ordenan según el primer nombre en orden alfabético ascendente (A es la primera - Z la
última).

Entonces, en este ejemplo, el primer registro sería el correspondiente a la persona cuyo nombre es
'Anthony', seguido de 'Bill', luego 'Jason' y finalmente 'Yashwant'.

SELECT firstname, age, city FROM people ORDER BY firstname DESC

Devolvería un conjunto de registros con 4 registros como el caso anterior, pero esta vez los registros
estarían en el orden inverso. A saber, el primero sería 'Yashwant' y el cuarto sería 'Anthony'

¿Cómo puedo encontrar el número total de registros en una tabla?


Se utiliza la palabra clave COUNT para esto. Aquí hay ejemplos:

SELECT COUNT(*) FROM people WHERE age>40

Devolvería un conjunto de registros que consta de 1 valor. Al contrario de las sentencias SQL
anteriores, la declaración COUNT retorna un valor que indica directamente el número total de
registros existentes en la base de datos que cumplen con las condiciones.

¿Qué valor devolverá la consulta anterior?

SELECT COUNT (city) FROM people

Devolvería un conjunto de registros que consta de 1 valor. Y ese valor sería igual a 4. El punto
importante a destacar es que esta declaración devolverá el número total de entradas en que la
ciudad no tiene un valor nulo.
SELECT COUNT (DISTINCT lastname) FROM people

Devolvería un conjunto de registros que consta de 1 valor. Y dicho valor será igual a 3. Hay que
recordar que cuando se utiliza la palabra clave COUNT usted no recibe el apellido real de las
personas, sino que sólo recibe el número total de registros que existen en la base de datos con las
características requeridas. Y en este caso, DISTINCT se utilizó para encontrar el número total de
registros de distintos apellidos.

¿He oído que hay un poco de materia matemática en SQL?


Sí, hay muchas operaciones simples que usted puede hacer con el fin de obtener alguna información
útil a partir de una base de datos en lugar de obtener simples registros de ella. Aquí hay algunos
ejemplos de estas operaciones matemáticas

SELECT AVG (age) FROM people

Retornaría un valor correspondiente al promedio de edad de todas las personas que hay la tabla
people.

SELECT AVG (age) FROM people WHERE age > 30

¿Qué retorna lo anterior? Si no sabe vuelva al inicio 

SELECT MAX (age) FROM people

Devuelve la edad máxima entre todas las personas de la tabla people.

SELECT MIN (age) FROM people

Obvio, ¿no?

SELECT SUM (age) FROM people WHERE age > 20

Devuelve la suma de todas las edades de las personas cuya edad está por encima de los 20 desde
la tabla people.

Muéstrame algo nuevo en SQL


OK. Veremos 2 palabras clave denominadas GROUP BY y HAVING. Ambos se utilizan en conjunto
con los estados agregados como SUM, AVG, MIN, etc.
Para los ejemplos siguientes usaremos la tabla que se muestra a continuación:

Table Name : companies


name profit
Sega 25000
Microsoft 50000
Sega 10000

¿Qué es GROUP BY? ¿Cuándo se usa?


GROUP BY es una palabra clave de SQL que permite que las funciones de agregado (como SUM)
devuelven un valor asociado a un conjunto de datos en particular. Sin la funcionalidad GROUP BY,
la búsqueda de la suma para cada grupo individual de valores de columna no sería posible. Veamos
un ejemplo:

SELECT name, SUM (profit) FROM companies

Devuelve un conjunto de registros con 3 registros. Cada registro tiene 2 valores. El primer registro
tendría el valor 'Sega' y '85000'. El segundo registro tendría los valores 'Microsoft' y '85000'. Y el
tercer registro tendría los valores 'Sega' y '85000'.

Por lo tanto, está claro que esto no es lo que se requería. No hay sentido en conseguir la suma de
todos los beneficios de todas las empresas, junto con cada nombre de la empresa. Lo que sería
aceptable es la suma de todas las ganancias de las respectivas empresas, junto con el nombre de
esa empresa. Entonces veamos cómo sería la forma correcta:

SELECT name, SUM (profit) FROM companies GROUP BY name

Devuelve un conjunto de registros con 2 registros. Cada registro tiene 2 valores. El primer registro
tendría el valor 'Sega' y '35000'. El segundo registro tendría los valores 'Microsoft' y '50000'.

OK, me queda claro… ¿Y la palabra clave HAVING?


La palabra clave HAVING se ha añadido a SQL debido a una palabra clave WHERE no puede ser
utilizado en funciones de agregado (como SUMA). Sin la palabra clave HAVING no sería posible
poner a prueba las condiciones de resultado de la función.

SELECT name, SUM(profit) FROM companies GROUP BY name HAVING SUM(profit)>40000

Devuelve un conjunto de registros con 1 registro. Este registro tendrá 2 valores, a saber, 'Microsoft'
y '50000', dado que la suma de las ganancias de la empresa con el nombre 'Sega' es solamente 35000
(que es menor que 40000, como requiere la consulta)
Una pregunta ¿Tengo o no que trabajar con los mismos nombres de las columnas
que existen en las tablas de la base, dentro de mi programa?
Sí y No. En lo que respecta a la consulta, que tiene que incluir los nombres de las columnas que
existen en la tabla de base de datos en la consulta. Pero también se puede incluir un alias con el que
se puede llevar a cabo más trabajo con los resultados devueltos por la base de datos. Permítanme
mostrarles un ejemplo de la utilización de un alias

SELECT name "firm", profit "riches" FROM companies

Devolvería un conjunto de registros que consta de 3 registros cada uno con 2 valores. Básicamente
todos los 3 registros de la base de datos ejemplo serían devueltos, pero los nombres de las columnas
se cambiarán a los mencionados en la instrucción SQL.
Actividad I
En webcursos se ha subido un archivo llamado World.sql, que contiene datos de los países del
mundo. Deben cargar esta base de datos en su motor de base de datos PostgreSQL (en Heroku).

Luego, deben crear las consultas SQL para responder las siguientes preguntas:

1. ¿Cuál es el nombre del continente del país que tiene código igual a CHL?
2. Nombres de los países que se independizaron después de 1990.
3. Nombre de todos los países cuyo nombre comience con A.
4. Promedio de población de todas las ciudades que tengan código de país COL
5. ¿Cuántos idiomas se hablan en el mundo?
He escuchado acerca de la palabra JOIN ¿Qué es?
Suponga que tiene una base de datos que tiene 2 tablas, y desea alguna información que se
distribuye en ambas tablas. Normalmente, usted tendría que ejecutar una consulta para cada tabla
para obtener los datos de cada tabla por separado, y luego unirlas en su programa. Pero esto no es
necesario si usamos JOIN, que nos permite unir dos tablas para una consulta.

Dame un ejemplo.
Para explicar este tema, voy a utilizar las tablas que se muestran a continuación con algunos valores
de ejemplo, los suficientes para que usted pueda comprender el concepto.

Table Name : authors

author_id lastname firstname company


1 Hunter Jason O' Reilly
2 Kanetkar Yashwant BPB Publications

Table Name : books

book_id title author_id pages


1 Let Us C 2 100
2 Let Us C++ 2 200
3 Java Servlet Programming 1 300
4 C Projects 2 400

Partamos con la forma más sencilla: con un JOIN implícito en la parte de las condiciones (WHERE).

Por ejemplo, supongamos que desea los nombres de todos los autores, así como los libros que han
escrito cada uno de ellos, ¿qué harías? En lugar de utilizar 2 consultas separadas para hacer el
trabajo que usted podría utilizar una consulta como la siguiente

SELECT firstname,lastname,title FROM authors,books WHERE authors.author_id = books.author_id

Esta consulta selecciona 3 columnas (nombre, apellido y título) de la tabla combinada de 2 tablas
diferentes (autores y libros) en función de los criterios mencionados. En este caso se selecciona
aquellas filas de la tabla combinada en el que el valor del campo authors.author_id es igual a
books.author_id en la tabla combinada. Esta consulta retorna 4 filas de datos. (Pruebe estos
ejemplos para que pueda ver los resultados)
¿Qué es esto de una tabla combinada? ¿De dónde vienen esos 2 valores author_id?
No entiendo nada
Vamos por partes. Primero aclaremos que todo lo que había visto con anterioridad eran consultas
que se realizaban sólo sobre 1 tabla y que es que ahora se está haciendo la consulta para seleccionar
a partir más de 1 tabla.

Para entender con claridad, se puede suponer lo siguiente. En el momento de pedir una consulta
para seleccionar a partir de más de una tabla, se crea una tabla temporal que tiene todas las
combinaciones posibles de los contenidos de las 2 tablas. En nuestro caso, esto se podría
representar la tabla temporal de la consulta SELECT * FROM authors,books con la siguiente tabla:

author.author_id lastname firstname company book_id title books.author_id pages

1 Hunter Jason O Reilly 1 Let Us C 2 100

BPB
2 Kanetkar Yashwant 1 Let Us C 2 100
Publications

1 Hunter Jason O Reilly 2 Let Us C++ 2 200

BPB
2 Kanetkar Yashwant 2 Let Us C++ 2 200
Publications

1 Hunter Jason O Reilly 3 Java Servlet Programming 1 300

BPB
2 Kanetkar Yashwant 3 Java Servlet Programming 1 300
Publications

1 Hunter Jason O Reilly 4 C Projects 2 400

BPB
2 Kanetkar Yashwant 4 C Projects 2 400
Publications

Si usted ve los valores de esta tabla con cuidado, debe haber observado que muchas de las filas
contienen información incorrecta, pero eso es lo que se genera cuando se crea una combinación
entre 2 tablas. Lo que debemos hacer ahora es indicar las condiciones adecuadas para extrar los
registros útiles. Las filas marcadas en rojo son las filas correctas, que son aquellas en los que la
primera columna (authors.author_id) es igual a la séptima columna (books.author_id). Estas son las
filas que contienen la información correcta según lo previsto.

Por lo tanto, cuando selecciona los datos de más de una tabla, con el fin de extraer sólo las filas
correctas de los datos de la tabla combinada, debe utilizar siempre una condición para comprobar
la igualdad de la columna común en la cláusula WHERE de la consulta. Por ejemplo, en nuestro caso,
como se ha explicado antes de que se debe utilizar la siguiente consulta

SELECT firstname,lastname,title FROM authors,books WHERE authors.author_id = books.author_id

De este modo se obtiene el nombre de todos los autores, así como una lista de todos los libros que
ha escrito.
¿Hay algo que tengo que considerar a la hora de hacer este tipo de consultas?
Sí. Recuerde que al escribir los nombres de las columnas en la consulta que debe tener cuidado de
que especifica la columna exacta a la que usted se está refiriendo. Así, en caso de que tenga una
columna llamada 'topic' en las 2 tablas anteriores, y desea el valor del campo topic en la tabla
autores, se debe hacer referencia a ella como authors.topic de la siguiente manera

SELECT authors.topic .... from authors, .... WHERE ....

Entonces, ¿cuál es el uso más obvio de JOIN? ¿Qué es este concepto de una
columna común en 2 tablas?
El uso más simple y obvio de JOIN es obtener datos que existe en 2 tablas que tienen algún tipo de
relación. JOIN básicamente significa que se unirán 2 tablas y seleccionarán datos de ellas. En nuestro
ejemplo anterior la columna común author_id nos permite realizar nuestra búsqueda de forma
adecuada, es decir con algo útil como información.

Nota: Una cosa importante a saber es que, vimos que la creación de tablas normalmente conlleva
una clave principal en cada tabla. Una clave principal básicamente significa que en esa columna
particular, no puede haber valores duplicados y que la columna podría ser un represente de los
datos de esa tabla. Así por ejemplo, en la tabla autores, author_id es la clave principal y no puede
haber 2 author_id con el mismo valor: cada autor debe tener un ID único. Usted generalmente usa
este valor (de la primaria presentes clave en alguna otra tabla) cada vez que desee crear un enlace
entre las 2 tablas. En nuestro caso author_id está presente en la tabla de libros de manera que se
crea un vínculo entre las 2 tablas. Tales vínculos entre 2 tablas nos permiten utilizar JOIN con
eficacia.

¿Qué hago si quería una lista de libros escritos por un autor con author_id = 1, así
como su nombre completo?
Con lo visto anteriormente esto debería ser fácil:

SELECT firstname,lastname,title FROM authors,books WHERE (authors.author_id = books.author_id


AND authors.author_id=1)

Esto en primer lugar crea una tabla unida - como se indicó anteriormente - que tiene 8 filas de datos.
Entonces debemos filtrar esta tabla y seleccionamos 4 filas al usar el criterio authors.author_id =
books.author_id en la cláusula WHERE. De esas 4 filas, seleccionamos 1 registro que corresponde al
criterio authors.author_id = 1. De este modo se obtiene la información exacta que quería - El
nombre, apellido y los títulos de los libros escritos por Jason Hunter, ya que su author_id es igual a
1.

¿Cuáles son los otros tipos de uniones?


Como le he dicho al principio, hay muchos otros tipos de uniones. Las uniones interiores (INNER
JOIN) y externas (OUTER JOIN).

¿Qué es INNER JOIN?


Las uniones interiores son el tipo más común de las combinaciones. Es más, es casi lo mismo que ya
vimos anteriormente. Veamos un ejemplo:

SELECT * FROM (authors INNER JOIN books ON authors.author_id = books.author_id)

Esto devolvería 4 filas de datos que tienen toda la información acerca de los 4 libros. Esto da
exactamente el mismo resultado que la consulta siguiente

SELECT * FROM authors,books WHERE authors.author_id = books.author_id

Básicamente el INNER JOIN combina todos los registros de la primera tabla con todos los registros
de la segunda tabla y luego selecciona aquellas filas en función de los criterios que está presente
después de la palabra clave ON en la consulta.

Lo más importante para recordar en la unión interna es que sólo aquellos registros de ambas tablas
se combinan en donde existe un valor correspondiente en ambas tablas. Esto quedará más claro a
continuación cuando vemos las combinaciones externas.

¿Qué es OUTER JOIN?


Los OUTER JOIN se diferencian de los anteriores en que no es necesario tener algún valor en común
para retornar datos. Para entender esto supongamos que nuestra tabla autores ha cambiado a lo
siguiente:

author_id lastname firstname company


1 Hunter Jason O' Reilly
2 Kanetkar Yashwant BPB Publications
3 Pai Kiran Pai Ltd.
Veremos 2 tipos de combinaciones externas: LEFT y RIGHT. Veamos un ejemplo de la primera:

SELECT * FROM (authors LEFT JOIN books ON authors.author_id = books.author_id)

Esta consulta ahora (teniendo en cuenta la tabla de nuevos autores) devuelve 5 filas de datos. La
última fila correspondería al registro del autor llamado Kiran Pai pero los campos tales como title,
pages, book_id serían nulos ya que no hay libros escritos por Kiran Pai en nuestra tabla de libros.

Esto es exactamente lo LEFT JOIN hace: combina todos los registros de la primera tabla con los de
la segunda tabla, independientemente de si hay valores correspondientes de la primera en la
segunda. Por correspondiente quiero decir, como en nuestro caso, ya que no había libros de Kiran
Pai en nuestra tabla de libros no existen valores correspondientes para Kiran Pai en nuestra tabla
de libros. Pero a pesar de que no existieran valores correspondientes se unieron todos los valores y
por lo tanto tiene los valores NULL en el resultado de la consulta final. Este punto es muy importante
de entender, así que lea de nuevo en caso de que no entienda con claridad.

¿Podría explicar el concepto de INNER JOIN una vez más con respecto a este LEFT
JOIN?
Sí. Ahora quizás se entienda mejor. Como ya he mencionado en un LEFT JOIN todos los registros de
la primera tabla se combinan con los datos de la segunda tabla. Y si no hay datos correspondientes
en la segunda tabla, se insertan valores nulos en la tabla combinada. Mientras que en un INNER
JOIN, los registros de las tablas 2 se combinan sólo si hay valores correspondientes en ambas tablas.
Por ejemplo, considere lo siguiente:

SELECT * FROM (authors INNER JOIN books ON authors.author_id = books.author_id)

Esta consulta sólo retornará 4 filas de datos y no. Esto se debe a que no se pudo encontrar la entrada
correspondiente en la tabla de libros para el autor llamado Kiran Pai (no había libros escritos por
Kiran Pai)

¿y RIGHT JOIN?
Considere el mismo ejemplo usado anteriormente para LEFT JOIN, pero esta vez usemos un RIGHT
JOIN

SELECT * FROM (authors RIGHT JOIN books ON authors.author_id = books.author_id)

Esta vez no te dan 5 filas de datos, sino que se obtendrían sólo 4 filas de datos. ¿¿Por qué??

Al usar un RIGHT JOIN los datos de tabla de libros se consideran primero y es la que se complemente
con datos de la tabla authors, refinando la búsqueda con el criterio correspondiente, el cuál es que
el id del autor sea el mismo.

Todavía no lo tengo claro ¿Me lo puede explicar de otra manera?


En realidad, todo lo que se requiere es una relectura de las preguntas anteriores. En caso de que
todavía no lo tienes, sólo hay manera de solucionarlo: crear tablas reales utilizando algún software
y luego ejecutar algunas consultas de ejemplo sobre esas tablas.

Por ejemplo, cree 2 tablas - una para artistas y otra para las canciones de los artistas. Ingrese unos
10 artistas y unas canciones para 6 o 7 artistas (no para los 10). Luego trate de generar consultas
que permitan retornar todos los artistas, artistas con canciones, y canciones con sus respectivos
artistas.
¿Hay otras formas en las que puedo usar JOINs?
Sí se puede combinar 2 JOINs para realizar consultas más complejas, por ejemplo cuando se está
combinando datos de 3 o más tablas. Su consulta sería algo como lo siguiente

SELECT ... , ... FROM ( .... INNER JOIN .... ON .... = .... ) INNER JOIN .... ON .... = .... WHERE .... = .....

Un resumen de JOIN por favor


Acá va una gráfica que permite entender los JOIN visualmente 

Cambiando de tema un poco ¿Qué es una subquery?


Pensemos un poco siguiendo un ejemplo. Utilizando las mismas tablas anteriores, ¿Cómo harías
para encontrar los títulos de los libros escritos por Jason? Intente hacerlo antes de continuar.

Una forma es hacer una primera consulta y encontrar el author_id de Jason de la tabla de autores
y, a continuación hacer otra consulta para obtener una lista de libros que tienen que el id de autor
de Jason asociado de la tabla de libros.

Bien. ¿Puedes conseguirlo en una consulta?

Acá es donde las subqueries son útiles. Con una subquery podemos encontrar el author_id para ese
autor en particular y luego también encontrar los libros escritos por él en la misma consulta.
Esto suena interesante .. ¿Cómo lo hago?
Si escribiésemos lo que queremos en español, sería algo como "Quiero una lista de los libros que
han sido escritos por el autor cuyo primer nombre es Jason". En SQL yo podría utilizar el siguiente

SELECT title FROM authors, books WHERE books.author_id = (SELECT author_id from authors where
firstname = 'Jason') AND books.author_id = authors.author_id

Parece complejo pero en realidad es sencillo, después de todo SQL es casi como lo que escribimos
en español 

La primera parte es sencilla: selecciona el título de los libros para un grupo de criterios. Veamos esos
criterios:

La parte interna de la consulta es un SELECT en donde buscamos el id de un autor que tiene como
nombre 'Jason'. Esta consulta se evalúa primero, y retorna como valor el id 1. Por lo tanto toda la
consulta se convierte en:

SELECT title FROM authors,books WHERE (books.author_id = 1 AND books.author_id =


authors.author_id)

Aquí estamos usando las 2 tablas originales de la tabla de autores con 2 filas y la tabla de libros con
4 filas. Ahora cuando se crea la tabla combinada sería que consta de 8 filas (2x4 como se explicó
anteriormente). A partir de estos 8 filas solamente 4 sería que contiene información correcta y el
resto de ellos sería simplemente presente como resultado de las diversas combinaciones que eran
posibles. Ahora la parte books.author_id = authors.author_id de la cláusula WHERE separa estos 4
filas correctas y descarta las filas restantes. Y, finalmente, la otra parte de la cláusula WHERE
books.author_id = 1 sería selecciona la hilera final a partir de las 4 filas correctas.

De este modo se podrían obtener los nombres de los libros escritos por el autor llamado Jason
Hunter.

¿Qué sigue ahora?


Practicar, practicar, practicar. Realiza las actividades para lograr la maestría.
Actividad II
Seguiremos ocupando la base de datos de ejemplo que se encuentra en webcursos.

Ahora realicen las consultas SQL para responder las siguientes preguntas:

6. Nombres de los presidentes de países que contengan la palabra alia.


7. ¿Cuál es el nombre del presidente del país de nombre Chile?
8. Porcentaje de personas que hablan chino (chinese) en China.
9. El número de las ciudades que tiene Rusia (Russian Federation) junto con el idioma
oficial del país.

Escriba cada una de las consultas y súbalas a webcursos.

También podría gustarte