Blogia

MeSeminary

Secuencias

El proveedor de datos .NET Framework para Oracle proporciona compatibilidad para recuperar los valores clave de secuencia de Oracle que genera el servidor después de realizar inserciones con OracleDataAdapter.

SQL Server y Oracle admiten la creación de columnas de incremento automático que pueden designarse como claves principales. Estos valores los genera el servidor cuando se agregan filas a una tabla. En SQL Server se establece la propiedad Identity de una columna; en Oracle se crea una secuencia. La diferencia entre las columnas de incremento automático de SQL Server y las secuencias de Oracle es la siguiente:

  • En SQL Server, marca una columna como columna de incremento automático y SQL Server genera de forma automática nuevos valores para la columna cuando se inserta una nueva fila.

  • En Oracle, para generar nuevos valores en una columna de la tabla crea una secuencia, pero no existe vínculo directo entre la secuencia y la tabla o la columna. Las secuencias de Oracle son objetos, de la misma forma que las tablas o los procedimientos almacenados.

Cuando crea una secuencia en una base de datos de Oracle, puede definir su valor inicial y el incremento entre los valores. También puede consultar si existen nuevos valores en la secuencia antes de enviar nuevas filas. Esto implica que el código puede reconocer los valores clave de las nuevas filas antes de insertarlas en la base de datos.

Secuencias

    ORACLE proporciona los objetos de secuencia para la generación de códigos numericos automáticos. 

    Las secuencias son una solución fácil y elegante al problema de los codigos autogenerados.

    LA sintaxis general es la siguiente:

 

 


CREATE SEQUENCE <secuence_name>
[MINVALUE <min_val>]
[MAXVALUE <max_val>]
[START WITH <ini_val>]
[INCREMENT BY <inc_val>]
[NOCACHE | CACHE <cache_val>]
[CYCLE]

[ORDER];

 

    El siguiente ejemplo crea una secuencia SQ_PRODUCTOS.

 


CREATE SEQUENCE SQ_PRODUCTOS
MINVALUE 1
MAXVALUE 999999999999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 20;

 

    Se puede simplificar la orden, tomando los valores por defecto. El ejemplo anterior quedaría del siguiente modo:

 


CREATE SEQUENCE SQ_PRODUCTOS;

Para obtener el siguiente valor de una secuencia debemos utilizar la función NEXTVALNEXTVAL se puede utilizar el cualquier sentencia SQL DML (SELECTINSERTUPDATE).

 


SELECT SQ_PRODUCTOS.NEXTVAL
FROM DUAL;

 

    Podemos obtener el último valor generado por la secuencia con la función CURRVAL. Para poder ejecutar la función CURRVAL debemos haber ejecutado previamente la función NEXTVAL.

 


SELECT SQ_PRODUCTOS.CURRVAL
FROM DUAL;

 

    Para eliminar una secuencia definitivamente de la base de datos debemos utilizar la sentencia DROP.

 


DROP SEQUENCE
SQ_PRODUCTOS ;

 

 

Constraint

Para cambiar las restricciones y la clave primaria de una tabla debemos usar ALTER TABLE.

Crear una clave primaria (primary key):

ALTER TABLE T_PEDIDOS ADD CONSTRAINT PK_PEDIDOS
PRIMARY KEY (numpedido,lineapedido);

Crear una clave externa, para integridad referencial (foreign key):

ALTER TABLE T_PEDIDOS ADD CONSTRAINT FK_PEDIDOS_CLIENTES
FOREIGN KEY (codcliente) REFERENCES T_CLIENTES (codcliente));

Crear un control de valores (check constraint):

ALTER TABLE T_PEDIDOS ADD CONSTRAINT CK_ESTADO
CHECK (estado IN (1,2,3));

Crear una restricción UNIQUE:

ALTER TABLE T_PEDIDOS ADD CONSTRAINT UK_ESTADO
UNIQUE (correosid);

Normalmente una restricción de este tipo se implementa mediante un indice unico (ver CREATE INDEX).

Borrar una restricción:

ALTER TABLE T_PEDIDOS DROP CONSTRAINT CON1_PEDIDOS;

Deshabilita una restricción:

ALTER TABLE T_PEDIDOS DISABLE CONSTRAINT CON1_PEDIDOS;

habilita una restricción:

ALTER TABLE T_PEDIDOS ENABLE CONSTRAINT CON1_PEDIDOS;

la sintaxis ALTER TABLE para restricciones es:

   ALTER TABLE [esquema.]tabla
constraint_clause,...
[ENABLE enable_clause | DISABLE disable_clause]
[{ENABLE|DISABLE} TABLE LOCK]
[{ENABLE|DISABLE} ALL TRIGGERS];

donde constraint_clause puede ser alguna de las siguientes entradas:

   ADD out_of_line_constraint(s)
