Sei sulla pagina 1di 0

Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.

74 Sistema a Distancia

UNIDAD 4
INTRODUCCIN A SQL

Qu es el SQL?
Qu es el DDL? Cules son las sentencias DDL y cul es su sintaxis? ,
Qu es el DML? Cules son las sentencias DML y cul es su sintaxis?
Qu es DCL? Cules son las sentencias DCL?
Cules son las variaciones de la Sentencia Select y cul es su sintaxis?

Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


75 Sistema a Distancia

Leccin 9
Conceptos relacionados a SQL
9.1 Definicin
El SQL (Structured Query Language) es el lenguaje ms usado para bases de datos
relacionales, es un lenguaje declarativo de alto nivel, desarrollado por IBM (1974-1977). Se
convirti en un standard definido por: ANSI (American National Standards Institute) e ISO
(International Standards Organization).
SQL est compuesto por lenguajes para: Definicin de Datos o DDL (Data Definition Language),
Manipulacin o DML (Data Manipulation Language), y Control o DCL (Data Control Language).
9.2 Lenguaje de Definicin de Datos
El lenguaje de definicin de datos LDD o DDL (Data Definition Language) proporciona rdenes
para definir esquemas de relacin, eliminar relaciones, crear ndices y modificar esquemas de
relacin. Tambin nos permite definir restricciones de integridad, vistas, estructuras de
almacenamiento fsico y ordenes para especificar derechos de acceso a las relaciones y vistas.


Nivel lgico Global Nivel Externo Nivel Fsico
Definicin de esquema CREATE TABLE CREATE VIEW CREATE INDEX
Evolucin de esquema
ALTER TABLE
DROP TABLE
DROP VIEW DROP INDEX
Una vista es como una ventana a travs de la cual se puede consultar o cambiar informacin
de la tabla a la que est asociada. Las vistas tienen la misma estructura que una tabla: filas y
columnas. La nica diferencia es que slo se almacena de ellas la definicin, no los datos. Los
datos que se recuperan mediante una consulta a una vista se presentarn igual que los de una
tabla. De hecho, si no se sabe que se est trabajando con una vista, nada hace suponer que es
as. Al igual que sucede con una tabla, se pueden insertar, actualizar, borrar y seleccionar datos
en una vista. Aunque siempre es posible seleccionar datos de una vista, en algunas condiciones
existen restricciones para realizar el resto de las operaciones sobre vistas.
Las vistas pueden proporcionar un nivel adicional de seguridad. Por ejemplo, en la tabla de
empleados, cada responsable de departamento slo tendr acceso a la informacin de sus
empleados.
Las vistas permiten ocultar la complejidad de los datos. Una BD se compone de muchas tablas.
La informacin de dos o ms tablas puede recuperarse utilizando una combinacin de dos o
ms tablas, y estas combinaciones pueden llegar a ser muy confusas. Creando una vista como
resultado de la combinacin se puede ocultar la complejidad al usuario. Las vistas ayudan a
mantener unos nombres razonables.
Los ndices nos ayudan a obtener datos de las tablas en forma ms rpida. Utilicemos un
ejemplo para ilustrar este punto: Digamos que estamos interesados en leer en un libro de
jardinera acerca de cmo cultivar pimientos. En vez de leer el libro desde el comienzo hasta
Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


76 Sistema a Distancia

que encontremos una seccin sobre pimientos, es mucho ms rpido para nosotros ir a la
seccin ndice al final del libro, ubicar qu pginas contienen la informacin sobre pimientos, y
luego dirigirnos a esas pginas directamente. Al dirigirnos al ndice primero ahorramos tiempo
y seguramente es el mtodo ms eficiente para ubicar la informacin que necesitamos.
El mismo principio se aplica para la obtencin de datos desde una tabla de base de datos. Sin
un ndice, el sistema de base de datos lee a travs de toda la tabla (este proceso se denomina
escaneo de tabla) para localizar la informacin deseada. Con el ndice correcto en su lugar, el
sistema de base de datos puede entonces primero dirigirse al ndice para encontrar de dnde
obtener los datos, y luego dirigirse a dichas ubicaciones para obtener los datos necesarios.
Esto es mucho ms rpido.
9.3 Lenguaje de Manipulacin de Datos
El lenguaje de manipulacin de datos LMD o DML (Data Manager Language) proporciona un
lenguaje de consultas basados en algebra relacional y el clculo relacional de tuplas. Tambin
incluye rdenes para insertar, suprimir y modificar tuplas de una base de datos.
Adicionalmente la forma inmersa del SQL est diseada para usar dentro de los lenguajes de
programacin tales como: Pascal, C, Fortran, Cobol, C#, JAVA.

Actualizaciones
Altas
Bajas
Cambios
INSERT INTO ,,,
DELETE FROM
UPDATE ..
Consultas SELECT


9.4 Lenguaje de Control de Datos
Para recuperacin, control de concurrencias, seguridad y proteccin

Recuperacin y Control de concurrencias
COMMIT
ROLLBACK ..
Seguridad y Proteccin
GRANT
REVOKE


Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


77 Sistema a Distancia

Leccin 10
Sentencias DDL
10.1 CREATE
Esta instruccin crea un objeto dentro de la base de datos. Puede ser una base de datos Tabla,
vista, ndice, trigger, funcin, procedimiento o cualquier otro objeto que el motor de la base de
datos soporte.
10.1.1 CREAR UNA BASE DE DATOS
CREATE DATABASE nombre de la base de datos
Ejemplo 1: Crear una base de datos banquito
CREATE DATABASE banquito
10.1.2 CREAR UNA TABLA
CREATE TABLE nombre_tabla (CAMPO_1 TIPO_DATO null|not null,
CAMPO_2 TIPO_DATO null|not null,
CAMPO_3 TIPO_DATO null|not null,
)
Ejemplo 1: Crear una Tabla cliente con 3 campos todos ellos de tipo carcter con el
campo nombre_cliente de 8 bytes, calle_cliente de 25 bytes y ciudad_cliente de 10
bytes
create table cliente
(
nombre_cliente char(8) ,
calle_cliente char(25) ,
ciudad_cliente char(10)
)
Ejemplo 2: Crear una Tabla cliente con 3 campos todos ellos de tipo carcter con el
campo nombre_cliente de 8 bytes ,calle_cliente de 25 bytes y ciudad cliente de 10
bytes
not null : De manera predetermine null es un valor valido para cualquier atributo en
SQL, a menos que se especifique con not null
create table cliente
(
nombre_cliente char(8) NOT NULL,
calle_cliente char(25) NULL,
ciudad_cliente CHAR(10) NULL
)
10.1.3 CREAR UN NDICE
Un ndice ayudara a la base de datos a recuperar ms rpidamente los datos,
principalmente cuando las tablas son grandes. Los ndices se asocian a una Tabla.
CREATE [UNIQUE] INDEX ndice
ON tabla (campo [ASC DESC}[,campo [ASC|DESC]..])
Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


