Está en la página 1de 51

Consultas avanzadas

Con PostgreSQL
Clave compuesta

Definimos una clave compuesta cuando ningún campo por si


solo cumple con la condición para ser clave.

En este ejemplo, un auto puede ingresar varias veces en un


día a la playa de estacionamiento , pero siempre será a
distinta hora.

Usamos 2 campos como clave, la patente junto con la hora de


llegada, así identificamos unívocamente cada registro.
Clave primaria compuesta
Para establecer más de un campo como clave primaria usamos la
siguiente sintaxis:

create table vehiculos(

placa char(6) not null,

tipo char(1),--'a'=auto, 'm'=moto

horallegada time,

horasalida time,

primary key(placa,horallegada)

);

Nombramos los campos que formarán parte de la clave separados por


comas.
Clave foranea
Con la restricción "foreign key" se define un campo (o varios)
cuyos valores coinciden con la clave primaria de la misma
tabla o de otra, es decir, se define una referencia a un campo
con una restricción "primary key" o "unique" de la misma tabla
o de otra.

La integridad referencial asegura que se mantengan las


referencias entre las claves primarias y las externas. Por
ejemplo, controla que si se agrega un código de editorial en la
tabla "libros", tal código exista en la tabla "editoriales".
Clave foráneas
También controla que no pueda eliminarse un registro de una
tabla ni modificar la clave primaria si una clave externa hace
referencia al registro. Por ejemplo, que no se pueda eliminar
o modificar un código de "editoriales" si existen libros con
dicho código.
Clave foráneas
La siguiente es la sintaxis parcial general para agregar una
restricción "foreign key":
alter table NOMBRETABLA1 add constraint NOMBRE
RESTRICCION foreign key (CAMPO CLAVE FORANEA)
references NOMBRE TABLA2 (CAMPO CLAVE PRIMARIA);
Clave foranea
create table editoriales(
codigo integer primary key,
nombre text
);
create table libros(
codigo integer primary key,
titulo text,
autor text,
Codigoeditorial integer

foreign key (codigoeditorial) references editoriales(codigo)


);
Clave foráneas
Una tabla puede tener varias restricciones "foreign key".

No se puede eliminar una tabla referenciada en una


restricción "foreign key", aparece un mensaje de error.

Una restriccion "foreign key" no puede modificarse, debe


eliminarse y volverse a crear.
Definición de clave primaria y foránea

La cláusula FOREIGN KEY especifica una clave foránea en la


tabla y la relación que crea con otra tabla (padre) de la base de
datos.

La cláusula especifica:

 La columna o columnas que forman la clave foránea, todas las


cuales son columnas de la tabla que está siendo creada.

 La tabla que es referenciada por la clave foránea. Esta es la


tabla padre en la relación, la tabla que está siendo definida es el
hijo.
Definición de clave primaria y foránea

 Un nombre opcional para la relación. El nombre no se utiliza en


ninguna sentencia SQL, pero puede aparecer en mensajes de
error y es necesario si se desea poder suprimir la clave foránea
posteriormente.

 Una regla de supresión opcional para la relación (RESTRICT,


CASCADE o SET NULL). Si no se especifica la regla de supresión
se utiliza por defecto la regla RESTRICT.
Definición de clave primaria y foránea

Las reglas de supresión especifican qué debe hacer cuando un


usuario trate de suprimir una fila de la tabla padre. Si la regla de
supresión es RESTRICT se impide suprimir una fila de la tabla padre
si la fila tiene algún hijo. La regla de supresión CASCADE indica que
si se suprime una fila padre, todas las filas hijo también sean
suprimidas, con lo cual la supresión en la tabla padre se propaga a
las tablas hijo. Por último, la regla SET NULL indica que cuando una
fila padre sea suprimida, los valores de clave foránea de todas las
filas hijo deben ser automáticamente puestas a NULL.
Definición de clave primaria y foránea

Su sintaxis es:

alter table TABLA1 add constraint NOMBRERESTRICCION

foreign key (CAMPOCLAVEFORANEA)

references TABLA2(CAMPOCLAVEPRIMARIA)

on delete OPCION

on update OPCION;
Definición de clave primaria y foránea
consultas

 ¿Qué es una consulta en la base de datos?

 Las consultas son una forma de buscar y recopilar


