sql fundamentos

Upload: christiam-nino

Post on 07-Feb-2018

234 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/21/2019 SQL FUNDAMENTOS

    1/196

    SQL FUNDAMENTOSEXAMEN CERTIFICACIN ORACLE

    OCA (ORACLE CERTIFICATION ASOCIATE)

    UNIDAD 1TECNOLOGAS ORACLE SERVER Y EL PARADIGMA RELACIONAL

    1. TECNOLOGAS DE SERVIDOR

    1.1. ARQUITECTURA ORACLE SERVER

    La instancia es un conjunto de procesos y estructuras de memoria, su existencia es temporal,puede ser iniciada y detenida, los usuarios de la base de datos establecen sesionesmediante instancias.

    Para el manejo del lenguaje SQL se utiliza SQL Developer (Grafico) o SQL*Plus (Consola)

    1.2. SERVIDOR DE APLICACIONES ORACLE

    Diseado para el manejo de aplicaciones WEB para J2EE.

    1.3. ADMINISTRADOR ORACLE ENTERPRISE

    Herramienta diseada para la administracin de Oracle, maneja tres formularios:

    A. Control de la base de datosB. Control de servidor de aplicacionesC. Control GRID

    1.4. COMPUTACIN GRID

    Combinar procesamiento y almacenamiento para obtener mayor eficacia y efectividad.

    2. ENTENDIMIENTO DE ESTRUCTURAS RELACIONALES

    2.1. FILAS Y TABLAS

    Tablas = EntidadFila = DatoColumna = Atributos

  • 7/21/2019 SQL FUNDAMENTOS

    2/196

    2.2. NORMALIZACIN DE DATOS

    1 forma normal = Eliminar atomicidad2 forma normal = Eliminar dependencias de columnas3 forma normal = Separar elementos independientes

    4 y 5 forma = afinamiento en las tablas

    3. RESUMIR EL LENGUAJE SQL

    3.1. ESTNDAR SQL

    SQL = Lenguaje de consulta estructurado (ISO, ANSI 1979)Oracle maneja Java, PL/SQL y SQL

    3.2. COMANDOS SQL

    Existen 16 comandos

    DML (Lenguaje de manipulacin de datos)

    SELECTINSERTUPDATEDELETEMERGE

    DDL (Lenguaje de definicin de datos)

    CREATEALTERDROPRENAMETRUNCATECOMMENT

    DCL (Lenguaje de control de datos)

    GRANTREVOKE

    TCL (Lenguaje de control de transacciones)

    COMMITROLLBACKSAVEPOINT

  • 7/21/2019 SQL FUNDAMENTOS

    3/196

    4. USO DE LAS HERRAMIENTAS CLIENTE

    4.1. SQL*PLUS

    Manejo de instrucciones Oracle a nivel texto

    4.2. SQL*PLUS EN LINUX

    >/u01/app/oracle/product/db_1/bin/sqlplus>sqlplus system/admin@orcl

    4.3. SQL*PLUS EN WINDOWS

    D:\oracle\app\product\11.1.0\db_2\BIN\sqlplus.exe>sqlplus system/admin@orcl

    Forma de conexin sin login

    >sqlplus /nolog

  • 7/21/2019 SQL FUNDAMENTOS

    4/196

    4.4. CREANDO Y PROBANDO UNA CONEXIN A UNA BASE DE DATOS

    >sqlplus scott/tiger@orcl>sqlplus scott/[email protected]:1521/orcl.bplc.com

    4.5. INSTALANDO Y EJECUTANDO SQL DEVELOPER

    Descargar desde ORACLE iberia y descomprimir, ejecutarlo y manejar en modo grafico

    5. HACER UNA DEMOSTRACIN DE ESQUEMAS

    5.1. ESQUEMA HR y OE

    Oracle trae por defecto los esquemas HR y OE

    5.2. DEMOSTRACIN DE CREACIN DE ESQUEMAS

    >alter user hr account unlock identified by hr;>alter user oe account unlock identified by oe;

    Se puede ingresar como superusuario con

    >sqlplus / as sysdba

  • 7/21/2019 SQL FUNDAMENTOS

    5/196

  • 7/21/2019 SQL FUNDAMENTOS

    6/196

    MODELO LOGICO HR

  • 7/21/2019 SQL FUNDAMENTOS

    7/196

    UNIDAD 2SENTENCIA SQL SELECT

    1. CAPACIDADES DE LA SENTENCIA SQL SELECT

    1.1. INTRODUCCIN A LA SENTENCIA SQL SELECT

    Bsqueda de datos en las tablas se utiliza la sentencia SELECT

    SELECT identifica las columnas what FROM identifica la tabla which

    1.2. COMANDO DESCRIBE EN TABLAS

    DESC[RIBE] .tablename

    2. EJECUTANDO UNA SENTENCIA SELECT BSICA

    2.1. Sintaxis de una sentencia SELECT primaria

    SELECT * | {[DISTINCT] column|expression [alias],}FROM table;

  • 7/21/2019 SQL FUNDAMENTOS

    8/196

    2.2. REGLAS A SER SEGUIDAS

    Maysculas o minsculas

    SELECT * FROM LOCATIONS;Select * from locations;select * from locations;

  • 7/21/2019 SQL FUNDAMENTOS

    9/196

    Terminacin de sentencias

    select country_name, country_id, location_id from countries;

    select city, location_id,state_province, country_id

    from locations/

    Identacin, lectura y buenas prcticas

    select city, location_id,state_province, country_idfrom locations

    2.3. EXPRESIONES Y OPERADORES SQL

    Operadores aritmticos

  • 7/21/2019 SQL FUNDAMENTOS

    10/196

    Expresiones y alias en columnas

    Expresin: (END_DATE-START_DATE)+1Alias: select alias [as] a

  • 7/21/2019 SQL FUNDAMENTOS

    11/196

    Operaciones de concatenacin de caracteres y STRING

  • 7/21/2019 SQL FUNDAMENTOS

    12/196

    Literales y la tabla DUAL

    SELECT 'literal'||'processing using the REGIONS table'FROM regions;

    Dos Quotes Individuales o la alternativa al operador Quote

    Cuando en letras se quiere representar la comilla sencilla se hace doble as:

    select 'Plural''s have one quote too many' from dual;

  • 7/21/2019 SQL FUNDAMENTOS

    13/196

    NULL

  • 7/21/2019 SQL FUNDAMENTOS

    14/196

    EJERCICIOS UNIDAD 2

    Esta prctica podr realizarse tanto con SQL*PLUS como con SQL Developer. Si se utilizaSQL*PLUS ejecutar desde una terminal de unix lo siguiente:

    sqlplus hr/hr@prod

    Si se utiliza SQL Developer ejecutarlo haciendo doble clic en el cono del escritorio, crearuna conexin para el usuario HR y conectarse, todo ello de acuerdo a los pasos que sedetallan a continuacin:

  • 7/21/2019 SQL FUNDAMENTOS

    15/196

    Esquema HR - Descripcin de las tablas

    REGIONS contiene regiones como ser Amrica, Asia, etc.

    Nombre Nulo? Tipo----------------------------------------- --------------- ----------------------------

    REGION_ID NOT NULL NUMBERREGION_NAME VARCHAR2(25)

    COUNTRIES contiene pases, cada uno de ellos asociados a una regin.

    Nombre Nulo? Tipo----------------------------------------- --------------- ----------------------------COUNTRY_ID NOT NULL CHAR(2)COUNTRY_NAME VARCHAR2(40)REGION_ID NUMBER

    LOCATIONS contiene la direcciones de las oficinas de la compaa en cada pas

    Nombre Nulo? Tipo----------------------------------- --------------- ---------------------------LOCATION_ID NOT NULL NUMBER(4)STREET_ADDRESS VARCHAR2(40)POSTAL_CODE VARCHAR2(12)CITY NOT NULL VARCHAR2(30)STATE_PROVINCE VARCHAR2(25)COUNTRY_ID CHAR(2)

    DEPARTMENTS contiene los departamentos de trabajo de las distintas locaciones. Cadadepartamento puede o no tener un empleado manager( relacin con tabla EMPLOYEES)

    Nombre Nulo? Tipo----------------------------------------- -------- ----------------------------DEPARTMENT_ID NOT NULL NUMBER(4)DEPARTMENT_NAME NOT NULL VARCHAR2(30)MANAGER_ID NUMBER(6)LOCATION_ID NUMBER(4)

  • 7/21/2019 SQL FUNDAMENTOS

    16/196

    EMPLOYEES contiene el detalle de cada empleado trabajando en un departamento.Algunos empleados pueden no tener asignados departamento

    Nombre Nulo? Tipo----------------------------------------- -------- ----------------------------EMPLOYEE_ID NOT NULL NUMBER(6)

    FIRST_NAME VARCHAR2(20)LAST_NAME NOT NULL VARCHAR2(25)EMAIL NOT NULL VARCHAR2(25)PHONE_NUMBER VARCHAR2(20)HIRE_DATE NOT NULL DATEJOB_ID NOT NULL VARCHAR2(10)SALARY NUMBER(8,2)COMMISSION_PCT NUMBER(2,2)MANAGER_ID NUMBER(6)DEPARTMENT_ID NUMBER(4)WORK_RECORD VARCHAR2(4000)

    JOBS contiene los diferentes tipos de trabajo que puede tener un empleado

    Nombre Nulo? Tipo----------------------------------------- -------- ----------------------------JOB_ID NOT NULL VARCHAR2(10)JOB_TITLE NOT NULL VARCHAR2(35)MIN_SALARY NUMBER(6)MAX_SALARY NUMBER(6)

    JOB_HISTORY contiene el historial de puestos de trabajo de los empleados

    Nombre Nulo? Tipo----------------------------------------- -------- ----------------------------EMPLOYEE_ID NOT NULL NUMBER(6)START_DATE NOT NULL DATEEND_DATE NOT NULL DATE

    JOB_ID NOT NULL VARCHAR2(10)DEPARTMENT_ID NUMBER(4)

  • 7/21/2019 SQL FUNDAMENTOS

    17/196

    2.1 Prctica Comando DESCRIBE

    a. En el editor escriba el comando DESCRIBE JOBS.b. Ejecute el comando presionando F5 en caso de SQL DEVELOPER o en

    SQL*PLUS

    c. La descripcin de la tabla JOBS aparecer en pantallad. Realice los mismos pasos para describir las tablas JOB_HISTORY, LOCATIONS,COUNTRIES y REGIONS

    e. SQL Developer provee adems otra forma para visualizar las estructuras de las tablas.Navegue por la jerarqua del panel izquierdo que nace a partir del nombre de conexinhr. Haga click en TABLES y luego en DEPARTMENTS. SQL Developer describe latabla automticamente mostrndola en la pantalla de la derecha.

    2.2 Prctica Comando SELECT

    a. Mostrar todas las columnas de las tablas REGIONS y COUNTRIES:

    >SELECT * FROM REGIONS;>SELECT * FROM COUNTRIES;

    b. Consultar nmero de empleado, nombre, apellido, fecha de ingreso y sueldo de todos losempleados de la tabla EMPLOYEES:

    >SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, HIRE_DATE, SALARYFROM EMPLOYEES;

    c. Consultar los puestos de trabajo y su salario mximo en la tabla JOBS:

    >SELECT JOB_TITLE, MAX_SALARYFROM JOBS;

    2.3. Prctica Comando SELECT con Operadores y expresiones

    a. Mostrar de los empleados el nombre, apellido, salario actual y cul sera el salario si se leaumentan 1000$ (usar alias en las columnas de clculo):

    >SELECT FIRST_NAME, LAST_NAME, SALARY Salario actual, SALARY + 1000 Salario futuroFROM EMPLOYEES;

  • 7/21/2019 SQL FUNDAMENTOS

    18/196

    b. Verificar como cumplen las reglas de precedencia y el efecto del uso de parntesis en lassiguientes sentencias:

    >SELECT LAST_NAME, SALARY, 12*SALARY+100+10 AS CALCULO 1FROM EMPLOYEES;

    >SELECT LAST_NAME, SALARY, 12*(SALARY+100)+10 AS CALCULO 2FROM EMPLOYEES;

    c. Consultar el apellido del empleado, la fecha de ingreso y un clculo de la fecha de ingresosumados 5 das:

    >SELECT LAST_NAME, HIRE_DATE, HIRE_DATE + 5FROM EMPLOYEES;

    d. Consulte la tabla JOBS y retorne una expresin con la siguiente forma:

    El cdigo de trabajo para el trabajo es: .

    >SELECT 'El codigo de trabajo para el trabajo ' || job_id || ' es:' || job_title

    FROM JOBS;

    e. Agregue un alias a la columna con el texto Descripcion del trabajo

    >SELECT El codigo de trabajo para el trabajo || JOB_TITLE || es: || JOB_ID AS

    Descripcion del trabajo FROM JOBS;

    f. Mostrar los departamentos que tienen empleados trabajando (no mostrar filas repetidas)

    >SELECT DISTINCT DEPARTMENT_ID FROM EMPLOYEES;

    g. Mostrar la expresin Hello World (usando la tabla dual)

    >SELECT Hello World FROM DUAL;

    h. Ejecutar el resultado de la operacin aritmtica 1000 dividido 5:

    >SELECT 1000/5 FROM DUAL;

  • 7/21/2019 SQL FUNDAMENTOS

    19/196

    UNIDAD 3LIMITANDO Y ORDENANDO DATOS

    1. LIMITAR LAS FILAS RECUPERADAS POR UNA CONSULTA

  • 7/21/2019 SQL FUNDAMENTOS

    20/196

    a. CLAUSULA WHERE

    Condiciones basadas en nmeros

    select last_name, salary from employeeswhere salary = 10000;

    select last_name, salary from employeeswhere salary = department_id;

    select last_name, salary from employeeswhere salary/10 = department_id*10;

  • 7/21/2019 SQL FUNDAMENTOS

    21/196

    Condiciones basadas en caracteres

    select last_namefrom employeeswhere job_id='SA_REP';

    select employee_id, job_idfrom employeeswhere last_name=first_name;

    Condiciones basadas en fechas

    select employee_id from job_historywhere start_date = end_date;

    select employee_id from job_history

    where start_date = 13/01/01;

  • 7/21/2019 SQL FUNDAMENTOS

    22/196

    b. OPERADORES DE COMPARACIN

    Igualdad y desigualdad

    Clause 1: where salary = 5000;Clause 3: where salary department_id;Clause 4: where salary != 4000+department_id;

  • 7/21/2019 SQL FUNDAMENTOS

    23/196

    CondicinBETWEEN

    select last_name from employeeswhere salary between 3400 and 4000;

    select first_name, hire_date from employees

    where hire_date between '24-JUL-1994' and '07-JUN-1996';

    select first_name, hire_date from employeeswhere '24-JUL-1994' between hire_date+30 and '07-JUN-1996';

  • 7/21/2019 SQL FUNDAMENTOS

    24/196

    CondicinIN

    select last_name from employeeswhere salary in (1000,4000,6000);

    select last_name from employeeswhere last_name in ('King','Garbharran','Ramklass');

    select last_name from employeeswhere hire_date in ('01-JAN-1998','01-DEC-1999');

    Condicin LIKE

  • 7/21/2019 SQL FUNDAMENTOS

    25/196

    select first_name from employeeswhere first_name like 'A%';

    select * from jobswhere job_id like 'SA_%';

    select job_id from jobswhere job_id like 'SA\_%' escape '\';

    CondicinIS NULL

    select last_name from employeeswhere commission_pct is null;

  • 7/21/2019 SQL FUNDAMENTOS

    26/196

    c. OPERADORES BOOLEANOS

    OperadorAND

    select first_name, last_name, commission_pct, hire_date

    from employeeswhere first_name like 'J%'and commission_pct > 0.1;

  • 7/21/2019 SQL FUNDAMENTOS

    27/196

    OperadorOR

    select first_name, last_name, commission_pct, hire_datefrom employeeswhere first_name like 'B%'or commission_pct > 0.35;

    OperadorNOT

    select first_name, last_name, commission_pct, hire_datefrom employeeswhere first_name not like 'B%'or not (commission_pct > 0.35);

  • 7/21/2019 SQL FUNDAMENTOS

    28/196

    d. Reglas de precedencia

  • 7/21/2019 SQL FUNDAMENTOS

    29/196

    2. ORDENAR LAS FILAS RECUPERADAS POR UNA CONSULTA

    a. ClausulaORDER BY

    Ordenamiento ascendente y descendente

  • 7/21/2019 SQL FUNDAMENTOS

    30/196

    select last_name, hire_date, salaryfrom employeeswhere job_id in ('SA_REP','MK_MAN')order by last_name;

    select last_name, salary, hire_date, hire_date-(salary/10) emp_value

    from employeeswhere job_id in ('SA_REP','MK_MAN')order by emp_value;

    Ordenamiento posicional

    select last_name, hire_date, salaryfrom employeeswhere job_id in ('SA_REP','MK_MAN')order by 2;

    Ordenamiento compuesto

    select job_id, last_name, salary, hire_datefrom employeeswhere job_id in ('SA_REP','MK_MAN')order by job_id desc, last_name, 3 desc;

  • 7/21/2019 SQL FUNDAMENTOS

    31/196

    3. SUSTITUCIN AMSPERSAND

    a. VARIABLES DE SUSTITUCIN

    Sustitucin individual Amspersand

  • 7/21/2019 SQL FUNDAMENTOS

    32/196

    Sustitucin doble Amspersand

    select first_name, last_namefrom employeeswhere last_name like '%&SEARCH%'and first_name like '%&SEARCH%';

  • 7/21/2019 SQL FUNDAMENTOS

    33/196

    Sustituyendo nombres de columna

    select first_name, job_id, &&colfrom employeeswhere job_id in ('MK_MAN','SA_MAN')order by &col;

    Sustituyendo expresiones y texto

    select &SELECT_CLAUSEfrom &FROM_CLAUSEwhere &WHERE_CLAUSEorder by &ORDER_BY_CLAUSE;

  • 7/21/2019 SQL FUNDAMENTOS

    34/196

  • 7/21/2019 SQL FUNDAMENTOS

    35/196

    Comandos DEFINE y UNDEFINE

    SET DEFINE OFFSET DEFINE ON

  • 7/21/2019 SQL FUNDAMENTOS

    36/196

    Comando VERIFY

    SET VERIFY ON|OFF

  • 7/21/2019 SQL FUNDAMENTOS

    37/196

  • 7/21/2019 SQL FUNDAMENTOS

    38/196

  • 7/21/2019 SQL FUNDAMENTOS

    39/196

  • 7/21/2019 SQL FUNDAMENTOS

    40/196

  • 7/21/2019 SQL FUNDAMENTOS

    41/196

    EJERCICIOS UNIDAD 3

    1. Prctica Primer parte

    Consultar employee_id, last_name, job_id, department_id de los empleados quepertenezcan al departamento 90

    SELECT employee_id, last_name, job_id, department_idFROM employeesWHERE department_id = 90 ;

    Consultar nombre y apellido de los empleados cuyo sueldo sea mayor o igual a 6000

    SELECT last_name, first_nameFROM employees

    WHERE salary >= 6000;

    Consultar nombre y apellido de los empleados cuyo apellido sea Smith

    SELECT last_name, first_nameFROM employeesWHERE last_name = Smith;

    Seleccionar apellido y salario de los empleados que ganen entre 1000 y 10000

    SELECT last_name, salaryFROM employeesWHERE salary BETWEEN 1000 AND 10000;

    Recupere de la tabla de departamentos una lista con aquellos nombres de departamentoque finalicen con la cadena ing:

    SELECT department_nameFROM departmentsWHERE department_name LIKE %ing;

  • 7/21/2019 SQL FUNDAMENTOS

    42/196

    2. Prctica Segunda parte

    Mostrar employee_id, last_name, job_id, salary de los empleados que tengan su salariomayor o igual a 10000 que su job_id contenga la cadena MAN:

    SELECT employee_id, last_name, job_id, salaryFROM employeesWHERE salary >= 10000OR job_id LIKE '%MAN%';

    Consultar apellido, nombre y fecha de ingreso de los empleados que ganen 3000$ ypertenezcan al departamento 50:

    SELECT last_name, first_name

    FROM employeesWHERE salary = 3000AND department_id=50;

    Consultar apellido y job_id de los empleados cuyo job_id no sea ni 'IT_PROG', ni'ST_CLERK' ni 'SA_REP' :

    SELECT last_name, job_idFROM employeesWHERE job_id NOT IN ('IT_PROG', 'ST_CLERK', 'SA_REP');

    3. Prctica Tercera parte

    Listar department_id y department_name de la tabla de departamentos ordenado pordepartment_id de manera ascendente:

    SELECT department_id, department_nameFROM departmentsORDER BY department_id;

    Mostrar apellido, nombre y fecha de ingreso de los empleados ordenados por fecha deingreso de manera descendente:

    SELECT last_name, job_id, department_id, hire_dateFROM employeesORDER BY hire_date DESC;

  • 7/21/2019 SQL FUNDAMENTOS

    43/196

    De la tabla de cargos (JOBS) obtenga para cada cargo: el nombre, el salario mnimo ymximo. Obtenga tambin la diferencia entre el salario mximo y el mnimo. Listesolamente aquellos cargos que tengan en su nombre la cadena President o Manager.Ordene el resultado en forma descendente por la columna que contiene la variacin delos salarios:

    SELECT job_title, min_salary,max_salary, (max_salary min_salary) varianceFROM jobsWHERE job_title LIKE %President%' OR

    job_title LIKE %Manager%

    ORDER BY variance DESC;

    4. Prctica Cuarta parte

    Consultar employee_id, last_name, salary, department_id de un empleado ingresando elemployee_id, armar la consulta para que permita ingresar dinmicamente el employee_id

    SELECT employee_id, last_name, salary, department_idFROM employeesWHERE employee_id = &employee_num ;

    Desarrolle un query que permita determinar el impuesto a deducir a un empleado. Ellegajo y el porcentaje a deducir sern ingresados dinmicamente al ejecutar el query. Lasentencia deber mostrar las columnas EMPLOYEE_ID, FIRST_NAME, SALARY,

    ANNUAL SALARY (SALARY * 12), porcentaje de impuesto y el importe del impuesto

    TAX_RATE/100 *( SALARY *12)

    SELECT EMPLOYEE_ID, FIRST_NAME, SALARY,SALARY*12 AS ANNUAL SALARY,

    &&TAX_RATE,&TAX_RATE/100*(SALARY*12) AS TAX

    FROM EMPLOYEESWHERE EMPLOYEE_ID = &EMPLOYEE_ID;

  • 7/21/2019 SQL FUNDAMENTOS

    44/196

    UNIDAD 4FUNCIONES DE UNA SOLA FILA

    1. TIPOS DE FUNCIONES DISPONIBLES EN SQL

    A. DEFINIENDO UNA FUNCIN

  • 7/21/2019 SQL FUNDAMENTOS

    45/196

  • 7/21/2019 SQL FUNDAMENTOS

    46/196

    Operando sobre datos de carcter

  • 7/21/2019 SQL FUNDAMENTOS

    47/196

    Manipulacin de caracteres

    REPLACE('1#3#5#7#9#','#','->') 1->3->5->7->9->

  • 7/21/2019 SQL FUNDAMENTOS

    48/196

    Operando sobre datos numricos

  • 7/21/2019 SQL FUNDAMENTOS

    49/196

  • 7/21/2019 SQL FUNDAMENTOS

    50/196

  • 7/21/2019 SQL FUNDAMENTOS

    51/196

    Date1 Date2 = Num1

    Date1 Num 1 = Date2

    Date1 + Num1 = Date2

  • 7/21/2019 SQL FUNDAMENTOS

    52/196

  • 7/21/2019 SQL FUNDAMENTOS

    53/196

  • 7/21/2019 SQL FUNDAMENTOS

    54/196

    EJERCICIOS UNIDAD 4

    1. Prctica Primer parte

    Consultar employee_id, apellido y nombre, ambos en mayscula, de los empleados

    que pertenezcan al departamento 90:

    SELECT employee_id, UPPER(last_name), UPPER(first_name)FROM employeesWHERE department_id = 90;

    Consultar el job_id, el job_id en minscula, job_title y el job_title en minscula de latabla de jobs:

    SELECT job_id, LOWER(job_id) , job_title, LOWER(job_title)

    FROM jobs;

    Obtener una lista de los empleados(apellido y nombre) cuyo nombre contenga lacadena "li" independientemente de que dicha cadena este en maysculas, minsculaso sea una combinacin de ambas :

    SELECT first_name, last_nameFROM employeesWHERE LOWER(first_name) LIKE '%li%';

    2. Prctica Segunda parte

    Consultar nombre, apellido, el primer carcter del nombre y los primeros 5 caracteresdel apellido de los empleados pertenecientes al departamento 90

    SELECT FIRST_NAME, LAST_NAME, SUBSTR(FIRST_NAME,1,1),SUBSTR(LAST_NAME,1,5)

    FROM EMPLOYEESWHERE DEPARTMENT_ID=90;

    Seleccionar apellido, salario, mostrar el salario completando hasta 10 caracteres * a laizquierda:

    SELECT last_name,LPAD(salary,10,'*') "Salary"FROM employees;

  • 7/21/2019 SQL FUNDAMENTOS

    55/196

    3. Prctica Tercera parte

    Ejecutar la siguiente select e interpretar el funcionamiento de la funcin ROUND:

    SELECT ROUND(45.923,2),ROUND(45.923,0),ROUND(45.923,-1),ROUND(345.923,-2),ROUND(355.923,-2)

    FROM DUAL;

    Mostrar apellido, salario, y el resto de dividir el salario por 5000 de los empleados deljob_id ='SA_REP':

    SELECT last_name, salary, MOD(salary, 5000)FROM employeesWHERE job_id = 'SA_REP';

    4. Prctica Cuarta parte

    Obtenga la lista de empleados que trabajaron ms de 100 meses desde la fecha enque fueron contratados. Liste el cdigo de empleado, apellido y fecha de contratacin.

    SELECT EMPLOYEE_ID, LAST_NAME, HIRE_DATE

    FROM EMPLOYEESWHERE MONTHS_BETWEEN(sysdate, HIRE_DATE) > 100;

  • 7/21/2019 SQL FUNDAMENTOS

    56/196

    UNIDAD 5FUNCIONES DE CONVERSIN Y EXPRESIONES CONDICIONALES

    1. TIPOS DE FUNCIONES DE CONVERSIN DISPONIBLES EN SQL

    A. FUNCIONES DE CONVERSIN

    Conversin de datos de tipo implcito

  • 7/21/2019 SQL FUNDAMENTOS

    57/196

    Conversin de datos de tipo explicito

    2. FUNCIONES DE CONVERSIN TO_CHAR, TO_NUMBER Y TO_DATE

    a. Usando funciones de conversin

    ALTER SESSION set NLS_CURRENCY='GBP';

    National Language Support (NLS) session parameters

    Conversin de nmeros a caracteres con TO_CHAR

    TO_CHAR(number1, [format], [nls_parameter]),

    select to_char(00001)||' is a special number' from dual;

    select to_char(00001,'0999999')||' is a special number' from dual;

  • 7/21/2019 SQL FUNDAMENTOS

    58/196

  • 7/21/2019 SQL FUNDAMENTOS

    59/196

    Conversin de fechas a caracteres con TO_CHAR

    TO_CHAR(date1, [format], [nls_parameter]),

    select to_char(sysdate)||' is today''s date' from dual;

    select to_char(sysdate,'Month') ||'is a special time' from dual;

    select to_char(sysdate,'fmMonth')||'is a special time' from dual;

  • 7/21/2019 SQL FUNDAMENTOS

    60/196

  • 7/21/2019 SQL FUNDAMENTOS

    61/196

  • 7/21/2019 SQL FUNDAMENTOS

    62/196

  • 7/21/2019 SQL FUNDAMENTOS

    63/196

    select to_date('25-DEC', 'DD-MON') from dual;

    select to_date('25-DEC-2010 18:03:45', 'DD-MON-YYYY HH24:MI:SS') from dual;

    select to_date('25-DEC-10', 'fxDD-MON-YYYY') from dual;

    Conversin de caracteres a nmeroscon TO_NUMBER

    TO_NUMBER(string1, [format], [nls_parameter]),

    select to_number('$1,000.55') from dual;

    select to_number('$1,000.55','$999,999.99') from dual;

  • 7/21/2019 SQL FUNDAMENTOS

    64/196

  • 7/21/2019 SQL FUNDAMENTOS

    65/196

    3. EXPRESIONES CONDICIONALES EN SENTENCIA SELECT

    A. FUNCIONES ANIDADAS

  • 7/21/2019 SQL FUNDAMENTOS

    66/196

    B. FUNCIONES GENERALES

    FUNCIN NVL

    NVL(original, ifnull)

    select nvl(1234) from dual;

    select nvl(null,1234) from dual;

    select nvl(substr('abc',4),'No substring exists') from dual;

  • 7/21/2019 SQL FUNDAMENTOS

    67/196

    FUNCIN NVL2

    NVL2(original, ifnotnull, ifnull)

    select nvl2(1234,1,'a string') from dual;select nvl2(null,1234,5678) from dual;select nvl2(substr('abc',2),'Not bc','No substring') from dual;

  • 7/21/2019 SQL FUNDAMENTOS

    68/196

    FUNCIN NULLIF

    NULLIF(ifunequal, comparison_term)

    select nullif(1234,1234) from dual;select nullif(1234,123+1) from dual;select nullif('24-JUL-2009','24-JUL-09') from dual;

  • 7/21/2019 SQL FUNDAMENTOS

    69/196

    FUNCIN COALESCE

    COALESCE(expr1, expr2,,exprn)

    COALESCE(expr1,expr2) = NVL(expr1,expr2)

    COALESCE(expr1,expr2,expr3) = NVL(expr1,NVL(expr2,expr3))select coalesce(null, null, null, 'a string') from dual;select coalesce(null, null, null) from dual;select coalesce(substr('abc',4),'Not bc','No substring') from dual;

  • 7/21/2019 SQL FUNDAMENTOS

    70/196

    C. FUNCIONES CONDICIONALES

    FUNCIN DECODE

    DECODE(expr1,comp1, iftrue1,[comp2,iftrue2...[ compN,iftrueN]], [iffalse])

    select decode(1234,123,'123 is a match') from dual;

    select decode(1234,123,'123 is a match','No match') from dual;

    select decode('search','comp1','true1', 'comp2','true2','search','true3',substr('2search',2,6),'true4' , 'false') from dual;

  • 7/21/2019 SQL FUNDAMENTOS

    71/196

  • 7/21/2019 SQL FUNDAMENTOS

    72/196

    EXPRESIN CASE

    CASE search_exprWHEN comparison_expr1 THEN iftrue1[WHEN comparison_expr2 THEN iftrue2

    WHEN comparison_exprN THEN iftrueNELSE iffalse]

    END

    selectcase substr(1234,1,3)when '134' then '1234 is a match'when '1235' then '1235 is a match'when concat('1','23') then concat('1','23')||' is a match'else 'no match'endfrom dual;

    CASEWHEN condition1 THEN iftrue1[WHEN condition2 THEN iftrue2

    WHEN conditionN THEN iftrueNELSE iffalse]END

  • 7/21/2019 SQL FUNDAMENTOS

    73/196

    select last_name, hire_date,trunc(months_between(sysdate,hire_date)/12) years,trunc(months_between(sysdate,hire_date)/60) "Years divided by 5",casewhen trunc(months_between(sysdate,hire_date)/60) < 1 then 'Intern'when trunc(months_between(sysdate,hire_date)/60) < 2 then 'Junior'

    when trunc(months_between(sysdate,hire_date)/60) < 3 then 'Intermediate'when trunc(months_between(sysdate,hire_date)/60) < 4 then 'Senior'else 'Furniture'end Loyaltyfrom employeeswhere department_id in (60,10);

  • 7/21/2019 SQL FUNDAMENTOS

    74/196

    EJERCICIOS UNIDAD 5

    1. Prctica Primer parte

    Consultar apellido, nombre y salario con el formato '$99,999.99' ordenados porapellido:

    SELECT last_name, first_name, TO_CHAR(salary,'$99,999.99')FROM employeesORDER by last_name;

    Consultar los job_id , salario mximo y el salario mximo con el formato '9999.99' detodos los Jobs ordenados por job_id. Evaluar si la mscara elegida es correcta.

    SELECT job_id, max_salary, TO_CHAR(max_salary,'9999.99')FROM jobs

    ORDER BY job_id;

    Obtener una lista de los empleados(apellido y nombre) cuyo da de ingreso haya sidosbado. Mostrar adems la fecha de ingreso con el alias START_DATE y con unformato que se muestre como el siguiente texto:

    Saturday, the 17th of February, One Thousand Nine Hundred Ninety-Six.

    SELECT first_name,last_name,TO_CHAR(hire_date, 'fmDay, "the "ddth "of " Month, Yyyysp.') START_DATE

    FROM employeesWHERE TO_CHAR(hire_date,'fmDay') = 'Saturday';

    Obtener una lista de los empleados(apellido y fecha de ingreso) , la fecha de ingresodebe mostrarse con un formato como el siguiente texto:

    Seventeenth of June 2007

    SELECT last_name,TO_CHAR(hire_date, 'fmDdspth "of" Month YYYY') HIREDATE

    FROM employees;

  • 7/21/2019 SQL FUNDAMENTOS

    75/196

    Mostrar employee_id , job_id y end_date de la tabla job_history ordenado porend_date. La columna end_date debe mostrarse con el alias "Quitting Date" y con unformato como el siguiente texto:

    SATURDAY the 27th of October 2001

    SELECT EMPLOYEE_ID,job_id,TO_CHAR(end_date,'fmDAY "the "ddth "of" Month YYYY') "Quitting Date"

    FROM job_historyORDER BY end_date;

    2. Prctica Segunda parte

    Consultar nombre, apellido y fecha de ingreso de todos los empleados cuya fecha deingreso sea mayor al 01/01/2008:

    SELECT first_name, last_name, hire_dateFROM employeesWHERE hire_date > TO_DATE('01/01/2008', 'DD/MM/YYYY');

    Seleccionar apellido y mostrar concatenadas las 8 primeras letras del apellido con lacadena _US, a esta concatenacin mostrarla en maysculas:

    SELECT last_name,

    UPPER(CONCAT(SUBSTR (LAST_NAME, 1, 8), '_US'))FROM employees;

    Mostrar apellido, salario, commission(mostrar cero si es nula) y el salario anualsumadas las comisiones:

    SELECT last_name, salary, NVL(commission_pct, 0),(salary*12) + (salary*12*NVL(commission_pct, 0)) AN_SAL

    FROM employees;

    Mostrar apellido, salario, comisin y la leyenda Gana comisin o No gana comisincon el alias EMPLOYEE_TYPE segn sea o no nula, para los empleados cuyoapellido empiece con G:

    SELECT last_name, salary, commission_pct,NVL2(commission_pct,'Gana comisin','No gana comisin') EMPLOYEE_TYPE

    FROM employeesWHERE last_name LIKE 'G%';

  • 7/21/2019 SQL FUNDAMENTOS

    76/196

    Evaluar la siguiente funcin COALESCE:

    SELECT COALESCE(state_province,postal_code,city), postal_code, state_province, cityFROM locationsWHERE country_id in ('UK','IT','JP');

    3. Prctica Tercera parte

    Buscar dentro de la tabla LOCATIONS las filas que tengan el country_id=US. Mostrarla siguiente leyenda con alias LOCATION_INFO segn sea el valor de la columnaSTATE_PROVINCE(usar decode). Ordenar por LOCATION_INFO.

    Washington mostrar Headquarters

    Texas mostrar Oil Wells

    California mostrar CITY column value

    New Jersey mostrar The STREET_ADDRESS column value

    SELECT DECODE(state_province, 'Washington', 'Headquarters','Texas', 'Oil Wells','California', city,'New Jersey', street_address) LOCATION_INFO

    FROM locationsWHERE country_id='US'ORDER BY location_info;

    Mostrar apellido, salario y la siguiente leyenda con el alias qualified_salary para cadaempleado segn sea el caso usando CASE:

    Salario menor a 5000 mostrar LowSalario menor a 10000 mostrar MediumSalario menor a 20000 mostrar Good

    SELECT last_name,salary,(CASE WHEN salary

  • 7/21/2019 SQL FUNDAMENTOS

    77/196

    UNIDAD 6

    INFORMES AGREGADOS DE DATOS MEDIANTE FUNCIONES DE GRUPO

    1. FUNCIONES DE GRUPO

    a. Definicin de las funciones de grupo

  • 7/21/2019 SQL FUNDAMENTOS

    78/196

    b. Tipos y sintaxis de las funciones de grupo

    COUNT({*|[DISTINCT|ALL] expr});

    1. COUNT(*)2. COUNT(DISTINCT expr)3. COUNT(ALL expr)4. COUNT(expr)

    Query 1: select count(*) from employeesQuery 2: select count(commission_pct) from employeesQuery 3: select count(distinct commission_pct) from employeesQuery 4: select count(hire_date), count(manager_id) from employees

    AVG([DISTINCT|ALL] expr);

    1. AVG(DISTINCT expr)2. AVG(ALL expr)3. AVG(expr)

    Query 1: select avg(2) from employees

    Query 2: select avg(salary) from employeesQuery 3: select avg(distinct salary) from employeesQuery 4: select avg(commission_pct) from employees

    SUM([DISTINCT|ALL] expr) ;

    1. SUM(DISTINCT expr)2. SUM(ALL expr)3. SUM(expr)

  • 7/21/2019 SQL FUNDAMENTOS

    79/196

    Query 1: select sum(2) from employeesQuery 2: select sum(salary) from employeesQuery 3: select sum(distinct salary) from employeesQuery 4: select sum(commission_pct) from employees

    MAX([DISTINCT|ALL] expr); MIN([DISTINCT|ALL] expr)

    1. MAX(DISTINCT expr); MIN(DISTINCT expr)2. MAX(ALL expr); MIN(ALL expr)3. MAX(expr); MIN(expr);

    Query 1: select min(commission_pct), max(commission_pct) from employeesQuery 2: select min(start_date),max(end_date) from job_historyQuery 3: select min(job_id),max(job_id) from employees

    VARIANCE([DISTINCT|ALL] expr);

    1. VARIANCE(DISTINCT expr)2. VARIANCE(ALL expr)3. VARIANCE(expr)

    STDDEV([DISTINCT|ALL] expr);

    1. STDDEV(DISTINCT expr)2. STDDEV(ALL expr)3. STDDEV(expr)

  • 7/21/2019 SQL FUNDAMENTOS

    80/196

  • 7/21/2019 SQL FUNDAMENTOS

    81/196

  • 7/21/2019 SQL FUNDAMENTOS

    82/196

    2. USANDO GRUPOS DE DATOS CON LA CLAUSULA GROUP BY

    G1(group_item) = resultG1(G2(group_item ) = resultG1(G2(G3(group_item))) is NOT allowed.

    a. GROUP BY

    SELECT column|expression|group_function(column|expression [alias]),}FROM table[WHERE condition(s)][GROUP BY {col(s)|expr}][ORDER BY {col(s)|expr|numeric_pos } [ASC|DESC] [NULLS FIRST|LAST]];

  • 7/21/2019 SQL FUNDAMENTOS

    83/196

    select max(salary), count(*)from employeesgroup by department_idorder by department_id;

  • 7/21/2019 SQL FUNDAMENTOS

    84/196

    b. Agrupacin para mltiples columnas

    select department_id, sum(commission_pct)from employeeswhere commission_pct is not nullgroup by department_id;

    select department_id, job_id, sum(commission_pct)from employees

    where commission_pct is not nullgroup by department_id, job_id;

  • 7/21/2019 SQL FUNDAMENTOS

    85/196

    3. INCLUIR O EXCLUIR FILAS AGRUPADAS CON LA CLAUSULA HAVING

  • 7/21/2019 SQL FUNDAMENTOS

    86/196

    a. Restringir los resultados del grupo

    select department_idfrom job_historywhere department_id in (50,60,80,110);

    select department_id, count(*)from job_historywhere department_id in (50,60,80,110)group by department_id;

    b. La clausula HAVING

    SELECT column|expression|group_function(column|expression [alias]),}FROM table[WHERE condition(s)]

    [GROUP BY {col(s)|expr}][HAVING group_condition(s)][ORDER BY {col(s)|expr|numeric_pos } [ASC|DESC] [NULLS FIRST|LAST]];

  • 7/21/2019 SQL FUNDAMENTOS

    87/196

    select department_id, count(*)from job_historywhere department_id in (50,60,80,110)group by department_idhaving count(*)>1;

  • 7/21/2019 SQL FUNDAMENTOS

    88/196

    Ejercicios UNIDAD 6

    1. Prctica Primer parte

    Contar la cantidad de empleados que se encuentran en el departamento 50:

    SELECT COUNT(*)FROM employeesWHERE department_id = 50;

    Contar la cantidad de empleados del departamento 50 cuya comisin es no nula :

    SELECT COUNT(commission_pct)FROM employeesWHERE department_id = 80;

    Contar la cantidad de departamentos distintos que existen dentro de tabla empleados:

    SELECT COUNT(DISTINCT department_id)FROM employees;

    Sumar los salarios de todos los empleados que ingresaron despus del 01/01/2008:

    SELECT SUM(salary)FROM employeesWHERE hire_date > TO_DATE(01/01/2008,DD/MM/YYYY);

    Sumar los distintas comisiones de los empleados del departamento 80:

    SELECT SUM(DISTINCT commission_pct)FROM employeesWHERE department_id=80

    Obtener el clculo del salario promedio de todos los empleados de la compaa:

    SELECT AVG(salary)

    FROM employees;

    Obtener la mnima y mxima fecha de ingreso, el mnimo y mximo salario de losempleados con job_id ='SA_REP' :

    SELECT MIN(hire_date),MIN(salary), MAX(hire_date),MAX(salary)FROM employeesWHERE job_id='SA_REP';

  • 7/21/2019 SQL FUNDAMENTOS

    89/196

    2. Prctica Segunda parte

    Obtener el mximo salario y cantidad de empleados por departamento de todos losempleados. Ordenar la salida por department_id:

    SELECT department_id, MAX(salary), COUNT(*)

    FROM employeesGROUP BY department_idORDER BY department_id;

    Mostrar la cantidad de empleados ingresados por ao en la compaa, ordenarlos demanera descendente por cantidad de ingresados:

    SELECT TO_CHAR(HIRE_DATE,'YYYY') , COUNT(*)FROM EMPLOYEESGROUP BY TO_CHAR(HIRE_DATE,'YYYY')

    ORDER BY COUNT(*) DESC;

    Obtener el salario promedio por departamento de todos los empleados:

    SELECT department_id, AVG(salary)FROM employeesGROUP BY department_id;

    Obtener la suma de los salaries por puesto de trabajo dentro de cada departamento.Ordenar la salida por department_id:

    SELECT department_id , job_id, SUM(salary)FROM employeesGROUP BY department_id, job_idORDER BY department_id;

    3. Prctica Tercera parte

    Mostrar aquellos departamentos cuyo salario mximo sea mayor de 10000$.

    e rSELECT department_id, MAX(salary)FROM employeesGROUP BY department_idHAVING MAX(salary)>10000 ;

  • 7/21/2019 SQL FUNDAMENTOS

    90/196

    Mostrar los das de la semana donde hubo ms de 15 ingresos de empleados:

    SELECT TO_CHAR(HIRE_DATE,'DAY'), COUNT(*)FROM EMPLOYEESGROUP BY TO_CHAR(HIRE_DATE,'DAY')HAVING COUNT(*) > 15;

    Mostrar aquellos puestos de trabajo que no contentan la cadena REP en su job_id yque la suma de los salarios en cada uno de los mismos sea mayor a 13000$.Mostrarlos ordenados por suma de salarios:

    SELECT job_id, SUM(salary)FROM employeesWHERE job_id NOT LIKE '%REP%'GROUP BY job_idHAVING SUM(salary) > 13000

    ORDER BY SUM(salary);

  • 7/21/2019 SQL FUNDAMENTOS

    91/196

    UNIDAD 7MOSTRAR DATOS DE VARIAS TABLAS

  • 7/21/2019 SQL FUNDAMENTOS

    92/196

  • 7/21/2019 SQL FUNDAMENTOS

    93/196

  • 7/21/2019 SQL FUNDAMENTOS

    94/196

  • 7/21/2019 SQL FUNDAMENTOS

    95/196

  • 7/21/2019 SQL FUNDAMENTOS

    96/196

  • 7/21/2019 SQL FUNDAMENTOS

    97/196

  • 7/21/2019 SQL FUNDAMENTOS

    98/196

    1. SENTENCIA SELECT PARA ACCEDER A DATOS EQUIJOINS Y NONEQUIJOINS

    Ejemplo de la misma consulta escrita en SQL ANSI 1999 y la sintxis propia de Oracle

    SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_idFROM employees eJOIN departments dON (e.department_id = d.department_id);

    SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_idFROM employees e, departments dWHERE e.department_id = d.department_id;

    a. Tipos de JOINS

    EQUIJOINS: Join sobre dos o ms tablas, por igualdad de campos.

  • 7/21/2019 SQL FUNDAMENTOS

    99/196

    NATURAL JOINS

    SELECT table1.column, table2.columnFROM table1NATURAL JOINtable2;

  • 7/21/2019 SQL FUNDAMENTOS

    100/196

    SELECT table1.column, table2.columnFROM table1JOINtable2 USING(join_column1, join_column2);

  • 7/21/2019 SQL FUNDAMENTOS

    101/196

    SELECT table1.column, table2.columnFROM table1JOINtable2 ON(table1.column_name = table2.column_name);

  • 7/21/2019 SQL FUNDAMENTOS

    102/196

    select r.region_name, c.country_name, l.city, d.department_namefrom departments d

    join locations l on (l.location_id=d.location_id)join countries c on (c.country_id=l.country_id)join regions r on (r.region_id=c.region_id);

    select r.region_name, c.country_name, l.city, d.department_namefrom departments d

    join locations l using (location_id)join countries c using (country_id)join regions r using (region_id);

    Query 1: select d.department_name from departments djoin locations l on (l.LOCATION_ID=d.LOCATION_ID)where d.department_name like 'P%'

    Query 2: select d.department_name from departments djoin locations l on(l.LOCATION_ID=d.LOCATION_ID and d.department_name like 'P%')

  • 7/21/2019 SQL FUNDAMENTOS

    103/196

    NONEQUIJOINS

    Por desigualdad, sin correspondencia directa entre campos de tablas. La relacin se puedeestablecer mediante criterios de rango (, BETWEEN, ...)

    SELECT table1.column, table2.columnFROM table1[JOIN table2 ON (table1.column_name < table2.column_name)]|[JOIN table2 ON (table1.column_name > table2.column_name)]|[JOIN table2 ON (table1.column_name = table2.column_name)]|[JOIN table2 ON (table1.columnBETWEEN table2.col1AND table2.col2)]|

    2.UNIENDO UNA TABLA AS MISMA CON SELF-JOIN

    a. Uniendo una tabla dentro de s misma usando la clausula JOIN ON

    Query 1: select id, name, father_id from family;

    Query 2: select name from family where id=&father_id;

    Query 3: select f1.name Dad, f2.name Child from family f1 join family f2 on (f1.id=f2.father_id)

  • 7/21/2019 SQL FUNDAMENTOS

    104/196

    3. VISTA DE DATOS QUE NO CUMPLE CON UNA CONDICIN DE UNIN MEDIANTEOUTER JOINS

    a. LEFT OUTER JOINS

    SELECT table1.column, table2.columnFROM table1LEFT OUTER JOIN table2ON (table1.column = table2.column);

    Query 1: select e.employee_id, e.department_id EMP_DEPT_ID,d.department_id DEPT_DEPT_ID, d.department_namefrom departments dleft outer join employees eon (d.DEPARTMENT_ID=e.DEPARTMENT_ID)

    where d.department_name like 'P%'

  • 7/21/2019 SQL FUNDAMENTOS

    105/196

    b. RIGHT OUTER JOINS

    SELECT table1.column, table2.columnFROM table1RIGHT OUTER JOIN table2ON (table1.column = table2.column);

    select e.last_name, d.department_name from departments dright outer join employees eon (e.department_id=d.department_id)where e.last_name like 'G%';

  • 7/21/2019 SQL FUNDAMENTOS

    106/196

    c. FULL OUTER JOINS

    SELECT table1.column, table2.columnFROM table1FULL OUTER JOIN table2ON (table1.column = table2.column);

  • 7/21/2019 SQL FUNDAMENTOS

    107/196

    4. GENERAR UN PRODUCTO CARTESIANO DE 2 O MS TABLAS

    a. Creando productos cartesianos con CROSS JOIN

    SELECT table1.column, table2.columnFROM table1CROSS JOIN table2;

    Query 1: select * from jobs cross join job_history;Query 2: select * from jobs j cross join job_history jhwhere j.job_id='AD_PRES';

  • 7/21/2019 SQL FUNDAMENTOS

    108/196

    Ejercicios UNIDAD 7

    1. Prctica Primer parte

    Mostrar department_id, department_name, street_address y city de todos losdepartamentos que se encuentren en la ciudad de Toronto. Usar las tablasDEPARTMENTS Y LOCATIONS, usar NATURAL JOIN para obtener los resultados.

    SELECT department_id, department_name, STREET_ADDRESS, cityFROM departmentsNATURAL JOIN locationsWHERE city='Toronto'

    Crear una consulta para mostrar nombre de pais y regin de todos los paises. Usar lastablas COUNTRIES y REGIONS, usar NATURAL JOIN para obtener los resultados.

    SELECT country_name, region_id, region_nameFROM countries NATURAL JOIN regions;

    Crear una consulta para mostrar employee_id, last_name, first_name,department_name de todos los empleados. Usar JOIN USING para obtener losresultados:

    SELECT employee_id, last_name, first_name, department_nameFROM employeesJOIN departments USING (department_id);

    Buscar apellido, fecha de ingreso, puesto de trabajo actual, el primer puesto en lacompaa junto con la fecha de comienzo y fin en dicho puesto. Usar tablasJOB_HISTORY y EMPLOYEES, usar JOIN ON.

    SELECT e.last_name, e.hire_date, e.job_id CURRENT_JOB,j.job_id PREVIOUS_JOB, j.start_date, j.end_date,FROM job_history jJOIN employees eON (j.start_date = e.hire_date AND j.employee_id=e.employee_id);

  • 7/21/2019 SQL FUNDAMENTOS

    109/196

    Buscar employee_id, last_name, department_id, department_name, manager_id de

    todos los empleados cuyo manager sea el 149. Usar tablas EMPLOYEES,DEPARTMENTS y usar JOIN ON para obtener los resultados:

    SELECT e.employee_id, e.last_name, e.department_id,d.department_name, e.manager_idFROM employees e JOIN departments dON (e.department_id = d.department_id)WHERE e.manager_id = 149;

    Consultar todos los departamentos y mostrar nombre de departamento, ciudad, pas yregin donde se encuentra ubicado. Ordenado por departamento. Usar tablasDEPARTMENTS, LOCATIONS, COUNTRIES, REGIONS, usar JOIN ON:

    SELECT d.department_name, l.city, c.country_name, r.region_nameFROM departments dJOIN locations l ON (l.location_id=d.location_id)JOIN countries c ON (c.country_id=l.country_id)JOIN regions r ON (r.region_id=c.region_id)ORDER BY d.department_name;

    2. Prctica Segunda parte

    Mostrar nombre y apellido de cada empleado y el nombre y apellido de su manager.Usar los alias de tablas worker y manager.

    SELECT worker.first_name , worker.last_name ,manager.first_name , manager.last_name

    FROM employees workerJOIN employees managerON (worker.manager_id = manager.employee_id);

    Obtener el producto cartesiano de las regiones 3 y 4 con todos los paises, ordenar por

    regin y pas

    SELECT r.region_name, c.country_nameFROM regions rCROSS JOIN countries cWHERE r.region_id IN (3,4)ORDER BY region_name, country_name;

  • 7/21/2019 SQL FUNDAMENTOS

    110/196

    3. Prctica Tercera parte

    Mostrar apellido, department_id, department_name para todos los empleados, mostraraquellos empleados que no tengan departamento asignado tambin.

    e rSELECT e.last_name, e.department_id, d.department_name

    FROM employees e LEFT OUTER JOIN departments dON (e.department_id = d.department_id);

    Mostrar deparment_id, department_name de todos los departamentos y losempleados que pertenecen a cada uno de ellos. Incluir tambin aquellosdepartamentos que no tengan empleados asignados:

    SELECT e.department_id, d.department_name, e.last_nameFROM employees e RIGHT OUTER JOIN departments dON (e.department_id = d.department_id);

    Mostrar apellido, department_id, department_name para todos los empleados, mostraraquellos empleados que no tengan departamento asignado as como tambin todoslos departamentos que no tengan empleados asignados.

    SELECT e.last_name, d.department_id, d.department_nameFROM employees e FULL OUTER JOIN departments dON (e.department_id = d.department_id);

  • 7/21/2019 SQL FUNDAMENTOS

    111/196

    UNIDAD 8USO DE SUBCONSULTAS

    1. DESCRIBIR LOS TIPOS DE PROBLEMAS QUE PUEDEN RESOLVER LASSUBCONSULTAS

  • 7/21/2019 SQL FUNDAMENTOS

    112/196

    a. El uso de un conjunto de resultados de subconsultas para propsitos decomparacin

  • 7/21/2019 SQL FUNDAMENTOS

    113/196

    select avg(salary) from employees;select last_name from employees where salary < result_of_previous_query;

    select last_name from employeeswhere salary < (select avg(salary)from employees);

    select department_name from departments where department_id in(select distinct(department_id) from employees);

    select department_name from departments inner join employeeson employees.department_id = departments.department_idgroup by department_name;

    b. Transformacin Estrella

    select from sales s, products p, buyers b, channels cwhere s.prod_code=p.prod_codeand s.buy_code=b.buy_codeand s.chan_code=c.chan_codeand p.product=Booksand b.country=Germanyand c.channel=Internet;

    c. Generando una tabla con subconsultas SELECT

    select avg(salary),country_id from(select salary,department_id,location_id,country_id fromemployees natural join departments natural join locations)

    group by country_id;d. Generar valores de proyeccin

  • 7/21/2019 SQL FUNDAMENTOS

    114/196

    select

    (select max(salary) from employees) *(select max(commission_pct) from employees) / 100

    from dual;

    e. Generando filas para ser pasadas a sentencias DML

    insert into dates select sysdate from dual;

    2. LISTAR LOS TIPOS DE SUBCONSULTAS

    Single-row subqueries Multiple-row subqueries Correlated subqueries

  • 7/21/2019 SQL FUNDAMENTOS

    115/196

    Subconsultas correlacionadas

    select p.last_name, p.department_idfrom employees pwhere p.salary < (select avg(s.salary) from employees s

    where s.department_id=p.department_id);

  • 7/21/2019 SQL FUNDAMENTOS

    116/196

    3. ESCRIBIR CONSULTAS DE MLTIPLES Y NICAS FILAS

    select last_name from employeeswhere manager_id in(select employee_id from employees where department_id in(select department_id from departments where location_id in

    (select location_id from locations where country_id=UK)));

    select job_title from jobs natural join employees group by job_titlehaving avg(salary) =(select max(avg(salary)) from employees group by job_id);

    select last_name from employees where salary > all(select salary from employees where department_id=80);select last_name from employees where salary >(select max(salary) from employees where department_id=80);

  • 7/21/2019 SQL FUNDAMENTOS

    117/196

  • 7/21/2019 SQL FUNDAMENTOS

    118/196

  • 7/21/2019 SQL FUNDAMENTOS

    119/196

    Ejercicios UNIDAD 8

    1. Prctica Primer parte

    Escribir un query que use subqueries en la lista de columnas del select. El query debereportar la fecha de hoy, el nmero total de departamentos y el nmero total deempleados:

    SELECT sysdate Today,(SELECT COUNT(*) FROM departments) Dept_count,(SELECT COUNT(*) FROM employees) Emp_count

    FROM dual;

    Escribir una query que use subqueries en la lista de columnas del select. Identificar elmximo salario y la mxima comisin de todos los empleados.

    SELECT (SELECT MAX(salary) FROM employees) "Max Salary" ,(SELECT MAX(commission_pct) FROM employees) "Max Commission"

    FROM dual;

    Buscar apellido, job y salario de todos los empleados cuyo salario sea igual al salariomnimo. Usar subquery en el WHERE.

    SELECT last_name, job_id, salaryFROM employees

    WHERE salary =(SELECT MIN(salary)FROM employees);

    Buscar el apellido y job de los empleados que tengan el mismo job que el empleado141. Usar subquery en el WHERE:

    SELECT last_name, job_idFROM employeesWHERE job_id =

    (SELECT job_idFROM employeesWHERE employee_id = 141);

  • 7/21/2019 SQL FUNDAMENTOS

    120/196

    Buscar apellido, job y salario de todos los empleados que tengan el mismo job que elempleado de apellido Taylor y salario mayor a Taylor. Usar subqueries en el WHERE,evaluar el porqu del error de esta query.

    SELECT last_name, job_id, salaryFROM employees

    WHERE job_id =(SELECT job_idFROM employeesWHERE last_name = 'Taylor')

    AND salary >(SELECT salaryFROM employeesWHERE last_name = 'Taylor');

    Consultar apellido, nombre y salario de todos los empleados cuyo salario es mayorque el del empleado con apellido Abel, usar subquery en WHERE.

    SELECT last_name, first_name, salaryFROM employeesWHERE salary >

    (SELECT salaryFROM employeesWHERE last_name = 'Abel');

    Buscar los apellidos de todos los empleados que tengan un salario mayor al salariopromedio general, usar subquery en el WHERE

    SELECT last_nameFROM employeesWHERE salary < (SELECT AVG(salary) FROM employees);

    Buscar el salario mnimo de aquellos departamentos que tengan el salario mnimomayor al del departamento 50. Usar suquery en HAVING.

    SELECT department_id, MIN(salary)FROM employeesGROUP BY department_idHAVING MIN(salary) >

    (SELECT MIN(salary)FROM employeesWHERE department_id = 50);

  • 7/21/2019 SQL FUNDAMENTOS

    121/196

    2. Prctica Segunda parte

    Escribir un query que muestre el apellido y nombre de todos los empleados que seanmanagers. Usar operador IN.

    SELECT last_nameFROM employeesWHERE (employee_id IN (SELECT manager_id FROM employees));

    Mostrar el employee_id, apellido, job y salario de todos los empleados que no seanIT_PROG y a su vez que sus salarios sean menores a los salario del puestoIT_PROG. Utilizar operador ANY .

    SELECT employee_id, last_name, job_id, salaryFROM employees

    WHERE salary < ANY(SELECT salaryFROM employeesWHERE job_id = 'IT_PROG')

    AND job_id 'IT_PROG';

    Mostrar el employee_id, apellido, job y salario de todos los empleados que no seanST_CLERK y a su vez que sus salarios sean mayores a los salario del puestoST_CLERK. Utilizar operador ALL .

    SELECT employee_id, last_name, job_id, salaryFROM employeesWHERE salary > ALL

    (SELECT salaryFROM employeesWHERE job_id = 'ST_CLERK')

    AND job_id 'ST_CLERK;

    Obtener un subquery en el FROM obteniendo los campos salary, department_id,location_id y country_id haciendo natural join entre employees , departments,

    locations. A partir de ese subquery obtener salario mximo por pais.

    SELECT MAX(salary),country_idFROM (SELECT salary,department_id, location_id,country_id

    FROM employeesNATURAL JOIN departmentsNATURAL JOIN locations)

    GROUP BY country_id;

  • 7/21/2019 SQL FUNDAMENTOS

    122/196

    Mostrar department_id, apellido y salario de todos los empleados cuyo salario seamayor al salario promedio del departamento al cual pertenecen. Usar correlatedsubquery.

    SELECT department_id, last_name, salaryFROM employees x

    WHERE salary > (SELECT AVG(salary)FROM employeesWHERE x.department_id = department_id)

    ORDER BY department_id;

  • 7/21/2019 SQL FUNDAMENTOS

    123/196

    UNIDAD 9USANDO OPERADORES DE CONJUNTO

    1. DESCRIBIR LOS OPERADORES DE CONJUNTO

    UNION Returns the combined rows from two queries, sorting them and removingduplicates.

    UNION ALL Returns the combined rows from two queries without sorting or removingduplicates.

    INTERSECT Returns only the rows that occur in both queries result sets, sorting them andremoving duplicates.

    MINUS Returns only the rows in the first result set that do not appear in the second resultset, sorting them and removing duplicates.

    2. UTILIZAR UN OPERADOR DE CONJUNTO PARA COMBINAR VARIAS CONSULTASEN UNA SOLA CONSULTA

    a. Operador UNION ALL

  • 7/21/2019 SQL FUNDAMENTOS

    124/196

    b. Operador UNION

    c. Operador INTERSECT Y MINUS

  • 7/21/2019 SQL FUNDAMENTOS

    125/196

    3. CONTROLAR EL ORDEN DE LAS FILAS DEVUELTAS

    select department_id dept,to_number(null) mgr,sum(salary)from employeesgroup by department_idunion all

    select to_number(null),manager_id,sum(salary) from employeesgroup by manager_idunion allselect to_number(null),to_number(null),sum(salary) fromemployees;

    select department_id dept,to_number(null) mgr,sum(salary)from employeesgroup by department_idunionselect to_number(null),manager_id,sum(salary) from employees

    group by manager_idunion allselect to_number(null),to_number(null),sum(salary) fromemployees;

    select 20,count(1) from employees where department_id=20union allselect 30,count(1) from employees where department_id=30union allselect 40,count(1) from employees where department_id=40;

    select manager_id from employees where department_id=20intersectselect manager_id from employees where department_id=30minusselect manager_id from employees where department_id=40;

    select department_id dept,to_number(null) mgr,sum(salary)from employeesgroup by department_idunion

    select to_number(null),manager_id,sum(salary) from employeesgroup by manager_idunion allselect to_number(null),to_number(null),sum(salary) fromemployees;

  • 7/21/2019 SQL FUNDAMENTOS

    126/196

    Ejercicios UNIDAD 9

    1. Prctica Primer parte

    Ejecute el siguiente query para comprobar el funcionamiento del operador UNION.Que se observa? Cuantas veces se repite cada regin?

    SELECT region_nameFROM regionsUNIONSELECT region_nameFROM regions;

    Ahora ejecute el mismo query con UNION ALL para comprobar el funcionamiento deeste operador

    SELECT region_nameFROM regionsUNION ALLSELECT region_nameFROM regions;

    Listar los empleados y puestos de trabajo actuales junto con los empleados y puestodel historial. Usar operador UNION para no mostrar filas repetidas, evitando mostraraquellos empleados que actualmente tengan un puesto que hayan ocupado en elpasado.

    SELECT employee_id, job_idFROM employeesUNIONSELECT employee_id, job_idFROM job_history;

    Mostrar los employee_id de los empleados que actualmente son SA_MAN junto conlos que en el pasado fueron SA_REP(utilizo UNION por si empleados estuvieron enambos puestos de trabajo):

    SELECT employee_idFROM employeesWHERE job_id in ('SA_MAN')UNIONSELECT employee_idFROM job_historyWHERE job_id in ('SA_REP');

  • 7/21/2019 SQL FUNDAMENTOS

    127/196

    Mostrar department_id, department_name, city de los departamentos que estn enToronto y los que estn en Seattle. Usar operador de conjuntos(conveniente usarUNION ALL ya que no hay departamentos que estn en ambas ciudades a la vez, seevita el ordenamiento)

    SELECT department_id, department_name, cityFROM departmentsNATURAL JOIN locationsWHERE city='Toronto'UNION ALLSELECT department_id, department_name, cityFROM departmentsNATURAL JOIN locationsWHERE city='Seattle';

    Mostrar en un mismo query department_id, deparment_name del departamento 80junto con employee_id, last_name de los empledos que pertenezcan al departamento80. Usar operadores de conjunto.

    SELECT department_id, department_nameFROM departmentsWHERE department_id =80UNION ALLSELECT employee_id, last_nameFROM employees

    WHERE department_id =80;

    2. Prctica Segunda parte

    Mostrar employee_id y job_id de aquellos empleados que tienen actualmente unpuesto de trabajo que ya han tenido en el pasado.

    SELECT employee_id, job_idFROM employeesINTERSECT

    SELECT employee_id, job_idFROM job_history;

  • 7/21/2019 SQL FUNDAMENTOS

    128/196

    Crear un reporte que liste los employee_id y job_id de los empleados cuyo trabajoactual coincide con el puesto de trabajo que tuvieron cuando entraron a la compaa.

    SELECT employee_id, job_idFROM employeesINTERSECT

    SELECT e.employee_id, j.job_idFROM job_history jJOIN employees eON (j.start_date = e.hire_date AND j.employee_id=e.employee_id);

    Listar los departamentos que no contengan el puesto de trabajo(job_id) ST_CLERK.Usar operadores de conjunto para realizar este reporte.

    SELECT department_idFROM departments

    MINUSSELECT department_idFROM employeesWHERE job_id='ST_CLERK';

    Mostrar el nombre de aquellos paises donde no haya departamentos de la compaa.

    SELECT country_nameFROM countriesMINUSSELECT country_nameFROM departmentsNATURAL JOIN locationsNATURAL JOIN countries;

    Mostrar los employee_id de aquellos empleados que no han cambiado nunca supuesto de trabajo:

    SELECT employee_id

    FROM employeesMINUSSELECT employee_idFROM job_history;

  • 7/21/2019 SQL FUNDAMENTOS

    129/196

    Mostrar los employee_id de aquellos empleados que han trabajado en el pasado tantoen SA_REP como en SA_MAN

    SELECT employee_idFROM job_historyWHERE job_id='SA_REP'

    INTERSECTSELECT employee_idFROM job_historyWHERE job_id='SA_MAN';

    3. Prctica Tercer parte

    Mostrar employee_id , job_id y salarios actuales de los empleados junto con lospuestos que tuvieron en el pasado. Como job_history no guarda salarios pasados usarcolumna dummy en cero(literal 0) para poder unir ambas tablas. Usar UNION, el

    reporte saldr ordenado

    SELECT employee_id, job_id,salaryFROM employeesUNIONSELECT employee_id, job_id,0FROM job_history;

    Ejecutar el siguiente query y evaluar como participan las columnas dummy.

    SELECT location_id, department_name "Department", TO_CHAR(NULL) "Warehouselocation"FROM departmentsUNIONSELECT location_id, TO_CHAR(NULL) "Department", state_provinceFROM locations;

  • 7/21/2019 SQL FUNDAMENTOS

    130/196

    UNIDAD 10MANIPULACIN DE DATOS (DML)

    SELECT INSERT UPDATE DELETE MERGE

    1. INSERTAR FILAS EN UNA TABLA

    insert into hr.regions values (10,'Great Britain');insert into hr.regions (region_name, region_id) values ('Australasia',11);

  • 7/21/2019 SQL FUNDAMENTOS

    131/196

    insert into hr.regions (region_id) values (12);insert into hr.regions values (13,null);

  • 7/21/2019 SQL FUNDAMENTOS

    132/196

  • 7/21/2019 SQL FUNDAMENTOS

    133/196

  • 7/21/2019 SQL FUNDAMENTOS

    134/196

    insert into employees (employee_id, last_name, hire_date)values (1000,'WATSON','03-Nov-07');

    insert into employees (employee_id, last_name, hire_date)values (1000,upper('Watson'),to_date('03-Nov-07','dd-mon-yy'));

    insert into employees (employee_id,last_name,hire_date)values (1000 + 1,user,sysdate - 7);

    INSERT INTO table [ (column [, column] ) ] subquery;

    insert into regions_copy select * from regions;

    truncate table department_salaries;insert into department_salaries (department,staff,salaries)select coalesce(department_name,'Unassigned'),

    count(employee_id),sum(coalesce(salary,0))

    from employees e full outer join departments don e.department_id = d.department_id

    group by department_nameorder by department_name;insert allwhen 1=1 theninto emp_no_name (department_id,job_id,salary,commission_pct,hire_date)values (department_id,job_id,salary,commission_pct,hire_date)when department_id 80 theninto emp_non_sales (employee_id,department_id,salary,hire_date)values (employee_id,department_id,salary,hire_date)

  • 7/21/2019 SQL FUNDAMENTOS

    135/196

    when department_id = 80 theninto emp_sales (employee_id,salary,commission_pct,hire_date)values (employee_id,salary,commission_pct,hire_date)select employee_id,department_id,job_id,salary,commission_pct,hire_datefrom employees where hire_date > sysdate - 30;

  • 7/21/2019 SQL FUNDAMENTOS

    136/196

    2. ACTUALIZAR FILAS EN UNA TABLA

    UPDATEtable SETcolumn=value [,column=value] [WHERE condition];

  • 7/21/2019 SQL FUNDAMENTOS

    137/196

  • 7/21/2019 SQL FUNDAMENTOS

    138/196

  • 7/21/2019 SQL FUNDAMENTOS

    139/196

    3. BORRAR FILAS EN UNA TABLA

    a. Removiendo filas con DELETE

  • 7/21/2019 SQL FUNDAMENTOS

    140/196

    delete from employees where employee_id=206;delete from employees where last_name like 'S%';delete from employees where department_id=&Which_department;delete from employees where department_id is null;

  • 7/21/2019 SQL FUNDAMENTOS

    141/196

    delete from employees where department_id in(select department_id from departments where location_id in(select location_id from locations where country_id in(select country_id from countries where region_id in(select region_id from regions where region_name='Europe'))))

    b.Removiendo filas con TRUNCATE

    TRUNCATE TABLE table;

    c. MERGE

  • 7/21/2019 SQL FUNDAMENTOS

    142/196

  • 7/21/2019 SQL FUNDAMENTOS

    143/196

    MERGE INTO employees e using new_employees non (e.employee_id = n.employee_id)when matched thenupdate set e.salary=n.salarywhen not matched theninsert (employee_id,last_name,salary)

    values (n.employee_id,n.last_name,n.salary);

  • 7/21/2019 SQL FUNDAMENTOS

    144/196

    4. CONTROL DE TRANSACCIONES

  • 7/21/2019 SQL FUNDAMENTOS

    145/196

    a. Declaraciones de control de transacciones

    COMMIT

    COMMIT;

    ROLLBACK

  • 7/21/2019 SQL FUNDAMENTOS

    146/196

    ROLLBACK[TOSAVEPOINTsavepoint] ;

    SAVEPOINT

    SAVEPOINT savepoint;

  • 7/21/2019 SQL FUNDAMENTOS

    147/196

    AUTOCOMMIT

    SET AUTOCOMMIT ON

    SET AUTOCOMMIT OFF

  • 7/21/2019 SQL FUNDAMENTOS

    148/196

  • 7/21/2019 SQL FUNDAMENTOS

    149/196

  • 7/21/2019 SQL FUNDAMENTOS

    150/196

  • 7/21/2019 SQL FUNDAMENTOS

    151/196

  • 7/21/2019 SQL FUNDAMENTOS

    152/196

  • 7/21/2019 SQL FUNDAMENTOS

    153/196

    Ejercicios UNIDAD 10

    1. Prctica Primer parte

    Haga un query de la tabla REGIONES para verificar que valores estn usados en lacolumna REGION_ID

    SELECT * FROM regions;

    Inserte una fila en la tabla REGIONS, proporcionando los valores 101, Great Britain.

    INSERT INTO regions VALUES (101,'Great Britain');

    Inserte una fila en la tabla REGIONS, proporcionando los valores como variables desustitucin

    INSERT INTO regions VALUES (&Region_number,'&Region_name');

    Al solicitar el valor, ingrese 102 para el numrico, Australia para el nombre. Usar comillasen el ingreso del string.

    Inserte una fila en la tabla REGIONS, calculando la REGION_ID como un valor msalto que el valor ms alto actual. Usar subquery en clusula values.

    INSERT INTO regions VALUES ((SELECT MAX(region_id)+1 FROM regions), 'Oceania');

    Confirmar la insercin de las filas.

    SELECT * FROM regions;

    Hacer commit.COMMIT;

    2. Prctica Segunda parte

    Modifique la columna region_name de fila de regions con region_id=101, actualizar

    con Scandinavia:

    UPDATE regionsSET region_name='Scandinavia'WHERE region_id=101;

    Devolver el mensaje 1 row updated

  • 7/21/2019 SQL FUNDAMENTOS

    154/196

    Modifique la columna region_name de la tabla regions de aquellas filas con region_idmayor a 100. Setear region_name igual a Iberia

    UPDATE regions SET region_name='Iberia' WHERE region_id > 100;

    Devolver el mensaje 3rows updated

    Ejecutar el siguiente update con subqueries y analizar que realiza.

    UPDATE regionsSET region_id=(region_id+(SELECT MAX(region_id) FROM regions))WHERE region_id IN (SELECT region_id

    FROM regionsWHERE region_id > 100);

    Devolver el mensaje 3 rows updated

    Confirmar el estado de las filas.

    SELECT * FROM regions;

    Hacer commit.

    COMMIT;

    3. Prctica Tercer parte

    Borrar de regions la fila con region_id = 204:

    DELETE FROM regions WHERE region_id=204;

    Devolver el mensaje 1 row deleted

    Intentar borrar todas las filas de la tabla regions , que ocurre?

    DELETE FROM regions;

    Dar error, debido a una violacin de constraints.

    Borrar filas ejecutando el siguiente delete con subqueries:

  • 7/21/2019 SQL FUNDAMENTOS

    155/196

    DELETE FROM regionsWHERE region_id IN (SELECT region_id FROM regions

    WHERE region_name='Iberia');

    Devolver el mensaje 2 rows deleted

    Confirmar que la tabla REGIONS contiene las 4 filas originales.

    SELECT * FROM regions;

    Hacer commit.

    COMMIT;

    4. Prctica Cuarta parte

    Conectar dos sesiones concurrentemente con usuario HR. La siguiente tabla lista los pasos aseguir en cada sesin:

    Paso En su primera sesin En su segunda sesin

    1 select * from regions; select * from regions;

    2 insert into regions insert into regions

    values(100,'UK'); values(101,'GB');

    3 select * from regions; select * from regions;

    Ambas sesiones ven datos diferentes: los datos originales ms suspropios cambios

    4 commit;

    5 select * from regions; select * from regions;

    La transaccin de la sesin 1 public los datos para todos, la otratransaccin

    sigue siendo visible para la sesion 2 nicamente

    6 rollback; rollback;

    7 select * from regions; select * from regions;

  • 7/21/2019 SQL FUNDAMENTOS

    156/196

    En la primer session no hay nada para rollbackear, la segunda session sihar rollback ya que no se haba ejecutado commit hasta el momento

    8 delete from regions where delete from regions where

    region_id=100; region_id=101;

    9 select * from regions; select * from regions;

    Cada fila borrada sigue estando visible en la session contraria

    10 commit; commit;

    11 select * from regions; select * from regions;

    Transacciones finalizadas, ambas sesiones ahora tienen una lecturaconsistente de la tabla

    Conectar 2 sesiones concurrentes, ejecutar en cada una de ellas el siguiente select forupdate:

    SELECT * FROM regionsWHERE region_id=2FOR UPDATE;

  • 7/21/2019 SQL FUNDAMENTOS

    157/196

    UNIDAD 11USO DE SENTENCIAS DDL PARA CREAR Y GESTIONAR TABLAS

    1. CLASIFICAR OBJETOS DE LA BASE DE DATOS PRINCIPAL

    a. Tipos de Objetos

    SQL> select object_type,count(object_type) from dba_objects

    b. Usuarios y esquemas

  • 7/21/2019 SQL FUNDAMENTOS

    158/196

    A user is a person who can connect to the database.

    The user will have a username and a password. A schema is a container for the objectsowned by a user.

    When a user is created, their schema is created too.

    A schema is the objects owned by a user; initially, i t will be empty

    c. Nombrar objetos de esquema

    d. Espacio de nombres de objetos

    Tables Views Sequences Private synonyms

  • 7/21/2019 SQL FUNDAMENTOS

    159/196

    2. ENUMERAR LOS TIPOS DE DATOS QUE ESTN DISPONIBLES PARA LASCOLUMNAS

    a. VARCHAR2

    Variable-length character data, from 1 byte to 4KB. The data is stored in the databasecharacter set.

    b. NVARCHAR2

    Like VARCHAR2, but the data is stored in the alternative national language character set, oneof the permitted Unicode character sets.

    c. CHAR

    Fixed-length character data, from 1 byte to 2KB, in the database character set. If the data isnot the length of the column, then it will be padded with spaces.

    d. RAW

    Variable-length binary data, from 1 byte to 4KB. Unlike the CHAR and VARCHAR2 datatypes, RAW data is not converted by Oracle Net from the databases character set to the userprocesss character set on SELECT or the other way on INSERT.

  • 7/21/2019 SQL FUNDAMENTOS

    160/196

    e. NUMBER

    Numeric data, for which you can specify precision and scale.The precision can range from to 1 to 38, the scale can range from 84 to 127.

    f. FLOAT

    This is an ANSI data type, floating-point number with precision of 126 binary (or 38 decimal).Oracle also provides BINARY_FLOAT and BINARY_DOUBLE as alternatives.

    g. INTEGER

    Equivalent to NUMBER, with scale zero.

    h. DATE

    This is either length zero, if the column is empty, or 7 bytes. All DATE data includes century,year, month, day, hour, minute, and second.The valid range is from January 1, 4712 BC to December 31, 9999 AD.

    i. TIMESTAMP

    This is length zero if the column is empty, or up to 11 bytes, depending on the precisionspecified. Similar to DATE, but with precision of up to 9 decimal places for the seconds, 6places by default.

    j. TIMESTAMP WITH TIMEZONE

    Like TIMESTAMP, but the data is stored with a record kept of the time zone to which it refers.The length may be up to 13 bytes, depending on precision. This data type lets Oracledetermine the difference between two times by normalizing them to UTC, even if the timesare for different time zones.

    k.TIMESTAMP WITH LOCAL TIMEZONE

    Like TIMESTAMP, but the data is normalized to the database time zone on saving. Whenretrieved, it is normalized to the time zone of the user process selecting it.

    l. INTERVAL YEAR TO MONTH

    Used for recording a period in years and months between two DATEs or TIMESTAMPs.

    m. INTERVAL DAY TO SECOND

    Used for recording a period in days and seconds between two DATEs or TIMESTAMPs.

    n. CLOB

    Character data stored in the database character set, size effectively unlimited: 4GB multipliedby the database block size.

    o. NCLOB

    Like CLOB, but the data is stored in the alternative national language character set, one ofthe permitted Unicode character sets.

  • 7/21/2019 SQL FUNDAMENTOS

    161/196

    p. BLOB

    Like CLOB, but binary data that will not undergo character set conversion by Oracle Net.

    q. BFILE

    A locator pointing to a file stored on the operating system of the database server. The size ofthe files is limited to 4GB.

    r. LONG

    Character data in the database character set, up to 2GB. All the functionality of LONG (andmore) is provided by CLOB; LONGs should not be used in a modern database, and if yourdatabase has any columns of this type they should be converted to CLOB. There can only beone LONG column in a table.

    s. LONG RAW

    Like LONG, but binary data that will not be converted by Oracle Net. Any LONG RAWcolumns should be converted to BLOBs.

    t. ROWIDA value coded in base 64 that is the pointer to the location of a row in a table. Encrypted.Within it is the exact physical address. ROWID is an Oracle proprietary data type, not visibleunless specifically selected.

  • 7/21/2019 SQL FUNDAMENTOS

    162/196

  • 7/21/2019 SQL FUNDAMENTOS

    163/196

  • 7/21/2019 SQL FUNDAMENTOS

    164/196

  • 7/21/2019 SQL FUNDAMENTOS

    165/196

    3. CREANDO UNA TABLA SIMPLE

  • 7/21/2019 SQL FUNDAMENTOS

    166/196

  • 7/21/2019 SQL FUNDAMENTOS

    167/196

    a. Creacin de tablas con columnas especificadas

    CREATE TABLE[schema.]table [ORGANIZATION HEAP]

    (column datatype [DEFAULT expression][,column datatype [DEFAULT expression]);

    CREATE TABLE SCOTT.EMP(EMPNO NUMBER(4),ENAME VARCHAR2(10),HIREDATE DATE DEFAULT TRUNC(SYSDATE),SAL NUMBER(7,2),COMM NUMBER(7,2) DEFAULT 0.03);

  • 7/21/2019 SQL FUNDAMENTOS

    168/196

    b. Creacin de tablas con subconsultas

    CREATE TABLE [schema.]tableAS subquery;

    create table employees_copy as select * from employees;

    create table emp_dept asselect last_name ename,department_name dname,round(sysdate hire_date) servicefrom employees natural join departments order by dname,ename;

  • 7/21/2019 SQL FUNDAMENTOS

    169/196

    c. Alterar las tablas despus de creadas

  • 7/21/2019 SQL FUNDAMENTOS

    170/196

    Adding columns:

    Modifying columns:

    Dropping columns:

  • 7/21/2019 SQL FUNDAMENTOS

    171/196

    Marking columns as unused:

    Renaming columns:

    alter table emp rename column hiredate to recruited;

  • 7/21/2019 SQL FUNDAMENTOS

    172/196

    Marking the table as read-only:

    alter table emp read only;

    ALTER TABLE tablename DROP UNUSED COLUMNS;

    d. Quitar y Truncar tablas

    DROP TABLE[schema.]tablename ;

  • 7/21/2019 SQL FUNDAMENTOS

    173/196

  • 7/21/2019 SQL FUNDAMENTOS

    174/196

    4. EXPLICAR CONSTRAINTS EN EL TIEMPO DE CREACIN DE LA TABLA

  • 7/21/2019 SQL FUNDAMENTOS

    175/196

  • 7/21/2019 SQL FUNDAMENTOS

    176/196

  • 7/21/2019 SQL FUNDAMENTOS

    177/196

  • 7/21/2019 SQL FUNDAMENTOS

    178/196

  • 7/21/2019 SQL FUNDAMENTOS

    179/196

  • 7/21/2019 SQL FUNDAMENTOS

    180/196

  • 7/21/2019 SQL FUNDAMENTOS

    181/196

  • 7/21/2019 SQL FUNDAMENTOS

    182/196

  • 7/21/2019 SQL FUNDAMENTOS

    183/196

  • 7/21/2019 SQL FUNDAMENTOS

    184/196

  • 7/21/2019 SQL FUNDAMENTOS

    185/196

    1 create table dept(2 deptno number(2,0) constraint dept_deptno_pk primary key3 constraint dept_deptno_ck check (deptno between 10 and 90),4 dname varchar2(20) constraint dept_dname_nn not null);5 create table emp(6 empno number(4,0) constraint emp_empno_pk primary key,

    7 ename varchar2(20) constraint emp_ename_nn not null,8 mgr number (4,0) constraint emp_mgr_fk references emp (empno),9 dob date,10 hiredate date,11 deptno number(2,0) constraint emp_deptno_fk references dept(deptno)12 on delete set null,13 email varchar2(30) constraint emp_email_uk unique,14 constraint emp_hiredate_ck check (hiredate >= dob + 365*16),15 constraint emp_email_ck16 check ((instr(email,'@') > 0) and (instr(email,'.') > 0)));

  • 7/21/2019 SQL FUNDAMENTOS

    186/196

    Ejercicios UNIDAD 11

    1. Prctica Primer parte

    Crear la tabla DEPT con las siguientes caractersticas: id NUMBER(7), name VARCHAR2(25)

    CREATE TABLE dept(id NUMBER(7),name VARCHAR2(25));

    DESCRIBE dept

    Llenar la tabla DEPT a partir de la tabla DEPARTMENTS con las columnasnecesarias

    INSERT INTO deptSELECT department_id, department_nameFROM departments;

    COMMIT;

    Crear la tabla EMP con las siguientes caractersticas:

    id NUMBER(7) last_name VARCHAR2(25) first_name VARCHAR2(25) dept_id NUMBER(7)

    CREATE TABLE emp(id NUMBER(7),

    last_name VARCHAR2(25),first_name VARCHAR2(25),dept_id NUMBER(7));

    DESCRIBE emp

  • 7/21/2019 SQL FUNDAMENTOS

    187/196

    Llenar tabla EMP a partir de la tabla EMPLOYEES:

    INSERT INTO EMPSELECT employee_id, last_name, first_name, department_idFROM employees;

    COMMIT;

    Confirmar en la tabla USER_TABLES del diccionario de datos existen las 2 tablascreadas recientemente: DEPT y EMP

    SELECT table_nameFROM user_tablesWHERE table_name IN ('DEPT', 'EMP');

    2. Prctica Segunda parte

    Modificar la tabla EMP para que permita apellidos de hasta 50 caracteres, confirmar elcambio verificando la estructura de la tabla

    ALTER TABLE empMODIFY (last_name VARCHAR2(50));

    DESCRIBE emp

    Crear la tabla emp2 basada en la estructura de EMPLOYEES, incluir las columnasEMPLOYEE_ID, FIRST_NAME, LAST_NAME, SALARY y DEPARTMENT_ID. Losnombres de las columnas deben ser ID, FIRST_NAME, LAST_NAME, SALARY , yDEPT_ID, respectivamente.

    CREATE TABLE emp2 ASSELECT employee_id id, first_name, last_name, salary, department_id dept_id

    FROM employees;

  • 7/21/2019 SQL FUNDAMENTOS

    188/196

    Agregar la columna job_id del tipo VARCHAR2 longitud 9 en la tabla EMP2, confirmarcambio con el comando DESCRIBE, notar que la columna queda ltima en ladefinicin de la tabla

    ALTER TABLE emp2

    ADD (job_id VARCHAR2(9));

    DESCRIBE emp2

    Borrar la columna first_name de la tabla EMP2, confirmar el cambio verificando laestructura de la tabla

    ALTER TABLE emp2

    DROP COLUMN FIRST_NAME;

    DESCRIBE emp2

    Borrar la tabla EMP2

    DROP TABLE emp2;

    3. Prctica Tercera parte

    Crear primary key llamada my_emp_id_pk en la tabla EMP sobre la columa ID.

    ALTER TABLE emp ADD CONSTRAINT my_emp_id_pk PRIMARY KEY (id);

    Crear primary key llamada my_dept_id_pk en la tabla DEPT sobre la columa ID.

    ALTER TABLE dept ADD CONSTRAINT my_dept_id_pk PRIMARY KEY(id);

    Crear una FK en la tabla EMP que asegure que los empleados no pueden asignarse adepartamentos no existentes, la FK debe llamarse my_emp_dept_id_fk.

    ALTER TABLE empADD CONSTRAINT my_emp_dept_id_fk FOREIGN KEY (dept_id)REFERENCES dept(id);

  • 7/21/2019 SQL FUNDAMENTOS

    189/196

    UNIDAD 12CREACIN DE OTROS OBJETOS DE ESQUEMA

    1. CREANDO VISTAS COMPLEJAS Y SIMPLES

    a. Porque usar una vista

    Security. Simplifying user SQL. Preventing error. Making data comprehensible. Table and column names are often long and prettymeaningless. The view and its columns can be much more obvious. Performance.

    Vistas para reforzar la seguridad

    create view hr.emp_fin as selecthire_date,job_id,salary,commission_pct,department_id from hr.employees;

    select * from emp_fin where department_id=50;

    select department_name, sum(salary) from departments natural join emp_fingroup by department_name;

    Vistas para simplificar usuarios SQL

    create view dept_sal asselect d.department_name, sum(e.salary) fromdepartments d left outer join employees e on d.department_id=e.department_idgroup by department_name order by department_name;

    select * from dept_sal;

    Vistas para prevenir errores

    create table emp(empno number constraint emp_empno_pk primary key,ename varchar2(10),deptno number,active varchar2(1) default 'Y');

    create view current_staff as select * from emp where active='Y';

  • 7/21/2019 SQL FUNDAMENTOS

    190/196

    Vistas para mejorar el rendimiento

    create view dept_emp asselect /*+USE_HASH (employees departments)*/ department_name, last_namefrom departments natural join employees;

    b. Vistas simples y complejas

    c. Crear Vistas, Alterar Vistas, y Quitar Vistas

    CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW[schema.]viewname [(alias [,alias])]

    AS subquery[WITH CHECK OPTION [CONSTRAINT constraintname]][WITH READ ONLY [CONSTRAINT constraintname]] ;

    OR REPLACE If the view already exists, it will be dropped before being created. FORCE or NOFORCE The FORCE keyword will create the view even if the detail table(s)in the subquery does not exist. NOFORCE is the default and will cause an error if the detailtable does not exist. WITH CHECK OPTION This is to do with DML. If the subquery includes a WHERE clause,then this option will prevent insertion of rows that wouldnt be seen in the view or updates thatwould cause a row to disappear from the view. By default, this option is not enabled, whichcan give disconcerting results. WITH READ ONLY Prevents any DML through the view. CONSTRAINT constraintname This can be used to name the WITH CHECK OPTION andWITH READ ONLY restrictions so that error messages when the restrictions causestatements to fail, will be more comprehensible.

    DROP VIEW [schema.]viewname ;

  • 7/21/2019 SQL FUNDAMENTOS

    191/196

    2. RECUPERAR DATOS DESDE VISTAS

    create view dept_emp asselect department_name, last_name fromdepartments join employees using (department_id);

    select * from dept_emp where department_name='Marketing';

    select * from(select department_name, last_namefrom departments join employees using (department_id))

    where department_name='Marketing';

    3. CREAR SINNIMOS PRIVADOS Y PBLICOS

    select * from hr.employees@prod;

    create public synonym emp forhr.employees@prod;

    select * from emp;

    CREATE [PUBLIC] SYNONYM synonym FOR object ;

    DROP [PUBLIC] SYNONYM synonym ;ALTER SYNONYM synonym COMPILE;

    4. CREAR MANTENER Y USAR SECUENCIAS

    a. Creacin de secuencias

    CREATE SEQUENCE [schema.]sequencename[INCREMENT BY number][START WITH number][MAXVALUE number | NOMAXVALUE][MINVALUE number | NOMINVALUE][CYCLE | NOCYCLE][CACHE number | NOCACHE]

    [ORDER | NOORDER];

    CREATE sequence seq1;

    mailto:hr.employees@prodmailto:hr.employees@prodmailto:hr.employees@prodmailto:hr.employees@prod
  • 7/21/2019 SQL FUNDAMENTOS

    192/196

    b. Usando secuencias

    create sequence order_seq start with 10;create sequence line_seq start with 10;

    insert into orders (order_number,order_date,customer_number)values (order_seq.nextval,sysdate,'1000');insert into order_lines (order_number,line_number,item_number,quantity)values (order_seq.currval,line_seq.nextval,'A111',1);insert into order_lines (order_number,line_number,item_number,quantity)values (order_seq.currval,line_seq.nextval,'B111',1);commit;

    ALTER SEQUENCE sequencename[INCREMENT BY number][START WITH number][MAXVALUE number | NOMAXVALUE][MINVALUE number | NOMINVALUE][CYCLE | NOCYCLE][CACHE number | NOCACHE][ORDER | NOORDER] ;

    alter sequence order_seq cache 1000;

    drop sequence order_seq;

    5. CREAR Y MANTENER INDICES

    a. Creando y usando ndices

    CREATE [UNIQUE | BITMAP] INDEX [ schema.]indexnameON [schema.]tablename (column [, column] ) ;

  • 7/21/2019 SQL FUNDAMENTOS

    193/196

  • 7/21/2019 SQL FUNDAMENTOS

    194/196

    Ejercicios UNIDAD 12

    1. Prctica Primer parte

    Crear la vista EMPLOYEES_VU basada en las columnas employee_id, last_name, y

    department_id de la tabla employees. La vista debe tener los nombres de columnanro_empleado, apellido y nro_departamento respectivamente(usar alias)

    CREATE OR REPLACE VIEW employees_vu ASSELECT employee_id nro_empleado,

    last_name apellido,department_id nro_departamento

    FROM employees;

    Mostrar la vista EMPLOYEES_VU con todas sus columnas, luego volver a mostrar lavista pero solo las columnas de nro de empleado y apellido:

    SELECT * FROM employees_vu;

    SELECT nro_empleado, apellido FROM employees_vu;

    Consultar las vistas que tiene el esquema, usar la vista del diccionario de datosUSER_VIEWS para realizar este chequeo. Notar que el esquema ya tiene una vistacreada con anterioridad:

    SELECT view_name, text FROM user_views;

    Crear una vista llamada DEPT50 que contenga las columnas employee_id, last_name,y department_id de todos los empleados del departamento 50. Los nombres decolumna deben ser EMPNO, EMPLOYEE, DEPTNO respectivamente. No permitir queun empleado sea reasignado a otro departamento cuando se realizan DMLs sobre lavista.

    CREATE VIEW dept50 AS

    SELECT employee_id empno, last_name employee,department_id deptno

    FROM employeesWHERE department_id = 50WITH CHECK OPTION CONSTRAINT emp_dept_50;

  • 7/21/2019 SQL FUNDAMENTOS

    195/196

    Ver la estructura de la vista creada en el punto anterior y su contenido

    DESCRIBE dept50

    SELECT * FROM dept50;

    Intentar actualizar a travs de la vista dept50 el empleado Matos para asignarlo aldepartamento 80, que ocurre?

    UPDATE dept50SET deptno = 80WHERE employee = 'Matos';

    3. Prctica Segunda parte

    Crear un sinnimo llamado vista_empleados para la vista employees_vu .

    CREATE SYNONYM vista_empleados FOR employees_vu;

    Crear un sinnimo llamado vista_depto50 para la vista dept50.

    CREATE SYNONYM vista_depto50 FOR dept50;

    Ver la estructura de ambas vistas usando los sinnimos.

    DESCRIBE vista_empleados

    DESCRIBE vista_depto50

    Consultar ambas vistas pero usando los sinnimos:

    SELECT * FROM vista_empleados;

    SELECT * FROM vista_depto50;

    3. Prctica Tercer parte

    Crear una secuencia que se utilizar como primary key de la tabla DEPT. Lasecuencia se debe llamar DEPT_ID_SEQ, debe arrancar en 200 y un mximo de1000, el incremento debe ser de a 10

  • 7/21/2019 SQL FUNDAMENTOS

    196/196