SQL Plus Oracle
SQL Plus Oracle
SQL Plus Oracle
SQL-Plus
INDICE DE CONTENIDO
ACCESO Y VISUALIZACIN DE DATOS
EL MODELO RELACIONAL
VISIN GENERAL DE SQL
SQL CONTRA SQL*PLUS
Comandos SQL
Uso los comandos de SQL*Plus para
VISIN GENERAL DEL INICIO DE UNA SESIN SQL
ACCESO A LA AYUDA
VISTAZO DE LA SENTENCIA SELECT
SELECCIN DE COLUMNAS
SELECCIN DE FILAS
VER EL DICCIONARIO DE DATOS
Nombre de tabla
Descripcin
EDICIN DEL BUFFER DE SQL-PLUS
EJECUCIN DE OPERACIONES SOBRE TIPOS DE DATOS Y FUNCIONES
VISTAZO A LOS VALORES Y FUNCIONES NUMRICOS
REFERENCIA DE LOS VALORES Y FUNCIONES NUMRICOS
VISTAZO A LOS VALORES Y FUNCIONES DE FECHA
REFERENCIA DE LOS VALORES Y FUNCIONES DE FECHA
REFERENCIA DE LOS VALORES Y FUNCIONES DE CARACTERES
VISIN GENERAL DE ALGUNAS FUNCIONES ADICIONALES
REFERENCIA DE ALGUNAS FUNCIONES ADICIONALES
VISTAZO A LAS FUNCIONES DE GRUPO
OBTENIENDO DATOS DE MULTIPLES TABLAS
CARACTERSTICAS DEL JOIN
TIPOS DE JOIN [EQUIJOIN, OUTER JOIN , SEF-JOINS ]
NON-EQUIJOINS
OPERADORES DE CONJUNTO
EL OPERADOR UNION
EL OPERADOR INTERSECCIN (INTERSECT)
EL OPERADOR MENOS (MINUS
VISIN GENERAL DE LA CREACIN DE TABLAS
CREACIN DE TABLAS
RESTRICCIONES
MODIFICACIN DE TABLAS
Borrar la tabla original
CREACIN DE VISTAS
VISTAZO AL ACCESO DE TABLAS Y VISTAS
UN VISTAZO A LA CONCESIN DE ACCESO A TABLAS Y VISTAS
VISIN GENERAL DE LOS SINNIMOS
CREACIN DE SINNIMOS
VISIN GENERAL SOBRE LOS NDICES
CREACIN DE NDICES
CREACIN DE GENERADORES DE SECUENCIA
INSERCIN DE FILAS
ACTUALIZACIN DE FILAS
ELIMINACIN DE FILAS
UN VISTAZO AL PROCESAMIENTO DE TRANSACCIONES
PROCESAMIENTO DE TRANSACCIONES
Acceso y visualizacin de los datos
Modo relacional. La informacin se organiza en forma de tablas
Tabla EMP
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7369 SMITH RECEPCIONISTA 7902
17/12/1995
800 20
7499 ALLEN VENDEDOR 7698
20/02/1996
1600 300 30
7521 WARD VENDEDOR 7698
22/02/1996
1250 500 30
7566 JONES GERENTE 7839
02/04/1996
2975 20
7654 MARTIN VENDEDOR 7698
28/07/1996
1250 1400 30
7698 BLAKE GERENTE 7839
31/05/1996
2850 30
7782 CLARK GERENTE 7839
09/06/1996
2450 10
7788 SCOTT ANALISTA 7566
09/12/1997
3000 20
7839 KING PRESIDENTE
17/11/1996
5000 10
7844 TURNER VENDEDOR 7698
08/11/1996
1500 0 30
7876 ADAMS RECEPCIONISTA 7788
12/01/1998
1100 20
7900 JAMES RECEPCIONISTA 7698
03/12/1996
950 30
7902 FORD ANALISTA 7566
03/12/1996
3000 20
7934 MILLER RECEPCIONISTA 7782
23/01/1998
1300 10
Cada columna tiene un tipo de informacin y cada fila est compuesta de columnas que contienen un
nico valor. Ejemplo: La columna SAL en la fila del empleado SMITH tiene el valor de 800
Las categoras de informacin se listan en la parte de arriba de cada tabla.
LA INFORMACIN DE UNA TABLA PUEDE RELACIONARSE CON LA INFORMACIN QUE SE ENCUENTRA EN OTRA.
Tabla DEPT
DEPTNO DNAME LOC
10 FINANZAS NEW YORK
20 INVESTIGACION DALLAS
30 VENTAS CHICAGO
40 OPERACIONES BOSTON
Visin General de SQL
SQL plus es una herramienta diseada para usar con ORACLE, la cual extiende las capacidades del estndar
ANSI-SQL
SQL contra SQL*Plus
SQL Es un lenguaje que consiste en comandos para guardar, recuperar, mantener y regular el
acceso a una base de datos.
SQL *Plus Es una aplicacin que reconoce y ejecuta comandos SQL y comandos especializados de
SQL*Plus que pueden personalizar reportes, proveer facilidades de ayuda y edicin, as como
mantener variables del sistema.
Con SQL se puede manipular y recuperar datos, asi como crear y modificar la estructura de los datos.
Funciones de los comandos SQL:
Consultas
Manipulacin de datos
Definicin de datos
Control de datos
Comandos SQL
ALTER DROP REVOKE AUDIT GRANT ROLLBACK
COMMENT INSERT SELECT COMMIT LOCK UPDATE
CREATE NO AUDIT VALIDATE DELETE RENAME
Use los comandos SQL* plus para manipular comandos SQL
Entrar, editar, recuperar y correr comandos SQL
Formatear, guardar, imprimir y realizar clculos sobre los resultados de una consulta en forma de reportes.
Listar la definicin de las columnas de cualquier tabla.
Acceder y copiar datos entre las bases de datos SQL
Enviar y aceptar mensajes de un usuario final
Comandos de SQL Plus.
@ (ejecutar) COPY QUIT / (ejecutar ultimo) DESCRIBE REMARK
ACCEPT DISCONNECT RUN APPEND EDIT SAVE
BREAK EXIT SET BTITLE GET SHOW
CHANGE HELP SPOOL CLEAR HOST SQLPLUS
COLUMN INPUT START COMPUTE LIST TIMING
CONNECT NEWPAGE TITLE UNDEFINE
COMANDOS
SQL> show user; --- ver con que usuario estoy trabajando
SQL> EXIT --- Cierra sesin.
SQL> connect [username[/password[@database]]] --- inicio de session SQL
SQL> HELP TOPICS --- Listado de todos los comandos de SQL Plus [Acceso a la Ayuda]
SQL> SELECT USERNAME FROM ALL_USERS; --- Para ver los usuarios existentes
----------------------------------------------------------------------------------------------------------------------------------
VISIN GENERAL DEL INICIO DE UNA SESIN SQL
El primer paso para abrir una sesin SQL es acceder a SQL-Plus
a) Interfaz Grafica
b) Desde la lnea de Comando
SQL> connect [username[/password[@database]]]
username = nombre_de_usuario
password = clave_de_acceso
@database = alias_de_la_base_de_datos
c) Cierre de sesin:
SQL> exit <ENTER>
Vistazo de la sentencia SELECT
Seleccionar informacin de una base de datos, es decir, hacer consultas, es una de las operaciones ms
comunes que se realizan sobre una base de datos.
tems de una RDBMS que pueden incluirse en una sentencia SELECT
Columnas
Expresiones
Constantes
Requerimientos mnimos para ejecutar una sentencia SELECT
El comando SELECT (indica que se va a consultar).
La palabra FROM (indica donde se va a realizar la consulta).
Seleccin de Columnas
Existen dos maneras distintas de visualizar todas las columnas de una tabla:
Digitando todos los nombres de columna separados por comas y la tabla donde esas columnas estn
definidas.
Digitar un asterisco y el nombre de la taba donde estn definidas las columnas.
Sintaxis:
EJEMPLO: Visualizar todas las columnas de informacin acerca de cada departamento.
Nota: se puede utilizar DESCRIBE para visualizar los nombres de columnas de una tabla.
EJEMPLO: Visualizar la estructura de la tabla DEPT
SELECT nombre_columna *, nombre_columna +
FROM nombre_tabla
SELECT *
FROM nombre_tabla
SQL> SELECT *
FROM dept;
DEPTNO DNAME LOC
------------- ------------------ ----------------
10 FINANZAS NEW YORK
20 INVESTIGACION DALLAS
30 VENTAS CHICAGO
40 OPERACIONES BOSTON
4 rows selected.
Name NULL? Type
------------ -------------- ----------------
DEPTNO NOT NULL NUMBER (2)
DNAME CHAR (14)
LOC CHAR (13)
SQL> DESCRIBE dept;
Ejemplo de columna nica: Para visualizar una columna especfica, entre el nombre de la columna en la
clusula SELECT y la tabla en la que est definida en la clusula FROM.
---------------------------------------------------------------------------------------------------------------------------------------------
Ejemplo de mltiples columnas: Visualizar el nombre y nmero de todos los departamentos
--------------------------------------------------------------------------------------------------------------------------------------------
DISTINCT. Con SQL se pueden quitar las filas duplicadas antes que los datos sean devueltos por la sentencia
SELECT con la clusula DISTINCT
------------------------------------------------------------------------------------------------------------------------------------------------------------------ ---------------------------------------------------------------------
EJEMPLO: Visualizar cada cargo de la tabla EMP de forma nica.
-----------------------------------------------------------------------------------------------------------------------------------------------
SQL> SELECT dname FROM dept;
DNAME
-----------------
FINANZAS
INVESTIGACION
VENTAS
OPERACIONES
4 rows selected.
DNAME DEPTNO
----------------- ------------------
FINANZAS 10
INVESTIGACION 20
VENTAS 30
OPERACIONES 40
SQL> SELECT dname, deptno FROM dept;
SELECT DISTINCT nombre_columna1 *, nombre_columna2+
FROM nombre_tabla
SQL> SELECT DISTINCT job FROM emp;
JOB
-----------------
ANALISTA
RECEPCIONISTA
GERENTE
PRESIDENTE
VENDEDOR
5 rows selected
ALIAS. Con SQL se pueden definir alias para los nombres de columnas en una sentencia SELECT
SQL> SELECT DISTINCT job JOB LIST FROM emp;
Nota: solo se puede hacer referencia a los alias de columna en la clusula SELECT de una consulta.
*****************************************************************************************
Seleccin de Filas
Para seleccionar filas especficas de una tabla, use la clusula WHERE para especificar una condicin.
Componentes de la condicin de bsqueda de la clausula WHERE
Nombre de columna, expresin o constante.
Operador de comparacin
Expresin, nombre de columna o constante
Notas rpidas:
Las constantes de cadena y de fecha deben encerrarse entre comillas simples.
Las constantes de carcter son sensibles a maysculas y minsculas y las consatantes de fecha deben
estar en el formato DD-MM-YY
Operadores de Comparacin
= Igual a
!= , <> Diferente que
> Mayor que
>= Mayor o igual que
< Menor que
<= Menor o igual que
Between and Entre dos valores
In (lista) Igual que algn miembro de la lista
Is null Es un valor nulo
like Concuerda con un patrn de caracteres
Seleccin de filas basadas en criterios de igualdad o desigualdad usando los operadores
=, <>, >=, <=, >, <.
JOB LIST
----------------
ANALISTA
RECEPCIONISTA
GERENTE
PRESIDENTE
VENDEDOR
5 rows selected
Sintaxis de la sentencia select
SELECT
FROM
WHERE
Ejemplo 1: Seleccionar el nmero, nombre y salario de los empleados en el departamento 30.
-----------------------------------------------------------------------------------------------------------------------------------------------
Ejemplo 2:
Mostrar el nombre, cargo y salario de todos los empleados, excepto los gerentes.
EJEMPLO 3:
Seleccin basada en un rango de valores usando el operador BETWEEN AND. Seleccionar el nmero, cargo y
el nmero de departamento de todos los empleados contratados entre Enero 1 de 1982 y enero 1 de 1983.
SQL> SELECT empno, ename, sal FROM emp where deptno = 30;
EMPNO ENAME SAL
------------ -------------- -------------
7499 ALLEN 1600
7521 WARD 1250
7654 MARTIN 1250
7698 BLAKE 2850
7844 TURNER 1500
7900 JAMES 950
6 rows selected.
SQL> SELECT ename, job, sal FROM emp where <> MANAGER;
EMPNO ENAME SAL
------------ -------------- -------------
SMITH CLERK 800
ALLEN SALESMAN 1600
WARD SALESMAN 1250
MARTIN SALESMAN 1250
SCOTT ANALYST 3000
KING PRESIDENT 5000
TURNER SALESMAN 1500
ADAMS CLERK 1100
JAMES CLERK 950
FORD ANALYST 3000
MILLER CLERK 1300
11 rows selected
SQL> SELECT ename, job, deptno, hiredate
FROM emp
WHERE hiredate BETWEEN 01/01/1982 AND 01/01/1983;
ENAME JOB DEPTNO HIREDATE
------------ -------- ------------ --------------
MILLER CLERK 10 23/01/1982
1 row selected
Ejemplo 4: Seleccin de filas basndose en la coincidencia con valores dentro de una lista, usando el
operador IN. Seleccionar el nombre, cargo y nmero de departamento de todos los empleados que son
recepcionistas y analistas.
----------------------------------------------------------------------------------------------------------------------------------------------------
Seleccin de Filas basndose en la coincidencia con un patrn de caracteres usando comodines con el
operador LIKE:
Comodines:
% coincidencias con cualquier cantidad de caracteres
_ coincidencia con un carcter
Ejemplo 1:
Seleccionar el nombre, cargo, nmero de departamento y fecha de contratacin para los empleados cuyo
apellido empiece con la letra mayscula M.
Ejemplo 2: Seleccionar el nombre, cargo, numero de departamento y fecha de contratacin para los empleados
cuyo apellido empiece con la letra mayscula J seguido de dos caracteres y que termine con ES.
SQL> SELECT ename, job, deptno FROM emp
WHERE job IN (CLERK, ANALYST);
ENAME JOB DEPTNO
------------ -------- ------------
SMITH CLERK 20
SCOTT ANALYST 20
ADAMS CLERK 20
JAMES CLERK 30
FORD ANALYST 20
MILLER CLERK 10
6 rows selected.
SQL> SELECT ename, job, deptno, hiredate FROM emp
where ename LIKE M%;
ENAME JOB DEPTNO HIREDATE
------------ -------------- ------------ --------------
MARTIN SALESMAN 30 28/SEP/1981
MILLER CLERK 10 23/JAN/1982
2 rows selected.
SQL> SELECT ename, job, deptno, hiredate FROM emp
where ename LIKE J__ES;
ENAME JOB DEPTNO HIREDATE
------------ -------------- ------------ --------------
JONES MANAGER 20 02/APR/1981
JAMES CLERK 30 03/DEC/1981
2 rows selected.
Use el operador NOT para hacer una condicin negativa junto con los operadores:
NOT BETWEEN AND
NOT IN (lista)
IS NOT NULL
NOT LIKE
Conecte operadores lgicos con expresiones lgicas complejas.
Expresiones lgicas
AND
OR
Cuando una condicin contiene ms de una expresin, el RDBMS evala cada expresin. Luego los resultados
de cada condicin se unen teniendo en cuenta la precedencia de los operadores de conexin.
Igual precedencia: =, <>, >=, <=, >, <, IN, LIKE, IS NULL, BETWEEN AND
Luego los operadores lgicos se evalan en el siguiente orden NOT, AND, OR.
-------------------------------------------------------------------------------------------------------------------------------------------
Ejemplo 1: Seleccionar el nombre, cargo y salario de los gerentes que ganen ms de $1500, al igual que el de
todos los vendedores.
Ejemplo 2: Seleccionar el nombre, cargo y salario de los gerentes y vendedores que ganen $1500 o ms.
SQL> SELECT ename, job, sal
FROM emp
WHERE sal > 1500 AND job = MANAJER OR job = SALESMAN;
ENAME JOB SAL
------------ ----------------- -------------
ALLEN SALESMAN 1600
WARD SALESMAN 1250
JONES MANAGER 2975
MARTIN SALESMAN 1250
BLAKE MANAGER 2850
CLARK MANAGER 2450
TURNER SALESMAN 1500
7 rows selected.
SQL> SELECT ename, job, sal FROM emp
WHERE sal >= 1500 AND (job = MANAJER OR job = SALESMAN);
ENAME JOB SAL
------------ -------- ------------
ALLEN SALESNAN 1600
JONES MANAGER 2975
BLAKE MANAGER 2850
CLARK MANAGER 2450
TURNER SALESMAN 1500
5 rows selected.
Salidas ordenadas de una consulta
Sintaxis de la sentencia SELECT
SELECT
FROM
WHERE
ORDER BY
ORDER BY puede ordenar:
En orden ascendente
En modo descendente
Por multiples columnas
Por la posicin de la columna
Ejemplo 1:
Ordenamiento ascendente, mostrar el salario, cargo y nombre de los empleados del departamento 10 en
orden ascendente, por salario.
Ejemplo 2:
Ordenamiento descendente. Mostrar el salario, cargo y nombre de los empleados del departamento 10 en
orden descendente, por salario.
Ejemplo 3: Ordenamiento por mltiples columnas. Mostrar el nombre, cargo y salario de los empleados en el
departamento 30. Ordene los resultados por cargo. Si hay ms de un empleado con el mismo cargo, ordnelos
por salario en orden descendente y finalmente por apellido.
SAL JOB ENAME
----- ------------- ------------
JAMES CLERK 950
BLAKE MANAGER 2850
ALLEN SALESMAN 1600
TURNER SALESMAN 1500
MARTIN SALESMAN 1250
WARD SALESMAN 1250
6 rows selected
SQL> SELECT ename, job, sal FROM emp WHERE deptno =30 ORDER BY job, sal DESC ename;
SAL JOB ENAME
-------------- ------------ ------------
1300 CLERK MILLER
2450 MANAGER CLARK
5000 PRESIDENT KING
3 rows selected
SQL> SELECT sal, job, ename
FROM emp WHERE deptno =10 ORDER BY sal;
SQL> SELECT sal, job, ename
FROM emp WHERE deptno =10 ORDER BY sal DESC;
Ejemplo 4:
Ordenamiento por posicin de columna. Muestre el nombre, salario y cargo de los empleados del
departamento 10 en orden ascendente por salario.
-------------------------------------------------------------------------------------------------------------------------------------------------
VER EL DICCIONARIO DE DATOS
El diccionario de datos es un conjunto de tablas y vistas que contiene informacin descriptiva acerca de las
tablas, privilegios de acceso de los usuarios, y dems caractersticas de la base de datos.
Tablas de usuario que se consultan frecuentemente en el diccionario de datos
Nombre de tabla Descripcin
user_catalog Tablas, vistas, sinnimos, secuencias y otros objetos de propiedad del usuario
user_constraints Informacin acerca de las restricciones en las tablas del usuario
user_indexes Descripcin de los ndices del usuario
user_sequences Descripcin de las secuencias del usuario
user_synonyms Descripcin de los sinnimos del usuario
user_tables Descripcin de las tablas del usuario
user_users Informacin acerca del usuario actual
user_views Informacin acerca de las vistas del usuario
all_tables Descripcin de todas las tablas accesibles por el usuario
Ejemplo: USER_TABLES: Mostrar una columna del diccionario de datos user_tables:
---------------------------------------------------------------------------------------------------------------------------------------------------
ENAME SAL JOB
-------------- ---------- -------------------
MILLER 1300 CLERK
CLARK 2450 MANAGER
KING 5000 PRESIDENT
3 rows selected.
SQL> SELECT ename, sal, job
FROM emp
WHERE deptno = 10
ORDER BY 2;
SQL> SELECT table_name
FROM user_tables;
TABLE_NAME
--------------------
DEPT
EMP
SALGRADE
3 rows selected.
EDICIN DEL BUFFER DE SQL-PLUS
La edicin del buffer de SQL-Plus se realiza con comandos de SQL-Plus:
Comando Descripcin
A[PPEND] Adiciona texto especfico a la lnea actual en el buffer
C[HANGE] Cambia la primera ocurrencia de un texto especfico en la lnea actual del buffer por
una cadena especificada. Ejemplo: C / ENP / EMP
CL[EAR] BUFFER
CLE[AR] BUFFER
Borra el contenido del buffer
DEL Borra el contenido de la lnea actual del buffer
I[NPUT] Adiciona una o ms lneas de texto despus de la lnea actual del buffer.
Presione <ENTER> en una lnea en blanco para salir del modo INPUT
L[IST] Lista todas las lneas del buffer
L[IST] n Lista la lnea nmero n del buffer
R[UN] Muestra y ejecuta el contenido del buffer
/ Ejecuta el contenido del buffer
n Fija el puntero del buffer en la lnea n
n <cadena de texto> Cambia el contenido de la lnea n por la cadena de texto especificada
Nota rpida: Un asterisco (*) aparecer al lado del nmero de lnea actual del buffer
Ejemplos: Reescribir la lnea 2 cuando ocurre un error:
Fijar el puntero del buffer en la lnea 1. Cambiar SAL por DEPTNO:
Visin general de la creacin de tablas
SQL> SELECT ename, job, sal
FRO emp
WHERE deptno = 30;
ERROR at line 2:
ORA-00923: FROM keyword not found where expected
SQL> 2 FROM emp
SQL> /
ENAME JOB SAL
------------- ---------------- -------------
ALLEN SALESMAN 1600
WARD SALESMAN 1250
MARTIN SALESMAN 1250
BLAKE MANAGER 2850
TURNER SALESMAN 1500
JAMES CLERK 950
6 rows selected.
SQL> 1
1* SELECT ename, job, sal
SQL> C / sal / deptno
1* SELECT ename, job, deptno
SQL> /
Agregar la columna HIREDATE en la lnea actual usando el comando APPEND:
Borrar la lnea 3:
ENAME JOB DEPTNO
------------- ---------------- -------------
ALLEN SALESMAN 30
WARD SALESMAN 30
MARTIN SALESMAN 30
BLAKE MANAGER 30
TURNER SALESMAN 30
JAMES CLERK 30
6 rows selected.
SQL> 1
1* SELECT ename, job, deptno
SQL> A , hiredate
1* SELECT ename, job, deptno, hiredate
SQL> /
ENAME JOB DEPTNO HIREDATE
------------- ---------------- ------------- ---------------
ALLEN SALESMAN 30 20-FEB-81
WARD SALESMAN 30 22-FEB-81
MARTIN SALESMAN 30 28-SEP-81
BLAKE MANAGER 30 31-MAY-81
TURNER SALESMAN 30 08-SEP-81
JAMES CLERK 30 03-DEC-81
6 rows selected.
SQL> 3
3* WHERE deptno = 30
SQL> del
SQL> /
ENAME JOB DEPTNO HIREDATE
------------- ---------------- ------------- ---------------
SMITH CLERK 20 17-DEC-80
ALLEN SALESMAN 30 20-FEB-81
WARD SALESMAN 30 22-FEB-81
JONES MANAGER 20 02-APR-81
.
ADAMS CLERK 20 12-JAN-83
JAMES CLERK 30 03-DEC-81
FORD ANALYST 20 03-DEC-81
MILLER CLERK 10 23-JAN-82
14 rows selected.
EJECUCIN DE OPERACIONES SOBRE TIPOS DE DATOS Y FUNCIONES
VISTAZO A LOS VALORES Y FUNCIONES NUMRICOS
Realice clculos varios sobre nmeros usando los siguientes operadores aritmticos:
+ Suma
- Resta
* Multiplicacin
/ Divisin
( ) Parntesis anular precedencia
Los operadores aritmticos pueden ser usados en la mayora de sentencias SQL.
REFERENCIA DE LOS VALORES Y FUNCIONES NUMRICOS
Muestre el resultado de los clculos como si fueran columnas con expresiones aritmticas en sentencias
SELECT.
Ejemplo: expresiones en sentencias SELECT. Muestre el nombre, salario, comisin y la compensacin total
para todos los vendedores cuya comisin es mayor que el 25% de su salario.
Una fila sin valor en una columna, se dice que contiene un valor NULO.
SQL> SELECT ename, sal, comm, sal + comm
2 FROM emp
3 WHERE job = SALESMAN AND comm > 0.25 * sal
4 ORDER BY 4;
ENAME SAL COMM SAL+COMM
-------------- -------------- --------------- ---------------
WARD 1250 500 1750
MARTIN 1250 1400 2650
2 rows selected.
SQL> DESCRIBE emp;
Name Null? Type
--------------------- ---------------- ----------------------
EMPNO NOT NULL NUMBER (4)
ENAME CHAR (10)
JOB CHAR (9)
MGR NUMBER (4)
HIREDATE DATE
SAL NUMBER (7, 2)
COMM NUMBER (7, 2)
DEPTNO NOT NULL NUMBER (2)
Cuando una expresin o funcin individual hace referencia a una columna que contiene un valor nulo, el
resultado es tambin nulo.
Ejemplo: Muestre el nombre, cargo, salario, comisin y compensacin total de los empleados del
departamento 30.
Convierta un valor nulo en uno no-nulo con el propsito de evaluar una expresin con la funcin NVL
Cuando NVL evala la primera expresin, si esta es no-nula, retorna dicha expresin; en caso contrario, retorna
la segunda.
Sintaxis:
Ejemplo: Muestre el nombre de empleado, cargo, salario, comisin y compensacin total de los empleados del
departamento 30.
SQL> SELECT ename, job, sal, comm, sal + comm
2 FROM emp
3 WHERE deptno = 30;
ENAME JOB SAL COMM SAL+COMM
-------------- -------------------- -------------- -------------- --------------------
ALLEN SALESMAN 1600 300 1900
WARD SALESMAN 1250 500 1750
JONES SALESMAN 2975
MARTIN SALESMAN 1250 1400 2650
BLAKE MANAGER 2850
SCOTT SALESMAN 3150
TURNER SALESMAN 1500 0 1500
JAMES CLERK 950
8 rows selected.
NVL (expr1, expr2)
SQL> SELECT ename, job, sal, comm, NVL(sal, 0) + NVL(comm, 0)
2 FROM emp
3 WHERE deptno = 30;
ENAME JOB SAL COMM NVL(SAL, 0)+NVL(COMM, 0)
-------------- -------------------- -------------- -------------- -------------------------------------------
ALLEN SALESMAN 1600 300 1900
WARD SALESMAN 1250 500 1750
JONES SALESMAN 2975 2975
MARTIN SALESMAN 1250 1400 2650
BLAKE MANAGER 2850 2850
SCOTT SALESMAN 3150 3150
TURNER SALESMAN 1500 0 1500
JAMES CLERK 950 950
8 rows selected.
El RDMBS evala cada expresin aritmtica. Los resultados de las expresiones se combinan luego en el orden
determinado por la precedencia de los operadores.
Orden de evaluacin
* Multiplicacin
/ Divisin
+ Suma
- Resta
Para anular la precedencia de los operadores, coloque parte de la expresin entre parntesis. ORACLE evala
estas expresiones primero.
Ejemplo: Muestre el nombre de empleado, salario, comisin y compensacin total para todos los vendedores
ordenado por compensacin total.
Las funciones numricas aceptan una entrada numrica y retornan valores numricos
Ejemplo: funcin ROUND
Liste el nombre, salario mensual, salario diario (basado en un mes laboral de 22 das) y el salario diario
redondeado al prximo entero para los empleados ALLEN y JONES.
SQL> SELECT ename, sal, comm, 12 * (sal + comm) total
2 FROM emp
3 WHERE job = SALESMAN
4 ORDER BY 12 * (sal + comm);
ENAME SAL COMM TOTAL
-------------- -------------- -------------- ------------
TURNER 1500 0 18000
WARD 1250 500 21000
ALLEN 1600 300 22800
MARTIN 1250 1400 31800
JONES 2975
SCOTT 3150
6 rows selected.
SQL> SELECT ename, sal, sal / 22, ROUND (sal / 22, 0)
2 FROM emp
3 WHERE ename IN (ALLEN, JONES);
ENAME SAL SAL / 22 ROUND(SAL / 22, 0)
-------------- -------------- --------------- ----------------------------
ALLEN 1600 72.7272727 73
JONES 2975 135.227273 135
2 rows selected.
FUNCIN EJEMPLO RESULTADO
MOD MOD (7, 5) El residuo de dividir 7 entre 5
SQRT SQRT (25) La raz cuadrada de 25
ROUND ROUND (SAL, 2) El salario, redondeado a dos dgitos despus del punto decimal.
TRUNC TRUNC (SAL, 2) El salario, truncado a dos dgitos despus del punto decimal.
POWER POWER (SAL, 3) El salario, elevado a la tercera potencia.
VISTAZO A LOS VALORES Y FUNCIONES DE FECHA
REFERENCIA DE LOS VALORES Y FUNCIONES DE FECHA
Use operaciones aritmticas simples en sentencias SQL para efectuar clculos sobre fechas en las bases
de datos.
Fecha + nmero Suma un nmero de das a una fecha, produciendo otra fecha.
Fecha nmero Resta un nmero de das a una fecha, produciendo otra fecha.
Fecha Fecha Resta una fecha de otra, produciendo el nmero de das entre las dos.
Ejemplo: Mostrar el nombre, fecha de contratacin y fecha de vencimiento del perodo de prueba (90 das) de
los empleados en el departamento 10
FUNCIN RESULTADO
ADD_MONTHS (HIREDATE, 6) Devuelve la fecha 6 meses despus de HIREDATE
ADD_MONTHS (HIREDATE, -6)
LAST_DAY (HIREDATE) Devuelve el ltimo da del mes que contiene HIREDATE
NEXT_DAY (HIREDATE,
FRIDAY)
Devuelve la fecha del siguiente viernes despus de HIREDATE
SYSDATE Devuelve la fecha y hora actual
MONTHS_BETWEEN
(SYSDATE, HIREDATE)
Devuelve la cantidad de meses transcurridos entre HIREDATE y la fecha actual.
GREATEST(HIREDATE,
SYSDATE)
Devuelve la fecha ms tarda de una lista de fechas
LEAST(FECHA1, FECHA2...) Devuelve la fecha ms temprana de una lista de fechas
SQL> SELECT ename, hiredate, hiredate + 90 $REVIEW$
2 FROM emp
3 WHERE deptno = 10;
ENAME HIREDATE $REVIEW$
-------------- --------------- ---------------
CLARK 09/06/1981 07/09/1981
KING 17/11/1981 15/02/1982
MILLER 23/01/1982 23/04/1982
3 rows selected.
Ejemplo: ADD_MONTHS
Mostrar el nombre, fecha de contratacin y 6 meses despus de la fecha de contratacin de los empleados del
departamento 10.
Ejemplo: SYSDATE Mostrar el nombre y las semanas de trabajo de los empleados del departamento 20.
FORMATEO DE FECHAS
ELEMENTO DESCRIPCIN
DD Da del mes (Ej. 1-31)
DY Da de la semana (Ej. FRI)
DAY El da, en mayscula, con blancos adicionales hasta completar 9 caracteres (Ej. MONDAY)
DDSPTH Nombre del da, en mayscula, deletreado (Ej. TWELFTH)
MM Mes (Ej. 01 12)
MON Nombre del mes, en maysculas, abreviado a 3 letras (Ej. JAN)
MONYH El mes, en maysculas, con blancos adicionales hasta completar 9 caracteres (Ej. JANUARY)
YY Ao con dos dgitos (Ej. 91)
YYYY Ao con cuatro dgitos (Ej. 1991)
HH:MI:SS Horas : Minutos : Segundos (Ej. 09:00:00)
fm Modo de relleno: lo que siga a este prefijo reemplaza los blancos adicionales
SQL> SELECT ename, hiredate, ADD_MONTHS (hiredate, 6) $REVIEW$
2 FROM emp
3 WHERE deptno = 10;
ENAME HIREDATE $REVIEW$
-------------- --------------- ---------------
CLARK 09/06/1981 09/12/1981
KING 17/11/1981 17/05/1982
MILLER 23/01/1982 23/07/1982
3 rows selected.
SQL> SELECT ename, ROUND((SYSDATE - hiredate) / 7,0) WEEKS
2 FROM emp
3 WHERE deptno = 10;
ENAME WEEKS
-------------- ---------------
CLARK 1098
KING 1075
MILLER 1066
3 rows selected.
Formatee la visualizacin de valores de fecha con la funcin de conversin TO_CHAR
Ejemplo: Muestre las fechas de contratacin de todos los empleados del departamento 20 con el formato DD
of Month YYYY
REFERENCIA DE LOS VALORES Y FUNCIONES DE CARACTERES
Combine columnas con caracteres y constantes de carcter para producir una salida ms significativa que una
simple columna estndar devuelta por SQL-Plus.
Ejemplo: concatenacin
Muestre la combinacin de departamento ms su localizacin bajo un solo ttulo DEPARTAMENTOS
SQL> SELECT TO_CHAR (hiredate, fmDD of MONTH YYYY) Date of Hire
2 FROM emp
3 WHERE deptno = 20;
Date of Hire
------------------------------
17 of DECEMBER 1980
12 of JANUARY 1983
3 of DECEMBER 1981
3 rows selected.
SQL> SELECT dname || || loc DEPARTAMENTOS
2 FROM dept;
DEPARTAMENTOS
----------------------------------------
ACCOUNTING NEW YORK
RESEARCH DALLAS
SALES CHICAGO
OPERATIONS BOSTON
FINANCE LOS ANGELES
RESEARCH BOSTON
PERSONNEL TAHITI
EDUCATION MAUI
8 rows selected.
FUNCIN RESULTADO
INITCAP (ENAME) Muestra el nombre con su primera letra en mayscula, y las dems en minscula
(Ej. Smith)
UPPER (ENAME) Devuelve todos los caracteres de la cadena en mayscula. (Ej. SMITH)
LOWER (ENAME) Devuelve todos los caracteres de la cadena en minscula (Ej. smith)
SUBSTR (JOB, 1, 5) Empezando en la posicin 1, devuelve 5 caracteres (Ej. MANAG)
LENGTH (ENAME) Devuelve el nmero de caracteres de una cadena (Ej. 5)
CONCAT(ENAME,JOB) Concatena dos cadenas
LPAD(sal,5,'*') muestra un nmero de caracteres a la izquierda del valor de la columna *****5000
TRIM('S' FROM 'SMITH') Borra un carcter de una cadena Ej. MITH
INSTR('String', 'r') Devuelve la posicin de un carcter dentro de una cadena Ej: 3
Muestre el nombre y el cargo de todos los empleados llamados Ward en mayscula inicial bajo el ttulo
NAME:
Ejemplo: SUBSTR
Mostrar las primeras 5 letras del nombre de departamento y su localizacin completa.
SQL> SELECT INITCAP (ename) NAME, job
3 FROM emp
4 WHERE UPPER (ename) = WARD;
NAME JOB
---------- ----------------
Ward SALESMAN
1 row selected.
SQL> SELECT SUBSTR (dname, 1, 5) dept, loc
2 FROM dept;
DEPT LOC
------------ ---------------------
ACCOU NEW YORK
RESEA DALLAS
SALES CHICAGO
OPERA BOSTON
FINAN LOS ANGELES
RESEA BOSTON
PERSO TAHITI
EDUCA MAUI
8 rows selected.
Formatee la visualizacin de valores numricos con la funcin de conversin TO_CHAR
Ejemplo: Muestre la comisin de cada empleado del departamento 30 usando signos de peso, comas en las
posiciones adecuadas y dos dgitos decimales.
VISIN GENERAL DE ALGUNAS FUNCIONES ADICIONALES
FUNCIN EJEMPLO RESULTADO
GREATEST GREATEST (SAL, COMM) Devuelve el mayor valor entre SAL y COMM
LEAST LEAST (SAL, COMM) Devuelve el menor valor entre SAL y COMM
REFERENCIA DE ALGUNAS FUNCIONES ADICIONALES
Ejemplo: GREATEST
Muestre el nombre, el salario mensual y la comisin de todos los vendedores, incluyendo una columna que
muestre el mayor valor ya sea de salario o comisin.
SQL> SELECT ename EMPLOYEE, TO_CHAR (comm, $9,990.99) COMMISION
2 FROM EMP;
EMPLOYEE COMMISION
----------------- ---------------------
ALLEN $300.00
WARD $500.00
JONES
MARTIN $1,400.00
BLAKE
SCOTT
TURNER $0.00
JAMES
8 rows selected.
SQL> SELECT ename, sal, NVL (comm, 0), GREATEST (sal, comm)
2 FROM emp
3 WHERE job = SALESMAN;
ENAME SAL NVL (comm, 0) GREATEST (sal, comm)
----------------- ----------- ------ ------------------ -- -------------------------------
ALLEN 1600 300 1600
WARD 1250 500 1250
JONES 2975 0 2975
MARTIN 1250 1400 1400
SCOTT 3150 0 3150
TURNER 1500 0 1500
6 rows selected.
VISTAZO A LAS FUNCIONES DE GRUPO
Para devolver resultados basados en grupos de filas en lugar de un resultado por fila, utilice las funciones de
grupo.
FUNCIONES EJEMPLO RESULTADO
AVG AVG (sal) Devuelve el promedio aritmtico de SAL.
COUNT
COUNT (comm) Devuelve el nmero de valores no nulos de la columna COMM.
COUNT (*) Devuelve el nmero de filas no nulas en un grupo.
MAX MAX (sal) Devuelve el valor mximo de SAL
MIN MIN (sal) Devuelve el valor mnimo de SAL
SUM SUM (comm)
Devuelve la suma de los valores de COMM
Ejemplo: AVG, MAX, SUM
Muestre el promedio, el valor mximo y la suma de los salarios anuales de todos los vendedores.
Ejemplo: COUNT
Muestre el nmero de filas en la tabla EMP, y el nmero de empleados con comisin no nula.
SQL> SELECT AVG (sal), MAX (sal), SUM (sal)
2 FROM emp
3 WHERE job = SALESMAN;
AVG (SAL) MAX (SAL) SUM (SAL)
----------------- ----------------- --------------------
1954.16667 3150 11725
1 row selected.
SQL> SELECT COUNT (*) EMPLOYEES, COUNT (comm) COMMISIONABLE
2 FROM emp;
EMPLOYEES COMMISIONABLE
------------------- --------------------------
14 4
1 row selected.
REVISANDO SALIDAS DE GRUPO
SINTAXIS DE LA SENTENCIA SELECT
SELECT ...
FROM ...
WHERE ...
GROUP BY
HAVING
ORDER BY
Muestre una tabla en subgrupos de filas con la clusula GROUP BY.
Ejemplo: GROUP BY una columna
Muestre cada departamento y su nmero de empleados, agrupados por departamento.
Si se selecciona una columna normal y una funcin de grupo al mismo tiempo, se recibir un mensaje de error.
Ejemplo:
Mostrar el empleado que se contrat de primero
SQL> SELECT deptno, COUNT (*)
3 FROM emp
4 GROUP BY deptno;
DEPTNO COUNT (*)
------------------- --------------------------
10 3
20 3
30 8
3 rows selected.
SQL> SELECT ename, MIN (hiredate)
2 FROM emp;
ORA-00937: Not a single-group group function.
Ejemplo: GROUP BY ms de una columna
Muestre la cantidad de empleados para cada categora de cargos en cada departamento.
Coloque una condicin a la funcin de grupo mediante la clusula HAVING.
Ejemplo:
Muestre el salario anual promedio para todos los tipos de cargo con ms de dos empleados.
La clusula HAVING puede ser usada en la misma consulta con una clusula WHERE.
Ejemplo: Muestre los departamentos y la nmina de aquellos departamentos cuya nmina exceda de $8.000,
excluyendo todo el personal Aseador. Ordene la lista por el monto de la nmina.
SQL> SELECTdeptno, job, COUNT (*)
2 FROM emp
3 GROUP BY deptno, job;
DEPTNO JOB COUNT (*)
------------- ------------------- ---------------
10 CLERK 1
10 MANAGER 1
10 PRESIDENT 1
20 ANALYST 1
20 CLERK 2
30 CLERK 1
30 MANAGER 1
30 SALESMAN 6
8 rows selected.
SQL> SELECT job, 12 * AVG (sal)
2 FROM emp
3 GROUP BY job
4 HAVING COUNT (*) > 2;
JOB 12 * AVG (SAL)
------------------- ----------------------
CLERK 12450
SALESMAN 23450
2 rows selected.
SQL> SELECT deptno, SUM (sal)
2 FROM emp
3 WHERE job != CLERK
4 GROUP BY deptno
5 HAVING SUM (sal) > 8000
6 ORDER BY SUM (sal);
DEPTNO SUM (SAL)
------------------- ----------------------
30 14575
1 row selected.
OBTENIENDO DATOS DE MULTIPLES TABLAS.
Es la unin de dos tablas a travs de los campos que la relacionan, llave primaria llave fornea respectivamente
JOIN: use un JOIN en una consulta de datos de ms de una tabla
CARACTERSTICAS DEL JOIN
Las tablas a ser unidad (JOINED) se especifican en la clusula FROM
En la clusula WHERE se especifica como unir las tablas.
Las columnas que tienen nombres iguales en las tablas especificadas en la clusula FROM deben ser
identificadas utilizando NOMBRE_TABLA.NOMBRE_COLUMNA
Si las columnas no tienen homnimos en las tablas, no es necesario especificar el nombre de la tabla en
las clusulas WHERE y SELECT.
Se pueden unir JOIN cuantas tablas se requieran
El criterio de coincidencia entre las tablas es denominado el predicado del JOIN o criterio del JOIN
Las columnas especificadas en la condicin JOIN deben estar anexadas.
Cuando n tablas son unidas, es necesario tener al menos n-1 condiciones de JOIN entre parejas de
tablas para evitar el producto cartesiano (una unin de cuatro tablas requiere especificar criterio de
JOIN para tres parejas de tablas)
SELECT table1.column, table2.column
FROMtable1, table2
WHERE table1.column1 = table2.column2;
TIPOS DE JOIN
Ejemplo: Seleccionar nmero del empleado, nombre del departamento y localizacin.
OUTER JOIN
Operador OUTERJOIN es el signo ms entre parntesis (+), este obliga a que un registro que contenga valores
nulos en uno de los criterios del JOIN coincida con cada valor de la segunda tabla sobre la cual ordinariamente
no estara esa coincidencia. El nombre de una tabla debe de seguir las reglas estndar para los nombres de
cualquier objeto de una base de datos ORACLE.
SQL> select ename, emp.deptno, loc
2 From emp, dept
3 Where emp.deptno = dept.deptno;
Sintaxis
Ejemplo: Lista la localizacin de todos los departamentos as como los empleados que trabajan en estos
departamentos, incluya los departamentos en los cuales no trabaja empleado alguno.
OUTER JOINS Y LA CLAUSULA WHERE
Ejemplo: Liste los departamentos que actualmente no tienen empleados asignados
Ejemplo: Liste el nombre y la localizacin del departamento de todos los CLERK, incluya una lista de todos los
departamentos que actualmente no tengan ningn CLERK asignado.
Caractersticas del OUTER JOIN
Si un registro de una de las tablas de un JOIN no satisface la condicin del JOIN, normalmente ese registro
no aparece en el resultado. El OUTER JOIN, permite que un registro con estas caractersticas aparezcan en
el resultado.
El OUTER JOIN a travs SQL proporciona registros temporales para seleccionar los datos, los datos de la
tablas.
Se coloca un (+) despus de la combinacin de tabla/columna (en la clusula WHERE) sobre la que se
necesita los registros falsos para realizar el OUTER JOIN (WHERE EMP.DEPTNO(+)=DEPT.DEPTNO).
Si se requiere mltiples columnas para dar la condicin JOIN, todas o ninguna de ellas puede llevar el (+).
Solo una de las tablas en un JOIN, pueden escogerse para realizar el OUTER JOIN, es decir no se puede
colocar (+) en ambas tablas.
Una tabla puede realizar un OUTER JOIN con tan solo otra tabla.
Los registros extras seleccionados en un OUTER JOIN pueden realizarse buscando aquellos que tengan
valores nulos (NULL) en las columnas del JOIN.
SELECT table1.column, table2.column
FROMtable1, table2
WHERE table1.column1(+) = table2.column2;
SQL> SELECT loc, ename
2 FROM emp, dept
3 WHERE emp.deptno(+) = dept.deptno;
SQL> SELECT empno, dept.deptno, loc
2 FROM emp, dept
3 WHERE dept.deptno= emp.deptno(+) and empno is null;
SQL> SELECT ename, dept.deptno, loc
2 FROM emp, dept
3 WHERE dept.deptno= emp.deptno(+) and (job='CLERK' OR empno is null);
SEF-JOINS
Un SEF-JOINS es utilizado para buscar coincidencia entre registros sobre columnas diferentes de la misma
tabla.
Ejemplo: Liste el nmero, nombre y cargo de cada empleado, as como el numero nombre y cargo del
jefe correspondiente.
Caractersticas del SELF
Una palabra puede ser unida JOINED a si mismo como si fueran dos tablas separadas.
El self-join es til para unir un registro de una tala a otra de la misma tabla.
Como cualquier otro tipo de JOIN, este se realiza con columnas que contenga el mismo tipo de
informacin.
A la tabla se le deben dar alias para indicar que columnas son de la tabla.
En el ejemplo previo, la tabla EMP fue unida a si misma utilizando las columnas EMPNO y MGR
cumpliendo todas las reglas anteriores.
NON-EQUIJOINS
La mayora de los JOINS se basan en la igualdad de valores en las tablas referenciadas. Por esto se
determinan los EQUIJOINS. Los NON-EQUIJOINS por consiguiente se basan en los siguientes
operadores.
!= < <= > >= between
Ejemplo: Ordene el grado del salario (salgrade), el nombre, salario y cargo de cada empleado. Ordene
el resultado por grado de salario y trabajo.
SELECT alias1.column, alias2.column
FROMtable1 alias1, table2 alias 2
WHERE alias1.column1 = alias2.column2;
SELECT w.empno, w.ename, w.job,w.mgr,
m.empno,m.ename,m.job
FROMemp w, emp m WHERE w.mgr = m.empno;
SQL> SELECT GRADE, ENAME, SAL, JOB
2 FROM EMP, SALGRADE
3 WHERE SAL BETWEEN LOSAL AND HISAL
4 ORDER BY GRADE, SAL;
OPERADORES DE CONJUNTO
Los operadores de conjunto combinan dos o ms tablas para obtener resultado.
UNION Los registros del primer query mas registros del segundo query se eliminan duplicados
INTERSECCIN Los registros que las dos tablas tienen en comn
MENOS Registros nicos de la primera tabla
EL OPERADOR UNION
El operador UNION retorna todos los registros distintos seleccionados travs de mltiples queries.
Sintaxis
Ejemplo: Quien gana ms de $2000 en todos los departamentos.
EL OPERADOR INTERSECCIN (INTERSECT)
El operador INTERSECT retorna valores comunes de mltiples tablas
SELECT columna
FROMtabla
WHERE condiciones ciertas
UNION
SELECT columna
FROMtabla
WHERE condiciones ciertas
SQL> SELECT ENAME,SAL
2 FROM ACCOUNTING
3 WHERE SAL >2000
4 UNION
5 SELECT ENAME,SAL
6 FROM RESEARCH
7 WHERE SAL >2000
8 UNION
9 SELECT ENAME,SAL
10 FROM SALES
11 WHERE SAL >2000;
SELECT columna
FROMtabla
WHERE condiciones ciertas
INTERSECT
SELECT columna
FROMtabla
WHERE condiciones ciertas
Ejemplo
EL OPERADOR MENOS (MINUS)
El operador MINUS. Retorna todos los registros seleccionados por el primer query que no fueron tambin
seleccionados por el segundo query
Ejemplo: Liste la informacin de los empleados que tienen cargos que estn en el departamento de
ACCOUNTING pero que no estn en el departamento de ventas (SALES).
Nota: Los operadores de conjunto son tiles para conformar subqueries que referencia a mltiples tablas.
SQL> SELECT JOB
2 FROM ACCOUNTING
3 UNION
4 SELECT JOB
5 FROM RESEARCH
6 UNION
7 SELECT JOB
8 FROM SALES;
SELECT columna
FROM tabla
WHERE condiciones ciertas
MINUS
SELECT columna
FROMtabla
WHERE condiciones ciertas
SQL> SELECT * FROM ACCOUNTING
2 WHERE JOB (SELECT JOB FROM ACCOUNTING
3 MINUS SELECT JOB FROM SALES)
VISIN GENERAL DE LA CREACIN DE TABLAS
Requerimientos de la sentencia CREATE TABLE
El nombre de la tabla
El nombre de la columna
El tipo de datos de la columna
Reglas para los nombres
Debe tener entre 1 y 30 caracteres y el primero debe de ser alfabtico.
Debe contener solo los caracteres:
o A-Z, a-z, 0-9, _ (guion bajo)
o $ y # son legales pero su uso se esta descontinuando
No debe de ser ninguna palabra reservada de ORACLE
No debe tener el mismo nombre que otro objeto dentro del mismo nombre de usuario de ORACLE
Nota Rpida:
Los nombres de tablas son los mismos si se escriben en maysculas o minsculas; ejemplo: EMP = Emp.
Los nombres de columnas deben adherirse a las tres primeras reglas antes descritas.
Tipo de datos
CHAR (tamao) Almacena datos de tipo carcter de longitud fija. Con un tamao mximo De 2000 bytes
VARCHAR2(tamao) Almacena datos de tipo carcter de longitud fija. Con un tamao mximo De 2000bytes
VARCHAR(tamao) Actualmente es igual al Char
LONG Almacena datos de tipo carcter de longitud variable hasta 2 gigabytes
NUMBER (L,D) Almacena datos numricos siendo L la longitud y D el numero de dgitos Decimales
INTEGER Numrico sin decimal. Por defecto 38.
DATE Almacena informacin relacionada con el tiempo incluyendo fechas, horas, minutos y
segundos. (Fechas hasta el 31 de diciembre de 4712).
RAW Datos en binario puro (imgenes y sonido) con un ancho mximo de 2000 bytes.
LONG RAW Datos en binario puro (imgenes y sonido) mas grande que RAW
CLOB Almacena objetos de caracteres grandes de un nico byte
BLOB Almacena objetos binarios de gran tamao, siendo el tamao mximo 4GB (gigabytes).
BFILE Almacena punteros de archivos a LOB administrados por sistemas de archivos externos
a la base de datos.
Restricciones
Restricciones Uso
PRIMARY KEY Identifica de manera nica una fila de la tabla.
CHECK Especifica una condicin que debe de ser verdadera.
FOREIGN KEY (nombre_columna) Establece e impone una relacin entre esta columna y una
REFERENCES (nombre_columna) PRIMARY KEY en la tabla referenciada.
[NOT] NULL Especifica que dicha columna no puede contener valores nulos
UNIQUE Especifica una columna o columnas que deben tener valores nicos a lo
largo de todas las filas.
Las restricciones de integridad permiten al diseador de la aplicacin restringir el rango de valores aceptables
que se pueden almacenar en una tabla.
Sintaxis
Ejemplo:
----------------------------------------------------------------------------------------------------------------------------------------------------
Podemos crear tablas usando la clausula AS en la sentencia CREATE TABLE para usar los atributos de columnas
y los datos de una tabla ya existente.
Ejemplo1:
Ejemplo2:
--------------------------------------------------------------------------------------------------------------------------------------------------
CREATE TABLE [user.] nombre_tabla
({nombre_columna tipo | restriccin}
[,{nombre_columna tipo | restriccin} + )
SQL> CREATE TABLE emp2
2 (empno NUMBER(4),
3 CONSTRAINT empno_constr PRIMARY KEY (empno),
4 ename char(10) CHECK (ename = upper (ename)),
5 job CHAR(9),
6 mgr NUMBER(4) REFERENCES emp(empno),
7 hiredate DATE,
8 sal NUMBER(7,2),
9 comm NUMBER(7,2),
10 deptno NUMBER(2) NOT NULL REFERENCES dept(deptno));
Table created
CREATE TABLE *user.+ nombre_tabla *(nombre_columna1, nombre columna2,)+
AS consulta
SQL> CREATE TABLE hdates
2 AS SELECT empno, ename, hiredate
3 FROM emp
4 WHERE empno = 10;
Table created.
SQL> CREATE TABLE empty_like_emp
2 AS SELECT *
3 FROM emp
4 WHERE 1=2;
Table created.
Modificacin de Tablas
Use la sentencia ALTER TABLE para modificar la estructura de una tabla. Se pueden hacer dos operaciones:
Adicionar columnas o restricciones
Modificar la definicin de las columnas (restricciones, NOT NULL y dems)
Sintaxis Adicionar
Ejemplo 1:
Sintaxis Modificar
Ejemplo1: incrementar el tamao de la columna ename de 10 a 18.
--------------------------------------------------------------------------------------------------------------------------------------------------
Eliminacin de Tablas y Columnas
Use la clausula Drop Column cuando desea borrar una columna de una tabla.
Ejemplo: Borrar la columna ename de la tabla hdates
---------------------------------------------------------------------------------
Eliminacin de una tabla: DROP TABLE
ALTER TABLE nombre_tabla
ADD ( { nombre_columna tipo | restriccin }
[,{ nombre_columna2 tipo | restriccin }+ )
SQL> ALTER TABLE hdates
2 ADD (manager NUMBER(4));
Table altered.
SQL> ALTER TABLE nombre_tabla
MODIFY ( { nombre_columna tipo | restriccin }
[, {nombre_columna2 tipo | restriccin } ] ..)
SQL> ALTER TABLE hdates
2 MODIFY (ename CHAR(18));
Table altered.
SQL> ALTER TABLE nombre_tabla
DROP COLUMN (nombre_columna1, nombre_columna2, )
SQL> ALTER TABLE hdates
2 DROP COLUMN ename;
Table altered.
DROP TABLE nombre_tabla;
Ejemplo: Eliminar la tabla EMPTY_LIKE_EMP
Crear Tablas Duplicadas o solo ciertas columnas de una tabla
Crear un duplicado de la tabla original, sin la columna o columnas que queremos eliminar:
Borrar la tabla original
Renombrar la nueva tabla con el nombre de la tabla original (este paso es opcional)
---------------------------------------------------------------------------------------------------------------------------------------------------
Visin General de las Vistas
Se puede representar lgicamente una o ms tablas como una vista. Una vista no contiene datos. Todos los
datos se derivan de las tablas subyacentes.
Ventajas de las vistas
Seguridad
Conveniencia
Perspectiva
Creacin de vistas
La creacin de vistas es similar a la creacin de tablas usando la clausula AS.
Sintaxis
SQL> DROP TABLE empty_like_emp;
Table dropped.
SQL> CREATE TABLE table_temp
2 AS SELECT columna1, columna2, columna4,
3 FROM table_original;
Table created.
SQL> DROP TABLE tabla_original;
Table dropped.
SQL> RENAME tabla_temp TO tabla_original;
Table renamed
SQL> CREATE *OR REPLACE+ VIEW nombre_vista *(alias1, alias2, )+
AS consulta
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY];
La consulta contiene un sentencia SELECT sin la clausula order by
La clausula WHIT CHECK OPTION se utiliza para al ingresar registros en una tabla se valide la clausula
where.
La Clausula WITH READ ONLY se utiliza cuando se requiere crear una vista de solo lectura, es decir no es
permitido insertar, borrar o actualizar datos sobre ella.
Ejemplo1:
Crear una vista que contenga el numero, el nombre y el cargo de todos los empleados del departamento 10.
2da parte
Ejemplo2: Alias de columnas en las vistas
SQL> CREATE VIEW empvu10
2 AS SELECT empno, ename, job
3 FROM emp
4 WHERE deptno =10;
View created.
SQL> SELECT *
FROM empvu10;
EMPNO ENAME JOB
--------------- ---------------- -----------------
7782 CLARK MANAGER
7839 KING PRESIDENT
7934 MILLER CLERK
3 rows selected.
SQL> CREATE VIEW empvu11(id_number, employee, title)
2 AS SELECT empno, ename, job
3 WHERE deptno =10;
View created.
SQL> SELECT *
FROM empvu11;
ID_NUMBER EMPLOYEE TITLE
--------------- ---------------- -----------------
7782 CLARK MANAGER
7839 KING PRESIDENT
7934 MILLER CLERK
3 rows selected.
Ejemplo 3: alias alternativos en las vistas.
Ejemplo 4: Cree una vista solo con los datos de los empleados del departamento No. 20.
Asegure que las inserciones y actualizaciones realizadas sobre una vista, no afectaran los datos que la vista no
sea capaz de acceder, mediante la utilizacin de la clausula WITH CHECK OPTION
Parte2. Actualizando el departamento a 30 para el cdigo 7369
---------------------------------------------------------------------------------------------------------------------------------------------------
SQL> CREATE VIEW salvu10
2 AS SELECT empno, ename, sal*12 annual_salary
3 FROM emp
4 WHERE deptno =10;
View created.
SQL> SELECT * FROM empvu11;
EMPNO ENAME ANNUAL_SALARY
--------------- ---------------- -----------------
7782 CLARK 29400
7839 KING 60000
7934 MILLER 15600
SQL> CREATE VIEW empvu20
2 AS SELECT * FROM depto = 20
3 WHERE deptno =20
4 WITH CHECK OPTION;
View created
SQL> UPDATE empvu20
2 SET deptno = 30
3 WHERE empno =7369;
UPDATE empvu20
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clausule violation.
Vistazo al acceso de Tablas y vistas
El privilegio de DBA (DataBase Administrator Administrador de la base de datos) permite al desarrollador
saltarse muchos privilegios estndar que normalmente se requieren para usar objetos de la base de datos.
Privilegios del sistema
DBA todos los privilegios
SELECT
CREATE
DROP
GRANT / REVOKE
Ejecutar imports y exports sobre la base de datos completa
Modificar la estructura de la base de datos
RESOURCE
CONNECT
Un vistazo a la concesin de acceso a tablas y vistas
Los propietarios de las tablas controlan el acceso a los objetos de su propiedad.
Privilegios de acceso a tablas
Crear la tabla por si mismo
Obtener los privilegios del propietario
Como DBA o propietario de tablas, use el comando GRANT y sus opciones para otorgar distintos niveles de
acceso a los objetos de la base de datos.
Sintaxis
Ejemplo1:
Otorgar todos los privilegios sobre la tabla EMP a todos los usuarios:
Ejemplo2: Otorgar privilegios de consulta (SELECT) al usuario Jones sobre la tabla DEPT:
GRANT privilegio1, privilegio2, .. [o ALL]
ON nombre_tabla/ nombre_vista
TO usuario1, usuario2, *O PUBLIC+
[WITH GRANT OPTION]
SQL> GRANT ALL
2 ON emp
3 TO PUBLIC;
Grant succeeded.
SQL> GRANT SELECT
2 ON dept
3 TO jones;
Grant succeeded.
Ejemplo3: Otorgar privilegios de consulta (SELECT) al usuario Jones sobre la tabla DEPT, con la habilidad de
otorgar los mismos privilegios a otros.
Ejemplo4: Cambiar el password de acceso del usuario Scott a leopard
---------------------------------------------------------------------------------------------------------------------------------------------------
Visin General de los Sinnimos
Los sinnimos se pueden crear por razones de seguridad y conveniencia.
Niveles de los sinnimos
Publico
Privado
Ventajas de los sinnimos
Referencia a tablas y vistas sin especificar el propietario o la base de datos.
Flexibilidad al personal una convencin de nombres mas significativa.
Creacin de Sinnimos
Ejemplo1: Crear el sinnimo dates para la tabla HDATES del usuario Scott.
SQL> GRANT SELECT
2 ON dept
3 TO jones
4 WITH GRANT OPTION;
Grant succeeded.
SQL> GRANT CONNECT
2 TO scott
3 IDENTIFIED BY leopard;
Grant succeeded.
CREATE SYNONYM nombre_sinonimo
FOR nombre_tabla/nombre_vista
SQL> CREATE SYNONYM dates
2 FOR scoot.hadates;
Synonym created.
SQL> SELECT *
FROM dates;
----------------------------------------------------------------------------------------------------------------------------------------------------
Visin General sobre los ndices
Los ndices son estructuras opcionales, asociadas con tablas, que se usan para agilizar la ejecucin de consultas
y/o garantizar unicidad.
El RDBMS de ORACLE accede a los datos en las tablas de dos maneras:
TABLE SCAN completo (acceso secuencial)
Por INDICES (acceso indexado o selectivo)
Hay una regla general para los ndices: cree un ndice cuando se prevea la extraccin frecuente de menos del
10 15% de las filas en una tabla grande y se hace referencia frecuente a las columnas en la clausula WHERE.
Caractersticas de las columnas para indexado
Las columnas se usan frecuentemente en clausulas WHERE
Cada valor es nico (el mejor caso)
Amplio rango de valores
Muchos valores nulos, o relativamente pocos valores
Una tabla puede tener cualquier cantidad de ndices. Los ndices aceleran la ejecucin de consultas, pero
disminuyen las presentaciones en cuanto a la velocidad de mantenimiento de las tablas.
Nota: ORACLE actualiza los ndices automticamente. No tienen impacto en la sintaxis de SQL.
Creacin de ndices
Sintaxis ndice simple
EMPNO ENAME HIREDATE
-------------- -------------- --------------------
7369 SMITH 17-DEC-80
7499 ALLEN 20-FEB-81
7521 WARD 22-FEB-81
7566 JONES 02-APR-81
7654 MARTIN 28-SEP-81
7698 BLAKE 31-MAY-81
7782 CLARK 09-JUN-81
7788 SCOTT 09-DEC-82
7839 KING 17-NOV-81
7844 TURNER 08-SEP-81
7876 ADAMS 12-JAN-83
7900 JAMES 03-DEC-81
7902 FORD 03-DEC-81
7934 MILLER 23-JAN-82
14 rows selected
CREATE INDEX nombre_indice
ON TABLE nombre_tabla (nombre_columna1 *, nombre_columna2+)
Ejemplo1: Crear un ndice simple sobre la columna ENAME en la tabla EMP.
SQL> CREATE INDEX i_emp_ename
2 ON emp (ename);
Index created.
En esta consulta se usa el ndice:
SQL> SELECT *
2 FROM emp
3 WHERE ename = SMITH;
En esta consulta NO se usa el ndice:
SQL> SELECT * FROM emp;
En la tabla USER_INDEXES del diccionario de datos se encuentran todos los ndices pertenecientes al usuario
actual.
SQL> SELECT index_name
2 FROM user_indexes
3 WHERE table_name = EMP;
Sintaxis Eliminacin de ndices
DROP INDEX nombre_indice
Ejemplo1:
SQL> DROP INDEX i_emp_ename;
Index dropped
Crear ndices nicos sobre una tabla para asegurar que nunca dos filas tendrn valores iguales en la columna o
columnas indexadas.
Sintaxis
CREATE UNIQUE INDEX nombre_indice
ON nombre_tabla (nombre_columna1 *, nombre_columna2+ )
Ejemplo:
Crear un ndice en la columna EMPNO de la tabla EMP para incrementar el desempeo, en consultas, asi como
garantizar valores nicos para los nmeros de empleados.
SQL> CREATE UNIQUE INDEX i_emp_empno
2 ON emp (empno)
Index created.
INDEX_NAME
------------------------
I_EMP_ENAME
1 rows selected.
Los ndices concatenados crean una entrada en el ndice con datos provenientes de cada una de las columnas
indicadas en la sentencia de creacin del ndice. Se pueden incluir hasta un mximo de 16 columnas por ndice.
Ejemplo2:
Crear un ndice en la tabla EMP para las columnas EMPNO y ENAME
SQL> CREATE UNIQUE INDEX i_empno_ename
2 ON emp (empno, ename);
Index created.
----------------------------------------------------------------------------------------------------------------------------------------------------
Creacin de Generadores de secuencia
Cree secuenciadores con el fin de generar enteros unicos y consecutivos para multiples usos. Los
secuenciadores se pueden utilizar para generar llaves primarias de forma automtica.
Sintaxis abreviada
CREATE SEQUENCE nombre_secuencia
[INCREMENT BY {1|n} ]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE} ]
[{MINVALUE n | NOMINVALUE } ]
Ejemplo1:
Cree un secuenciador simple para la columna EMPNO empezando desde el valor 8000
SQL> CREATE SEQUENCE s_emp_empno START WITH 8000;
Sequence created.
Ejemplo2:
Cree un secuenciador simple para la columna DEPTNO empezando desde el valor 100
SQL> CREATE SEQUENCE s_dept_deptno START WITH 100;
Sequence created.
Ejemplo 3:
Mostrar el siguiente valor disponible de la secuencia S_EMP_EMPNO
SQL> SELECT s_emp_empno.nextval
2 FROM dual;
NEXTVAL
----------------
800
1 rows selected.
Eliminar un secuenciador de la base de datos con DROP SEQUENCE
Sintaxis
DROP SEQUENCE nombre_secuencia;
Ejemplo:
SQL> DROP SEQUENCE s_emp_empno;
Sequence dropped.
Actualizacin de Datos En Tablas
Insercin de Filas
Inserte filas en una tabla con la instruccin INSERT.
Sintaxis
INSERT INTO nombre_tabla * (columna1, columna2, ) +
VALUES (value1, value2,)
Ejemplo1:
Mostrar la estructura de la Tabla DEPT
SQL> DESCRIBE dept;
Name NULL? Type
------------- --------------- ----------------
DEPTNO NOT NULL NUMBER(2)
DNAME CHAR(14)
LOC CHAR(13)
Inserte el departamento de Finanzas con cdigo 50 con sede en Los Angeles en la tabla DEPT
SQL> INSERT INTO dept
2 VALUES (50, FINANCE, LOS ANGELES);
1 row created.
Inserte los valores en todas las columnas de una tabla:
SQL> INSERT INTO emp
2 VALUES (1234, EMMETT, SALESMAN, 7698, SYSDATE, 2000, NULL, 30);
1 row created.
Inserte valores en solo algunas columnas de una tabla
SQL> INSERT INTO emp (empno, ename, hiredate, sal, deptno)
2 VALUES (S_EMP_EMPNO.NEXTTVAL, LERNER, 01/01/1992, 2000, 30);
1 row created.
Inserte valores en las columnas utilizando parmetros
SQL> INSERT INTO dept
2 VALUES(&DEPTNO, &DNAME, &LOC);
Enter value for DEPTNO: 60
Enter value for DNAME: RESEARCH
Enter value for LOC: BOSTON
1 row created.
----------------------------------------------------------------------------------------------------------------------------------------------------
Actualizacin de Filas
Cambie los datos en una tabla especfica con la sentencia UPDATE.
Sintaxis
UPDATE nombre_tabla
SET columna1 = valor, columna2 = valor2
[WHERE condicin]
Ejemplo:
Mostrar la estructura de la tabla EMP
SQL> DESCRIBE emp;
Name NULL? Type
--------------- --------------- ----------------
EMPNO NOT NULL NUMBER(4)
ENAME CHAR(10)
JOB CHAR(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NOT NULL NUMBER(2)
Cambiar al empleado 7566 al cargo de vendedor en el departamento 30.
SQL> UPDATE emp
2 SET job = SALESMAN, deptno = 30
3 WHERE empno = 7566;
1 row updated
Actualizar varias columnas en una sola fila
SQL> UPDATE emp
2 SET job = SALESMAN, sal = sal*1.05, deptno =30
3 WHERE empno = 7788;
1 row updated
Actualizacin de mltiples filas: Cambiar el cargo SALESMAN por SALES
SQL> UPDATE emp
2 SET job = SALES
3 WHERE job = SALESMAN;
7 rows updated.
SQL> SELECT ename, job, deptno
2 FROM emp
3 WHERE job = SALES;
ENAME JOB DEPTNO
--------------- --------------- -----------------
ALLEN SALES 30
WARD SALES 30
JONES SALES 30
MARTIN SALES 30
SCOTT SALES 30
TURNER SALES 30
EMMETT SALES 30
7 rows selected.
Devolver el cargo a su valor original SALESMAN
SQL> UPDATE emp
2 SET job = SALESMAN
3 WHERE job = SALES;
7 rows update
----------------------------------------------------------------------------------------------------------------------------------------------------
Eliminacin de Filas
Elimine filas de una tabla especifica usando la sentencia DELETE
Sintaxis
DELETE FROM nombre_tabla
[WHERE condicin]
Ejemplo
Borrar el empleado numero 1234 (EMMETT) de la tabla EMP para reflejar su retiro.
SQL> DELETE FROM emp
2 WHERE empno = 1234;
1 row deleted
----------------------------------------------------------------------------------------------------------------------------------------------------
Un vistazo general al procesamiento de Transacciones
Una transaccin se define como todos los cambios realizados a una base de datos entre COMMIT sucesivos
Procesamiento de Transacciones
La sentencia COMMIT hace permanentes todos los cambios realizados en la transaccin actual
Tipos de COMMIT
Explicito
Implcito
Ejemplo:
Hacer COMMIT en una sentencia SQL
SQL> DELETE FROM emp
2 WHERE ename = LERNER
1 row deleted.
SQL> COMMIT;
Commit complete.
Logre que las modificaciones realizadas sean deshechas utilizando la sentencia ROLLBACK
Ejemplo:
Transfiere a JONES al grupo de vendedores:
SQL> UPDATE emp
2 SET job = SALESMAN, deptno = 30
3 WHERE ename = JONES;
1 row updated.
Todos los empleados de la compaa que se llaman JONES fueron transferidos al grupo de vendedores.
Revierta la operacin y vuelva a realizar el traslado, utilizando el nmero de empleado.
SQL> ROLLBACK;
Rollback complete.
SQL> UPDATE emp
2 SET job = SALESMAN, deptno = 30
3 WHERE empno = 7566;
1 row updated.
Marque un punto en una transaccin hasta el cual podra hacer un ROLLBACK sin necesidad de cancelar toda la
transaccin, utilizando la sentencia SAVEPOINT.
Ejemplo:
----------------------------------------------------------------------------------------------------------------------------------------------------
Para mostrar las tablas de la base de datos hay varias formas.
SQL>select * from tab;
SQL>select * from tabs;
SQL>select * from user_objects where object_type = 'TABLE';
Para describir el contenido (columnas) de una tabla:
sql>desc NOMBRE_DE_TABLA;
Para ver todo el contenido de la base de datos (TABLAS de mi usuario):
sql>select * from user_catalog;
sql>select * from cat;
Para mostrar todos los datos (columnas)de una tabla
SQL>select * from nombre_tabla;
Para mostrar algunos los datos (columnas)de una tabla
SQL>select columna1, columna2, from nombre_tabla;
Despliegue el nombre del empleado separando el apellido y nombre por ** asegurndose que este en
maysculas, la fecha de ingreso con formato (26 Nov 2012 10:20), la fecha de cumpleaos del empleado
(MMDD) de todos los empleados de los deptos. Co, Si, RH, HK que cumplan aos el mes en curso.
Select upper (nom_e || - - || ape_e )
To _char (fecha_in, DD MON YYYY HH:MM);
Substr (RFC, 7,4)
From Emp
Where cve_d in (Co, Si, RH,MK)
And substr (RFC, 7, 4) = to_ char(sysdate, MM);
Muestre el nombre y el cargo de todos los empleados llamados Martinez primero la primera con mayscula y
las dems en minscula luego todas en minsculas.
(INITCAP. Muestra el nombre con su primera letra en mayscula, y las dems en minscula)
(LOWER. Devuelve todos los caracteres de la cadena en minscula)
NVL. Convierta un valor nulo en uno no-nulo con el propsito de evaluar una expresin con la funcin NVL
Cuando NVL evala la primera expresin, si esta es no-nula, retorna dicha expresin; en caso contrario, retorna
la segunda.
Muestre el nombre de empleado, cargo, salario, comisin y compensacin total de los empleados del
departamento 30.
SQL> SELECT INITCAP (ename) , LOWER(ename), job
3 FROM emp
4 WHERE UPPER (ename) = MARTINEZ;
SQL> SELECT ename, job, sal, comm, NVL(sal, 0) + NVL(comm, 0)
2 FROM emp
3 WHERE deptno = 30;
ENAME JOB SAL COMM NVL(SAL, 0)+NVL(COMM, 0)
-------------- -------------------- -------------- -------------- -------------------------------------------
ALLEN SALESMAN 1600 300 1900
WARD SALESMAN 1250 500 1750
JONES SALESMAN 2975 2975
MARTIN SALESMAN 1250 1400 2650
BLAKE MANAGER 2850 2850
SCOTT SALESMAN 3150 3150
TURNER SALESMAN 1500 0 1500
JAMES CLERK 950 950
8 rows selected.
Ejemplo: funcin ROUND
Liste el nombre, salario mensual, salario diario (basado en un mes laboral de 22 das) y el salario diario
redondeado al prximo entero, y otra truncada a dos decimales para los empleados ALLEN y JONES.
Ejemplo: ADD_MONTHS
Mostrar el nombre, fecha de contratacin y 6 meses despus de la fecha de contratacin de los empleados del
departamento 10.
10g
Insert
La sentencia Insert permite de insertar datos en una tabla.
INSERT INTO <nombre_de_tabla> (<campo_1>,<campo_2>,<...>) VALUES
(<valor_campo_1>,<valor_campo_2>,<valor_...>);
Tambin existe:
INSERT INTO <nombre_de_tabla> (<campo_1>,<campo_2>,<...>) <SELECT STATEMENT>;
Update
SQL> SELECT ename, sal, sal / 22,
ROUND (sal / 22, 0)
TRUNC (sal/ 22,2)
2 FROM emp
3 WHERE ename IN (ALLEN, JONES);
SQL> SELECT ename, hiredate, ADD_MONTHS (hiredate, 6) 6 MESES DESPUES
2 FROM emp
3 WHERE deptno = 10;
La sentencia Update permite de modificar el valor de uno o varios datos en una tabla.
UPDATE <nombre_de_tabla> SET <campo_1>=<valor_campo_1>,<campo_2>=<valor_campo_2>,<...>;
De costumbre se limita el cambio a ciertos registros, mencionados utilizando una clausula WHERE.
UPDATE <nombre_de_tabla> SET <campo_1>=<valor_campo_1>,<campo_2>=<valor_campo_2>,<...>
WHERE <clusula_where>;
Delete
La sentencia Delete permite de borrar un uno o varios registros en una tabla.
DELETE FROM <nombre_de_tabla> ;
De costumbre se limita el borrado a ciertos registros, mencionados utilizando una clausula WHERE.
DELETE FROM <nombre_de_tabla> WHERE <clusula_where>;
2.5 Commit y rollback
Si la base de datos permite la gestion de transacciones, se puede utilizar Commit para confirmar una
Insert, Update, o Delete, o `Rollback` para cancelarlos. Ciertas base de datos pueden ser configuradas
para autocommit, que hace un commit automaticamente despues de cada instruccion, a menos que se ha
iniciado una transaccion de manera explicita (con 'begin transaction xxx;).
Hasta que el Commit esta ejecutado, las modificaciones no estan inscritas de manera permanente
en la
base de datos, y solo son visible para la sesion en curso del usuario autor de las acciones.
Despues del
Commit, los cambios son definitivos y visible para todos.
Cuidado que ciertos objetos pueden quedar bloqueados (bloqueando otros usuarios) hasta que el
commit
sea hecho.
El commit/rollback permite confirmar o de hacer un lote de transaccion, para que si una falle,
todas las
anteriores se anulan tambien. Cuando se necesita una integridad de transaccion, se utiliza en
commit/rollback.
Ejemplo:
SELECT emp_no,job_grade FROM employee where emp_no=4;
update employee set job_grade=6 where emp_no=4;
SELECT emp_no,job_grade FROM employee where emp_no=4;
rollback;
SELECT emp_no,job_grade FROM employee where emp_no=4;
update employee set job_grade=6 where emp_no=4;
SELECT emp_no,job_grade FROM employee where emp_no=4;
commit;
SELECT emp_no,job_grade FROM employee where emp_no=4;
2.6 Savepoint
Un savepoint permite identificar un punto en una transaccion al cual se podra eventualmente
regresar
(rollback).
SELECT emp_no,job_grade FROM employee where emp_no=4;
START TRANSACTION;
update employee set job_grade=5 where emp_no=45;
SELECT emp_no,job_grade FROM employee where emp_no=4;
savepoint vale_cinco;
SELECT emp_no,job_grade FROM employee where emp_no=4;
update employee set job_grade=4 where emp_no=45;
SELECT emp_no,job_grade FROM employee where emp_no=4;
rollback to savepoint vale_cinco;
SELECT emp_no,job_grade FROM employee where emp_no=4;
rollback;
2.9 Count
Para contar un numero de registros, se utiliza la palabra Count.
SELECT COUNT(<campo_1>) FROM <nombre_tabla>;
Ejemplo:
SELECT count(*) FROM employee where job_grade=4;
2.13 Uniones
Uniones permiten de unir los resultados de dos consultas. Para poder unirlas, tienen que tener los
mismos campos.
SELECT <campo_1>,<campo_2>,<...> FROM <nombre_tabla_1>
UNION
SELECT <campo_1>,<campo_2>,<...> FROM <nombre_tabla_2>;
Ejemplo:
select t.first_name,t.last_name from employee t where job_grade=5
union
select t2.fname,t2.lname from patient t2;
2.14 Subconsultas
Subconsultas son consultas sobre otras consultas. La subconsulta se puede utilizar el la causula
From, o
el la condicion de la clasula Where. La subconsulta se pone entre parentesis. En MySQL, las
subconsultas deben tener sus propios alias.
SELECT t3.<campo_1>, t3.<campo_2> FROM (SELECT t.<campo_1>, t.<campo_2> FROM <nombre_tabla > t
<where cluase>) t3
WHERE t3.<campo_1> IN (SELECT t2.<campo_1> FROM <nombre_tabla_2> t2);
Ejemplo: SELECT t3.first_name,t3.last_name FROM
(select t.first_name,t.last_name from employee t where job_grade=5
union
select t2.fname,t2.lname from patient t2
) t3 where t3.last_name like 'RAMIREZ%';
SELECT t3.first_name,t3.last_name, t3.job_country FROM employee t3
where t3.job_country IN
(select t.country from country t where t.currency='Euro');
Varios
Ver todas tablas de mi usuario
SELECT TABLE_NAME
FROM USER_TABLES;
Usuario Nuevo
SQL> create user monster23 identified by arizona23 default tablespace users temporary tablespace temp;
sQL> grant connect , resource to monster23;
-----------------------------------------------------------------------------------------------------
Ver, Crear o borrar un usuario en Oracle con SQLplus
Para crear un usuario desde SQLplus se realzia lo siguiente:
1. Iniciar sqlplus en linea de comandos: (Windos: ejecutar cmd- sqlplus system/pass@nombre_baseDatos)
2. sql> create user nombre identified by contrasea default tablespace users temporary tablespace
temp;
Al ejecutar la instruccin nos habr creado el usuario. Ahora habr que otorgarle ciertos permisos.
3. grant connect , resource to nombre
Y con eso tenemos creado nuestor usuario (esquema de base de datos).
Nombre = Nombre de usuario o esquema que queremos crear
Users= Tabla users, puede ser system, users, etc
Para borrar un usuario realizamos la siguiente instruccin:
Drop user usuario;
En caso de que tenga tablas y estn relacionadas colocamos:
Drop user usuario cascade;
Si queremos ver los usuarios de nuestra Db realizamos la siguiente instruccin:
Select * from all_users;
Triggers (Disparador)
Un trigger es un bloque PL/SQL asociado a una tabla, que se ejecuta como consecuencia de una determinada
instruccin SQL (una operacin DML: INSERT, UPDATE o DELETE) sobre dicha tabla.
CREATE [OR REPLACE] TRIGGER <nombre_trigger>
{BEFORE|AFTER}
{DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]
[OR {DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]...]}
ON <nombre_tabla>
[FOR EACH ROW [WHEN (<condicion>)]]
DECLARE
-- variables locales
BEGIN
-- Sentencias
[EXCEPTION]
-- Sentencias control de excepcion
END <nombre_trigger>;
Los triggers pueden definirse para las operaciones INSERT, UPDATE o DELETE, y pueden ejecutarse antes o
despus de la operacin. El modificador BEFORE AFTER indica que el trigger se ejecutar antes o despues de
ejecutarse la sentencia SQL definida por DELETE INSERT UPDATE. Si incluimos el modificador OF el trigger solo
se ejecutar cuando la sentencia SQL afecte a los campos incluidos en la lista.
El alcance de los disparadores puede ser la fila o de orden. El modificador FOR EACH ROW indica que el
trigger se disparar cada vez que se realizan operaciones sobre una fila de la tabla. Si se acompaa del
modificador WHEN, se establece una restriccin; el trigger solo actuar, sobre las filas que satisfagan la
restriccin.
El siguiente ejemplo muestra un trigger que inserta un registro en la tabla PRECIOS_PRODUCTOS cada vez que
insertamos un nuevo registro en la tabla PRODUTOS:
CREATE OR REPLACE TRIGGER TR_PRODUCTOS_01
AFTER INSERT ON PRODUCTOS
FOR EACH ROW
DECLARE
-- local variables
BEGIN
INSERT INTO PRECIOS_PRODUCTOS
(CO_PRODUCTO,PRECIO,FX_ACTUALIZACION)
VALUES
(:NEW.CO_PRODUCTO,100,SYSDATE);
END ;
El trigger se ejecutar cuando sobre la tabla PRODUCTOS se ejecute una sentencia INSERT.
INSERT INTO PRODUCTOS
(CO_PRODUCTO, DESCRIPCION)
VALUES
('000100','PRODUCTO 000100');
Ejemplo 2: Vamos a a crear un trigger que se dispar automticamente despus de la modificacin del salario
de la tabla empleado y pase un comentario a la tabla auditar.
Create or replace trigger auditar_salario
after update of salario
on empleado
for each row
begin
insert into auditar values
('se ha modificado el salario' || :old.num_empleado);
end;
--------------------------------------------------------------------------------------------------------------
Ejemplo: En este ejemplo, si insertamos o actualizamos el registro de un empleado de manera que su salario
sea superior a 5000 pesos, el trigger PL/SQL actualizar dicho salario al valor de 5000 pesos
independientemente del salario que nosotros hayamos insertado o introducido al modificar el registro.
CREATE TRIGGER tr1_empleados
BEFORE INSERT OR UPDATE OF salario
ON empleados
FOR EACH ROW
WHEN (:new.salario > 5000);
BEGIN
UPDATE empleados
SET salario = 5000
WHERE empleado_id = :new.empleado_id;
END;
Modificar ancho de la pantalla de SQL Plus
set linesize 200
Comandos
Existen dos tipos de comandos SQL:
los DLL que permiten crear y definir nuevas bases de datos, campos e
ndices.
los DML que permiten generar consultas para ordenar, filtrar y extraer datos
de la base de datos.
2.3 Consultas con Predicado
El predicado se incluye entre la clasula y el primer nombre del campo a recuperar,
los posibles predicados son:
ALL
Si no se incluye ninguno de los predicados se asume ALL. El Motor de base de
datos selecciona todos los registros que cumplen las condiciones de la instruccin
SQL. No se conveniente abusar de este predicado ya que obligamos al motor de la
base de datos a analizar la estructura de la tabla para averiguar los campos que
contiene, es mucho ms rpido indicar el listado de campos deseados.
SELECT ALL FROM Empleados;
SELECT * FROM Empleados;
TOP
Devuelve un cierto nmero de registros que entran entre al principio o al final de un
rango especificado por una clusula ORDER BY. Supongamos que queremos
recuperar los nombres de los 25 primeros estudiantes del curso 1994:
SELECT TOP 25 Nombre, Apellido FROM Estudiantes
ORDER BY Nota DESC;
Si no se incluye la clusula ORDER BY, la consulta devolver un conjunto arbitrario
de 25 registros de la tabla Estudiantes .El predicado TOP no elige entre valores
iguales. En el ejemplo anterior, si la nota media nmero 25 y la 26 son iguales, la
consulta devolver 26 registros. Se puede utilizar la palabra reservada PERCENT
para devolver un cierto porcentaje de registros que caen al principio o al final de un
rango especificado por la clusula ORDER BY. Supongamos que en lugar de los 25
primeros estudiantes deseamos el 10 por ciento del curso:
SELECT TOP 10 PERCENT Nombre, Apellido FROM Estudiantes
ORDER BY Nota DESC;
El valor que va a continuacin de TOP debe ser un Integer sin signo.TOP no afecta
a la posible actualizacin de la consulta.
DISTINCT
Omite los registros que contienen datos duplicados en los campos seleccionados.
Para que los valores de cada campo listado en la instruccin SELECT se incluyan en
la consulta deben ser nicos.
Por ejemplo, varios empleados listados en la tabla Empleados pueden tener el
mismo apellido. Si dos registros contienen Lpez en el campo Apellido, la siguiente
instruccin SQL devuelve un nico registro:
SELECT DISTINCT Apellido FROM Empleados;
Con otras palabras el predicado DISTINCT devuelve aquellos registros cuyos
campos indicados en la clusula SELECT posean un contenido diferente. El
resultado de una consulta que utiliza DISTINCT no es actualizable y no refleja los
cambios subsiguientes realizados por otros usuarios.
DISTINCTROW
Devuelve los registros diferentes de una tabla; a diferencia del predicado anterior
que slo se fijaba en el contenido de los campos seleccionados, ste lo hace en el
contenido del registro completo independientemente de los campo indicados en la
clusula SELECT.
SELECT DISTINCTROW Apellido FROM Empleados;
Si la tabla empleados contiene dos registros: Antonio Lpez y Marta Lpez el
ejemplo del predicado DISTINCT devuleve un nico registro con el valor Lpez en el
campo Apellido ya que busca no duplicados en dicho campo. Este ltimo ejemplo
devuelve dos registros con el valor Lpez en el apellido ya que se buscan no
duplicados en el registro completo.
2.4 Alias
En determinadas circunstancias es necesario asignar un nombre a alguna columna
determinada de un conjunto devuelto, otras veces por simple capricho o por otras
circunstancias. Para resolver todas ellas tenemos la palabra reservada AS que se
encarga de asignar el nombre que deseamos a la columna deseada. Tomado como
referencia el ejemplo anterior podemos hacer que la columna devuelta por la
consulta, en lugar de llamarse apellido (igual que el campo devuelto) se llame
Empleado. En este caso procederamos de la siguiente forma:
SELECT DISTINCTROW Apellido AS Empleado FROM Empleados;
2.5 Recuperar Informacin de una base de Datos Externa
Para concluir este captulo se debe hacer referencia a la recuperacin de registros
de bases de datos externa. Es ocasiones es necesario la recuperacin de
informacin que se encuentra contenida en una tabla que no se encuentra en la
base de datos que ejecutar la consulta o que en ese momento no se encuentra
abierta, esta situacin la podemos salvar con la palabra reservada IN de la
siguiente forma:
SELECT DISTINCTROW Apellido AS Empleado FROM Empleados
IN 'c:\databases\gestion.mdb';
En donde c:\databases\gestion.mdb es la base de datos que contiene la tabla
Empleados.
Las fechas se deben escribir siempre en formato mm-dd-aa en donde mm
representa el mes, dd el da y aa el ao, hay que prestar atencin a los separadores
-no sirve la separacin habitual de la barra (/), hay que utilizar el guin (-) y
adems la fecha debe ir encerrada entre almohadillas (#). Por ejemplo si deseamos
referirnos al da 3 de Septiembre de 1995 deberemos hacerlo de la siguente forma;
#09-03-95# #9-3-95#.
3.3 El Operador Like
Se utiliza para comparar una expresin de cadena con un modelo en una expresin
SQL. Su sintaxis es:
expresin Like modelo
En donde expresin es una cadena modelo o campo contra el que se compara
expresin. Se puede utilizar el operador Like para encontrar valores en los campos
que coincidan con el modelo especificado. Por modelo puede especificar un valor
completo (Ana Mara), o se pueden utilizar caracteres comodn como los
reconocidos por el sistema operativo para encontrar un rango de valores (Like
An*).
El operador Like se puede utilizar en una expresin para comparar un valor de un
campo con una expresin de cadena. Por ejemplo, si introduce Like C* en una
consulta SQL, la consulta devuelve todos los valores de campo que comiencen por
la letra C. En una consulta con parmetros, puede hacer que el usuario escriba el
modelo que se va a utilizar.
El ejemplo siguiente devuelve los datos que comienzan con la letra P seguido de
cualquier letra entre A y F y de tres dgitos:
Like 'P[A-F]###'
Este ejemplo devuelve los campos cuyo contenido empiece con una letra de la A a
la D seguidas de cualquier cadena.
Like '[A-D]*'
En la tabla siguiente se muestra cmo utilizar el operador Like para comprobar
expresiones con diferentes modelos.
4.5 StDev, StDevP
Devuelve estimaciones de la desviacin estndar para la poblacin (el total de los registros de la tabla) o una
muestra de la poblacin representada (muestra aleatoria) . Su sintaxis es:
StDev(expr)
StDevP(expr)
En donde expr representa el nombre del campo que contiene los datos que desean evaluarse o una expresin
que realiza un clculo utilizando los datos de dichos campos. Los operandos de expr pueden incluir el nombre
de un campo de una tabla, una constante o una funcin (la cual puede ser intrnseca o definida por el usuario
pero no otras de las funciones agregadas de SQL)
StDevP evala una poblacin, y StDev evala una muestra de la poblacin. Si la consulta contiene menos de
dos registros (o ningn registro para StDevP), estas funciones devuelven un valor Null (el cual indica que la
desviacin estndar no puede calcularse).
SELECT StDev(Gastos) AS Desviacion FROM Pedidos WHERE Pais = 'Espaa';
SELECT StDevP(Gastos) AS Desviacion FROM Pedidos WHERE Pais= 'Espaa';
5. Consultas de Accin
Las consultas de accin son aquellas que no devuelven ningn registro, son las encargadas de acciones como
aadir y borrar y modificar registros.
5.1 DELETE
Crea una consulta de eliminacin que elimina los registros de una o ms de las tablas listadas en la clusula
FROM que satisfagan la clusula WHERE. Esta consulta elimina los registros completos, no es posible eliminar el
contenido de algn campo en concreto. Su sintaxis es:
DELETE Tabla.* FROM Tabla WHERE criterio
DELETE es especialmente til cuando se desea eliminar varios registros. En una instruccin DELETE con
mltiples tablas, debe incluir el nombre de tabla (Tabla.*). Si especifica ms de una tabla desde la que eliminar
registros, todas deben ser tablas de muchos a uno. Si desea eliminar todos los registros de una tabla, eliminar
la propia tabla es ms eficiente que ejecutar una consulta de borrado.
Se puede utilizar DELETE para eliminar registros de una nica tabla o desde varios lados de una relacin uno a
muchos. Las operaciones de eliminacin en cascada en una consulta nicamente eliminan desde varios lados de
una relacin. Por ejemplo, en la relacin entre las tablas Clientes y Pedidos, la tabla Pedidos es la parte de
muchos por lo que las operaciones en cascada solo afectaran a la tabla Pedidos. Una consulta de borrado
elimina los registros completos, no nicamente los datos en campos especficos. Si desea eliminar valores en un
campo especificado, crear una consulta de actualizacin que cambie los valores a Null.
Una vez que se han eliminado los registros utilizando una consulta de borrado, no puede deshacer la operacin.
Si desea saber qu registros se eliminarn, primero examine los resultados de una consulta de seleccin que
utilice el mismo criterio y despus ejecute la consulta de borrado. Mantenga copias de seguridad de sus datos
en todo momento. Si elimina los registros equivocados podr recuperarlos desde las copias de seguridad.
DELETE * FROM Empleados WHERE Cargo = 'Vendedor';
5.2 INSERT INTO
Agrega un registro en una tabla. Se la conoce como una consulta de datos aadidos. Esta consulta puede ser de
dos tipo: Insertar un nico registro Insertar en una tabla los registros contenidos en otra tabla.
5.2.1 Para insertar un nico Registro:
En este caso la sintaxis es la siguiente:
INSERT INTO Tabla (campo1, campo2, .., campoN)
VALUES (valor1, valor2, ..., valorN)
Esta consulta graba en el campo1 el valor1, en el campo2 y valor2 y as sucesivamente. Hay que prestar
especial atencin a acotar entre comillas simples (') los valores literales (cadenas de caracteres) y las fechas
indicarlas en formato mm-dd-aa y entre caracteres de almohadillas (#).
5.2.2 Para insertar Registros de otra Tabla:
En este caso la sintaxis es:
INSERT INTO Tabla [IN base_externa] (campo1, campo2, ..., campoN)
SELECT TablaOrigen.campo1, TablaOrigen.campo2, ..., TablaOrigen.campoN
FROM TablaOrigen
En este caso se seleccionarn los campos 1,2, ..., n dela tabla origen y se grabarn en los campos 1,2,.., n de
la Tabla. La condicin SELECT puede incluir la clusula WHERE para filtrar los registros a copiar. Si Tabla y
TablaOrigen poseen la misma estrucutra podemos simplificar la sintaxis a:
INSERT INTO Tabla SELECT TablaOrigen.* FROM TablaOrigen
De esta forma los campos de TablaOrigen se grabarn en Tabla, para realizar esta operacin es necesario que
todos los campos de TablaOrigen estn contenidos con igual nombre en Tabla. Con otras palabras que Tabla
posea todos los campos de TablaOrigen (igual nombre e igual tipo).
En este tipo de consulta hay que tener especial atencin con los campos contadores o autonumricos puesto
que al insertar un valor en un campo de este tipo se escribe el valor que contenga su campo homlogo en la
tabla origen, no incrementandose como le corresponde.
Se puede utilizar la instruccin INSERT INTO para agregar un registro nico a una tabla, utilizando la sintaxis
de la consulta de adicin de registro nico tal y como se mostr anteriormente. En este caso, su cdigo
especfica el nombre y el valor de cada campo del registro. Debe especificar cada uno de los campos del
registro al que se le va a asignar un valor as como el valor para dicho campo. Cuando no se especifica dicho
campo, se inserta el valor predeterminado o Null. Los registros se agregan al final de la tabla.
Tambin se puede utilizar INSERT INTO para agregar un conjunto de registros pertenecientes a otra tabla o
consulta utilizando la clusula SELECT ... FROM como se mostr anteriormente en la sintaxis de la consulta de
adicin de mltiples registros. En este caso la clusula SELECT especifica los campos que se van a agregar en la
tabla destino especificada.
La tabla destino u origen puede especificar una tabla o una consulta.
Si la tabla destino contiene una clave principal, hay que segurarse que es nica, y con valores no-Null ; si no es
as, no se agregarn los registros. Si se agregan registros a una tabla con un campo Contador , no se debe
incluir el campo Contador en la consulta. Se puede emplear la clusula IN para agregar registros a una tabla en
otra base de datos.
Se pueden averiguar los registros que se agregarn en la consulta ejecutando primero una consulta de
seleccin que utilice el mismo criterio de seleccin y ver el resultado. Una consulta de adicin copia los registros
de una o ms tablas en otra. Las tablas que contienen los registros que se van a agregar no se vern afectadas
por la consulta de adicin. En lugar de agregar registros existentes en otra tabla, se puede especificar los
valores de cada campo en un nuevo registro utilizando la clusula VALUES. Si se omite la lista de campos, la
clusula VALUES debe incluir un valor para cada campo de la tabla, de otra forma fallar INSERT.
INSERT INTO Clientes SELECT Clientes_Viejos.* FROM Clientes_Nuevos;
INSERT INTO Empleados (Nombre, Apellido, Cargo)
VALUES ('Luis', 'Snchez', 'Becario');
INSERT INTO Empleados SELECT Vendedores.* FROM Vendedores
WHERE Fecha_Contratacion < Now() - 30;
5.3 UPDATE
Crea una consulta de actualizacin que cambia los valores de los campos de una tabla especificada basndose
en un criterio especfico. Su sintaxis es:
UPDATE Tabla SET Campo1=Valor1, Campo2=Valor2, ... CampoN=ValorN
WHERE Criterio;
UPDATE es especialmente til cuando se desea cambiar un gran nmero de registros o cuando stos se
encuentran en mltiples tablas. Puede cambiar varios campos a la vez. El ejemplo siguiente incrementa los
valores Cantidad pedidos en un 10 por ciento y los valores Transporte en un 3 por ciento para aquellos que se
hayan enviado al Reino Unido.:
UPDATE Pedidos SET Pedido = Pedidos * 1.1, Transporte = Transporte * 1.03
WHERE PaisEnvo = 'ES';
UPDATE no genera ningn resultado. Para saber qu registros se van a cambiar, hay que examinar primero el
resultado de una consulta de seleccin que utilice el mismo criterio y despus ejecutar la consulta de
actualizacin.
UPDATE Empleados SET Grado = 5 WHERE Grado = 2;
UPDATE Productos SET Precio = Precio * 1.1 WHERE Proveedor = 8 AND Familia = 3;
Si en una consulta de actualizacin suprimimos la clusula WHERE todos los registros de la tabla sealada
sern actualizados.
UPDATE Empleados SET Salario = Salario * 1.1
6. Tipos de Datos
Los tipos de datos SQL se clasifican en 13 tipos de datos primarios y de varios sinnimos vlidos reconocidos
por dichos tipos de datos.
Tipos de datos primarios:
La siguiente tabla recoge los sinonimos de los tipos de datos definidos:
7. SubConsultas
Una subconsulta es una instruccin SELECT anidada dentro de una instruccin SELECT, SELECT...INTO,
INSERT...INTO, DELETE, o UPDATE o dentro de otra subconsulta.
Puede utilizar tres formas de sintaxis para crear una subconsulta:
comparacin [ANY | ALL | SOME] (instruccin sql)
expresin [NOT] IN (instruccin sql)
[NOT] EXISTS (instruccin sql)
En donde:
comparacin
Es una expresin y un operador de comparacin que compara la expresin con el resultado de la subconsulta.
expresin
Es una expresin por la que se busca el conjunto resultante de la subconsulta.
instruccin sql
Es una instruccin SELECT, que sigue el mismo formato y reglas que cualquier otra instruccin SELECT. Debe ir
entre parntesis.
Se puede utilizar una subconsulta en lugar de una expresin en la lista de campos de una instruccin SELECT o
en una clusula WHERE o HAVING. En una subconsulta, se utiliza una instruccin SELECT para proporcionar un
conjunto de uno o ms valores especificados para evaluar en la expresin de la clusula WHERE o HAVING.
Se puede utilizar el predicado ANY o SOME, los cuales son sinnimos, para recuperar registros de la consulta
principal, que satisfagan la comparacin con cualquier otro registro recuperado en la subconsulta. El ejemplo
siguiente devuelve todos los productos cuyo precio unitario es mayor que el de cualquier producto vendido con
un descuento igual o mayor al 25 por ciento.:
SELECT * FROM Productos WHERE PrecioUnidad > ANY
(SELECT PrecioUnidad FROM DetallePedido WHERE Descuento >= 0 .25);
El predicado ALL se utiliza para recuperar nicamente aquellos registros de la consulta principal que satisfacen
la comparacin con todos los registros recuperados en la subconsulta. Si se cambia ANY por ALL en el ejemplo
anterior, la consulta devolver nicamente aquellos productos cuyo precio unitario sea mayor que el de todos
los productos vendidos con un descuento igual o mayor al 25 por ciento. Esto es mucho ms restrictivo.
El predicado IN se emplea para recuperar nicamente aquellos registros de la consulta principal para los que
algunos registros de la subconsulta contienen un valor igual. El ejemplo siguiente devuelve todos los productos
vendidos con un descuento igual o mayor al 25 por ciento.:
SELECT * FROM Productos WHERE IDProducto IN
(SELECT IDProducto FROM DetallePedido WHERE Descuento >= 0.25);
Inversamente se puede utilizar NOT IN para recuperar nicamente aquellos registros de la consulta principal
para los que no hay ningn registro de la subconsulta que contenga un valor igual.
El predicado EXISTS (con la palabra reservada NOT opcional) se utiliza en comparaciones de verdad/falso para
determinar si la subconsulta devuelve algn registro.
Se puede utilizar tambin alias del nombre de la tabla en una subconsulta para referirse a tablas listadas en la
clusula FROM fuera de la subconsulta. El ejemplo siguiente devuelve los nombres de los empleados cuyo
salario es igual o mayor que el salario medio de todos los empleados con el mismo ttulo. A la tabla Empleados
se le ha dado el alias T1::
SELECT Apellido, Nombre, Titulo, Salario FROM Empleados AS T1
WHERE Salario >= (SELECT Avg(Salario) FROM Empleados
WHERE T1.Titulo = Empleados.Titulo) ORDER BY Titulo;
En el ejemplo anterior , la palabra reservada AS es opcional.
SELECT Apellidos, Nombre, Cargo, Salario FROM Empleados
WHERE Cargo LIKE "Agente Ven*" AND Salario > ALL (SELECT Salario FROM
Empleados WHERE (Cargo LIKE "*Jefe*") OR (Cargo LIKE "*Director*"));
Obtiene una lista con el nombre, cargo y salario de todos los agentes de ventas cuyo salario es mayor
que el de todos los jefes y directores.
SELECT DISTINCTROW NombreProducto, Precio_Unidad FROM Productos
WHERE (Precio_Unidad = (SELECT Precio_Unidad FROM Productos WHERE
Nombre_Producto = "Almbar anisado");
Obtiene una lista con el nombre y el precio unitario de todos los productos con el mismo precio que el
almbar anisado.
SELECT DISTINCTROW Nombre_Contacto, Nombre_Compaia, Cargo_Contacto,
Telefono FROM Clientes WHERE (ID_Cliente IN (SELECT DISTINCTROW
ID_Cliente FROM Pedidos WHERE Fecha_Pedido >= #04/1/93# <#07/1/93#);
Obtiene una lista de las compaas y los contactos de todos los clientes que han realizado un pedido
en el segundo trimestre de 1993.
SELECT Nombre, Apellidos FROM Empleados AS E WHERE EXISTS
(SELECT * FROM Pedidos AS O WHERE O.ID_Empleado = E.ID_Empleado);
Selecciona el nombre de todos los empleados que han reservado al menos un pedido.
SELECT DISTINCTROW Pedidos.Id_Producto, Pedidos.Cantidad,
(SELECT DISTINCTROW Productos.Nombre FROM Productos WHERE
Productos.Id_Producto = Pedidos.Id_Producto) AS ElProducto FROM
Pedidos WHERE Pedidos.Cantidad > 150 ORDER BY Pedidos.Id_Producto;
Recupera el Cdigo del Producto y la Cantidad pedida de la tabla pedidos, extrayendo el nombre del
producto de la tabla de productos.
8. Consultas de Referencias Cruzadas
Una consulta de referencias cruzadas es aquella que nos permite visualizar los datos en filas y en columnas,
estilo tabla, por ejemplo:
Si tenemos una tabla de productos y otra tabla de pedidos, podemos visualizar en total de productos pedidos
por ao para un artculo determinado, tal y como se visualiza en la tabla anterior.
La sintaxis para este tipo de consulta es la siguiente:
TRANSFORM funcin agregada instruccin select PIVOT campo pivot
[IN (valor1[, valor2[, ...]])]
En donde:
funcin agregada
Es una funcin SQL agregada que opera sobre los datos seleccionados.
instruccin select
Es una instruccin SELECT.
campo pivot
Es el campo o expresin que desea utilizar para crear las cabeceras de la columna en el resultado de la
consulta.
valor1, valor2
Son valores fijos utilizados para crear las cabeceras de la columna.
Para resumir datos utilizando una consulta de referencia cruzada, se seleccionan los valores de los campos o
expresiones especificadas como cabeceras de columnas de tal forma que pueden verse los datos en un formato
ms compacto que con una consulta de seleccin.
TRANSFORM es opcional pero si se incluye es la primera instruccin de una cadena SQL. Precede a la
instruccin SELECT que especifica los campos utilizados como encabezados de fila y una clusula GROUP BY
que especifica el agrupamiento de las filas. Opcionalmente puede incluir otras clusulas como por ejemplo
WHERE, que especifica una seleccin adicional o un criterio de ordenacin .
Los valores devueltos en campo pivot se utilizan como encabezados de columna en el resultado de la consulta.
Por ejemplo, al utilizar las cifras de ventas en el mes de la venta como pivot en una consulta de referencia
cruzada se crearan 12 columnas. Puede restringir el campo pivot para crear encabezados a partir de los valores
fijos (valor1, valor2) listados en la clusula opcional IN.
Tambin puede incluir valores fijos, para los que no existen datos, para crear columnas adicionales.
Ejemplos
TRANSFORM Sum(Cantidad) AS Ventas SELECT Producto, Cantidad FROM
Pedidos WHERE Fecha Between #01-01-98# And #12-31-98# GROUP BY Producto
ORDER BY Producto PIVOT DatePart("m", Fecha);
Crea una consulta de tabla de referencias cruzadas que muestra las ventas de productos por mes para
un ao especfico. Los meses aparecen de izquierda a derecha como columnas y los nombres de los
productos aparecen de arriba hacia abajo como filas.
TRANSFORM Sum(Cantidad) AS Ventas SELECT Compania FROM Pedidos
WHERE Fecha Between #01-01-98# And #12-31-98# GROUP BY Compania
ORDER BY Compania PIVOT "Trimestre " & DatePart("q", Fecha) In ('Trimestre1',
'Trimestre2', 'Trimestre 3', 'Trimestre 4');
Crea una consulta de tabla de referencias cruzadas que muestra las ventas de productos por trimestre
de cada proveedor en el ao indicado. Los trimestres aparecen de izquierda a derecha como columnas
y los nombres de los proveedores aparecen de arriba hacia abajo como filas.
Un caso prctico:
Se trata de resolver el siguiente problema: tenemos una tabla de productos con dos campos, el cdigo y el
nombre del producto, tenemos otra tabla de pedidos en la que anotamos el cdigo del producto, la fecha del
pedido y la cantidad pedida. Deseamos consultar los totales de producto por ao, calculando la media anual de
ventas.
Estructura y datos de las tablas:
1. Artculos:
2. Pedidos:
Para resolver la consulta planteamos la siguiente consulta:
TRANSFORM Sum(Pedidos.Cantidad) AS Resultado SELECT Nombre AS Producto,
Pedidos.Id AS Cdigo, Sum(Pedidos.Cantidad) AS TOTAL, Avg(Pedidos.Cantidad)
AS Media FROM Pedidos INNER JOIN Artculos ON Pedidos.Id = Artculos.Id
GROUP BY Pedidos.Id, Artculos.Nombre PIVOT Year(Fecha);
y obtenemos el siguiente resultado:
Comentarios a la consulta:
La clsula TRANSFORM indica el valor que deseamos visualizar en las columnas que realmente pertenecen a la
consulta, en este caso 1996 y 1997, puesto que las dems columnas son opcionales.
SELECT especifica el nombre de las columnas opcionales que deseamos visualizar, en este caso Producto,
Cdigo, Total y Media, indicando el nombre del campo que deseamos mostrar en cada columna o el valor de la
misma. Si incluimos una funcin de clculo el resultado se har en base a los datos de la fila actual y no al total
de los datos.
FROM especifica el origen de los datos. La primera tabla que debe figurar es aquella de donde deseamos
extraer los datos, esta tabla debe contener al menos tres campos, uno para los ttulos de la fila, otros para los
ttulos de la columna y otro para calcular el valor de las celdas.
En este caso en concreto se deseaba visualizar el nombre del producto, como el tabla de pedidos slo figuraba
el cdigo del mismo se aadi una nueva columna en la clusula select llamada Producto que se corresponda
con el campo Nombre de la tabla de artculos. Para vincular el cdigo del artculo de la tabla de pedidos con el
nombre del misma de la tabla artculos se insert la clusula INNER JOIN.
La clusula GROUP BY especifica el agrupamiento de los registros, contrariamente a los manuales de
instruccin
esta clusula no es opcional ya que debe figurar siempre y debemos agrupar los registros por el campo del cual
extraemos la informacin. En este caso existen dos campos del cual extraemos la informacin:
pedidos.cantidad y artculos.nombre, por ellos agrupamos por los campos.
Para finalizar la clusula PIVOT indica el nombre de las columnas no opcionales, en este caso 1996 y 1997 y
como vamos a el dato que aparecer en las columnas, en este caso empleamos el ao en que se produjo el
pedido, extrayndolo del campo pedidos.fecha.
Otras posibilidades de fecha de la clusula pivot son las siguientes:
1. Para agrupamiento por Trimestres
PIVOT "Tri " & DatePart("q",[Fecha]);
2. Para agrupamiento por meses (sin tener en cuenta el ao)
PIVOT Format([Fecha],"mmm") In ("Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov",
"Dic");
3. Para agrupar por das
PIVOT Format([Fecha],"Short Date");
9. Consultas de Unin Internas
Las vinculaciones entre tablas se realiza mediante la clusula INNER que combina registros de dos tablas
siempre que haya concordancia de valores en un campo comn. Su sintaxis es:
SELECT campos FROM tb1 INNER JOIN tb2 ON tb1.campo1 comp tb2.campo2
En donde:
tb1, tb2
Son los nombres de las tablas desde las que se combinan los registros.
campo1, campo2
Son los nombres de los campos que se combinan. Si no son numricos, los campos deben ser del mismo tipo
de datos y contener el mismo tipo de datos, pero no tienen que tener el mismo nombre.
comp
Es cualquier operador de comparacin relacional : =, <, >, <=, >=, o <>.
Se puede utilizar una operacin INNER JOIN en cualquier clusula FROM. Esto crea una combinacin por
equivalencia, conocida tambin como unin interna. Las combinaciones Equi son las ms comunes; stas
combinan los registros de dos tablas siempre que haya concordancia de valores en un campo comn a ambas
tablas. Se puede utilizar INNER JOIN con las tablas Departamentos y Empleados para seleccionar todos los
empleados de cada departamento. Por el contrario, para seleccionar todos los departamentos (incluso si alguno
de ellos no tiene ningn empleado asignado) se emplea LEFT JOIN o todos los empleados (incluso si alguno no
est asignado a ningn departamento), en este caso RIGHT JOIN.
Si se intenta combinar campos que contengan datos Memo u Objeto OLE, se produce un error. Se pueden
combinar dos campos numricos cualesquiera, incluso si son de diferente tipo de datos. Por ejemplo, puede
combinar un campo Numrico para el que la propiedad Size de su objeto Field est establecida como Entero, y
un campo Contador.
El ejemplo siguiente muestra cmo podra combinar las tablas Categoras y Productos basndose en el campo
IDCategoria:
SELECT Nombre_Categora, NombreProducto
FROM Categorias INNER JOIN Productos
ON Categorias.IDCategoria = Productos.IDCategoria;
En el ejemplo anterior, IDCategoria es el campo combinado, pero no est incluido en la salida de la consulta ya
que no est incluido en la instruccin SELECT. Para incluir el campo combinado, incluir el nombre del campo en
la instruccin SELECT, en este caso, Categorias.IDCategoria.
Tambin se pueden enlazar varias clusulas ON en una instruccin JOIN, utilizando la sintaxis siguiente:
SELECT campos
FROM tabla1 INNER JOIN tabla2
ON tb1.campo1 comp tb2.campo1 AND
ON tb1.campo2 comp tb2.campo2) OR
ON tb1.campo3 comp tb2.campo3)];
Tambin puede anidar instrucciones JOIN utilizando la siguiente sintaxis:
SELECT campos
FROM tb1 INNER JOIN
(tb2 INNER JOIN [( ]tb3
[INNER JOIN [( ]tablax [INNER JOIN ...)]
ON tb3.campo3 comp tbx.campox)]
ON tb2.campo2 comp tb3.campo3)
ON tb1.campo1 comp tb2.campo2;
Un LEFT JOIN o un RIGHT JOIN puede anidarse dentro de un INNER JOIN, pero un INNER JOIN no puede
anidarse dentro de un LEFT JOIN o un RIGHT JOIN.
Ejemplo
SELECT DISTINCTROW Sum([Precio unidad] * [Cantidad]) AS [Ventas],
[Nombre] & " " & [Apellidos] AS [Nombre completo] FROM [Detalles de pedidos],
Pedidos, Empleados, Pedidos INNER JOIN [Detalles de pedidos] ON Pedidos.
[ID de pedido] = [Detalles de pedidos].[ID de pedido], Empleados INNER JOIN
Pedidos ON Empleados.[ID de empleado] = Pedidos.[ID de empleado] GROUP BY
[Nombre] & " " & [Apellidos];
Crea dos combinaciones equivalentes: una entre las tablas Detalles de pedidos y Pedidos, y la otra
entre las tablas Pedidos y Empleados. Esto es necesario ya que la tabla Empleados no contiene datos
de ventas y la tabla Detalles de pedidos no contiene datos de los empleados. La consulta produce una
lista de empleados y sus ventas totales.
Si empleamos la clusula INNER en la consulta se seleccionarn slo aquellos registros de la tabla de la que
hayamos escrito a la izquierda de INNER JOIN que contengan al menos un registro de la tabla que hayamos
escrito a la derecha. Para solucionar esto tenemos dos clusulas que sustituyen a la palabra clave INNER, estas
clusulas son LEFT y RIGHT. LEFT toma todos los registros de la tabla de la izquierda aunque no tengan ningn
registro en la tabla de la izquierda. RIGHT realiza la misma operacin pero al contrario, toma todos los registros
de la tabla de la derecha aunque no tenga ningn registro en la tabla de la izquierda.
10. Consultas de Unin Externas
Se utiliza la operacin UNION para crear una consulta de unin, combinando los resultados de dos o ms
consultas o tablas independientes. Su sintaxis es:
[TABLE] consulta1 UNION [ALL] [TABLE]
consulta2 [UNION [ALL] [TABLE] consultan [ ... ]]
En donde:
consulta1, consulta2, consultan
Son instrucciones SELECT, el nombre de una consulta almacenada o el nombre de una tabla almacenada
precedido por la palabra clave TABLE.
Puede combinar los resultados de dos o ms consultas, tablas e instrucciones SELECT, en cualquier orden, en
una nica operacin UNION. El ejemplo siguiente combina una tabla existente llamada Nuevas Cuentas y una
instruccin SELECT:
TABLE [Nuevas Cuentas] UNION ALL SELECT * FROM Clientes
WHERE [Cantidad pedidos] > 1000;
Si no se indica lo contrario, no se devuelven registros duplicados cuando se utiliza la operacin UNION, no
obstante puede incluir el predicado ALL para asegurar que se devuelven todos los registros. Esto hace que la
consulta se ejecute ms rpidamente. Todas las consultas en una operacin UNION deben pedir el mismo
nmero de campos, no obstante los campos no tienen porqu tener el mismo tamao o el mismo tipo de datos.
Se puede utilizar una clusula GROUP BY y/o HAVING en cada argumento consulta para agrupar los datos
devueltos. Puede utilizar una clusula ORDER BY al final del ltimo argumento consulta para visualizar los datos
devueltos en un orden especfico.
SELECT [Nombre de compaa], Ciudad FROM Proveedores WHERE
Pas = 'Brasil' UNION SELECT [Nombre de compaa], Ciudad FROM Clientes
WHERE Pas = "Brasil"
Recupera los nombres y las ciudades de todos proveedores y clientes de Brasil
SELECT [Nombre de compaa], Ciudad FROM Proveedores WHERE Pas = 'Brasil'
UNION SELECT [Nombre de compaa], Ciudad FROM Clientes WHERE Pas =
'Brasil' ORDER BY Ciudad
Recupera los nombres y las ciudades de todos proveedores y clientes radicados en Brasil, ordenados
por el nombre de la ciudad
SELECT [Nombre de compaa], Ciudad FROM Proveedores WHERE Pas = 'Brasil'
UNION SELECT [Nombre de compaa], Ciudad FROM Clientes WHERE Pas =
'Brasil' UNION SELECT [Apellidos], Ciudad FROM Empleados WHERE Regin =
'Amrica del Sur'
Recupera los nombres y las ciudades de todos los proveedores y clientes de brasil y los apellidos y las
ciudades de todos los empleados de Amrica del Sur
TABLE [Lista de clientes] UNION TABLE [Lista de proveedores]
Recupera los nombres y cdigos de todos los proveedores y clientes
11. Estructuras de las Tablas
11.1 Creacin de Tablas Nuevas
Si se est utilizando el motor de datos de Microsoft para acceder a bases de datos access, slo se puede
emplear esta instruccin para crear bases de datos propias de access. Su sintaxis es:
CREATE TABLE tabla (campo1 tipo (tamao) ndice1 ,
campo2 tipo (tamao) ndice2 , ...,
ndice multicampo , ... )
En donde:
CREATE TABLE Empleados (Nombre TEXT (25) , Apellidos TEXT (50));
Crea una nueva tabla llamada Empleados con dos campos, uno llamado Nombre de tipo texto y
longutid 25 y otro llamado apellidos con longitud 50.
CREATE TABLE Empleados (Nombre TEXT (10), Apellidos TEXT,
Fecha_Nacimiento DATETIME) CONSTRAINT IndiceGeneral UNIQUE
([Nombre], [Apellidos], [Fecha_Nacimiento]);
Crea una nueva tabla llamada Empleados con un campo Nombre de tipo texto y longitud 10, otro con
llamado Apellidos de tipo texto y longitud predeterminada (50) y uno ms llamado Fecha_Nacimiento
de tipo Fecha/Hora. Tambin crea un ndice nico (no permite valores repetidos) formado por los tres
campos.
CREATE TABLE Empleados (ID INTEGER CONSTRAINT IndicePrimario PRIMARY,
Nombre TEXT, Apellidos TEXT, Fecha_Nacimiento DATETIME);
Crea una tabla llamada Empleados con un campo Texto de longitud predeterminada (50) llamado
Nombre y otro igual llamado Apellidos, crea otro campo llamado Fecha_Nacimiento de tipo Fecha/Hora
y el campo ID de tipo entero el que establece como clave principal.
11.2 La clusula CONSTRAINT
Se utiliza la clusula CONSTRAINT en las instrucciones ALTER TABLE y CREATE TABLE para crear o eliminar
ndices. Existen dos sintaxis para esta clusula dependiendo si desea Crear Eliminar un ndice de un nico
campo o si se trata de un campo multindice. Si se utiliza el motor de datos de Microsoft, slo podr utilizar
esta clusula con las bases de datos propias de dicho motor.
Para los ndices de campos nicos:
CONSTRAINT nombre {PRIMARY KEY | UNIQUE | REFERENCES tabla externa
[(campo externo1, campo externo2)]}
Para los ndices de campos mltiples:
CONSTRAINT nombre {PRIMARY KEY (primario1[, primario2 [, ...]]) |
UNIQUE (nico1[, nico2 [, ...]]) |
FOREIGN KEY (ref1[, ref2 [, ...]]) REFERENCES tabla externa [(campo externo1
[,campo externo2 [, ...]])]}
Si se desea crear un ndice para un campo cuando se esta utilizando las instrucciones ALTER TABLE o CREATE
TABLE la clusula CONTRAINT debe aparecer inmediatamente despus de la especificacin del campo
indexeado.
Si se desea crear un ndice con mltiples campos cuando se est utilizando las instrucciones ALTER TABLE o
CREATE TABLE la clusula CONSTRAINT debe aparecer fuera de la clusula de creacin de tabla.
11.3 Creacin de ndices
Si se utiliza el motor de datos Jet de Microsoft slo se pueden crear ndices en bases de datos del mismo
motor.
La sintaxis para crear un ndice en ua tabla ya definida en la siguiente:
CREATE [ UNIQUE ] INDEX ndice
ON tabla (campo [ASC|DESC][, campo [ASC|DESC], ...])
[WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }]
En donde:
Se puede utilizar CREATE INDEX para crear un pseudo ndice sobre una tabla adjunta en una fuente de datos
ODBC tal como SQL Server que no tenga todava un ndice. No necesita permiso o tener acceso a un servidor
remoto para crear un pseudo ndice, adems la base de datos remota no es consciente y no es afectada por el
pseudo ndice. Se utiliza la misma sintaxis para las tabla adjunta que para las originales. Esto es especialmente
til para crear un ndice en una tabla que sera de slo lectura debido a la falta de un ndice.
CREATE INDEX MiIndice ON Empleados (Prefijo, Telefono);
Crea un ndice llamado MiIndice en la tabla empleados con los campos Prefijo y Telefono.
CREATE UNIQUE INDEX MiIndice ON Empleados (ID) WITH DISALLOW NULL;
Crea un ndice en la tabla Empleados utilizando el campo ID, obligando que que el campo ID no
contenga valores nulos ni repetidos.
11.4 Modificar el Diseo de una Tabla
Modifica el diseo de una tabla ya existente, se puden modificar los campos o los ndices existentes. Su sintaxis
es:
ALTER TABLE tabla {ADD {COLUMN tipo de campo[(tamao)] [CONSTRAINT ndice]
CONSTRAINT ndice multicampo} |
DROP {COLUMN campo I CONSTRAINT nombre del ndice} }
En donde:
ALTER TABLE Empleados ADD COLUMN Salario CURRENCY;
Agrega un campo Salario de tipo Moneda a la tabla Empleados.
ALTER TABLE Empleados DROP COLUMN Salario;
Elimina el campo Salario de la tabla Empleados.
ALTER TABLE Pedidos ADD CONSTRAINT RelacionPedidos FOREIGN KEY
(ID_Empleado) REFERENCES Empleados (ID_Empleado);
Agrega un indice externo a la tabla Pedidos. El ndice externo se basa en el campo ID_Empleado y se
refiere al campo ID_Empleado de la tabla Empleados. En este ejemplo no es necesario indicar el
campo junto al nombre de la tabla en la clusula REFERENCES, pues ID_Empleado es la clave
principal de la tabla Empleados.
ALTER TABLE Pedidos DROP CONSTRAINT RelacionPedidos;
Elimina el ndide de la tabla Pedidos.
12 Consultas con Parmetros
Las consultas con parmetros son aquellas cuyas condiciones de bsqueda se definen mediante parmetros. Si
se ejecutan directamente desde la base de datos donde han sido definidas aparecer un mensaje solicitando el
valor de cada uno de los parmetros. Si deseamos ejecutarlas desde una aplicacin hay que asignar primero el
valor de los parmetros y despus ejecutarlas. Su sintaxis es la siguiente:
PARAMETERS nombre1 tipo1, nombre2 tipo2, ... , nombreN tipoN Consulta
En donde:
Puede utilizar nombre pero no tipo de datos en una clusula WHERE o HAVING.
PARAMETERS Precio_Minimo Currency, Fecha_Inicio DateTime;
SELECT IDPedido, Cantidad FROM Pedidos WHERE Precio > Precio_Minimo
AND FechaPedido >= Fecha_Inicio;
El ejemplo siguiente muestra como utilizar los parmetros en el programa de Visual Basic:
Public Sub GeneraConsulta()
Dim SQL As String
Dim Qd As QueryDef
Dim Rs As Recordset
SQL = "PARAMETERS Precio_Minimo Currency, Fecha_Inicio DateTime; "
SQL = SQL & "SELECT IDPedido, Cantidad FROM Pedidos WHERE Precio > "
SQL = SQL & "Precio_Minimo AND FechaPedido >= Fecha_Inicio; "
Set Qd = BaseDatos.CreateQueryDef(MiConsulta, SQL)
Qd.Parameters!Precio_Minimo = 2
Qd.Parameters!FechaInicio = #31/12/95#
Set Rs = Qd.OpenRecordset()
End Sub
Ejemplo:
PARAMETERS [Escriba los Apellidos:] Text; SELECT * FROM Empleados
WHERE [Escriba los Apellidos:] = [Apellidos];
La ejecucin desde la base de datos solicita al usuario los apellidos del empleado y despus muestra
los resultados.
13. Bases de Datos Externas
Para el acceso a bases de datos externas se utiliza la clusula IN. Se puede acceder a base de datos dBase,
Paradox o Btrieve. Esta clusula slo permite la conexin de una base de datos externa a la vez. Una base de
datos externa es una base de datos que no sea la activa. Aunque para mejorar los rendimientos es mejor
adjuntarlas a la base de datos actual y trabajar con ellas.
Para especificar una base de datos que no pertenece a Access Basic, se agrega un punto y coma (;) al nombre
y se encierra entre comillas simples. Tambin puede utilizar la palabra reservada DATABASE para especificar la
base de datos externa. Por ejemplo, las lneas siguientes especifican la misma tabla:
FROM Tabla IN '[dBASE IV; DATABASE=C:\DBASE\DATOS\VENTAS;]';
FROM Tabla IN 'C:\DBASE\DATOS\VENTAS' 'dBASE IV;'
Acceso a una base de datos externa de Microsoft Access:
SELECT IDCliente FROM Clientes IN MISDATOS.MDB WHERE IDCliente Like 'A*';
En donde MISDATOS.MDB es el nombre de una base de datos de Microsoft Access que contiene la
tabla Clientes.
Acceso a una base de datos externa de dBASE III o IV:
SELECT IDCliente FROM Clientes IN 'C:\DBASE\DATOS\VENTAS' 'dBASE IV';
WHERE IDCliente Like 'A*';
Para recuperar datos de una tabla de dBASE III+ hay que utilizar 'dBASE III+;' en lugar de 'dBASE
IV;'.
Acceso a una base de datos de Paradox 3.x o 4.x:
SELECT IDCliente FROM Clientes IN 'C:\PARADOX\DATOS\VENTAS'
'Paradox 4.x;' WHERE IDCliente Like 'A*';
Para recuperar datos de una tabla de Paradox versin 3.x, hay que sustituir 'Paradox 4.x;' por
'Paradox 3.x;'.
Acceso a una base de datos de Btrieve:
SELECT IDCliente FROM Clientes IN 'C:\BTRIEVE\DATOS\VENTAS\FILE.DDF'
'Btrieve;' WHERE IDCliente Like 'A*';
C:\BTRIEVE\DATOS\VENTAS\FILE.DDF es la ruta de acceso y nombre de archivo del archivo de
definicin de datos de Btrieve.
14. Omitir los Permisos de Ejecucin
En entornos de bases de datos con permisos de seguridad para grupos de trabajo se puede utilizar la clusula
WITH OWNERACCESS OPTION para que el usuario actual adquiera los derechos de propietario a la hora de
ejecutar la consulta. Su sintaxis es:
instruccin sql WITH OWNERACCESS OPTION
SELECT Apellido, Nombre, Salario FROM Empleados ORDER BY Apellido
WITH OWNERACCESS OPTION;
Esta opcin requiere que est declarado
15 La Clusula PROCEDURE
Esta clusula es poco usual y se utiliza para crear una consulta a la misma vez que se ejecuta, opcionalmente
define los parmetros de la misma. Su sintaxis es la siguiente:
PROCEDURE NombreConsulta Parmetro1 tipo1, .... , ParmetroN tipon ConsultaSQL
En donde:
PROCEDURE Lista_Categorias; SELECT DISTINCTROW Nombre_Categoria,
ID_Categora FROM Categorias ORDER BY Nombre_Categoria;
Asigna el nombre Lista_de_categoras a la consulta y la ejecuta.
PROCEDURE Resumen Fecha_Inicio DateTime, Fecha_Final DateTime; SELECT
DISTINCTROW Fecha_Envio, ID_Pedido, Importe_Pedido, Format(Fecha_Envio, "yyyy")
AS Ao FROM Pedidos WHERE Fecha_Envio Between Fecha_Inicio And Fecha_Final;
Asigna el nombre Resumen a la consulta e incluye dos parmetros.
16 ANEXOS
16.1 Resolucin de Problemas
16.1.1 Buscar Informacin duplicada en un campo de una tabla.
Para generar este tipo de consultas lo ms sencillo es utilizar el asistente de consultas de Access, editar la
sentencia SQL de la consulta y pegarla en nuestro cdigo. No obstante este tipo de consulta se consigue de la
siguiente forma:
SELECT DISTINCTROW Lista de Campos a Visualizar FROM Tabla
WHERE CampoDeBusqueda In (SELECT CampoDeBusqueda FROM Tabla As psudnimo
GROUP BY CampoDeBusqueda HAVING Count(*)>1 ) ORDER BY CampoDeBusqueda;
Un caso prctico, si deseamos localizar aquellos empleados con igual nombre y visualizar su cdigo
correspondiente, la consulta sera la siguiente:
SELECT DISTINCTROW Empleados.Nombre, Empleados.IdEmpleado
FROM Empleados WHERE Empleados.Nombre In (SELECT Nombre FROM
Empleados As Tmp GROUP BY Nombre HAVING Count(*)>1)
ORDER BY Empleados.Nombre;
16.1.2 Recuperar Registros de una tabla que no contengan registros relacionados en otra.
Este tipo de consulta se emplea en situaciones tales como saber que productos no se han vendido en un
determinado periodo de tiempo,
SELECT DISTINCTROW Productos.IdProducto, Productos.Nombre FROM Productos
LEFT JOIN Pedidos ON Productos.IdProducto = Pedidos.IdProduct WHERE
(Pedidos.IdProducto Is Null) AND (Pedidos.Fecha Between #01-01-98# And
#01-30-98#);
La sintaxis es sencilla, se trata de realizar una unin interna entre dos tablas seleccionadas mediante un LEFT
JOIN, establecimiendo como condicin que el campo relacionado de la segunda sea Null.
16.2 Utlizar SQL desde Visual Basic
Existen dos tipos de consultas SQL: las consultas de seleccin (nos devuelven datos) y las consultas de accin
(aquellas que no devuelven ningn registro). Ambas pueden ser tratadas en Visual Basic pero de forma
diferente.
Las consultas de seleccin se ejecutan recogiendo la informacin en un recordset previamente definido
mediante la instruccin openrecordset(), por ejemplo:
Dim SQL as String
Dim RS as recordset
SQL = "SELECT * FROM Empleados;"
Set RS=MiBaseDatos.OpenRecordSet(SQL)
Si la consula de seleccin se encuentra almacenada en una consulta de la base de datos:
Set RS=MiBaseDatos.OpenRecordset("MiConsulta")
Las consultas de accin, al no devolver ningn registro, no las podemos asignar a ningn recordset, en este
caso la forma de ejecutarlas es mediante los mtodos Execute y ExecuteSQL (para bases de datos ODBC), por
ejemplo:
Dim SQL as string
SQL = "DELETE * FROM Empleados WHERE Categoria = 'Ordenanza';"
MiBaseDatos.Execute SQL
16.3 Funciones de Visual Basic utilizables en una Instruccin SQL
DatePart
Esta funcin devuelve una parte sealada de una fecha concreta. Su sintaxis es:
DatePart(Parte, Fecha, ComienzoSemana, ComienzoAo)
Parte representa a la porcin de fecha que se desea obtener, los posibles valores son:
ComienzoSemana indica el primer da de la semana. Los posibles valores son:
ComienzoAo indica cual es la primera semana del ao; los posibles valores son:
16.4 Evaluar valores antes de ejecutar la Consuta.
Dentro de una sentencia SQL podemos emplear la funcin iif para indicar las condiciones de bsqueda. La
sintaxis de la funcin iif es la siguiente:
iif(Expresion,Valor1,Valor2)
En donde Expresin es la sentencia que evaluamos; si Expresin es verdadera entonces se devuelve Valor1, si
Expresin es falsa se devuelve Valor2.
SELECT * Total FROM Empleados WHERE Apellido =
iff(TX_Apellido.Text <> '', TX_Apellido.Text, *) ;
Supongamos que en un formulario tenemos una casilla de texto llamanda TX_Apellido. Si cuando
ejecutamos esta consulta la casilla contiene algn valor se devuelven todos los empleados cuyo
apellido coincida con el texto de la casilla, en caso contrario se devuelven todos los empleados.
SELECT Fecha, Producto, Cantidad, (iif(CodigoPostal>=28000 And
CodigoPostal <=28999,'Madrid','Nacional')) AS Destino FROM Pedidos;
Esta consulta devuelve los campos Fecha, Nombre del Producto y Cantidad de la tabla pedidos,
aadiendo un campo al final con el valor Madrid si el cdigo posta est dentro del intervalo, en caso
contario devuelve Nacional.
16.5 Un Pequeo Manual de Estilo
Siempre es bueno intentar hacer las cosas de igual modo para que el mantenimiento y la revisin nos sea una
labor lo ms sencilla posible. En lo que a mi respecta utilizo las siguiente normas a la hora de elaborar
sentecias SQL:
1. Las clusulas siempre las escribo con Maysculas.
2. Los operadores lgicos de sentencias siempre con Maysculas.
3. Las operaciones siempre la primera letra con maysculas y el resto en minsculas.
4. Los operadores lgicos incluidos en otros operadores la primera letra con maysculas y el resto con
minculas.
Los Nombres de las Tablas, Campos y Consultas, los escribo siempre la primera letra con maysculas y el resto
con minsculas, en algunos casos utilizo el carcter "_" para definir mejor el nombre: Detalles_Pedidos.
Aunque con el motor Jet se pueden utilizar acentos y espacios en blanco para nombrar los campos, las tablas y
las consultas no los utilizo porque cuando se exportar tablas a otros sistemas los acentos y los espacios en
blanco pueden producir errores innecesarios.
Recuerda siempre que si utilizas espacios en blanco para llamar tablas o consultas cada vez que hagas
referencias a ellos en una consulta debes incluir sus nombres entre corchetes.
SELECT [ID de Pedido], [Nombre del Producto], Cantidad FROM [Detalles del Pedido];
Programacin PL/SQL
PL/SQL amplia a SQL con los elementos caractersticos de los lenguajes de programacin, variables, sentencias
de control de flujos, bucles
Cuando se desea realizar una aplicacin completa para el manejo de una base de datos relacional, resulta
necesario utilizar alguna herramienta que soporte la capacidad de consulta del SQL y la versatilidad de los
lenguajes de programacin tradicionales. PL/SQL es el lenguaje de programacin que proporciona ORACLE para
extender el SQL estndar con otro tipo de instrucciones.
Introduccin:
SQL es un lenguaje de consulta para los sistemas de bases de datos relacionales (RDBMS), pero que no posee la
potencia de los lenguajes de programacin. No permite el uso de estructuras de control de flujo, bucles y
dems elementos caractersticos de la programacin. SQL es un lenguaje de consulta, no un lenguaje de
programacin.
SQL es la herramienta de programacin ideal para trabajar con base de datos en sentencias DMLs. Dicho esto;
PL/SQL es el lenguaje de programacin que extiende el SQL estndar de ORACLE y adems posee elementos
propios de los lenguajes de programacin.
Con PL/SQL vamos a poder programar las unidades de programa de la base de datos ORACLE, ests son:
Procedimientos almacenados
Funciones
Triggers
Scripts
Adems PL/SQL nos permite realizar programas sobre las siguientes herramientas de ORACLE:
Oracle Forms
Oracle Reports
Oracle Aplication Server
Primeros pasos con PL/SQL
Para programar en PL/SQL es necesario conocer sus fundamentos. PL/SQL no es CASE-SENSITIVE, es decir, no
diferencia maysculas de minsculas como otros lenguajes de programacion como C o Java. SIN embargo
debemos recordar que ORACLE es Case-Sensitive en la bsqueda de texto.
Una lnea en PL/SQL contiene grupos de caracteres conocidos como UNIDADES LEXICAS, que pueden ser
clasificadas como:
DELIMITADORES
IDENTIFICADORES
LITERALES
COMENTARIOS
EXPRESIONES
Delimitador. Es un smbolo simple o compuesto que tiene una funcin especial en PL/SQL. Estos pueden ser:
Operadores Aritmticos
Operadores Lgicos
Operadores Relacionales
Identificador. Son empleados para nombrar objetos de programas en PL/SQL as como a unidades dentro del
mismo, estas unidades y objetos incluyen:
Constantes
Cursores
Variables
Subprogramas
Excepciones
Paquetes
Literal. Es un valor de tipo numrico, carcter, cadena o lgico no representado por un identificador (es un
valor explicito).
Comentario. Es una aclaracin que el programador incluye en el cdigo. Son soportados dos tipos de
comentarios, el de lnea simple y de multilneas.
- - Lnea simple
/*
Conjunto de lneas
*/
Tipos de datos en PL/SQL
Cada constante y variable tienen un tipo de dato en el cual se especifica el formato de almacenamiento,
restricciones y rango de valores validos.
PL/SQL proporciona una variedad predefinida de tipos de datos, casi todos los tipos de datos manejados son
similares a los proporcionados por SQL. Los tipos de datos mas comunes son:
NUMBER
CHAR
VARCHAR2
BOOLEAN
DATE
NUMBER (numrico): Almacena nmeros enteros o de punto flotante, virtualmente de cualquier longitud,
aunque puede ser especificada la precisin (nmero de dgitos) y la escala que es la que determina el
nmero de decimales.
-- NUMBER [(precisin, escala)]
saldo NUMBER(16,2);
/* Indica que puede almacenar un valor numerico de 16 posiciones, 2 de ellas son decimales. Es decir, 14
enteros y dos decimales. */
CHAR (carcter): Almacena datos de tipo carcter con una longitud mxima de 32767 y cuyo valor de
longitud por default es 1
-- CHAR [(longitud_maxima)]
Nombre CHAR(20);
/* Indica que puede almacenar valores alfanumricos de 20 posiciones */
VARCHAR2 (Carcter de longitud variable): Almacena datos de tipo carcter empleando solo la cantidad
necesaria aun cuando la longitud mxima sea mayor.
-- VARCHAR2 (longitud mxima)
nombre VARCHAR2(20);
/* Indica que puede almacenar valores alfanumricos de hasta 20 posiciones, cuando la longitud de los
datos sea menor de 20 no se rellena con blancos */
BOOLEAN (logico): se emplea para almacenar valores TRUE o FALSE
hay_error BOOLEAN;
DATE (fecha): almacena datos de tipo fecha. Las fechas se almacenan internamente como datos numricos,
por lo que es posible realizar operaciones aritmticas con ellas.
Fecha_inicio DATE;
Un atributo de tipo PL/SQL es un modificador que puede ser usado para obtener informacin de un objeto de
la base de datos.
El atributo %TYPE permite conocer el tipo de una variable, constante o campo de la base de datos.
El atributo %ROWTYPE permite obtener los tipos de datos de todos los campos de una tabla de la base de
datos, de una vista o de un cursor.
PL/SQL tambin permite la creacin de tipos personalizados (registros) y colecciones (tabla de PL/SQL), que
veremos ms adelante.
Otros Tipos de Datos
dec(p,e) La precisin mxima es de 38 dgitos. Donde p es la precisin y e la escala.
Ejemplo: dec(3,1) es un nmero que tiene 2 dgitos antes del decimal y un digito despus del decimal.
number(p,e) La precisin mxima es de 38 digitos. La precisin mxima es de 38 digitos. Donde p es la
precisin y e la escala.
real smallint char (tamao) Hasta 32767 bytes en PL/SQL. Hasta 2000 bytes en Oracle 9i. Donde tamao es
el nmero de caracteres a almacenar. Son cadenas de ancho fijo. Se rellena con espacios.
varchar2(tamao) Hasta 32767 bytes en PL/SQL. Hasta 4000 bytes en Oracle 9i. Donde tamao es el
nmero de caracteres a almacenar. Son cadenas de ancho fijo. Se rellena con espacios.
long Hasta 2 gigabytes. Son cadenas de ancho variable.
raw Hasta 32767 bytes en PL/SQL. Hasta 2000 bytes en Oracle 91. Son cadenas binarias de ancho variable.
long raw Hasta 2 gigabytes. Son cadenas binarias de ancho variable.
date Una fecha entre el 1 de enero de 4712 A.C. y el 31 de Diciembre de 9999 D.C.
timestamp(fractional seconds precision) fractional seconds precision debe ser un numero entre 0 y 9. (el
valor por defecto es 6) incluye ao, mes, dia, hora, minutos y segundos.
Por ejemplo: timestamp(6)
timestamp(fractional seconds precision) with time zone
timestamp(fractional seconds precision) with local time zone
interval year (year precision) to month
year precision debe ser un numero entre 0 y 9. (el valor por defecto es 2) periodo de tiempo almacenado
en aos y meses.
Ejemplo: interval year(4) to month
rowid El formato del campo rowid es: BBBBBBB.RRRR.FFFFF donde BBBBBBB es el bloque en el fichero
de la base de datos; RRRR es la fila del bloque; FFFFF es el Fichero de la base de datos. Cada registro de la
base de datos tiene una direccin fsica rowid.
Urowid[tamao] hasta 2000 bytes. ROWID universal. Donde tamao es opcional.
Boolean Valido en PL/SQL, este tipo de datos no existe en Oracle 9i.
nchar (tamao) hasta 32767 bytes en PLSQL, hasta 2000 bytes en Oracle 9i, donde tamao es el nmero
de caracteres a almacenar. Cadena NLS de ancho fijo.
Bfile Hasta 4 gigabytes. Localizadores de archivo apuntan a un objeto binario de solo lectura fuera de la
base de datos.
Blob hasta 4 gigabytes. Localizadores LOB apuntan a un gran objeto binario dentro de la base de datos.
Clob hasta 4 gigabytes. Localizadores LOB apuntan a un gran objeto de caracteres dentro de la base de
datos.
Nclob hasta 4 gigabytes. Localizadores LOB apuntan a un gran objeto NLS de caracteres dentro de la base
de datos.
Operadores en PL/SQL
Operadores de Asignacin
:= (dos puntos + igual )
Operadores aritmticos
+ (Suma)
- (resta)
* (Multiplicacin)
/ (division)
** (Exponente)
Operadores relacionales o de comparacin
= (igual a)
<> (Distinto de)
< (menor que)
<= (menor o igual a)
Operadores lgicos
AND (y lgico)
NOT (negacin)
OR (o lgico)
Operador de concatenacin
||
Estructuras de control PL/SQL
Estructura de control de flujo (IF)
En PL/SQL disponemos de la estructura condicional IF.
IF (expresin) THEN
-- instrucciones
ELSIF (expresin) THEN
-- instrucciones
ELSE
-- instrucciones
END IF;
Un aspecto a tener en cuenta es que la instruccin condicional anidada es ELSIF y no ELSEIF.
Sentencia GOTO
PL/SQL dispone de la sentencia GOTO. La sentencia GOTO desva el flujo de ejecucin a una determinada
etiqueta. En PL/SQL las etiquetas se indican del siguiente modo:
<<etiqueta>> Ejemplo:
DECLARE
Flag NUMBER;
BEGIN
Flag :=1;
IF (flag = 1) THEN
GOTO paso2;
END IF;
<<paso1>>
Dbms_output.put_line(Ejecucin de paso 1);
<<paso2>>
Dbms_output.put_line(Ejecucin de paso 2);
END;
Bucles
En PL/SQL tenemos a nuestra disposicin los siguientes iteradores o bucles:
LOOP
WHILE
FOR
Bloques PL/SQL
Un programa de PL/SQL est compuesto por bloques. Un programa est compuesto como mnimo de un
bloque.
Los bloques de PL/SQL pueden ser de los siguientes tipos:
Bloques annimos
Subprogramas
Estructura de un bloque
Los bloques PL/SQL presentan una estructura especifica compuesta de tres partes bien diferenciadas:
La seccin declarativa en donde se declaran todas las constantes y variables que se van a utilizar en la
ejecucin del bloque.
La seccin de ejecucin que incluye las instrucciones a ejecutar en el bloque PL/SQL.
La seccin de excepciones en donde se definen los manejadores de errores que soportara el bloque
PL/SQL.
Cada una de las partes anteriores se delimita por una palabra reservada, de modo que un bloque PL/SQL se
puede representar como sigue:
Bucle FOR
El bucle FOR, se repite tantas veces como le indiquemos en los identificadores inicio y final.
FOR contador IN [REVERSE] inicio..final LOOP
-- Instrucciones
END LOOP;
En el caso de especificar REVERSE el bucle recorre en sentido inverso.
Bucle WHILE
El bucle WHILE, se repite mientras que se cumpla la expresin.
WHILE (expresin) LOOP
-- Instruccin
END LOOP;
El bucle LOOP, se repite tantas veces como sea necesario hasta que se forza su salida con la
instruccin EXIT. Su sintaxis es la siguiente:
LOOP
-- Instrucciones
IF(expresion) THEN
-- Instrucciones
EXIT;
END IF;
END LOOP;
[declare | is | as]
/* Parte declarativa */
Begin
/* Parte de ejecucin */
[exception]
/* Parte de excepciones */
End;
De las anteriores partes, nicamente la seccin de ejecucin es obligatoria, que quedara delimitada entre las
clausulas BEGIN y END.
Veamos un ejemplo de bloque PL/SQL muy genrico. Se trata de un bloque annimo, es decir no lo identifica
ningn nombre. Los bloques annimos identifican su parte declarativa con la palabra reservada DECLARE.
DECLARE
/*Parte declarativa */
Nombre_variable DATE;
BEGIN
/* Parte de ejecucin
* Este cdigo asigna el valor de la columna
* nombre_columna
* a la variable identificada por nombre_variable
*/
SELECT SYSDATE
INTO nombre_variable
FROM DUAL;
EXCEPTION
/* parte de excepciones */
WHEN OTHERS THEN
Dbms_output.put_line(Se ha producido un error);
END;
A continuacin vamos a ver cada una de estas secciones:
Secciones de Declaracin de Variables
En esta parte se declaran las variables que va a necesitar nuestro programa. Una variable se declara
asignndole un nombre o identificador seguido del tipo de dato que puede contener. Se declaran cursores (de
gran utilidad para la consulta de datos) y excepciones definidas por el usuario. Tambien podemos especificar si
se trata de una constante, si puede contener valor nulo y asignar un valor inicial.
La sintaxis genrica para la declaracin de constantes y variables es:
Nombre_variable [CONSTANT] <tipo_dato> [NOT NULL] [:= valor_inicial]
Donde:
Tipo_dato: es el tipo de dato que va a poder almacenar la variable, este puede ser cualquiera de los tipos
soportados por ORACLE; es decir NUMBER, DATE, CHAR, VARCHAR, VARCHAR2, BOOLEAN
Ademas para algunos tipos de datos (NUMBER y VARCHAR) podemos especificar la longitud.
La clausula CONSTANT indica la definicin de una constante cuyo valor no puede ser modificado. Se debe
incluir la inicializacin de la constante en su declaracin.
La clausula NOT NULL impide que a una variable se le asigne el valor nulo, y por lo tanto debe inicializarse a un
valor diferente de NULL.
Las variables que no son inicializadas toman el valor inicial NULL. La inicializacin puede incluir cualquier
expresin legal de PL/SQL, que lgicamente debe corresponder con el tipo del identificador definido.
Los tipos escalares incluyen los definidos en SQL mas los tipos VARCHAR y BOOLEAN. Este ultimo puede tomar
los valores TRUE, FALSE y NULL, y se suele utilizar para almacenar el resultado de alguna operacin lgica.
VARCHAR es un sinnimo de CHAR.
Tambin es posible definir el tipo de una variable o constante, dependiendo del tipo de otro identificador,
mediante la utilizacin de las clausulas %TYPE y %ROWTYPE.
Mediante la primera opcin se define una variable una variable o constante escalar, y con la segunda se define
una variable fila, donde identificador puede ser otra variable fila o una tabla.
Habitualmente se utiliza %TYPE para definir la variable del mismo tipo que tenga definido un campo en una
tabla de la base de datos, mientras que %ROWTYPE se utiliza para declarar variables utilizando cursores.
EJEMPLOS:
Estructura de un bloque annimo
DECLARE
/* De declara la variable de tipo VARCHAR2(15) identificada por v_location y se le asigna el valor Granada */
v_location VARCHAR2(15) := Granada0;
/* se declara la constante de tipo NUMBER identificada por IP y se le asigna el valor := 3.1416 */
PI CONSTANT NUMBER := 3.1416
/* se declara la variable del mismo tipo que tenga el campo nombre de la tabla tabla_empleados
identificada por v_nombre y no se le asigna ningn valor */
V_nombre tabla_empleados.nombre%TYPE;
/* se declara la variable del tipo registro correspondiente a un supuesto cursor, llamado micursor,
identificada por reg_datos */
Reg_datos micursor%ROWTYPE;
BEGIN
/* parte de ejecucin*/
Exception
/* Parte de excepciones*/
Estructura de un subprograma
Cursores en PL/SQL
Introduccin:
PL/SQL utiliza cursores para gestionar las instrucciones SELECT. Un cursor es un conjunto de registros devuelto
por una instruccin SQL. Tecnicamente los cursores son fragmentos de memoria que son reservados para
procesar los resultados de una consulta SELECT. Podemos distinguir dos tipos de cursores:
Cursores implcitos. Este tipo de cursores se utilizan para operaciones SELECT INTO; se usan cuando la consulta
devuelve un nico registro.
Cursores explcitos. Son los cursores que son declarados y controlados por el programador. Se utilizan cuando
la consulta devuelve un conjunto de registros. Ocasionalmente tambin se utilizan en consultas que devuelven
un nico registro por razones de eficiencia. Son ms rpidos.
Un cursor se define como cualquier otra variable de PL/SQL y debe nombrarse de acuerdo a los mismos
convenios que cualquier otra variable. Los cursores implcitos no necesitan declaracin.
Este ejemplo declara un cursor explcito:
declare
CURSOR c_paises is
SELECT CO PAIS, DESCRIPCION
FROM PAISES;
BEGIN
/* Sentencias de bloque */
end;
CREATE PROCEDURE simple_procedure IS
/* Se declara la variable de tipo VARCHAR2(15) identificada por v_location y se le asigna el valor granada */
V_location VARCHAR2(15) := Granada;
/* Se declara la constante de tipo NUMBER identificada por PI y se le asigna el valor de 3.1416;
PI CONSTANT NUMBER := 3.1416
/* se declara la variable del mismo tipo que tenga el campo nombre de la tabla tabla_empleados identificada
por v_nombre y no se le asigna ningn valor */
V_nombre tabla_empleados.nombre%TYPE;
/* se declara la variable del tipo registro correspondiente a un supuesto cursor, llamado micursor,
identificada por reg_datos */
Reg_datos micursor%ROWTYPE;
BEGIN
/* parte de ejecucin*/
Exception
/* Parte de excepciones*/
Para procesar instrucciones SELECT que devuelvan mas de una fila, son necesarios cursores explcitos
combinados con una estructura de bloque.
Un cursor admite el uso de parmetros. Los parmetros deben declararse junto con el cursor.
El siguiente ejemplo muestra la declaracin de un cursor (c_paises) con un parmetro (p_continente):
Este diagrama representa como se procesa una instruccin SQL a travs de un cursor.
Fases para procesar una instruccin SQL
El siguiente ejemplo muestra un cursor implcito:
La salida del programa generara la siguiente lnea:
La lectura del cursor es: ECUADOR
Excepciones asociadas a los cursores implcitos
Los cursores implcitos solo pueden devolver una fila, por lo que pueden producise determinadas excepciones.
Las mas comunes que se pueden encontrar son no_data_found y too_many_rows.
Declare
Cursor c_paises (p_continente IN VARCHAR2) is
SELECT CO_PAIS, DESCRIPCION
FROM PAISES
WHERE CONTINENTE = p_continente;
begin
/* sentencias de bloque */
end;
declare
vdescripcion VARCHAR(50);
begin
SELECT DESCRIPTION
INTO vdescripcion
FROM PAISES
WHERE CO_PAIS = ESP;
dbms_output.put_line(La lectura del cursor es: || vdescripcion);
end;
NO_DATA_FOUND se produce cuando una sentencia SELECT intenta recuperar datos pero ninguna fila
satisface sus condiciones. Es decir, cuando no hay datos.
TOO_MANY_ROWS Dado que cada cursor implcito solo es capaz de recuperar una fila, esta excepcin detecta
la existencia de ms de una fila.
Cursores Explcitos en PL/SQL
Los cursores explicitos se emplean para realizar consultas SELECT que pueden devolver cero o mas filas. Para
trabajar con un cursor explicito necesitamos realizar las siguientes tareas:
Declarar el cursor
Abrir el cursor con la instruccin OPEN.
Leer los datos del cursor con la instruccin FETCH.
Cerrar el cursor y liberar los recursos con la instruccin CLOSE.
Para declarar un cursor debemos emplear las siguientes sintaxis:
CURSOR nombre_cursor IS instruccin_SELECT
Tambin debemos declarar los posibles parmetros que requiera el cursor:
CURSOR nombre_cursor (param1, , pramN tipoN) IS instruccin_SELECT
Para abrir el cursor:
OPEN nombre_cursor;
O bien (en el caso de un cursor con parametros)
OPEN nombre_cursor (valor1, valor2, , valorN);
Para recuperar los datos en variables PL/SQL
FETCH nombre_cursor INTO lista_variables; -- o bien
FETCH nombre_cursor INTO registro_PL/SQL;
Para cerrar el cursor:
CLOSE nombre_cursor;
El siguiente ejemplo ilustra el trabajo con un cursor explicito. Hay que tener en cuenta que al leer los datos del
cursor debemos hacerlo sobre variables del mismo tipo de datos de la tabla (o tablas) que trata el cursor.
DECLARE
CURSOR cpaises
IS
SELECT CO_PAIS, DESCRIPCION, CONTINENTE
FROM PAISES;
co_pais VARCHAR2(3);
descripcion VARCHAR(50);
continente VARCHAR(25);
BEGIN
OPEN cpaises;
FETCH cpaises
INTO co_pais, descripcin, continente;
CLOSE cpaises;
END;
Podemos simplificar el ejemplo utilizando el atributo de tipo %ROWTYPE sobre el cursor:
DECLARE
CURSOR cpaises
IS
SELECT CO_PAIS, DESCRIPCION, CONTINENTE
FROM PAISES
Registro cpaises%ROWTYPE
BEGIN
OPEN cpaises;
FETCH cpaises
INTO registro;
CLOSE cpaises;
END;
EL mismo ejemplo, pero utilizando parametros:
DECLARE
CURSOR cpaises (p_continente VARCHAR2)
IS
SELECT CO_PAIS, DESCRIPCION, CONTINENTE
FROM PAISES
WHERE CONTINENTE = p_continente;
registro cpaises%ROWTYPE
BEGIN
OPEN cpaises (AMERICA);
FETCH cpaises
INTO registro;
CLOSE cpaises;
END;
Consideraciones:
Cuando trabajamos con cursores debemos considerar:
Cuando un cursor esta cerrado, no se puede leer.
Cuando leemos un cursor debemos comprobar el resultado de la lectura utilizando los atributos de los
cursores.
Cuando se cierra el cursor, es ilegal tratar de usarlo.
Es ilegal tratar de cerrar un cursor que ya est cerrado o no ha sido abierto.
Video Acceso a datos con el Lenguaje SQL
EL lenguaje SQL (Structured Query Language)
Describir la naturaleza y la utilidad del lenguaje SQL
Introducir los conceptos ms esenciales que definen la estructura de las bases de datos relacionales.
Mdulo 1. Descripcin del lenguaje SQL
Posicionar el lenguaje SQL
o Lenguaje de datos Relacionales.
o Instrucciones individuales e independientes
o No es un lenguaje de programacin.
o Norma ISO que define una sintaxis estndar.
Cuando se necesita utilizar el lenguaje SQL (Base de datos Relacional)
o Desde lenguajes de programacin
Visual Basic
C
Java
Php
o Desde aplicaciones de todo tipo
Flash
DreamWeaver
FrontPage
Excel
o Algunas bases de datos Relacionales son:
Oracle
Microsoft SQL Server
MySQL
Microsoft Access
Informix
Sybase
Instrucciones del Lenguaje SQL
o DML (Data Manipulation Language)
Insert
Update
Delete
Select (DRL data R)
o DDL (Data Definition Language)
Create
Alter
Drop
o DCL (Data Control Language)
Grant
Revoke
Deny
o Commit
o Rollback
Elementos bsicos de la sintaxis
o Palabras clave o clausulas [where, Select, From].
o Nombre de objetos (Columnas, tablas) .
o Operadores (+,-,*,/, etc).
o Valores Absolutos *Cadenas, nmeros, etc+.
La base de datos Neptuno Base de datos para el curso
Base de datos de SQL Access
Mdulo 2. Base de Datos Relacionales
Estructura de almacenamiento Bsica
o Registros
o Columnas
o Filas
Restricciones
o Not NULL
o Unique
o Clave Primaria (Primary Key) simples o compuestas.
o Restriccin Check (ms flexibilidad, por ejemplo no permitir valores cero, o no permitir fechas ms
antiguas a las de hoy).
o Restriccin Foreign Key
La distribucin de los datos de distintas tablas
La normalizacin de los datos
Mdulo 3. Realizar consultas a la base de datos
La necesidad de realizar consultas
Seleccionar
Filtrar
Sumarizar
Agrupar
Ordenar
Acceder a informacin de mas de una tabla
Nota. En algunas bases de datos est permitido colocar el nombre de las tablas con espacios, para poder
llamarlas dentro de from si se pone tal y como aparece marcara error para ello el nombre de la tabla se coloca
entre corchetes, al igual al colocar alias con espacios.
La instruccin SELECT
La clusula SELECT y FROM
Operaciones con los campos seleccionados
EL alias de los campos
Las funciones de fila nica
o upper
o lower
o substring
o etc estas dependern de la base de datos que manejemos.
Mdulo 4. Filtrar datos
La clusula Where
Operadores de comparacin
o Operador Like
% cualquier valor posible
_ un caracter
o Operador IS NULL
o Operador IN
o Operadores Lgicos
Para filtrar obtener una cadena esta se pone entre comillas simples nombre = pancho;
Si se usa un campo en Where este no necesariamente deber de estar en Select
Mdulo 5. Sumarizar y agrupar datos
Sumarizar datos con las funciones de fila multiple
Por qu es necesario agrupar
La clusula Group By
Filtrar despus de agrupar. La clusula Having
Funciones Devuelve un solo registro
o AVG
o SUM Suma todos los valores de esa columna
o MAX Me devuelve el numero mayor
o MIN Me devuelve el numero menor
o COUNT
Cuando usamos estas funciones y requerimos otras columnas requerimos agrupar ya que nos marcaria error de
lo contrario como se puede ver en la siguiente figura
Mdulo 6. Consultas a bases de datos en ms de una tabla
A la tabla de la derecha es a quien se le van a incluir los datos de la tabla de la izquierda
Cuando un campo de la tabla tengo un registro con null osea que no tenga una correspondencia con otra tabla
y por lo tanto al utilizar solo join este valor no nos aparecer por tal motivo debemos de utilizar left join o right
join
}
Self join