0% encontró este documento útil (0 votos)
11 vistas

SQLBDI - Intro

Cargado por

Gonzalo Barahona
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
11 vistas

SQLBDI - Intro

Cargado por

Gonzalo Barahona
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 60

4.

SQL: UN LBD RELACIONAL

4.1 SQL
SQL considera cuatro tipos de comandos:
a) Lenguaje de definición de datos
Alter, Create, Drop, Grant, Rename, Revoke.
DDL = Data Definition Language
b) Lenguaje de manipulación de datos
Select, Insert, Delete, Update.
DML = Data Manipulation Language
c) Lenguaje de control de datos
Commit, Rollback, Savepoint (“Transacciones”)
DCL = Data Control Language
d) Lenguaje inserto en un LPR (ESQL, Embedded SQL)
Open, Close, Fetch (“Cursor”)

SQL: Lenguaje de base de datos relacional

Versiones estándares de SQL:


• ANSI 1986: SQL-86 (SQL1)
• ANSI 1992: SQL-92 (SQL2)
• ANSI 1999: SQL:1999 o SQL-99 (SQL3)
4. 2

Tablas de la base de datos Hospital


Tabla PLANTILLA
Hospital_Cod Sala_Cod Empleado_No Apellido Función T Salario
13 6 3754 Díaz B. Enfermera T 2262000
13 6 3106 Hernandez J. Enfermero T 2750000
18 4 6357 Karplus W. Interno T 3379000
22 6 1009 Higueras D. Enfermera T 2005000
22 6 8422 Bocina G. Enfermero M 1638000
22 2 9901 Núñez C. Interno M 2210000
22 1 6065 Rivera G. Enfermera N 1626000
22 1 7379 Carlos R. Enfermera T 2119000
45 4 1280 Amigo R. Interno N 2210000
45 1 8526 Frank H. Enfermera T 2522000

a) Tablas de la base de datos Empresa


Tabla EMP
Emp_No Apellido Oficio Dir Fecha_Contr Salario Comisión Dept_No
7369 Sánchez Empleado 7902 17-DEC-80 104000 20
7499 Arroyo Vendedor 7698 20-FEB-81 208000 39000 30
7521 Salas Vendedor 7698 22-FEB-81 162500 65000 30
7566 Jimenez Director 7839 02-APR-81 386750 20
7654 Martin Vendedor 7698 28-SEP-81 182000 182000 30
7693 Negro Director 7839 01-MAY-81 370500 30
7782 Cerezo Director 7839 09-JUN-81 318500 10
7788 Gil Analista 7566 30-MAR-87 390000 20
7839 Rey Presidente 17-NOV-81 650000 10
7844 Tovar Vendedor 7698 08-SEP-81 195000 0 10
7876 Alonso Empleado 7788 03-MAY-87 143000 20
7900 Jimenez Empleado 7698 03-DEC-81 123500 30
4. 3

7902 Fernandez Analista 7566 03-DEC-81 390000 20


7934 Muñoz Empleado 7782 23-JAN-82 169000 10

Tabla DEPT
Dept_No Dnombre Loc
10 Contabilidad Sevilla
30 Investigación Madrid
20 Ventas Barcelona
40 Producción Bilbao

b) Tablas de la base de datos Universidad


Tabla STUDENT
Stu_Id Student_Name Address Birthdate Gender
S001 Wendy Jones 125 Maple Ave 10/25/65 Female
S002 Sam Wales 3006 Navajo Cl 1/10/60 Male
S003 Cathy Smith 1600 Penn Ave 2/22/22 Female
S004 Dottie Stacy 10 Downing St 3/31/67 Female
S005 Jay Langer 4 Golf Course Rd 4/19/65 Male
S006 Amy Lopez 123 Sun Ray Rd 5/10/64 Female
S007 Sam Watson 225 Test Drive 6/09/63 Male
S008 Tammy Redd 113 Manchester 7/01/60 Female
S009 Tommy Wadkins 3 Apple Tree Dr 8/24/67 Male
S010 Ben Trevino 300 Bowling Alley 9/30/66 Male

Tabla COURSE
Course_Id Course_title Section Stu_Id Fac_Id
CSC100 Introduction to Computing 1 S001 J01
CSC100 Introduction to Computing 2 S002 S01
CSC200 Pascal Programming 1 S001 D01
CSC200 Pascal Programming 2 S003 S01
4. 4

ACC200 Principles of Accounting I 1 S001 J02


ACC201 Principles of Accounting II 1 S004 J02
HIS200 History of Pirogues 1 S005 N01

Tabla FACULTY
Fac_Id Faculty_Name Department Gender Salary
J01 Raymond J, Johnson Comp. Sci Male 40,000
S01 Wendy Swimmer Comp. Sci Female 45,000
D01 Amy Dancer Comp. Sci Female 34,500
J02 Bob Jones Accounting Male 35,000
N01 Jack Nelson History Male 28,000

Relacionamiento entre las tablas EMP y DEPT


4. 5

4.3 Consulta de los datos: Instrucción SELECT


Formato General:

SELECT...
FROM...
WHERE...
GROUP BY...
HAVING...
ORDER BY...

Formato Básico:

SELECT Ri1.A1,...,Rir.Ar
FROM R1,.....,RK
WHERE 

Equivalente en álgebra relacional a:


Ri1.A1,....,Rir.Ar(, (R1xR2x....xRk) )
4. 6

SELECT <expr_ FROM


columna> <Tabla>

WHERE <Predicado>

<expr_
GROUP BY columna>

HAVING <Predicado>

<expr_ ASC
ORDER BY columna> ;

DESC

Sintaxis general de la instrucción SELECT


4. 7

• SELECT Sirve para elegir ciertas


columnas o valores derivados de ellas.
• FROM Especifica una lista de tablas.
• WHERE Los valores de los campos
especificados deben cumplir una o varias
condiciones, por cada fila de la tabla.
• ORDER BY Especifica el criterio de
ordenación basado en los valores de los datos
recuperados o de otros derivados de ellos.

• Selección a nivel de fila

Ejemplo:
SELECT apellido, dirección
FROM enfermo
WHERE s = ‘F’
ORDER BY apellido
4. 8

SELECT <expr_
columna>

FROM <Tabla>

WHERE <Predicado>

<expr_ ASC
ORDER BY ;
columna>

DESC

Sintaxis simplificada de la instrucción SELECT

Selección de columnas
• Selección de todas las columnas de una tabla:
SQL> SELECT EMP_NO, APELLIDO, OFICIO, DIR, FECHA_CONTR, SALARIO,
COMISION, DEPT_NO
FROM EMP;
4. 9

SQL SELECT *
FROM EMP;

SQL SELECT DNOMBRE, DEPT_NO


FROM DEPT;

Cláusula FROM
SELECT apellido “nombres de Juan”
FROM Juan.enfermo

SELECT enfermo.inscripción, enfermo.apellido


FROM enfermo
WHERE inscripción = 63827;

SELECT e.inscripción, e.apellido


FROM enfermo e
WHERE inscripción = 63827

Cláusula WHERE
• Operadores de comparación:
➢ Aritméticos: =, <, >
➢ De caracteres: LIKE
➢ Lógicos: IN
• Operadores lógicos booleanos: AND, OR, NOT.
• Algunos ejemplos de predicados son:
➢ 5 = emp_no
➢ SUM(salario) >= 1000000
➢ (ROUND(salario) / 12 ) + 100) <= MIN
➢ (dept_no = 5) AND (apellido = ‘García’)
Cláusula ORDER BY
ORDER BY sala_cod, hospital_cod DESC
ORDER BY mod(empleado_no, 6)
ORDER BY 2
4. 10

Select funcion from


plantilla
Select funcion, turno from plantilla

Enfermero Enfermero T
Enfermera Enfermera T
Interno Interno T
Enfermero Enfermero M
Enfermera Enfermera M
Interno Interno M
Enfermero Enfermero N
Enfermero Enfermero T
Interno Interno N
Enfermero Enfermero T

SELECT DISTINCT

SELECT DISTINCT función SELECT DISTINCT función, turno


FROM plantilla FROM plantilla

Enfermero Enfermero T
Enfermera Enfermera T
Interno Interno T
Enfermero M
Enfermera M
Interno M
Enfermero N
Interno N

4.4 Operadores
4.4.1 Operadores aritméticos: + - * /
4. 11

Ejemplo:
SELECT col1 * col2, col1 – col2
FROM tabla1
WHERE col1 + col2 = 34
4.4.2 Operadores de Comparación
a) Comparación general:
= != > >= < <=
Ejemplos:
SELECT salario, comisión
FROM vendedor
WHERE comisión > salario

SELECT apellido, dirección


FROM enfermo
WHERE apellido > ‘A’ AND apellido < ‘B’

b) Comparación de cadenas de caracteres


• [NOT] LIKE
‘%’ cualquier cadena de 0 ó más caracteres
‘_’ cualquier carácter
• Ejemplos:
LIKE ‘Director’
LIKE ‘M%’
LIKE ‘%X%’
LIKE ‘_ _ M’
LIKE ‘N_’
LIKE ‘_R%’
c) Comparación lógica
• [NOT] BETWEEN valor_1 AND valor_2
[NOT] IN (lista_de_valores_entre_comas)
IS [NOT] NULL
<general> ANY
<general> ALL

• = ANY es equivalente a IN
4. 12

!= ANY es equivalente a NOT IN

• Ejemplos:
SELECT apellido, salario
FROM plantilla
WHERE salario BETWEEN 1000000 AND 2000000

SELECT apellido, fecha_nac


FROM enfermo
WHERE apellido BETWEEN ‘A’ AND ‘B’ AND fecha_nac BETWEEN ’01-
JAN-35’ AND ‘31-DEC-45’

SELECT apellido
FROM emp
WHERE dept_no IN (30,40)
SELECT apellido
FROM vendedor
WHERE comision IS NULL

SELECT apellido
FROM emp
WHERE dept_no != ALL (10,20,80)

4.5 Funciones
• Existen los siguientes tipos de función:
➢ Aritméticas
➢ De cadenas de caracteres
➢ De conversión
➢ De grupo
➢ Otras funciones

4.5.1 Funciones aritméticas


ABS (n) Valor absoluto de n
CEIL (n) Entero inmediatamente superior o igual a n
FLOOR (n) Entero inmediatamente inferior o igual a n
MOD (m,n) Resto de dividir m entre n
SELECT MOD(inscripcion, nss)
FROM enfermo
4. 13

POWER (m,n) m elevado a la potencia de n


SELECT POWER (inscripcion, 2) Potencias, inscripción FROM
enfermo

ROUND (n, [,m]) n redondeado a m decimales


SELECT ROUND(1.5634,1)
FROM dual

SIGN(N) Si n < 0 : -1
Si n = 0 : 0
Si n > 0 : +1

SQRT(n) Raíz cuadrada de n


Si n < 0 : NULL

TRUNC(n, [,m]) n truncado a m decimales;


SELECT TRUNC(1.54344, 1)
FROM dual
4. 14

4.5.2 Manipulación de datos de conjuntos y funciones de


conjuntos

<expr_
SELECT columna> FROM <Tabla>

WHERE <Predicado>

GROUP BY <expr_
columna>

HAVING <Predicado>

ORDER BY <expr_ ASC ;


columna>

DESC

Sintaxis del select para la selección de conjuntos


4. 15

a) Selección de conjuntos
❖ La evaluación de las cláusulas en tiempo de ejecución se efectúa en el siguiente orden:
 WHERE Filtra las filas
 GROUP BY Crea una tabla de grupo nueva
 HAVING Filtra los grupos
 ORDER BY Clasifica la salida