ADD out_of_line_referential_constraint
DROP PRIMARY KEY [CASCADE] [{KEEP|DROP} INDEX]
DROP UNIQUE (column,...) [{KEEP|DROP} INDEX]
DROP CONSTRAINT constraint [CASCADE]
MODIFY CONSTRAINT constraint constrnt_state
MODIFY PRIMARY KEY constrnt_state
MODIFY UNIQUE (column,...) constrnt_state
RENAME CONSTRAINT constraint TO new_name

donde a su vez constrnt_state puede ser:

 
[[NOT] DEFERRABLE] [INITIALLY {IMMEDIATE|DEFERRED}]
[RELY | NORELY] [USING INDEX using_index_clause]
[ENABLE|DISABLE] [VALIDATE|NOVALIDATE]
[EXCEPTIONS INTO [schema.]table]

Borrar una restricción:

   ALTER TABLE T_PEDIDOS DROP CONSTRAINT CON1_PEDIDOS;

INFO IMPORTANTE:


  • Oracle "Check" Constraint: This constraint validates incoming columns at row insert time. For example, rather than having an application verify that all occurrences of region are North, South, East, or West, an Oracle check constraint can be added to the table definition to ensure the validity of the region column. 
  • Not Null Constraint: This Oracle constraint is used to specify that a column may never contain a NULL value. This is enforced at SQL insert and update time. 
  • Primary Key Constraint: This Oracle constraint is used to identify the primary key for a table. This operation requires that the primary columns are unique, and this Oracle constraint will create a unique index on the target primary key. 
  • References Constraint: This is the foreign key constraint as implemented by Oracle. A references constraint is only applied at SQL insert and delete times.  At SQL delete time, the references Oracle constraint can be used to ensure that an employee is not deleted, if rows still exist in the DEPENDENT table. 
  • Unique Constraint: This Oracle constraint is used to ensure that all column values within a table never contain a duplicate entry.

Oracle constraint views:

DBAALLUSER
dba_cons_columnsall_cons_columnsuser_cons_columns
dba_constraintsall_constraintsuser_constraints
dba_indexesall_indexesuser_indexes
dba_ind_partitionsall_ind_partitionsuser_ind_partitions
dba_ind_subpartitionsall_ind_subpartitionsuser_ind_subpartitions

 

  • Oracle Constraint Standards
    • Oracle Primary key constraints will follow this naming convention:
      • PK_nnnnn 
        Where nnnn = The table name that the index is built on.

         
      • UK_nnnnn_nn
        Where nnnn = The table name that the index is built on.

                        nn =  A number that makes the constraint unique.

         
      • FK_pppp_cccc_nn
        Where pppp = The parent table name
                    cccc = The child parent table name
                        nn = A number that makes the constraint unique

 


 

DML "Data Manipulation Language"

Aqui estan definidas las sentencias del lenguaje de manipulación de datos (Data Manipulation Language o DML) de oracle, como SELECTUPDATEINSERTDELETE, etc...

Create Index:

Los indices se usan para mejorar el rendimiento de las operaciones sobre una tabla.

En general mejoran el rendimiento las SELECT y empeoran (minimamente) el rendimiento de los INSERTy los DELETE.

Una vez creados no es necesario nada más, oracle los usa cuando es posible (ver EXPLAIN PLAN).

DECODE:

Traduce una expresión a un valor de retorno. Si expr es igual a value1, la función devuelve Return1. Si expr es igual a value2, la función devuelve Return2. Y asi sucesivamente. Si expr no es igual a ningun valor la funcion devuelve el valor por defecto.

TO_CHAR:

Convierte una fecha a una cadena o un número con el formato especificado.

SELECT:

La selección sobre una tabla consiste en elegir un subconjunto de filas que cumplan (o no) algunas condiciones determinadas. La sintaxis de una sentencia de este tipo es la siguiente:

SELECT */ columna1, columna2,....
FROM nombre-tabla
[WHERE condición]
[GROUP BY columna1, columna2.... ]
[HAVING condición-selección-grupos ]
[ORDER BY columna1 [DESC], columna2 [DESC]... ]

TO_DATE:

Convierte una cadena en un valor de tipo DATE. Ver en TO_CHAR ejemplos de formato.

GRANT:

Esta sentencia sirve para dar permisos (o privilegios) a un usuario o a un rol.

Un permiso, en oracle, es un derecho a ejecutar un sentencia (system privileges) o a acceder a un objeto de otro usuario (object privileges).

El conjunto de permisos es fijo, esto quiere decir que no se pueden crear nuevos tipos de permisos.

Si un permiso se asigna a rol especial PUBLIC significa que puede ser ejecutado por todos los usuarios.

 

INSERT:

Añade filas a una tabla.

Para guardar los datos insertados hay que ejecutar COMMIT;

Para cancelar la insercción podemos hacer ROLLBACK;

 

UPDATE:

Actualiza valores de una o más columnas para un subconjunto de filas de una tabla.

Para guardar cambios hay que ejecutar COMMIT;

