Documentos de Académico
Documentos de Profesional
Documentos de Cultura
¿Qué es SQL?
SQL significa "Structured Query Language"
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.
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.
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ú.
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é'.
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?
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'.
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'.
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.
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.
Borra los registros que representen a cualquier persona cuyo apellido es 'Hunter'. En nuestro caso
eliminará 1 registro de la tabla people.
UPDATE people SET age = 50, city = 'Mumbai' WHERE (lastname = 'Hunter' AND firstname='Jason')
Para el resto de los ejemplos asumamos que nuestra tabla ahora luce de la siguiente manera:
¿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.
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'.
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'
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.
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.
Retornaría un valor correspondiente al promedio de edad de todas las personas que hay la tabla
people.
Obvio, ¿no?
Devuelve la suma de todas las edades de las personas cuya edad está por encima de los 20 desde
la tabla people.
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:
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'.
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
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.
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
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:
BPB
2 Kanetkar Yashwant 1 Let Us C 2 100
Publications
BPB
2 Kanetkar Yashwant 2 Let Us C++ 2 200
Publications
BPB
2 Kanetkar Yashwant 3 Java Servlet Programming 1 300
Publications
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
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
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:
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.
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
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.
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:
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
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.
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 .... = .....
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.
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:
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.
Ahora realicen las consultas SQL para responder las siguientes preguntas: