Está en la página 1de 70

5 INTRODUCCIN A SQL

5.1 Qu es el SQL?
El SQL (Structured query language), lenguaje de consulta estructurado, es un
lenguaje surgido de un proyecto de investigacin de IBM para el acceso a bases de
datos relacionales. Actualmente se ha convertido en un estndar de lenguaje de bases
de datos, y la mayora de los sistemas de bases de datos lo soportan, desde sistemas para
ordenadores personales, hasta grandes ordenadores.
Por supuesto, a partir del estndar cada sistema ha desarrollado su propio SQL que
puede variar de un sistema a otro, pero con cambios que no suponen ninguna
complicacin para alguien que conozca un SQL concreto, como el que vamos a ver aqu
correspondiente al Access2000.
Como su nombre indica, el SQL nos permite realizar consultas a la base de datos.
Pero el nombre se queda corto ya que SQL adems realiza funciones de definicin,
control y gestin de la base de datos. Las sentencias SQL se clasifican segn su
finalidad dando origen a tres lenguajes o mejor dicho sublenguajes:
El DDL (Data DescriptionLanguage), lenguaje de definicin de datos, incluye
rdenes para definir, modificar o borrar las tablas en las que se almacenan los
datos y de las relaciones entre estas. (Es el que ms varia de un sistema a otro)
El DCL (Data Control Language), lenguaje de control de datos, contiene
elementos tiles para trabajar en un entorno multiusuario, en el que es
importante la proteccin de los datos, la seguridad de las tablas y el
establecimiento de restricciones en el acceso, as como elementos para coordinar
la comparticin de datos por parte de usuarios concurrentes, asegurando que no
interfieren unos con otros.
El DML (Data ManipulationLanguage), lenguaje de manipulacin de datos,
nos permite recuperar los datos almacenados en la base de datos y tambin

incluye rdenes para permitir al usuario actualizar la base de datos aadiendo


nuevos datos, suprimiendo datos antiguos o modificando datos previamente
almacenados.
5.2 Caractersticas del lenguaje
Una sentencia SQL es como una frase (escrita en ingls ) con la que decimos lo que
queremos obtener y de donde obtenerlo.
Todas las sentencias empiezan con un verbo (palabra reservada que indica la accin a
realizar), seguido del resto de clusulas, algunas obligatorias y otras opcionales que
completan la frase. Todas las sentencias siguen una sintaxis para que se puedan ejecutar
correctamente.

5.3 Lenguaje de Manipulacin de Datos


El DML(Data Manipulation Language) lenguaje de manipulacin de datos es un
idioma proporcionado por los [[sistema de gestin de base de datos] sistemas gestores
de bases de datos] que permite a los usuarios de la misma llevar a cabo las tareas de
consulta o modificacin de los datos contenidos en las Bases de Datos del Sistema
Gestor de Bases de Datos.

5.3.1 Sentencias DML


5.3.1.1 SELECT
Una de las sentencias SQL ms importantes es SELECT, ya que permite realizar
consultas sobre los datos almacenados en la base de datos.
Sintaxis SQL SELECT
SELECT * FROM nombretabla
SELECT columna1, columna2 FROM nombretabla
Ejemplo:
Para los ejemplos, tendremos la siguiente tabla de personas denominada personas
Estos son los datos almacenados en la tabla personas
Nombre

apellido1

apellido2

ANTONIO

PEREZ

GOMEZ

ANTONIO

GARCIA

BENITO

LUIS

LOPEZ

PEREZ

Si queremos consultar todos los datos de la tabla personas


SELECT * FROM personas

Este ser el resultado:


Nombre

apellido1

apellido2

ANTONIO

PEREZ

GOMEZ

ANTONIO

GARCIA

BENITO

LUIS

LOPEZ

PEREZ

5.3.1.2 INSER INTO


La sentencia INSERT INTO se utiliza para insertar nuevas filas en una tabla.
Es posible insertar una nueva fila en una tabla de dos formas distintas:
INSERT INTO nombre_tabla
VALUES (valor1, valor2, valor3, .)
INSERT INTO nombre_tabla (columna1, columna2, columna3,.)
VALUES (valor1, valor2, valor3, .)
Ejemplo:
Dada la siguiente tabla personas:
Nombre

apellido1

apellido2

ANTONIO

PEREZ

GOMEZ

LUIS

LOPEZ

PEREZ

ANTONIO

GARCIA

BENITO

Si queremos insertar una nueva fila en la tabla personas, lo podemos hacer con
cualquiera de las dos sentencias siguientes:
INSERT INTO personas
VALUES ('PEDRO', 'RUIZ', 'GONZALEZ')
INSERT INTO personas (nombre, apellido1, apellido2)
VALUES ('PEDRO', 'RUIZ', 'GONZALEZ')

Cualquiera de estas sentencias anteriores produce que se inserte una nueva fila en la
tabla personas, quedando as dicha tabla:
Nombre

apellido1

apellido2

ANTONIO

PEREZ

GOMEZ

LUIS

LOPEZ

PEREZ

ANTONIO

GARCIA

BENITO

PEDRO

RUIZ

GONZALEZ

5.3.1.3 UPDATE
La sentencia UPDATE se utiliza para modificar valores en una tabla.
La sintaxis de SQL UPDATE es:
UPDATE nombre_tabla
SET columna1 = valor1, columna2 = valor2
WHERE columna3 = valor3
La clusula SET establece los nuevos valores para las columnas indicadas.
La clusula WHERE sirve para seleccionar las filas que queremos modificar.
Ojo: Si omitimos la clusula WHERE, por defecto, modificar los valores en todas las
filas de la tabla.
Ejemplo del uso de SQL UPDATE
Nombre

apellido1

apellido2

ANTONIO

PEREZ

GOMEZ

LUIS

LOPEZ

PEREZ

ANTONIO

GARCIA

BENITO

PEDRO

RUIZ

GONZALEZ

Si queremos cambiar el apellido2 'BENITO' por 'RODRIGUEZ' ejecutaremos:


UPDATE personas

SET apellido2 = 'RODRIGUEZ'


WHERE nombre = 'ANTONIO'
AND apellido1 = 'GARCIA'
AND apellido2 = 'BENITO'
Ahora la tabla 'personas' quedar as:
Nombre

apellido1

apellido2

ANTONIO

PEREZ

GOMEZ

LUIS

LOPEZ

PEREZ

ANTONIO

GARCIA

RODRIGUEZ

PEDRO

RUIZ

GONZALEZ

5.3.1.4 DELETE
La sentencia DELETE sirve para borrar filas de una tabla.
La sintaxis de SQL DELETE es:
DELETE FROM nombre_tabla
WHERE nombre_columna = valor
Si queremos borrar todos los registros o filas de una tabla, se utiliza la sentencia:
DELETE * FROM nombre_tabla;

Ejemplo de SQL DELETE para borrar una fila de la tabla personas


Nombre

apellido1

apellido2

ANTONIO

PEREZ

GOMEZ

LUIS

LOPEZ

PEREZ

ANTONIO

GARCIA

RODRIGUEZ

PEDRO

RUIZ

GONZALEZ

Si queremos borrar a la persona LUIS LOPEZ PEREZ, podemos ejecutar el comando:


DELETE FROM personas
WHERE nombre = 'LUIS'
AND apellido1 = 'LOPEZ'
AND apellido2 = 'PEREZ'

La tabla 'personas' resultante ser:


Nombre

apellido1

apellido2

ANTONIO

PEREZ

GOMEZ

ANTONIO

GARCIA

RODRIGUEZ

PEDRO

RUIZ

GONZALEZ

5.4 Lenguaje de Definicin de Datos (DDL)


El DDL (Data Definition Language) lenguaje de definicin de datos es la parte del
SQL que ms vara de un sistema a otro ya que esa rea tiene que ver con cmo se
organizan internamente los datos y eso, cada sistema lo hace de una manera u otra.
5.4.1 Sentencias DDL
5.4.1.1 CREATE TABLE
La sentencia CREATE TABLE se utiliza para crear una tabla en una base de datos
existente.
Sintaxis CREATE TABLE
CREATE TABLE nombretabla
{
nombrecolumna1 tipodato1,
nombrecolumna2 tipodato2,
nombrecolumna3 tipodato3,
..
}

Ejemplo CREATE TABLE


CREATE TABLE personas
{
nombre varchar(255),
apellido1 varchar(255),
apellido2 varchar(255),
depint
}
Esta sentencia crear la base de datos 'personas' con 4 columnas.

Las columnas 'nombre', 'apellido1' y 'apellido2' son de tipo 'varchar', es decir, acepta
valores alfanumricos hasta una longitud mxima de 255 caracteres.
La columna 'dep' es de tipo 'int', es decir, acepta slo nmeros.
5.4.1.2 ALTER
La sentencia SQL ALTER se utiliza para aadir, eliminar o modificar columnas de una
tabla.
Sintaxis SQL ALTER
Para aadir una nueva columna a una tabla
ALTER TABLE nombretabla
ADD nombrecolumnatipodatocolumna
Para borrar una columna de una tabla
ALTER TABLE nombretabla
DROP COLUMN nombrecolumna
Para modificar el tipo de dato de una columna de una tabla
ALTER TABLE nombretabla
ALTER COLUMN nombrecolumnatipodatocolumna
Ejemplos de SQL ALTER
per

Nombre

apellido1

apellido2

ANTONIO

PEREZ

GOMEZ

ANTONIO

GARCIA

RODRIGUEZ

PEDRO

RUIZ

GONZALEZ

Dada la siguiente tabla de 'personas', queremos aadir una nueva columna, denominada
'fechadenacimiento'
ALTER TABLE personas
ADD fechadenacimiento date
per nombre

apellido1 apellido2

ANTONIO PEREZ

ANTONIO GARCIA RODRIGUEZ

Fechadenacimiento

GOMEZ

PEDRO

RUIZ

GONZALEZ

Si queremos modificar el tipo de dato de la columna 'fecha', y ponerle tipo 'year' en


lugar de tipo 'date'
ALTER TABLE personas
ALTER COLUMN fechadenacimientoyear
Si queremos borrar la columna 'fechadenacimiento', y dejarlo igual que al principio
ALTER TABLE personas
DROP COLUMN fechadenacimiento
per

Nombre

apellido1

apellido2

ANTONIO

PEREZ

GOMEZ

ANTONIO

GARCIA

RODRIGUEZ

PEDRO

RUIZ

GONZALEZ

5.4.1.3 DROP
La sentencia DROP se utiliza para borrar definitivamente un ndice, tabla o base de
datos.
DROP INDEX
Sintaxis DROP INDEX para MySQL
ALTER TABLE nombretabla
DROP INDEX nombreindice
Sintaxis DROP INDEX para DB2 y ORACLE
DROP INDEX nombreindice
Sintaxis DROP INDEX para ACCESS
DROP INDEX nombreindice
ON nombretabla
Sintaxis DROP INDEX para SQLSERVER
DROP INDEX nombretabla.nombreindice
DROP TABLE

Se utiliza DROP TABLE para borrar definitivamente una tabla


DROP TABLE nombretabla
DROP DATABASE
Se utiliza para borrar una base de datos definitivamente.
DROP DATABASE nombrebasededatos
5.5 Las consultas simples
5.5.1 WHERE
La clusula WHERE se utiliza para hacer filtros en las consultas, es decir, seleccionar
solamente algunas filas de la tabla que cumplan una determinada condicin.
En la consulta slo aparecern las filas para las cuales la condicin es verdadera
(TRUE), los valores nulos (NULL) no se incluyen por lo tanto en las filas del resultado.
La condicin de seleccin puede ser cualquier condicin vlida o combinacin de
condiciones utilizando los operadores NOT (no) AND (y) y OR (). En ACCESS2000
una clusula WHERE puede contener hasta 40 expresiones vinculadas por operadores
lgicos AND y OR
El valor de la condicin debe ir entre comillas simples ''.

