0% encontró este documento útil (0 votos)
2 vistas24 páginas

Tipos y Creación de SQL en Bases de Datos

Base De Datos - IPP

Cargado por

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

Tipos y Creación de SQL en Bases de Datos

Base De Datos - IPP

Cargado por

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

Módulo 3.

Tipos de SQL

Introducción
En el módulo 3, conoceremos el lenguaje estructurado de consulta (SQL) y cómo este contiene diferentes
lenguajes para la definición (DDL) y manipulación (DML) de los datos. Veremos, además, los diferentes
tipos de datos para luego aprender a crear esquemas, tablas y realizar restricciones. Algunas restricciones
comunes son: las claves, las primarias y foráneas; y la creación de índices. Asimismo, realizaremos
consultas con SQL. Ampliaremos en operaciones como proyección, selección, operadores SQL y
operaciones de conjunto. Por último, veremos consultas con uniones (joins) de tablas, tipos de uniones
existentes y consultas agrupadas, funciones de grupo y ordenamiento.

Video de inmersión

Unidad 1. Creación de estructura (DDL)


Tema 1. Introducción. Tipos de datos SQL
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
cómo 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; en el segundo artículo se ve
más en detalle la historia del lenguaje.>>

Fuente: Alarcón, J. (2014). Tutorial SQL 1 - Qué es SQL, por qué aprenderlo y preparación del entorno de
aprendizaje. Campus MVP. [Link]
Fuente: Piattini Velthuis, M. (1994). Situación actual de los estándares SQL3 y SQL/MM. Computerworld.
[Link]
Tipos de datos en SQL
Las bases de datos almacenan datos mediante registros, pueden ser distintos en sus características,
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 cuál nos conviene más y, para eso, debemos 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 presentes, precisamente, 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:

Tabla 1: Tipos de datos genéricos en SQL

Alfanuméricos Contienen cifras y letras. Presentan una longitud limitada (varchar,


varchar2, text). En general, son similares, pero pueden variar en cada
DBMS.

Numéricos Existen de varios tipos, principalmente, enteros (sin decimales) y reales


(con decimales).
Algunos ejemplos son short, int, bigint, decimal.

Booleanos Poseen dos formas: verdadero y falso (sí o no). Boolean.

Fechas Almacenan fechas, esto facilita posteriormente su explotación. Por lo


general, los DBMS también incorporan funciones para manipular
fechas, comparar y obtener un valor particular (día, mes, año).

Memos Son campos alfanuméricos de longitud ilimitada. Presentan el


inconveniente de no poder ser indexados (veremos más adelante lo que
esto quiere decir).

Autoincrementales Son campos numéricos enteros que incrementan en una unidad (o más)
su valor para cada registro incorporado. Su principal utilidad es la de
identificador, ya que resultan exclusivos de un registro.
Fuente: elaboración propia.

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.
Tabla 2: Tipos de datos en Postgre SQL

Tipos de datos del estándar SQL3 en Postgre SQL

Tipo en Correspondiente en SQL3 Descripción


Postgres

Bool Boolean Valor lógico o booleano (true/false)

char(n) character(n) Cadena de caracteres de tamaño fijo

Date Date Fecha (sin hora)