78 Sistema a Distancia

[WITH {PRIMARY |DISALLON NULL | IGNORE NULL}]
Ejemplo 1: Crear un ndice llamado MPI a una tabla cliente sobre el atributo
nombre_cliente
CREATE INDEX MPI ON cliente (nombre_cliente)
Ejemplo 2 : Crear un ndice llamado MI a una tabla prstamo sobre el atributo
nombre_sucursal
CREATE UNIQUE INDEX MI ON prestamo (nombre_sucursal)
UNIQUE: Indica que se trata de un ndice nico, es decir , no admite ms de una tupla
con el mismo valor en los atributos que forman el ndice.
10.1.4 CREAR UNA VISTA
Una vista es una declaracin SELECT nombrada que dinmicamente produce un juego de
resultados en que usted puede operar. Una vista no guarda ningn dato realmente, acta
como un filtro para tablas subyacentes en el que el dato se guarda. La declaracin SELECT que
define la vista puede ser de una o las tablas ms subyacentes o de otras vistas.
CREATE VIEW nombre_vista AS <expresin de consulta>
Ejemplo 1: Crear una vista que muestre a todos los clientes con su direccin que tienen una
cuenta que no se encuentre en la sucursal San Felipe.
CREATE VIEW v_clientes1 AS SELECT DISTINCT nombre_cliente, calle_cliente,ciudad_cliente
FROM deposito
WHERE nombre_sucursal <> San Felipe

Ejemplo 2: Crear una vista que muestre solo los nombres de los clientes de todos los clientes
que tienen una cuenta que no se encuentre en la sucursal San Felipe.
SELECT nombre_cliente
FROM v_clientes1

Importante: Otro uso habitual de las vistas es restringir el acceso de un usuario a slo ciertas
columnas de una Tabla.
10.1.5 CREAR UN PROCEDIMIENTO
Transact SQL permite agrupar una serie de instrucciones como lote, ya sea de forma
interactiva o desde un archivo operativo. Tambin, se puede utilizar estructuras de control de
flujo por Transact SQL para conectar las instrucciones utilizando estructuras de tipo de
programacin.
Los procedimientos almacenados pueden incluir parmetros, llamar a otros procedimientos,
devolver un valor de estado a un procedimiento de llamada o lote para indicar el xito o el
fracaso del mismo, devolver valores de parmetros de llamada o lote.
Usamos el comando EXECUTE para ejecutarlo.
CREATE PROCEDURE nombre procedimiento
AS
CONSULTA SQL
Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


79 Sistema a Distancia


EJEMPLO 1: Crear un procedimiento que muestre todos los atributos de un determinado
cliente.
CREATE PROCEDURE lista_cliente
@nombre as varchar (50)
As
Select * from Cliente where nombre_cliente like @nombre

Nota: Todos los parmetros empiezan con @, en nuestro ejemplo identificamos un parmetro
de entrada @nombre seguido del tipo de dato .Para ejecutar este procedimiento. Ejecutamos
el procedimiento
EXECUTE liste_cliente Hansen
Dara como resultado mostrar los atributos del cliente Hansen
EJEMPLO 2: Crear un procedimiento que muestre el nombre del cliente y su respectivo saldo
dentro de un rango de saldos de deposito
CREATE PROCEDURE selecciona_saldos
@min as numeric (18), @max as numeric (18)
as
Select nombre_cliente ,saldo FROM deposito
where saldo > @min and saldo< @max

Nota: Tenemos 2 parmetros de entrada @min y @max dimensionadas con su tipo de dato.
Ejecutamos el procedimiento
EXECUTE selecciona_saldos 350, 900
Dara como resultado mostrar los saldos de depsito entre 350 y 900 con sus respectivos
nombre de cliente.

10.2 ALTER
Esta instruccin permite modificar la estructura de un objeto. Se pueden modificar las tablas y
agregar o cambiar la definicin de los campos, agregar, quitar ndices a una tabla, modificar un
trigger o una base de datos.
ALTER TABLE nombre_columna / | [ALTER COLUMN nombre_columna / ADD |DROP|
{ ADD / <nombre_columna> -type/ [NULL|NOT NULL]
Ejemplo 1: Modificar la tabla cliente aadindole una columna llamada edad que permite los
valores nulos
ALTER TABLE cliente
ADD edad NULL

Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


80 Sistema a Distancia

Ejemplo 2: Modificar la tabla cliente aadindole una columna llamada edad que permite los
valores nulos
ALTER TABLE cliente
DROP COLUMN ciudad_sucursal
Nota: Deben de quitarse todos los ndices y constraints (restricciones)que son basadas en una
columna antes de que se elimine
10.3 DROP
Esta instruccin elimina un objeto. Puede ser una Tabla, vista, ndice, trigger, funcin,
procedimiento o cualquier otro objeto que soporte el motor de la base de datos. Se puede
combinar con la sentencia ALTER
10.3.1 ELIMINAR UNA BASE DE DATOS
DROP DATABASE nombre de la base de datos

Ejemplo 1 Eliminar la base de datos banquito
DROP DATABASE banquito
10.3.2 ELIMINAR UNA TABLA
Al eliminar una tabla elimina la definicin y todos los datos de una tabla, asi como las
especificaciones del permiso para esa tabla. Antes de que usted elimine una tabla usted debe
quitar cualquier dependencia entre tabla y otros objetos.

DROP TABLE nombre_tabla

Ejemplo 1 : Eliminar la tabla cliente de la base de datos
DROP TABLE clientes


Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


81 Sistema a Distancia

Leccin 11
Sentencias DML
Las siguientes tablas permitirn realizar ejemplos xde esta leccion
DEPOSITO CLIENTE
NOMBRE_SUC
URSAL
N_CU
ENTA
NOMBRE_CLI
ENTE
SALDO
NOMBRE_CLI
ENTE
CALLE CIUDAD
CLIENTE
DASSO 101 HANSEN 500 VALDERRAMA LARCO 444 LIMA
MANTA 215 SALVATIERRA 700 SALVATIERRA JOSE GONZALEZ 252 LIMA
SAN FELIPE 102 HANSEN 400 HANSEN LAS CAMELIAS 123 LIMA
RIO HUARA 305 TAPIA 350 CUTIMBO BOLOGNESI 232 PIURA
SAN FELIPE 201 WARRENS 900 LIMON MANCO CAPAC CHICLAYO
ANGAMOS 222 LIMON 700 TAPIA SAN LORENZO 245 PIURA
BENAVIDES 217 CUTIMBO 750 WARRENS LUNA IGLESIAS 222 LIMA
DASSO 105 CUTIMBO 850

PRESTAMO SUCURSAL
NOMBRE_S
UCURSAL
N_PRES
TAMO
NOMBRE_CLI
ENTE
SALDO NOMBRE_SUC
URSAL
ACTIVO CIUDAD_SUCUR
SAL
DASSO 17 VALDERRAMA 1000 DASS0 9000,000 LIMA
ANGAMOS 23 SALVATIERRA 2000 GAMARRA 2100,000 LIMA
SAN
FELIPE
15 CUTIMBO 1500 SAN FELIPE 1700,000 LIMA
DASSO 14 TAPIA 1500 MANTA 400,000 CHICLAYO
MANTA 93 TAPIA 500 RIO HUARA 8000,000 LIMA
RIO HUARA 11 WARRENS 900 GRAU 300,000 PIURA
GRAU 29 WARRENS 1200 LA MOLINA 3700,000 LIMA
LA MOLINA 16 SALVATIERRA 1300 BALTA 7100,000 CHICLAYO
DASSO 18 CUTIMBO 2000

11.1 INSERT
La instruccin INSERT se utiliza para aadir registros a las tablas de la base de datos.
El formato de la instruccin es:
INSERT INTO nombre_tabla [(nombre_columna,..)] VALUES (Expr,..)
El nombre_tabla es nicamente el nombre de la tabla donde se desea ingresar los nuevos
datos. El nombre_columna es una lista opcional de nombres de campo en los que se insertaran
valores en el mismo nmero y orden que se especificaran en la clausula VALUES. Expr es una
lista de expresiones o valores constantes, separados por comas para dar valor a los distintos
campos del registro que se aadir a la tabla.
Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


82 Sistema a Distancia

Ejemplo 1: Insertar un cliente a la tabla cliente
INSERT INTO cliente values (VALDERRAMA, LARCO 444,LIMA)

Ejemplo 2: Podemos crear una copia de la tabla cliente llamada copia_cliente con la misma
estructura. Y despus pediramos: Insertar a la tabla copia_cliente todos los clientes
INSERT INTO COPIA_CLIENTE Select * From cliente

11.2 DELETE
La instruccin DELETE es especialmente til cuando se desea eliminar varios registros. Esta
instruccin elimina registros o tuplas completas. No podemos eliminar valores slo de
atributos determinados. Con la clausula WHERE (opcional) solo eliminara las filas que
seleccione la clausula WHERE. Se puede utilizar DELETE para eliminar registros de una nica
tabla o desde de varios lados de una relacin uno a muchos. Las operaciones de eliminacin en
cascada en una consulta nicamente eliminan desde varios lados de una relacin.
El formato de la instruccin es:
DELETE FROM nombre_tabla [WHERE ( condicion) ]
Ejemplo 1: Eliminar la tabla Prestamo
DELETE FROM prestamo
Ejemplo 2: Eliminar todos los registros de cuentas de Salvatierra
DELETE FROM deposito
WHERE nombre_cliente = Salvatierra
11.3 UPDATE
La sentencia UPDATE se utiliza para cambiar el contenido de los registros de una tabla de base
de datos. Con esta instruccin podemos desear cambiar un valor en un registro sin cambiar
todos los valores en un registro.
UPDATE nombre_tabla SET nombre_columna = expr,
[WHERE (condicin)]
Ejemplo 1: Actualizar pagos de inters a todos los saldos de depsito con un incremento de
10%
UPDATE DEPOSITO
SET SALDO =SALDO * 1.10
Ejemplo 2: Actualizar las cuentas con saldos mayores a 1000 soles stas recibirn un
incremento de 6%, mientras que las dems recibirn un inters de 5%.
Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


83 Sistema a Distancia


UPDATE DEPOSITO
SET SALDO =SALDO * 1.06
WHERE saldo > 1000
UPDATE DEPOSITO
SET SALDO =SALDO * 1.05
WHERE saldo < 1000



Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


84 Sistema a Distancia

Leccin 12
Sentencias SELECT
12.1 SELECT SIMPLE
La sintaxis de una consulta de seleccin simple es la siguiente
SELECT campos FROM Tabla
En donde campos es la lista de campos que se desean recuperar y Tabla es el origen de
datos. Esta instruccin extrae todos los datos de una tabla
Ejemplo 1: Listar cada nombre de sucursal de la Tabla deposito
SELECT DISTINCT nombre_sucursal FROM deposito
Importante: La palabra clave DISTINCT fuerza la eliminacin de duplicados

Ejemplo 2: Listar cada nombre de sucursal de la Tabla deposito sin eliminar duplicados
SELECT ALL nombre_sucursal FROM deposito
Importante: La palabra clave ALL especifica que no se eliminan los duplicados

12.2 SELECT CON CONDICIONES
La sintaxis de una consulta de seleccin simple con condicin es la siguiente:
SELECT campos FROM Tabla WHERE condicion

La clausula WHERE condicin, limita el nmero de registros que se devuelven,
indicndole al gestor de datos que devuelvan los registros que cumplan ciertos
criterios especificados en la condicin
Ejemplo 1: Encontrar a todos los clientes que tienen una cuenta en la sucursal
San Felipe
SELECT DISTINCT nombre_cliente FROM deposito
WHERE nombre_sucursal = San Felipe

Ejemplo 2: Encontrar a todos los clientes que tienen una cuenta que no sea iguala la
sucursal San Felipe
SELECT DISTINCT nombre_cliente FROM deposito
WHERE nombre_sucursal <> San Felipe
Ejemplo 3: Listar la tabla prestamo en orden descendente de saldo
SELECT * FROM prestamo order by saldo desc,n_prestamo
La clausula order by sirve para recuperar los registros en un cierto orden , en donde se
especifica los campos a ordenar.
Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


85 Sistema a Distancia

Si varios prstamos tuvieran el mismo saldo, los ordenamos en orden ascendente por
numero de prstamo.

Ejemplo 4. Encontrar los nombres de todos los clientes cuya calle incluya la subcadena
Las.
SELECT nombre_cliente
FROM cliente
WHERE calle LIKE %Las%

Usamos el operador de comparacin LIKE , esto quiere decir lo siguiente ,si usramos
el carcter % en esta posicin : Parac% es igual a cualquier cadena que empiece por
Parac; si colocramos dos caracteres % al comienzo y al final %imes% es igual a
cualquier cadena que contenga imes como subcadena.

Ejemplo 5: Encontrar el nmero de clientes con depsitos para cada sucursal
SELECT nombre_sucursal, count (distinct, nombre_cliente)
FROM deposito
GROUP BY nombre_sucursal

Usamos la funcin de agregacin COUNT cuenta el grupo de registros
Ejemplo 6: Podramos necesitar saber nicamente las sucursales en las que saldo
promedio de las cuentas es mayor a 400 soles
SELECT nombre_sucursal, AVG( saldo)
FROM deposito
GROUP BY nombre_sucursal
HAVING AVG(saldo) > 400

Es til declarar una condicin que se aplica a grupos. Esta condicin no se aplica a
nico registro sino se aplica a cada grupo construido con la instruccin GROUP BY
Para realizar esta consulta, usamos la clausula HAVING que se aplica despus de la
formacin de grupos.

12.3 SELECT CON FUNCIONES DE AGREGACIN
Las funciones de agregacin de son funciones que toman una coleccin de valores como
entrada y producen un nico valor de salida. SQL proporciona cinco funciones de
agregacin. Media :avg ; Minimo: min; Maximo:max; Total : sum; Cuenta:count
Ejemplo 1: Encontrar el saldo promedio de todas las cuentas: count
SELECT AVG (saldo) FROM DEPOSITO
Usamos la funcin de agregacin AVG llamada promedio viene del ingls AVERAGE
Ejemplo 2: Encontrar el mximo saldo de todas las cuentas
Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


86 Sistema a Distancia

SELECT MAX (saldo) FROM DEPOSITO
Usamos la funcin de agregacin MAX llamada mximo viene del ingls MAXIMUM
Ejemplo 3: Encontrar el mnimo saldo de todas las cuentas
SELECT MIN(saldo) FROM DEPOSITO
Usamos la funcin de agregacin MIN llamada mnimo viene del ingls MINIMUN

12.4 SELECT CON COMBINACION DE TABLAS
La sintaxis de una consulta de seleccin con combinacin de tablas es la siguiente:
SELECT campos FROM Tabla(1),TABLA(2),TABLA(3), TABLA(N)
WHERE condicin

Recordar que la clausula WHERE es OPCIONAL como lo usamos en los ejemplos
anteriores para el caso de SELECT a una sola Tabla
Ejemplo 1: Encontrar el nombre y la ciudad de todos los clientes un prstamo en alguna
sucursal.
SELECT DISTINCT cliente.nombre_cliente,ciudad_cliente
FROM PRESTAMO,CLIENTE
WHERE prstamo.nombre_cliente = cliente.nombre_cliente

Observe que se usa la notacin tabla.nombre del atributo para indicar el sentido de
pertenencia del atributo con la tabla ya que este puede repetirse en cualquier otra
relacin o tabla as que el punto(.) especifica esta perteneca,asi mismo para el
ejemplo el atributo ciudad_cliente no es necesario ya que este no se repite en otra
relacin
Ejemplo 2: Encontrar el nombre y la ciudad de todos los clientes que tienen un prestamo
en la sucursal San Felipe
SELECT DISTINCT cliente.nombre_cliente,ciudad_cliente
FROM PRESTAMO,CLIENTE
WHERE prstamo.nombre_cliente = cliente.nombre_cliente
AND nombre_sucursal = San Felipe

12.5 SELECT CON COMBINACIONES INTERNAS DE TABLAS USANDO
INNER JOIN
La combinacin INNER JOIN se utiliza como parte de una instruccin SELECT para
devolver un solo conjunto de resultado formado a partir de varias tablas. JOIN se
Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


87 Sistema a Distancia

utiliza para vincular (o combinar) tablas por una columna en comn y devolver
registros que se correspondan en esas columnas.
La sintaxis de una consulta de seleccin con combinacin de tablas usando INNER
JOIN es la siguiente:
SELECT campos FROM <tabla1> INNER JOIN <tabla2> ON CONDICION1
INNER JOIN <Tabla3> ON CONCION2.<TablaN> ON CONDICIONn

Ejemplo 1: Encontrar el nombre y la ciudad de todos los clientes que tiene un
prestamo en alguna sucursal.

SELECT cliente.nombre_cliente,cliente.ciudad_cliente
FROM cliente INNER JOIN prestamo ON
cliente.nombre_cliente = prestamo.nombre_cliente


Ejemplo 2: Encontrar el nombre y la ciudad de todos los clientes que tienen un
prestamo en la sucursal San Felipe.

SELECT cliente.nombre_cliente,cliente.ciudad_cliente
FROM cliente INNER JOIN prestamo ON
cliente.nombre_cliente = prestamo.nombre_cliente
AND nombre_sucursal = San Felipe

12.6 SELECT CON COMBINACIONES EXTERNAS DE TABLAS LEFT
JOIN/RIGHT JOIN /FULL JOIN
Existen tres tipos de combinaciones externas o OUTER JOIN,RIGHT OUTER JOIN
(normalmente abreviado como RIGHT JOIN se usa si necesita ver todos los registros de la
tabla situada a la derecha en la clausula JOIN ,tengan o no un registro correspondiente
en la tabla de la izquierda. Para ver todos los registros de la tabla situadas a la izquierda,
independientemente de que tengan registros correspondientes en la tabla de la derecha,
se aplica LEFT OUTER JOIN (o LEFT JOIN). Si se desea ver todos los registros de las dos
tablas, tanto si tienen un registro correspondiente en la otra tabla como si no ,se usa
FULL OUTER JOIN(u OUTER JOIN).
Ejemplo 1: Encontrar el nombre y la ciudad de todos los clientes que tengan o no
prestamo en alguna sucursal.
SELECT cliente.nombre_cliente,cliente.ciudad_cliente
FROM cliente LEFT JOIN prestamo ON
cliente.nombre_cliente = prestamo.nombre_cliente

Ejemplo 2: Encontrar el nombre y la ciudad de todos los clientes que tengan prestamo en
alguna sucursal.
SELECT cliente.nombre_cliente,cliente.ciudad_cliente
Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


88 Sistema a Distancia

FROM cliente RIGHT JOIN prestamo ON
cliente.nombre_cliente = prestamo.nombre_cliente

12.7 SELECT ANIIDADOS O SUBCONSULTAS ANIDADAS
Una subconsulta es una consulta SELECT que devuelve un valor nico y esta anidada en
una instruccin SELECT, INSERT, UPDATE o dentro de una subconsulta. Una
subconsulta se puede utilizar en cualquier parte en la que se permite una expresin.
Predicado IN: Prueba si se es miembro de un conjunto donde el conjunto es una
coleccin de valores producidos por una clausula SELECT. El predicado NOT IN prueba
la no perteneca al conjunto.
Predicado EXISTS: Devuelve el valor true si la subconsulta del argumento no esta vaca
Predicado ALL: Corresponde a la frase mayor que todos. Se utiliza para recuperar
nicamente aquellos registros de la consulta principal que satisfacen la comparacin
con todos los registros recuperados en la subconsulta.
Predicado ANY /SOME: Se puede utilizar el predicado ANY o SOME, los cuales son
sinnimos para recuperar registros de la consulta principal que satisfagan la
comparacin con cualquier otro registro recuperado en la subconsulta.
Ejemplo 1: Encontrar a todos los clientes que tienen una cuenta en la sucursal San
Felipe pero no tienen un prestamo en la sucursal San Felipe
SELECT DISTINCT nombre_cliente FROM deposito
WHERE nombre_sucursal = San Felipe and nombre_cliente NOT IN
(SELECT nombre_cliente FROM Prestamo
WHERE nombre_sucursal = San Felipe)

Ejemplo 2: Encontrar a todos los clientes que tienen una cuenta en la sucursal San
Felipe y un prestamo en la sucursal San Felipe.

SELECT DISTINCT nombre_cliente FROM deposito
WHERE nombre_sucursal = San Felipe and nombre_cliente IN
(SELECT nombre_cliente FROM Prestamo
WHERE nombre_sucursal = San Felipe)

Ejemplo 3: Encontrar a todos los clientes que tiene una cuenta y un prestamo en la
sucursal San Felipe.

SELECT DISTINCT nombre_cliente FROM cliente
WHERE EXIST (SELECT *FROM deposito WHERE deposito.nombre_cliente =
cliente.nombre_cliente AND nombre_sucursal = San Felipe AND EXISTS
(SELECT * FROM prestamo WHERE prestamo.nombre_cliente =
cliente.nombre_cliente AND nombre_sucursal = San Felipe)

Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


89 Sistema a Distancia

Importante: La primera subconsulta exists prueba si el cliente tiene cuenta en la
sucursal San Felipe. La segunda subconsulta exists prueba si el cliente tiene un
prstamo de la sucursal San Felipe.

Ejemplo 4: Encontrar los nombres de todas las sucursales que tienen un activo mayor
que todas las sucursales de Lima

SELECT nombre_sucursal FROM sucursal
WHERE activo > ALL
(SELECT activo FROM sucursal WHERE ciudad_sucursal = Lima)

Importante: La construccin > all corresponde a la frase mayor que todos
Caso de estudio
A continuacin crearemos una base de datos con el analizador de consultas del SQL SERVER.
La base de datos que crearemos la llamaremos banquito que muestra la informacin
bsica que se maneja en un BANCO. A continuacin mostramos el modelo relacional de
nuestra base de datos ejemplo .
Como paso 1 crearemos nuestra base de datos en el disco E de nuestro ordenador y
particularmente en una carpeta llamada pcarpio. Dicha base de datos constara de un
archivo principal llamado bancodb.mdf, un archivo secundario llamado bancodb2.ndf y
un archivo de transacciones llamado bancodb2log.ldf.
Nuestra base de datos consta de 4 tablas relacionadas; semnticamente la entendemos
como un archivo de clientes, para facilitar el caso suponemos que estarn identificados
por su nombre (por ser clave primaria dichos valores no se podrn repetir), stos tienen
depsitos identificados por su nmero de cuenta, as mismo tienen prstamos que
estarn identificados por su nmero de prstamo. Encontramos las sucursales que se
identifican por su nombre y stas a su vez tienen muchos depsitos y prstamos.
A continuacin el programa en SQL que nos implemente las tablas, las llaves primarias,
las llaves forneas y las relaciones. Paso a Paso
PASO 1
CREATE DATABASE banquito ON
primary
(NAME = banKdb,
FILENAME= 'E:\pcarpio\bancodb.mdf',
SIZE = 8 MB,
MAXSIZE = 20 MB,
FILEGROWTH = 25%),
(NAME = banKdb2,
FILENAME= 'E:\pcarpio\bancodb2.ndf',
SIZE= 8 MB,
MAXSIZE = 20 MB,
Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


90 Sistema a Distancia

FILEGROWTH = 8MB)
log on
(NAME = banKdblog,
FILENAME= 'E:\pcarpio\bancodb2log.ldf',
SIZE= 4 MB,
MAXSIZE = 15 MB,
FILEGROWTH = 10%)

Estas instrucciones deben ser ejecutadas para lograr la creacin de la base de datos que
constara de tres archivos. El primero archivo principal llamado bancodb.mdf que
contendr los datos de la base de datos, de tamao 8 MB, con un tamao mximo de
20MB y de porcentaje de crecimiento de 10%. Un segundo archivo llamado archivo
secundario llamado bancodb2 que nos servir para almacenar los datos de la base de
datos, si se llenara el archivo principal con un tamao de 8 MB, con un tamao mximo
de 20 MB y 8 MB de crecimiento, finalmente el tercer archivo el archivo de
transacciones llamado bancodb2log.ldf que se usa para recuperar datos, guarda un
registro de las acciones hechas a la base de datos .Los registros de transacciones son
importante para la proteccin de los datos. Al anotar las operaciones en un registro, el
servidor de la base de datos puede recuperarlos ante cualquier desastre.
Figura 4.1 Modelo Relacional de la Base de Datos banquito

Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


91 Sistema a Distancia

Como PASO 2 crearemos las tablas que son 4. Las tablas: Cliente, Prstamo, Depsito
y Sucursal .

create table cliente
(
nombre_cliente char(8) NOT NULL,
calle_cliente char(25) NULL,
ciudad_cliente CHAR(10) NULL
)

create table prestamo
(
n_prestamo char(10) NOT NULL,
nombre_sucursal char(15) NOT NULL,
nombre_cliente char(08) NOT NULL,
saldo int NOT NULL,
check ( saldo >0)
)

create table deposito
(
n_cuenta char(10) NOT NULL,
nombre_sucursal char(15) not null,
nombre_cliente char(8) NOT NULL,
saldo int NOT NULL,
check ( saldo >0)
)

create table sucursal
(nombre_sucursal char(15) NOT NULL,
ciudad_sucursal char (30) null,
activo int not null,
check (activo > 0),
)

En la creacin de cada tabla se est definiendo el tipo de dato indicndose tambin que
dicho campo puede permitirse valores nulos NULL. Adems estamos indicando una
restriccin a ciertos campos de la tabla con la palabra CHECK. La restriccin CHECK se emplea
para restringir los datos que se aceptan en el campo. Por ejemplo el campo saldo acepta
valores mayores que cero. La Restriccin de datos se puede forzar tambin con la restriccin
UNIQUE siendo necesaria utilizarla para no ingresar valores duplicados a un campo que no
forma parte de la clave principal. Es importante decirle al lector que cuando indicamos NOT
NULL solo hemos hecho obligatorio para aquellos campos que van a ser claves primarias.
Veamos la tabla cliente el campo nombre_cliente va a ser la clave primaria entonces se le ha
definido como NOT NULL (ver grafico 4.1). Los tipos de datos usados en este ejemplo son: char
tipo de datos de carcter y el otro tipo usado int solo puede contener datos enteros.


Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


92 Sistema a Distancia

Como PASO 3 crearemos las claves primarias y forneas

ALTER TABLE cliente
ADD primary key nonclustered
(nombre_cliente)

ALTER TABLE SUCURSAL
ADD primary key nonclustered
(nombre_sucursal)

ALTER TABLE deposito
ADD FOREIGN KEY (NOMBRE_CLIENTE)
REFERENCES CLIENTE

ALTER TABLE deposito
ADD FOREIGN KEY (nombre_sucursal)
REFERENCES sucursal

ALTER TABLE DEPOSITO
ADD primary key nonclustered
(n_cuenta,nombre_cliente,nombre_sucursal)

ALTER TABLE prestamo
ADD FOREIGN KEY (NOMBRE_CLIENTE)
REFERENCES CLIENTE

ALTER TABLE prestamo
ADD FOREIGN KEY (nombre_sucursal)
REFERENCES sucursal

ALTER TABLE prestamo
ADD primary key nonclustered
(n_prestamo,nombre_cliente,nombre_sucursal)

En estas instrucciones el lector tiene que ver la figura 4.1 y notar que las claves primarias
pasan como forneas Veamos las tablas cliente y deposito tienen cardinalidad 1 a muchos el
campo clave nombre_cliente pasa como clave fornea en la tabla deposito esto se detalla en el
siguiente prrafo de instrucciones:
ALTER TABLE deposito
ADD FOREIGN KEY (NOMBRE_CLIENTE)
REFERENCES CLIENTE

Estamos modificando la tabla deposito y le agregamos la llave fornea nombre_cliente que
tiene como referencia la tabla cliente, estamos relacionado la tabla cliente con la tabla
deposito.
El lector debe notar que el orden del prrafo de instrucciones es muy importante ya que para
definir la clave primaria de prstamo que es una superclave conformada por los siguientes
campos (n_prestamo,nombre_cliente,nombre_sucursal), previamente hemos definido
aquellos campos que son claves forneas.
Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


93 Sistema a Distancia

Al terminar los pasos 1 ,2 y 3 se debe tener el modelo relacional mostrado en la figura 4.1 ,
esto lo puede visualizar en la carpeta diagramas de base de datos , el lector puede crear su
propio diagrama con la interfase visual ingrese a la opcin crear diagrama (botn 2 del mouse)
coloque el cursor sobre la carpeta diagrama de base de datos y compruebe su diagrama con la
figura 4.1.
Siempre recuerde que las tablas son el corazn de la base de datos relacionales en
general y las restricciones de integridad aseguran que la clave primaria identifique
unvocamente a cada tabla representada de la base de datos y adems que las
relaciones entre tablas de la base de datos se preserven durante las actualizaciones.
A diferencia de la sentencia SELECT , que puede operar sobre mltiples tablas, las
sentencias INSERT,DELETE,UPDATE funcionan solamente sobre una nica tabla cada
vez.
La instruccin SELECT se utiliza para expresar una consulta SQL. Toda sentencia SELECT
produce una tabla de resultados que contiene una o ms columnas y cero o mas filas.
La clausula FROM especifica la (s) tabla que contienen (n) los datos a recuperar de una
consulta.
La clausula WHERE selecciona las filas a incluir en los resultados aplicando una
condicin de bsqueda a las filas de las tablas de base de datos
La clausula ORDER BY especfica que los resultados de la consulta deben ser ordenados
en sentido ascendente o descendente, basndose en los valores de una o mas
columnas
Las funciones de columnas pueden calcular el promedio, la suma, el valor mnimo, el
valor mximo, de una columna, contar el nmero de valores de datos de una columna
o contar el nmero de filas de los resultados de una consulta
Las consultas sumarias sin clausula GROUP BY genera una nica fila de resultados,
sumariando todas las filas de una tabla o de un conjunto compuesto de tablas.
Las consultas sumarias con clausula GROUP BY genera mltiples filas de resultados,
cada una acumulando en valor de la suma en fila de un grupo en particular.
En una consulta multitabla, las tablas que contienen los datos son designadas en la
clausula FROM.
Una subconsulta es una consulta dentro de una consulta. Las subconsultas aparecen
dentro de una de la condiciones de bsqueda. Cuando aparece una subconsulta en la
clausula WHERE los resultados de la subconsultas se utilizan para seleccionar las filas
individuales que contribuyen a los datos de los resultados de la consulta.
Las vistas permiten redefinir la estructura de una base de datos proporcionando a cada
usuario una vista personalizada de la estructura y los contenidos de la base de datos.
No olvide que una vista es una tabla virtual definida mediante una consulta. La vista
parece contener filas y columnas de datos, al igual que una tabla real, pero los datos
visibles a travs de la vistas son los resultados de la consulta.
Una vista puede ser un subconjunto simple fila/columna de una nica tabla. Puede
mostrar resultados obtenidos de funciones de agrupamiento o puede extraer los datos
de dos o ms tablas. Son muy tiles para la seguridad de la base de datos. Por ltimo
las instrucciones Transact Sql pueden agruparse en procesos o lotes permanecer en
una base de datos, ejecutarse repetidamente en forma de procedimientos
Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


94 Sistema a Distancia

almacenados. Estos pueden ser bastantes complejos y pueden convertirse en partes
importantes del cdigo fuente de su aplicacin

Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


95 Sistema a Distancia

Lectura
Lenguajes de base de datos
Los sistemas relacionales ms comunes de base de datos consultan y modifican la
base de datos por medio de un lenguaje denominado SQL (Strucuture Query
Language = Lenguaje Estructurado de base de Datos). Un ncleo importante de el
equivale al algebra relacional, aunque ofrece muchas caractersticas importantes
que van ms all de lo que encontramos en ella, por ejemplo la agregacin (sumas
y conteos, entre otras cosas) y actualizaciones de la base de datos.
Este lenguaje consta de muchos dialectos. Primero hay dos estndares principales
el SQL ANSI (American National Standards Institute) y un estndar actualizado que
se adopto en 1992 llamado SQL-92 o SQL2.
Tambin existe un estndar ms reciente, el SQL3 que ampla el anterior con
muchas caractersticas novedosas como la recursin, los disparadores y los objetos,
Existen adems versiones del SQL producidas por los principales proveedores de
los sistemas administradores de base de datos. En todas ellas se encuentra las
capacidades del estndar original ANSI. En gran medida se conforman al SQL2 mas
reciente, aunque cada uno presenta sus propias variaciones y extensiones de l,
entre ellas algunas de las caractersticas del estndar propuestas SQL3.

Jeffrey D. Ullman pag243














Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


96 Sistema a Distancia

Actividades
Caso: Se ha diseado una base de datos para el control del consumo, gustos y preferencias de
Bebedores de una localidad como se detalla en el siguiente diagrama. El diagrama muestra la
cardinalidad segn la notacin del SQL SERVER.

Figura 11.2
Se pide:
1. Crear las tablas, llaves primarias ,forneas y relaciones
2. Crear un diagrama de la base de datos
3. Crear una restriccin donde el precio de la cerveza de la tabla Vende sea mayor que
2.50
4. Insertar registros a cada una de la Tablas
5. Proponer instrucciones DML
a) (03)Select Sencillos
b) (03)Select con Condiciones







Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


97 Sistema a Distancia

Autoevaluacin
1. Cul de las siguientes instrucciones del lenguaje SQL se usan para definir datos
a) Drop b) Select c) Alter d) Insert e) Create
2. Cul de los siguientes comandos estn mal propuestos?
a) Create Cliente (codigo char(10),calle char(30),e_mail(30))
b) Alter TABLE Cliente ADD e_mail NULL
c) Alter Cliente DROP COLUMN Ciudad_Sucursal
d) Create view VISTA as Select activo from Sucursal
e) Drop Table Sucursal

3. Cul de las siguientes consultas satisfacen el siguiente enunciado Eliminar todos los
prestamos con nmeros de prstamo entre 17 y 29
a) Delete from prstamo where N_prestamo between 17 and 29
b) Delete from prestamo where N_prestamo <=29 and N_prestamo >= 17
c) Delete from prestamo where N_prestamo <29 and N_prestamo > 17
d) Delete from prestamo where N_prestamo >29 and N_prestamo < 17
e) N.A.

4. Cul de las siguientes consultas satisfacen el siguiente enunciado Eliminar de la tabla
sucursal todas las sucursales que no tengan ciudad
a) Delete from Sucursal where ciudad_sucursal is not null
b) Delete from Sucursal where ciudad_sucursal is null
c) Delete from Sucursal where ciudad_sucursal = null
d) Delete from Sucursal where ciudad_sucursal is not exist
e) N.A.
5. Cul de las siguientes consultas satisfacen el siguiente enunciado Encontrar el nombre
y la ciudad de todos los clientes que tienen cuentas con saldos mayores a 5000 soles
a) SELECT cliente.nombre_cliente,cliente.ciudad_cliente FROM cliente INNER JOIN
deposito ON cliente.nombre_cliente = deposito.nombre_cliente AND
saldo.deposito >5000
b) SELECT cliente.nombre_cliente,cliente.ciudad_cliente FROM deposito,cliente
where cliente.nombre_cliente = deposito.nombre_cliente AND saldo.deposito
>5000
c) SELECT cliente.nombre_cliente,cliente.ciudad_cliente FROM cliente LEFT JOIN
deposito ON cliente.nombre_cliente = deposito.nombre_cliente AND
saldo.deposito >5000
d) SELECT cliente.nombre_cliente,cliente.ciudad_cliente FROM cliente FULL JOIN
deposito ON cliente.nombre_cliente = deposito.nombre_cliente AND
saldo.deposito >5000
e) N.A.