5.5.1.2CONDICIONES DE SELECCIN

Las condiciones de seleccin son las condiciones que pueden aparecer en la clusula
WHERE.
En SQL tenemos cinco condiciones bsicas:
el test de comparacin
el test de rango
el test de pertenencia a un conjunto
el test de valor nulo
el test de correspondencia con patrn.
El test de comparacin.
Compara el valor de una expresin con el valor de otra. La sintaxis es la siguiente:

10

= igual que
<> distinto de
< menor que
<= menor o igual
> mayor que
>= mayor o igual
Por ejemplo:
Seleccionar las personas cuyo nombre sea ANTONIO
SELECT * FROM personas
WHERE nombre = 'ANTONIO'
Nombre

apellido1

apellido2

ANTONIO

PEREZ

GOMEZ

ANTONIO

GARCIA

BENITO

5.5.2 OPERADORES AND OR


Los operadores AND y OR se utilizan para filtrar resultados con 2 condiciones.
El operador AND mostrar los resultados cuando se cumplan las 2 condiciones.
Condicin1 AND condicin2
El operador OR mostrar los resultados cuando se cumpla alguna de las 2 condiciones.
Condicion1 OR condicion2

En la tabla personas
nombre

apellido1

apellido2

ANTONIO

PEREZ

GOMEZ

ANTONIO

GARCIA

BENITO

LUIS

LOPEZ

PEREZ

La siguiente sentencia (ejemplo AND) dar el siguiente resultado:

11

SELECT * FROM personas


WHERE nombre = 'ANTONIO'
AND apellido1 = 'GARCIA'
Nombre

apellido1

apellido2

ANTONIO

GARCIA

BENITO

La siguiente sentencia (ejemplo OR) dar el siguiente resultado:


SELECT * FROM personas
WHERE nombre = 'ANTONIO'
OR apellido1 = 'GARCIA'
Nombre

apellido1

apellido2

ANTONIO

PEREZ

GOMEZ

ANTONIO

GARCIA

BENITO

Tambin se pueden combinar AND y OR, como el siguiente ejemplo:


SELECT * FROM personas
WHERE nombre = 'ANTONIO'
AND (apellido1 = 'GARCIA' OR apellido1 = 'LOPEZ)
Nombre

apellido1

apellido2

ANTONIO

GARCIA

BENITO

5.5.3 ORDER BY
Se utiliza para especificar el criterio de ordenacin de la respuesta a la consulta. Por
defecto la ordenacin es ascendente (ASC), aunque se puede especificar un orden
descendente con la utilizacin del comando (DES). La ordenacin se puede establecer
sobre el contenido de columnas o sobre expresiones con columnas.
SELECT nombre_columna(s)
FROM nombre_tabla
ORDER BY nombre_columna(s) ASC|DESC
Por ejemplo, en la tabla personas:
nombre

apellido1

apellido2

ANTONIO

PEREZ

GOMEZ

12

LUIS

LOPEZ

PEREZ

ANTONIO

GARCIA

BENITO

SELECT nombre, apellido1


FROM personas
ORDER BY apellido1 ASC
Esta es la consulta resultante:
Nombre

apellido1

LUIS

LOPEZ

ANTONIO

GARCIA

ANTONIO

PEREZ

Ejemplo de ordenacin descendiente (DES)


SELECT nombre, apellido1
FROM personas
ORDER BY apellido1 DESC
Esta es la consulta resultante:
Nombre

apellido1

ANTONIO

PEREZ

ANTONIO

GARCIA

LUIS

LOPEZ

5.5.4 BETWEEN
El operador BETWEEN se utiliza en la clusula WHERE para seleccionar valores entre
un rango de datos.
Sintaxis de SQL BETWEEN
SELECT columna
FROM tabla WHERE columna
BETWEEN valor1 AND valor2

13

Ejemplo de SQL BETWEEN


Dada la siguiente tabla 'personas'
Nombre

apellido1

apellido2

ANTONIO

PEREZ

GOMEZ

ANTONIO

GARCIA

RODRIGUEZ

PEDRO

RUIZ

GONZALEZ

Seleccionar personas cuyo apellido1 est entre 'FERNANDEZ y 'HUERTAS'


SELECT *
FROM personas
WHERE apellido1
BETWEEN 'FERNANDEZ' AND 'HUERTAS'
Nombre

apellido1

apellido2

ANTONIO

GARCIA

RODRIGUEZ

Seleccionar personas cuyo apellido1 no est entre 'FERNANDEZ y 'HUERTAS'


SELECT *
FROM personas
WHERE apellido1
NOT BETWEEN 'FERNANDEZ' AND 'HUERTAS'
nombre

apellido1

apellido2

ANTONIO

PEREZ

GOMEZ

PEDRO

RUIZ

GONZALEZ

5.6 Consultas multitabla


5.6.1 INNER JOIN
La sentencia INNER JOIN es la sentencia JOIN por defecto, y permite emparejar filas
de distintas tablas de forma ms eficiente que con el producto cartesiano cuando una de
las columnas de emparejamiento est indexada. Ya que en vez de hacer el producto
cartesiano completo y luego seleccionar la filas que cumplen la condicin de
emparejamiento, para cada fila de una de las tablas busca directamente en la otra tabla
las filas que cumplen la condicin, con lo cual se emparejan slo las filas que luego
aparecen en el resultado.

14

La sintaxis es la siguiente:

Ejemplo SQL INNER JOIN


Tabla personas, con la clave primaria "per "
per

nombre

apellido1

apellido2

Dep

ANTONIO

PEREZ

GOMEZ

ANTONIO

GARCIA

RODRIGUEZ

PEDRO

RUIZ

GONZALEZ

Tabla "departamentos", con la clave primaria "dep"


dep

Departamento

ADMINISTRACION

INFORMATICA

COMERCIAL

SELECT nombre, apellido1, departamento FROM personas INNER JOIN


departamentos WHERE personas.dep = departamentos.dep
nombre

apellido1

Departamento

ANTONIO

PEREZ

ADMINISTRACION

ANTONIO

GARCIA

INFORMATICA

PEDRO

RUIZ

INFORMATICA

5.6.2 LEFT JOIN


La sentencia LEFT JOIN combina los valores de la primera tabla con los valores de la
segunda tabla. Siempre devolver las filas de la primera tabla, incluso aunque no
cumplan la condicin.
SELECT * FROM tabla1
LEFT JOIN tabla2
WHERE tabla1.columna1 = tabla2.columna1
Ejemplo de SQL LEFT JOIN

15

Tabla personas, con la clave primaria "per "


per

nombre

apellido1

apellido2

Dep

ANTONIO

PEREZ

GOMEZ

ANTONIO

GARCIA

RODRIGUEZ

PEDRO

RUIZ

GONZALEZ

Tabla "departamentos", con la clave primaria "dep"

dep

Departamento

ADMINISTRACION

INFORMATICA

COMERCIAL

SELECT nombre, apellido1, departamento


FROM personas
LEFT JOIN departamentos
WHERE personas.dep = departamentos.dep
Nombre

apellido1

Departamento

ANTONIO

PEREZ

ADMINISTRACION

ANTONIO

GARCIA

INFORMATICA

PEDRO

RUIZ

Aunque el departamento '4' de PEDRO RUIZ no existe en la tabla de departamentos,


devolver la fila con esa columna 'departamento' en blanco.
5.6.3 RIGHT JOIN
La sentencia RIGHT JOIN combina los valores de la primera tabla con los valores de
la segunda tabla. Siempre devolver las filas de la segunda tabla, incluso aunque no
cumplan la condicin.
En algunas bases de datos, la sentencia RIGHT JOIN es igual a RIGHT OUTER JOIN
SELECT * FROM tabla1 RIGHT JOIN tabla2 WHERE tabla1.columna1 =
tabla2.columna1
EJEMPLO SQL RIGHT JOIN

16

per

Nombre

apellido1

apellido2

Dep

ANTONIO

PEREZ

GOMEZ

ANTONIO

GARCIA

RODRIGUEZ

PEDRO

RUIZ

GONZALEZ

Tabla "departamentos", con la clave primaria "dep"


Dep

Departamento

ADMINISTRACION

INFORMATICA

COMERCIAL

SELECT nombre, apellido1, departamento


FROM personas
RIGHT JOIN departamentos
WHERE personas.dep = departamentos.dep
Nombre

apellido1

Departamento

ANTONIO

PEREZ

ADMINISTRACION

ANTONIO

GARCIA

INFORMATICA
COMERCIAL

Aunque no exista ninguna persona del departamento 'COMERCIAL' (3), esta fila
aparecer con las otras columnas en blanco
5.7 Funciones de Agregacin
5.7.1 Funcin AVG()
Esta funcin retorna el valor promedio de una columna numrica.
En SQL la sintaxis es de la siguiente manera:
SELECT AVG(nombre_columna)
FROM nombre_tabla

EJEMPLO SQL AVG()


Tenemos la tabla PRODUCTO y se desea calcular el precio promedio de la columna
precio.

17

descripcin

precio

Computadora

800

Teclado

30

Impresora

150

SELECT AVG(precio)
FROM PRODUCTO

Promedio
326

5.7.2 Funcin COUNT()


La funcin COUNT() retorna el nmero de filas segn los criterios que especificaron.
En SQL la sintaxis que se utiliza para realizar la consulta es:
SELECT COUNT(nombre_columna)
FROM nombre_tabla
SELECT COUNT(*)
FROM nombre_tabla
COUNT(nombre_columna) retorna el nmero de valores que se encuentran en la
columna especificada. Los valores NULL no se cuentan.
EJEMPLO SQL COUNT()
Tenemos la tabla PRODUCTO
descripcin

precio

Computadora

800

Teclado

30

Impresora

150

18

SELECT COUNT(*)
FROM PRODUCTO

Num_filas
3

5.7.3 Funcin MAX()


La funcin MAX() retorna el mximo valor de la columna seleccionada.
En SQL la sintaxis utilizada es de la siguiente manera:
SELECT MAX(nombre_columna)
FROM nombre_tabla

EJEMPLO SQL MAX()


Tenemos la tabla PRODUCTO
descripcin

precio

Computadora

800

Teclado

30

Impresora

150

SELECT MAX(*) as Precio_mayor


FROM PRODUCTO

La funcin as es solo una etiqueta de salida de nuestro resultado.


Precio_mayor
800

19

5.7.4 Funcin MIN()


La funcin MIN() retorna el mnimo valor de la columna seleccionada.
En SQL la sintaxis utilizada es de la siguiente manera:
SELECT MIN(nombre_columna)
FROM nombre_tabla

EJEMPLO SQL MIN()


Tenemos la tabla PRODUCTO
descripcin

precio

Computadora

800

Teclado

30

Impresora

150

SELECT MIN(*) asPrecio_menor


FROM PRODUCTO

La funcin as es solo una etiqueta de salida de nuestro resultado.


Precio_menor
800

5.7.5 Funcin SUM()


La funcin SUM() retorna la suma total de una columna numrica.
En SQL la sintaxis utilizada es de la siguiente manera:
SELECT SUM(nombre_columna)
FROM nombre_tabla

20

EJEMPLO SQL SUM()


Tenemos la tabla PRODUCTO
descripcin

precio

Computadora

800

Teclado

30

Impresora

150

SELECT SUM(*) asPrecio_total


FROM PRODUCTO

La funcin as es solo una etiqueta de salida de nuestro resultado.


Precio_total
980

5.7.6 Tabla Resumida con Funciones de agregacin


Funcin
COUNT(col)

Cometido
Cuenta el nmero de filas
agrupadas.
AVG(col)
Calcula el valor medio de
todos los valores de la
columna col.
MAX(col)
Calcula el valor mximo de
todos los valores de la
columna col.
MIN(col)
Calcula el valor mnimo de
todos los valores de la
columna col.
SUM(col)
Calcula la suma de los
valores de la columna col.
STDDEV(col)
Calcula la desviacin tpica
de los valores de la
columna col sin tener en
cuenta los valores nulos.
VARIANCE(col) Calcula la varianza de los
valores de la columna col
sin tener en cuenta los
valores nulos.

Ejemplo
select count(nombre),oficio
from emp group by oficio;
select avg(salario),oficio
from emp group by oficio;
select max(salario),oficio
from emp group by oficio;
select min(salario),oficio
from emp group by oficio;
select sum(salario), oficio
from emp group by oficio;
select stddev(salario), oficio
from emp group by oficio;
select variance(salario),
oficio from emp group by
oficio;

21

5.7.7 Tabla Resumida con Funciones Aritmticas


Funcin
ABS(n)

Cometido
Ejemplo
Resultado
Calcula el valor absoluto select
abs(-15)
15
de n.
from dual;
CEIL(n)
Calcula el valor entero select
ceil(15.7)
16
inmediatamente superior o from dual;
igual a n.
FLOOR(n)
Calcula el valor entero select floor(15.7)
15
inmediatamente inferior o from dual;
igual a n.
MOD(m,n)
Calcula el resto resultante select mod(11,4)
3
de dividir m entre n.
from dual;
POWER(m,n) Calcula la potencia n- select power(3,2)
9
esima de m.
from dual;
ROUND(m,n) Calcula el redondeo de m a select
123.5
n decimales. Si n<0 el round(123.456,1)
redondeo se efecta a por from dual;
la izquierda del punto
decimal.
SQRT(n)
Calcula la raz cuadrada de select sqrt(4) from
2
n.
dual;
TRUNC(m,n) Calcula m truncado a n select
123.4
decimales (n puede ser trunc(123.456,1)
negativo).
from dual;
SIGN(n)
Calcula el signo de n, select
sign(-12)
-1
devolviendo -1 si n<0, 0 si from dual;
n=0 y 1 si n>0.

5.7.8 Tabla Resumida con Funciones de cadenas de caracteres


Funcin
CHR(n)

ASCII(cad)

CONCAT(cad1,cad2)

Cometido

Devuelve el
carcter
cuyo valor
codificado
es n.
Devuelve el
valor ascii
de cad.
Devuelve
cad1
concatenada
con cad2.
Esta
funcin es

Ejemplo

select
dual;

chr(65)

from

Resultado
A

select ascii('A') from


dual;

65

select
concat(concat(nombre,'
es '),oficio) from emp;

Cano es
Presidente, etc.

22

esquivalente
al operador
||.
LOWER(cad)
Devuelve la
cadena cad
con todas
sus
letras
convertidas
a
minsculas.
UPPER(cad)
Devuelve la
cadena cad
con todas
sus
letras
convertidas
a
maysculas.
INITCAP(cad)
Devuelve
cad con el
primer
caracter en
maysculas.
LPAD(cad1,n,cad2)
Devuelve
cad1
con
longitud n,
y ajustada a
la derecha,
rellenando
por
la
izquierda
con cad2.
RPAD(cad1,n,cad2)
Devuelve
cad1
con
longitud n,
y ajustada a
la izquierda,
rellenando
por
la
derecha con
cad2.
REPLACE(cad,ant,nue) Devuelve
cad en la
que
cada
ocurrencia
de la cadena
ant ha sido
sustituida
por
la
cadena nue.
SUBSTR(cad,m,n)
Devuelve la

select
lower('MinUsCulAs')
from dual;

minsculas

select
upper('maYuSCulAs')
from dual;

MAYUSCULAS

select initcap('isabel')
from dual;

Isabel

select
lpad('P',5,'*')
from dual;

****P

select
rpad('P',5,'*')
from dual;

P****

select
replace('digo','i','ie')
from dual;

diego

select

CD

23

LENGTH(cad)

sudcadena
de
cad
compuesta
por
n
caracteres a
partir de la
posicion m.
Devuelve la
longitud de
cad.

substr('ABCDEFG',3,2
) from dual;

select length('cadena')
from dual;

5.7.9 Tabla Resumida con Funciones de manejo de flechas


Funcin

Cometido
Devuelve la
fecha y hora
actuales.
ADD_MONTHS(d,n)
Devuelve la
fecha
d
incrementada
en n meses.
LAST_DAY(d)
Devuelve la
fecha
del
ltimo
da
del mes de d.
MONTHS_BETWEEN(d1, Devuelve la
d2)
diferencia en
meses entre
las fechas d1
y d2.
NEXT_DAY(d,cad)
Devuelve la
fecha
del
primer da de
la
semana
cad despus
de la fecha d.
SYSDATE

Ejemplo
select sysdate from dual;

Resultado
14-MAR97

select add_months(sysdate,4)
from dual;

14-JUL-97

select last_day(sysdate) from


dual;

31-MAR97

select
2.43409424
months_between(sysdate,'01JAN-97') from dual;
select
next_day(sysdate,
'sunday') from dual;

16-MAR97

5.7.10 Tabla Resumida con Funciones de conversin de tipos


Funcin
TO_NUMBER(cad,fmto)

Cometido
Ejemplo
Convierte
la select
cadena cad a un to_number('12345')
nmero,
from dual;
opcionalmente
de acuerdo con
el formato fmto.

Resultado
124345

24

TO_CHAR(d, fmto)

TO_DATE(cad,fmto)

Convierte
la
fecha d a una
cadena
de
caracteres,
opcionalmente
de acuerdo con
el formato fmto.
Convierte
la
cadena cad de
tipo varchar2 a
fecha,
opcionalmente
de acuerdo con
el formato fmto.

select
to_char(sysdate)
from dual;

'14-MAR97'

select
to_date('1- 01-JAN-97
JAN-97')
from
dual;

Con las fechas pueden utilizarse varios formatos. Estos formatos permiten modificar la
presentacin de una fecha. En la siguiente tabla se presentan algunos formatos de fecha
y el resultado que generan.
5.7.11 Tabla Resumida de mascaras de formato numricas
Formato
cc scc

Cometido
Valor del siglo.

y,yyy
sy,yyy

Ao con coma, con o


sin signo.

yyyy yyy
yy y

Ao sin signo con


cuatro, tres, dos o un
dgitos.
Trimestre.

q
ww w
mm
ddd dd
d
hh hh12
hh24
mi
ss sssss

Ejemplo
Resultado
20
select to_char(sysdate,'cc')
from dual;
1,997
select
to_char(sysdate,'y,yyy')
from dual;
1997
select
to_char(sysdate,'yyyy')
from dual;
1
select to_char(sysdate,'q')
from dual;
11
select to_char(sysdate,'ww')
from dual;

Nmero
de
la
semana del ao o del
mes.
Nmero del mes.
select to_char(sysdate,'mm')
from dual;
Nmero del da del select to_char(sysdate,'ddd')
ao, del mes o de la from dual;
semana.
La hora en formato select to_char(sysdate,'hh')
12h. o 24h.
from dual;
Los minutos de la select to_char(sysdate,'mi')
hora.
from dual;
Los segundos dentro select
del minuto, o desde to_char(sysdate,'sssss')
las 0 horas.
from dual;

03
073

12
15
44159

25

5.7.12 Tabla Resumida de mascaras de formato de caracteres


Formato
syear
year

Cometido
Ao en Ingls

month o
mon

Ejemplo

Resultado

select
to_char(sysdate,'syear)
from dual;
select
to_char(sysdate,'month')
from dual;
select to_char(sysdate,'day')
from dual;

nineteen
ninety-seven

Nombre del mes o su


abreviatura de tres
letras.
day dy Nombre del da de la
semana
o
su
abreviatura de tres
letras.
a.m.
El espacio del da.
select
p.m.
to_char(sysdate,'a.m.') from
dual;
b.c. a.d. Indicador del ao select to_char(sysdate,'b.c.')
respecto
al
del from dual;
nacimiento
de
Cristo.

march

friday

p.m.

a.d.

5.7.13 Otras Funciones


Funcin
Cometido
Ejemplo
Resultado
DECODE(var, val1, Convierte el select
decode(oficio, P, D, X, ...
cod1, val2, cod2, ..., valor de var, 'Presidente',
'P',
defecto)
de
acuerdo 'Director', 'D', 'X') from
con
la emp;
codificacin.
sin
GREATEST(exp1, Devuelve el sin ejemplo.
ejemplo.
exp2, ...)
mayor valor
de una lista.
sin
LEAST(cad,fmto)
Devuelve el sin ejemplo.
ejemplo.
menor valor
de una lista.
450000,
NVL(val, exp)
Devuelve la select
350000, ...
expresin exp salario+nvl(comision,0)
si
val
es from emp;
NULL, y val
si en otro
caso.

5.8 Consultas de resumen

5.8.1 GROUP BY

26

La instruccin GROUP BY se utiliza en conjuncin con las funciones de agregado para


agrupar el conjunto de resultados de una o ms columnas. Se pueden obtener subtotales
con la clusula GROUP BY. Una consulta con una clusula, se denomina consulta
agrupada ya que agrupa los datos de la tabla origen y produce una nica fila resumen
por cada grupo formado. Las columnas indicadas en el GROUP BY se llaman columnas
de agrupacin.
En SQL la sintaxis utilizada es de la siguiente manera:

SELECT nombre_columna1,SUM(nombre_columna)
FROM nombre_tabla
GROUP BY nombre_columna1

EJEMPLO SQL GROUP BY


Tenemos la tabla PRODUCTO
fabrica

descripcin

precio

CintyComp

Computadora

800

Computrom

Teclado

30

NoviCompu

Impresora

150

NoviCompu

Mouse

20

Computrom

Disco Duro

120

SELECT fabrica,SUM(precio) as Precio_total


FROM PRODUCTO
GROUP BY fabrica

La funcin as es solo una etiqueta de salida de nuestro resultado.


fabrica
CintyComp
Computrom
NoviCompu

Precio_total
800
270
170

5.8.2 HAVING

27

La clusula HAVING se utiliza en SQL, puesto que la palabra clave WHERE no puede
utilizarse con las funciones de agregado en sus condiciones.

La clusula HAVING nos permite seleccionar filas de la tabla resultante de una


consulta de resumen.
Para la condicin de seleccin se pueden utilizar los mismos tests de
comparacin descritos en la clusula WHERE, tambin se pueden escribir
condiciones compuestas (unidas por los operadores OR, AND, NOT), pero
existe una restriccin.
En la condicin de seleccin slo pueden aparecer:
valores constantes
funciones de columna
columnas de agrupacin (columnas que aparecen en la clusula GROUP BY)
o cualquier expresin basada en las anteriores.

En la clusula GROUP BY se colocan las columnas por las que vamos a agrupar. Y en la
clusula HAVING se especifica la condicin que han de cumplir los grupos para pasar al
resultado.
En SQL la sintaxis que se utiliza es de la siguiente manera:

EJEMPLO SQL HAVING


Tenemos la tabla PRODUCTO y se desea saber las fbricas que producen ms de 500
dlares.
fabrica

descripcin

precio

CintyComp

Computadora

800

Computrom

Teclado

30

NoviCompu

Impresora

150

NoviCompu

Mouse

20

Computrom

Disco Duro

120

28

SELECT fabrica,SUM(precio) as Precio_total


FROM PRODUCTO
GROUP BY fabrica
HAVING SUM(precio)

La funcin as es solo una etiqueta de salida de nuestro resultado.

fabrica
CintyComp

Precio_total
800

5.9 Subconsultas
Una subconsulta es una sentencia SELECT que aparece dentro de otra
sentencia SELECT que llamaremos consulta principal.
Se puede encontrar en la lista de seleccin, en la clusula WHERE o en la clusula
HAVING de la consulta principal.
Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal
exceptuando que aparece encerrada entre parntesis, no puede contener la
clusula ORDER BY, ni puede ser la UNION de varias sentencias SELECT, adems
tiene algunas restricciones en cuanto a nmero de columnas segn el lugar donde
aparece en la consulta principal. Estas restricciones las iremos describiendo en cada
caso.
Cuando se ejecuta una consulta que contiene una subconsulta, la subconsulta se ejecuta
por cada fila de la consulta principal.
Se aconseja no utilizar campos calculados en las subconsultas, ralentizan la consulta.
Las consultas que utilizan subconsultas suelen ser ms fciles de interpretar por el
usuario.
Un ejemplo de esto ocurre cuando queremos conocer los nombres de los empleados
cuyo salario est por encima de la media:
SQL> select nombre from emp
2 where salario > (select avg(salario) from emp);
NOMBRE
Cano
Roncal
Prez
Sastre

29

Yuste
Recio
.
La consulta ms interna calcula el salario medio, y la consulta ms externa lo utiliza
para seleccionar los nombres que ganan ms que la media.
El valor de comparacin puede ser un valor simple, como en el ejemplo anterior, o un
conjunto de valores. Hay que tener en cuenta este detalle ya que el tipo de operador a
utilizar vara. En el primer caso se puede utilizar un operador de comparacin de
carcter aritmtico (<, >, etc.). Y en el segundo uno de tipo lgico (IN).
Las subconsultas pueden devolver ms de una columna, y se habrn de comparar de
manera consecuente:
Las columnas de la clusula WHERE de la consulta principal deben estar
agrupadas por parntesis.
Las columnas encerradas entre parntesis deben coincidir en nmero y tipo de
datos con los datos que devuelve la subconsulta.
El nivel de anidamiento de subconsultas es ilimitado.
Se puede utilizar una subconsulta para insertar valores en una tabla en el momento de la
creacin de la misma con la clusula AS.

5.9.1 Anidar Subconsultas


Las subconsultas pueden anidarse de forma que una subconsulta aparezca en la clusula
WHERE (por ejemplo) de otra subconsulta que a su vez forma parte de otra consulta
principal. En la prctica, una consulta consume mucho ms tiempo y memoria cuando
se incrementa el nmero de niveles de anidamiento. La consulta resulta tambin ms
difcil de leer, comprender y mantener cuando contiene ms de uno o dos niveles de
subconsultas.

5.9.2 Subconsulta en lista de seleccin


Cuando la subconsulta aparece en la lista de seleccin de la consulta principal, en este
caso la subconsulta, no puede devolver varias filas ni varias columnas, de lo contrario se
da un mensaje de error.
Muchos SQLs no permiten que una subconsulta aparezca en la lista de seleccin de la
consulta principal pero eso no es ningn problema ya que normalmente se puede
obtener lo mismo utilizando como origen de datos las dos tablas.

5.9.3Subconsulta en las clausulas where y having

30

Se suele utilizar subconsultas en las clusulas WHERE o HAVING cuando los datos que
queremos visualizar estn en una tabla pero para seleccionar las filas de esa tabla
necesitamos un dato que est en otra tabla.
En una clusula WHERE / HAVING tenemos siempre una condicin y la subconsulta
acta de operando dentro de esa condicin.
En el ejemplo anterior se compara contrato con el resultado de la subconsulta. Hasta
ahora las condiciones estudiadas tenan como operandos valores simples (el valor
contenido en una columna de una fila de la tabla, el resultado de una operacin
aritmtica...) ahora la subconsulta puede devolver una columna entera por lo que es
necesario definir otro tipo de condiciones especiales para cuando se utilizan con
subconsultas.

6. Ejercicios propuestos sobre sentencias SQL


EJERCICIO 1. Tienda Informtica
A) Realizar una base de una tienda informtica con tablas de FABRICANTES y
ARTICULOS.
CREATETABLEFABRICANTES
(
codigointegernotnull,
nombrevarchar (8),
PRIMARYKEY (codigo)
)
CREATETABLEARTICULOS
(
codigo_articulointegernotnull,
codigointnotnull,
nombrevarchar (8),
preciodecimal (6,2),
PRIMARYKEY (codigo_articulo),
FOREIGNKEY (codigo)REFERENCESFABRICANTES(codigo)
)
Modificar el campo nombre artculo para poder ingresar teclado usb genius
ALTERTABLEARTICULOS
ALTERCOLUMNnombrevarchar(30);
Tambien aplicamos el cambio al nombre del fabricante
ALTERTABLEFABRICANTES
ALTERCOLUMNnombrevarchar(25);
Insertar 5 fabricantes

31

INSERTINTOFABRICANTES(codigo,nombre)
VALUES (1,'PcComputer')
INSERTINTOFABRICANTES(codigo,nombre)
VALUES (2,'FDG Tecnology')
INSERTINTOFABRICANTES(codigo,nombre)
VALUES (3,'Computrom')
INSERTINTOFABRICANTES(codigo,nombre)
VALUES (4,'NoviCompu')
INSERTINTOFABRICANTES(codigo,nombre)
VALUES (5,'CintyComp')

Insertar 30 artculos
INSERTINTOARTICULOS(codigo_articulo,nombre,precio,codigo)
VALUES (001,'Teclado Inalambrico',25.00,1)
INSERTINTOARTICULOS(codigo_articulo,nombre,precio,codigo)
VALUES (002,'Mouse Inalambrico',10.00,2)
codigo_articulo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

codigo
1
2
3
4
5
2
4
1
3
5
3
1
2
5
4
1
3
4
2

nombre
Teclado Inalambrico
Mouse Inalambrico
NoteBooK Asus
Disco Duro Externo 1TB
Mp3 Sony 4GB
Camara Canon 15MPX
Parlantes
Inpresora Lexmar B/N Color
Pendrive HP 16 GB
Samsung Table
Samsung Galaxy S4
XBOx 360 Controller
NoteBook HP Compag
Teclado
LG Monitor 15.6
Philips Televisor 42
Camara Samsung 14Mxp
Impresora 3 en 1 Canon
PSP 3

precio
25,00
10,00
700,00
110,00
26,00
200,00
6,00
89,00
20,00
210,00
800,00
25,70
550,00
19,00
125,00
349,00
199,00
145,00
500,00

32

20
21
22
23
24
25
26
27
28
29
30

5
4
3
2
1
5
4
5
3
2
1

Tarjeta Sonido
Audifonos Genius
Microfono
CPU Niutex
Impresora Laser B/N
Apple ipad MINI 16GB
Flas Memory Toshiba 4GB
PSP 3 Vita
Xbox 360
MainBoard
Laptod Toshiba

45,00
5,00
15,00
2000,00
175,00
329,00
12,00
288,00
660,00
180,00
110,00

1) Aadir el campo de descuento a la tabla artculos y aadir un descuento del 5% a todos


los artculos cuyo precio sea mayor de 300 usd.
ALTERTABLEARTICULOS
ADDdescuentoint
Aadir descuento
UPDATEARTICULOSSETdescuento=5 WHEREprecio>300
codigo_articulo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

codigo
1
2
3
4
5
2
4
1
3
5
3
1
2
5
4
1
3
4
2
5
4
3
2
1

nombre
Teclado Inalambrico
Mouse Inalambrico
NoteBooK Asus
Disco Duro Externo 1TB
Mp3 Sony 4GB
Camara Canon 15MPX
Parlantes
Inpresora Lexmar B/N Color
Pendrive HP 16 GB
Samsung Table
Samsung Galaxy S4
XBOx 360 Controller
NoteBook HP Compag
Teclado
LG Monitor 15.6
Philips Televisor 42
Camara Samsung 14Mxp
Impresora 3 en 1 Canon
PSP 3
Tarjeta Sonido
Audifonos Genius
Microfono
CPU Niutex
Impresora Laser B/N

precio
25,00
10,00
700,00
110,00
26,00
200,00
6,00
89,00
20,00
210,00
800,00
25,70
550,00
19,00
125,00
349,00
199,00
145,00
500,00
45,00
5,00
15,00
2000,00
175,00

descuento
NULL
NULL
5
NULL
NULL
NULL
NULL
NULL
NULL
NULL
5
NULL
5
NULL
NULL
5
NULL
NULL
5
NULL
NULL
NULL
5
NULL

33

25
26
27
28
29
30

5
4
5
3
2
1

Apple ipad MINI 16GB


Flas Memory Toshiba 4GB
PSP 3 Vita
Xbox 360
MainBoard
Laptod Toshiba

329,00
12,00
288,00
660,00
180,00
110,00

5
NULL
NULL
5
NULL
NULL

2) Obtener los nombres de los productos de la tienda 3) Obtener los nombres y precios de los
SELECTnombreFROMARTICULOS
productos de la tienda
SELECTnombre,precioFROMARTICULOS
nombre

nombre

precio

Teclado Inalambrico
Mouse Inalambrico
NoteBooK Asus
Disco Duro Externo 1TB
Mp3 Sony 4GB
Camara Canon 15MPX
Parlantes
Inpresora Lexmar B/N Color
Pendrive HP 16 GB
Samsung Table
Samsung Galaxy S4
XBOx 360 Controller
NoteBook HP Compag
Teclado
LG Monitor 15.6
Philips Televisor 42
Camara Samsung 14Mxp
Impresora 3 en 1 Canon
PSP 3
Tarjeta Sonido
Audifonos Genius
Microfono
CPU Niutex
Impresora Laser B/N
Apple ipad MINI 16GB
Flas Memory Toshiba 4GB
PSP 3 Vita
Xbox 360
MainBoard
Laptod Toshiba

34

Teclado Inalambrico
Mouse Inalambrico
NoteBooK Asus
Disco Duro Externo 1TB
Mp3 Sony 4GB
Camara Canon 15MPX
Parlantes
Inpresora Lexmar B/N Color
Pendrive HP 16 GB
Samsung Table
Samsung Galaxy S4
XBOx 360 Controller
NoteBook HP Compag
Teclado
LG Monitor 15.6

25,00
10,00
700,00
110,00
26,00
200,00
6,00
89,00
20,00
210,00
800,00
25,70
550,00
19,00
125,00

Philips Televisor 42
Camara Samsung 14Mxp
Impresora 3 en 1 Canon
PSP 3
Tarjeta Sonido
Audifonos Genius
Microfono
CPU Niutex
Impresora Laser B/N
Apple ipad MINI 16GB
Flas Memory Toshiba 4GB
PSP 3 Vita
Xbox 360
MainBoard
Laptod Toshiba

349,00
199,00
145,00
500,00
45,00
5,00
15,00
2000,00
175,00
329,00
12,00
288,00
660,00
180,00
110,00

4) Obtener el nombre de los productos cuyo precio sea menor o igual a 200
SELECTnombreFROMARTICULOSWHEREprecio<=200
nombre
Teclado Inalambrico
Mouse Inalambrico
Disco Duro Externo 1TB
Mp3 Sony 4GB
Camara Canon 15MPX
Parlantes
Inpresora Lexmar B/N Color
Pendrive HP 16 GB
XBOx 360 Controller
Teclado
LG Monitor 15.6
Camara Samsung 14Mxp
Impresora 3 en 1 Canon
Tarjeta Sonido
Audifonos Genius
Microfono
Impresora Laser B/N
Flas Memory Toshiba 4GB
MainBoard
Laptod Toshiba
5) Obtener todos los datos de los artculos cuyo precio est entre los 60 y los 120.
SELECT*FROMARTICULOSWHEREpreciobetween('60')AND('120')
codigo_articulo
codigo
nombre
precio
descuento
4
4
NULL
Disco Duro Externo 1TB
110.00
8
1
NULL
Inpresora Lexmar B/N Color
89.00

35

30

Laptod Toshiba

110.00

NULL

6) Obtener el nombre y el precio en pesetas (es decir, el precio en euros multiplicado por
166.386)
SELECTnombre,precio*166.386 FROMARTICULOS
nombre
Teclado Inalambrico
Mouse Inalambrico
NoteBooK Asus
Disco Duro Externo 1TB
Mp3 Sony 4GB
Camara Canon 15MPX
Parlantes
Inpresora Lexmar B/N Color
Pendrive HP 16 GB
Samsung Table
Samsung Galaxy S4
XBOx 360 Controller
NoteBook HP Compag
Teclado
LG Monitor 15.6
Philips Televisor 42
Camara Samsung 14Mxp
Impresora 3 en 1 Canon
PSP 3
Tarjeta Sonido
Audifonos Genius
Microfono
CPU Niutex
Impresora Laser B/N
Apple ipad MINI 16GB
Flas Memory Toshiba 4GB
PSP 3 Vita
Xbox 360
MainBoard
Laptod Toshiba

415965000,00
166386000,00
11647020000,00
1830246000,00
432603600,00
3327720000,00
99831600,00
1480835400,00
332772000,00
3494106000,00
13310880000,00
427612020,00
9151230000,00
316133400,00
2079825000,00
5806871400,00
3311081400,00
2412597000,00
8319300000,00
748737000,00
83193000,00
249579000,00
33277200000,00
2911755000,00
5474099400,00
199663200,00
4791916800,00
10981476000,00
2994948000,00
1830246000,00

7) Seleccionar el precio medio de todos los productos


SELECTAvg(precio)ASPromedioFROMARTICULOS
264.256666
8) Obtener el precio medio de los artculos cuyo cdigo de fabricante sea 2
SELECTAvg(precio)ASPromedioFROMARTICULOS

36

WHEREcodigo=2
573.333333
9) Obtener el nmero de artculos cuyo precio sea mayor o igual a 180
SELECTCOUNT(*)FROMARTICULOS
WHEREprecio>=180
13
10) Obtener el nombre y precio de los artculos cuyo precio sea mayor o igual a 180 y
ordenarlos descendentemente por precio y luego ascendentemente por nombre
SELECTnombre,precioFROMARTICU
SELECTnombre,precioFROMARTICU
LOS
LOS
WHEREprecio>=180
WHEREprecio>=180
ORDERBYprecioDESC
ORDERBYnombreASC
nombre
precio
nombre
precio
CPU Niutex
Samsung Galaxy S4
NoteBooK Asus
Xbox 360
NoteBook HP Compag
PSP 3
Philips Televisor 42
Apple ipad MINI 16GB
PSP 3 Vita
Samsung Table
Camara Canon 15MPX
Camara Samsung 14Mxp
MainBoard

2000.00
800.00
700.00
660.00
550.00
500.00
349.00
329.00
288.00
210.00
200.00
199.00
180.00

Apple ipad MINI 16GB


Camara Canon 15MPX
Camara Samsung 14Mxp
CPU Niutex
MainBoard
NoteBooK Asus
NoteBook HP Compag
Philips Televisor 42
PSP 3
PSP 3 Vita
Samsung Galaxy S4
Samsung Table
Xbox 360

329.00
200.00
199.00
2000.00
180.00
700.00
550.00
349.00
500.00
288.00
800.00
210.00
660.00

11) Obtener el precio medio de los productos de cada fabricante, mostrando solo los digitos
de fabricante
SELECTcodigo,Avg(precio)ASPromedioFROMARTICULOS
GROUPBYcodigo
codigo
promedio
128.950000
1
573.333333
2
399.000000
3
67.166666
4
152.833333
5
12) Cambiar el nombre del producto 8 a Impresora Laser.
UPDATEARTICULOSSETnombre='Impresora Laser'WHEREcodigo_articulo=8

37

codigo_articulo
8

codigo
1

nombre

precio

Impresora Laser

89,00

13) Aplicar un descuento del 10% (Multiplicar el precio por 0.9) a todos los productos
UPDATEARTICULOSSETprecio=precio*0.09
nombre
precio
Teclado Inalambrico
Mouse Inalambrico
NoteBooK Asus
Disco Duro Externo 1TB
Mp3 Sony 4GB
Camara Canon 15MPX
Parlantes
Impresora Laser
Pendrive HP 16 GB
Samsung Table
Samsung Galaxy S4
XBOx 360 Controller
NoteBook HP Compag
Teclado
LG Monitor 15.6
Philips Televisor 42
Camara Samsung 14Mxp
Impresora 3 en 1 Canon
PSP 3
Tarjeta Sonido
Audifonos Genius
Microfono
CPU Niutex
Impresora Laser B/N
Apple ipad MINI 16GB
Flas Memory Toshiba 4GB
PSP 3 Vita
Xbox 360
MainBoard
Laptod Toshiba

2,25
0,90
63,00
9,90
2,34
18,00
0,54
8,01
1,80
18,90
72,00
2,31
49,50
1,71
11,25
31,41
17,91
13,05
45,00
4,05
0,45
1,35
180,00
15,75
29,61
1,08
25,92
59,40
16,20
9,90

14)Aplicar un descuento del 10 a todos los productos cuyo precio sea mayor o igual a 120
.
UPDATEARTICULOSSETprecio=precio-10 WHEREprecio>=120
nombre
precio
Teclado Inalambrico
Mouse Inalambrico
NoteBooK Asus

2,25
0,90
63,00

38

Disco Duro Externo 1TB


Mp3 Sony 4GB
Camara Canon 15MPX
Parlantes
Impresora Laser
Pendrive HP 16 GB
Samsung Table
Samsung Galaxy S4
XBOx 360 Controller
NoteBook HP Compag
Teclado
LG Monitor 15.6
Philips Televisor 42
Camara Samsung 14Mxp
Impresora 3 en 1 Canon
PSP 3
Tarjeta Sonido
Audifonos Genius
Microfono
CPU Niutex
Impresora Laser B/N
Apple ipad MINI 16GB
Flas Memory Toshiba 4GB
PSP 3 Vita
Xbox 360
MainBoard
Laptod Toshiba

9,90
2,34
18,00
0,54
8,01
1,80
18,90
72,00
2,31
49,50
1,71
11,25
31,41
17,91
13,05
45,00
4,05
0,45
1,35
170,00
15,75
29,61
1,08
25,92
59,40
16,20
9,90

EJERCICIO 2. Empleados y departamentos


B) Realizar una base de datos de los EMPLEADOS y DEPARTAMENTOS de una
empresa insertar 40 empleados y 6 departamentos.
Crear una tabla DEPARTAMENTOS
CREATETABLEDEPARTAMENTOS
(
codigointegernotnull,
nombresvarchar (30),
presupuestodecimal (6,1),
PRIMARYKEY (codigo)
)

39

Crear una tabla EMPLEADOS


CREATETABLEEMPLEADOS
(
dnidecimal (8,0)notnull,
codigointnotnull,
nombresvarchar (30),
apellidosvarchar (30),
PRIMARYKEY (dni),
FOREIGNKEY (codigo)REFERENCESDEPARTAMENTOS(codigo)
)

Insertar 6 departamentos.
INSERTINTODEPARTAMENTOS(codigo,nombre,presupuesto)
VALUES (1,'Contabilidad',10000)
INSERTINTODEPARTAMENTOS(codigo,nombre,presupuesto)
VALUES (2,'Bodega',50000)
INSERTINTODEPARTAMENTOS(codigo,nombre,presupuesto)
VALUES (3,'Mantenimiento',20000)
INSERTINTODEPARTAMENTOS(codigo,nombre,presupuesto)
VALUES (4,'Recursos Humanos',35000)
INSERTINTODEPARTAMENTOS(codigo,nombre,presupuesto)
VALUES (5,'Administracion',45000)
INSERTINTODEPARTAMENTOS(codigo,nombre,presupuesto)
VALUES (6,'Presidencia',90000)

40

Insertar 40empleados.
INSERTINTOEMPLEADOS(dni,codigo,nombres,apellidos)
VALUES (1,1,'Alfredo Raul','Perez Almeida')
INSERTINTOEMPLEADOS(dni,codigo,nombres,apellidos)
VALUES (2,2,'Diego Andres','Olmevo Alvaro')
INSERTINTOEMPLEADOS(dni,codigo,nombres,apellidos)
VALUES (3,3,'Diana Janeth','Pea Gonzales')
INSERTINTOEMPLEADOS(dni,codigo,nombres,apellidos)
VALUES (4,4,'Erika Jiseel','Alvaro Perez')
INSERTINTOEMPLEADOS(dni,codigo,nombres,apellidos)
VALUES (5,5,'Orlando Daniel','Loza Ruiz')
INSERTINTOEMPLEADOS(dni,codigo,nombres,apellidos)
VALUES (16,4,'Pedro Ignacio','Ricota Greth')
INSERTINTOEMPLEADOS(dni,codigo,nombres,apellidos)
VALUES (17,5,'Sabrina Gabriela','Romero Ruiz')
INSERTINTOEMPLEADOS(dni,codigo,nombres,apellidos)
VALUES (18,6,'Edgar Alejandro','Guerrero Arroyo')
INSERTINTOEMPLEADOS(dni,codigo,nombres,apellidos)
VALUES (19,1,'Francisco Isaac','Gomez Marquez')
INSERTINTOEMPLEADOS(dni,codigo,nombres,apellidos)
VALUES (20,2,'Mario Alejandro','Huicochea Mason')
INSERTINTOEMPLEADOS(dni,codigo,nombres,apellidos)
VALUES (35,5,'Alejandra Donaji','Herrera Reyes')
INSERTINTOEMPLEADOS(dni,codigo,nombres,apellidos)
VALUES (36,6,'Carmen Delia','Mares Orozco')
INSERTINTOEMPLEADOS(dni,codigo,nombres,apellidos)
VALUES (37,1,'Eduardo Antonio','Trujillo Rivera')
INSERTINTOEMPLEADOS(dni,codigo,nombres,apellidos)
VALUES (38,2,'Uriel Octavio','Moreles Vazquez')
INSERTINTOEMPLEADOS(dni,codigo,nombres,apellidos)
VALUES (39,3,'Luis Cristbal','Nez Betancourt')
INSERTINTOEMPLEADOS(dni,codigo,nombres,apellidos)
VALUES (40,4,'Zoila Maria','Vera Valdez')
dni
1
2
3
4
5

codigo
1
2
3
4
5

nombres
Alfredo Raul
Diego Andres
Diana Janeth
Erika Jiseel
Orlando Daniel

apellidos
Perez Almeida
Olmevo Alvaro
Pea Gonzales
Alvaro Perez
Loza Ruiz

41

6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

6
100
2
3
4
5
6
1
102
3
4
5
6
1
2
102
4
5
6
1
103
3
4
5
100
102
103
3
4
103
6
1
100
3
4

Nancy Irene
Jose Daniel
Bianca Rosa
Helen Ruby
Daniel Andres
Cristina Maribel
Luis Fernado
German Daniel
Ignacio Josue
Kevin Ismael
Pedro Ignacio
Sabrina Gabriela
Edgar Alejandro
Francisco Isaac
Mario Alejandro
Gonzalo Arturo
Orlando Gerardo
Alfredo Paul
Francisco Manuel
Benjamin Manuel
Juan Francisco
Cristina Boryana
Guillermo Augusto
Jorge Antonio
Laura Cecilia
Luis Daniel
Monica Itzuri
Marco Antonio
Mariano Cristbal
Alejandra Donaji
Carmen Delia
Eduardo Antonio
Uriel Octavio
Luis Cristbal
Zoila Maria

Cajilema Rodriguez
Dalia Paz
Roca Andrade
Llano Perez
Safadi Bohrquez
Garcia Ziga
Lanchiba Orbe
Diaz Pineda
Mancilva Paz
Briones Olmedo
Ricota Greth
Romero Ruiz
Guerrero Arroyo
Gomez Marquez
Huicochea Mason
Montalvan Gamezz
Ochoa Castillo
Ramirez Hinojosa
Rodriguez Huerta
Sanchez Lengeling
Leyva Bonilla
Lopez Kolkovska
Amaro Rico
Avila Juregui
Avila Juregui
Cahuich Ramirez
Delgado Carrillo
Figueroa Ibarra
Franco De Leon
Herrera Reyes
Mares Orozco
Trujillo Rivera
Moreles Vazquez
Nez Betancourt
Vera Valdez