float4/8 float(86#86) Número de punto flotante con precisión 86#86

float8 real, double precisión Número de punto flotante de doble precisión

int2 Smallint Entero de dos bytes con signo

int4 int, integer Entero de cuatro bytes con signo

int4 decimal(87#87) Número exacto con 88#88

int4 numeric(87#87) Número exacto con 89#89

money decimal(9,2) Cantidad monetaria

time time Hora en horas, minutos, segundos y centésimas

Time stamp Interval Intervalo de tiempo

timestamp timestamp with time zone Fecha y hora con zonificación

varchar(n) character varying(n) Cadena de caracteres de tamaño variable

Fuente: elaboración propia.

Tema 2. Creación y relaciones entre tablas


Tablas
La estructura más elemental de almacenamiento en un sistema de administración de base de datos (DBMS)
es la tabla.

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.

Columna: 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, esto no es relevante a la hora de recuperar los datos
de una tabla.
Fila: 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.

Campo: 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.
Esquema y/o base de datos
Para crear nuestras tablas, primero tendremos que hacer un esquema de base de datos y, teniendo en
cuenta el motor utilizado, cada esquema puede tener varias bases de datos. Previo a las tablas, veamos las
sentencias necesarias para crear el esquema.

CREATE SCHEMA {<nombre_esquema>|AUTHORIZATION<usuario>} [<lista_elementos_esquema>];

La nomenclatura utilizada en esta sentencia y, de aquí en adelante, es la siguiente:

Las palabras en negrita son palabras reservadas del lenguaje.


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. (Dataprix, 22 de septiembre
de 2009 B, [Link]
La notación <A> quiere decir que A es un elemento pendiente de definición.

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:

CREATE TABLE <nombre_tabla> ( <definición_columna>


[, <definición_columna>...] [, <restricciones_tabla>]
);

Donde la definición de columna es:

<nombre_columna>{<tipo_datos>|<dominio>} [<def_defecto>] [<restricciones_columna>]

El proceso que hay que seguir para crear una tabla es el siguiente:

1. Decidir el nombre de la tabla (nombre tabla).


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 pueden dar definiciones por defecto y restricciones de columna.
4. Una vez definidas las columnas, solo habrá que dar las restricciones de tabla. (Dataprix, 22 de
septiembre de 2009 A, [Link]
Si queremos crear una tabla para almacenar los empleados de una empresa, donde cada empleado tiene
que tener, obligatoriamente, un DNI y fecha de ingreso y, opcionalmente, se almacenará su nombre, su
apellido y su edad, podríamos tener la siguiente sentencia SQL.

CREATE TABLE EMPLEADO (


DNI CHAR(12) NOT NULL,
NOMBRE CHAR(50),
APELLIDO CHAR(50),
EDAD INT,
FECHA_INGRESO TIMESTAMP NOT NULL
);

Las columnas que no pueden tener valores nulos se indican 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 encontrás a
continuación. (Dataprix, 15 de junio de 2009, [Link]

Tabla 3: Restricciones de columna

Restricciones de columna

Restricción Descripción

Not null La columna no puede tener valores


nulos.

La columna no puede tener valores


repetidos. Es una clave alternativa.
Unique

La columna no puede tener valores


repetidos ni nulos. Es la clave
Primary key primaria.

References La columna es la clave foránea de la


<nombre_tabla> columna de la tabla especificada.
[(<nombre_columna>)]

Constraint [<nombre_restricción>] La columna tiene que cumplir las


Check (<condiciones>) condiciones especificadas.
Fuente: elaboración propia con base en Dataprix, 15 de junio de 2009.

Tema 3. Claves primarias, secundarias y foráneas


Clave primaria: 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.

Clave foránea: 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 que, dado un nombre, definido un dominio e impuestas 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:

Tabla 4: Restricciones de tabla

Restricciones de tabla

Restricción Descripción

Unique (<nombre_columna> [, El conjunto de las columnas especificadas no


<nombre_columna>...]) puede tener valores repetidos. Es una clave
alternativa.

Primary key (<nombre_columna> [, El conjunto de las columnas especificadas no


<nombre_columna>...]) puede tener valores nulos ni repetidos. Es
una clave primaria.

Foreing key (<nombre_columna>[, El conjunto de las columnas especificadas es


<nombre_columna>...]) una clave foránea que referencia la clave
References<nombre_tabla> primaria formada por el conjunto de las
[(<nombre_columna2> columnas 2 de la tabla dada. Si las columnas
[, <nombre_columna2>...])] y las columnas 2 se llaman exactamente
igual, entonces no habría que poner
columnas 2.

Constraint[<nombre_restricción>] La tabla tiene que cumplir las condiciones


Check(<condiciones>) especificadas.
Fuente: elaboración propia con base en Dataprix, 15 de junio de 2009.

Tema 3. Índices y vistas


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.

CREATEVIEW<nombre_vista>[(lista_columnas)]AS(consulta) [WITH CHECKOPTION];

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). La no-existencia real de las vistas hace que puedan ser actualizables o no.

Creamos una vista que dé, por ejemplo, para cada cliente el número de proyectos que tiene
encargados el cliente. (Dataprix, 15 de junio de 2009, [Link]

CREATEVIEWproyectos_por_cliente(codigo_cli, numero_proyectos) AS (SELECT c.codigo_cli,


COUNT(*)
FROM proyectos p, clientes c
WHERE p.codigo_cliente = c.codigo_cli GROUP BY c.codigo_cli);

Más adelante detallaremos, pero vemos en esta vista varios componentes nuevos. La consulta propiamente
dicha (SELECT) 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

Clientes

codigo_cli nombre_cli Nif dirección ciudad teléfono

10 ECIGSA 38.567.893- Aragón Barcelona NULL


C 11

20 CME 38.123.898- Valencia Gerona [Link]


E 22

30 ACME 36.432.127- Mallorca Lérida [Link]


A 33
Fuente: elaboración propia con base en Programación, 1 de julio de 2015, [Link]

Tabla 6: Proyectos

Proyectos

codigo_proy nombre_proy precio fecha_inicio fecha_prev_fin fecha_fin codigo_cliente

1 GESCOM 1,0E+6 1-1-98 1-1-99 NULL 10


2 PESCI 2,0E+6 1-10-96 31-3-98 1-5-98 10

3 SALSA 1,0E+6 10-2-98 1-2-99 NULL 20

4 TINELL 4,0E+6 1-1-97 1-12-99 NULL 30


Fuente: elaboración propia con base en Programación, 2015, [Link]

Y si mirásemos la extensión de la vista Proyectos por clientes, veríamos lo que encontramos en la siguiente
tabla.

Tabla 7: Proyectos por clientes

proyectos_por_clientes

codigo_cli numero_proyectos

10 2

20 1

30 1
Fuente: elaboración propia.

Í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 desde el 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 (o rowid) 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, s. f. B, p. 22).

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,
podemos 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.

Clave foránea: un índice de columnas de clave foránea, a menudo, puede mejorar el rendimiento de las
combinaciones.

Restricción de unicidad: la mayoría de los productos DBMS también establece automáticamente un índice
para cualquier columna (o combinación de columnas) definido con una restricción de unicidad. Al igual que
con la clave primaria, el DBMS debe comprobar el valor de dicha columna en cualquier nueva fila que se
desee insertar o en cualquier actualización de una fila existente para asegurarse de que el valor no duplique
un valor ya contenido en la tabla. Sin un índice en la (s) columna (s), el DBMS tendría que buscar
secuencialmente en cada fila de la tabla para verificar la restricción. Con un índice, el DBMS puede,
simplemente, usar el índice para encontrar una fila (si existe) con el valor en cuestión, una operación mucho
más rápida que una búsqueda secuencial.

Desventajas de los índices:

Consumen espacio adicional en disco.

Deben actualizarse cada vez que se agrega una fila a la tabla. Imponen una sobrecarga adicional en
inserts y updates.

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).

La sentencia asigna un nombre al índice y especifica la tabla para la que se crea el índice. La sentencia
también especifica las columnas que se van a indexar y si deben ser indexadas en orden ascendente o
descendente. Veamos unos ejemplos de creación de índices:

Una columna indexada: crea un índice único para la tabla offices.


CREATE UNIQUE INDEX OFC_MGR_IDX ON OFFICES (MGR);
Dos columnas indexadas: crea un índice para la tabla orders.
CREATE INDEX ORD_PROD_IDX ON ORDERS (MFR, PRODUCT);

Si creamos un índice para una tabla y, posteriormente, decidimos 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.
Unidad 2. Consultas y manipulación de datos (DML)
Para manipular los datos de cualquier base de datos contamos 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 es 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 unan dos o más tablas relacionadas y presenten la información de manera unificada.

Aparte 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, s. f. A, p. 1)
Estructura de una consulta:

Select {lista De Columnas}


From Tablas
Where Condiciones - Filas Group By {lista De Columnas} Having Condiciones - Grupo Order By {lista De
Columnas}

Todas las palabras marcadas en negrita son reservadas del lenguaje SQL y el orden que se ve es el
que debemos seguir al momento de crear nuestras consultas.
Tema 1. Selección y proyección
Para hacer consultas sobre una tabla con el SQL es preciso utilizar la sentencia SELECT FROM, que tiene
el siguiente formato:

SELECTnombre_columna_a_seleccionar [,nombre_columna_a_seleccionar...]
FROM tabla_a_consultar
WHERE restricciones;

La selección es el proceso por el cual elegimos qué 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 qué 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 solo el código del cliente y el
nombre, sería así:

Select código, nombre


From clientes;

Por último, si quisiéramos solo ver aquellos códigos de clientes de la ciudad de Buenos Aires, se vería:

Select código
From clientes Where ciudad = “Buenos Aires”.
Condiciones y operadores
Para definir las condiciones en la cláusula where, podemos utilizar los operadores que dispone SQL.

Tablas 8 y 9: Condiciones y operadores

Operadores lógicos

Not Para la negación de condiciones

And Para la conjunción de condiciones

Or Para la disyunción de condiciones

Operadores de comparación

= Igual

< Menor

> Mayor

<= Menor o igual

>= Mayor o igual

<> Distinto

Fuente: elaboración propia.

Tema 2. Operaciones de conjuntos


Las operaciones de conjuntos son operaciones derivadas de la matemática de conjuntos. Existen múltiples
operaciones de conjunto. En este tema, veremos que SQL reserva una palabra en particular, la unión,
intersección y diferencia. En el próximo tema, veremos las reuniones (del inglés join) que se llevan a cabo
entre diferentes tablas. Las desarrolladas a continuación tienen como condición necesaria que ambos
conjuntos posean la misma cantidad y el mismo tipo de columnas.
Unión
La cláusula UNION permite unir consultas de dos o más sentencias SELECT FROM. Su formato es el
siguiente:

SELECT <nombre_columnas>
FROM <tabla>
[WHERE <condiciones>]
UNION [ALL]
SELECT <nombre_columnas>
FROM <tabla>
[WHERE <condiciones>];

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:

SELECT <nombre_columnas>
FROM <tabla>
[WHERE <condiciones>]
INTERSECT [ALL]
SELECT <nombre_columnas>
FROM <tabla>
[WHERE <condiciones>];

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:

SELECT <nombre_columnas>
FROM <tabla>
[WHERE <condiciones>]
EXCEPT [ALL]
SELECT <nombre_columnas>
FROM <tabla>
[WHERE <condiciones>];

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.

Actividades de repaso
En las operaciones de conjunto, las columnas de los conjuntos con las que se va
a operar deben ser las mismas.

Verdadero

Falso

Justificación

Tema 3. Uniones entre tablas (joins)


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. (Dataprix, 21 de
septiembre de 2009, [Link]
Ejemplo de una combinación (join):

Se quiere saber el NIF, el código y el precio del proyecto que se desarrolla para el cliente número 20:

SELECT proyectos.codigo_proy, [Link], [Link] FROM clientes, proyectos


WHERE clientes.codigo_cli = proyectos.codigo_cliente AND clientes.codigo_cli = 20;

El resultado sería el siguiente:

Tabla 10: Resultado

proyectos.codigo_proy [Link] [Link]

3 1000000.0 38.123.898-E
Fuente: elaboración propia.

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. (Escofet, 2013, pp. 39-
40)

SELECT <nombre_columnas_seleccionar>FROM <tabla1>NATURAL JOIN <tabla2> [WHERE


<condiciones>];

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.

SELECT codigo_empl,nombre_empl
FROM empleados NATURAL JOIN departamentos WHERE telefono ="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. (Escofet,
2013, p. 41)

SELECT <nombre_columnas_seleccionar>
FROM <tabla1> [NATURAL] [INNER] JOIN <tabla2>
{ON <condiciones>|
USING (<nombre_columna> [,<nombre_columna>...])} [WHERE <condiciones>];

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. (Escofet, 2013, p. 41)
SELECT <nombre_columnas_seleccionar>
FROM <tabla1> [NATURAL] {LEFT|RIGHT|FULL} [OUTER] JOIN <tabla2>
{ON <condiciones>|
USING (<nombre_columna> [,<nombre_columna>...])} [WHERE <condiciones>];

Combinaciones con más de dos tablas


Si se quiere combinar tres tablas o más, solo 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 quiere combinar tablas Empleados, Proyectos y
Clientes. (Escofet, 2013, p. 43)

SELECT *
FROM empleados, proyectos, clientes
WHERE num_proy = codigo_proy AND codigo_cliente = codigo_cli;

o bien:

SELECT *
FROM (empleados JOIN proyectos ON num_proy = codigo_proy) JOIN clientes ON codigo_cliente =
codigo_cli;

Tema 4. Consultas agrupadas y/o ordenadas


Funciones de agregación
SQL ofrece las siguientes funciones de agregación para efectuar diferentes operaciones con los datos de
una BD.

Tabla 11: Funciones de agregación

Funciones de agregación

Función Descripción

Count Nos da el número total de filas seleccionadas

Sum Suma los valores de una columna

Min Nos da el valor mínimo de una columna

Max Nos da el valor máximo de una columna

AVG Calcula la media de una columna

Fuente: elaboración propia con base en Escofet, 2013, p. 30.

SELECT COUNT(*) AS numero_dpt FROM departamentos


WHERE ciudad_dpt = "Lerida";

La respuesta a esta consulta es la siguiente:


numero_dept

Consultas con agrupación de filas de una tabla

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.

Presenta el siguiente formato:

SELECT <nombre_columnas_seleccionar>
FROM <tabla_consultar> [WHERE <condiciones>]

GROUP BY <columnas_según_las_que_agrupar> [HAVING <condiciones_por_grupos>]


[ORDER BY <nombre_columna> [DESC][, <nombre_columna> [DESC]...]];

Prestemos especial atención a que, en las sentencias SQL, se van añadiendo cláusulas a medida que la
dificultad o la exigencia de la consulta lo requiere.

Consulta con agrupación de filas: se quiere saber el sueldo medio que ganan los empleados de cada
departamento.

SELECT nombre_dpt, ciudad_dpt, AVG(sueldo) AS sueldo_medio FROM empleados


GROUP BY nombre_dpt, ciudad_dpt;

La cláusula GROUP BY podríamos decir que empaqueta a los empleados de la tabla Empleados según el
departamento en que están asignados. En la siguiente figura, podemos ver los grupos que se formarían
después de agrupar.

Tabla 12: Empleados


Fuente: Escofet, 2013, p. 36.

Y así, con la agrupación anterior, es sencillo obtener el resultado de esta consulta.

Tabla 13: Resultados

nombre_dpt ciudad_dpt sueldo_medio

DIR Gerona 100000.0

DIR Barcelona 90000.0

DIS Lérida 70000.0

DIS Barcelona 70000.0

PROG Tarragona 33000.0

NULL NULL 40000.0

Fuente: elaboración propia con base en Escofet, 2013.

Ejemplo de uso de la función de agregación SUM


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.

SELECT num_proy FROM empleados GROUP BY num_proy


HAVING SUM(sueldo)>180000.0;

Nuevamente, antes de mostrar el resultado de esta consulta, veamos gráficamente qué grupos se formarían
en este caso:

Tabla 14: Empleados


Fuente: Escofet, 2013, p. 27.

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.

SELECT <nombre_columnas_seleccionar>
FROM <tabla_consultar> [WHERE <condiciones>]
ORDER BY <nombre_columna_según_la_que_ordenar> [DESC]
[, <nombre_columna_según_la_que_ordenar> [DESC]...];

SELECT codigo_empl, nombre_empl, apellido_empl, sueldo FROM empleados


ORDER BY sueldo, nombre_empl;

Esta consulta daría la siguiente respuesta:

Tabla 15: Resultados

codigo_empl nombre_empl apellido_empl sueldo

6 Laura Tort 30000.0

8 Sergio Grau 30000.0

5 Clara Blanc 40000.0

7 Roger Salt 40000.0

3 Ana Ros 70000.0

4 Jorge Roca 70000.0

2 Pedro Mas 90000.0

1 María Puig 10000.0


Fuente: elaboración propia.

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).

ORDER BY <nombre_columna> [DESC][, <nombre_columna> [DESC]...];

Video de habilidades
Fuente: Gabriela Flores. (2013). Algebra Relacional (proyección). [Video de YouTube]. Recuperado de [Link]

Debemos lograr llevar las operaciones de conjunto o del álgebra relacional al plano de la información que se
almacena en la base de datos con el fin de poder cruzar y organizar la información. Las bases de datos
basan todas sus operaciones en álgebra relacional.

La proyección no permite eliminar atributos.

Verdadero

Falso

Justificación

La proyección brinda un subconjunto horizontal de los atributos de la relación.

Verdadero

Falso

Justificación

¿Qué operación restringe de manera horizontal o a nivel de filas o registros?

Unión

Producto cartesiano

Selección

Diferencia

Proyección

Justificación
No es posible combinar dos operaciones del álgebra relacional.

Verdadero

Falso

Justificación

La operación que combina todas las tuplas de la relación T con cada una de las
tuplas de la relación R es:

Producto cartesiano

Unión (a)

Justificación

Fuente: Merche Marqués Andrés. (2014). Consultas en SQL: SELECT, FROM, WHERE. [Video de YouTube]. Recuperado de
[Link]

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.

Si deseo buscar la materia administración de redes ¿qué sentencia debo escribir y


mostrar todos los campos de la tabla?

Select * from clases where materia = ‘administracion de redes’

Select * clases where materia = ‘administracion de redes’

* from clases where materia = ‘administracion de redes’

¿Qué sentencia me permite eliminar las filas duplicadas?

Distinct

Union

Sum

Avg

Count

Justificación
Si deseamos ordenar los datos por una columna en particular ¿debemos escribir
Order by (campo por el cual ordenar)?

Verdadero

Falso

Justificación

Escribe una sentencia que muestre todas las materias de programación,


mostrando como resultado solo la columna materia

Select materia from clases where materia like ‘programacion%’

Select materia from clases where materia like

Select materia ‘programacion%’

Escribe una sentencia que muestre la materia elaboración de texto avanzado y la


materia manejo de db, mostrando como resultado todas las columnas de la tabla
clases.

Select * from clases where materia = ‘elaboración de texto avanzado’ or materia = ‘manejo de
db’

Select * from clases where materia = ‘elaboración de texto avanzado’ or materia

elaboración de texto avanzado’ or materia = ‘manejo de db’

Microactividades
Para realizar los ejercicios, recordemos leer el Manual de uso de PostgreSQL:

Al final de este apartado, encontraremos un archivo descargable con las respuestas de cada ejercicio. Estas
respuestas te van a servir como guía para que revises si realizaste correctamente los ejercicios.

Introducción
Si utilizamos pgAdmin, todas las tablas, datos, funciones, procedimientos almacenados y triggers, serán
guardados en la computadora. De esta forma, podremos acceder a ellos, indiferentemente si cerramos el
programa o reiniciamos el sistema.
En el caso de utilizar la herramienta online, deberemos guardar las consultas que vayamos realizando. Esto
sucede porque al cerrar el navegador se perderán todos los datos y se deberán copiar, pegar y ejecutar las
consultas que ya habías ejecutado. De tal manera, podremos avanzar en los próximos ejercicios sin
necesidad de volver a escribirlas una a una nuevamente.

Situación
En el recorrido de todos los ejercicios vamos a tener que crear y trabajar sobre un sistema para una
universidad.

Desde la universidad Puls-ar nos solicitan llevar el registro de los alumnos y las materias que ellos cursan.
Cuando los alumnos se inscriben se les pide su DNI, nombre, apellido e e-mail.

Dados de alta en la universidad, ellos ya están en condiciones de anotarse a las materias disponibles,
teniendo en cuenta que las materias tienen un nombre y un año de cursado.

Requerimientos
Utilización de la plataforma PostgreSQL.

Enunciados
Ejercicio 3.1

Obtengamos la cantidad de alumnos que cursan Física 1.

Tabla 16. Cantidad

Fuente: elaboración propia

Ejercicio 3.2

Obtengamos un listado con la cantidad de alumnos inscriptos a cada materia. Ordenemos por nombre de
materia ascendente y año de cursado ascendente.

Tabla 17. Materia y año de cursado


Fuente: elaboración propia

Ejercicio 3.3

Modifiquemos la tabla alumnos de forma tal que ahora el campo e-mail admita hasta 80 caracteres.

Ejercicio 3.4

De la consulta obtenida anteriormente, creemos una vista llamada alumnos_cantidad_materias.


Posteriormente, utilicémosla para obtener solo las materias donde haya más de un (1) inscripto.

Tabla 18. Nombre, año, cantidad

Fuente: elaboración propia

Ejercicio 3.5

Creemos la función cantidad_inscriptos. Al momento de pasar el identificador de materia, retomemos la


cantidad de inscriptos en ella (el valor de retorno debe ser del tipo de datos bigint, ya que en algún momento
es posible tener muchos alumnos inscriptos a una materia).

Ejemplo de resolución

Glosario
Referencias
Dataprix. (15 de junio de 2009). El lenguaje SQL. [Link]

Dataprix. (21 de septiembre de 2009). Consultas de más de una tabla. [Link]


datos-master-software-libre-uoc/256-consultas-mas-una-tabla

Dataprix. (22 de septiembre de 2009 A). Creación de tablas.


[Link]

Dataprix. (22 de septiembre de 2009 B). Creación y borrador de una base de datos relacional.
[Link]
relacional

Escofet, M. (2013). El lenguaje SQL.


[Link]
enguaje%[Link]

Oracle. (s. f. A). Bloque de consulta básico. [Link]

Oracle. (s. f. B). Objetos de bases de datos. [Link]

Programación. (1 de julio de 2015). SQL creación y borrado de vistas. Creación de una vista en BDUOC.
[Link]

También podría gustarte