Respuestas de Control
1E, 2C, 3 AyB, 4B, 5AyB
Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


98 Sistema a Distancia

Exploracin On-Line
Microsoft SQL Server 2008
http://www.microsoft.com/latam/sqlserver/
MySQL
http://www.mysql.com/

http://www.mailxmail.com/curso-sql
http://www.programatium.com/bd/sql.htm
http://www.zonagratuita.com/a-cursos/programacion/SQL7.htm
Referencias Bibliogrficas
1. Korth, H. y otros (2002) Fundamentos de base de datos. 5ta. Ed. Espaa. MacGrawHill.
2. Mike Gunderloy,Joseph L.Jorden ,David W.Tschanz La Biblia de Microsoft SQL SERVER
2005 Edicion 2006. Ediciones ANAYA
3. Training Computer Center IBM del Peru ,Base de Datos Gua del Alumno. IBM del Per
Edicion 1999
4. Pablo Noriega Base de Datos Teora 4ta Edicin 2008 Editorial Universidad Peruana de
Ciencias Aplicadas











Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


99 Sistema a Distancia

GLOSARIO
1. Base de datos: Coleccin de datos organizados de una empresa, los cuales son
recolectados y explotados por los sistemas de informacin de la empres.
2. Administrador de base de datos: Persona responsable de la confidencialidad,
disponibilidad, seguridad e integridad de los datos almacenados en la base de datos; vigila
el buen funcionamiento del sistema de base de datos.
3. Sistema de gestin de base de datos: Software que permite crear y mantener una base de
datos.
4. Sistema de base de datos: Formado por base de datos y Sistema de gestin de base de
datos.
5. Independencia de datos: Se refiere a la proteccin contra los programas de aplicacin que
pueden generar incoherencias cuando se altera la organizacin fsica o lgica de la base de
datos.
6. Arquitectura ANSI/x3/SPARC: Arquitectura de tres niveles (externo, conceptual e interno)
que permite la independencia de datos.
7. Modelo de datos: Representacin, a travs de conceptos, reglas y convenciones para
describir los datos de una organizacin o domino particular.
8. MER: Modelo Entidad Relacin, es un modelo conceptual que describe los datos como
entidades y sus relaciones.
9. Modelo relacional: Modelo de datos lgicos formado por relaciones o tablas.
10. Tabla: Conjunto de datos formado por filas o tuplas y columnas y atributos.
11. Primary Key: Clave Primaria, atributo (s) que identifican a las filas de una tabla.
12. Foreign Key: Clave Fornea, atributo (s) cuyos valores corresponde a los valores de la clave
primaria de la tabla relacionada.
13. SQL: Structured Query Language, Lenguaje de Consultas estructurado, formado por DDL,
DML y DCL.
14. DDL: Data Definition Language, Lenguaje de definicin de datos
15. DML: Data Manipulation Language, Lenguaje de manipulacin de datos
16. DCL: Data Control Language, Lenguaje de Control de los datos