1) Obtener los apellidos de los empleados


2) Obtener los apellidos de los
empleados sin repeticin
SELECTapellidosFROMEMPLEADOS
SELECTDISTINCTapellidosFROMEMPLEADOS
N
apellidos
5 Loza Ruiz
1 Perez Almeida
6 Cajilema Rodriguez
2 Olmevo Alvaro
7 Dalia Paz
3 Pea Gonzales
8 Roca Andrade
4 Alvaro Perez
9 Llano Perez

42

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
N
1
2
3
4
5
6
7
8
9
10
11
12

Safadi Bohrquez
Garcia Zga
Lanchiba Orbe
Diaz Pineda
Mancilva Paz
Briones Olmedo
Ricota Greth
Romero Ruiz
Guerrero Arroyo
Gomez Marquez
Huicochea Mason
Montalvan Gamezz
Ochoa Castillo
Ramirez Hinojosa
Rodriguez Huerta
Sanchez Lengeling
Leyva Bonilla
Lopez Kolkovska
Amaro Rico
Avila Juregui
Avila Juregui
Cahuich Ramirez
Delgado Carrillo
Figueroa Ibarra
Franco De Leon
Herrera Reyes
Mares Orozco
Trujillo Rivera
Moreles Vazquez
Nez Betancourt
Vera Valdez
apellidos
Alvaro Perez
Amaro Rico
Avila Juregui
Briones Olmedo
Cahuich Ramirez
Cajilema Rodriguez
Dalia Paz
Delgado Carrillo
Diaz Pineda
Figueroa Ibarra
Franco De Leon
Garcia Zga

13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

Gomez Marquez
Guerrero Arroyo
Herrera Reyes
Huicochea Mason
Lanchiba Orbe
Leyva Bonilla
Llano Perez
Lopez Kolkovska
Loza Ruiz
Mancilva Paz
Mares Orozco
Montalvan Gamezz
Moreles Vazquez
Nez Betancourt
Ochoa Castillo
Olmevo Alvaro
Pea Gonzales
Perez Almeida
Ramirez Hinojosa
Ricota Greth
Roca Andrade
Rodriguez Huerta
Romero Ruiz
Safadi Bohrquez
Sanchez Lengeling
Trujillo Rivera
Vera Valdez

43

Base de Datos I

3) Obtener todos los datos de los empleados que se apellidan Safadi


SELECT*FROMEMPLEADOSWHEREapellidosbetween('Safadi A')AND('Safadi
Z')
N
1

dni
10

codigo
4

nombres
Daniel Andres

apellidos
Safadi Bohrquez

4) Obtener todos los datos de los empleados que se apellidan Safadi Bohrquez y los que
se apellidan Garcia Zuiga.
SELECT*FROMEMPLEADOSWHEREapellidos='Safadi
Bohrquez'ORapellidos='Garcia Ziga'
codigo
nombres
apellidos
N
dni
4
Daniel Andres
Safadi Bohrquez
1
10
5
Cristina Maribel
Garcia Ziga
2
11
5)Obtener todos los datos de los empleados que trabajan para el departamento 100
SELECT*FROMEMPLEADOSWHEREcodigo=100
codigo
nombres
apellidos
N
dni
1
2
3

7
30
38

100
100
100

Jose Daniel
Laura Cecilia
Uriel Octavio

Dalia Paz
Avila Juregui
Moreles Vazquez

6) Obtener todos los datos de los empleados que trabajan para el departamento 100 y para
el departamento 103.
SELECT*FROMEMPLEADOSWHEREcodigo=100 ORcodigo=103
codigo
nombres
apellidos
N
dni
1
7
100
Jose Daniel
Dalia Paz
2
26
103
Juan Francisco
Leyva Bonilla
3
30
100
Laura Cecilia
Avila Juregui
4
32
103
Monica Itzuri
Delgado Carrillo
5
35
103
Alejandra Donaji Herrera Reyes
6
38
100
Uriel Octavio
Moreles Vazquez
7) Obtener todos los datos de los empleados cuyo segundo apellido comience por C
SELECT*FROMEMPLEADOSWHEREapellidoslike'% C%'
codigo
nombres
apellidos
N
dni
1
22
4
Orlando Gerardo
Ochoa Castillo
2
32
103
Monica Itzuri
Delgado Carrillo

8) Obtener el presupuesto total de todos los departamentos.


SELECTsum(presupuesto)FROMDEPARTAMENTOS
N
1
335500.0

9) Obtener el nmero en empleados en cada departamento.

7
0

Base de Datos I
SELECTcodigo,COUNT(*)FROMEMPLEADOSGROUPBYcodigo
N
cdigo
1
5
1
2
3
2
3
6
3
4
7
4
5
5
5
6
5
6
100
3
7
102
3
8
103
3
9
10) Obtener los nombres y apellidos de los empleados que trabajan en departamentos cuyo
presupuesto sea mayor a 1000 (Sin subconsulta).
SELECTDISTINCTnombres,apellidosFROMDEPARTAMENTOS,EMPLEADOSWHEREp
resupuesto>1000.00
nombres
apellidos
Alejandra Donaji
Herrera Reyes
Alfredo Paul
Ramirez Hinojosa
Alfredo Raul
Perez Almeida
Benjamin Manuel
Sanchez Lengeling
Bianca Rosa
Roca Andrade
Carmen Delia
Mares Orozco
Cristina Boryana
Lopez Kolkovska
Cristina Maribel
Garcia Ziga
Daniel Andres
Safadi Bohrquez
Diana Janeth
Pea Gonzales
Diego Andres
Olmevo Alvaro
Edgar Alejandro
Guerrero Arroyo
Eduardo Antonio
Trujillo Rivera
Erika Jiseel
Alvaro Perez
Esther
Vzquez
Francisco Isaac
Gomez Marquez
Francisco Manuel
Rodriguez Huerta
German Daniel
Diaz Pineda
Gonzalo Arturo
Montalvan Gamezz
Guillermo Augusto
Amaro Rico
Helen Ruby
Llano Perez
Ignacio Josue
Mancilva Paz
Jorge Antonio
Avila Juregui
Jose Daniel
Dalia Paz
Juan Francisco
Leyva Bonilla
Kevin Ismael
Briones Olmedo
Laura Cecilia
Avila Juregui
Luis Cristbal
Nez Betancourt
Luis Daniel
Cahuich Ramirez
Luis Fernado
Lanchiba Orbe
Marco Antonio
Figueroa Ibarra

7
0

Base de Datos I
Mariano Cristbal
Mario Alejandro
Monica Itzuri
Nancy Irene
Orlando Daniel
Orlando Gerardo
Pedro Ignacio
Sabrina Gabriela
Uriel Octavio
Zoila Maria

Franco De Leon
Huicochea Mason
Delgado Carrillo
Cajilema Rodriguez
Loza Ruiz
Ochoa Castillo
Ricota Greth
Romero Ruiz
Moreles Vazquez
Vera Valdez

11) Aadir un nuevo departamento: Calidad, con presupuesto de 40,000 y cdigo 104.
Aadir un empleado vinculado al departamento recin creado: Esther Vzquez, DNI:
89267109
INSERT INTO DEPARTAMENTOS(codigo,nombre,presupuesto)
VALUES (104,'Calidad',40000)
Insertar empleado
INSERT INTO EMPLEADOS(dni,codigo,nombres,apellidos)
VALUES (89267109,104,'Esther','Vzquez')
N
1

dni
89267109

codigo
104

nombres
Esther

apellidos
Vzquez

12) Aplicar un recorte presupuestal del 10% a todos los departamentos.


UPDATEDEPARTAMENTOSSETpresupuesto=presupuesto/1.10
codigo
1
2
3
4
5
6
100
101
102
103
104

nombres
Contabilidad
Bodega
Mantenimiento
Recursos Humanos
Administracion
Presidencia
Limpieza
Conlecturia
Caja
Seguridad
Calidad

presupuesto
9090,9
45454,5
18181,8
31818,2
40909,1
81818,2
454,5
200,0
63636,4
13636,4
36363,6

13) Reasignar a los empleados del departamento de Administracin (cdigo 100) al


departamento de rea Tcnica (cdigo 103)
UPDATEEMPLEADOSSETcodigo=103 WHEREcodigo=100
dni
codigo
nombres
apellidos

7
0

Base de Datos I
26
32
35

dni
26
32
35

103
103
103

Juan Francisco
Monica Itzuri
Alejandra Donaji

codigo
nombres
100 Juan Francisco
100 Monica Itzuri
100 Alejandra Donaji

Leyva Bonilla
Delgado Carrillo
Herrera Reyes

apellidos
Leyva Bonilla
Delgado Carrillo
Herrera Reyes

14) Despedir a todos los empleados que trabajan para el departamento de Contabilidad
(cdigo 101).

DELETEFROMEMPLEADOSWHEREcodigo=101

EJERCICIO 3. CORRETAJE INMOBILIARIO


Crear el modelo entidad relacin

Crear la base en el motor de su eleccin

7
0

Base de Datos I

1) Los arrendatarios que arriendan la casa ubicada en la calle Carrera n 1024 Santiago
SELECT nombre,apellido
FROM ARRENDATARIO
WHERE id_arrendatario in (
SELECT id_arrendatario
FROM ARRIENDA
WHERE id_casa in (
SELECT id_casa
FROM CASA
WHERE calle='Carrera' AND numero=1024 AND
comuna='Santiago')
)

2) Cuanto le deben a Maria Perez


SELECT sum (deuda)
FROM ARRIENDA
WHERE id_casa IN (
SELECT id_casa
FROM CASA
WHERE id_dueo IN (
SELECT id_dueo
FROM DUEO
Where nombre='Maria' AND apellido='Perez')
)
SELECT nombre FROM ARTICULOS WHERE precio<=200

7
0

Base de Datos I

3) Cul es la dueda total para cada dueo?


SELECT DUEO.nombre,sum (deuda)
FROM ARRIENDA, DUEO, CASA
WHERE DUEO.id_dueo = CASA.id_dueo
GROUP BY DUEO.nombre
HAVING ARRIENDA.id_casa = all (
SELECT CASA.id_casa
FROM CASA
WHERE ARRIENDA.id_casa = CASA.id_casa AND id_dueo IN (
SELECT id_dueo
FROM DUEO
)
)
4) Liste todas las personas de la base de datos
SELECT DISTINCT *
FROM ARRENDATARIO A, DUEO D
GROUP BY A.nombre

5) Indique los duelos que poseen tres o mas casas


SELECT D.nombre
FROM DUEO D
WHERE id_dueo IN (
SELECT id_dueo
FROM CASA
GROUP BY id_dueo
HAVING COUNT (*)>3
)

6) Seleccionar el promedio de todos los productos


SELECT Avg(deuda)AS Precio_Medio FROM ARRIENDA

7) Obtener la varianza
SELECT VAR(deuda)AS Precio_Medio FROM ARRIENDA

8) Obtener el maximo

7
0

Base de Datos I
SELECT MAX (deuda)AS Precio_Medio FROM ARRIENDA

9) Obtener el minmimo
SELECT MIN (deuda)AS Precio_Medio FROM ARRIENDA

10)Obtener un listado completo de articulos, incluyendo por cada articulo los datos del
articulo y de su fabricante.
SELECT * FROM ARTICULOS,FABRICANTES
WHERE ARTICULOS.codigo=FABRICANTES.codigo
CON INNER JOIN
SELECT * FROM ARTICULOS INNERJOIN FABRICANTES
ON ARTICULOS.codigo = FABRICANTES.codigo
codigo_articulo codigo
nombre
precio
codigo
1
2
3
4
5
6
7
8
9
10
21
22
23
24
25
26
27
28
29
30

1
2
3
4
5
2
4
1
3
5
4
3
2
1
5
4
5
3
2
1