información de una o más tablas para conseguir información
detallada de una base de datos. Al crear una consulta en
Postgres, defines condiciones específicas de búsqueda para
encontrar, exactamente la información que deseas.
consultas

 SQL es un lenguaje de consulta estructurada (Structured


Query Language), que permite realizar consultas para
recuperar información de bases de datos y a su vez hacer todo
clase de modificaciones y operaciones sobre las mismas bases
de datos
Unión de tablas

Esta operación se utiliza cuando tenemos dos tablas con las


La unión de tablas

mismas columnas y queremos obtener una nueva tabla con las


filas de la primera y las filas de la segunda. En este caso la tabla
resultante tiene las mismas columnas que la primera tabla (que
son las mismas que las de la segunda tabla).
Unión de tablas

 Por ejemplo tenemos una tabla de libros nuevos y una tabla de


La unión de tablas

libros antiguos y queremos una lista con todos los libros que
tenemos. En este caso las dos tablas tienen las mismas
columnas, lo único que varía son las filas, además queremos
obtener una lista de libros (las columnas de una de las tablas) con
las filas que están tanto en libros nuevos como las que están en
libros antiguos, en este caso utilizaremos este tipo de operación.
Unión de tablas

La unión de tablas
Unión de tablas
El operador UNION sirve para obtener a partir de dos tablas con las mismas
columnas, una nueva tabla con las filas de la primera y las filas de la segunda.

La sintaxis es la siguiente: La unión de tablas

SELECT idfab,idproducto
FROM productos
WHERE existencias = 0
UNION ALL
SELECT fab,producto
FROM pedidos
WHERE year(fechapedido) = 1990
ORDER BY idproducto 
Unión de tablas

El operador "union" combina el resultado de dos o más


instrucciones "select" en un único resultado. Se usa cuando los
datos que se quieren obtener pertenecen a distintas tablas y no
se puede acceder a ellos con una sola consulta.

Es necesario que las tablas referenciadas tengan tipos de datos


similares, la misma cantidad de campos y el mismo orden de
campos en la lista de selección de cada consulta.
Unión de tablas
Se deben especificar los nombres de los campos en la primera instrucción "select".

select nombre, domicilio from alumnos

union

select nombre, domicilio from profesores;

El primer "select" devuelve el nombre y domicilio de todos los alumnos; el segundo, el


nombre y domicilio de todos los profesores.

Los encabezados del resultado de una unión son los que se especifican en el primer
"select".
Unión de tablas
Note que existe un profesor que también está presente en la tabla
"alumnos"; dicho registro aparece una sola vez en el resultado de
"union". Si queremos que las filas duplicadas aparezcan, debemos
emplear "all":

select nombre, domicilio from alumnos

union all

select nombre, domicilio from profesores;


Unión de tablas
Puede emplear la cláusula "order by".

Ordenamos por domicilio:

select nombre, domicilio from alumnos

union

select nombre, domicilio from profesores

order by domicilio;
Unión de tablas
Podemos agregar una columna extra a la consulta con el encabezado
"condicion" en la que aparezca el literal "profesor" o "alumno" según si
la persona es uno u otro:

select nombre, domicilio, 'alumno' as condición from alumnos

union

select nombre, domicilio,'profesor'


Ejempos con Unión de tablas

 El supermercado quiere enviar una tarjeta de salutación a todos los


proveedores, clientes y empleados y necesita el nombre y domicilio
de todos ellos. Emplee el operador "union" para obtener dicha
información de las tres tablas.

  Agregue una columna con un literal para indicar si es un


proveedor, un cliente o un empleado y ordene por dicha columna.
Limit y offset
 Las cláusulas "limit" y "offset" se usan para restringir los registros
que se retornan en una consulta "select".

 La cláusula limit recibe un argumento numérico positivo que


La unión indica
de tablas

el número máximo de registros a retornar.

 El número de registro inicial es 0 (no 1).

 La cláusula offset indica el número del primer registro a retornar.

 Si el limit supera la cantidad de registros de la tabla, se limita hasta


el último registro.
Limit y offset
Ejemplo:
select * from libros limit 4 offset 0;

La unión de tablas
Muestra los primeros 4 registros, 0,1,2 y 3.

Si tipeamos:

select * from libros limit 4 offset 5;

recuperamos 4 registros, desde el 5 al 8.


Limit y offset
Si se coloca solo la cláusula limit retorna tantos registros como el
valor indicado, comenzando desde 0.
Ejemplo: La unión de tablas

