bases de datos lenguaje sql

Upload: ernesto-duran

Post on 08-Jul-2018

237 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/19/2019 Bases de Datos Lenguaje SQL

    1/89

    Bases de Datos

    Lenguaje SQLProfesor: Gilberto Gutiérrez R.

    Departamento de Ciencias de la Computación y Tecnologı́as de la Información

    Facultad de Ciencias Empresariales

    Universidad del Bı́o-Bı́o

  • 8/19/2019 Bases de Datos Lenguaje SQL

    2/89

    Contenido

    1. Introducción

    2. Definición de datos

    3. Consultas básicas en SQL

    4. Consultas más complejas

    5. Sentencias de inserción, eliminación y de actualización en SQL

    6. Vistas (tablas virtuales) en SQL

    7. Utilización de índices

    8. Procedimientos almacenados

    9. Triggers de Bases de datos

  • 8/19/2019 Bases de Datos Lenguaje SQL

    3/89

    Definición de datos

    Creando la tabla EMPLEADOSCREATE TABLE EMPLEADO (

    NOMBRE VARCHAR(15)   NOT NULL,

    INIC CHAR,

    APELLIDO VARCHAR(15)   NOT NULL,NSS CHAR(9)   NOT NULL,

    FECHA_NCTO DATE,

    DIRECCION VARCHAR(15),

    SEXO CHAR,

    SALARIO DECIMAL(10,2),

    NSS_SUPERV CHAR(9),

    ND INT   NOT NULL,

    PRIMARY KEY(NSS),

    FOREIGN KEY(NSS-SUPERV)   REFERENCES EMPLEADO (NSS),FOREIGN KEY(ND)   REFERENCES DEPARTAMENTO (NUMEROD));

  • 8/19/2019 Bases de Datos Lenguaje SQL

    4/89

    Definición de datos (cont.)

    creando la tabla TRABAJA_ENCREATE TABLE  TRABAJA_EN (

    NSSE CHAR(9)   NOT NULL,

    NP INT   NOT NULL,

    HORAS DECIMAL(3,1)   NOT NULL,PRIMARY KEY(NSSE, NP),

    FOREIGN KEY (NSSE)   REFERENCES EMPLEADO(NSS),

    FOREIGN KEY (NP)   REFERENCES PROYECTO(NUMEROP));

  • 8/19/2019 Bases de Datos Lenguaje SQL

    5/89

    Definición de datos (cont.)

    Eliminación de tablasDROP TABLE EMPLEADO;

    Modificación del esquema de la tabla

    ALTER TABLE EMPLEADO  ADD PUESTO VARCHAR(10);

  • 8/19/2019 Bases de Datos Lenguaje SQL

    6/89

    Consultas básicas en SQL

    SELECT   FROM  

    WHERE  

    donde:

     es una lista de atributos cuyos valores van a

    ser recuperados

     es una lista de nombres de las relaciones

    necesarias para procesar las consultas

     es una expresión booleana que identifica las tuplas

    que van a ser recuperadas por la consulta

  • 8/19/2019 Bases de Datos Lenguaje SQL

    7/89

    Consultas básicas en SQL (cont.)

    Ejemplos:Recuperar la fecha nacimiento y dirección del empleado cuyo nombre

    es ’John B. Samith’.

    SELECT FECHA_NCTO, DIRECCION

    FROM EMPLEADO

    WHERE NOMBRE=’John’ and INIC=’B’ and APELLIDO=’Smith’;

    Resultado:fecha_ncto | direccion

    ------------+--------------------------

    1965-01-09 | 731 Fondren, Houston, TX

    (1 row)

    En álgebra relacional sería:

    πFECHA_NAC, DIRECCION

    (σNOMBRE =′John′ and INIC =′B′ and AP ELLIDO=′Smith′(EMPLEADO))

  • 8/19/2019 Bases de Datos Lenguaje SQL

    8/89

    Consultas básicas en SQL (cont.)

    Listar los nombres y salario de los empleados cuyo sueldo supera los30.000 dólares

    SELECT NOMBRE, SALARIO

    FROM EMPLEADO

    WHERE SALARIO > 30000;

    Resultado:

    nombre | salario

    ----------+----------

    Franklin | 40000.00

    Jennifer | 43000.00

    Ramesh | 38000.00

    James | 55000.00

    (4 rows)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    9/89

    Consultas básicas en SQL (cont.)

    Recuperar los nombres y dirección de los empleados que trabajan enel departamento de ’Investigación’

    SELECT NOMBRE, DIRECCION

    FROM EMPLEADO, DEPARTAMENTO

    WHERE NOMBRED=’Investigacion’ AND NUMEROD=ND;

    Resultado:

    nombre | apellido | direccion----------+----------+--------------------------

    John | Smith | 731 Fondren, Houston, TX

    Franklin | Worg | 638 Voss, Houston, TX

    Ramesh | Narayan | 975 Fire Oak, Humble, TX

    Joyce | English | 5631 Rice, Houston, TX

    (4 rows)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    10/89

    Consultas simples

    De cada proyecto ubicado en ’Stafford’, obtener una lista con el número de proyecto, elnúmero del departamento controlador y el apellido, dirección y fecha de nacimiento del jefe

    del departamento.

    SELECT NUMEROP, NUMD, APELLIDO, DIRECCION, FECHA_NCTO

    FROM PROYECTO, DEPARTAMENTO, EMPLEADO

    WHERE NUMD = NUMEROD  AND NSS_JEFE = NSS  AND  LOCALIZACIONP=’Stafford’;

    numerop | numd | apellido | direccion | fecha_ncto

    ---------+------+----------+-------------------------+------------

    30 | 4 | Wallace | 291 Berry, Bellaire, TX | 1941-06-20

    10 | 4 | Wallace | 291 Berry, Bellaire, TX | 1941-06-20

    (2 rows)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    11/89

  • 8/19/2019 Bases de Datos Lenguaje SQL

    12/89

    Atributos ambiguos y asignación de alias

    De cada empleado recuperar su nombre de pila y apellido y los de sus supervisor inmediato

    SELECT  E.NOMBRE, E.APELLIDO, S.NOMBRE, S.APELLIDO

    FROM EMPLEADO AS E, EMPLEADO AS S

    WHERE E.NSS_SUPERV = S.NSS;

    nombre | apellido | nombre | apellido

    ----------+----------+----------+----------

    John | Smith | Franklin | Worg

    Franklin | Worg | James | Borg

    Alicia | Zelaya | Jennifer | Wallace

    Jennifer | Wallace | James | Borg

    Ramesh | Narayan | Franklin | Worg

    Joyce | English | Franklin | Worg

    Ahmad | Jabbar | Jennifer | Wallace

    (7 rows)

    También puede ser

    FROM EMPLEADO E, EMPLEADO S

  • 8/19/2019 Bases de Datos Lenguaje SQL

    13/89

    Renombrar los atributos de la relación

    EMPLEADO AS E(NP, IN,AP, NSS, FN, DIR, SEX, SAL, NSSS, NF)También puede ser así

    SELECT NOMBRE AS NOMBRE_PILA

    FROM EMPLEADO;

    nombre_pila

    -------------

    John

    Franklin

    Alicia

    Jennifer

    Ramesh

    Joyce

    Ahmad

    James

    (8 rows)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    14/89

    Cláusula WHERE no especificadas y uso de *

    SELECT  NSSFROM EMPLEADO;

    nss

    -----------

    123456789

    333445555

    999887777

    987654321

    666884444

    453453453

    987987987

    888665555

    (8 rows)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    15/89

    Cláusula WHERE no especificadas y uso de *

    SELECT  NSS, NOMBREDFROM EMPLEADO, DEPARTAMENTO

    nss | nombred

    -----------+----------------

    123456789 | Investigacion

    333445555 | Investigacion

    999887777 | Investigacion

    987654321 | Investigacion

    666884444 | Investigacion

    453453453 | Investigacion

    987987987 | Investigacion

    888665555 | Investigacion

    123456789 | Administracion

    333445555 | Administracion

    999887777 | Administracion

    987654321 | Administracion

    ... ....

  • 8/19/2019 Bases de Datos Lenguaje SQL

    16/89

    Cláusula WHERE no especificadas y uso de *

    SELECT *FROM EMPLEADO

    WHERE ND=5

    SELECT *

    FROM EMPLEADO, DEPARTAMENTO

    WHERE NOMBRED=’Investigacion’ AND ND = NUMEROD;

    SELECT *

    FROM EMPLEADO, DEPARTAMENTO;

  • 8/19/2019 Bases de Datos Lenguaje SQL

    17/89

    Tablas como conjuntos

    SQL suele tratar una tabla no como un conjunto sino como unmulticonjunto

    Pueden aparecer tuplas repetidas en una tabla y en el resultado de

    una consulta

    Algunas razones para mantener las tuplas repetidas:

    La eliminación de tuplas es una operación muy costosa

    El usuario quiere ver las tuplas rpetidasFunciones de agregación (veremos esto más adelante)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    18/89

    Tablas como conjuntos (continuación)

    DISTINCT – Eliminación de tuplas repetidasALL  – Se conservan las tuplas repetidas

    Ejemplos:

    SELECT ALL   SALARIO

    FROM EMPLEADO

    salario

    ----------

    30000.0040000.00

    25000.00

    43000.00

    38000.00

    25000.00

    25000.00

    55000.00(8 rows)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    19/89

    Tablas como conjuntos (continuación)

    Ejemplos:SELECT DISTINCT   SALARIO

    FROM EMPLEADO

    salario

    ----------

    25000.00

    30000.00

    38000.0040000.00

    43000.00

    55000.00

    (6 rows)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    20/89

    Tablas como conjuntos (continuación)

    Union (UNION), Intersección (INTERSECT) y diferencia de conjuntos(EXCEPT)

    Ejemplo:Prepare una lista con todos los números de proyectos en los que participa un empleado de

    apellido ’Smith’, sea como trabajador o como jefe del departamento que controla el proyecto

    (SELECT DISTINCT NUMEROP

    FROM PROYECTO, DEPARTAMENTO, EMPLEADO

    WHERE NUMD = NUMEROD AND NSS_JEFE = NSS AND

    APELLIDO = ’Smith’ )UNION

    (SELECT DISTINCT NP

    FROM TRABAJA_EN, EMPLEADO

    WHERE NSSE= NSS AND APELLIDO=’Smith’);

    numerop

    ---------

    1

    2

    (2 rows)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    21/89

    Subcadenas y operadores aritméticos

    LIKE, % y -Recuperar todos los empleados cuya dirección es Houston, Texas

    SELECT NOMBRE,APELLIDO

    FROM EMPLEADO

    WHERE DIRECCION LIKE ’%Houston, TX%’ ;

    nombre | apellido

    ----------+----------

    John | Smith

    Franklin | Worg

    Joyce | English

    Ahmad | Jabbar

    James | Borg

    (5 rows)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    22/89

  • 8/19/2019 Bases de Datos Lenguaje SQL

    23/89

    Operador between

    SELECT NOMBRE, SALARIOFROM EMPLEADO

    WHERE (SALARIO BETWEEN 30000 AND 40000);

    nombre | salario

    ----------+----------

    John | 30000.00

    Franklin | 40000.00

    Ramesh | 38000.00

    (3 rows)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    24/89

    Ordenación

    Obtener una lista de los empleados y de los proyectos en los quetrabajan, ordenados por departamento, y, dentro de departamento,alfabéticamente por apellido y nombre

    SELECT NOMBRED, APELLIDO, E.NOMBRE, PROYECTO.NOMBRE

    FROM DEPARTAMENTO, EMPLEADO E, TRABAJA_EN, PROYECTOWHERE NUMEROD=ND AND NSS=NSSE AND NP= NUMEROP

    ORDER BY NOMBRED, APELLIDO, E.NOMBRE;

    nombred | apellido | nombre | nombre

    ----------------+----------+----------+----------------

    Administracion | Jabbar | Ahmad | Automatizacion

    Administracion | Jabbar | Ahmad | Nuevos Benefic

    Administracion | Wallace | Jennifer | Reorganizacion

    Administracion | Wallace | Jennifer | Nuevos Benefic

    Administracion | Zelaya | Alicia | AutomatizacionAdministracion | Zelaya | Alicia | Nuevos Benefic

    Direccion | Borg | James | Reorganizacion

    Investigacion | English | Joyce | ProductoY

    ...

  • 8/19/2019 Bases de Datos Lenguaje SQL

    25/89

    Consultas SQL más complejas

  • 8/19/2019 Bases de Datos Lenguaje SQL

    26/89

    Consultas anidadas / subconsultas

    Caso: obtener valores existentes en la base de datos para luego utilizarlos en una condición.Estos son bloques completos SELECT... FROM ... WHERE dentro de la claúsula WHERE

    de otra consulta.

    Ejemplo: Prepare una lista con todos los números de proyectos en los que participa un

    empleado de apellido ’Smith’, sea como trabajador o como jefe del departamento que

    controla el proyecto

    SELECT DISTINCT NUMEROP

    FROM PROYECTO

    WHERE NUMEROP IN (SELECT NUMEROP

    FROM PROYECTO, DEPARTAMENTO, EMPLEADOWHERE NUMD=NUMEROD AND NSS_JEFE=NSS AND APELLIDO =’Smith’)

    OR

    NUMEROP IN (SELECT NP

    FROM TRABAJA_EN, EMPLEADO

    WHERE NSSE=NSS AND APELLIDO=’Smith’);

    numerop

    ---------

    1

    2(2 rows)

    C l id d b l

  • 8/19/2019 Bases de Datos Lenguaje SQL

    27/89

    Consultas anidadas / subconsultas

    SELECT DISTINCT NSSEFROM TRABAJA_EN

    WHERE (NP,HORAS) IN (SELECT NP, HORAS FROM TRABAJA_EN

    WHERE NSSE= ’123456789’);

    nsse

    -----------

    123456789

    (1 row)

    C lt id d / b lt

  • 8/19/2019 Bases de Datos Lenguaje SQL

    28/89

    Consultas anidadas / subconsultas

    Operadores:

    IN Compara el valor v con un conjunto o multiconjunto de valores

    V   y evalúa a TRUE si  v es uno de los elementos de  V  

    ANY⇐⇒ SOME, ALL (>,>=,

  • 8/19/2019 Bases de Datos Lenguaje SQL

    29/89

    Consultas anidadas / subconsultas

    Ambiguedades de los nombres de los atributosEjemplo:El nombre y apellido de cada empleado que tenga un familiar con el mismo nombre de pila y

    sexo que el e mpleado

    SELECT E.NOMBRE, E.APELLIDOFROM EMPLEADO AS E

    WHERE E.NSS IN (SELECT NSSE

    FROM DEPENDIENTE

    WHERE E.NOMBRE = NOMBRE_DEPENDIENTE

    AND E.SEXO = SEXO);

    --------+----------

    (0 rows)

    La regla es: la referencia a un atributo no calificado se refiere a larelación declarada en la consulta anidada más interior

    C lt id d l i d

  • 8/19/2019 Bases de Datos Lenguaje SQL

    30/89

    Consultas anidadas correlacionadas

    Siempre que una claúsula WHERE de una consulta anidada hacereferencia a un atributo de una relación declarada en una consulta

    externa.

    La consulta anida se evalua una vez por cada tupla (o combinación de

    tuplas) en la consulta externa.

    En la consulta anterior: Por cada tupla empleado, se evalua la consulta

    anidadaEn general una consulta anidada y que emplee los operadores = o IN siempre puede

    expresarse como una consulta de un sólo bloque Ejemplo:

    SELECT E.NOMBRE, E.APELLIDO

    FROM EMPLEADO AS E, DEPENDIENTE AS D

    WHERE E.NSS = D.NSSE AND E.SEXO = D.SEXO AND

    E.NOMBRE = D.NOMBRE_DEPENDIENTE

    Función EXISTS (NOT EXISTS)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    31/89

    Función EXISTS (NOT EXISTS)

    Sirve para comprobar si el resultado de una consulta anidadacorrelacionada es o no vacío. Ejemplo:

    El nombre y apellido de cada empleado que tenga un familiar con el mismo nombre de pila y

    sexo que el e mpleado

    SELECT E.NOMBRE, E.APELLIDO

    FROM EMPLEADO AS E

    WHERE EXISTS (SELECT   *

    FROM DEPENDIENTE

    WHERE E.NSS = NSSE ANDE.NOMBRE = NOMBRE_DEPENDIENTE

    AND E.SEXO = SEXO);

    --------+----------

    (0 rows)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    32/89

    Función EXISTS (NOT EXISTS)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    33/89

    Función EXISTS (NOT EXISTS)

    Recupere los nombres y apellidos de los jefes de departamento y que tienen por lo menosun familiar dependiente

    SELECT NOMBRE, APELLIDO

    FROM EMPLEADO AS E

    WHERE EXISTS (SELECT   *

    FROM DEPENDIENTE

    WHERE E.NSS = NSSE)

    AND

    EXISTS (SELECT   *

    FROM DEPARTAMENTOWHERE NSS= NSS_JEFE);

    nombre | apellido

    ----------+----------

    Franklin | Worg

    Jennifer | Wallace

    (2 rows)

    Función EXISTS (NOT EXISTS)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    34/89

    Función EXISTS (NOT EXISTS)

    Recupere los nombres y apellidos de todos los empleados que trabajan en todos losproyectos controlados por el departamento número 5

    SELECT NOMBRE, APELLIDO

    FROM EMPLEADO

    WHERE NOT EXISTS

    ( ( SELECT NUMEROP

    FROM PROYECTO

    WHERE NUMD = 5)

    EXCEPT

    ( SELECT NPFROM TRABAJA_EN

    WHERE NSS= NSSE));

    nombre | apellido

    --------+----------

    (0 rows)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    35/89

    Valores null (IS NULL, IS NOT NULL)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    36/89

    Valores null (IS NULL, IS NOT NULL)

    Recupere los nombres de los empleados que no tienen supervisoresSELECT NOMBRE, APELLIDO

    FROM EMPLEADO

    WHERE NSS_SUPERV IS NULL;

    nombre | apellido

    --------+----------

    James | Borg

    (1 row)

    Renombrar atributos y relaciones

  • 8/19/2019 Bases de Datos Lenguaje SQL

    37/89

    Renombrar atributos y relaciones

    De cada empleado recuperar su apellido y el apellido de su supervisor inmediatoSELECT E.APELLIDO AS NOMBRE_EMPLEADO,

    S.APELLIDO AS NOMBRE_SUPERVISOR

    FROM EMPLEADO AS E, EMPLEADO AS S

    WHERE E.NSS_SUPERV=S.NSS;

    nombre_empleado | nombre_supervisor

    -----------------+-------------------

    Smith | Worg

    Worg | BorgZelaya | Wallace

    Wallace | Borg

    Narayan | Worg

    English | Worg

    Jabbar | Wallace

    Tablas combinadas (Join)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    38/89

    ab as co b adas (Jo )

    Recuperar los nombres y dirección de los empleados que trabajan en el departamento deInvestigación

    SELECT EMPLEADO.NOMBRE, APELLIDO, DIRECCION

    FROM (EMPLEADO JOIN DEPARTAMENTO ON ND = NUMEROD)

    WHERE DEPARTAMENTO.NOMBRED= ’Investigacion’;

    nombre | apellido | direccion

    ----------+----------+--------------------------

    John | Smith | 731 Fondren, Houston, TX

    Franklin | Worg | 638 Voss, Houston, TXRamesh | Narayan | 975 Fire Oak, Humble, TX

    Joyce | English | 5631 Rice, Houston, TX

    (4 rows)

    Tablas combinadas (Natural Join)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    39/89

    ( )

    Recuperar los nombres y dirección de los empleados que trabajan en el departamento deInvestigación

    SELECT EMPLEADO.NOMBRE, APELLIDO, DIRECCION

    FROM (EMPLEADO NATURAL JOIN

    DEPARTAMENTO AS DEPTO(NOMBRED, ND, NSSG, FECHAIG))

    WHERE NOMBRED= ’Investigacion’;

    nombre | apellido | direccion

    ----------+----------+--------------------------

    John | Smith | 731 Fondren, Houston, TXFranklin | Worg | 638 Voss, Houston, TX

    Ramesh | Narayan | 975 Fire Oak, Humble, TX

    Joyce | English | 5631 Rice, Houston, TX

    (4 rows)

    Tablas combinadas (OUTER JOIN)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    40/89

    ( )

    De cada empleado recuperar su apellido y el apellido de su supervisor inmediatoSELECT E.APELLIDO AS NOMBRE_EMPLEADO,

    S.APELLIDO AS NOMBRE_SUPERVISOR

    FROM (EMPLEADO AS E LEFT OUTER JOIN EMPLEADO AS S

    ON E.NSS_SUPERV= S.NSS);

    nombre_empleado | nombre_supervisor

    -----------------+-------------------

    Smith | Worg

    Worg | BorgZelaya | Wallace

    Wallace | Borg

    Narayan | Worg

    English | Worg

    Jabbar | Wallace

    Borg |

    (8 rows)

    LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN

    Tablas combinadas (varias reuniones)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    41/89

    ( )

    De cada proyecto ubicado en ’Stafford’, obtener una lista con el número de proyecto, elnúmero del departamento controlador y el apellido, dirección y fecha de nacimiento del jefe

    del departamento.

    SELECT NUMEROP, NUMD, APELLIDO, DIRECCION, FECHA_NCTO

    FROM ((PROYECTO JOIN DEPARTAMENTO ON NUMD = NUMEROD)JOIN EMPLEADO ON NSS_JEFE = NSS)

    WHERE LOCALIZACIONP = ’Stafford’;

    numerop | numd | apellido | direccion | fecha_ncto

    ---------+------+----------+-------------------------+------------

    30 | 4 | Wallace | 291 Berry, Bellaire, TX | 1941-06-20

    10 | 4 | Wallace | 291 Berry, Bellaire, TX | 1941-06-20

    (2 rows)

    Ejercicios

  • 8/19/2019 Bases de Datos Lenguaje SQL

    42/89

    1. Obtenga un listado (nombre y apellido, ordenado alfabéticamente por apellido) de losempleados varones que ganan entre 30000 y 10000.

    2. Obtenga un listado con los empleados (nombre, apellido) que tienen asignado más de

    20 horas a un proyecto.

    3. Obtenga los empleados que trabajan en un proyecto dirigido por un departamentocuyo jefe es el empleado "Smith".

    4. Encuentre los empleados que no están asignado a ningún proyecto.

    5. Los empledados que tienen en alguno de sus proyectos las misma cantidad de horas

    que tiene asignado el empleado NSS=12345678 al proyecto 1020.6. Encuentre Los empleados que trabajan en los mismos proyectos que el empleado con

    NSS=12345678

    Funciones de agregación y de agrupación

  • 8/19/2019 Bases de Datos Lenguaje SQL

    43/89

    1. Funciones de agregaciónCOUNT – Número de tuplas

    SUM

    MAX (MIN) – Se pueden usar en dominios no numéricos, siexiste un orden total entre los elementos

    AVG

    2. Funciones de agrupación

    GROUP BY

    Funciones de agregación

  • 8/19/2019 Bases de Datos Lenguaje SQL

    44/89

    Encontrar la suma de todos los salarios de los empleados, el salario máximo, el salariomínimo y el salario promedio

    SELECT SUM(SALARIO),

    MAX(SALARIO),

    MIN(SALARIO),

    AVG(SALARIO)

    FROM EMPLEADO;

    sum | max | min | avg

    -----------+----------+----------+--------------------281000.00 | 55000.00 | 25000.00 | 35125.000000000000

    (1 row)

    Funciones de agregación

  • 8/19/2019 Bases de Datos Lenguaje SQL

    45/89

    Encontrar la suma de todos los salarios de los empleados del departamento de

    investigación, así como el salario máximo, el salario mínimo y el salario promedio de dicho

    departamento

    SELECT SUM(SALARIO),

    MAX(SALARIO),

    MIN(SALARIO),

    AVG(SALARIO)

    FROM (EMPLEADO JOIN DEPARTAMENTO ON ND = NUMEROD)

    WHERE NOMBRED= ’Investigacion’;

    sum | max | min | avg

    -----------+----------+----------+--------------------

    133000.00 | 40000.00 | 25000.00 | 33250.000000000000

    (1 row)

    Funciones de agregación

  • 8/19/2019 Bases de Datos Lenguaje SQL

    46/89

    Recupere el total de empleados de la empresa

    SELECT COUNT(*) AS TOTAL_EMPLEADO

    FROM EMPLEADO;

    total_empleado

    ----------------

    8

    (1 row)

    Recupere el total de empleados del departamento de investigaciónSELECT COUNT(*)

    FROM (EMPLEADO JOIN DEPARTAMENTO ON ND = NUMEROD)

    WHERE NOMBRED= ’Investigacion’;

    count

    -------

    4

    (1 row)

    Funciones de agregación

  • 8/19/2019 Bases de Datos Lenguaje SQL

    47/89

    COUNT(*) – Número de filasSELECT COUNT(DISTINCT SALARIO)

    FROM EMPLEADO;

    count

    -------

    6

    (1 row)

    Funciones de agregación

  • 8/19/2019 Bases de Datos Lenguaje SQL

    48/89

    Recupere el nombre de los empleados que tienen más de dos cargas familiares

    (dependientes)

    SELECT APELLIDO, NOMBRE

    FROM EMPLEADO

    WHERE (SELECT COUNT(*)

    FROM DEPENDIENTE

    WHERE NSS=NSSE) >=2;

    apellido | nombre

    ----------+----------Smith | John

    Worg | Franklin

    (2 rows)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    49/89

    Funciones de agregación – GROUP BY

  • 8/19/2019 Bases de Datos Lenguaje SQL

    50/89

    De cada proyecto, recupere su número, nombre y el número de empleados que trabajan en

    él

    SELECT NUMEROP,

    NOMBRE,

    COUNT(*)

    FROM (PROYECTO JOIN TRABAJA_EN ON NP = NUMEROP)

    GROUP BY NUMEROP, NOMBRE;

    numerop | nombre | count

    ---------+----------------+-------1 | ProductoX | 2

    10 | Automatizacion | 3

    3 | ProductoZ | 2

    30 | Nuevos Benefic | 3

    2 | ProductoY | 3

    20 | Reorganizacion | 3

    (6 rows)

    Funciones de agregación – GROUP BY y HAVING

  • 8/19/2019 Bases de Datos Lenguaje SQL

    51/89

    De cada proyecto, en el que trabajen más de dos empleados, recupere su número, su

    nombre y el número de empleados que trabajan en él

    SELECT NUMEROP,

    NOMBRE,

    COUNT(*)

    FROM (PROYECTO JOIN TRABAJA_EN ON NP = NUMEROP)

    GROUP BY NUMEROP, NOMBRE

    HAVING COUNT(*) > 2 :

    numerop | nombre | count---------+----------------+-------

    10 | Automatizacion | 3

    30 | Nuevos Benefic | 3

    2 | ProductoY | 3

    20 | Reorganizacion | 3

    (4 rows)

    Funciones de agregación – GROUP BY y HAVING

  • 8/19/2019 Bases de Datos Lenguaje SQL

    52/89

    De cada proyecto, recupere su número, su nombre y el número de empleados del

    departamento 5 que trabajan en él

    SELECT P.NUMEROP,

    P.NOMBRE,

    COUNT(*)

    FROM ((PROYECTO AS P JOIN TRABAJA_EN ON NP = NUMEROP) JOIN EMPLEADO ON NSS=NSS

    WHERE ND = 5

    GROUP BY P.NUMEROP, P.NOMBRE;

    numerop | nombre | count---------+----------------+-------

    3 | ProductoZ | 2

    1 | ProductoX | 2

    20 | Reorganizacion | 1

    10 | Automatizacion | 1

    2 | ProductoY | 3

    (5 rows)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    53/89

  • 8/19/2019 Bases de Datos Lenguaje SQL

    54/89

  • 8/19/2019 Bases de Datos Lenguaje SQL

    55/89

    Sentencias INSERT, DELETE y UPDATE en SQL

  • 8/19/2019 Bases de Datos Lenguaje SQL

    56/89

    INSERT

  • 8/19/2019 Bases de Datos Lenguaje SQL

    57/89

    Forma simple

    INSERT INTO EMPLEADO

    VALUES (’John’, ’B’, ’Smith’, ’123456789’, ’01/09/1965’,

    ’731 Fondren, Houston, TX’, ’H’, 30000, ’333445555’,5);

    Otra forma

    INSERT INTO EMPLEADO(NOMBRE, APELLIDO, ND, NSS)

    VALUES (’Gilberto’, ’G’, ’Gutierrez’, 4, ’8906080’),

    (’Luis’,’L’, ’Salcedo’,5,’123456710’);

    se debe tener en cuenta la forma en que se creó la tabla (NOT NULL, Integridad referencial,

    de entidad)

    INSERT (cont.)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    58/89

    Insertando tuplas a partir del resultado de una consultaCREATE TABLE INFO_DEPTOS

    (NOMBRE_DEPTO VARCHAR(15),

    NUM_DE_EMPS INTEGER,

    SAL_TOTAL INTEGER);

    INSERT INTO INFO_DEPTOS (NOMBRE_DEPTO, NUM_DE_EMPS, SAL_TOTAL)

    SELECT NOMBRED, COUNT(*), SUM(SALARIO)

    FROM (DEPARTAMENTO JOIN EMPLEADO ON NUMEROD=ND)

    GROUP BY NOMBRED;

    SELECT   *   FROM INFO_DEPTOS;

    nombre_depto | num_de_emps | sal_total

    ----------------+-------------+-----------

    Direccion | 1 | 55000

    Administracion | 3 | 93000

    Investigacion | 4 | 133000

    (3 rows)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    59/89

    UPDATE

  • 8/19/2019 Bases de Datos Lenguaje SQL

    60/89

    Modificar los valores de los atributos en una o más tuplasUPDATE PROYECTO

    SET LOCALIZACIONP=’Bellaire’,

    N D = 5

    WHERE NUMEROP= 10;

    UPDATE PROYECTO

    SET SALARIO= SALARIO   *   1.1

    WHERE ND IN (SELECT NUMEROD

    FROM DEPARTAMENTOWHERE NOMBRED=’Investigacion’);

    También se puede especificar NULL o DEFAULT como nuevo valor del atributo

  • 8/19/2019 Bases de Datos Lenguaje SQL

    61/89

    Vistas (tablas virtuales) en SQL

  • 8/19/2019 Bases de Datos Lenguaje SQL

    62/89

    Vistas

  • 8/19/2019 Bases de Datos Lenguaje SQL

    63/89

    Diferentes visiones de la Base de DatosConsultas complejas.

    Ejemplo “Los empleados del departamento 10 que ganan más

    que el promedio de la empresa y menos que el promedio del

    departamento 30”

    Definición: Una vista en SQL es una tabla derivada de otras tablas o

    relaciones, las cuales pueden ser:

    tablas o relaciones de base

    Vistas previamente definidas

  • 8/19/2019 Bases de Datos Lenguaje SQL

    64/89

    Vistas

  • 8/19/2019 Bases de Datos Lenguaje SQL

    65/89

    Ejemplo: “Una lista de empleados y su jefe

    CREATE VIEW EMPYJEFES AS

    SELECT E1.NOMBRE AS NOMBRE, E1.APELLIDO AS APELLIDO,

    E2.NOMBRE AS NOMBRE_J, E2.APELLIDO AS APELLIDO_J

    FROM (EMPLEADO E1 LEFT OUTER JOIN EMPLEADO E2 ON E1.NSS_SUPERV = E2.NSS);

    CREATE VIEW

    select   *   from empyjefes;

    nombre | apellido | nombre_j | apellido_j----------+----------+----------+------------

    John | Smith | Franklin | Worg

    Franklin | Worg | James | Borg

    Alicia | Zelaya | Jennifer | Wallace

    Jennifer | Wallace | James | Borg

    Ramesh | Narayan | Franklin | Worg

    Joyce | English | Franklin | Worg

    Ahmad | Jabbar | Jennifer | Wallace

    James | Borg | |(8 rows)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    66/89

    Vistas

  • 8/19/2019 Bases de Datos Lenguaje SQL

    67/89

    Las modificaciones en las tablas bases se ven reflejadas en la vista.

    Esto es responsabilidad del SABD

    Eliminación de una vista

    DROP VIEW

    Implementación de vistas

  • 8/19/2019 Bases de Datos Lenguaje SQL

    68/89

    1.   Modificación de consulta. Convertir la consulta sobre las tablas

    de base. Su principal desventaja es el tiempo de ejecución.

    2.   Materialización de vistas. Crear físicamente la tabla de vista

    cuando se consulta la vista por primera vez y mantener la tabla

    para aprovecharla en consultas posteriores. Esto implica contar

    con estrategias para mantener actualizada la vista siendo una de

    ella la actualización incremental.

    Actualización de vistas

    M li d bi

  • 8/19/2019 Bases de Datos Lenguaje SQL

    69/89

    Muy complicada y ambigua.

    insert into investigacion values(’1’, ’Juan’, ’JP’, ’Perez’, 5000);

    Una vista con una sola tabla base es actualizable si los atributos

    de la vista contienen la clave primaria o alguna otra clave

    candidata de la relación base.

    En general las vistas definidas sobre múltiples tablas por medio

    de join no son actualizables.

    Las vistas definidas mediante agrupación y funciones de

    agregación no son actualizables.

  • 8/19/2019 Bases de Datos Lenguaje SQL

    70/89

    Especificación de índices en SQL

    Indices

    CREATE TABLE EMPLEADO (

  • 8/19/2019 Bases de Datos Lenguaje SQL

    71/89

    CREATE TABLE EMPLEADO (

    NOMBRE VARCHAR(15)   NOT NULL,

    INIC CHAR,

    APELLIDO VARCHAR(15)   NOT NULL,

    NSS CHAR(9)   NOT NULL,

    FECHA_NCTO DATE,DIRECCION VARCHAR(15),

    SEXO CHAR,

    SALARIO DECIMAL(10,2),

    NSS_SUPERV CHAR(9),

    ND INT   NOT NULL,

    PRIMARY KEY(NSS),

    FOREIGN KEY(NSS-SUPERV)   REFERENCES EMPLEADO (NSS),

    FOREIGN KEY(ND)   REFERENCES DEPARTAMENTO (NUMEROD));

    SELECT * FROM EMPLEADO WHERE NSS=’123456789’; =⇒ todo bien, muy rápidoSELECT * FROM EMPLEADO WHERE salario=25000; =⇒ recorrer toda la tabla empleado,

    tarda demasiado.

    (salario es frecuentemente usado en la cláusula WHERE)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    72/89

    creación de un índice

    CREATE INDEX INICIDX ON EMPLEADO USING HASH (INIC);

  • 8/19/2019 Bases de Datos Lenguaje SQL

    73/89

    CREATE INDEX INICIDX ON EMPLEADO USING HASH (INIC);

    ggutierr=> \d empleado

    Table "public.empleado"

    Column | Type | Modifiers

    ------------+-----------------------+-----------

    nombre | character varying(15) | not null

    inic | character(1) |

    apellido | character varying(15) | not null

    nss | character(9) | not null

    fecha_ncto | date |

    direccion | character varying(30) |

    sexo | character(1) |

    salario | numeric(10,2) |

    nss_superv | character(9) |

    nd | integer | not null

    Indexes:

    "empleado_pkey" PRIMARY KEY, btree (nss)

    "inicidx" hash (inic)

    "salarioidx" btree (salario)

    Eliminación de un índice

    DROP INDEX SALARIOIDX;

  • 8/19/2019 Bases de Datos Lenguaje SQL

    74/89

    DROP INDEX SALARIOIDX;

  • 8/19/2019 Bases de Datos Lenguaje SQL

    75/89

    Procedimientos Almacenados de Bases

    de Datos

    Procedimientos almacenados y funciones

    1 Lo normal es que el programa de aplicación de Bases de Datos se

  • 8/19/2019 Bases de Datos Lenguaje SQL

    76/89

    1. Lo normal es que el programa de aplicación de Bases de Datos se

    ejecute en el cliente.

    2. Sin embargo, a veces es conveniente crear módulos de programas

    que se almacenen en lado del servidor (procedimientos

    almacenados / módulos almacenados persistentes)

    Los Procedimientos almacenados son útiles en los siguientes casos:

    1. Varias aplicaciones accesan un mismo programa de bases dedatos. Se reduce la duplicidad de esfuerzo

    2. Reducir el costo de derivado de la transferencia de datos

    3. Potenciar las vistas (tipos de datos derivados más complejos)

    Procedimientos almacenados y funciones

    Declaración de un procedimiento almacenado

  • 8/19/2019 Bases de Datos Lenguaje SQL

    77/89

    Declaración de un procedimiento almacenadoCREATE PROCEDURE nombre del procedimiento (parámetros)

    declaraciones locales

    cuerpo del procedimiento;

    Declaración de una funciónCREATE FUNCTION nombre de la función (parámetros)

    RETURNS tipo de devolución

    declaraciones locales

    cuerpo de la función;

    Declaración usando un lenguaje de propósito generalCREATE PROCEDURE nombre del procedimiento (parámetros)

    LANGUAGE nombre del lenguaje de programación

    EXTERNAL NAME nombre de la ruta del archivo;

    Procedimientos almacenados y funciones

    LLamando a un procedimiento almacenado o una función

  • 8/19/2019 Bases de Datos Lenguaje SQL

    78/89

    LLamando a un procedimiento almacenado o una función

    1. CALL nombre del procedimiento o función(lista de argumentos))

    2. SELECT nombre de la función(lista de argumentos)), . . .

    Ejemplo:

    Procedimientos almacenados y funciones

    Ejemplos usando Postgres

  • 8/19/2019 Bases de Datos Lenguaje SQL

    79/89

    Una función para obtener la edad de un empleado

    CREATE FUNCTION Edad(date, character(9))

    RETURNS integer

    AS ’SELECT ($1-fecha_ncto)/365 FROM empleado WHERE $2 = NSS;’

    LANGUAGE ’sql’;

    SELECT nombre, Apellido, Edad(’10/03/2008’, NSS) FROM Empleado;

    nombre | apellido | edad

    ----------+----------+------

    John | Smith | 43

    Franklin | Worg | 52

    Alicia | Zelaya | 40

    Jennifer | Wallace | 67

    Ramesh | Narayan | 46

    Joyce | English | 36

    Ahmad | Jabbar | 39

    James | Borg | 70

    Juan | Perez | 43

    (9 rows)

    Procedimientos almacenados y funciones

    Ejemplos usando Postgres

  • 8/19/2019 Bases de Datos Lenguaje SQL

    80/89

    SELECT Nombre, Apellido, Edad(’11/02/2008’, NSS) AS EDAD

    FROM EMPLEADO

    ORDER BY EDAD;

    SELECT Nombre, Apellido, Edad(’11/02/2008’, NSS) AS EDADFROM EMPLEADO where Edad(’11/02/2008’,NSS) < 50

    ORDER BY EDAD;

    nombre | apellido | edad

    --------+----------+------

    Joyce | English | 36

    Ahmad | Jabbar | 39

    Alicia | Zelaya | 40

    John | Smith | 43Juan | Perez | 43

    Ramesh | Narayan | 46

    (6 rows)

    Procedimientos almacenados y funciones

    Ejemplos usando Postgres

  • 8/19/2019 Bases de Datos Lenguaje SQL

    81/89

    Una función para obtener la cantidad de empleados de un departamento

    CREATE FUNCTION TamDpto(integer)

    RETURNS bigint

    AS ’SELECT COUNT(*)

    FROM EMPLEADO WHERE ND=$1;’LANGUAGE ’sql’;

    SELECT Nombred, tamdpto(numerod) FROM Departamento;

    nombred | tamdpto

    ----------------+---------

    Investigacion | 4

    Administracion | 3

    Direccion | 1Nuevo Depto | 1

    (4 rows)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    82/89

    Trigger

    Trigger:  Sentencia que el sistema ejecuta automáticamente como un

  • 8/19/2019 Bases de Datos Lenguaje SQL

    83/89

    efecto secundario producto de una modificación en la base de datos

    (INSERT, DELETE, UPDATE).

    Modelo: ECA — (Evento, Condición, Acción)

    1.   Evento —Acción sobre la BD que provoca que trigger se dispare(UPDATE, INSERT, DELETE, o eventos temporales)

    2.   Condición —Condiciones bajo las cuales se ejecuta la acción (if

    new.saldo

  • 8/19/2019 Bases de Datos Lenguaje SQL

    84/89

    CREATE TRIGGER nombre_regla

    {BEFORE | AFTER }

    {INSERT | DELETE | UPDATE [OF lista_atributos]}

    ON nombre_relaci’on

    [ REFERENCING [NEW | OLD] AS nombre_par’ametro][FOR EACH {ROW | STATEMENT} ]

    [WHEN ( condici’on ) ]

    {sentencia_SQL | procedimiento_SQL}

    Triggers/ejemplos

    EMPLEADO(Nombre, Dni, Sueldo, Dno, SuperDni)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    85/89

    DEPARTAMENTO(NombreDepto, Dno, SueldoTotal, DniDirector)

    Eventos que afectan SueldoTotal:

    1. Inserción (uno o más) de nuevas tuplas de empleado

    2. Modificación del sueldo de los empleados existentes (uno o más)

    3. Modificación de la asignación de de los empleados existentes de

    un departamento a otro

    4. Eliminación de tuplas de empleado (una o más)

  • 8/19/2019 Bases de Datos Lenguaje SQL

    86/89

  • 8/19/2019 Bases de Datos Lenguaje SQL

    87/89

  • 8/19/2019 Bases de Datos Lenguaje SQL

    88/89

    Triggers

    Ejemplo en postgres

  • 8/19/2019 Bases de Datos Lenguaje SQL

    89/89