Para cancelar la modificación podemos hacer ROLLBACK;

 

CREATE_USER:

Esta sentencia sirve para crear un usuario oracle.

Un usuario es un nombre de acceso a la base de datos oracle. Normalmente va asociado a una clave (password).

Lo que puede hacer un usuario una vez ha accedido a la base de datos depende de los permisos que tenga asignados ya sea directamente (GRANT) como sobre algun rol que tenga asignado (CREATE ROLE).

El perfil que tenga asignado influye en los recursos del sistema de los que dispone un usuario a la hora de ejecutar oracle (CREATE PROFILE).

 

 

EJERCICIOS RESUELTOS

 

drop table member;
drop table title;
drop table title_copy;
drop table rental;
drop table reservation;
--PRACTICA 14
--1
--a. Tabla Member, con sus correspondientes constraints.
create table Member
(member_id number(10) constraint memberr_id_pk primary key,
first_name varchar2(25),
last_name VARCHAR2(25) CONSTRAINT member_last_name_nn NOT NULL,
address varchar2(100),
city varchar2 (30),
phone varchar2(15),
join_date DATE DEFAULT SYSDATE);

--b.
create table title
(title_id number (10) constraint title_id_pk primary key,
title varchar2(60) constraint tittle_title_nn not null,
description varchar2(400) constraint title_description_nn not null,
rating varchar2(4) constraint title_rating_ck check (rating in ('G', 'PG', 'R', 'NC17', 'NR')),
category varchar2(20) constraint title_category_ck check (category in ('DRAMA', 'COMEDY', 'ACTION','CHILD', 'SCIFI', 'DOCUMENTARY')),
release_date date);

--c
create table title_copy
(copy_id number (10),
title_id number (10),
status varchar2(15)constraint title_copy_status_nn not null constraint title_copy_status_ck check (status in ('AVAILABLE', 'DESTROYED','RENTED','RESERVED')));

alter table title_copy
add constraint copy_id_pk_ primary key(copy_id,title_id);

alter table title_copy
add constraint title_copy_title_id_fk foreign key (title_id)
references title (title_id);

--d.
create table rental
(book_date date default sysdate,
member_id number(10),
copy_id number (10) ,
act_ret_date date,
exp_ret_date date default sysdate + 2,
title_id number (10));

alter table rental
add constraint renta_book_date_pk primary key (book_date, member_id, copy_id, title_id);

alter table rental
add constraint ren_member_id_fk foreign key (member_id) references member (member_id);

alter table rental
add constraint rent_copy_id_fk foreign key (copy_id, title_id) references title_copy (copy_id ,title_id);

--e
create table reservation
(res_date date,
member_id number(10),
title_id number(10));

alter table reservation
add constraint reservation_res_date_pk primary key (res_date, member_id, title_id);

alter table reservation
add constraint reservation_member_id_fk foreign key (member_id) references member (member_id);

alter table reservation
add constraint reservation_title_id_fk foreign key (title_id) references title (title_id);

--2.
select table_name from user_tables
where table_name in ( 'MEMBER','RENTAL', 'RESERVATION','TITLE','TITLE_COPY');

SELECT CONSTRAINT_NAME , CONSTRAINT_TYPE, TABLE_NAME FROM USER_CONSTRAINTS
where table_name in ( 'MEMBER','RENTAL', 'RESERVATION','TITLE','TITLE_COPY');

--3
--3.A
CREATE SEQUENCE MEMBER_ID_SEQ
START WITH 101
NOCACHE;
--3.B
CREATE SEQUENCE TITLE_ID_SEQ
START WITH 92
NOCACHE;
--3.C
SELECT SEQUENCE_NAME FROM USER_SEQUENCES WHERE SEQUENCE_NAME IN ('MEMBER_ID_SEQ', 'TITLE_ID_SEQ');
--4
--4.A

INSERT INTO TITLE
VALUES (TITLE_ID_SEQ.NEXTVAL, 'Willie and Christmas Too', 'All of Willie’s friends make a Christmas list for Santa, but Willie has yet to add his own wish list','G','CHILD','05-OCT-1995');

INSERT INTO TITLE
VALUES (TITLE_ID_SEQ.NEXTVAL, 'Alien Again', 'Yet another installation ofscience fiction history. Can the heroine save the planet from the alien life form?','R','SCIFI','19-MAY-1995');

INSERT INTO TITLE
VALUES (TITLE_ID_SEQ.NEXTVAL, 'The Glob', 'A meteor crashes near a small American town and unleashes carnivorous goo in this classiC','NR','SCIFI', '12-08-1995');

INSERT INTO TITLE
VALUES (TITLE_ID_SEQ.NEXTVAL, 'My Day Off', 'AWith a little luck and a lot of ingenuity, a teenager skips school for a day in New York','PG','COMEDY','12-JUL-1995');