select * from libros limit 8;

Muestra los primeros 3 registros.


Es conveniente utilizar la cláusula order by cuando utilizamos limit y
offset, por ejemplo:

select * from libros order by codigo limit 3;


Funciones matemáticas
trunc(x): Retorna la parte entera del parámetro. Ejemplo:

select trunc(34.7);

retorna "34".
La unión de tablas

trunc(x,decimales): Retorna la parte entera del parámetro y la


parte decimal truncando hasta el valor indicado en el segundo
parámetro. Ejemplo:
select trunc(34.7777,2);

retorna "34.77".
Funciones matemáticas

round(numero): retorna un número redondeado al valor más


próximo. La unión de tablas

Ejemplo:
select round(10.4);
retorna "10
Funciones para el manejo de cadenas

upper(string): Retorna el texto convertido a mayúsculas.


Ejemplo:
select upper('Hola');
La unión de tablas

retorna 'HOLA'.

lower(string): Retorna el texto convertido a minúsculas.


Ejemplo:
select lower('Hola');
retorna 'hola'.
Funciones para el manejo de cadenas

substring(string [from int] [for int]): Retorna un substring, le indicamos


la posición inicial y la cantidad de caracteres a extraer desde dicha
La unión de tablas

posición.
Ejemplo:
select substring('Hola Mundo' from 1 for 2);

retorna 'Ho’.

select substring('Hola Mundo' from 6 for 5);


Composiciones

Existen distintos tipos de composición, aprenderemos a utilizarlos


todos y a elegir el tipo más apropiado a cada caso. La unión de tablas

Los tipos de composición de tablas son:

 El producto cartesiano

 El INNER JOIN (JOIN)

 El LEFT / RIGHT JOIN


Producto cartesiano de tablas
El producto cartesiano

El producto cartesiano es un tipo de composición de tablas, aplicando el


producto cartesiano a dos tablas se obtiene una tabla con las columnas de
La unión de tablas

la primera tabla unidas a las columnas de la segunda tabla, y las filas de la


tabla resultante son todas las posibles concatenaciones de filas de
la primera tabla con filas de la segunda tabla. 

El producto cartesiano se indica poniendo en la FROM las tablas que


queremos componer separadas por comas, podemos obtener así el
producto cartesiano de dos, tres, o más tablas. 
Producto cartesiano de tablas
Esta operación no es de las más utilizadas, normalmente cuando
queremos componer dos tablas es para añadir a las filas de una
tabla, una fila de la otra tabla, por ejemplo añadir a los pedidos los
La unión de tablas

datos del cliente correspondiente, o los datos del representante,


esto equivaldría a un producto cartesiano con una selección de
filas: 

SELECT *
FROM pedidos,clientes
WHERE pedidos.clie=clientes.numclie
Producto cartesiano de tablas
Las columnas que aparecen en la cláusula WHERE de nuestra consulta
anterior se denominan columnas de emparejamiento ya que permiten
emparejar las filas de las dos tablas. Las columnas de emparejamiento
La unión de tablas

no tienen por qué estar incluidas en la lista de selección.

Normalmente emparejamos tablas que están relacionadas entre sí y


una de las columnas de emparejamiento es clave principal, pues en
este caso, cuando una de las columnas de emparejamiento tienen
un índice definido es más eficiente utilizar otro tipo de composición,
el INNER JOIN.
Producto cartesiano de tablas

La unión de tablas
Cláusula INNER JOIN de tablas
El INNER JOIN es otro tipo de composición de tablas, permite emparejar filas de

distintas tablas de forma más eficiente que con el producto

cartesiano cuando una de las columnas de emparejamiento está indexada. Ya


La unión de tablas

que en vez de hacer el producto cartesiano completo y luego seleccionar la filas

que cumplen la condición de emparejamiento, para cada fila de una de las

tablas busca directamente en la otra tabla las filas que cumplen la condición, con

lo cual se emparejan sólo las filas que luego aparecen en el resultado.

La sintaxis es la siguiente: 

SELECT *

FROM pedidos INNER JOIN clientes ON pedidos.clie= clientes.numclie


Cláusula INNER JOIN de tablas

La unión de tablas
Cláusula INNER JOIN de tablas
Se pueden definir varias condiciones de
emparejamiento unidas por los operadores AND y OR poniendo
cada condición entre paréntesis. Ejemplo: La unión de tablas