b) Funciones de conjuntos
Las siguientes son funciones de conjuntos:
▪ AVG(n)
Valor medio de n (ignorando los valores nulos).

▪ COUNT( { * | expr } )
Número de veces que expr evalúa algún dato con valor no nulo. La opción ‘*’ cuenta todas las
filas seleccionadas.

▪ MAX(expr)
Máximo valor de expr.

▪ MIN(expr)
Mínimo valor de expr.
▪ STDDEV(expr)
Desviación estándar de expr sin tener en cuenta los valores nulos.

▪ SUM(expr)
Suma de valores de expr.

▪ VARIANCE(expr)
Varianza de expr sin tener en cuenta los valores nulos.

Ejemplos:
SELECT AVG(salario)
FROM plantilla
GROUP BY hospital_cod
4. 16

HAVING AVG(salario) > 200000

SELECT MAX(salario), MIN(salario),


MAX(salario) – MIN(salario)
FROM plantilla

SELECT SUM(salario) / COUNT(salario)


FROM plantilla
SELECT COUNT(DISTINCT funcion)
FROM plantilla

SELECT sala_cod, AVG(salario), COUNT(*)


FROM plantilla
WHERE hospital_cod = 22
GROUP BY sala_cod
HAVING avg(SALARIO) >= 170000
ORDER BY sala_cod

❖ Los valores nulos no participan en el cálculo de las funciones de conjuntos


Por lo tanto: SELECT AVG(salario)
y SELECT SUM(salario) / COUNT(*)
no siempre dan el mismo resultado.

a) Funciones relacionadas con la fecha


b.1) El tipo DATE
- El formato del tipo DATE es: DD-MON-YY
- El tipo de dato DATE contiene realmente la fecha y la hora.
- La función SYSDATE entrega la fecha y la hora actual

b) Operaciones, valores numéricos y funciones


Función NVL:

NVL(expr1, expr2)
4. 17

Modo de operación: Se evalúa expr1; si expr1 es no nula


retorna expr1, o si no retorna expr2.

Ejemplos:
1. Despliegue el nombre, trabajo, salario, comisión y sueldo total de un empleado, para los empleados del
departamento 30.
SQL  SELECT ename, job, salary, comm,
2 NVL(sal, 0) + NVL(comm, 0)
3 FROM emp
4 WHERE deptno = 30;

ENAME JOB SAL COMM NVL(SAL, 0) + NVL(COMM,0)


ALLEN SALESMAN 1600 300 1900
WARD SALESMAN 1250 500 1750
JONES SALESMAN 2975 2975
MARTIN SALESMAN 1250 1400 2650
BLAKE MANAGER 2850 2850
SCOTT SALESMAN 3150 3150
TURNER SALESMAN 1500 0 1500
JAMES CLERCK 950 950

Ejemplo
Desplegar nombre, salario, comisión y salario total para todos los vendedores ordenados por salario
total.
SQL  SELECT ename, sal, comm, 12*(sal + comm) TOTAL
2 FROM emp
3 WHERE job = ‘SALESMAN’
4 Order by 12*(sal + comm ) total;

ENAME SAL COMM TOTAL


TURNER 1500 0 18000
WARD 1250 500 21000
ALLEN 1600 300 22800
MARTIN 1250 1400 31800
JONES 2975
SCOTT 3150
4. 18
4. 19

4.6 Operaciones en conjuntos, con sentencias Select


4.6.1 Uso de los operadores UNION, UNION ALL,
INTERSECT Y MINUS
4. 20

El UNION ALL, incluye todos los duplicados en el resultado


Ejemplos UNION

<selecc sin
order by>

UNION

<selecc sin
INTERSECT order by>

MINUS

ASC
ORDER BY
;

<Posi-
ción> DESC

Sintaxis del Select utilizando los operadores UNION, INTERSECT y MINUS

SQL  SELECT apellido


2 FROM plantilla
3 WHERE funcion = ‘Interno’
4. 21