INSERT INTO TITLE
VALUES (TITLE_ID_SEQ.NEXTVAL, 'Miracles on Ice', 'AWsix-year-old has doubts about Santa Claus, but she discovers that miracles really do exist.','PG','DRAMA','12-SEP-1995');

INSERT INTO TITLE
VALUES (TITLE_ID_SEQ.NEXTVAL, 'Soda Gang', 'After discovering a cache of drugs, a young couple find themselves pitted against a vicious gang.','NR','ACTION','01-JUN-1995');

--4.B
INSERT INTO MEMBER
VALUES (MEMBER_ID_SEQ.NEXTVAL, 'Carmen' , 'Velasquez', '283 King Street','Seattle','206-899-6666','08-MAR-1990');

INSERT INTO MEMBER
VALUES (MEMBER_ID_SEQ.NEXTVAL, 'LaDoris', 'Ngao', '5 Modrany ','Bratislava ','586-355-8882','08-MAR-1990');

INSERT INTO MEMBER
VALUES (MEMBER_ID_SEQ.NEXTVAL, 'Midori', 'Nagayama','68 ViaCentrale ','Sao Paolo ','254-852-5764','17-JUN-1991');

INSERT INTO MEMBER
VALUES (MEMBER_ID_SEQ.NEXTVAL, 'Mark', 'Quick-to-See','6921 King Way','Lagos','63-559-7777','07-04-1990');

INSERT INTO MEMBER
VALUES (MEMBER_ID_SEQ.NEXTVAL, 'Audr', 'Ropeburn' , '86 Chu Street' , 'Hong Kong' , '41-559-87' , '18-06-1991');

INSERT INTO MEMBER
VALUES (MEMBER_ID_SEQ.NEXTVAL, 'Molly',' Urguhart ','3035 Laurier ','Quebec',' 418-542-9988',' 18-06-1991');


 

Subconsultas

DEFINICION:

 

Una subconsulta es una sentencia SELECT que aparece dentro de otra sentencia SELECT. Normalmente se utilizan para filtrar una clausula WHERE o HAVING con el conjunto de resultados de la subconsulta, aunque también pueden utilizarse en la lista de selección.

Por ejemplo podriamos consultar el alquirer último de un cliente.

 

 

Sintaxis de una subconsulta

  • La subconsulta se ejecuta una vez y antes de la consulta principal.
  • El resultado de ella es usado por la consulta principal externa.

Anidar subconsultas 
 
    Las subconsultas pueden anidarse de forma que una subconsulta aparezca en la cláusula WHERE (por ejemplo) de otra subconsulta que a su vez forma parte de otra consulta principal. 

 


 SELECT  CO_EMPLEADO,
   EMPLEADOS
 FROM EMPLEADOS
 WHERE CO_EMPLEADO IN (SELECT CO_EMPLEADO
        FROM NOMINAS
        WHERE ESTADO  IN ( SELECT ESTADO
            FROM ESTADOS_NOMINAS
            WHERE EMITIDO = 'S'
              AND PAGADO = 'N')
       )

 

    Los resultados que se obtienen con subconsultas normalmente pueden conseguirse a través de consultas combinadas ( JOIN ).

 


 SELECT  CO_EMPLEADO,
    NOMBRE
 FROM EMPLEADOS
 WHERE ESTADO IN (SELECT ESTADO
      FROM ESTADOS
      WHERE ACTIVO = 'S')

 

    Podrá escribirse como :

 


 SELECT  CO_EMPLEADO,
    NOMBRE
 FROM EMPLEADOS, ESTADOS
 WHERE EMPLEADOS.ESTADO = ESTADOS.ESTADO
   AND ESTADOS.ACTIVO = 'S' 

 

    Normalmente es más rápido utilizar un JOIN en lugar de una subconsulta, aunque esto depende sobre todo del diseño de la base de datos y del volumen de datos que tenga.

 Utilizacion de subconsultas con UPDATE
 
    Podemos utilizar subconsultas también en consultas de actualización conjuntamente con UPDATE. Normalmente se utilizan para "copiar" el valor de otra tabla.

 


 UPDATE  EMPLEADOS
  SET SALARIO_BRUTO = (SELECT SUM(SALIRO_BRUTO)
        FROM NOMINAS
        WHERE NOMINAS.CO_EMPLEADO = EMPLEADOS.CO_EMPLEADO)
 WHERE SALARIO_BRUTO IS NULL

 

 

Ejemplo subc. Multi-registro



Subcons. en cláusula FROM

  • Puede utilizar una subconsulta en una cláusula FROM de una sentencia SELECT:

  • Este ejemplo muestra los nombres, salarios, núm. Departamentos y media de salarios, de todos los empleados que cobran más que la media de salarios de su departamento.


 

 

Funciones de Grupo

 

 

Funciones de Caracteres


Funciones de conversión caracteres

  • LOWER: Convierte a minúsculas.
  • UPPER: Convierte a mayúsculas.
  • INITCAP: Convierte la primera letra de cada palabra en mayúsculas, y el resto en minúscula.
  • Atención: Usar una función de conversión dentro de la cláusula WHERE puede ser altamente ineficiente porque si la columna afectada forma parte de un índice éste lo desactiva, provocando un bajo rendimiento.