Teclado Inalambrico
Mouse Inalambrico
NoteBooK Asus
Disco Duro Externo 1TB
Mp3 Sony 4GB
Camara Canon 15MPX
Parlantes
Inpresora Lexmar B/N Color
Pendrive HP 16 GB
Samsung Table
Audifonos Genius
Microfono
CPU Niutex
Impresora Laser B/N
Apple ipad MINI 16GB
Flas Memory Toshiba 4GB
PSP 3 Vita
Xbox 360
MainBoard
Laptod Toshiba

25.00
10.00
700.00
110.00
26.00
200.00
6.00
89.00
20.00
210.00
5.00
15.00
2000.00
175.00
329.00
12.00
288.00
660.00
180.00
110.00

1
2
3
4
5
2
4
1
3
5
4
3
2
1
5
4
5
3
2
1

nombre
PcComputer
FDG Tecnology
Computrom
NoviCompu
CintyComp
FDG Tecnology
NoviCompu
PcComputer
Computrom
CintyComp
NoviCompu
Computrom
FDG Tecnology
PcComputer
CintyComp
NoviCompu
CintyComp
Computrom
FDG Tecnology
PcComputer

1.11) Obtener un listado de artidulos, incluyendo el nombre del articulo, su precio, y el


nombre de su fabricante.

7
0

Base de Datos I
SELECT
ARTICULOS.nombre,precio,FABRICANTES.nombre FROM
ARTICULOS,FABRICANTES
WHERE ARTICULOS.codigo=FABRICANTES.codigo
CON INNER JOIN
SELECT ARTICULOS.nombre,precio,FABRICANTES.nombre FROM ARTICULOS
INNER JOIN FABRICANTES
ON ARTICULOS.codigo=FABRICANTES.codigo
nombre

precio

Teclado Inalambrico
Mouse Inalambrico
NoteBooK Asus
Disco Duro Externo 1TB
Mp3 Sony 4GB
Camara Canon 15MPX
Parlantes
Inpresora Lexmar B/N Color
Pendrive HP 16 GB
Samsung Table
Audifonos Genius
Microfono
CPU Niutex
Impresora Laser B/N
Apple ipad MINI 16GB
Flas Memory Toshiba 4GB
PSP 3 Vita
Xbox 360
MainBoard
Laptod Toshiba

25.00
10.00
700.00
110.00
26.00
200.00
6.00
89.00
20.00
210.00
5.00
15.00
2000.00
175.00
329.00
12.00
288.00
660.00
180.00
110.00

nombre
PcComputer
FDG Tecnology
Computrom
NoviCompu
CintyComp
FDG Tecnology
NoviCompu
PcComputer
Computrom
CintyComp
NoviCompu
Computrom
FDG Tecnology
PcComputer
CintyComp
NoviCompu
CintyComp
Computrom
FDG Tecnology
PcComputer

1.12)Obtener el precio medio de los productos de cada fabricante, mostrando solo los
digitos de fabricante
SELECT codigo,Avg(precio)AS recio_Medio FROM ARTICULOS
GROUPBY codigo
codigo
Precio_Medio
128.950000
1
573.333333
2
399.000000
3
67.166666
4
152.833333
5
1.13) Obtener el precio medio de los productos de cada fabricante, mostrando el nombre
del fabricante
SELECT Avg(precio)AS Precio_Medio,FABRICANTES.nombre
FROM ARTICULOS,FABRICANTES

7
0

Base de Datos I
WHERE ARTICULOS.codigo=FABRICANTES.codigo
GROUP BY FABRICANTES.nombre
CON INNER JOIN
SELECT Avg(precio)AS Precio_Medio,FABRICANTES.nombre
FROM ARTICULOS INNER JOIN FABRICANTES
ON ARTICULOS.codigo=FABRICANTES.codigo
GROUP BY FABRICANTES.nombre
Precio_Medio
nombre
213.250.000
348.750.000
597.500.000
33.250.000
99.750.000

CintyComp
Computrom
FDG Tecnology
NoviCompu
PcComputer

1.14) Obtener los nombres de los fabricantes que ofrescan productos cuyo precio medio
sea mayor o igual a 150 .
SELECTAvg(precio)AS Precio_Medio,FABRICANTES.nombre
FROM ARTICULOS,FABRICANTES
WHERE ARTICULOS.codigo =FABRICANTES.codigo
GROUP BY FABRICANTES.nombre
HAVING AVG(precio)>=150
CON INNER JOIN
SELECT Avg(precio)AS Precio_Medio,FABRICANTES.nombre
FROM ARTICULOS INNERJOINFABRICANTES
ON ARTICULOS.codigo=FABRICANTES.codigo
GROUP BY FABRICANTES.nombre
HAVING AVG(precio)>=150
Precio_Medio
nombre
213.250.000
348.750.000
597.500.000

CintyComp
Computrom
FDG Tecnology

1.15) Obtener el nombre y precio del articulo mas barato


SELECT nombre,precio
FROM ARTICULOS
WHERE precio=(SELECT MIN(precio)FROM ARTICULOS)
nombre
precio
Teclado Inalambrico

25.00

1.16)Obtener una lista con el nombre y precio de los articulos ms caros de cada
proveedor (incluyendo el nombre del proveedor).
SELECT A.nombre,A.precio,F.nombre
FROM ARTICULOSA,FABRICANTESF
WHERE A.codigo=F.codigo
AND A.precio=
(
SELECT MAX(A.precio)
FROM ARTICULOSA
WHERE A.codigo=F.codigo

7
0

Base de Datos I
)
CON INNER JOIN
SELECT A.nombre,A.precio,F.nombre
FROM ARTICULOSAINNERJOINFABRICANTESF
ON A.codigo=F.codigo
AND A.precio=
(
SELECT MAX(A.precio)
FROM ARTICULOSA
WHERE A.codigo=F.codigo
)
nombre

precio

Apple ipad MINI 16GB


Disco Duro Externo 1TB
NoteBooK Asus
CPU Niutex
Impresora Laser B/N

329.00
110.00
700.00
2000.00
175.00

nombre
CintyComp
NoviCompu
Computrom
FDG Tecnology
PcComputer

1.17) Aadir un nuevo producto: Altavoces de 70 (del fabricante 2)


INSERTINTO ARTICULOS(codigo_articulo,nombre,precio ,codigo)
VALUES (31,'Altavoces ',70,2)
codigo_articulo
codigo
nombre
precio
31

Altavoces

70.00

1.18) Cabiar el nombre del producto 8 a Impresora laser


UPDATE
ARTICULOS
SET
nombre='Impresora
codigo_articulo=8
codigo_articulo
codigo
nombre
8
1
Impresora Laser

Laser'

WHERE

precio
89,00

1.19) Aplicar un descuento del 10% (Multiplicar el precio por 0.9) a todos los productos
UPDATE ARTICULOS SET precio=precio*0.09
nombre
precio
Teclado Inalambrico
Mouse Inalambrico
NoteBooK Asus
Disco Duro Externo 1TB
Mp3 Sony 4GB
Camara Canon 15MPX
Parlantes
Impresora Laser
Pendrive HP 16 GB
Samsung Table
Samsung Galaxy S4

2,25
0,90
63,00
9,90
2,34
18,00
0,54
8,01
1,80
18,90
72,00

7
0

Base de Datos I
XBOx 360 Controller
NoteBook HP Compag
Teclado
LG Monitor 15.6
Philips Televisor 42
Camara Samsung 14Mxp
Impresora 3 en 1 Canon
PSP 3
Tarjeta Sonido
Audifonos Genius
Microfono
CPU Niutex
Impresora Laser B/N
Apple ipad MINI 16GB
Flas Memory Toshiba 4GB
PSP 3 Vita
Xbox 360
MainBoard
Laptod Toshiba

2,31
49,50
1,71
11,25
31,41
17,91
13,05
45,00
4,05
0,45
1,35
180,00
15,75
29,61
1,08
25,92
59,40
16,20
9,90

1.20)Aplicar un descuento del 10 a todos los productos cuyo precio sea mayor o igual a
120 .
UPDATE ARTICULOS SET precio=precio-10 WHERE precio>=120
nombre
precio
Teclado Inalambrico
Mouse Inalambrico
NoteBooK Asus
Disco Duro Externo 1TB
Mp3 Sony 4GB
Camara Canon 15MPX
Parlantes
Impresora Laser
Pendrive HP 16 GB
Samsung Table
Samsung Galaxy S4
XBOx 360 Controller
NoteBook HP Compag
Teclado
LG Monitor 15.6
Philips Televisor 42
Camara Samsung 14Mxp
Impresora 3 en 1 Canon
PSP 3
Tarjeta Sonido

2,25
0,90
63,00
9,90
2,34
18,00
0,54
8,01
1,80
18,90
72,00
2,31
49,50
1,71
11,25
31,41
17,91
13,05
45,00
4,05

7
0

Base de Datos I
Audifonos Genius
Microfono
CPU Niutex
Impresora Laser B/N
Apple ipad MINI 16GB
Flas Memory Toshiba 4GB
PSP 3 Vita
Xbox 360
MainBoard
Laptod Toshiba

0,45
1,35
170,00
15,75
29,61
1,08
25,92
59,40
16,20
9,90

EJERCICIO 4. LOS INVESTIGADORES

Realizar la base de datos


1. Crear tabla facultad
CREATE TABLE FACULTAD
(
codigo integer not null,
nombre varchar (100),
PRIMARY KEY (codigo)
)
2. Crear tabla Investigadores
CREATE TABLE INVESTIGADORES
(
dni varchar (8) not null,
nomape varchar (254),
facultad int,
PRIMARY KEY (dni),
FOREIGN KEY (facultad)REFERENCES FACULTAD(codigo)
)
3. Crear tabla equipos
CREATE TABLE EQUIPOS
(
numserie varchar (6) not null,

7
0

Base de Datos I
nombre varchar (254),
facultad int,
PRIMARY KEY (numserie),
FOREIGN KEY (facultad)REFERENCES FACULTAD(codigo)
)
3. Crear tabla reserva
CREATE TABLE RESERVA
(
comienzo datetime,
fin datetime,
facultad int,
dni varchar(8),
numserie varchar (6)
FOREIGN KEY (dni)REFERENCES INVESTIGADORES(dni),
FOREIGN KEY (numserie)REFERENCES EQUIPOS(numserie)
)
9.1) Obtener el DNI y el nombre de aquellos investigadores que han realizado ms de una
reserva
SELECT I.dni, nomape
FROM INVESTIGADORES I LEFT JOIN RESERVA R
ON R.dni = I.dni
GROUP BY I.dni, nomape
HAVING COUNT (R.dni)>1
dni
10
11
12
13
14
15
16
17
18
19
20
21

nomape
Juan Perez
Daniel Lopez
Fernando Mendez
Guido Landazuri
Francisco Alban
Martin Azhafari
Javier Pea
Jose Paz
Gabriela Amagua
Maria Espinosa
Fernanda Bueno
Jessica Lopez

9.2) Obtener un listado completo de reservas, incluyendo los siguientes datos:


DNI y el nombre del investigador, junto con el nombre de su facultad
Numero de serie y nombre del equipo reservado, junto con el nombre de la
facultad a la que pertenece.
Fecha de comienzo y fin de la reserva.
SELECT I.dni, nomape, F_INV.nombre, E.numserie, E.nombre,
F_EQUIP.nombre, comienzo,fin
FROM RESERVA R, INVESTIGADORES I, EQUIPOS E,FACULTAD F_INV,
FACULTAD F_EQUIP
WHERE R.dni=I.dni
AND R.numserie = E.numserie
AND I.facultad=F_INV.codigo
AND E.facultad=F_EQUIP.codigo

7
0

Base de Datos I
dni

nomape

nombre

numserie

nombre

nombre

comienzo

fin

7
0

Base de Datos I

10 Juan Perez
11 Daniel Lopez
Fernando
12 Mendez
Guido
13 Landazuri
Francisco
14 Alban
Martin
15 Azhafari
16 Javier Pea
17 Jose Paz
Gabriela
18 Amagua