Base de Datos I - Unidad IV Csar Luza M. / Pedro Carpio F.


100 Sistema a Distancia

BIBLIOGRAFA GENERAL
1. ANSI (1977): The ANSI/X3/SPARC DBMS Framework. Report on the Study Group on
Database Management Systems. D. Tsichiritzis y A. Klug (eds). Montvalle, N.J.: AFIP Press.
2. Booch, G., Rumbaugh, J. y Jacobson, I. (1999) El lenguaje unificado de modelado.
Madrid: Addison Wesley,
3. Chen, Peter (1976), The entety-relationship model:Towards a unified view of data. ACM
Trans.Sistemas de bases de datos 1 (1) 9-36
4. Codd, E.F. (1970) "A Relational Model of Data for Large Shared Data Banks")
Communications of the ACM, Vol 13 Num. 6.
5. Connolly, Thomas y Begg, Carolyn. (2008) Database Solutions. 5ta. Ed. Espaa. Addison
Wesley.
6. Date, . (1995) An introduction to data base systems. 5ta. Ed. USA. Addison Wesley.
7. De Miguel A. y Piattini M., (1999) Fundamentos y Modelos de Base de datos. 2da. Ed.
Espaa. Alfa y Omega.
8. Elmasri, Ramez y Shamkant Navathe (1997) Sistemas de Bases de Datos. Conceptos
fundamentales. Segunda Edicin Addison-Wesley Iberoamericana.
9. Fagin R. (1977) Multi-Valued Dependencies and a New Normal Form for relationa data
bases. ACM TODS 2. No 3 (Septiembre)
10. Finkelstein, C. (1992) Strategic systems development. Sydney: Addison-Wesley.
11. Gunderloy M., Joseph L.Jorden, David W.Tschanz (2006) La Biblia de Microsoft SQL SERVER
2005. Edicion 2006. Ediciones ANAYA
12. Korth, H. y otros (2002) Fundamentos de base de datos. 5ta. Ed. Espaa. MacGrawHill.
13. Kroenke, D. (2003) Procesamiento de base de datos. Fundamentos, diseo e
implementacin. 8va. Edicin, Mexico. Pearson Educacion.
14. Luque I. y Otros (2002) Bases de Datos-desde Chen hasta Codd con ORACLE,. Espaa.
Alfaomega.
15. Martin, James. (1975) Computer Data Base Organization. USA. Prentice Hall.
16. Noriega, Pablo (2008) Base de Datos, Teora. 4ta Edicin. Editorial Universidad Peruana de
Ciencias Aplicadas
17. Training Computer Center IBM del Peru, Base de Datos Gua del Alumno. IBM del Per
Edicin 1999

Potrebbero piacerti anche