Funciones manipulación caracteres

  • CONCAT: Concatena dos valores.
  • SUBSTR: Extrae una subcadena.
  • LENGTH: Devuelve la longitud de la cadena.
  • INSTR: Devuelve la posición de un carácter o subcadena.
  • LPAD: Justifica a la derecha la cadena.
  • RPAD: Justifica a la izquierda la cadena.


Funciones Numéricas

  • ROUND (columna | expresión, n)
    • Redondea a n posiciones decimales. Si se omite n, no se redondea con decimales. Si n es negativo, los números a la izquierda del punto decimal se redondean a decenas, centenas, ...
  • TRUNC (columna | expresión, n)
    • Trunca en la enésima posición decimal. Si se omite n, sin lugares decimales. Si n es negativo, los números a la izquierda del punto decimal se truncan a cero.
  • MOD (m, n)
    • Devuelve el resto de la división de m por n.


Ejemplos de funciones numéricas

  • SQL> SELECT ROUND(45.923, 2), ROUND(45.923, 0), ROUND(45.923, -1)
    FROM SYS.DUAL;
  • Resultado: 45.92   46   50
  • SQL> SELECT TRUNC(45.923, 2), TRUNC(45,923), TRUNC(45.923, -1)
    FROM SYS.DUAL;
  • Resultado: 45.92   45   40


Trabajando con fechas

  • Oracle almacena fechas en un formato numérico interno de 7 bytes:
    • Siglo, año, mes, día, horas, minutos, segundos
  • El formato de fecha por defecto es DD-MON-YY
  • SYSDATE es una función que devuelve fecha y hora (pseudocolumna del sistema)
  • DUAL es una tabla virtual de la bd., que puede ser usada para inspeccionar SYSDATE.


Operadores aritméticos de fechas

  • Sumar o restar un número a/o de una fecha da por resultado una fecha.
  • Restar dos fechas para encontrar la cantidad de días entre esas fechas.
  • Sumar horas a una fecha dividiendo la cantidad de horas por 24.


Funciones de Fecha (I)

  • MONHTS_BETWEEN (fecha1, fecha2)
    • Número de meses entre dos fechas. El resultado puede ser positivo o negativo.
  • ADD_MONTHS (fecha, n)
    • Añade n meses a fecha, según calendario. N debe de ser un número entero y puede ser negativo.
  • NEXT_DAY (fecha, ‘caracter’)
    • Devuelve la fecha del día especificado (‘carácter’) siguiente a fecha. Carácter puede ser un número representando un día o una cadena de caracteres, p.ej. ‘FRIDAY’.


Funciones de Fecha (II)

  • LAST_DAY (fecha)
    • Devuelve la fecha del último día del mes que contiene fecha.
  • ROUND (fecha [,’fmt’])
    • Cuando no se especifica ningún formato, devuelve la fecha del primer día del mes contenido en fecha. Si fmt=YEAR, encuentra el primer día del año.
  • TRUNC (fecha [,’fmt’])
    • Devuelve la fecha con la porción del día truncado en la unidad especificada por el modelo de formato fmt. Si se omite el formato, laf echa se trunca en el día más próximo.


Ejemplos funciones de fecha

  • MONTS_BETWEEN (‘01-SEP-95’, ‘11-JAN-94’)  19.6774194
  • ADD_MONTHS(‘11-JAN-94’, 6)  ‘11-JUL-94’
  • NEXT_DAY (‘01-SEP-95’, ‘FRIDAY’)  ‘08-SEP-95’
  • LAST_DAY (‘01-SEP-95’)  ‘30-SEP-95’
  • ROUND (‘25-JUL-95’, ‘MONTH’)  ‘01-AUG-95’
  • ROUND (‘25-JUL-95’, ‘YEAR’)  ‘01-JAN-96’
  • TRUNC (‘25-JUL-95’, ‘MONTH’)  ‘01-JUL-95’
  • TRUNC (‘25-JUL-95’, ‘YEAR’)  ‘01-JAN-95’


Formatos de Fecha (I)

  • YYYY / YEAR
    • Año completo en número / Año en letras
  • MM / MONTH
    • Nº del mes con dos dígitos / Nombre completo del mes
  • DY / DAY
    • Día de la semana en tres letras / Nombre completo del día
  • fm (fill mode)
    • Elimina los espacios en blanco de relleno o suprime ceros a la izquierda


Formatos de Fecha (II)

  • Obtención de la hora:
    • HH / HH12 / HH24
      • Hora del día / Hora (1-12) / Hora (1-24)
    • MI / SS / SSSS
      • Minutos / Segundos / Segundos después de medianoche
    • AM o PM
      • Indicador del Meridiano
    • Sufijo SP / SPTH o THSP
      • Deletreo del número / Deletreo números ordinales
    • Se permiten literales