SELECT *
FROM pedidos INNER JOIN productos ON (pedidos.fab =
productos.idfab) AND (pedidos.producto = productos.idproducto)
Cláusula INNER JOIN de tablas
Se pueden combinar más de dos tablas, en este caso hay
que sustituir en la sintaxis una tabla por un INNER JOIN
completo. La unión de tablas

Por ejemplo:

SELECT *
FROM (pedidos INNER JOIN clientes ON pedidos.clie =
clientes.numclie) INNER JOIN empleados ON pedidos.rep =
empleados.numemp
Cláusula INNER JOIN de tablas

El LEFT JOIN y RIGHT JOIN son otro tipo de composición de


tablas, también denominada composición externa. Son una
La unión de tablas

extensión del INNER JOIN.

Las composiciones vistas hasta ahora (el producto cartesiano y


el INNER JOIN) son composiciones internas ya que todos los
valores de las filas del resultado son valores que están en las
tablas que se combinan.
Cláusula INNER JOIN de tablas
Queremos combinar los empleados con las oficinas para saber la
ciudad de la oficina donde trabaja cada empleado, si utilizamos
un producto cartesiano tenemos: La unión de tablas

SELECT empleados.*,ciudad
FROM empleados, oficinas
WHERE empleados.oficina = oficinas.oficina

Observar que hemos cualificado el nombre de columna oficina ya


que ese nombre aparece en las dos tablas de la FROM.
Cláusula INNER JOIN de tablas
Con esta sentencia los empleados que no tienen una oficina asignada (un valor
nulo en el campo oficina de la tabla empleados) no aparecen en el resultado ya
que la condición empleados.oficina = oficinas.oficina será siempre nula para
La unión de tablas
esos empleados.

Si utilizamos el INNER JOIN:

SELECT empleados.*, ciudad


FROM empleados INNER JOIN oficinas ON empleados.oficina = oficinas.oficina

Nos pasa lo mismo, el empleado 110 tiene un valor nulo en el campo oficina y
no aparecerá en el resultado.
Cláusula LEFT JOIN de tablas
Pues en los casos en que queremos que también aparezcan las filas que no

tienen una fila coincidente en la otra tabla, utilizaremos el LEFT o RIGHT JOIN.

La sintaxis del LEFT JOIN es la siguiente:   La unión de tablas

SELECT *

FROM empleados LEFT JOIN oficinas ON empleados.oficina = oficinas.oficina

Con el ejemplo anterior obtenemos una lista de los empleados con los datos de

su oficina, y el empleado 110 que no tiene oficina aparece con sus datos

normales y los datos de su oficina a nulos.


Cláusula LEFT JOIN de tablas

La unión de tablas
Cláusula RIGHT JOIN de tablas
Ejemplo

SELECT *
FROM empleados RIGHT JOIN oficinas ON empleados.oficina =
La unión de tablas

oficinas.oficina

Una operación LEFT JOIN o RIGHT JOIN se puede anidar dentro de


una operación INNER JOIN, pero una operación INNER JOIN no se
puede anidar dentro de LEFT JOIN o RIGHT JOIN.
Cláusula RIGHT JOIN de tablas

La unión de tablas
Cláusula FULL JOIN de tablas

Mientras que LEFT JOIN muestra todas las filas de la tabla


La unión de tablas

izquierda, y RIGHT JOIN muestra todas las correspondientes


a la tabla derecha, FULL OUTER JOIN (o simplemente FULL
JOIN) se encarga de mostrar todas las filas de ambas tablas,
sin importar que no existan coincidencias (usará NULL como
un valor por defecto para dichos casos).
El INNER JOIN de tablas

La unión de tablas
El anidamiento del INNER JOIN de tablas
Los anidamientos de JOIN de distinta naturaleza no funcionan siempre, a
veces depende del orden en que colocamos las tablas, en estos casos lo
mejor es probar y si no permite el anudamiento, cambiar el orden de las
La unión de tablas

tablas ( y por tanto de los JOINs) dentro de la cláusula FROM.

Por ejemplo podemos tener:

SELECT *
FROM clientes INNER JOIN (empleados LEFT JOIN oficinas ON
empleados.oficina = oficinas.oficina) ON clientes.repclie =
empleados.numclie

También podría gustarte