Ciencias Fisicas y
Matematicas

100

Microscopios

Psicologia

101

Libros Tecnicos

Medicina

102

Ciencias Quimicas

103

Administracion

104

Economia
Ciencias Fisicas y
Matematicas

Medicina
Ciencias Fisicas y
Matematicas

2013-05-25 2013-05-26

Mesas de Madera
Elementos
Quimicos

Psicologia

2013-05-27 2013-05-29

Ciencias Quimicas

2013-05-27 2013-05-28

Administracion

2013-05-27 2013-05-27

105

Libros de Leyes
Libros de
Economia I

Economia

2013-05-28 2013-05-29

106

Pinzas

2013-05-29 2013-05-30

Psicologia

107

Medicina

108

Tesis
Libros de
Pedagogia

Medicina
Ciencias Fisicas y
Matematicas
Psicologia

2013-06-02 2013-06-03

Ciencias Quimicas

2013-06-03 2013-06-04

Administracion

2013-06-05 2013-06-07

Economia

2013-06-06 2013-06-07

Medicina
Ciencias Fisicas y
Matematicas

2013-07-25 2013-08-26

19 Maria Espinosa Ciencias Quimicas


Fernanda
20 Bueno
Administracion

109

21 Jessica Lopez
10 Juan Perez
11 Daniel Lopez
Fernando
12 Mendez
Guido
13 Landazuri
Francisco
14 Alban
Martin
15 Azhafari
16 Javier Pea
17 Jose Paz
Gabriela
18 Amagua

2013-05-25 2013-05-26

2013-06-01 2013-06-02

Economia
Ciencias Fisicas y
Matematicas

111

Recipientes
Libros de
Contabilidad
Libros de
Economia II

100

Microscopios

Psicologia

101

Libros Tecnicos

Medicina

102

Psicologia

2013-07-27 2013-08-29

Ciencias Quimicas

103

Mesas de Madera
Elementos
Quimicos

Ciencias Quimicas

2013-07-27 2013-08-28

Administracion

104

Administracion

2013-07-27 2013-08-27

Economia
Ciencias Fisicas y
Matematicas

105

Libros de Leyes
Libros de
Economia I

Economia

2013-07-28 2013-08-29

106

Pinzas

2013-07-29 2013-08-30

Psicologia

107

Medicina

108

Tesis
Libros de
Pedagogia

Medicina
Ciencias Fisicas y
Matematicas
Psicologia

2013-08-02 2013-09-03

Ciencias Quimicas

2013-08-03 2013-09-04

Administracion

2013-08-05 2013-09-07

Economia

2013-08-06 2013-09-07

Administracion

2013-08-07 2013-09-08

Economia

2013-08-08 2013-09-09

110

19 Maria Espinosa Ciencias Quimicas


Fernanda
20 Bueno
Administracion

109

21 Jessica Lopez
Fernanda
20 Bueno

Economia

111

Administracion

110

21 Jessica Lopez

Economia

111

110

Recipientes
Libros de
Contabilidad
Libros de
Economia II
Libros de
Contabilidad
Libros de
Economia II

2013-07-25 2013-08-26

2013-08-01 2013-09-02

9.3) Obtener DNI y el nombre de los investigadores que han reservado equipos que no son
de su facultad
SELECT DISTINCT I.dni, nomape
FROM RESERVA R, INVESTIGADORES I, EQUIPOS E
WHERE R.dni = I.dni
AND R.numserie = E.numserie

7
0

Base de Datos I
AND I.facultad = E.facultad
dni
13
14
15
19
20
21

nomape
Guido Landazuri
Francisco Alban
Martin Azhafari
Maria Espinosa
Fernanda Bueno
Jessica Lopez

9.4) Obtener los nombres de las facultades en las que ningun investigador ha realizado una
reserva
SELECT nombre FROM FACULTAD
WHERE codigo IN
(
SELECT FACULTAD
FROM INVESTIGADORES I LEFT JOIN RESERVA R
ON I.dni = R.dni
GROUP BY facultad
HAVING COUNT (R.dni)=0
)
nombre
9.5) Obtener los nombres de las facultades con investigadores osciosos (Investigadores
que no han realizado niguna reserva)
SELECT nombre FROM FACULTAD
WHERE codigo IN
(
SELECT FACULTAD FROM INVESTIGADORES
WHERE dni NOT IN
(
SELECT dni FROM RESERVA
)
)
nombre
Medicina
9.6) Obtener el numero de serie y nombre de los equipos que nunca han sido reservados
SELECT E.numserie, nombre
FROM EQUIPOS E LEFT JOIN RESERVA R
ON R.numserie= E.numserie
GROUP BY E.numserie, nombre
HAVING COUNT (R.numserie)=0
numserie
112

nombre
Pizarra 50x50

7
0

Base de Datos I
EJERCICIO 5. FERRETERIA FC

Consultas en la base ferretera


1.-Obtenga un listado de nombres, precio de venta y stock de productos
SELECTnombre,pvp,stock
FROMPRODUCTO

7
0

Base de Datos I

2.-Obtenga el nombre los productos cuyo precio sea < o igual a 200
SELECTnombre,pvp
FROMPRODUCTO
WHEREpvp<=200

3.-Obtenga un listado de los productos cuyo precio este entre 40 y 80 dlares con (and y
betwen)
SELECT*
FROMPRODUCTO
WHEREpvpBETWEEN(40)AND(80)

4.- Obtenga el nombre, el precio, el precio2011 que estar considerado con incremento de
15%

7
0

Base de Datos I
SELECTnombre,pvp
FROMPRODUCTO
WHEREstock_max='15'

5.-Seleccione el precio promedio de los productos de la ferretera


SELECTAVG(pvp)ASPRECIO_PROMEDIO_DE_PRODUCTOS
FROMPRODUCTO

6.-Despliegue el precio mximo de los productos cuyo stock sea mayor que 100
SELECTnombre,MAX(pvp)
FROMPRODUCTO
GROUPBYnombre
HAVINGMAX(pvp)>100

8.-Obtener el nmero de artculos cuyo precio sea mayor o igual a 100 dlares
SELECTCOUNT(*)ASNUMERO_PRODUCTOS
FROMPRODUCTO
WHEREpvp>=100

9.-Obtener el No de Factura, la fecha y el Nombre del Clienteque menos ha comprado


SELECTF.id_factura,F.fecha,c.nombre
FROMClienteC,FacturaF,DET_FACTURADF
WHEREC.id_cliente=F.id_cliente
ANDDF.id_factura=F.id_factura
GROUPBYF.id_factura,F.fecha,C.nombreHAVINGCOUNT(DF.id_factu
ra)<=ALL
(
SELECTCOUNT(F.id_factura)
FROMDET_FACTURADF,FacturaF
WHEREDF.id_factura=F.id_factura
GROUPBYF.id_factura
)

7
0

Base de Datos I

10.- Obtenga el nmero de factura ms alta y el nombre del cliente a que corresponde
SELECTF.id_factura,C.nombre
FROMFACTURAF,CLIENTEC
WHEREF.id_cliente=C.id_clienteANDF.id_factura=(
SELECTMAX(id_factura)
FROMFactura)

11.-Obtener El Nombre del Cliente, La provincia y el cantn del cliente que ms ha


comprado
SELECTF.id_factura,F.fecha,c.nombre
FROMClienteC,FacturaF,DET_FACTURADF
WHEREC.id_cliente=F.id_cliente
ANDDF.id_factura=F.id_factura
GROUPBYF.id_factura,F.fecha,C.nombreHAVINGCOUNT(DF.id_factu
ra)>=ALL
(
SELECTCOUNT(F.id_factura)
FROMDET_FACTURADF,FacturaF
WHEREDF.id_factura=F.id_factura
GROUPBYF.id_factura
)

12.-Inserte un registro en la tabla producto cuyo precio sea 580 dlares y pertenezca a la
categora pinturas.
INSERTINTOTIPO(id_tipo,nombre)VALUES (504,'Pinturas')
INSERTINTOPRODUCTO(id_producto,nombre,stock,stock_max,stock
_min,pvp,fecha_elaboracion,id_tipo)
VALUES ('P13','Pintura Automotriz 100G',2,5,2,580,23-062013,504)

7
0

Base de Datos I
13.-Actualice el producto 106 (P7) del nombre playo a alicate
UPDATEPRODUCTOSETnombre='Alicate'WHEREid_producto='P7'

14.-Realice un descuento del 10% a todos los productos de la ferretera.


UPDATEPRODUCTOSETpvp=pvp-(pvp*0.10)

15.-Incremente en 3% el precio de los productos de la ferretera a todos aquellos cuyo


precio este bajo 100 dlares
UPDATEPRODUCTOSETpvp=pvp+(pvp*0.03)WHEREpvp<100

7
0

Base de Datos I
EJERCICIO 8. EMPLEADOS

Insertar 40 emplados

6 departametos

7
0

Base de Datos I

Consultas
1. Obtener los apellidos de los emplados.
SELECTApellidosFROMEMPLEADOS

2. Obtener los apellidos de los emplados sin repeticiones.


SELECTDISTINCTApellidosFROMEMPLEADOS

7
0

Base de Datos I

3. Obtener todos los datos de los emplados que se apellidan Safadi


SELECT*FROMEMPLEADOS
WHEREApellidoslike'Safadi%'

4. Obtener todos los datos de los emplados que se apellidan Safadi Bohrquez y los
que se apellidan Graca Ziga.
SELECT*FROMEMPLEADOS
WHEREApellidos='Safadi Bohrquez'

SELECT*FROMEMPLEADOS

WHEREApellidos='Garca Ziga'
SELECT*FROMEMPLEADOS
WHEREApellidos='Safadi Bohrquez'
ORApellidos='Garca Ziga'

7
0

Base de Datos I
5. Obtener todos los datos de los empleados que trabajan en el departamento 100.
SELECT*FROMEMPLEADOS
WHERECod_Departamento=100

6. Obtener todos los datos de los empleados que trabajan para el departamento 100 y
para el departamento 103
SELECT*FROMEMPLEADOS
WHERECod_Departamento=100

SELECT*FROMEMPLEADOS
WHERECod_Departamento=103

SELECT*FROMEMPLEADOS
WHERECod_Departamento=100
ORCod_Departamento=103

7
0

Base de Datos I
7. Obtener todos los datos de los empleados cuyo segundo apellido comience por C
SELECT*FROMEMPLEADOS
WHEREApellidoslike'% C%'

8. Obtener el nmero de empleados en cada departemento.


SELECTCod_Departamento,COUNT(*)
FROMEMPLEADOS
GROUPBYCod_Departamento

EJERCICIO 9. BIBLIOTECA
Entidad-Relacin

7
0

Base de Datos I
EJERCICIO 11. Tienda de Animales
CREACION DE LAS TABLAS
CREATETABLE ADOPCION
(
Costo
Fecha
CdigoAdopcion
IdCliente
CdigoAnimal
)
go

floatNULL,
datetimeNULL,
intNOTNULL,
intNOTNULL,
intNOTNULL

ALTERTABLE ADOPCION
ADDCONSTRAINT XPKADOPCION
PRIMARYKEYCLUSTERED(CdigoAdopcion ASC,IdCliente
ASC,CdigoAnimal ASC)
go
CREATETABLE ANIMAL
(
Cdigo
Color
Edad
Sexo
Defecto
CdigoEspecie
CdigoOrigen
CdigoApl
CodigoVacuna
)
go

intNOTNULL,
nvarchar(50)NULL,
intNULL,
char(20)NULL,
nvarchar(150)NULL,
intNOTNULL,
intNOTNULL,
intNOTNULL,
intNOTNULL

ALTERTABLE ANIMAL
ADDCONSTRAINT XPKANIMAL PRIMARYKEYCLUSTERED(Cdigo ASC)
go

7
0

También podría gustarte