Funciones de conversión (I)

  • La conversión de tipos de datos puede ser:
    •  
      • IMPLÍCITA: Realizada automáticamente por Oracle
      • EXPLÍCITA: El usuario es quien la realiza
  • Conversión Implícita de datos
    •  
      • De VARCHAR2 o CHAR  a NUMBER
      • De VARCHAR2 o CHAR  a DATE
      • De NUMBER  a VARCHAR2
      • De DATE  a VARCHAR2
    • Estas conversiones se realizan por asignaciones, si Oracle 8 puede convertir el tipo de dato del valor utilizado en la asignación en el tipo de dato que era el objetivo de la asignación.


Funciones de conversión (II)

  • TO_CHAR (número | fecha [,’fmt’])
    • Convierte un número o fecha en una cadena de caracteres VARCHAR2 con el modelo de formato fmt.
      • 9: Representa un número
      • 0: Fuerza a que se muestra el cero
      • $: Signo de dólar
      • L: Usa el signo de moneda local
      • .: Imprime el punto decimal
      • ;: Imprime el indicador de millar
      • Para fechas, los fmt anteriores.


Funciones de conversión (III)

  • TO_NUMBER (char)
    • Convierte una cadena de caracteres con dígitos en un número.
  • TO_DATE (char [,’fmt’])
    • Convierte una cadena de caracteres representando una fecha en un valor de fecha según el fmt especificado. Si se omite el fmt, el formato es DD-MON-YY.
  • NVL (expr1, expr2)
    • Convierte un nulo (expr1) a un valor de tipo fecha, cadena o número (expr2).


DECODE

  • Hace las veces de sentencia CASE o IF-THEN-ELSE, para facilitar consultas condicionales.
    • Descifra una expresión después de compararla con cada valor de búsqueda. Si la expresión es la misma que la búsqueda, se devuelve el resultado. Si se omite el valor por defecto, se devolverá un valor nulo donde una búsqueda no coincida con ninguno de los valores resultantes.


Uso de DECODE

  • SQL> SELECT job, sal,
    DECODE (job, ‘ANALYST’, sal*1.1, ‘CLERK’, sal*1.15, ‘MANAGER’, sal*1.20, sal) AS “Nuevo salario”
    FROM emp;
  • Si job = ‘ANALYST ‘ entonces el salario se incrementa en un 10%
  • Si job = ‘CLERK’ entonces se incrementa en un 15%
  • Si jog = ‘MANAGER’ entonces se incrementa en un 20%
  • Para otro caso, entones no hay incremento de salario

Funcionamiento de "JOIN"

Definicion: 

La sentencia join en SQL permite combinar registros de dos o más tablas en una base de datos relacional. En el Lenguaje de Consultas Estructurado (SQL), hay tres tipo de JOIN: interno, externo, y cruzado.

En casos especiales una tabla puede unirse a sí misma, produciendo una auto-combinación, SELF-JOIN.

Matemáticamente, JOIN es composición relacional, la operación fundamental en el álgebra relacional, y generalizando es una función de composición.

 

Ejemplo:

 

Customers:

CustomerIDFirstNameLastNameEmailDOBPhone
1JohnSmithJohn.Smith@yahoo.com2/4/1968626 222-2222
2StevenGoldfishgoldfish@fishhere.net4/4/1974323 455-4545
3PaulaBrownpb@herowndomain.org5/24/1978416 323-3232
4JamesSmithjim@supergig.co.uk20/10/1980416 323-8888

 

Sales:


CustomerIDDateSaleAmount
25/6/2004$100.22
15/7/2004$99.95
35/7/2004$122.95
35/13/2004$100.00
45/22/2004$555.55

As you can see those 2 tables have common field called CustomerID and thanks to that we can extract information from both tables by matching their CustomerID columns.

Consider the following SQL statement:


SELECT Customers.FirstName, Customers.LastName, SUM(Sales.SaleAmount) AS SalesPerCustomer
FROM Customers, Sales
WHERE Customers.CustomerID = Sales.CustomerID
GROUP BY Customers.FirstName, Customers.LastName 

The SQL expression above will select all distinct customers (their first and last names) and the total respective amount of dollars they have spent. 
The SQL JOIN condition has been specified after the SQL WHERE clause and says that the 2 tables have to be matched by their respective CustomerID columns.

Here is the result of this SQL statement:

FirstNameLastNameSalesPerCustomers
JohnSmith$99.95
StevenGoldfish$100.22
PaulaBrown$222.95
JamesSmith$555.55

The SQL statement above can be re-written using the SQL JOIN clause like this:


SELECT Customers.FirstName, Customers.LastName, SUM(Sales.SaleAmount) AS SalesPerCustomer
FROM Customers JOIN Sales
ON Customers.CustomerID = Sales.CustomerID
GROUP BY Customers.FirstName, Customers.LastName 

