Módulo 3. SQL
Módulo 3. SQL
SQL
Video de habilidades
Cierre
Referencias
Descargá la lectura
Lección 1 de 6
Video de inmersión
Verify to continue
We detected a high number of errors from your
connection. To continue, please confirm that
you’re a human (and not a spambot).
Introducción a SQL
Del inglés Structured Query Language (SQL) es el lenguaje estándar para trabajar con bases de datos
relacionales y es soportado prácticamente por todos los productos en el mercado. Originalmente, SQL
fue desarrollado en IBM Research a principios de los años setenta. Se usó por primera vez a gran escala
en un prototipo de IBM denominado System R, luego fue aplicado en numerosos productos comerciales
de IBM y de otros fabricantes. En este capítulo presentamos una introducción al lenguaje SQL, los tipos
de datos y como generar la estructura de una base de datos. Esto último es lo que se conoce por sus
siglas en inglés como DDL (Data Definition Language). En cuanto a la actualización, se especifica
también otro lenguaje, el DML (Data Manipulation Language) que nos permite modificar el estado de la
base de datos.
Para comprender mejor un concepto, además de su definición, siempre es útil para ampliar nuestro
conocimiento conocer su contexto e historia. Para poder entender mejor qué es SQL veamos 2 artículos.
El primero de ellos define SQL y muestra algo de historia del estándar ANSI para en el segundo artículo
ver más en detalle la historia del lenguaje.
Las bases de datos almacenan datos mediante registros, pueden ser distintos en su característica,
soporte, etc. Así, como un aspecto previo es necesario conocer la naturaleza de los distintos tipos de
datos.
Los DBMS proveen distintos tipos de datos con los cuales podemos trabajar, sin embargo, es necesario
especificar cual nos conviene más y para eso debemos de saber sus características en búsqueda,
capacidad, uso de los recursos, etc
Cada DMBS introduce tipos de valores de campos que no se encuentran precisamente presentes en
otras. A pesar de esto, existe un conjunto de tipos que están presentes en la totalidad de las
implementaciones de bases de datos. En la tabla 1 podemos ver estos tipos comunes.
En este curso en particular, recomendamos el uso del motor Postgre SQL. Como en todos los
manejadores de bases de datos implementa los tipos de datos definidos para el estándar SQL3 y
aumenta algunos otros. Detallando algunos de los tipos mencionados antes veamos los tipos definidos
por el estándar SQL3 que se muestran en la tabla 2.
Correspondiente en
Tipos de Postgres Descripción
SQL3
Cadena de caracteres de
char(n) character(n)
tamaño fijo
Cadena de caracteres de
varchar(n) character varying(n)
tamaño variable
Tablas
Los datos son almacenados en las tablas por medio de filas y columnas. La definición de las tablas se
realiza con un nombre que la identifica unívocamente y un conjunto de columnas. Una vez creada se le
pueden insertar datos en las filas. Sobre las filas de las tablas se pueden hacer operaciones de consulta,
eliminación o actualización de datos.
CO L UMNA FI LA CAMP O
Una columna o atributo representa un tipo de datos en una tabla, por ejemplo, el nombre de un artículo
en la tabla “artículos”. Cada columna cuenta con un nombre, un tipo de dato (char, date o number) y un
tamaño (cantidad de caracteres, si es un tipo texto, un ancho, si es un tipo fecha) o una escala y
precisión (para tipos numéricos). Los valores de una columna siempre van a tener el mismo tipo de
datos. Las columnas se van creando de izquierda a derecha, este dato no es relevante a la hora de
recuperar los datos de una tabla.
CO L UMNA FI LA CAMP O
Una fila es una composición de los valores de las columnas de una tabla, por ejemplo, la información
acerca de un artículo (nombre, precio) en la tabla “artículos”. Las filas también son conocidas como
tuplas o registros. Cada tabla puede contener cero o más registros o filas y su contenido es un único
valor en cada columna. Por defecto las filas están desordenadas, se van disponiendo en la medida que
se insertan.
CO L UMNA FI LA CAMP O
La intersección de una fila con una columna es el campo. Es la unidad más atómica de una tabla, no
puede ser descompuesto en valores más pequeños. El campo puede o no contener datos, la ausencia
de datos se conoce como campo nulo.
Según vimos antes, es necesario un lenguaje que nos permita crear tanto la estructura, es decir, las
tablas, como el acceso, consulta y actualización de los datos, además de la inserción, selección y
eliminación de tuplas o registros. SQL provee ambos lenguajes (DDL y DML). Comencemos viendo unos
ejemplos de cómo crear tablas a través de SQL.
La notación [...] quiere decir que lo que hay entre los corchetes se podría poner o no.
La notación {A|...|B} quiere decir que tenemos que escoger entre todas las opciones que
hay entre las llaves. Pero tenemos que poner una obligatoriamente.
Como ya hemos visto, la estructura de almacenamiento de los datos del modelo relacional son las
tablas. Para crear una tabla hay que utilizar la sentencia create table. Veamos el formato:
Donde la definición de columna es:
El proceso que hay que seguir para crear una tabla es el siguiente:
2 Dar nombre a cada uno de los atributos que formarán las columnas de la tabla (nombre
columna).
3 Asignar a cada una de las columnas un tipo de datos predefinido o bien un dominio definido
por el usuario. También se puede dar definiciones por defecto y restricciones de columna.
4 Una vez definidas las columnas, sólo habrá que dar las restricciones de tabla.
Si queremos crear una tabla para almacenar los empleados de una empresa, donde cada empleado tiene
obligatoriamente que tener un DNI y fecha de ingreso y opcionalmente se almacenará su nombre, su
apellido y su edad, podríamos tener la siguiente sentencia SQL (Dataprix, 2009, https://bit.ly/2UYOFnY).
Las columnas que no pueden tener valores nulos, se indica con las palabras reservadas not null.
Restricciones de columna
En cada una de las columnas de la tabla, una vez que les hemos dado un nombre y hemos definido el
dominio, podemos imponer ciertas restricciones que siempre se tendrán que cumplir. Las restricciones
que se pueden dar son las que aparecen en la tabla que apareces a continuación.
Restricción Descripción
CL AV E P RI MARI A CL AV E F O RÁNE A
La clave primaria está compuesta por una o más columnas que permiten identificar de manera unívoca a
cada fila de una tabla, por ejemplo, el código de barras de un artículo. La clave primaria es única por
tabla y siempre debe contener un valor.
CL AV E P RI MARI A CL AV E F O RÁNE A
La clave foránea está compuesta por una o más columnas que hacen referencia a una clave primaria
de otra tabla o de la misma, por eso la relación entre las tablas que las contienen se conoce como
padre/hijo. Las claves foráneas tienen el fin de ayudar al cumplimiento de las reglas de diseño de la base
de datos relacional. Se puede contar con más de una clave foránea por tabla. Estas claves surgen de la
necesidad de relacionar diferentes tablas. Como vimos en el ejemplo de curso-alumno (en la lectura 2) la
forma de relacionar una tabla con otra es a través de este tipo de claves.
Restricciones de tabla
Una vez hemos dado un nombre, definido un dominio y hemos impuesto ciertas restricciones para cada
una de las columnas podemos aplicar restricciones sobre toda la tabla que siempre se tendrán que
cumplir. Las restricciones que se pueden dar son las siguientes:
Restricción Descripción
Vistas
Los índices y las vistas son mecanismos que facilitan el acceso a los datos. Para el caso de los
índices, como vimos en el módulo 1, sirven para mejorar la performance de la base de datos ya que son
estructuras auxiliares de rápido acceso. El caso de las vistas nos permite resumir o conjugar diferentes
consultas agrupándolas con un mismo nombre lógico. Veamos la estructura de la consulta SQL y
algunos ejemplos.
Lo primero que tenemos que hacer para crear una vista es decidir qué nombre le queremos poner
(nombre_vista). Si buscamos cambiar el nombre de las columnas, o bien poner nombre a alguna que en
principio no tenía. Lo podemos hacer en lista de columnas. A partir de ahí solo nos quedará definir la
consulta que formará nuestra vista.
Las vistas no existen realmente como un conjunto de valores almacenados en la BD, son tablas ficticias
denominadas derivadas (no materializadas). Se construyen a partir de tablas reales (materializadas)
almacenadas en la BD y conocidas con el nombre de tablas básicas (o tablas de base) (Dataprix, 2009).
La no-existencia real de las vistas hace que puedan ser actualizables o no.
Creamos una vista que de, por ejemplo, para cada cliente el número de proyectos que tiene encargados
el cliente.
Más adelante detallaremos, pero vemos en esta vista varios componentes nuevos. La consulta
propiamente dicha (slect) retorna lo indicado en el enunciado y nos permite consultar los datos
directamente utilizando la vista “proyectos por cliente” si tuviésemos las siguientes extensiones:
Tabla 5. Clientes
codigo_cl nombre_c
Nif dirección ciudad teléfono
i li
38.567.89
10 ECIGSA Aragón 11 Barcelona NULL
3-C
Tabla 6. Proyectos
codigo nombre fecha_i fecha_p fecha_fi codigo_
precio
_proy _proy nicio rev_fin n cliente
GESCO
1 1,0E+6 1-1-98 1-1-99 NULL 10
M
codigo_cli numero_proyecto
10 2
20 1
30 1
Índices
Los índices, si bien siempre están asociados a una tabla, son objetos independientes, ya sea desde el
punto de vista lógico como del punto de vista físico. Ellos se pueden crear o eliminar sin que afecten a la
información almacenada en una tabla.
El DBMS utiliza el índice como se puede utilizar el índice de un libro. El índice contiene una entrada por
cada valor que aparece en las columnas indexadas de la tabla y punteros (orowid) a las filas que
contienen esos valores. Cada puntero conduce directamente a la fila apropiada; en consecuencia, se
evita el barrido total de la tabla (Oracle, 2017, https://bit.ly/2SZuT9a).
En el índice los valores de los datos están dispuestos en orden ascendente o descendente, de modo que
el DBMS es capaz de buscar rápidamente el índice para encontrar un valor particular. A continuación,
puede seguir el puntero para localizar la fila que contiene el valor.
En general es una buena idea crear un índice para las columnas que se utilizan con frecuencia en las
condiciones de búsqueda. La indexación también es más apropiada cuando las consultas en una tabla
son más frecuentes que las inserciones y las actualizaciones.
Clave primaria: la mayoría de los productos de DBMS siempre establecen un índice para
la clave primaria de una tabla porque anticipan que el acceso a la tabla será más frecuente
a través de la clave primaria. El índice de clave primaria también ayuda al DBMS a
comprobar rápidamente los valores duplicados a medida que se insertan nuevas filas en la
tabla.
Tipos de índices
Algunos productos DBMS soportan dos o más tipos diferentes de índices, que están optimizados para
diferentes tipos de acceso a la base de datos.
Árbol B (B*Tree): es el tipo predeterminado en casi todos los productos de DBMS. Utiliza una estructura
de árbol de entradas de índice y bloques de índice (grupos de entradas de índice) para organizar los
valores de datos que contiene en orden ascendente o descendente. Proporciona una búsqueda eficiente
de un valor único o de un intervalo de valores, como lo es la búsqueda requerida para un operador de
comparación de desigualdad o una operación de prueba de intervalo (between).
En la práctica, los DBMS soportan índices a través de alguna forma de la sentencia create index
mostrada en la figura 1.
Si crea un índice para una tabla y posteriormente decide que no es necesario, la instrucción drop index
elimina el índice de la base de datos. La instrucción elimina el índice creado en el ejemplo anterior:
DROP INDEX ORD_PROD_IDX.
Lección 2 de 6
Para manipular los datos de cualquier base de datos se cuenta con dos operaciones básicas: las de
recuperación y las de inserción o actualización de datos. Para realizar estas operaciones utilizamos el
lenguaje SQL, específicamente el sublenguaje que permite manipular los datos (Data Manipulation
Language).
La sentencia del lenguaje utilizada para la recuperación de datos a partir de la base de datos es la
sentencia select. SQL posee diversos operadores que pueden ser utilizados al escribir una consulta SQL
o select. La sentencia select, además, posee cláusulas que permiten restringir y ordenar el conjunto
resultado, lo que permite presentar el resultado de una consulta según el formato requerido por el usuario
final de la base de datos. SQL también provee la facilidad de invocar funciones, programas que reciben
argumentos y calculan o retornan un valor en la sentencia select. La invocación de funciones brinda
mayor flexibilidad y potencia al lenguaje a la vez que provee un mecanismo de extensión.
Los datos en una base de datos relacional se almacenan en diferentes tablas que se encuentran
relacionadas por valores en común. Utilizando la sentencia select es posible escribir consultas que unen
dos o más tablas relacionadas y presentan la información de manera unificada.
A parte del acceso a datos almacenados en diferentes tablas es posible agregar o agrupar datos según
valores comunes, de esta manera se pueden calcular valores sumarizados a nivel de grupo de filas. La
sentencia select posee una cláusula para especificar el agrupamiento de datos y existen diferentes
funciones de grupo para llevar a cabo cálculos a nivel de grupo. Este tipo de consultas son las que se
denominan agrupadas (Oracle, 2017, https://goo.gl/rEo0gS).
From Tablas
Where Condiciones - Filas Group By {lista De Columnas} Having Condiciones - Grupo Order By {lista
De Columnas}
INSERCIÓN
Un primer aspecto a tener en cuenta en una base de datos, es que debemos tener un modo de insertar
datos para poder poblarla. Veamos entonces las consultas básicas para insertar.
Es posible insertar una nueva fila en una tabla de dos formas distintas:
Para hacer consultas sobre una tabla con el SQL es preciso utilizar la sentencia select from que tiene el
siguiente formato:
La selección es el proceso por el cual elegimos que registros tomamos de una tabla en particular. Esto
se hace a través del where, es opcional ya que si no se escribe indica que queremos todos las tuplas de
una tabla. La proyección es la que nos permite elegir que campos o atributos mostrar de una determinada
tabla, se hace a través del select. Por último pero no menos importante, aparece el from. A través de
esta palabra indicamos sobre qué tabla estamos realizando la consulta. Veamos unos ejemplos.
Si tenemos una tabla clientes (código, nombre, dirección, ciudad) y queremos listar todos los clientes
mostrando todas las columnas simplemente basta con escribir.
Select*
From clientes;
Vemos que con “*” indicamos todas las columnas. Ahora si quisiéramos ver sólo el código del cliente y
el nombre, sería así:
From clientes;
Por último, si quisiéramos sólo ver aquellos códigos de clientes de la ciudad de Buenos Aires, se vería:
Select código
Condiciones y operadores
Para definir las condiciones en la cláusula where podemos utilizar los operadores que dispone SQL.
Operadores lógicos
Operadores de comparación
= Igual
< Menor
> Mayor
<> Distinto
Actualización
Para actualizar los datos, debemos hacer una consulta, incluyendo también una selección de los
mismos. Podemos ver como la estructura de la consulta es similar a la de un SELECT, pero con la
palabra UPDATE. Dentro del SET colocamos los pares columna-valor y en el WHERE restringimos los
registros a actualizar. ¡Pero OJO! Porque si no usamos el WHERE, se actualizarán todas las tuplas de la
tabla.
Eliminación
Finalmente, si queremos eliminar datos usamos la cláusula DELETE. La estructura es muy parecida a la
de la actualización. Luego de “DELETE FROM” ponemos el nombre de la tabla a eliminar los registros y
a continuación una o más restricciones en un WHERE. Nuevamente, es importante tener presente esto,
ya que si no usamos WHERE se eliminarán todos los registros.
Unión
La cláusula union permite unir consultas de dos o más sentencias select from. Su formato es el
siguiente:
Si se utiliza la opción all aparecen todas las filas obtenidas al hacer la unión. No se escribirá esta opción
si se quieren eliminar las filas repetidas. Lo más importante de la unión es que somos nosotros los que
tenemos que vigilar que se haga entre columnas definidas sobre dominios compatibles; es decir, que
tengan la misma interpretación semántica. Como ya se ha dicho, SQL no ofrece herramientas para
asegurar la compatibilidad semántica entre columnas.
La intersección
Para hacer la intersección entre dos o más sentencias select from, se puede utilizar la cláusula
intersect cuyo formato es el siguiente:
Si se utiliza la opción all aparecen todas las filas obtenidas al hacer la intersección. No se escribirá esta
opción si se quieren eliminar las filas repetidas. En la intersección es de suma importancia tener en
cuenta que somos nosotros los que tenemos que vigilar que se aplique entre columnas definidas sobre
dominios compatibles, es decir, que tengan la misma interpretación semántica.
La diferencia
Para encontrar la diferencia entre dos o más sentencias select from podemos utilizar la cláusula except
que tiene este formato:
Si se utiliza la opción all, aparecen todas las filas obtenidas al hacer la diferencia. No se escribirá esta
opción si se quieren eliminar las filas repetidas. Lo más importante de la diferencia es que somos
nosotros los que tenemos que vigilar que se haga entre columnas definidas sobre dominios compatibles.
Verdadero.
Falso.
SUBMIT
A modo resumen la siguiente imagen nos muestra gráficamente cómo se comportan cada una de las
operaciones de conjunto. Esto nos permite saber fácilmente cuál de las operaciones elegir según lo que
precisamos.
Muchas veces queremos consultar datos de más de una tabla haciendo combinaciones de columnas de
tablas diferentes. En SQL es posible listar más de una tabla especificándolo en la cláusula from.
Combinación
La combinación consigue crear una sola tabla a partir de las tablas especificadas en la cláusula from.
Hace coincidir los valores de las columnas relacionadas de estas tablas.
Se quiere saber el NIF, el código y el precio del proyecto que se desarrolla para el cliente número 20:
Tabla 9. Resultado
3 1000000.0 38.123.898-E
Si trabajamos con más de una tabla puede pasar que la tabla resultante tenga dos columnas con el
mismo nombre. Por eso, es obligatorio especificar a qué tabla corresponden las columnas a las que nos
referimos, se nombra la tabla a la que pertenecen antes de ponerlas (por ejemplo, clientes.codigo_cli).
Para simplificarlo se utilizan los alias que, en este caso, se definen en la cláusula from.
Nota: un alias se define automáticamente después de nombrar la
tabla dentro del from (ejemplo from persona p, p es un alias para
persona).
La opción on, además de expresar condiciones con la igualdad en caso de que las columnas que
queremos relacionar tengan nombres diferentes, nos ofrece la posibilidad de expresar condiciones con
los otros operadores de comparación que no sean el de igualdad. También podemos utilizar una misma
tabla dos veces con alias diferentes, para poder distinguirlas.
Combinación natural
La combinación natural (natural join) de dos tablas consiste básicamente en hacer una equicombinación
entre columnas del mismo nombre y eliminar las columnas repetidas. La combinación natural, utilizando
SQL: 1992, se haría de la siguiente manera:
Ejemplo de una combinación natural: se quiere saber el código y el nombre de los empleados que están
asignados al departamento que tiene por teléfono 977.333.852.
Combinación interna y externa
Cualquier combinación puede ser interna o externa. La combinación interna (inner join) solo se queda
con las filas que tienen valores idénticos en las columnas de las tablas que compara. Esto puede hacer
que se pierda alguna fila interesante de alguna de las dos tablas, por ejemplo, porque se encuentra null
en el momento de hacer la combinación. Su formato es el siguiente:
Si no se quiere perder ninguna fila en una tabla determinada se puede hacer una combinación externa
(outer join). Permite obtener todos los valores de la tabla que hemos puesto a la derecha, los valores
de la que hemos puesto a la izquierda o todos los valores de ambas tablas. Su formato es el siguiente:
Combinaciones con más de dos tablas
Si se quieren combinar tres tablas o más sólo hay que añadir todas las tablas en el from y los vínculos
necesarios en el where. Hay que ir haciendo combinaciones por parejas de tablas y la tabla resultante se
convertirá en la primera pareja de la siguiente.
Veamos ejemplos de los dos casos. Supongamos que se quieren combinar tablas empleados, proyectos
y clientes:
o bien:
Resumiendo, podemos ver en la siguiente imagen los diferentes tipos de joins, la estructura que la
consulta SQL debe tener y el resultado gráfico de utilizar ese tipo de unión.
Funciones de agregación
SQL ofrece las siguientes funciones de agregación para efectuar diferentes operaciones con los datos de
una BD.
Función Descripción
En general las funciones de agregación se aplican a una columna, excepto la función de agregación
count que normalmente se aplica a todas las columnas de la tabla o tablas seleccionadas: count (*)
contaría las filas de la tabla o tablas que cumplan las condiciones. Veamos un ejemplo de uso de la
función count que aparece en la cláusula select para hacer la consulta: ¿cuántos departamentos están
ubicados en la ciudad de Lérida?
La respuesta a esta consulta es la siguiente:
Las cláusulas que añadimos a la sentencia select from permiten organizar las filas por grupos:
La cláusula group by nos sirve para agrupar filas según las columnas que indique esta
cláusula.
La cláusula having especifica condiciones de búsqueda para grupos de filas; lleva a cabo
la misma función que antes hacía la cláusula where para las filas de toda la tabla, pero
ahora las condiciones se aplican a los grupos obtenidos.
Consulta con agrupación de filas: se quiere saber el sueldo medio que ganan los empleados de cada
departamento.
Veamos un ejemplo de uso de una función de agregación SUM de SQL que aparece en la cláusula
having de group by: queremos saber los códigos de los proyectos en los cuales la suma de los sueldos
de los empleados es mayor de 180.000 euros;
Nuevamente, antes de mostrar el resultado de esta consulta veamos gráficamente qué grupos se
formarían en este caso.
Tabla 13. Empleados
Consultas ordenadas
Si se quiere que, al hacer una consulta, los datos aparezcan en un orden determinado hay que utilizar la
cláusula order by en la sentencia select que tiene el siguiente formato:
Ejemplo: se quiere consultar los nombres de los empleados ordenados según el sueldo que ganan, y si
ganan el mismo sueldo, ordenados alfabéticamente por el nombre.
Si no se especifica nada más el orden que se seguirá será ascendente pero si se quiere seguir un orden
descendente hay que añadir desc detrás de cada factor de ordenación expresado en la cláusula order
by:
También se puede explicitar un orden ascendente poniendo la palabra clave ASC (opción por defecto).
Lección 3 de 6
Video de habilidades
Es muy importante adquirir práctica en el armado de las consultas y sentencia SQL. La sentencia que
posee más complejidad es el select por eso haremos más hincapié en ella. Tenemos que ser capaces de
poder combinar más de una tabla y saber hacer las agrupaciones o restricciones necesarias.
SUBMIT
Union.
SUM.
AVG.
Count.
Distinct.
SUBMIT
Si deseamos ordenar los datos por una columna en particular debemos escribir
order by (campo por el cual ordenar).
Verdadero.
Falso.
SUBMIT
SUBMIT
Lección 4 de 6
Cierre
Índices y vistas
–
Los índices y las vistas son mecanismos que facilitan el acceso a los datos. Para el caso de los
índices sirven para mejorar la performance de la base de datos ya que son estructuras auxiliares de
rápido acceso. El caso de las vistas nos permite resumir o conjugar diferentes consultas agrupándolas
con un mismo nombre lógico. Veamos la estructura de la consulta SQL y algunos ejemplos.
Selección y proyección
–
La selección es el proceso por el cual elegimos que registros tomamos de una tabla en particular. Esto
se hace a través del where, es opcional ya que si no se escribe indica que queremos todos las tuplas
de una tabla. La proyección es la que nos permite elegir que campos o atributos mostrar de una
determinada tabla, se hace a través del select. Por último pero no menos importante, aparece el from. A
través de esta palabra indicamos sobre qué tabla estamos realizando la consulta.
Lección 5 de 6
Referencias
Programación. (2015) SQL Creación y borrado de vistas Creación de una vista en BDUOC. Recuperado
de https://ayudaparaprogramacion.blogspot.com/2015/07/sql-creacion-y-borrado-de-vistas.html