4 UNION
5 SELECT apellido
6 FROM plantilla
7 WHERE turno = `M’;

APELLIDO
Amigo R.
Bocina G.
Karplus W.
Núñez C.

Seleccionar todos los internos que trabajan en el hospital 22 y los médicos del mismo.

SQL  SELECT apellido


2 FROM plantilla
3 WHERE funcion = ‘Interno’ AND hospital_cod = 22
4 UNION
5 SELECT apellido
6 FROM doctor
7 WHERE hospital_cod = 22;
4. 22

Ejemplos INTERSECT
SQL  RUN
1 SELECT apellido
2 FROM plantilla
3 WHERE funcion = ‘Interno’
4 INTERSECT
5 SELECT apellido
6 FROM plantilla
7 WHERE turno = ‘M’;

APELLIDO
Núñez C.

Listar todos los empleados que trabajen en cualquier hospital y sean médicos internos

SQL  SELECT apellido


2 FROM plantilla
3 WHERE funcion = ‘Interno’
4 INTERSECT
5 SELECT apellido
6 FROM doctor;

Ejemplo MINUS
SQL  RUN
1 SELECT apellido
2 FROM plantilla
3 WHERE funcion = ‘Interno’
4 MINUS
5 SELECT apellido
6 FROM plantilla
7 WHERE turno = ‘M’;

APELLIDO
Amigo R.
4. 23

Karplus W.

Seleccionar los empleados de cualquier hospital que sean, o bien doctores no internos, o bien cualquier
otra cosa.

SQL  SELECT apellido


2 FROM plantilla
3 MINUS
4 SELECT apellido
5 FROM plantilla
6 WHERE funcion = ‘Interno’;
4.7 Combinaciones de múltiples tablas

Una instrucción Select que trabaja con múltiples tablas se puede clasificar como:

• COMBINACIONES
• SUBCONSULTAS

Combinaciones (JOINS)
❖ Utilizadas para recuperar datos desde más de una tabla.

Subconsultas (Sub-queries)
❖ Utilizadas para generar preguntas subsidiarias necesitadas por la consulta principal.
4. 24

4.7.1 Combinaciones (JOINS)

Join de tablas

Server

EMP DEPT

ENAME DEPTNO DEPTNO LOC


SMITH 20 20 DALLAS
ALLEN 30 30 CHICAGO
WARD 30 30 CHICAGO
JONES 20 20 DALLAS
MARTIN 30 30 CHICAGO
BLAKE 30 30 CHICAGO
CLARK 10 10 NEW YORK
SCOTT 20 20 DALLAS
KING 10 10 NEW YORK
TURNER 30 30 CHICAGO
ADAMS 20 20 DALLAS
JAMES 30 30 CHICAGO
FORD 20 20 DALLAS
MILLER 10 10 NEW YORK
4. 25

Ejemplo:
SELECT *
FROM LABORATORIO

LAB_NO NOMBRE DIRECCION TELEFONO


16 Atcom Gran vía, 14 532-4433
42 Clini Castellana, 55 447-6484
56 Alpa Juan Bravo, 18 929-9611
84 Nucro Alcalá, 62 368-9793

SELECT *
FROM test;

INSCRIPCION LAB_NO TCO RES


10995 16 ABC POS
14024 42 PTY NEG
10995 16 BCD NEG

SELECT l.lab_no, l.nombre, l.telefono, t.lab_no, t.tcode, t.inscripción, t.resultado


FROM laboratorio l, test t;

LAB_NO NOMBRE TELEFONO LAB_NO TCO INSCRIPCION RESULTADO


16 Atcon 532-4453 16 ABC 10995 POS
42 Clini 447-6448 16 ABC 10995 POS
56 Alpha 929-9611 16 ABC 10995 POS
84 Nucro 368-9793 16 ABC 10995 POS
16 Atcon 532-4453 42 PTY 14024 NEG
42 Clini 447-6448 42 PTY 14024 NEG
56 Alpha 929-9611 42 PTY 14024 NEG
84 Nucro 368-9793 42 PTY 14024 NEG
16 Atcon 532-4453 16 BCD 10995 NEG
42 Clini 447-6448 16 BCD 10995 NEG
56 Alpha 929-9611 16 BCD 10995 NEG
84 Nucro 368-9793 16 BCD 10995 NEG

SELECT l.lab_no, l.nombre, l.telefono, t.lab_no, t.tcode,


t.inscripcion, t.resultado
FROM laboratorio l, test t
WHERE l.lab_no = t.lab_no;

LAB_NO NOMBRE TELEFONO LAB_NO TCO INSCRIPCION RESULTADO


4. 26

16 ATCON 532-4453 16 ABC 10995 POS


42 CLINI 447-6484 42 PTY 14024 NEG
16 ATCON 532-4453 16 BCD 10995 NEG

SELECT l.nombre, l.telefono t.tcode, t.resultado, e.apellido


FROM laboratorio l, test t, enfermo e
WHERE l.lab_no = t.lab_no AND t.inscripcion = e.inscripcion;

NOMBRE TELEFONO TCODE RESULTADO APELLIDO


Atcon 532-4453 ABC NEG Laguía, M.
Atcon 532-4453 BCD NEG Laguía, M.
Clini 447-6448 PTY NEG Fernández, M.

Sintaxis de un Join:
SELECT columnas de las tablas citadas en la cláusula “from”
FROM tabla1, tabla2
WHERE Tabla1.columna = Tabla2.columna
Ejemplo:
SELECT apellido, loc
FROM emp, dept
WHERE apellido LIKE ‘%M’

APELLIDO LOC
MARTIN SEVILLA
MUÑOZ SEVILLA
MARTIN MADRID
MUÑOZ MADRID
MARTIN BARCELONA
MUÑOZ BARCELONA
MARTIN BILBAO
MUÑOZ BILBAO

SELECT apellido, oficio, emp_no, dnombre, loc


FROM emp, dept
4. 27

WHERE emp.dept_no = dept.dept_no;

APELLIDO OFICIO EMP_NO DNOMBRE LOC


CEREZO DIRECTOR 7782 CONTABILIDAD SEVILLA
MUÑOZ EMPLEADO 7934 CONTABILIDAD SEVILLA
REY PRESIDENTE 7839 CONTABILIDAD SEVILLA
ALONSO EMPLEADO 7876 INVESTIGACION MADRID
SANCHEZ EMPLEADO 7369 INVESTIGACION MADRID
JIMENEZ DIRECTOR 7566 INVESTIGACION MADRID
GIL ANALISTA 7788 INVESTIGACION MADRID
FERNANDEZ ANALISTA 7902 INVESTIGACION MADRID
ARROYO VENDEDOR 7499 VENTAS BARCELONA
MARTIN VENDEDOR 7654 VENTAS BARCELONA
TOVAR VENDEDOR 7844 VENTAS BARCELONA
JIMENO EMPLEADO 7900 VENTAS BARCELONA
NEGRO DIRECTOR 7698 VENTAS BARCELONA
Join de una tabla con la misma tabla
¿Quién gana más que su jefe?

NOMBRE DE LA TABLA: PERSONNEL


FAC_ID FACULTY-NAME BOSS-ID TITLE-OR-RANK SALARY
D02 GREG DAVIS PRESIDENT $80.000
M01 SCOTT MIZE D02 DEAN $60.000
S02 LARRY SIMPSON D02 DEAN $44.000
N02 NICK NORMAN S02 DEPATMENT CHAIR $50.000
C021 JAN CARNER M01 DEPATMENT CHAIR $42.000
H01 BYRON HOGAN S02 DEPATMENT CHAIR $43.000
F01 LEE FALDO S02 DEPATMENT CHAIR $45.000
J01 RAYMOND J. JOHNSON F01 PROFESSOR $40.000
S01 WENDY SWIMMER F01 PROFESSOR $45.000
D01 AMY DANCER F01 ASOCC PROFESSOR $34.500
J02 BOB JONES C01 ASOCC PROFESSOR $35.000
N01 JACK NELSON N02 INSTRUCTOR $28.000
N03 BEN NELSON H01 ASSIT PROFESSOR $30.000
S03 MARK STEWART H01 ASSIT PROFESSOR $30.500
C02 PAT CARNER H01 PROFESSOR $44.000

Solución:
SQL  SELECT E.FAULTY-NAME, E.SALARY “FAC SAL”,
2 B.FACULTY-NAME “BOSS NAME”, B.SALARY “BOSS SAL”
3 FROM PERSONNEL E, PERSONNEL B
4 WHERE E.BOSS-ID=B.FAC-ID AND E.SALARY>B.SALARY;

FACULTY-NAME FAC_SAL BOSS_NAME BOSS_SAL


4. 28

NICK NORMAN $50.000 LARRY SIMPSON $44.000


LEE FALDO $45.000 LARRY SIMPSON $44.000
PAT CARNER $44.000 BYRON HOGAN $43.000
Ejercicio Propuesto:
Nombre de cada empleado y el nombre de su jefe directo

EMP TABLE
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7369 SMITH CLERCK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 31-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 09-DEC-82 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERCK 7788 12-JAN-83 1100 20
7900 JAMES CLERCK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERCK 7782 23-JAN-82 1300 10
4. 29

4.7.3 Subconsultas
Las subconsultas seleccionan filas desde una tabla con una
condición que depende de valores de otra consulta.

Sintaxis SELECT

SELECT....

FROM...

WHERE...
Sintaxis SELECT
(SELECT...
FROM...
WHERE...);

Sintaxis de una subconsulta


4. 30

Las subconsultas pueden aparecer en la cláusula WHERE de las siguientes sentencias:


• SELECT
• INSERT
• UPDATE
• DELETE

Ejemplo:
SELET apellido
FROM plantilla
WHERE salario > (SELECT AVG(salario)
FROM plantilla)
)

Subconsultas que devuelven un solo valor


• Presentar los nombres de los empleados que tienen el mismo trabajo que JIMENEZ.

SELECT apellido
FROM emp
WHERE oficio = (SELECT oficio
FROM emp
WHERE apellido = ‘JIMENEZ’)
Subconsultas que devuelven más de un valor y se ha de comparar con uno de ellos
• Información sobre los empleados que ganan más que cualquier empleado del departamento
30.

SELECT *
FROM emp
WHERE salario > (SELECT MAX(salario)
FROM emp
GROUP BY dept_no
HAVING dept_no = 30)
ó bien
4. 31

SELECT *
FROM emp
WHERE salario > ALL
(SELECT salario
FROM emp
WHERE dept_no = 30)

Subconsultas que devuelven una lista de valores


• Conseguir los nombres de los empleados del departamento 20 cuyo trabajo sea idéntico al de
cualquiera de los empleados del departamento de ventas
SELECT apellido
FROM emp
WHERE dept_no = 20 AND oficio IN (SELECT oficio
FROM emp
WHERE dept_no =
(SELECT dept_no
FROM dept
WHERE dnombre = ‘VENTAS’) )

APELLIDO
JIMENEZ
ALONSO
SANCHEZ

• Mostrar todos los empleados que trabajan en Madrid o Barcelona.


SELECT apellido, oficio, fecha_contr, dept_no, salario
FROM emp
WHERE dept_no IN
(SELECT dept_no
FROM dept
WHERE loc IN (‘MADRID, ‘BARCELONA’)
)
ORDER BY apellido;
APELLIDO OFICIO FECHA_ALT DEPT_NO SALARIO
ALONSO EMPLEADO 03-MAY-87 20 143000
ARROYO VENDEDOR 20-FEB-81 30 208000
FERNANDEZ ANALISTA 03-DEC-81 20 390000
GIL ANALISTA 30-MAR-87 20 390000
4. 32

JIMENEZ DIRECTOR 02-APR-81 20 386750


JIMENO EMPLEADO 03-DEC-81 30 123500
MARTIN VENDEDOR 28-SEP-81 30 162500
NEGRO DIRECTOR 01-MAY-81 30 370500
SALA VENDEDOR 22-FEB-81 30 162500
TOVAR VENDEDOR 08-SEP-81 30 195000

4.8 EXISTS, el cuantificador existencial de SQL


Uso del cuantificador existencial EXISTS

SELECT
FROM
WHERE

[NOT]
EXISTS
SELECT
FROM
WHERE

• La expresión “EXISTS (SELECT...)” toma el valor verdadero si y sólo si el resultado de


evaluar “SELECT...” no es vacío, es decir, si y sólo si existe al menos un registro resultante
del “SELECT”.

Ejemplos:
Se trabajará con la base de datos de Partes-Proveedores, constituida por las tablas: S, P, SP.
4. 33

S S# NomProv Estado Ciudad


S1 Salazar 20 Londres
S2 Perez 10 París
S3 Bernal 30 París

P P# NomParte Color Peso Ciudad


P1 Tuerca Rojo 12 Londres
P2 Perno Verde 17 París
P3 Tornillo Rojo 17 Roma

SP S# P# Cantidad
S1 P1 300
S1 P2 200
S2 P1 300
S3 P2 200
1) Obtener el nombre del proveedor para aquellos proveedores que suministran la parte P2.

SELECT NomProv
FROM S
WHERE EXISTS
(SELECT *
FROM SP
WHERE S# = S.S# AND P# = ‘P2’)

2) Obtener el nombre del proveedor, para los proveedores que no suministran la parte P2.
SELECT NomProv
FROM SP
WHERE NOT EXISTS
(SELECT *
FROM SP
WHERE S# = S.S# AND P# = ‘P2’)

3) Obtener los nombres de proveedor, para los proveedores que suministran todas las partes.
SELECT NomProv
FROM S
WHERE NOT EXISTS
(SELECT *
FROM P
WHERE NOT EXISTS
(SELECT *
FROM SP
WHERE S# = S.S# AND
P# = P.P#))
4. 34

4.12 Inserción, eliminación y actualización de datos


4.12.1 Inserción de datos
 Se insertará un paciente en la tabla enfermo

INSERT INTO enfermo(inscripcion, apellido, direccion)


VALUES (63827, ‘Pérez P’, ‘Luz 8’)

Sintaxis de la cláusula INSERT

INSERT INTO <tabla>

( <columna> )

<bloque
selecc>
;

VALUES ( <valor> )

Ejemplos
4. 35

1) INSERT INTO plantilla (hospital_cod, sala_cod,


empleado_no, apellido, funcion, turno, salario)
VALUES (22,2,12345, ‘García J.’, ‘Enfermero’, ‘M’, 3000000)

2) INSERT INTO plantilla


VALUES (22,2, 12345, ‘García J. ‘Enfermero’, ‘M’, 3000000)

3) INSERT INTO plantilla (empleado_no, apellido)


VALUES (12345, ‘Garcia J.’)

4) INSERT INTO varon


SELECT inscripcion, apellido, direccion, fecha_nac, s, nss
FROM enfermo
WHERE s = ‘M’

5) SQL INSERT INTO STUDENT

2 VALUES (‘S001’, ‘DOTTIE WILSON’,

3 ‘1600 PENN AVE’, ‘10-OCT-65’, ‘FEMALE’);

6) SQL INSERT INTO FACULTY


2 VALUES (‘L01’, ‘LEO JONES’,‘MANAGEMENT’,
3 ‘MALE’, 45000);
7) SQL INSERT INTO STUDENT

2 (BIRTHDATE, STUDENT_NAME, STU_ID,

3 GENDER, ADDRESS)

4 VALUES (‘22-NOV-63’, ’WINSTON NEELY’,

5 ’S012’, ’MALE’, ‘#1 BULLDOG ´´DR.’);

8) SQL INSERT INTO STUDENT VALUES

2 (’S013’, ‘BONNY SIMPSON’,NULL, NULL, ‘FEMALE’);


4. 36

9) SQL INSERT INTO STUDENT

2 (STU-ID, STUDENT_NAME, GENDER)

3 VALUES (‘S013’, ‘BONNY SIMPSON’, ‘FEMALE’);

Eliminación de filas de una tabla

DELETE FROM <tabla> WHERE <Predi- ;


cado>

Sintaxis de la cláusula DELETE

Ejemplos:

1) DELETE
FROM enfermo
WHERE inscripcion = 74385

2) DELETE FROM enfermo


4. 37

4.12.3 Actualización de datos

UPDATE <Tabla>

<Column> = <Expresión>

SET

( <Column> ) = ( <Bloque )
Selección>

WHERE <predi ;
cado>

Sintaxis de la cláusula UPDATE

Ejemplos

1) UPDATE enfermo
SET direccion = ‘Castellana 95’
WHERE inscripcion = 74835

2) UPDATE enfermo
4. 38

SET direccion = NULL

3) UPDATE enfermo
SET (direccion, fecha_nac) =
(SELECT direccion, fecha_nac
FROM enfermo
WHERE inscripcion = 67328
)
WHERE inscripcion = 12345

4) UPDATE enfermo
SET direccion = ‘Castellana 60’
WHERE inscripcion = 63827

INSCRIPCION APELLIDO DIRECCION


63827 Ruiz P. Castellana 60
4.13 Transacciones

4.13.2 Sentencias COMMIT y ROLLBACK


Permiten consolidar y deshacer una transacción.
Tipos de COMMIT:
• Explícitos
• Implícitos:
➢ Toda instrucción DDL es hecha permanente (‘Commited’) implícitamente. Por ejemplo:
CREATE DROP, etc.
➢ Cuando se termina la sesión en forma normal en cualquier ambiente (SQL *Plus, etc), hay
un commit implícito.
Ejemplo de Commit:

SQL  DELETE FROM emp

2 WHERE ename = ‘LERNER’


1 row deleted

SQL  COMMIT;
4. 39

Commit completed

Ejemplo de Rollback:

SQLUPDATE emp

2 SET job = ‘SALESMAN’, deptno = 30

3 WHERE ename = ‘JONES’;


1 row updated

SQL ROLLBACK;
Rollback completed
4. 40

COMMIT

INSERT

INSERT

DELETE

INSERT

UPDATE

UPDATE

COMMIT
Concepto de transacción
4. 41

COMMIT

INSERT

SAVE POINT MARKER

UPDATE

SAVE POINT MARKER

INSERT

DELETE

ROLLBACK
4. 42

Ejemplo de Rollback hasta el Savepoint:


SQL INSERT INTO dept
2 VALUES (70, ‘PERSONNEL’, ‘TAHITI’),
1 fila creada

SQL SAVEPOINT A;
Savepoint creado.

SQL INSERT INTO dept


2 VALUES (80,’EDUCATION’,’MAUI’);
1 fila creada

SQL SAVEPOINT B;
1 savepoint creado.

SQL UPDATE dept


2 SET loc = ‘KAUAI’
3 WHERE deptno = 80;
1 fila actualizada

SQL ROLLBACK TO B;
4. 43

Rollback completo.
4.14 Tablas
4.14.1 Creación de una tabla
Sintaxis del comando CREATE
Ejemplo:
<nombre
CREATE TABLE tabla>

( <especific NOT NULL ) ;


columna>

SQL CREATE TABLE STUDENT (STU_ID CHAR (6)


2 NOT NULL,STUDENT_NAME CHAR (17),
3 ADDRESS CHAR (20),
4 BIRTHDATE DATE,
5 GENDER CHAR (6))

Table created

SQL CREATE TABLE COURSE (COURSE_ID


2 CHAR(6) NOT NULL,COURSE_TITLE CHAR(20),
3 SECTION_NO NUMBER (2),
4 STU_ID CHAR (6) NOT NULL,
5 FAC_ID CHAR (6) NOT NULL) )
Table created
SQL CREATE TABLE FACULTY (FAC_ID CHAR (6) NOT NULL,

2 FACULTY_NAME CHAR (17),

3 DEPARTMENT CHAR (10),

4 GENDER CHAR (6),

5 SALARY NUMBER (5) )


4. 44

Table created

SQL DROP TABLE STUDENT;


Table dropped.

SQL DROP TABLE COURSE;


Table dropped.

SQL DROP TABLE FACULTY;


Table dropped.

Creación de una tabla con datos recuperados en una consulta:


CREATE TABLE bonus (APELLIDO, OFICIO,
SALARIO, COMISION)
AS SELECT APELLIDO, OFICIO, SALARIO, COMISION
FROM emp
WHERE OFICIO = ‘director’
OR COMISION > 0.25 * SALARIO
Restricciones declarativas para restringir valores de columnas en SQL (ORACLE V. 7.0)
TIPO DEFINICION
NOT NULL No se permiten columnas con valores nulos
UNIQUE Requiere que valores de la columna sean únicos
CHECK Requiere que valores de la columna satisfagan una expresión lógica
PRIMARY KEY Requiere que valores de la columna sean únicos y NOT NULL
FOREIGN KEY Requiere que valores de la columna tengan un valor igual a uno definido
UNIQUE o PRIMARY KEY en una tabla relacionada
4. 45

CREATE TABLE tabla


schema. table_constraint

,
Tipo de dato de la columna
( )
DEFAULT expr column_constraint

table_constraint

PCTFREE integer

PCTUSED integer

INITRANS integer

MAXTRANS integer

TABLESPACE tablespace

STORAGE storage_clause
,
CLUSTER cluster ( columna )

ENABLE enable_clause AS subquery


DISABLE disable_clause

Sintaxis del comando CREATE TABLE


Sentencia CREATE TABLE

Cláusula CONSTRAINT
• Sintaxis:
4. 46

table_constraint ::=

CONSTRAINT constraint ,

UNIQUE ( columna )
PRIMARY KEY

FOREIGN KEY ( columna ) REFERENCES table

esquema. , ON DELETE
CASCADE
( columna )

CHECK (condición)

USING INDEX EXCEPTION INTO table

PCTFREE integer
esquema.

PCTUSED integer

INITRANS integer

MAXTRANS integer

TABLESPACE tablespace

STORAGE storage_clause

DISABLE

(Continuación)
4. 47

Column_constraint::
4. 48

(Continuación)

CONSTRAINT constraint

NULL

NOT

UNIQUE

PRIMARY KEY

REFERENCES table.

esquema. , ON DELETE CASCADE

(columna)

CHECK (condición)

USING INDEX EXCEPTION INTO table

PCTFREE integer
esquema.

PCTUSED integer

INITRANS integer

MAXTRANS integer

TABLESPACE tablespace

STORAGE storage_clause

DISABLE

Ejemplos:
4. 49

a) CREATE TABLE emp


(empno NUMBER(4),
enameVARCHAR2 (10),
job VARCHAR2 (9),
mgr NUMBER (4),
hiredate DATE,
sal NUMBER (7,2),
comm NUMBER (7,2),
deptno NUMBER (2),
CONSTRAINT fk_deptno
FOREIGN KEY (deptno)
REFERENCES dept (deptno) )

b) CREATE TABLE emp


(empno NUMBER(4),
ename VARCHAR2(10),
job VARCHAR2(9),
mgr NUMBER (4),
hiredate DATE
sal NUMBER (7,2),
comm NUMBER(7,2),
deptno NUMBER(2)
CONSTRAINT fk_deptno
REFERENCES dept(deptno)
ON DELETE CASCADE )
c) CREATE TABLE dept
(deptno NUMBER
CONSTRAINT check_deptno
CHECK (deptno BETWEEN 10 AND 99)
DISABLE,
dname VARCHAR2(9)
CONSTRAINT check_dname
CHECK (dname = UPPER (dname))
DISABLE,
loc VARCHAR2(10)
CONSTRAINT check_loc
CHECK (loc IN (‘DALLAS’,’BOSTON’,
’NEW YORK’,’CHICAGO’) )
4. 50

DISABLE)

d) CREATE TABLE dept


(deptno NUMBER, CONSTRAINT
pk_dept PRIMARY KEY,
dname VARCHAR2(9),
loc VARCHAR2(10) )
4. 51

e) CREATE TABLE dept


(deptno NUMBER,
dname VARCHAR2(9),
loc VARCHAR2(10),
CONSTRARINT pk_dept PRIMARY KEY (deptno) )

f) CREATE TABLE scott.emp


(empno NUMBER
CONSTRAINT pk_emp PRIMARY KEY,
ename VARCHAR2(10) CONSTRAINT nn_ename NOT NULL
CONSTRAINT upper_ename
CHECK (ename = UPPER(ename)),
job VARCHAR2(9),
mgr NUMBER CONSTRAINT fk_mgr
REFERENCES scott.emp(empno),
hiredate DATE DEFAULT SYSDATE,
sal NUMBER(10,2) CONSTRAINT ck_sal CHECK (sal > 500),
comm NUMBER(9,0) DEFAULT NULL,
deptno NUMBER(2)
CONSTRAINT nn_deptno NOT NULL
CONSTRAINT fk_deptno
REFERENCES scott.dept(deptno) )

PCTFREE 5 PCTUSED 75
4.14.2 Borrado de una tabla

DROP TABLE <Tabla> ;

Sintaxis del comando DROP TABLE

Ejemplo: DROP TABLE enfermo


4. 52

4.14.3 Modificación de la estructura de una tabla


Sintaxis del comando ALTER TABLE

ALTER TABLE <tabla>

ADD

( <especific NOT NULL )


column>

MODIFY
,

;
4. 53

Ejemplo:
ALTER TABLE enfermo
ADD (altura NUMBER(3,2))
Ejemplo:
ALTER TABLE enfermo
MODIFY (altura NUMBER(4,2))

Debe considerarse:

1. Es posible disminuir el tamaño de una columna con este


comando, si la columna contiene NULLS en todas las
filas.
2. La opción ADD ... NOT NULL, sólo será posible si la
tabla está vacía.
3. La opción MODIFY ... NOT NULL sólo podrá realizarse
cuando la tabla no contenga ninguna fila con valor nulo
en el campo en cuestión.

Modificación de tablas:
En caso de requerir remover una columna de una tabla, se
deben seguir los tres siguientes pasos:
4. 54

TEMPTAB
1. Crear una tabla duplicada

SQL CREATE TABLE temptab


ORIGTAB
2 AS SELECT col1, col2, col4
3 FROM origtab;

Table created.

2. Borrar la tabla fuente original


TEMPTAB

SQL DROP TABLE origtab;

ORIGTAB

Table dropped.

3. Renombrar la nueva tabla


TEMPTAB ORIGTAB
SQL RENAME temptab
2 TO origytab:

Table renamed.
4. 55

4.15 Vistas
4.15.1 Concepto de vista

EMP_NO APELLIDO OFICIO


7782 CEREZO DIRECTOR
7839 REY PRESIDENTE 7839 09-JUN-81 318500 10

7934 MUÑOZ EMPLEADO 17-NOV-81 650000 10


7782 23-ENE-82 169000 10

7566 JIMENEZ DIRECTOR 7839 02-ABR-81 386750 20


7902 FERNANDEZ ANALISTA 7566 03-DEC-81 390000 20
7369 SANCHEZ EMPLEADO 2902 17-DEC-80 104000 20
7876 ALONSO EMPLEADO 7788 03-MAY-87 143000 20
7788 GIL ANALISTA 7566 30-MAR-87 390000 20
7499 ARROYO VENDEDOR 7698 20-FEB-81 208000 39000 30
7521 SALA VENDEDOR 7698 22-FEB-81 162500 65000 30
7654 MARTIN VENDEDOR 7698 28-SEP-81 162500 182000 30
7698 NEGRO DIRECTOR 7839 01-MAY-81 370500 30
7844 TOVAR VENDEDOR 7698 08-SEP-81 195000 30
7900 JIMENO EMPLEADO 7698 03-DEC-81 123500 30

• Una VISTA es una ventana a través de la que se puede


ver o cambiar información de una tabla.
• Tiene la misma estructura que una tabla: filas y columnas.
• No contiene datos.
• Las vistas se tratan de forma semejante a una tabla.
4. 56

4.15.2 Creación de una vista


Sintaxis del comando CREATE VIEW
CREATE VIEW <vista>

( <columna>> )

AS <bloque ;
selecc>

Ejemplo:
CREATE VIEW pagos (NOMBRE, SAL_MES,
SAL_AÑO, DEPT_NO)
AS
SELECT APELLIDO, SALARIO,
SALARIO*12, DEPT_NO
FROM emp;
Ejemplo: Cambiar los nombres de los atributos a través de una vista
SQL CREATE VIEW TEACHERS2 (FID, NAME, DEPT, SEX)
2 AS SELECT FAC_ID, FACULTY_NAME,
4. 57

3 DEPARTMENT, GENDER FROM FACULTY;


View created.

Ejemplo: Especificar valores calculados en la vista


SQL CREATE VIEW DOUBLE_SAL (NAME, SAL) AS
2 SELECT FACULTY_NAME, SQRT(SALARY*2)
3 FROM FACULTY;
View created.

4.15.3 Actualización de una vista


Dado que la actualización de una vista, implica la actualización de las tablas bases, en algunas
ocasiones no es posible efectuar esta operación.

Opción WITH CHECK OPTION en la creación de una vista:


SQL CREATE VIEW empvu20
2 AS SELECT *
3 FROM emp
4 WHERE deptno = 20
5 WITH CHECK OPTION;

View created.
SQL UPDATE empvu20

2 SET deptno = 30

3 WHERE empno = 7369;


UPDATE empvu20
*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation

4.15.4 Borrado de una vista

Ejemplo: Eliminar la vista TEACHERS.

SQL DROP VIEW TEACHERS;


4. 58

4.16 Indices
Los índices son estructuras opcionales asociadas con tablas, usados para agilizar la ejecución de la
consulta y/o garantizar la unicidad.

Ejemplo de un índice

C SM

ADAMS . rowid CLARK – rowid KING – rowid SMITH – rowid


ALLEN – rowid FORD – rowid MARTIN – rowid TURNER – rowid
BLAKE - rowid JAMES – rowid MILLER – rowid WARD - rowid
JONES - rowid SCOTT - rowid
4. 59

El servidor ORACLE accesa a los datos de la tabla en una


de dos formas:
• FULL TABLE SCAN (secuencial)
• INDEX (selectivo)
Características de las columnas para indexar
• La columna es frecuentemente usada en la cláusula
WHERE
• Cada valor es único (mejor caso)
• Amplio rango de valores
• Muchos nulos / relativamente pocos valores

Creación de índices
Ejemplo:
Crear un índice simple en la columna ENAME
4. 60

SQL CREATE INDEX i_emp_ename


2 ON emp (ename);

Index created.

Indice usado:

SQL SELECT *
SQL SELECT *
2 FROM emp
2 FROM emp;
3 WHERE ename = ‘SMITH’;

Indice sin usar:


Ejemplos:

SQL
SQLCRETE
CRETEINDEX
UNIQUE
i_empno_ename
INDEX i_empn_ename
2 2 ON
ONemp
emp(empno,
(empno);ename);
Index
Indexcreated
created

También podría gustarte