There are 2 types of SQL JOINS – INNER JOINS and OUTER JOINS. If you don't put INNER or OUTER keywords in front of the SQL JOIN keyword, then INNER JOIN is used. In short "INNER JOIN" = "JOIN" (note that different databases have different syntax for their JOIN clauses).

The INNER JOIN will select all rows from both tables as long as there is a match between the columns we are matching on. In case we have a customer in the Customers table, which still hasn't made any orders (there are no entries for this customer in the Sales table), this customer will not be listed in the result of our SQL query above.

If the Sales table has the following rows:

CustomerIDDateSaleAmount
25/6/2004$100.22
15/6/2004$99.95

And we use the same SQL JOIN statement from above:


SELECT Customers.FirstName, Customers.LastName, SUM(Sales.SaleAmount) AS SalesPerCustomer
FROM Customers JOIN Sales
ON Customers.CustomerID = Sales.CustomerID
GROUP BY Customers.FirstName, Customers.LastName 

We'll get the following result:

FirstNameLastNameSalesPerCustomers
JohnSmith$99.95
StevenGoldfish$100.22

Even though Paula and James are listed as customers in the Customers table they won't be displayed because they haven't purchased anything yet.

But what if you want to display all the customers and their sales, no matter if they have ordered something or not? We’ll do that with the help of SQL OUTER JOIN clause.

The second type of SQL JOIN is called SQL OUTER JOIN and it has 2 sub-types called LEFT OUTER JOIN and RIGHT OUTER JOIN.

The LEFT OUTER JOIN or simply LEFT JOIN (you can omit the OUTER keyword in most databases), selects all the rows from the first table listed after the FROM clause, no matter if they have matches in the second table.

If we slightly modify our last SQL statement to:


SELECT Customers.FirstName, Customers.LastName, SUM(Sales.SaleAmount) AS SalesPerCustomer
FROM Customers LEFT JOIN Sales
ON Customers.CustomerID = Sales.CustomerID
GROUP BY Customers.FirstName, Customers.LastName 

and the Sales table still has the following rows:

CustomerIDDateSaleAmount
25/6/2004$100.22
15/6/2004$99.95

The result will be the following:

FirstNameLastNameSalesPerCustomers
JohnSmith$99.95
StevenGoldfish$100.22
PaulaBrownNULL
JamesSmithNULL

As you can see we have selected everything from the Customers (first table). For all rows from Customers, which don’t have a match in the Sales (second table), the SalesPerCustomer column has amount NULL (NULL means a column contains nothing).

The RIGHT OUTER JOIN or just RIGHT JOIN behaves exactly as SQL LEFT JOIN, except that it returns all rows from the second table (the right table in ourSQL JOIN statement).

 

COPYRIGHT

 IMPORTANTE:

 

La OIT se reserva los derechos de autor de la información presentada en este BLOG, salvo que se indique otra cosa.

La informaciòn que coloque de autoria propia tendra que ser autorizada, bajo las siguientes normas descritas en:


http://www.ilo.org/public/spanish/disclaim/reqcopyr.htm

 

Autorizaciones

1. Publicaciones de la OIT: Si desea solicitar autorización para copiar, traducir o reproducir el material de la OIT contenido en este sitio Web, ya sea con fines comerciales o no comerciales, complete el formulario "Solicitud de autorización para reproducir el material de la OIT protegido por los derechos de autor". Su solicitud será bien acogida. Si se trata de la Revista Internacional del Trabajo, sírvase enviar su solicitud a revue@ilo.org.

2. Fotografías de la OIT: Al reproducir las fotografías de la OIT se deberá hacer mención a la OIT y al fotógrafo. Las fotografías deberán utilizarse de forma que se respete la dignidad humana sin causar perjuicio a ninguna parte. Los usuarios de Internet, incluidos los periodistas y las ONG, que deseen obtener fotografías o diapositivas destinadas a la publicación (fototeca de la OIT) deberán rellenar el formulario "Solicitud de autorización para reproducir fotografías de la OIT", identificar su publicación y describir el contexto en el que se reproducirá la fotografía.

3. El logotipo (emblema) y el nombre de la OIT: La utilización del logotipo (emblema) y del nombre de la OIT está restringida y sólo se autoriza en casos excepcionales. Para ellos, sírvase completar el formulario "Solicitud de autorización para reproducir el emblema o el nombre de la OIT."

4. Información Pública de la OIT: Los comunicados y el material de prensa del sitio de la Oficina de Información Pública pueden reproducirse gratuitamente. También pueden publicarse los textos de la revista Trabajo, siempre y cuando se mencione la fuente.

Enlaces con otros sitios Web

Si bien la OIT fomenta los enlaces recíprocos con otros sitios de Internet, a fin de dar más visibilidad a unos y otros, estos enlaces no crean una responsabilidad de la OIT ni implican que la OIT apruebe la información contenida en dichos sitios.

Restricción y Ordenación de Datos

En este capitulo trataremos todo lo relacionado a:

  • Limitacion de Filas recuperadas por una consulta
  • Ordenación de Filas recuperadas por una consulta

 

1. Limitación Filas Seleccionadas

• Restrinja las filas devueltas utilizando la cláusula
WHERE.
• La cláusula WHERE sigue a la cláusula FROM.
SELECT *|{[DISTINCT] column|expression [alias],...}
FROM table
[WHERE condition(s)];

 

 

2. Uso de la Cláusula WHERE



SELECT employee_id, last_name, job_id, department_id
FROM employees
WHERE department_id = 90 ;


 

3.Cadenas de Caracteres y Fechas


• Las cadenas de caracteres y los valores de fechas se
escriben entre comillas simples.
• Los valores de caracteres son sensibles a
mayúsculas/minúsculas y los de fecha, al formato.
• El formato de fecha por defecto es DD-MON-RR.
SELECT last_name, job_id, department_id
FROM employees
WHERE last_name = ’Whalen’;


 

4. Condiciones de Comparación



Operadores: (=, >, >=, <, <=, <>)
Significado: (Igual que, Mayor que, Mayor o igual que, Menor que, Menor o igual que).

SELECT last_name, salary
FROM employees
WHERE salary <= 3000;

 

5.Condiciones de Comparación


Operador                    Significado


BETWEEN
...AND...     (Entre dos valores (ambos inclusive),
IN(set)       (Coincide con cualquiera de una lista de valores)
LIKE           (Coincide con un patrón de caracteres)
IS NULL      (Es un valor nulo).

Ejemplo:  SELECT last_name, salary
              FROM employees
             WHERE salary BETWEEN 2500 AND 3500;


 

6. Uso de Condición IN



SELECT employee_id, last_name, salary, manager_id
FROM employees
WHERE manager_id IN (100, 101, 201);


 

7. Uso de Condición Like


SELECT first_name
FROM employees
WHERE first_name LIKE ’S%’;

Puede utilizar el identificador ESCAPE para buscar los
símbolos % y _ reales.

 

8. Uso de condiciones NULL


SELECT last_name, manager_id
FROM employees
WHERE manager_id IS NULL;

 

9. Condiciones Logicas


Operador                       Significado
   AND             Devuelve TRUE si las dos condiciones
                      componentes son verdaderas.
    OR              Devuelve TRUE si alguna de las
                      condiciones componentes es verdadera.
   NOT             Devuelve TRUE si alguna de las
                      condiciones componentes es verdadera.

 


10. Uso del Operador AND


SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary >=10000
AND job_id LIKE ’%MAN%’;

 

11. Uso del Operador OR


SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary >= 10000
OR job_id LIKE ’%MAN%’;

 

12. Uso del Operador NOT


SELECT last_name, job_id
FROM employees
WHERE job_id
NOT IN (’IT_PROG’, ’ST_CLERK’, ’SA_REP’);


 

13. Clausula Order By


Ordene filas con la cláusula ORDER BY
– ASC: orden ascendente, por defecto
– DESC: orden descendente
• La cláusula ORDER BY aparece en último lugar en la sentencia SELECT.

SELECT last_name, job_id, department_id, hire_date
FROM employees
ORDER BY hire_date ;


 

Ejemplo 2: SELECT last_name, job_id, department_id, hire_date
                FROM employees
                ORDER BY hire_date DESC ;

 

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

EJERCICIOS


select sysdate as fecha
from dual ;

seleccione los campoy y al salario increntelo con el 15% y redondee el salariy

select employee_id, last_name, salary as salario,round (salary*0.15) as "new salary"
from employees;

Agrege una columba con  el inbremento del salaro

select employee_id, last_name, salary as salario,(salary +(salary*0.15)) as "nuevo salario ", (salary*0.15) as incremento  
from employees;

Muestre el aplellido la primera en mayuscual y las demas en minusculas y muestre su tamaño de caracteres de los  empleados q inician con A, J, M

select INITCAP (last_name), length (last_name) as tamaño  
from employees  
where last_name like ’J%’ or last_name like ’A%’ or last_name like ’M%’;

Muestra los empleados contradados desde la fecha de inicio hasta hoy em meses

select last_name,  trunc (months_between  (sysdate , hire_date)) as "meses trabajados"
from employees;

Concatene con || el apellido el salario y la frace pero le gustaria ganar y multiplique el salario por 3

select last_name || ’ gana $’||salary || ’ ’||’pero le gustaria ganar’|| ’ $’ || (salary*3) as "salario soñado"
from employees;

Muestra el apellido, el salario formateado con * hasta completar 15 caracteres.

select last_name, lpad (salary, 15, ’*’)
from employees;

select last_name, hire_date,to_char ( next_day( add_months (hire_date, 6),’lunes’), ’fmday ",the" ddspth "of" month "," yyyy’)
from employees;

select last_name, hire_date, day hire_date
from employees;