Base de Datos03
Transcript of Base de Datos03
UNIDAD 1Creación y manejo de tablas 6Objetos de la base de datos 6Nombramiento de una tabla 6Creación de tablas 6Referencia usada con otras tablas 7La opción predefinida 7Creando las tablas 7Tablas en la base de dato Oracle 8Diccionario de datos (preguntas) 8Los tipos de datos 8Los tipos de dato DateTime 9Los tipos de dato DateTime 9Tipo de datos TIMESTAMP WITH TIME ZONE 9Tipos de datos TIMESTAMP WITH LOCAL TIME 9Intervalo de tipo de dato YEAR A MONTH 10Intervalo de tipo de dato DAY TO SECOND 10Intervalo de tipo de dato DAY TO SECOND 11Creando una tabla usando una sintaxis de subquery 11Creación de tablas usando SUBQUERY 11Declaración del ALTER TABLE 12Declaración del ALTER TABLE 12Añadiendo una columna 12Añadiendo una columna 13Modificando Una Columna 13Eliminando Una Columna 13La Opción SET UNUSED 14Eliminación De Una Tabla 14Cambiando El Nombre De Un Objeto 14Truncando Una Tabla 14Agregando Comentarios A La Tabla 15Resumen 15Practica, Aplicación global 15
UNIDAD 2Including Constraints 16Què son los Constraints? 16Pautas del Constraint 16Definiendo Constraints 16Definiendo Constraints 17El Constraint NOT NULL 17El Constraint UNIQUE 18El Constraint PRIMARY KEY 19El Constraint FOREIGN KEY 20El Constraint CHECK 21Agregando sintaxis a Constraint 21Añadiendo un Constraint 21Eliminando un Constraint 21Desactivando Constraints 22Activando Constraints 22Constraints Cascada 22:Viendo Constraints 23Viendo las columnas asociadas con los Constraints 23Resume 24Practica . Aplicación global 24
UNIDAD 3Manipulando Datos 25Lenguaje De Manipulación De Datos 25Agregando Una Nueva Fila A Una Tabla 25La Inserción De La Declaración De Sintaxis 26Insertando Nuevas Líneas 26
0
Insertando Líneas Con Valores Nulos 26Insertando valores especiales 27Insertando Valores De Fecha Específicos 27Creando Un Texto 27Copiando Líneas Para Otras Tablas 28Cambiando Datos En La Tabla 28Declarar La Sintaxis Update 28Poniendo Al Dia Líneas En Una Tabla 28Poniendo Al Dia Dos Columnas Con Una Subpregunta 29Poniendo Al Dia Líneas Basándose En Otras Tablas 29Poniendo Al Día Líneas:Integrando Restrinciones De Error. 29Eliminar La Declaración 30Eliminando Líneas Desde Una Tabla. 30Eliminando Líneas Basándose En Otras Tablas. 30Usando Una Subpregunta En Una Declaración Insert. 31Usando la opción with check como palabra clavepuesta en la declaración dml. 32Acabada La Vista De La Falta Fracción Explicada 32USANDO LA FALTA DE VALORES EXPLÍCITOS 32La Declaración Merge 33El Merge La Declación De Sintaxis 33Merging Líneas 33Transacciones De Base Da Datos 34Ventajas De Las Declaraciones Commit Y Rollback 34Marque hacia atras antes de listar un punto 34Procesando La Transaccion Implisita 35Estado De Los Datos Antes Del Commit O Rollback 35Estado De Los Datos Despues Del Commit 35Encomendando Datos 35El Dato De Estado Después De La Lista. 36Declaracion-Nivelado Rollback 36Leer Consistencias 36Implementación De La Consistencia Leer 36Cerrando 37Cerrando Implícita 37Resume 37Practica, Aplicación Global 37
UNIDAD 4SQL Básico escribiendo las Declaraciones SELECT 38Las capacidades de SQL las Declaraciones SELECT 38La Declaración basicas SELECT 38Seleccionando Todas las Columnas 39Las Columnas Específicas seleccionando 39Escribiendo declaraciones SQL 39Columna que Encabeza los Valores por defect 39Las Expresiones aritméticas 40Usando operadores aritmetico 40Procedimientos de operadores 40Usando paréntesis 41Definiendo un Valor Nulo 41Los Valores nulos en las Expresiones Aritméticas 42Definiendo una Columna Alias 42Usando alias en columna 42Concatenación de operadores 43Usando la concatenacion de operadores 43Las Cadenas de caracteres literales 43Las Cadenas de caracteres literales 43Duplicando fila 44
1
Poner al día líneas en la tabla empleado
…
Eliminando filas duplicadas 44Resumen 45Practica, Aplicación global 45
UNIDAD 5Restringiendo y Ordenando los Datos 46Filas limitando que Usan una Selección 46Limitando las Filas Seleccionadas 46Usando la cláusula WHERE 47Caracter cadena y datos 47Condiciones de comparación 47Usando las condiciones de comparación 48Otras condiciones con comparaciones 48Usando la condicion BETWEEN 48Usando la condición IN 49Usando la condicion LIKE 49Usando la condicion LIKE 49Usando la condicion NULL 50Condiciones logicas 50Usando el operador AND 50Usando el operador OR 51Usando el operador NOT 51Reglas de procedencia 52Reglas de procedencia 52Cláusula ORDER BY 53Ordenando en el Orden Descendente 53Ordenando Alias por la Columna 53Ordenando por las Columnas Múltiples 54Resumen 54Practica, Apreciación global 54
UNIDAD 6Funciones De Registro Simple 55Funciones SQL 55Dos tipos de funciones de SQL 55Funciones De Registro Simple 56Funciones De Registro Simple 56Función De Caracteres 56Casos de funciones de manipulación 57Usando Los Casos De Funciones De Manipulación 57Funciones De Manipulación Tipo Carácter 57Usando Las Funciones Manipulación Tipo Carácter 58Función tipo numérico 58Usando La Función Round 58Usando La Función Trunc 59Usando La Función Mod 59Trabajando Con Fechas 59Trabajando Con Fechas 60Fechas En Forma Aritmética 60Usando Operaciones Aritméticas Con Fechas 60Funciones De La Fecha 60Usando funciones de fecha 61Usando funciones de fecha 61Practica, Apreciación Global 61Conversión de funciones 62Conversión De Tipo De Datos Implícita 62Conversión De Tipo De Datos Implícita 62Usando La Función To_Char Con Fechas 63Elementos Del Modelo De Formato De Fecha 63Elementos Del Modelo De Formato De Fecha 64Usando La Función To_Char Con Fechas 64Usando la función to_char con números 64
2
Usando La Función To_Char Con Números 65Uusando la función to_number y to_date 65Usando La Función To_Number Y Funciones To_Date 66Formato De Fecha RR 66Ejemplo de formato rr 66Anidando Funciones 67Funciones generales 67Funciones NVL 67Uusando la función de NVL 68Usando La Función NVL2 68Usando La Función De NULLIF 69Usando La Función COALESCE 69Expresiones condicionales 70Expresión Del Case 70Expresión CASE 70Función DECODE 70Usando La Función DECODE 71Resumen 71Practica, Apreciación Global 71
UNIDAD 7Visualizar datos múltiples de una tabla 72Obtener datos de tablas múltiples 72Productos Cartesianos 72Generando Un Producto Cartesiano 73Tipos De Uniones 73Tables Unidas Usando Sintaxis Oracle 73( Oracle Proprietary ) 74Recuperando registros con Igualdad de unión 74Buscar condiciones adicionales usando el operador AND 75Limitando Columnas con nombres ambiguos 75Usando Tables con Alias 75Uniendo más de dos tablas 75No Igualdad de union ( Oracle Propietario ) 76Recuperando Registros con No-Igualdad de unión 76Uniones Exteriores ( Oracle Propietario) 76Sintaxis de Uniones Exteriores 77Usando Uniones Exteriores 77Uniones con si misma 77Uniendo una tabla a si misma 78Uniendo Tablas Usando SQL: Sintaxis 1999 78Creando uniones cruzadas 78Creando Uniones Naturales 79Recuperando Registros con Uniones Naturales 79Creando Uniones Con La Cláusula Usando 79Recuperando Registros Con La Cláusula Usando 79Creando Uniones Con La Cláusula ON 80Creando tres maneras de unir con la cláusula ON 80Creando tres maneras de unir con la cláusula ON 80Uniones Internas VS Externas 81Union Externa Salida 81Corregir Unión Externa
81Llenar Unión Externa 82Adicionar Condiciones 82Resumen 82Practica, Apreciación global 82
3
UNIDAD 8Agregando datos con funciones de grupo 83
¿Que son las funciones de grupo? 83Tipos de funciones de grupo 83Sintaxis de una función de grupo 84Usando la funcion AVG y SUM 84Usando la función MIN y MAX 84Usando la función COUNT 84Usando la funcion COUNT (*) 85
Usando la palabra clave DISTINCT 85Funciones de grupos y valores nulos 85Usando la función NVL con funciones de grupos 85Creando datos de grupos 86Creando grupos de datos 86Usando la clausula GROUP BY 86
Agrupando mas de una columna 87Usando la cláusula GROUP BY en columnas múltiples 88Preguntas ilegales que usan las funciones de grupos 88Los Resultados De grupo excluyendo 89Los Resultados De grupo excluyendo:La cláusula HAving 89Usando la cláusula HAVING 89Anidando funciones de grupos 90Resumen 90Practica, Aplicación global 90
UNIDAD 9Subqueries 91Usar Sub-queriesPara resolver problemas 91Sintaxis de un subqueries 91
Usando subqueries 92Las pautas para usar subqueries 92Tipos de subqueries 92Subqueries de una sola fila 92Ejecutando subqueries solo una fila 93Usando funciones de grupos en un subqueries 93La cláusula HAVING con subqueries 93Cual esta equivocado con estadeclaracion? 94¿Esta Declaración Devolverá las Filas? 94Subqueries múltiples filas 94Usando el operador ANY en subqueries multiples filas 95Usando el operador ALL en subqueries multiples filas 95Valores nulos en un subqueries 95Resumen 96Practica, Aplicación global 96
UNIDAD 10Otros objetos de base de daros 97Otros objetos de base de daros 97Secuencias 97Creando una Sucesión 98Usando una Sucesión 98Usando una secuencia 99Modificando una Sucesión 99Las pautas por Modificar una Sucesión 99Índices 100Que es un indice 100¿Cómo los Índices se Crean? 100Creando Indices 100Cuándo Crear un Indices 100
4
Los Índices confirmando 101Los Índices función-basado 101Quitando un Índice 101Los sinónimos 102Creando y Quitando los Sinónimos 102En resumen 102
UNIDAD 11Creando un vista 103¿Por qué Use las Vistas? 103Creando un avista 103Los Datos recuperando de una Vista 104Modificando una Vista 105Creando una Vista Compleja 105Quitando una Vista 105Resumen 106Practica, Aplicación Global 106
UNIDAD 12Usando Operadores De Conjuntos 107Usando Operadores De Conjuntos 107Las Tablas Usadas En Esta Lección 107El Operador Unión 107Usando El Operador Unión 108El operador unión all 108Usando El Operador Union All 108El Operador Intersect 109Usando El Operador Intersect 109El Operador Minus 110Guías Para Los Operadores Conjuntos 110Correspondencia en la instrucción select 111Controlando El Orden De Las Filas 112Resumen 112Ejercicio de aplicación 112
UNIDAD 13Código Almacenado145Procedimientos y Funciones 145Creación de un Procedimiento 145Sintaxis de un Procedimiento 145Ejemplo de un Procedimiento 146Creación de una Función 146Sintaxis de una Función 146Ejemplo de una Función 146Eliminación de Procedimientos y Funciones 147Creación de un Paquete 147Sintaxis de un Paquete 147Ejemplo de un Paquete 147Subprogramas almacenados frente a subprogramas locales 148DDL sobre código almacenado 148Ejecución de instrucciones DDL mediante SQL Dinámico 148Uso del paquete DBMS_SQL para ejecutar instrucciones DDL 149Ejecutando instrucciones DDL mediante el paquete DBMS_SQL 149Uso de SQL dinámico nativo para ejecutar instrucciones DDL 149Ejecutando instrucciones DDL mediante el SQL dinámico nativo 149Ejecución de código almacenado desde SQL Plus 150Ejecutando código almacenado desde SQL Plus 150Restricciones de accesos a funciones desde una expresión SQL 150Ejercicio de aplicación 151
5
UNIDAD 1
Objetos de la base de datos
Nombramiento de una tabla
Nombre de tabla y nombre de columna; Debe empezar con una letra Debe tener una longitud de 1–30 caracteres Sólo debe contener A-Z, a-z, 0–9, _, $, y # No debe reproducir el nombre de otro objeto poseído por el mismo usuario No debe tener una palabra reservada del servidor de Oracle.
Creación de tablasSe debe:
Crear la tabla Un área de almacenamiento
6
OBJETO DESCRIPCION
Tabla Unidad básica de almacenamiento compuesta por filas y columnas
Vista Lógicamente representa subconjuntos de datos de uno o más tablas
Secuencia Generación de valores numéricos
Indicé Mejora la actuación de algunas preguntas
Sinónimo Da los nombres alternativos a los objetos
CREATE TABLE [schema.]table (column datatype [DEFAULT expr]
[, ...]);
Creación y manejo de tablasLos Objetivos
Después de terminada esta unidad, usted debe poder realizar lo siguiente: Describa los objetos de la base de datos principales Crear las Tablas Describa los tipos de los datos que pueden usarse al especificar la
definición de la columna Cambiar las definiciones de la tabla Eliminar, renombrar, y truncar las tablas
Se debe especificar: Nombre de la tabla Nombre de la columna , tipo de dato de la columna, tamaño de la columna
Referencia usada con otras tablas
Tablas que pertenecen a otros usuarios no están en el esquema del usuario.
Debe usar el nombre del respectivo como un prefijo a esas tablas
La opción predefinida
Especifique un valor predefinido por una columna durante una inserción.
Los valores literales, expresiones, o funciones de SQL son los valores legales. El nombre de otra columna o un pseudocolumna son valores ilegales. El tipo de los datos predefinido debe emparejar el tipo de datos de columna.
Creando las tablas
Creando la tabla
Confirmación de la creación de la tabla
Tablas en la base de dato Oracle
... hire_date DATE DEFAULT SYSDATE, ...
CREATE TABLE dept(deptno NUMBER(2),dname VARCHAR2(14),loc VARCHAR2(13));
Table created.Table created.
DESCRIBE dept
7
Uso de las tablas: Es una colección de tablas mantenidas por el usuario Contiene la información del usuario
Diccionario de datos: Es una colección de tablas creada y mantenidas por el Servidor de Oracle Contiene la información de la base de datos
Diccionario de datos (preguntas)
Vea el nombre de las tablas creadas por el usuario
Tipo de objetos distintos creado por el usuario
Vea las mesas, vistas, sinónimos, y sucesiones poseídas por el usuario.
Los tipos de datos
Los tipos de dato DateTime
SELECT table_name FROM user_tables ;
SELECT DISTINCT object_type FROM user_objects ;
SELECT * FROM user_catalog ;
8
Las mejoras de Datetime con Oracle9i: Se han introducido los Nuevos Datetime tipos de datos. Los Nuevos datos teclean que el almacenamiento está disponible. Se han hecho las mejoras cronometrar zonas y la zona de tiempo local.
Los tipos de dato DateTime
El TIMESTAMP ..tipo datos es una extensión del tipo de datos de FECHA. Guarda el año, mes, y día de los datos de la FECHA , más hora, minuto, y
segundo valora así como el segundo valor fraccionario. El TIMESTAMP los tipo datos se especifica como :
Tipo de datos TIMESTAMP WITH TIME ZONE
TIMESTAMP WITH TIME ZONE es una variante de TIMESTAMP que incluye un desplazamiento de zona de tiempo en su valor.
El desplazamiento de zona de tiempo es la diferencia, en horas y minutos, entre el tiempo local y UTC.
Tipos de datos TIMESTAMP WITH LOCAL TIME
TIMESTAMP WITH LOCAL TIME es otro variante de TIMESTAMP que incluye un desplazamiento de zona de tiempo en su valor.
Datos guardado en la base de datos se normaliza a la zona de tiempo de base de datos.
El desplazamiento de zona de tiempo no se guarda como la parte de los datos de la columna; Oracle devuelve los datos en la zona de tiempo de sesión local de los usuarios.
TIMESTAMP CON EL TIEMPO ZONA DATO DE TIPO LOCAL se especifica como sigue:
Intervalo de tipo de dato YEAR A MONTH
TIMESTAMP[(fractional_seconds_precision)]WITH LOCAL TIME ZONE
9
TIMESTAMP[(fractional_seconds_precision)]WITH TIME ZONE
TIMESTAMP[(fractional_seconds_precision)]
INTERVAL YEAR TO MONTH guarda un período de tiempo que usa el AÑO y campos de datetime de MES
Intervalo de tipo de dato DAY TO SECOND
INTERVAL DAY TO SECOND un período de tiempo por lo que se refiere a días, horas, minutos, y segundos
Intervalo de tipo de dato DAY TO SECOND
El intervalo DAY TO SECOND un período de tiempo por lo que se refiere a días, horas, minutos, y segundos.
INTERVAL YEAR [(year_precision)] TO MONTH
INTERVAL '123-2' YEAR(3) TO MONTHIndicates an interval of 123 years, 2 months.
INTERVAL '123' YEAR(3)Indicates an interval of 123 years 0 months.
INTERVAL '300' MONTH(3)Indicates an interval of 300 months.
INTERVAL '123' YEARReturns an error, because the default precision is 2, and '123' has 3 digits.
INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds_precision)]
INTERVAL '4 5:12:10.222' DAY TO SECOND(3)Indicates 4 days, 5 hours, 12 minutes, 10 seconds, and 222 thousandths of a second.INTERVAL '123' YEAR(3).
INTERVAL '7' DAYIndicates 7 days.
INTERVAL '180' DAY(3) Indicates 180 days.
10
Creando una tabla usando una sintaxis de subquery
Cree una tabla y la inserción de filas combinando el CREATE TABLE declaración de la tablas AS subquery option.
Empareje el número de columnas especificadas al número de columnas del subquery.
Defina los nombres de la columna, y valores por default
Creación de tablas usando SUBQUERY
Declaración del ALTER TABLE
Usando el alter tabla en la declaración de la tabla:
Agregue una nueva columna
INTERVAL '4 5:12:10.222' DAY TO SECOND(3)Indicates 4 days, 5 hours, 12 minutes, 10 seconds, and 222 thousandths of a second.
INTERVAL '4 5:12' DAY TO MINUTEIndicates 4 days, 5 hours and 12 minutes.
INTERVAL '400 5' DAY(3) TO HOURIndicates 400 days 5 hours.
INTERVAL '11:12:10.2222222' HOUR TO SECOND(7)indicates 11 hours, 12 minutes, and 10.2222222 seconds.
CREATE TABLE table [(column, column...)]AS subquery;
11
CREATE TABLE dept80 AS SELECT employee_id, last_name, salary*12 ANNSAL, hire_date FROM employees WHERE department_id = 80;Table created.Table created.
Modifique una columna existente Defina un valor predefinido por la nueva columna Eliminación de una columna
Declaración del ALTER TABLE
Use el ALTER TABLE en la declaración de la tabla para agregar, modifique, o eliminar las columnas
Añadiendo una columna
Añadiendo una columna
Usar ADD para agregar una columna
ALTER TABLE tableADD (column datatype [DEFAULT expr]
[, column datatype]...);
ALTER TABLE tableMODIFY (column datatype [DEFAULT expr]
[, column datatype]...);
ALTER TABLE tableDROP (column);
DEPT80
“Añadir una nueva columna en la tabla Dept. 80
DEPT80
Nueva columna
12
La nueva columna se convierte en la ultima
Modificando Una Columna
Usted puede cambiar el tipo de los datos de una columna, tamaño, y el valor predefinido
Un cambio al valor predefinido afecta sólo inserciones subsecuentes a la tabla
Eliminando Una Columna
Use DROP TABLE para eliminar una columna
La Opción SET UNUSED
Usted usa la opción SET UNUSED para marcar uno o más columnas como as UNUSED
ALTER TABLE dept80ADD (job_id VARCHAR2(9));Table altered.Table altered.
ALTER TABLE dept80MODIFY (last_name VARCHAR2(30));Table altered.Table altered.
ALTER TABLE dept80DROP COLUMN job_id; Table altered.Table altered.
13
Usted usa DROP SET UNUSED para quitar las columnas que son marcado as UNUSED
Eliminación De Una Tabla
Todos los datos y estructura en la tabla se anula. Cualquier transacción pendiente se compromete. Todos los índices son eliminados. Se utiliza el CANNOT ROLL BACK para la declaración de la tabla
Cambiando El Nombre De Un Objeto
Para cambiar el nombre de una tabla, vista, sucesión, o sinónimo, usted ejecuta el RENAMED de la declaración
Usted debe ser el dueño del objeto
Truncando Una Tabla
1. la estructura TRUNCATE TABLE Quita todas las filas de una tabla Los descargos el espacio para almacenar usado por es tabla
El CANNOT ROLL BACK remueve el levantamiento de la fila Alternativamente, usted puede quitar las filas usando la estructura DELETE
Agregando Comentarios A La Tabla
ALTER TABLE tableSET UNUSED (column);
ALTER TABLE tableSET UNUSED COLUMN column;
ALTER TABLE tableSET UNUSED (column);
ALTER TABLE tableSET UNUSED COLUMN column;OR
ALTER TABLE tableDROP UNUSED COLUMNS;
ALTER TABLE tableDROP UNUSED COLUMNS;
DROP TABLE dept80;Table dropped.Table dropped.
RENAME dept TO detail_dept;Table renamed.Table renamed.
TRUNCATE TABLE detail_dept;Table truncated.Table truncated.
14
Usted puede agregar los comentarios a una tabla o columna usando la declaración COMMENT
Pueden verse los comentarios a través de las vistas de diccionario de datos: ALL_COL_COMMENTS USER_COL_COMMENTS ALL_TAB_COMMENTS USER_TAB_COMMENTS
Resumen
En esta lección, usted debe de haber aprendido a usar DDL las declaraciones para crear, alterar, eliminar, y renombrar las tablas
Declaración Descripción
Create table Crea una tabla
Alter table Modifica la estructura de la tabla
Drop table Elimina una tabla
Rename Cambia al nombre de una tabla , vista o sinónimo
Truncate Quita toda las filas y espacios para almacenar
Comment Agrega comentarios a una tabla o vista
Practica, Aplicación global
1. Esta práctica cubre los temas siguientes:
Creación de nuevas tablas Creando una nueva tabla usando el CREATE TABLE AS sintaxis modificando definiciones de la columna Verificar que las tablas existan Agregar comentarios a la tabla Eliminar tablas Alterar tablas
UNIDAD 2
COMMENT ON TABLE employeesIS 'Employee Information';Comment created.Comment created.
15
Including Constraints
Los objetivos
Después de completar esta lección, usted debe ser capaz de hacer lo siguiente:
• Describe los Constraints• Crea y mantiene los constraints
Què son los Constraints?
• Los Constraints ofrecen reglas a nivel de la tabla.• Los Constraints previenen la eliminación de una tabla si hay dependencia.• Los tipos de constraint que son validos:
– NOT NULL– UNIQUE – PRIMARY KEY– FOREIGN KEY– CHECK
Pautas del Constraint
• El nombre del constraint lo genera el servidor de Oracle usando el formato SYS_Cn f.
• Crea un constraint:– Al mismo tiempo cuando se crea la tabla, o– Después que se ha creado la tabla
• Define un constraint en la columna o a nivel de la tabla.• Ver un constraint en el diccionario de datos.
Definiendo Constraints
Definiendo Constraints
Constraint a nivel de columna
CREATE TABLE [schema.]table (column datatype [DEFAULT expr]
[column_constraint],...[table_constraint][,...]);
CREATE TABLE employees( employee_id NUMBER(6), first_name VARCHAR2(20), ... job_id VARCHAR2(10) NOT NULL,
CONSTRAINT emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID));
16
Constraint a nivel de tabla
El Constraint NOT NULL
Asegura ese valores nulos no se permiten para la columna:
Se define al nivel de la columna:
column [CONSTRAINT constraint_name] constraint_type,column [CONSTRAINT constraint_name] constraint_type,
column,... [CONSTRAINT constraint_name] constraint_type (column, ...),
column,... [CONSTRAINT constraint_name] constraint_type (column, ...),
CREATE TABLE employees( employee_id NUMBER(6), last_name VARCHAR2(25) NOT NULL, salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE CONSTRAINT emp_hire_date_nn NOT NULL,...
17
NOT NULL constraint(Ninguna fila puede contener un valor nulo para esta columna.)
NOT NULL constraint(Ninguna fila puede contener un valor nulo para esta columna.)
NOT NULL constraint(Ninguna fila puede contener un valor nulo para esta columna.)
System named
Usernamed
El Constraint UNIQUE
UNIQUE constraint
EMPLOYEES
INSERT INTO
Definido a nivele de tabla o nivel de la columna:
El Constraint PRIMARY KEY
PRIMARY KEY
DEPARTMENTS
CREATE TABLE employees( employee_id NUMBER(6), last_name VARCHAR2(25) NOT NULL, email VARCHAR2(25), salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE NOT NULL,... CONSTRAINT emp_email_uk UNIQUE(email));
CREATE TABLE employees( employee_id NUMBER(6), last_name VARCHAR2(25) NOT NULL, email VARCHAR2(25), salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE NOT NULL,... CONSTRAINT emp_email_uk UNIQUE(email));
18
No permitido: ya existe
Permitido
Definido a nivele de tabla o nivel de la columna:
El Constraint FOREIGN KEY
INSERT INTO
Not allowed(Null value)
Not allowed (50 already exists)CREATE TABLE departments( department_id NUMBER(4), department_name VARCHAR2(30) CONSTRAINT dept_name_nn NOT NULL, manager_id NUMBER(6), location_id NUMBER(4), CONSTRAINT dept_id_pk PRIMARY KEY(department_id));
CREATE TABLE departments( department_id NUMBER(4), department_name VARCHAR2(30) CONSTRAINT dept_name_nn NOT NULL, manager_id NUMBER(6), location_id NUMBER(4), CONSTRAINT dept_id_pk PRIMARY KEY(department_id));
19
Defined at either the table level or the column level:
FOREIGN KEY: Define la columna en la tabla hijo al nivel del constraint de la tabla
REFERENCES: Identifica la tabla y columna en la tabla padre ON DELETE CASCADE: Anula las filas dependientes en la tabla hijos cuando
una fila de la tabla padre se anula. ON DELETE SET NULL: Convertido los valores importante dependiente
extranjeros a nulo
El Constraint CHECK
DEPARTMENTS
EMPLOYEESFOREIGNKEY
INSERT INTO No permitido(9 no existe)
PermitidPermitidoo
PRIMARYKEY
…
…
CREATE TABLE employees( employee_id NUMBER(6), last_name VARCHAR2(25) NOT NULL, email VARCHAR2(25), salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE NOT NULL,... department_id NUMBER(4), CONSTRAINT emp_dept_fk FOREIGN KEY (department_id) REFERENCES departments(department_id), CONSTRAINT emp_email_uk UNIQUE(email));
20
Define una condición que cada fila debe satisfacer Las expresiones siguiente no se permite:
– Las referencias CURRVAL, NEXTVAL, LEVEL, y ROWNUM son pseudo columna
– Llama a SYSDATE, UID, USER, y funciones de USERENV
– Pregunta que se refieren a otros valores a otra fila
Agregando sintaxis a Constraint
Use el ALTER TABLE para declarar: Add o drop un constraint, pero no modifica su estructura Active o desactiva los constraints Añadir el constraint NOT NULL usando la clasula MODIFY
Añadiendo un Constraint
Añada un constraint FOREIGN KEY a la tabla EMPLOYEES que indica que una tabla padre ya debe existir con un empleado en la tabla EMPLOYEES
Eliminando un Constraint
Elimina constraint padre de la tabla EMPLOYEES.
Elimina el constraint PRIMARY KEY en la tabla DEPARTMENTS y elimina la asociación del constraint FOREIGN KEY en la columna EMPLOYEES.DEPARTMENT_ID.
..., salary NUMBER(2) CONSTRAINT emp_salary_min CHECK (salary > 0),...
..., salary NUMBER(2) CONSTRAINT emp_salary_min CHECK (salary > 0),...
ALTER TABLE table ADD [CONSTRAINT constraint] type (column);
ALTER TABLE table ADD [CONSTRAINT constraint] type (column);
ALTER TABLE employeesADD CONSTRAINT emp_manager_fk FOREIGN KEY(manager_id) REFERENCES employees(employee_id);Table altered.Table altered.
21
ALTER TABLE employeesDROP CONSTRAINT emp_manager_fk;Table altered.Table altered.
ALTER TABLE departmentsDROP PRIMARY KEY CASCADE;Table altered.Table altered.
Desactivando Constraints
Ejecute la cláusula DISABLE en la declaración ALTER TABLE para desactivarla integridad del constraint.
Aplica la opción CASCADE para desactivar la integridad de dependencia del constraints.
Activando Constraints
Activando un constraint de integridad actualmente desactivado en la tabla definida usando la cláusula ENABLE .
UNIQUE o PRIMARY KEY el índice se crea automáticamente si usted habilita el constraint UNIQUE key o PRIMARY KEY.
Constraints Cascada
La cláusula CONSTRAINTS CASCADE se usa junto con la cláusula DROP COLUMN
La clausula La clausula CONSTRAINTS CASCADE elimina todas la referencia constraints de integridad referencial que se refiere a las claves primaria y unicas definiendo en la eliminación de las columnas.
La cláusula CONSTRAINTS CASCADE también elimina todos los constraints de las multicolumnas definidas en la columna a eliminar.
Ejemplo:
Viendo Constraints
Pregunta la tabla USER_CONSTRAINTS par aver todas las definiciones de constraint y nombres.
22
ALTER TABLE employeesDISABLE CONSTRAINT emp_emp_id_pk CASCADE;Table altered.Table altered.
ALTER TABLE employeesENABLE CONSTRAINT emp_emp_id_pk;Table altered.Table altered.
ALTER TABLE test1 DROP (pk) CASCADE CONSTRAINTS;Table altered.Table altered.
ALTER TABLE test1 DROP (pk, fk, col1) CASCADE CONSTRAINTS;Table altered.Table altered.
Viendo las columnas asociadas con los Constraints
Vea las columnas asociadas con el constraints los nombres de la vistas USER_CONS_COLUMNS.
Resume
23
SELECT constraint_name, constraint_type,search_condition
FROM user_constraintsWHERE table_name = 'EMPLOYEES';
SELECT constraint_name, column_nameFROM user_cons_columnsWHERE table_name = 'EMPLOYEES';
• Tipos de constraints:
– NOT NULL
– UNIQUE
– PRIMARY KEY
– FOREIGN KEY
– CHECK
• Usted puede preguntar por la tabla USER_CONSTRAINTS para ver todas las
definiciones de constraint y nombres.
Practica . Aplicación global
Esta practica cubre los siguientes temas:
• Añadir constraints a las tablas existente
• Añade mas columnas a las tablas
• Muestra la información de las vistas en el diccionario de datos
24
UNIDAD 3
Lenguaje De Manipulación De Datos
Una declaración DML es ejecutable cuando tu:* Agregar nuevas líneas hacia una tabla.* Modificar líneas existentes en una tabla.* Remover líneas existentes desde una tabla.
Una transacción consiste de una colección de sentencias DML que forma una unidad lógica de trabajo.
Agregando Una Nueva Fila A Una Tabla
25
NuevaFila
Departamento
…insertar una nueva fila dentro de la tabla departamento…
Manipulando Datos
Objetivos
Después de completar esta lección, serás capaz de emplear lo siguiente:
Describe cada declaración DML. Inserta fila hacia el interior de una tabla. Poner al día filas en una tabla. Eliminar filas desde una tabla. Fusionar líneas en una tabla. Control de transacciones.
La Inserción De La Declaración De Sintaxis
Agregar nuevas filas hacia una tabla usando la declaración Insertar.
Solo una línea es insertada en un tiempo con esta sintaxis.
Insertando Nuevas Líneas
Insertar una nueva fila conteniendo valores para cada columna. Listar valores en la falta de orden de las columnas en la tabla. Opcionalmente, liste las columnas en la cláusula Insertar.
Encerrar caracteres y valores desde el interior de los datos solo cotizando marcos.
Insertando Líneas Con Valores Nulos
Método Implísito: Omitir la columna desde la lista de la columna.
Método Explícito: Especifica la palabra clave NULL en la cláusula valor.
Insertando valores especiales
La función SYSDATE registra la corriente fecha y hora.
26
Insertando Valores De Fecha Específicos
Añadir un nuevo empleado.
Verificar su adición.
Creando Un Texto
Usar y sustituir en una declaración SQL para mover los valores hacia delante. Y es un placeholder para el valor de las variables.
Copiando Líneas Para Otras Tablas Escribir su declaración INSERT con una subpregunta.
27
No usar valores en la cláusula. Partir el numero de columnas hacia esa cláusula Insertar en la subpregunta.
Cambiando Datos En La TablaEmpleado
Declarar La Sintaxis Update Modificar líneas existentes con la declaración UPDATE.
Poniendo al día más que una línea en un tiempo, si requiere.
Poniendo Al Dia Líneas En Una Tabla
Especificar línea o líneas que serán modificadas si tu específica la cláusula WHERE.
Todas las líneas en la tabla se modificarán si tú omites la cláusula WHERE.
Poniendo Al Dia Dos Columnas Con Una Subpregunta
28
Poner al día líneas en la tabla empleado
Poner al día a los empleados 114’s en tareas y salarios a juegos que del empleado 205.
Poniendo Al Dia Líneas Basándose En Otras Tablas
Use subpreguntas poniendo al día declaraciones para poner al día líneas en una tabla basándose sobre valores desde otra tabla.
Poniendo Al Día Líneas:Integrando Restrinciones De Error.
Departamento número 55 no existe
Removiendo Una Línea Desde Una Tabla
Departamentos
29
Eliminando una línea desde la tabla DEPARTAMENT.
Eliminar La Declaración
Tú puedes remover líneas existentes desde una tabla cerca usando la declaración DELETE.
Eliminando Líneas Desde Una Tabla.
Especifique líneas que serán eliminadas si tu específicas la cláusula WHERE.
Agregar líneas en la tabla que será eliminada si tú omites la cláusula WHERE.
Eliminando Líneas Basándose En Otras Tablas.
Use subpreguntas en declaraciones DELETE hasta remover líneas desde una tabla basándose en valores desde otra tabla.
Eliminando Líneas:Restringir Laintegridad De Error
30
Tú no puedes eliminar una línea que contenga una clave primaria que este usando o una clave primaria en otra tabla.
Usando Una Subpregunta En Una Declaración Insert.
Usando la opción with check como palabra clave puesta en la declaración dml.
Una subpregunta es usada para identificar la tabla y columnas de la declaración DML.
La palabra clave With Check Option es prohibida desde tú cambias líneas que no este en la subpregunta.
31
Acabada La Vista De La Falta Fracción Explicada
Con la falta fracción explicada, tú puedes usar la palabra clave Default que un valor de columna donde la falta de columna es deseada.
La adición de esta explicación es para el rendimiento con el SQL: 1999 normal. Este concede el uso para el control cuando y donde la falta de valor puede ser
aplicado para el dato. Explique las faltas que pueden ser usadas en el ingreso y salida de las
declaraciones.
USANDO LA FALTA DE VALORES EXPLÍCITOS Falta coma insertar:
Falta con Update:
La Declaración Merge
Proporcionar la habilidad condicionalmente hacia la falta de insertar datos dentro de una tabla de base de datos.
Ejecutamos un Update si la línea existe, y un insertar si esta es una nueva línea: Evite separar update.
Aumenta la representación y facilidad de uso.
32
Es útil en datos almacenando aplicaciones.
El Merge La Declación De Sintaxis Tú puedes condicionalmente insertar o actualizar líneas en una tabla cerca
usando la declaración Merge.
Merging Líneas
Insertar o update líneas in la tabla copia EMP hacia partir la tabla empleado.
Transacciones De Base Da Datos
Una transacción de base de datos consiste de una de las siguientes: Declaraciones como DML constituye una peligrosa consistencia hacia el dato. Una declaración DDL. Una declaración DCL.
Comienza cuando la primera declaración DML SQL es ejecutada.
33
Termina con uno de los siguientes eventos: Un Commit o RollBack declaración esta saliendo.
Un DDL o DCL ejecutas declaración (commit automático).
El usar salidas iSQL*Plus.
Las caídas de sistemas.
Ventajas De Las Declaraciones Commit Y Rollback
Con las declaraciones Commit y RollBack, tú puedes: Asegurar la consistencia de datos. Previamente cambiamos los datos antes de fabricar los cambios permanentes. Agrupar lógicamente las operaciones relacionadas.
Controlando Transacciones
Marque hacia atras antes de listar un punto
Crear un marco en una transacción corriente cerca usando la declaración SAVEPOINT.
Lista un punto hasta que marque a un lado usando la declaración RollBack hasta SavePiont.
34
Procesando La Transaccion Implisita
Una falta automática ocurre dentro de las siguientes circunstancias: La declaración DDL es emitida.
La declaración DCL es emitida.
La salida normal para iSQL*Plus, emitiendo como salida la declaración explícita COMMIT hacia ROLLBACK
Una lista de puntos automáticos ocurren dentro de una terminación anormal de iSQL*Plus o un sistema fracasado.
Estado De Los Datos Antes Del Commit O Rollback
Los estados previos de los datos pueden ser recordados. La corriente puede usar para revisar los resultados de las operaciones DML
usada cerca a la declaración SELECT. Otros usuarios no pueden ver los resultados de las declaraciones DML cerca del
corriente uso. Las líneas afectadas están cerradas; no pueden cambiar los datos de otros usos
desde el interior de las líneas afectadas.
Estado De Los Datos Despues Del Commit
Estos datos hechos cambian permanentemente en la base de datos. Los estados previos de los datos están permanentemente perdidos. Todos los resultados vistos pueden ser usados. Las llaves en las líneas afectadas son liberadas; estas líneas son disponibles para
la manipulación de otros usos. Todos los puntos guardados son borrados.
Encomendando Datos
Marca los cambios.
Encomendar los datos.
35
El Dato De Estado Después De La Lista.
Descarte todo cambio pendiente usando la declaración RollBack: Sin hacer nada estos datos cambian. El dato previo de los estados es restaurar. Las llaves en las líneas afectadas están liberadas.
Declaracion-Nivelado Rollback
Si falta solo una declaración DML durante la ejecución, solo esta declaración es listada atrás.
El servidor de oracle se implementa de forma implícita. Todo otro cambio estos retuvo Todos estos cambios estando en otro. El uso de transacciones explicitas se emplea para formar transacciones cerca
ejecutando una declaración Commit o Rollback.
Leer Consistencias
Leer la consistencia de una garantía que consiste en ver el dato todo el tiempo. Cambios hechos acerca de un usuario sin conflicto como cambios hechos acerca
de otros usos. Leer la consistencia que asegura el mismo dato:
Lectores no esperan para escribirse.
Escribirse no esperan para los lectores.
Implementación De La Consistencia Leer
36
Cerrando
En una base de datos Oracle, cierras: Impedir declaraciones destructivas en medio de transacciones concurrente. No requiere usar acción Automáticamente usa Lowest llano de restricciones. Esta held para la duración de la transacción. Esta es de 2 tipos: Cerrando implícita y cerrado explícita.
Cerrando Implícita Dos modos de cerrar:
Exclusiva: Llaves ausentes para otros usos.
Acción: Dejarse usar para otros accesos. Alto nivel en la ocurrencia de datos:
DML: Partir tablas, líneas exclusivas.
Preguntas: No requiere llaves.
DDL: Protege definiciones de objetos. Llaves de ayuda antes del commit o rollback.
Resume
En esta lección, tú puedes tener líneas ocultas para usar la declaración DML y transacciones de control.
Practica, Aplicación Global
Esta práctica cubre los tópicos siguientes: Insertando líneas into las tablas. Modificando y eliminando líneas en la tabla. Controlando transacciones.
37
UNIDAD 4
Las capacidades de SQL las Declaraciones SELECT
La Declaración basicas SELECT
SELECT identifica qué columnas FROM identifica la tabla
Proyeccion
Tabla 1 Tabla 2
Tabla 1Tabla 1
Join
38
SELECT *|{[DISTINCT] column|expression [alias],...}FROM table;
SQL Básico escribiendo las Declaraciones SELECT
Los objetivos
Después de completar esta lección, usted debe ser capaz a haga a lo siguiente:
Liste las capacidades de SQL las declaraciones SELECT Ejecute una declaración SELECT básica Diferencie entre las declaraciones de SQL y órdenes del
iSQL*Plus
Seleccionando Todas las Columnas
Las Columnas Específicas seleccionando
Escribiendo declaraciones SQL
Las declaraciones de SQL no son ningún caso sensible. Las declaraciones de SQL pueden ser encendido o más líneas. No pueden abreviarse las palabras claves o líneas del splitacross. Normalmente se ponen las cláusulas en las líneas separadas. Se usan las sangrías para reforzar la legibilidad.
Columna que Encabeza los Valores por defecto
iSQL*Plus: o La justificación de título de valor por defecto: El centro o El despliegue de título de valor por defecto: El mayúsculo
SQL*Plus: o El carácter y títulos de columna de Fecha quedan - justificado o Numere que los títulos de la columna están derecho-justificados o El despliegue de título de valor por defecto: El mayúsculo
SELECT *FROM departments;
SELECT department_id, location_idFROM departments;
39
Las Expresiones aritméticas
Cree las expresiones con el número y datos de la fecha usando a los operadores aritméticos.
Usando operadores aritmeticos
Procedimientos de operadores
La multiplicación y prioridad de toma de división encima de la suma y substracción.
Operadores de la misma prioridad se evalúan de salió para corregir. Se usan los paréntesis forzar la evaluación priorizada y clarificar las
declaraciones.
Operator+-*
/
SUMA
RESTA
MULTIPLICACION
DIVISION
SELECT last_name, salary, salary + 300FROM employees;
40
**** //// ++++ ____
DescriptionAddSubtract Multiply Divide
Usando paréntesis
Definiendo un Valor Nulo
Un nulo es un valor que es indisponible, el unassigned, desconocido, o inaplicable.
Un nulo no está igual que cero o un espacio pálido.
Los Valores nulos en las Expresiones Aritméticas
SELECT last_name, salary, 12*(salary+100)FROM employees;
…
…
41…
SELECT last_name, salary, 12*salary+100FROM employees;
SELECT last_name, job_id, salary, commission_pctFROM employees;
Expresiones aritméticas que contienen un valor nulo
Definiendo una Columna AliasUna columna alias:
Renombra un columna encabezando Es útil con los cálculos Inmediatamente sigue el nombre de la columna - puede haber también el
optativo COMO la palabra clave entre el nombre de la columna y alias Requiere doble comilla si contiene espacios o los caracteres especiales o es el
caso sensible
Usando alias en columna
Concatenación de operadores
…
…
SELECT last_name "Name", salary*12 "AnnualSalary"FROM employees;
…
…
42
SELECT last_name, 12*salary*commission_pctFROM employees;
SELECT last_name AS name, commission_pct commFROM employees;
Concatenación de operadores: Encadena las columnas o el carácter ata a otras columnas Se representa por dos barras verticales Crea una columna del resultante que es una expresión del carácter
Usando la concatenacion de operadores
Las Cadenas de caracteres literales Un literal es un carácter, un número, o una fecha incluidos en la lista SELECTA. La fecha y carácter que los valores literales deben incluirse dentro de solo
comilla. Cada concatenación del carácter es una vez el rendimiento para cada uno.
Las Cadenas de caracteres literales
Duplicando fila
SELECT last_name||job_id AS "Employees"FROM employees;
SELECT last_name ||' is a '||job_id AS "Employee Details"FROM employees;
…
43
El despliegue predefinido de preguntas es todas las filas, mientras incluyendo las filas del duplicado.
Eliminando filas duplicadas
Elimine las filas dobles usando la palabra clave DISTINCT en la cláusula SELECT.
Resumen
SELECT department_idFROM employees;
SELECT department_idFROM employees;
SELECT DISTINCT department_idFROM employees;
44
En esta lección, usted debe de haber aprendido cómo a:
Escriba una declaración SELECTA que:o Los ingresos todas las filas y columnas de una tablao Los ingresos especificaron las columnas de una tablao Los seudónimos de columna de usos para dar los títulos de la columna
descriptivos
Practica, Aplicación global
Esta práctica cubre los temas lo siguiente: Seleccionando todos los datos de las mesas diferentes Describiendo la estructura de tabla Los cálculos aritméticos realizando y los nombres de la columna especificando
UNIDAD 5
45
SELECT *|{[DISTINCT] column|expression [alias],...}FROM table;
Restringiendo y Ordenando los Datos
Objectives
Después de completar esta lección, usted debe ser capaz a haga a lo siguiente:
Limite las filas recuperadas por una pregunta Ordene las filas recuperadas por una pregunta
Filas limitando que Usan una SelecciónEMPLOYEES
“recupere empleadosdel departamento 90
Limitando las Filas Seleccionadas
Restrinja las filas vueltas usando el DONDE la cláusula.
De la cláusula WHERE sigue la cláusula FROM
Usando la cláusula WHERE
46
SELECT *|{[DISTINCT] column|expression [alias],...}FROM table[WHERE condition(s)];
Caracter cadena y datos
Los caracteres cadena y datos son valores que son adjuntados en una solo comilla
Los valores del carácter son el caso sensible, y los valores de la fecha son el formato sensible.
El formato de la fecha predefinido es DD-MON-RR.
Condiciones de comparación
Usando las condiciones de comparación
SELECT last_name, job_id, department_idFROM employeesWHERE last_name = 'Whalen';
47
SELECT employee_id, last_name, job_id, department_idFROM employeesWHERE department_id = 90 ;
DESCRIPCIONIGUAL AMAYOR QUEMAYOR IGUAL QUEMENORMENOR IGUAL QUEDIFERENTE A
Operator=>
>=<
<=<>
Otras condiciones con comparaciones
Usando la condicion BETWEEN
Use el BETWEEN la condición para desplegar filas basadas en un rango de valores.
Usando la condición IN
SELECT last_name, salaryFROM employeesWHERE salary BETWEEN 2500 AND 3500;
Lower limit Upper limit
48
SELECT last_name, salaryFROM employeesWHERE salary <= 3000;
Entre dos valores (inclusivo),
Coincida cualquiera de una lista de valores
Coincida un modelo del carácter
Es un valor nulo
Use el IN la condición del número de miembros para probar para los valores en una lista.
Usando la condicion LIKE
Use la condición LIKE para realizar búsquedas del wildcard de valores de cadena de búsqueda válidos.
Las condiciones de la búsqueda pueden contener carácteres literales o números: o % denota cero o muchos carácteres. o _ denota un carácter.
Usando la condicion LIKE
o Usted puede combinar modelo-emparejando los carácteres.
o Usted puede usar el identificador del ESCAPE para buscar el real% y símbolos de _.
Usando la condicion NULL
La prueba para el nulls con el operador IS NULL
49
SELECT employee_id, last_name, salary, manager_idFROM employeesWHERE manager_id IN (100, 101, 201);
SELECT first_nameFROM employeesWHERE first_name LIKE 'S%';
SELECT last_nameFROM employeesWHERE last_name LIKE '_o%';
Condiciones logicas
Usando el operador AND
AND requiere de dos condiciones verdaderas
Usando el operador OR
OR require una condicion verdadera
50
SELECT last_name, manager_idFROM employeesWHERE manager_id IS NULL;
Retorna verdadero si los ambas condiciones son verdaderos
Retorna verdadero si cualquiera de las condiciones son verdaderas
Retorna verdadero si la siguiente condición es falsa
SELECT employee_id, last_name, job_id, salaryFROM employeesWHERE salary >=10000AND job_id LIKE '%MAN%';
Usando el operador NOT
Reglas de procedencia
SELECT employee_id, last_name, job_id, salaryFROM employeesWHERE salary >= 10000OR job_id LIKE '%MAN%';
SELECT last_name, job_idFROM employeesWHERE job_id NOT IN ('IT_PROG', 'ST_CLERK', 'SA_REP');
51
Atropelle reglas de anterioridad usando los paréntesis.
Reglas de procedencia
Use los paréntesis para forzar la prioridad.
Cláusula ORDER BY
Las filas de la clase con el ORDEN POR la cláusula o ASC: el orden ascendente, el valor por defecto,
52
SELECT last_name, job_id, salaryFROM employeesWHERE job_id = 'SA_REP'OR job_id = 'AD_PRES'AND salary > 15000;
SELECT last_name, job_id, salaryFROM employeesWHERE (job_id = 'SA_REP'OR job_id = 'AD_PRES')AND salary > 15000;
o DESC: el orden descendente El ORDEN POR la cláusula entra en último lugar en la declaración SELECTA.
Ordenando en el Orden Descendente
Ordenando Alias por la Columna
Ordenando por las Columnas Múltiples
• El ORDER BY lista en el orden de clase
…
…
53
SELECT last_name, job_id, department_id, hire_dateFROM employees
SELECT last_name, job_id, department_id, hire_dateFROM employeesORDER BY hire_date DESC ;
SELECT employee_id, last_name, salary*12 annsalFROM employeesORDER BY annsal;
• Usted puede ordenar por una columna que ninguna está en la lista SELECT.
Resumen
En esta lección, usted debe de haber aprendido cómo a: o Use el WHERE la cláusula restrinja filas de rendimiento
o Use las condiciones de la comparación o Use la condicion BETWEEN, IN, LIKE, y NULLo Aplique los operadores logicos AND, OR y NOTo Use el ORDEN BY la cláusula ordenar filas de rendimiento
Practica, Apreciación global
Esta práctica cubre los temas siguientes:
o Los datos seleccionando y cambiando el ofrows del orden desplegado o Las filas restringiendo usando el DONDE la cláusula o Las filas ordenando usando el ORDEN BY la cláusula
UNIDAD 6
…
54
SELECT last_name, department_id, salaryFROM employeesORDER BY department_id, salary DESC;
SELECT *|{[DISTINCT] column|expression [alias],...}FROM table[WHERE condition(s)][ORDER BY {column, expr, alias} [ASC|DESC]];
Funciones De Registro Simple
Objetivos
Completando esta lección usted debe ser capaz de hacer lo siguiente: Describir varios tipos de variables de las funciones SQL Usar carácter, números, y funciones de la fecha en declaraciones SELECTAS Describir el uso de funciones de conversión
Funciones SQL
Dos tipos de funciones de SQL
Funciones De Registro Simple
Manipula artículos de los datos Acepta argumentos y devuelva un valor
FuncionFuncionInput
arg 1arg 1
arg 2arg 2
arg arg nn
Function performs action
Output
ResultanteResultante
FuncionesFunciones
FUNCIONES DE REGISTRO
SIMPLE
FUNCIONES DE REGISTRO MULTIPLE
55
Entrada Salida
Actúa en cada fila vuelta Devuelva un resultado por el registro Pueda modificar el tipo de los datos Puede anidarse Acepta argumentos que pueden ser una columna o una expresión
Funciones De Registro Simple
Función De Caracteres
Casos de funciones de manipulación
Estas funciones convierten caso para los cordones del carácter
nombre_de_function [(arg1, arg2,...)]nombre_de_function [(arg1, arg2,...)]
ConversionConversion
CaracterCaracter
NumerosNumeros
FechasFechas
GeneralGeneral
FUNCIONES DE REGISTRO SIMPLE
Funcion deFuncion deCaracterCaracter
LOWERUPPERINITCAP
CONCATSUBSTRLENGTHINSTRLPAD | RPADTRIMREPLACE
CASOS DE FUNCIONES DE MANIPULACIÓN
FUNCIONES DE MANIPULACIÓN TIPO CARACTER
56
Usando Los Casos De Funciones De Manipulación
Despliegue el número del empleado, nombre, y número de la sección para el empleado Higgins
Funciones De Manipulación Tipo Carácter
Estas funciones manipulan cordones del carácter:
Usando Las Funciones Manipulación Tipo Carácter
Functiones Resultados
LOWER('SQL Course')UPPER('SQL Course')INITCAP('SQL Course')
sql courseSQL COURSESql Course
SELECT employee_id, last_name, department_idFROM employeesWHERE last_name = 'higgins';no rows selectedno rows selected
SELECT employee_id, last_name, department_idFROM employeesWHERE last_name = 'higgins';no rows selectedno rows selected
SELECT employee_id, last_name, department_idFROM employeesWHERE LOWER(last_name) = 'higgins';
CONCAT('Hello', 'World')SUBSTR('HelloWorld',1,5)LENGTH('HelloWorld')INSTR('HelloWorld', 'W')LPAD(salary,10,'*')RPAD(salary, 10, '*')TRIM('H' FROM 'HelloWorld')
HelloWorldHello106*****2400024000*****elloWorld
Function Result
57
Función tipo numérico
ROUND: Las rondas valoran al decimal especificado ROUND(45.926, 2) 45.93TRUNC: Trunca valor al decimal especificado TRUNC(45.926, 2) 45.92MOD: Resto de los ingresos de divisiónMOD(1600, 300) 100
Usando La Función Round
DUAL es una tabla vacía donde usted puede acostumbrarse a ver resultados de las funciones y cálculos.
Usando La Función Trunc
SELECT employee_id, CONCAT(first_name, last_name) NAME, job_id, LENGTH (last_name), INSTR(last_name, 'a') "Contains 'a'?"FROM employeesWHERE SUBSTR(job_id, 4) = 'REP';
1
2
31 2
3
SELECT ROUND(45.923,2), ROUND(45.923,0), ROUND(45.923,-1)FROM DUAL;
1 2
3
31 2
58
Usando La Función Mod
Calcule el resto de un sueldo después de que es dividido a través de 5000 para todos los empleados cuyo cargo es representante de las ventas.
Trabajando Con Fechaso La base de datos de oracle guarda fechas en un formato numérico interior: siglo,
año, mes, día, horas, minutos, segundos. o El formato de despliegue de fecha predefinido es DD-MON-RR. (día, mes -
año)o Le permite guardar 21 siglos como fecha en 20 siglos especificando sólo
los últimos dos dígitos del año. o Le permite guardar 20 siglo fecha en el 21 siglo de la misma manera.
Trabajando Con Fechas
SELECT TRUNC(45.923,2), TRUNC(45.923), TRUNC(45.923,-2)FROM DUAL;
31 2
1 2
3
SELECT last_name, salary, MOD(salary, 5000)FROM employeesWHERE job_id = 'SA_REP';
SELECT last_name, hire_dateFROM employeesWHERE last_name like ''G%';';
59
SYSDATE es una función que vuelve: o Date o Time
Fechas En Forma Aritmética
Agregue o substraiga un número a o de una fecha para un valor de fecha de resultante.
Substraiga dos fechas para encontrar el número de días entre esas fechas. Agregue horas a una fecha dividiendo el número de horas a través de 24.
Usando Operaciones Aritméticas Con Fechas
Funciones De La Fecha
Usando funciones de fecha
SELECT last_name, (SYSDATE-hire_date)/7 AS WEEKSFROM employeesWHERE department_id = 90;
Número de meses entre dos fechasMONTHS_BETWEEN
ADD_MONTHS
NEXT_DAY
LAST_DAY
ROUND
TRUNC
Añadir meses a la fecha
siguiente día de la fechaespecificada
Último día del mes
Redondear Fecha
Truncar Fecha
Función Descripción
60
Asuma que SYSDATE = '25-JUL-95':
Usando funciones de fecha
Practica, Apreciación Global
Esta práctica cubre los temas siguientes: Escribiendo una pregunta que despliega la fecha actual Creando preguntas que requieren el uso de numérico, carácter, y funciones de la
fecha Realizando los cálculos de años y meses de servicio para un empleado
Conversión de funciones
MONTHS_BETWEEN ('01-SEP-95','11-JAN-94')
ADD_MONTHS ('11-JAN-94',6)
NEXT_DAY ('01-SEP-95','FRIDAY')
LAST_DAY('01-FEB-95')
19.6774194
'08-SEP-95'
'28-FEB-95'
'11-JUL-94'
ROUND(SYSDATE,'MONTH') 01-AUG-95
TRUNC(SYSDATE ,'MONTH') 01-JUL-95
TRUNC(SYSDATE ,'YEAR') 01-JAN-95
61
Conversión De Tipo De Datos Implícita
Para las asignaciones, el servidor del Oracle puede automáticamente convertir a lo siguiente:
Conversión De Tipo De Datos Implícita
Para la evaluación de la expresión, el Servidor del Oracle puede automáticamente convertir a lo siguiente:
Conversión De Tipo De Datos Implícita
62
Conversión deConversión deTipos de datosTipos de datos
ImplícitaImplícita
Conversión deConversión deTipos de datos Tipos de datos
ExplícitaExplícita
Tipos de Tipos de ConversiónConversión
FechaFecha
VARCHAR2 or CHAR
DE A
VARCHAR2 or CHAR
NUMBER
DATE
NUMBER
DATE
VARCHAR2
VARCHAR2
VARCHAR2 or CHAR
DE A
VARCHAR2 or CHAR
NUMBER
DATE
Usando La Función To_Char Con Fechas
El modelo del formato: Debe adjuntarse en comillas simples y debe ser casos sensible Pueda incluir cualquier elemento de formato de fecha válido Tiene el elemento fm para quitar espacios en blanco rellenos o suprimir ceros
principales Está separado del valor de la fecha por una coma
Elementos Del Modelo De Formato De Fecha
Elementos Del Modelo De Formato De Fecha
TO_CHAR(date, 'modelo_de_formato')TO_CHAR(date, 'modelo_de_formato')
YYYYYEAR
MM
MONTH
DY
DAY
Año entero en númerosDeletreo de salida de Año
Tres letras abreviatura del día de la semana
Nombre entero del día de la semana
Nombre entero del mes
MON Tres letras abreviatura del mes
DD Día numérico del mes
Valor del dos dígitos durante mes
63
CARACTER
TO_CHAR
TO_NUMBER
DATE
TO_CHAR
TO_DATE
NUMBER
Cronometre que los elementos estructuran la porción de tiempo de la fecha.
Agregue que el carácter ata adjuntándolos en doble comillas.
Numere que los sufijos deletrean fuera los números
Usando La Función To_Char Con Fechas
Usando la función to_char con números
Éstos son algunos de los elementos del formato que usted puede usar con la función de TO_CHAR para desplegar un valor del número como un carácter:
HH24:MI:SS AM 15:45:32 PM
DD "of" MONTH 12 of OCTOBER
ddspth fourteenth
SELECT last_name, TO_CHAR(hire_date, 'fmDD Month YYYY') AS HIREDATEFROM employees;
…
TO_CHAR(number, 'format_model')TO_CHAR(number, 'format_model')
64
9
0
$
L
.
,
Representa un numero
Forza un cero para displayarlo
Places a floating dollar sign
Uses the floating local currency symbol
Muestra el indicador de mil
Muestra un punto decimal
Usando La Función To_Char Con Números
Uusando la función to_number y to_date
Convierta un cordón del carácter a un formato del número que usa la función de TO_NUMBER:
Convierta un cordón del carácter a un formato de la fecha que usa la función de TO_DATE: Estas funciones tienen un modificador del fx. Este modificador especifica el mparejando exacto para el argumento del carácter y modelo de formato de fecha de una función de TO_DATE
Usando La Función To_Number Y Funciones To_Date
SELECT TO_CHAR(salary, '$99,999.00') SALARYFROM employeesWHERE last_name = 'Ernst';
TO_NUMBER(char[, 'format_model'])TO_NUMBER(char[, 'format_model'])
TO_DATE(char[, 'format_model'])TO_DATE(char[, 'format_model'])
65
Convierta un cordón del carácter a un formato del número que usa la función de TO_NUMBER:
Convierta un cordón del carácter a un formato de la fecha que usa la función de TO_DATE:
Estas funciones tienen un modificador del fx. Este modificador especifica el mparejando exacto para el argumento del carácter y modelo de formato de fecha de una función de TO_DATE
Formato De Fecha RR
Ejemplo de formato rr
Para encontrar a empleados contratados a prior a 1990, use el RR estructure que reduce los mismos resultados si el orden se corre en 1999 o ahora:
Anidando Funciones
TO_NUMBER(char[, 'format_model'])TO_NUMBER(char[, 'format_model'])
TO_DATE(char[, 'format_model'])TO_DATE(char[, 'format_model'])
SELECT last_name, TO_CHAR(hire_date, 'DD-Mon-YYYY')FROM employeesWHERE hire_date < TO_DATE('01-Jan-90', 'DD-Mon-RR');
66
Año Actual1995199520012001
Fecha específica27-OCT-9527-OCT-1727-OCT-1727-OCT-95
Formato RR 1995201720171995
Formato YY 1995191720172095
Si dos dígitos del año actual son:
0–49
0–49 50–99
50–99
La fecha del retorno está en el siglo actualLa fecha del retorno persigue por el siglo el actual
La fecha del retorno está por el siglo antes del actual
La fecha del retorno está en el siglo actual
Si el año especificado es de dos dígitos:
o Pueden anidarse funciones de la solo-fila a cualquier nivel. o Se evalúan funciones anidadas del nivel más profundo al nivel profundo.
Funciones generales
Estas funciones trabajan con cualquier datos teclee y pertenezca a usar nulls.
• NVL (expr1, expr2)• NVL2 (expr1, expr2, expr3)• NULLIF (expr1, expr2)• COALESCE (expr1, expr2, ..., exprn)
Funciones NVL
Convertido un nulo a un valor real.
o Tipos de los datos que pueden usarse son fecha, carácter, y número. o Los tipos de los datos deben emparejar:
– NVL(commission_pct,0)– NVL(hire_date,'01-JAN-97')– NVL(job_id,'No Job Yet')
67
SELECT last_name, NVL(TO_CHAR(manager_id), 'No Manager')FROM employeesWHERE manager_id IS NULL;
F3(F2(F1(col,arg1),arg2),arg3)Step 1 = Result 1
Step 2 = Result 2
Step 3 = Result 3
Uusando la función de NVL
Usando La Función NVL2
…
1 2
12
SELECT last_name, salary, NVL(commission_pct, 0), (salary*12) + (salary*12*NVL(commission_pct, 0)) AN_SALFROM employees;
1 2
12
68
SELECT last_name, salary, commission_pct, NVL2(commission_pct, 'SAL+COMM', 'SAL') incomeFROM employees WHERE department_id IN (50, 80);
Usando La Función De NULLIF
Usando La Función COALESCE
o La ventaja del UNA función encima de la función de NVL es que el UNA la función puede tomar valores del alternante múltiples.
o Si la primera expresión no es nula, vuelve que la expresión; por otra parte, hace un UNA de las expresiones restantes.
Expresiones condicionales
SELECT first_name, LENGTH(first_name) "expr1", last_name, LENGTH(last_name) "expr2", NULLIF(LENGTH(first_name), LENGTH(last_name)) resultFROM employees;
…
1
23
1 2 3
SELECT last_name, COALESCE(commission_pct, salary, 10) commFROM employeesORDER BY commission_pct;
…
69
o Proporcione el uso de lógica del SI-ENTONCES-RESTO dentro de una declaración de SQL
o Use dos métodos: o Expresión del CASE o Función DECODE
Expresión Del Case
Facilita preguntas condicionales haciendo el trabajo de una declaración del SI-NTONCES-RESTO:
Expresión CASE
Facilita preguntas condicionales haciendo el trabajo de una declaración del SI-ENTONCES-RESTO:
Función DECODE
Facilita preguntas condicionales haciendo el trabajo de un CASO o declaración del SI-ENTONCES-RESTO:
Usando La Función DECODE
CASE expr WHEN comparison_expr1 THEN return_expr1 [WHEN comparison_expr2 THEN return_expr2 WHEN comparison_exprn THEN return_exprn ELSE else_expr]END
CASE expr WHEN comparison_expr1 THEN return_expr1 [WHEN comparison_expr2 THEN return_expr2 WHEN comparison_exprn THEN return_exprn ELSE else_expr]END
SELECT last_name, job_id, salary, CASE job_id WHEN 'IT_PROG' THEN 1.10*salary WHEN 'ST_CLERK' THEN 1.15*salary WHEN 'SA_REP' THEN 1.20*salary ELSE salary END "REVISED_SALARY"FROM employees;
…
…
70
DECODE(col|expression, search1, result1 [, search2, result2,...,] [, default])
Despliegue la proporción del impuesto aplicable para cada empleado en sección 80.
Resumen
En esta lección, usted debe de haber aprendido cómo a: o Realice cálculos en datos que usan funciones o Modifique artículos de los datos individuales que usan funciones o Manipule rendimiento para los grupos de filas que usan funciones o Altere formatos de la fecha para despliegue que usa funciones o Convierta que el datos de la columna teclea usando funciones o Uso las funciones de NVL o Use lógica del SI-ENTONCES-RESTO
Practica, Apreciación Global
Esta práctica cubre los temas siguientes: o Preguntas creando que requieren el uso de numérico, carácter, y funciones de la
fecha o Encadenamiento usando con funciones o Preguntas caso-insensibles escribiendo para probar la utilidad de funciones del
carácter o Los cálculos realizando de años y meses de servicio para un empleado o Determinando la fecha de la revisión para un empleado
SELECT last_name, job_id, salary, DECODE(job_id, 'IT_PROG', 1.10*salary, 'ST_CLERK', 1.15*salary, 'SA_REP', 1.20*salary, salary) REVISED_SALARYFROM employees;
…
…
71
UNIDAD 7
Obtener datos de tablas múltiples
Productos Cartesianos
• Un producto cartesiano es formado cuando:– Una condición de unión es omitida– Una condición de unión es invalida– Todas las filas de la primera tabla están unidad a todas las filas en la
segunda tabla• Para evitar un producto cartesiano, siempre incluimos una condición de unión
valida en una cláusula WHERE.
72
EMPLOYEES
…
EMPLOYEED
…
DEPARTMENT
Visualizar datos múltiples de una tabla
Objetivos
Completando esta lección usted debe ser capaz a hacer lo siguiente:o Escribir declaraciones SELECTAS para acceder a datos de más de una tabla
usando igualdad e inigualdad juntaso Ver datos que generalmente no se encuentra en una condición de unión
usando otras uniones exterioreso Unir una tabla a si misma usando una unión a si misma
Generando Un Producto Cartesiano
Tipos De Uniones
Oracle Propiedades de SQL: 1999 (ANSI) uniones en (8i and prior): Compliant Joins:
• Igualdad de union• No igualdad de union• Uniones exteriores• Union con si misma
Tables Unidas Usando Sintaxis Oracle
Use una union para preguntar datos de más de una tabla.
• Escriba la condicion de union en la clausula WHERE .• Prefije el nombre de la columna con el nombre de la tabla cuando el mismo
nombre de la columna aparece en más de una tabla.
Cartesianproduct:
20x8=160 rows
EMPLOYEES (20 rows) DEPARTMENTS (8 rows)
…
…
73
• Uniones cruzada• Uniones naturales• Usando clausula• Lleno o dos estado de uniones
exteriores• Condicion de uniones arbitraries
para uniones exteriores
SELECT table1.column, table2.columnFROM table1, table2WHERE table1.column1 = table2.column2;
Que es una igualdad de union?( Oracle Proprietary )
Recuperando registros con Igualdad de unión
EMPLOYEES DEPARTMENTS
Foreign key Primary key
… …
…
74
SELECT employees.employee_id, employees.last_name, employees.department_id, departments.department_id, departments.location_idFROM employees, departmentsWHERE employees.department_id =
Buscar condiciones adicionales usando el operador AND
Limitando Columnas con nombres ambiguos
• Usar tablas prefijos de limitar columnas con nombres que están en múltiples tablas.
• Mejorar la representación usando tablas con prefijos.• Distinguir columnas que tienen nombres idénticos pero residen en diferentes
tablas usando columnas con alias
Usando Tables con Alias
• Simplificar preguntas Usando tablas con alias.
• Mejorar la representación usando tablas con prefijos.
Uniendo más de dos tablas
• Para unir n tablas juntas, tu necesitas un mínimo de n-1 condiciones unidas. Por ejemplo, para juntar tres tablas, un mínimo de dos uniones es requeridas
EMPLOYEES DEPARTMENTS
SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_idFROM employees e , departments dWHERE e.department_id = d.department_id;
EMPLOYEES LOCATIONS DEPARTMENTS
…
75
No Igualdad de union ( Oracle Propietario )
Recuperando Registros con No-Igualdad de unión
Uniones Exteriores ( Oracle Proppietario )
EMPLOYEES JOB_GRADES
El sueldo en los EMPLOYEE la tabla debe ser entre el sueldo más bajo y más alto el sueldo en el JOB_GRADES
SELECT e.last_name, e.salary, j.grade_levelFROM employees e, job_grades jWHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;
EMPLOYEESDEPARTMENTS
There are no employees in department 190. …
76
Sintaxis de Uniones Exteriores
• Usted usa una unión exterior también para ver filas que no se encuentran en la condición de unión.
• La unión exterior operador es el signo más (+).
Usando Uniones Exteriores
Uniones con si misma
Uniendo una tabla a si misma
SELECT table1.column, table2.columnFROM table1, table2WHERE table1.column(+) = table2.column;
SELECT table1.column, table2.columnFROM table1, table2WHERE table1.column(+) = table2.column;
SELECT table1.column, table2.columnFROM table1, table2WHERE table1.column = table2.column(+);
SELECT table1.column, table2.columnFROM table1, table2WHERE table1.column = table2.column(+);
SELECT e.last_name, e.department_id, d.department_nameFROM employees e, departments dWHERE e.department_id(+) = d.department_id ;
…
EMPLOYEES (WORKER) EMPLOYEES (MANAGER)
MANAGER_ID es una tabla igual que la tabla EMPLOYEE_ID en la tabla MANAGER.
… …
77
Uniendo Tablas Usando SQL: Sintaxis 1999
Use una unión para preguntar datos de más de una tabla.
Creando uniones cruzadas
• La cláusula Unión Cruzada produce el producto-cruzado de dos tablas. • Esto está igual que un producto Cartesiano entre las dos tablas
Creando Uniones Naturales
…
SELECT worker.last_name || ' works for ' || manager.last_nameFROM employees worker, employees managerWHERE worker.manager_id = manager.employee_id ;
…
SELECT last_name, department_nameFROM employeesCROSS JOIN departments ;
78
SELECT table1.column, table2.columnFROM table1[CROSS JOIN table2] |[NATURAL JOIN table2] |[JOIN table2 USING (column_name)] |[JOIN table2 ON(table1.column_name = table2.column_name)] |[LEFT|RIGHT|FULL OUTER JOIN table2 ON (table1.column_name = table2.column_name)];
• La cláusula UNION NATURAL esta basada sobre todas las columnas en las dos tablas que tienen el nombre igual.
• Estas filas consultadas de las dos tablas que tienen igual valores en todas las columnas marcadas.
• Si las columnas teniendo los nombres iguales tienen diferentes tipos de datos, esto produce un error.
Recuperando Registros con Uniones Naturales
Creando Uniones Con La Cláusula Usando
• Si varias columnas tienen los mismos nombres excepto los tipos del datos no igualan, la cláusula unión natural puede modificarse con la cláusula usando para especificar las columnas que deben usarse para una igualdad de unión
• Use la cláusula usando para igualar a sólo una columna cuando más de una la columna igualada.
• No use un nombre de la tabla o alias en las columnas referenciadas • La unión natural y cláusulas usando son mutuamente exclusivos.
Recuperando Registros Con La Cláusula Usando
Creando Uniones Con La Cláusula ON
SELECT e.employee_id, e.last_name, d.location_idFROM employees e JOIN departments dUSING (department_id) ;
79
SELECT department_id, department_name, location_id, cityFROM departmentsNATURAL JOIN locations ;
• La condición unión para la unión natural básicamente una igualdad de unión de todas las columnas con el mismo nombre.
• Especificar condiciones arbitrarias o especificar columnas para unir, en la cláusula ON se usa.
• La condición unión está separada de otras condiciones de la búsqueda. • La cláusula ON esta hacha con código fácil entender.• La condición unión para la unión natural básicamente una igualdad de unión de
todas las columnas con el mismo nombre. • Especificar condiciones arbitrarias o especificar columnas para unir, en la
cláusula ON se usa.
Creando tres maneras de unir con la cláusula ON
Creando tres maneras de unir con la cláusula ON
Uniones Internas VS Externas
SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_idFROM employees e JOIN departments dON (e.department_id = d.department_id);
…
…
80
SELECT employee_id, city, department_nameFROM employees e JOIN departments dON d.department_id = e.department_id JOIN locations lON d.location_id = l.location_id;
• En SQL: 1999, la unión de dos tablas retornaba solo filas igualadas en una unión interna.
• Una unión entre dos tablas que devuelven los resultados de la unión interior así como cuando salieron filas (o correctas) tablas salieron(o correctas) unión externa.
• Una unión entre dos tablas que devuelven los resultados de una unión interna así como los resultados de una izquierda y derecha es todo una unión externa.
Union Externa Salida
Corregir Unión Externa
Llenar Unión Externa
…
81
SELECT e.last_name, e.department_id, d.department_nameFROM employees eLEFT OUTER JOIN departments dON (e.department_id = d.department_id) ;
…
SELECT e.last_name, e.department_id, d.department_nameFROM employees eRIGHT OUTER JOIN departments dON (e.department_id = d.department_id) ;
Adicionar Condiciones
Resumen
En esta lección, usted debería haber aprendido como usar uniones para presentar datos de múltiples tablas en:
• Sintaxis propiedad de Oracle para versiones 8i y anteriores • SQL: 1999 sintaxis dóciles para versiones 9i
Practica, Apreciación global
Esta práctica cubre los temas siguientes: Uniendo tablas que usan una igualdad de unión Realizando uniones externas a si mismas Agregando condiciones
…
82
SELECT e.last_name, e.department_id, d.department_nameFROM employees eFULL OUTER JOIN departments dON (e.department_id = d.department_id) ;
SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_idFROM employees e JOIN departments dON (e.department_id = d.department_id)AND e.manager_id = 149 ;
UNIDAD 8
¿Que son las funciones de grupo?
Las funciones del grupo operan en los juegos de filas para dar un resultado por el grupo.
Tipos de funciones de grupo
• AVG • COUNT • MAX• MIN • STDDEV • SUM• VARIANCE
Sintaxis de una función de grupo
EMPLOYEES
El máximo salario En la tablaEMPLOYEES,
83
Agregando datos con funciones de grupo
Objetivos
Después de completar esta lección, usted debe ser capaz a hacer lo siguiente:• Identifique las funciones de grupo disponibles• Describa el uso de funciones de grupo• Datos de grupo que usan el GROUP BY la cláusula• Incluya o excluya las filas agrupadas usando la cláusula HAVING
Usando la funcion AVG y SUM
Usted puede usar AVG y SUM para dato numérico
Usando la función MIN y MAX
Usted puede usar MIN y MAX para cualquier tipo de dato
Usando la función COUNT
COUNT (*) retorna un numero en la fila de una tabla
Usando la funcion COUNT (*)
SELECT [column,] group_function(column), ...FROM table[WHERE condition][GROUP BY column][ORDER BY column];
SELECT AVG(salary), MAX(salary), MIN(salary), SUM(salary)FROM employeesWHERE job_id LIKE '%REP%';
SELECT COUNT(*)FROM employeesWHERE department_id = 50;
84
SELECT MIN(hire_date), MAX(hire_date)FROM employees;
• COUNT(expr) los ingresos el número de filas con los valores no-nulos para el expr.
• Despliegue el número de valores del departamento en la mesa de los EMPLOYEE, mientras excluyendo los valores nulos
Usando la palabra clave DISTINCT.
• El expresión de COUNT(DISTINCT) los ingresos el número de valores no-nulos distintos de la expresión.
• Despliegue que el número de departamento distinto valora en la tabla EMPLOYEE.
Funciones de grupos y valores nulos
Funciones de grupos ignoran los valores nulos en una columna
Usando la función NVL con funciones de grupos
Las funciones NVL fuerzan a las funciones de grupos a incluir valores nulos
Creando datos de grupos
SELECT COUNT(commission_pct)FROM employeesWHERE department_id = 80;
SELECT COUNT(DISTINCT department_id)FROM employees;
SELECT AVG(commission_pct)FROM employees;
SELECT AVG(NVL(commission_pct, 0))FROM employees;
85
Creando grupos de datos
Divida las filas de una tabla en los grupos menores usando la cláusula GROUP BY la cláusula.
Usando la clausula GROUP BY
Todas las columnas en la lista SELECT que no está en el grupo las funciones deben estar en la clausula GROUP BY.
El GROUP BY la columna no tiene que estar en el La lista SELECTA.
EMPLOYEES
The averagesalary in EMPLOYEEStable for each department.
4400
…
9500
3500
6400
10033
SELECT department_id, AVG(salary)FROM employeesGROUP BY department_id ;
86
SELECT column, group_function(column)FROM table[WHERE condition][GROUP BY group_by_expression][ORDER BY column];
Agrupando mas de una columna
SELECT AVG(salary)FROM employeesGROUP BY department_id ;
EMPLOYEES
“Add up the salaries in
the EMPLOYEES table
for each job, grouped by department.
…
87
Usando la cláusula GROUP BY en columnas múltiples
Preguntas ilegales que usan las funciones de grupos
Cualquier columna o expresión en la lista SELECT que no es una función agregado debe estar en la cláusula GROUP BY.
Usted no puede usar la cláusula WHERE para restringir los grupos. Usted usa la cláusula HAVING restringir los grupos. Usted no puede usar las funciones de grupo en la cláusula WHERE
Los Resultados De grupo excluyendo
SELECT department_id dept_id, job_id, SUM(salary)FROM employeesGROUP BY department_id, job_id ;
SELECT department_id, COUNT(last_name)FROM employees;
SELECT department_id, COUNT(last_name)FROM employees;
SELECT department_id, COUNT(last_name) *ERROR at line 1:ORA-00937: not a single-group group function
SELECT department_id, COUNT(last_name) *ERROR at line 1:ORA-00937: not a single-group group function
SELECT department_id, AVG(salary)FROM employeesWHERE AVG(salary) > 8000GROUP BY department_id;
SELECT department_id, AVG(salary)FROM employeesWHERE AVG(salary) > 8000GROUP BY department_id;
WHERE AVG(salary) > 8000 *ERROR at line 3:ORA-00934: group function is not allowed here
WHERE AVG(salary) > 8000 *ERROR at line 3:ORA-00934: group function is not allowed here
Cannot use the WHERE clause to restrict groupsCannot use the WHERE clause to restrict groups
88
Los Resultados De grupo excluyendo:La cláusula HAving
Usando la cláusula HAVING para restringir grupos1. Agrupando filas2. La función de grupo es aplicable3. Se despliegan grupos que coinciden la cláusula HAVIN
Usando la cláusula HAVING
Anidando funciones de grupos
The maximumsalary
per departmentwhen it is
greater than$10,000
EMPLOYEES
…
SELECT column, group_functionFROM table[WHERE condition][GROUP BY group_by_expression][HAVING group_condition][ORDER BY column];
SELECT job_id, SUM(salary) PAYROLLFROM employeesWHERE job_id NOT LIKE '%REP%'GROUP BY job_idHAVING SUM(salary) > 13000ORDER BY SUM(salary);
89
Presentar el máximo valor de salario
Resumen
En esta lección, usted debe de haber aprendido a: Usar las funciones grupo MÁX, MIN, AVG,COUNT Escriba preguntas que usan la cláusula GROYUP BY Escriba preguntas que usan la cláusula HAVING
Practica, Aplicación global
Esta práctica cubre los temas lo siguiente:
Preguntas escribiendo que usan las funciones de grupo Agrupándose por las filas para lograr más de un resultado Excluyendo grupos usando la cláusula HAVING
SELECT MAX(AVG(salary))FROM employeesGROUP BY department_id;
SELECT column, group_function(column)FROM table[WHERE condition][GROUP BY group_by_expression][HAVING group_condition][ORDER BY column];
90
UNIDAD 9
Usar Sub-queriesPara resolver problemas
¿Quién tiene un sueldo mayor que Abel?
Sintaxis de un subqueries
El subquery (la pregunta interna) ejecuta una vez antes de la pregunta principal. El resultado del subquery se usa por la pregunta principal (la pregunta exterior).
Usando subqueries
91
SELECT select_listFROM tableWHERE expr operator
(SELECT select_list FROM table);
Subqueries
Objetivos
Después de completar esta lección, usted debe ser capaz a Hacer lo siguiente Describa los tipos de problema que los subqueries pueden resolver Defina el subqueries Liste los tipos de subqueries Escriba solo-fila y subqueries de la múltiple-fila
¿Qué empleados tienen los sueldos mayor que el sueldo de Abel?
Main Query:
??
¿Cuál es el sueldo de Abel???
Subquery
Las pautas para usar subqueries
Adjunte el subqueries en los paréntesis. Ponga el subqueries en el lado correcto de la condición de la comparación. La cláusula ORDER BY subquery no se necesita a menos que usted está
realizando un análisis TOP-N. Use a operadores de una solo-fila con los subqueries de la solo-fila y operadores
de múltiple-fila con subqueries de múltiple-flial
Tipos de subqueries
Subqueries de una sola fila Retorna una sola columna Usa una sola fila con operadores de comparación
SELECT last_nameFROM employeesWHERE salary > (SELECT salary FROM employees WHERE last_name = 'Abel');
11000
Main query
Subquery returns ST_CLERK
Multiple-row subquery
ST_CLERKSA_MAN
Main query
Subquery returns
Single-row subquery
92
Ejecutando subqueries solo una fila
Usando funciones de grupos en un subqueries
La cláusula HAVING con subqueries
El servidor de oracle ejecuta primero los subqueries El servidor de oracle retorna resultados de la cláusula HAVING a la pregunta
principal
SELECT last_name, job_id, salaryFROM employeesWHERE salary = (SELECT MIN(salary) FROM employees);
2500
SELECT department_id, MIN(salary)FROM employeesGROUP BY department_idHAVING MIN(salary) > (SELECT MIN(salary) FROM employees WHERE department_id = 50);
2500
93
SELECT last_name, job_id, salaryFROM employeesWHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 141)AND salary > (SELECT salary FROM employees WHERE employee_id = 143);
ST_CLERK
2600
Cual esta equivocado con estadeclaracion?
¿Esta Declaración Devolverá las Filas?
Subqueries múltiples filas
Retorna mas de una fila Usa múltiples filas para operadores de comparaciones
SELECT employee_id, last_nameFROM employeesWHERE salary = (SELECT MIN(salary) FROM employees GROUP BY department_id);
ERROR at line 4:ORA-01427: single-row subquery returns more thanone row
ERROR at line 4:ORA-01427: single-row subquery returns more thanone row
Single-row operator with multiple-row subquerySingle-row operator with multiple-row subquery
no rows selectedno rows selected
SELECT last_name, job_idFROM employeesWHERE job_id = (SELECT job_id FROM employees WHERE last_name = 'Haas');
Subquery no retorna valoresSubquery no retorna valores
94
Usando el operador ANY en subqueries multiples filas
Usando el operador ALL en subqueries multiples filas
Valores nulos en un subqueries
9000, 6000, 4200SELECT employee_id, last_name, job_id, salaryFROM employeesWHERE salary < ANY (SELECT salary FROM employees WHERE job_id = 'IT_PROG')AND job_id <> 'IT_PROG';
SELECT employee_id, last_name, job_id, salaryFROM employeesWHERE salary < ALL (SELECT salary FROM employees WHERE job_id = 'IT_PROG')AND job_id <> 'IT_PROG';
9000, 6000, 4200
SELECT emp.last_nameFROM employees empWHERE emp.employee_id NOT IN (SELECT mgr.manager_id FROM employees mgr);no rows selectedno rows selected
95
Resumen
En esta lección, usted debe de haber aprendido a: Identifique cuando un subquery puede ayudar a resolver una pregunta
Escriba el subqueries cuando una pregunta es basada adelante
Practica, Aplicación global
Esta práctica cubre los temas lo siguiente:
El subqueries creando para preguntar valores basados en el criterio desconocido Los subqueries usando para encontrar fuera que los valores existen en uno
pusieron de datos y no en otro
SELECT select_listFROM tableWHERE expr operator
(SELECT select_list FROM table);
96
UNIDAD 10
Otros objetos de base de daros
SecuenciasUna sucesión:
Automáticamente genera los únicos números Es un objeto del sharable Se usa para crear un valor importante primario típicamente Reemplaza el código de la aplicación Las velocidades a la eficacia de acceder la sucesión valoran cuando escondió en
la memoria
Defina una sucesión para generar los números secuenciales automáticamente:
Creando una Sucesión
97
CREATE SEQUENCE sequence [INCREMENT BY n] [START WITH n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}];
Otros objetos de base de darosObjetivos
Después de completar esta lección, usted debe ser capaz de hacerlo siguiente: Cree, mantenga, y use las sucesiones Cree y mantenga los índices Cree los sinónimos privados y públicos
Cree que una sucesión nombrada DEPT_DEPTID_SEQ para ser usado para la llave primaria de la tabla de los DEPARTMENT.
No use la opción del CTCLE.
Las Sucesiones confirmando
Verifique sus valores de la sucesión en la USER_SEQUENCES datos diccionario mesa.
La columna de LAST_NUMBER despliega el próximo número de la sucesión isponible si NOCACHE se especifica.
Usando una Sucesión
Inserte un nuevo departamento nombrado “el Apoyo” en la situación ID 2500.
Vea el valor actual por la sucesión de DEPT_DEPTID_SEQ.
Usando una secuencia
Los valores de la sucesión escondiendo en la memoria dan el acceso más rápido a esos valores.
98
INSERT INTO departments(department_id, department_name, location_id)VALUES (dept_deptid_seq.NEXTVAL, 'Support', 2500);1 row created.
SELECT sequence_name, min_value, max_value, increment_by, last_number
FROM user_sequences;
CREATE SEQUENCE dept_deptid_seq INCREMENT BY 10 START WITH 120 MAXVALUE 9999 NOCACHE NOCYCLE;Sequence created.
SELECT dept_deptid_seq.CURRVALFROM dual;
Los huecos en los valores de la sucesión pueden ocurrir cuando: Un rollback ocurre El sistema choca Una sucesión se usa en otra tabla Si la sucesión se creara con NOCACHE, vea el próximo valor disponible,
preguntando la mesa de USER_SEQUENCES.
Modificando una Sucesión
Cambie el valor de incremento, valor máximo, valor mínimo, opción del ciclo, u opción del escondite
Las pautas por Modificar una Sucesión
Usted debe ser el dueño o debe tener el ALTER el privilegio para la sucesión. Sólo números de la sucesión futuros son afectado. La sucesión debe dejarse caer y debe recrearse para reiniciar la sucesión a un
número diferente. Un poco de aprobación ha realizado.
Quitando una Sucesión
Quite una sucesión del diccionario de los datos usando la declaración de DROP SEQUENCE
Una vez alejado, la sucesión ya no puede ser los referencias
1. VISTAS
Indicex
Que es un indice
o Es un objeto del esquema
99
DROP SEQUENCE dept_deptid_seq;Sequence dropped.
ALTER SEQUENCE dept_deptid_seq INCREMENT BY 20 MAXVALUE 999999 NOCACHE NOCYCLE;Sequence altered.
o Se usa por el servidor de Oracle para acelerar la recuperación de filas usando un indicador
o Puede reducir el disco I/O usando un método de acceso de camino rápido para localizar los datos rápidamente
o Es independiente de la mesa que pone en un índice o Se usa y mantuvo automáticamente por el servidor de Oracle
¿Cómo los Índices se Crean?
Automáticamente: Un único índice se crea automáticamente cuando usted define una LLAVE PRIMARIA o el ÚNICO constreñimiento en una definición de la mesa. Por mano: Los usuarios pueden crear los índices del nonunique en las columnas acelerar el acceso a las filas.
Creando Indices
Cree un índice encendido o más columnas.
Mejore la velocidad de acceso de la pregunta a la columna de LAST_NAME en la mesa de los EMPLEADOS.
Cuándo Crear un Indices
Usted debe crear un índice si: o Una columna contiene una gama amplia de valores o Una columna contiene un número grande de valores nulos o Uno o más columnas frecuentemente se usan juntos en un DONDE cláusula o un
una la condición o La TABLA es grande y se espera que la mayoría de las preguntas recupere
menos de 2 a 4 por ciento de las filas
Los Índices confirmando
La USER_INDEXES datos diccionario vista contiene el nombre del índice y su singularidad.
100
CREATE INDEX emp_last_name_idxON employees(last_name);Index created.
CREATE INDEX indexON table (column[, column]...);
La vista de USER_IND_COLUMNS contiene el nombre del índice, el nombre de la tabla, y el nombre de la columna.
Los Índices función-basado
o Un índice función-basado es un índice basado en las expresiones. o La expresión del índice se construye de las columnas de la mesa, las constantes,
que SQL funciona, y usuario-definió las funciones.
Quitando un Índice
Quite un índice del diccionario de los datos usando el orden de DROP INDEX
Quite que los UPPER_LAST_NAME_IDX ponen en un índice del diccionario de los datos.
Para dejar caer un índice, usted debe ser el dueño del índice o debe tener un privilegio DROP ANY INDEX .
Los sinónimos
Simplifique el acceso a los objetos creando un sinónimo (otro nombre para un objeto). Con los sinónimos, usted puede: Facilidad que se refiere a una mesa poseída por otro usuario Acorte los nombres del objeto largos
101
CREATE INDEX upper_dept_name_idxON departments(UPPER(department_name));
Index created.
SELECT *FROM departmentsWHERE UPPER(department_name) = 'SALES';
SELECT ic.index_name, ic.column_name,ic.column_position col_pos,ix.uniqueness
FROM user_indexes ix, user_ind_columns icWHERE ic.index_name = ix.index_nameAND ic.table_name = 'EMPLOYEES';
DROP INDEX upper_last_name_idx;Index dropped.
ROP INDEX index;
Creando y Quitando los Sinónimos
Cree un nombre acortado para la vista de DEPT_SUM_VU.
Deje caer un sinónimo.
En resumen
En esta lección, usted debe de haber aprendido cómo a: o Automáticamente genere que la sucesión numera usando un generador de la
sucesión o Vea la información de la sucesión en la USER_SEQUENCES datos diccionario
mesa o Cree los índices para mejorar la velocidad de recuperación de pregunta o La información de índice de vista en la USER_INDEXES diccionario mesa o Use los sinónimos para mantener los nombres alternativos los objetos
102
CREATE [PUBLIC] SYNONYM synonymFOR object;
DROP SYNONYM d_sum;Synonym dropped.
CREATE SYNONYM d_sumFOR dept_sum_vu;Synonym Created.
UNIDAD 11
Creando un vista
¿Por qué Use las Vistas?
Para restringir el acceso de los datos Hacer complejo pregunta fácil Para proporcionar la independencia de los datos Para presentar vistas diferentes de los mismos datos
Creando un avista
Usted empotra un subquery dentro del CREE la declaración de VISTA.
Los subquery pueden contener el complejo la sintaxis SELECTA.
103
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view [(alias[, alias]...)] AS subquery[WITH CHECK OPTION [CONSTRAINT constraint]][WITH READ ONLY [CONSTRAINT constraint]];
Creando un vista
Objetivos
Después de completar esta lección, usted debe ser capaz para hacer a lo siguiente: Describa una vista Cree, altere la definición de, y deje caer una vista Recupere los datos a través de una vista Inserte, ponga al día, y anule la vista de encontrada de datos Cree y use una vista en linea Realice “Cima-N” el análisis
Crea una vista, EMPVU80, que contiene detalles de empleados en departamento 80.
Describa la estructura de la vista usando el iSQL*Plus DESCRIBA el orden.
Cree una vista usando los seudónimos de la columna en el subquery.
Seleccione las columnas alias de esta vista por los dados los nombres.
Los Datos recuperando de una Vista
Modificando una Vista
104
CREATE VIEW salvu50 AS SELECT employee_id ID_NUMBER, last_name NAME, salary*12 ANN_SALARY FROM employees WHERE department_id = 50;View created.
DESCRIBE empvu80
CREATE VIEW empvu80 AS SELECT employee_id, last_name, salary FROM employees WHERE department_id = 80;View created.
SELECT *FROM salvu50;
Modifique los EMPVU80 ven usando CREATE OR REPLACE la cláusula de VIEW. Agregue un alias para cada nombre de la columna.
Los seudónimos de la columna en el CREATE la cláusula de VIEW se lista en el mismo orden como las columnas en el subquery.
Creando una Vista Compleja
Cree una vista compleja que contiene las funciones de grupo para desplegar los valores de dos TABLAS.
Quitando una Vista
Usted puede quitar una vista sin los datos perdedores porque una vista es basada en las TABLAS subyacentes en la base de datos.
Resumen
En esta lección, usted debe de haber aprendido que una vista es derivado de los datos en otras mesas o vistas y proporciona las ventajas siguientes:
105
DROP VIEW view;
CREATE VIEW dept_sum_vu (name, minsal, maxsal, avgsal)AS SELECT d.department_name, MIN(e.salary), AX(e.salary),AVG(e.salary) FROM employees e, departments d WHERE e.department_id = d.department_id GROUP BY d.department_name;View created.
CREATE OR REPLACE VIEW empvu80 (id_number, name, sal, department_id)AS SELECT employee_id, first_name || ' ' || last_name, salary, department_id FROM employees WHERE department_id = 80;View created.
DROP VIEW empvu80;View dropped.
Restringe el acceso de la base de datos Simplifica las preguntas Proporciona la independencia de los datos Proporciona vistas múltiples de los mismos datos Puede dejarse caer sin quitar los datos subyacentes Una vista del inline es un subquery con un alias el nombre. Cima-N análisis que usa subqueries y las preguntas exteriores puede hacerse.
Practica, Aplicación Global
Esta práctica cubre los temas siguientes: Crear una vista simple Crear una vista compleja Crear una vista con constraint ckech Attempting para modificar los datos en la vista Presentar definiciones de vista Eliminar las vistas
UNIDAD 12
106
Usando Operadores De Conjuntos
Objetivos
Después del completar esta lección, usted debería ser capaz de hacer lo siguiente: Describir los operadores de conjuntos Usar un operador para combinarse múltiples queries en un solo queries. Controlar el orden de las filas devueltas.
Usando Operadores De Conjuntos
Las Tablas Usadas En Esta Lección
Las tablas usadas en esta lección son:EMPLOYEES: Proporciona detalles en cuanto a todos los empleados actuales. JOB_HISTORY: Registra los detalles de la fecha de principio y la fecha de final del antiguo cargo, y el número de identificación de trabajo y el departamento cuando un empleado cambia de cargo.
El Operador Unión
El operador UNION retorna resultados de la unión de ambos queries después de eliminar los duplicados.
Usando El Operador Unión
El siguiente ejemplo muestra el detalle del cargo actual e histórico de los empleados. Muestra el empleado solo una vez.
SELECT employee_id, job_idFROM employeesUNIONSELECT employee_id, job_idFROM job_history;
107
El operador unión all
EL operador UNION ALL retorna el resultado de ambos queries incluyendo todos los duplicados.
Usando El Operador Union All
El siguiente ejemplo muestra los departamentos actuales e históricos de todos los empleados.
…
…
SELECT employee_id, job_id, department_idFROM employeesUNION ALLSELECT employee_id, job_id, department_idFROM job_historyORDER BY employee_id;
…
…
108
El Operador Intersect
Usando El Operador Intersect
Muestre el EMPLOYEE_ID del empleados y el JOB_ID del cargo de los empleados que actualmente e históricamente tienen un cargo
El Operador Minus
SELECT employee_id, job_idFROM employeesINTERSECTSELECT employee_id, job_idFROM job_history;
109
Muestre el IDs de aquellos empleados que no han cambiado sus cargos ni una sola vez
Guías Para Los Operadores Conjuntos
Las expresiones en las listas SELECT debe hacer juego con el tipo de datos y el número
Paréntesis puede ser usado para cambiar la secuencia de ejecución. La cláusula ORDER BY:
o Puede aparecer sólo al final de la instruccióno Aceptará el nombre de columna, los alias de la primera instrucción
SELECT, o la notación posicional Los registros duplicados son automáticamente eliminados, excepto cuando se usa UNION ALL. Los nombres de Columna del primer queries aparecen en el
resultado. La salida es ordenada por default en forma ascendente, excepto en UNION, ALL
Correspondencia en la instrucción select
Usando al operador de UNIÓN, muestre el departamento ID, la localidad, la fecha para todos los empleados.
SELECT employee_id,job_idFROM employeesMINUSSELECT employee_id,job_idFROM job_history;
…
SELECT department_id, TO_NUMBER(null) location, hire_dateFROM employeesUNIONSELECT department_id, location_id, TO_DATE(null)FROM departments;
110
Usando al operador de UNIÓN, muestre al empleado ID, el cargo ID, y el sueldo de todos los empleados.
Controlando El Orden De Las Filas
Produzca una frase en inglés que usa a dos operadores de UNIÓN.
…
SELECT employee_id, job_id,salaryFROM employeesUNIONSELECT employee_id, job_id,0FROM job_history;
111
…
Resumen
En esta lección, usted debería haber aprendido: Use UNIÓN para devolver todas las filas distintas Use UNIÓN ALL para devolver todas las filas, incluyendo duplicados. Use INTERSECT para devolver todas las filas comunes en dos tablas. Use MINUS para devolver todas las filas distintas seleccionadas por el primer
query, pero no por el segundo. Use ORDER BY sólo al final de la declaración.
Ejercicio de Aplicación
Creación de tabla
COLUMN a_dummy NOPRINTSELECT 'sing' AS "My dream", 3 a_dummyFROM dualUNIONSELECT 'I''d like to teach', 1FROM dualUNION SELECT 'the world to', 2FROM dualORDER BY 2;
112
create table emi_tempo9(codigo number,mombre varchar2(20),edad number,direccion varchar2(30),telefono1 varchar2(10),telefono2 varchar2(10))
select* from emi_tempo9--para crear una tabla nueva se copian todos los campos que tenga la anterior
create table emi_nuevaas select* from emi_tempo9
select * from emi_nueva
create table emi_cliente1
(nombre varchar2(20),fecha date default sysdate,edad number)
select* from emi_cliente1
El usuario scott va a crear una tabla esto es para referenciar a otro usuario Para acceder a la tabla system porque nosotros trabajamos con scout
select* from system.prb10grant select on prb10 to publictablas del diccionario de datos que las administra el dba
select *from user_tablesEn el comand window es un editor ejecutar multiples sentencias.El comand Windows es un interpretador de sentencias sql es decir yo pongo un omando y lo voy a poder interpretar.
SQL> create table emi_tempo14 2 (codigo number, 3 texto varchar2(5));
Table created
SQL>Aquí ya no se va a poder modificar esta interpretando tal y como es al final debe llevar l punto y coma y si me falta una coma no voy a poder regresar.Esa es la diferencia entre el comand y el sql window porque puedo modificar
Sentencia ALTER TABLE
Con la sentencia alter table Add para añadir una columna a la tabla, Ejm
113
Alter table dept80Modif. (last name varchar(30)Alter table modif. Para modificar una columna
Alter table Set unused(columna); para eliminar la marca no utilizada Drop table para eliminar toda la tabla con sus datos
Para cambiar el nombre de un objetoRename Dep. to detaill_dept; ;
Para liberar espacio de almacenamiento en la tablaTruncate table empeloyees
Create table tempo1(nombre varchar2 (10),edad number,direccion varchar2( 20))
select * from eve_tempo1
alter table eve_tempo1add(telefono number)
para modificar una tablaalter table eve_tempo1modify (telefono varchar2(10))
vamos a eliminar el campo edad y verifico con el mismo select
alter table eve_tempo1drop column edad
select * from eve_tempo1
para cambiar el nombre a una tabla luego ponemos el select pero ya con el select eve_nueva8
rename eve_tempo1 to eve_nueve8select* from eve_nueve8
para añadir comentario
comment on table eve_nueva8is'esta es una tabla temporal'
elimina la tabla fisicamente
drop table eve_nueve8liberar espacio de almacenamiento
114
truncate table eve_nueve8
Constraint
validaciones o restricciones en una tabla puedo tener el constraint
*not null.- la columna va a ser obligatoria y no acepta valores nulos solo se define a nivel de columna no de tablas*unique.- valores unicos no repetidos sobre una tabla
*primary key.- la va a especificar como clave primaria no va atener valores repetidos ni nulos*foreing key.- son valores que vienen de la clave primaria de otra tabla. DEFINO EN
LA TABLA HIJA *check.- validaciones SOBRE LA COLUMNA DE UNA TABLA
NotaEl contrains va a empezar con la palabra sys_conformat un constrains se puede definir a nivel de columna o a nivel de tablasLos creo con la sentencia alter table puedo modificar un constrains not null.Puedo deshabilítalos usando la sentencia alter table nombre de la table y enable contrains puedo habilitarlo. Ejm
create table departamento1(departamento_id number(3) primary key,nombre varchar(10),localidad varchar(10))
select* from departamento1
Voy a tablas en el lado derecho aparece departamento1 clic derecho view y key
ARCHIVO O SCRIPT SQLCREA TABLA
115
create table CL_PERSONAS( ID_PERSONA NUMBER not null, APELLIDO1 VARCHAR2(20), APELLIDO2 VARCHAR2(20),
116
CL_CLASES_PERSONAS (7)
CL_PERSONAS (10)
CL_TIPO_IDENTIFICACIÓN (5)
CL_FORMA_PAGO (4)
CL_CONTRATO (12)
CL_SERVICIOS_CONTRATADOS (13)
CL_DETALLES_SERVICIOS (14)
CL_TIPOS_DETALLES_SERVICIOS (11)
CL_SUBPRODUCTO (9)
CL_UNIDAD (8)
CL_LINEA_SUBPRODUCTO (6)
CL_OFICINAS (3)
CL_LOCALIDAD (2)
CL_PAIS (1)
NOMBRES VARCHAR2(20) not null, NOMBRE_COMPLETO VARCHAR2(60) not null, IDENTIFICACION VARCHAR2(20) not null, TIPO_PERSONA VARCHAR2(1), ESTADO VARCHAR2(1), FECHA_INSCRIPCION DATE, ID_TIPO_IDENTIFICACION VARCHAR2(3) not null, ID_CLASE_PERSONA VARCHAR2(3) not null);
create table CL_TIPO_IDENTIFICACION( ID_TIPO_IDENTIFICACION VARCHAR2(3) not null, DESCRIPCION VARCHAR2(20) not null);
create table CL_CLASES_PERSONAS( ID_CLASE_PERSONA VARCHAR2(3) not null, DESCRIPCION VARCHAR2(60) not null);
create table CL_CONTRATOS( ID_CONTRATO NUMBER(10) not null, FECHA_INICIO DATE not null, FECHA_FIN DATE, ESTADO VARCHAR2(1) not null, ID_PERSONA NUMBER not null, ID_FORMA_PAGO VARCHAR2(3) not null, ID_OFICINA VARCHAR2(3));
ARCHIVO O SCRIPT SQLCREA TABLA
create table CL_SERVICIOS_CONTRATADOS(
117
ID_SERVICIO VARCHAR2(20) not null, FECHA_INICIO DATE not null, FECHA_FIN DATE, ESTADO VARCHAR2(1) not null, OBSERVACION VARCHAR2(2000), FECHA_SOLICITUD DATE, FECHA_INSTALACION DATE, FECHA_APROBACION DATE, ID_SUBPRODUCTO VARCHAR2(20) not null, ID_CONTRATO NUMBER(10) not null, REFERENCIA_1 VARCHAR2(20), REFERENCIA_2 VARCHAR2(20), REFERENCIA_3 VARCHAR2(20));
create table CL_DETALLES_SERVICIOS( ID_SERVICIO VARCHAR2(20) not null, ID_CONTRATO NUMBER(10) not null, FECHA_DESDE DATE not null, FECHA_HASTA DATE, ESTADO VARCHAR2(1) not null, ID_SUBPRODUCTO VARCHAR2(20) not null, CANTIDAD_CONTRATADA NUMBER, CANTIDAD_MAX NUMBER, ID_TIPO_DETALLE_SERV VARCHAR2(10) not null, OBSERVACION VARCHAR2(240), VALOR VARCHAR2(100), COSTO_SERVICIO NUMBER);
create table CL_TIPOS_DETALLES_SERVICIOS( ID_TIPO_DETALLE_SERV VARCHAR2(10) not null, DESCRIPCION VARCHAR2(60) not null, OBLIGATORIO VARCHAR2(1), ESTADO VARCHAR2(1) not null, VALOR_OMISION VARCHAR2(100), VALOR_MAXIMO VARCHAR2(100), VALOR_MINIMO VARCHAR2(100), ID_UNIDAD VARCHAR2(3) not null);
ARCHIVO O SCRIPT SQLCREA TABLA
create table CL_UNIDAD(
118
ID_UNIDAD VARCHAR2(3) not null, DESCRIPCION VARCHAR2(60) not null);
create table CL_SUBPRODUCTO( ID_SUBPRODUCTO VARCHAR2(20) not null, DESCRIPCION VARCHAR2(60) not null, ID_LINEA_SUBPRODUCTO VARCHAR2(20) not null);
create table CL_LINEA_SUBPRODUCTO( ID_LINEA_SUBPRODUCTO VARCHAR2(20) not null, DESCRIPCION VARCHAR2(60) not null);
create table CL_OFICINAS( ID_OFICINA VARCHAR2(3) not null, DESCRIPCION VARCHAR2(60) not null, ID_LOCALIDAD VARCHAR2(20) not null);
create table CL_FORMA_PAGO( ID_FORMA_PAGO VARCHAR2(3) not null, DESCRIPCION VARCHAR2(60) not null);
create table CL_LOCALIDAD( ID_LOCALIDAD VARCHAR2(20) not null, DESCRIPCION VARCHAR2(60) not null, ID_PAIS VARCHAR2(20) not null, DESC_REGION VARCHAR2(10) not null);
create table CL_PAIS( ID_PAIS VARCHAR2(20) not null, DESCRIPCION VARCHAR2(60) not null);
ARCHIVO O SCRIPT SQLCREA CLAVE PRIMARIA
alter table CL_PERSONAS add constraint PER_PK primary key (ID_PERSONA);
119
alter table CL_TIPO_IDENTIFICACION add constraint TIPO_IDENT_PK primary key (ID_TIPO_IDENTIFICACION);
alter table CL_CLASES_PERSONAS add constraint CLAS_PK primary key (ID_CLASE_PERSONA);
alter table CL_CONTRATOS add constraint CONTR_PK primary key (ID_CONTRATO);
alter table CL_SERVICIOS_CONTRATADOS add constraint SER_CON_PK primary key (ID_SERVICIO,FECHA_INICIO,ID_CONTRATO,ID_SUBPRODUCTO);
alter table CL_DETALLES_SERVICIOS add constraint DET_SER_PK primary key (ID_SERVICIO,ID_CONTRATO,ID_SUBPRODUCTO,FECHA_DESDE,ID_TIPO_DETALLE_SERV);
alter table CL_TIPOS_DETALLES_SERVICIOS add constraint T_DET_SE_PK primary key (ID_TIPO_DETALLE_SERV);
alter table CL_UNIDAD add constraint UNI_PK primary key (ID_UNIDAD);
alter table CL_SUBPRODUCTO add constraint SUB_PK primary key (ID_SUBPRODUCTO);
alter table CL_LINEA_SUBPRODUCTO add constraint L_SUB_PK primary key (ID_LINEA_SUBPRODUCTO);
alter table CL_OFICINAS add constraint OFI_PK primary key (ID_OFICINA);
alter table CL_FORMA_PAGO add constraint F_PAGO_PK primary key (ID_FORMA_PAGO);
alter table CL_LOCALIDAD add constraint LOCAL_PK primary key (ID_LOCALIDAD);
alter table CL_PAIS add constraint PAIS_PK primary key (ID_PAIS);
ARCHIVO O SCRIPT SQLCREA CLAVE FORANEA
alter table CL_PERSONAS add constraint PER_CLA_PER_1_FK foreign key (ID_CLASE_PERSONA)
120
references CL_CLASES_PERSONAS (ID_CLASE_PERSONA);alter table CL_PERSONAS add constraint PER_TIPO_IDE_1_FK foreign key (ID_TIPO_IDENTIFICACION) references CL_TIPO_IDENTIFICACION (ID_TIPO_IDENTIFICACION);alter table CL_PERSONAS add constraint AVCON_31744_TIPO__000 check (TIPO_PERSONA IN ('N', 'J'));
alter table CL_CONTRATOS add constraint CONTR_PER_1_FK foreign key (ID_PERSONA) references CL_PERSONAS (ID_PERSONA);alter table CL_CONTRATOS add constraint CONTR_FP_1_FK foreign key (ID_FORMA_PAGO) references CL_FORMA_PAGO (ID_FORMA_PAGO);alter table CL_CONTRATOS add constraint CON_OFI_FK foreign key (ID_OFICINA) references CL_OFICINAS (ID_OFICINA);alter table CL_CONTRATOS add constraint AVCON_31760_ESTAD_000 check (ESTADO IN ('A', 'I', 'P'));
alter table CL_SERVICIOS_CONTRATADOS add constraint SER_CON_1_CONTR_1_FK foreign key (ID_CONTRATO) references CL_CONTRATOS (ID_CONTRATO);alter table CL_SERVICIOS_CONTRATADOS add constraint SER_CON_SBPROD_FK foreign key (ID_SUBPRODUCTO) references CL_SUBPRODUCTO (ID_SUBPRODUCTO);alter table CL_SERVICIOS_CONTRATADOS add constraint AVCON_31756_ESTAD_000 check (ESTADO IN ('I', 'A', 'S', 'C', 'P'));
alter table CL_DETALLES_SERVICIOS add constraint DET_SER_TIP_DET_FK foreign key (ID_TIPO_DETALLE_SERV) references CL_TIPOS_DETALLES_SERVICIOS (ID_TIPO_DETALLE_SERV);
alter table CL_TIPOS_DETALLES_SERVICIOS add constraint T_DET_SE_UNIDAD_FK foreign key (ID_UNIDAD) references CL_UNIDAD (ID_UNIDAD);
alter table CL_TIPOS_DETALLES_SERVICIOS add constraint AVCON_34408_ESTAD_000 check (ESTADO IN ('A', 'I'));alter table CL_TIPOS_DETALLES_SERVICIOS add constraint AVCON_34408_OBLIG_000 check (OBLIGATORIO IN ('S', 'N'));
alter table CL_SUBPRODUCTO add constraint SUB_L_SUB_FK foreign key (ID_LINEA_SUBPRODUCTO) references CL_LINEA_SUBPRODUCTO (ID_LINEA_SUBPRODUCTO);
121
alter table CL_OFICINAS add constraint OFI_LOC_FK foreign key (ID_LOCALIDAD) references CL_LOCALIDAD (ID_LOCALIDAD);
alter table CL_LOCALIDAD add constraint LOC_PAIS_FK foreign key (ID_PAIS) references CL_PAIS (ID_PAIS); alter table CL_LOCALIDAD add constraint AVCON_34408_DREG_000 check (DESC_REGION IN ('COSTA','SIERRA','ORIENTE','INSULAR'));
ARCHIVO O SCRIPT SQLELIMINA TABLA
drop table CL_PERSONAS;
drop table CL_TIPO_IDENTIFICACION;
drop table CL_CLASES_PERSONAS;
drop table CL_CONTRATOS;
drop table CL_SERVICIOS_CONTRATADOS;
drop table CL_DETALLES_SERVICIOS;
drop table CL_TIPOS_DETALLES_SERVICIOS;
drop table CL_UNIDAD;
drop table CL_SUBPRODUCTO;
drop table CL_LINEA_SUBPRODUCTO;
drop table CL_OFICINAS;
drop table CL_FORMA_PAGO;
drop table CL_LOCALIDAD;
drop table CL_PAIS;
ARCHIVO O SCRIPT SQLELIMINA CLAVE PRIMARIA
alter table CL_PERSONAS drop constraint PER_PK;
122
alter table CL_TIPO_IDENTIFICACION drop constraint TIPO_IDENT_PK;
alter table CL_CLASES_PERSONAS drop constraint CLAS_PK;
alter table CL_CONTRATOS drop constraint CONTR_PK;
alter table CL_SERVICIOS_CONTRATADOS drop constraint SER_CON_PK;
alter table CL_DETALLES_SERVICIOS drop constraint DET_SER_PK;
alter table CL_TIPOS_DETALLES_SERVICIOS drop constraint T_DET_SE_PK;
alter table CL_UNIDAD drop constraint UNI_PK;
alter table CL_SUBPRODUCTO drop constraint SUB_PK;
alter table CL_LINEA_SUBPRODUCTO drop constraint L_SUB_PK;
alter table CL_OFICINAS drop constraint OFI_PK;
alter table CL_FORMA_PAGO drop constraint F_PAGO_PK;
alter table CL_LOCALIDAD drop constraint LOCAL_PK;
alter table CL_PAIS drop constraint PAIS_PK;
ARCHIVO O SCRIPT SQLELIMINA CLAVE FORANEA
123
alter table CL_PERSONAS drop constraint PER_CLA_PER_1_FK;alter table CL_PERSONAS drop constraint PER_TIPO_IDE_1_FK;alter table CL_PERSONAS drop constraint AVCON_31744_TIPO__000;
alter table CL_CONTRATOS drop constraint CONTR_PER_1_FK;alter table CL_CONTRATOS drop constraint CONTR_FP_1_FK;alter table CL_CONTRATOS drop constraint CON_OFI_FK;alter table CL_CONTRATOS drop constraint AVCON_31760_ESTAD_000;
alter table CL_SERVICIOS_CONTRATADOS drop constraint SER_CON_1_CONTR_1_FK;alter table CL_SERVICIOS_CONTRATADOS drop constraint SER_CON_SBPROD_FK;alter table CL_SERVICIOS_CONTRATADOS drop constraint AVCON_31756_ESTAD_000;
alter table CL_DETALLES_SERVICIOS drop constraint DET_SER_TIP_DET_FK;
alter table CL_TIPOS_DETALLES_SERVICIOS drop constraint T_DET_SE_UNIDAD_FK;alter table CL_TIPOS_DETALLES_SERVICIOS drop constraint AVCON_34408_ESTAD_000;alter table CL_TIPOS_DETALLES_SERVICIOS drop constraint AVCON_34408_OBLIG_000;
alter table CL_SUBPRODUCTO drop constraint SUB_L_SUB_FK;
alter table CL_OFICINAS drop constraint OFI_LOC_FK;
alter table CL_LOCALIDAD drop constraint LOC_PAIS_FK;alter table CL_LOCALIDAD drop constraint AVCON_34408_DREG_000;
ARCHIVO O SCRIPT SQLLLAMA A LOS ARCHIVOS Q CREA TABLA
124
start c:\TEMPORAL\examen_tab.sql;start c:\TEMPORAL\examen_pk.sql;start c:\TEMPORAL\examen_fk.sql;
ARCHIVO O SCRIPT SQLLLAMA A LOS ARCHIVOS Q ELIMINA TABLA
start c:\TEMPORAL\elimina_fk;start c:\TEMPORAL\elimina_pk;start c:\TEMPORAL\elimina_tab;
Para insertar datos por medio de Excel
1.- Hacemos un select * from tcr_job
2.- Luego hacemos select * from tcr_job for update
3.- hacemos clic en edit date (candado)
4.- Lo seleccionamos con un columna mas de la izquierda y pegamos lo que deseamos
5.- Hacemos clic en post cahnge (visto bueno)
6.- Cerramos el edit date (candado)
7.- Damos un comimnt (F10)
9.- Por ultimo hacemos de nuevo un select * from tcr_job
Sino inserta todo
1.- Damos clic en rollback (Shift + 10)
2.- Sale un mensaje “ Rollback current transaccion”, damos en si
3.- Hacemos un seleect * fram tcr_jab
4.- Sale un mensaje “ Post changad records to the database” , damos clic en no
Sentencia DML
125
Sentencias dml de manipulación de datos se pueden insertar eliminar filas y la sentencia each modificar o eliminar filas de la tabla
insert into departaments(department_id,department_name,manager_id,location)Para modificar una clausula
update employeessety department_id=70where employee_id=113;
Sino pongo el where va a ctualzar todos los registros de la tabla
select * from customer
Mostrar los distintos departamentos que tiene los empleados los distintos departamento que tienen los empleados
select department_id from employee
No muestra departamentos repetidos
select distinct department_id from employee
Mostrar las ordenes de venta que hayan generado mas de 350 totales que sean del año 1991
select *from sales_orderselect *from sales_order awhere a.total>350and a.order_date > to_date('01/01/1991','dd/mm/yyyy')and a.order_date <= to_date('31/12/1991','dd/mm/yyyy')
otra formaselect *from sales_order awhere a.total>350and to_char(a.order_date,'yyyy')='1991'
Insertar nuevo empleado SI HABIA 32 AHORA VAN A SER 33
select * from employeeinsert into employeevalues(8000,'PEREZ','JUAN','X',671,7839,SYSDATE,4000,200,43)
Eliminar un cliente
126
select * from customer
delete customer where customer_id=201
Cuales son los distintos clientes que no tienen orden
select distinct customer_id from sales_order
Mostrar el nombre de los clientes y el nombre de sus vendedores de aquellos clientes cuyo limite de crédito sea superior a 3000 y que los vendedores sean del departamento de ventas de las regiones de chicago y boston
select * from customer a, employee b, department c, location dwhere a.salesperson_id = b.employee_idand b.department_id = c.department_idand c.location_id = d.location_idand a.credit_limit>3000and c.name = 'SALES'and d.regional_group in ('CHICAGO','BOSTON')
Mostrar los nombres de aquellos productos ordenados en el año 1990
select distinct(x.description)from product x, item y, sales_order zwhere x.product_id = y.product_idand y.order_id = z.order_idand to_char(z.order_date,'yyyy')='1990'
Actualizar (incrementar ) el salario de los empleados en un 10% de aquellos empleados que tengan igual comision que el empleado "LANGE "
update employeeset salary = salary * 1.1where commission =(select commission from employee where last_name = ('LANGE'))
select * from employee where commission =300select commission from employee where last_name in ('LANGE')
Mostar lo siguiente::el empleado xxx tiene como jefe a yyy
select 'el empleado : '|| B.last_name|| ' tiene como jefe a: ' ||A.last_namefrom employee A,employee Bwhere A.employee_id = B.manager_id
Mostrar lo siguiente:el salario del empleado xxx esta en nivel y
127
select 'el salario del empleado : ' || a.last_name||' esta en nivel : ' ||n.grade_idfrom employee a, salary_grade nwhere a.salary between n.lower_bound and n.upper_bound
Ejercicio de single row-function
mostrar concatenado el nombre del cliente y su estado, la posicion de la letra e en la ciudad del cliente, el limite de credito rellanado con el # a al derecha hasta 20 caracteres, solo de aquellos clientes cuya longitud de su direccion sea menor a 12 y la ciudad tenga la s letras "ur" desde la posicion 2 (dos caracteres)
select concat (t.name, t.state), instr (t.city,'e'), t.city,rpad (t.credit_limit,20,'#')from customer twhere length (t.address)<=13and lower(substr (t.city,2,2))='ur'
funciones de redondeo
select round(1367.35829,3)from dual
select round(1367.35829,0)from dual
select round(1367.35829,-1)from dual
128
select round(1367.35829,-2)from dual
select round(1367.35829,-3)from dual
funciones de truncamiento
select trunc(1367.35829,4)from dual
select trunc(1367.35829,2)from dual
select trunc(1367.35829,1)from dual
129
select trunc(1367.35829,0)from dual
select trunc(1367.35829,-1)from dual
select trunc(1367.35829,-2)from dual
select trunc(1367.35829,-3)from dual
funcion fecha
select sysdate,
130
sysdate-to_date('04-03-2006','dd/mm/yyyy')from dual
select sysdate,add_months(sysdate,5)from dual
select sysdate, trunc (sysdate),add_months(sysdate,5)from dual
select sysdate,sysdate-to_date('01-04-2006','dd/mm/yyyy')from dual
select sysdate,sysdate - to_date('01/03/2006','dd/mm/yyyy')from dual
para tuncar la fecha
select sysdate,
131
trunc (sysdate) - to_date('01/03/2006','dd/mm/yyyy')from dual
displayar la fecha en otro formato
select to_char('01/01/2008', 'dd/mm/yyyy hh24:mi:ss')from dual
no me salio
tabla empleado
select last_name, salary, nvl (to_char (commission),'null')--para que se visualice los valores nulos con cerofrom employee
select last_name,salary,nvl(to_char(commission),'nulo')from employee
select name, state, decode(state, 'ca', 'california','mn', 'manhatan')from customer
132
funciones de grupo
mostrar el salario promedio de los empleados cuya comision sea mayor a 500
select avg (salary)from employeewhere commission > 500
mostrar el valor max de las ordenes de ventas generadas
select max(total)from sales_order
suma total de las ordenes de ventas
select sum(total)from sales_order
133
funciones de grupo
mostrar la cantidad de empleados agrupados por cargo
select a.job_id, b.function, count(a.employee_id)--ver el cargo y cuantos empleados tiene el cargofrom employee a, job bwhere a.job_id = b.job_id--mostrar la funcion del cargogroup by a.job_id, b.function--con la función se puede mostrar el nombre y el job para la descripción de los empleados--having es para restringir los resultados de los grupos y va de la mano con el group by
mostrar agrupado por producto la suma total de sus ordenes de venta y ver el producto que mas se a vendido
select x.product_id,sum (x.total)from item xgroup by x.product_id
--hacemos un where que hace las comparaciones entre la 2 --tablas muestra tambien el nombre de los productos select x.product_id, z.description, sum(x.total)from item x, product zwhere x.product_id = z.product_idgroup by x.product_id, z.description
134
Mostrar la cantidad de empleados que han ingresado a la empresa a partir del año 1985 agrupado por cargo, solo de aquellos departamentos cuya suma de salarios sean mayor a 3000--tabla empleado estan cargos,salarios,departamentosselect * from employee --luego cuantos empleados hay a partir de año 1985select * from employee fwhere to_char(f.hire_date,'yyyy')>'1985'
--agrupo por cargoselect e.job_id, count(e.employee_id)from employee ewhere to_char(e.hire_date, 'yyyy') > '1985'group by e.job_id
de aquellos departamentos cuya suma de salarios sean mayor a 3000
select e.job_id, count(e.department_id), sum(salary)from employee ewhere to_char(e.hire_date, 'yyyy') > '1985'group by e.job_id, e.department_idhaving sum(salary) > 3000
135
sub-queries
mostrar el nombre de los clientes y su límite de crédito + 100 de aquellos clientes que tengan la misma ciudad del cliente vollyrite
select * from customer
--vemos la ciudad del cliente vollyrite
select cityfrom customer where name = 'vollyrite' –el dato a visualizar debe escribirse igual
--unimos la ciudad con el crédito
select name, credit_limit +100from customerwhere city = (select city from customer where name = 'vollyrite')
mostrar el nombre de los empleados y su salario solo de aquellos empleados cuyo departamento tenga la misma localidad del departamento de contabilidad (accounting)
select * from department--vemos la localidad del departamento accountingselect location_idfrom department xwhere x.name = 'accounting'
--unimos el departamento para saber el nombre del deprtamento
136
select r.namefrom department rwhere r.location_id = (select location_id from department x where x.name = 'accounting')
--tengan la misma localidadselect a.last_name, a.salaryfrom employee awhere a.department_id in(select r.department_id from department r where r.location_id=(select location_id from department y where y.name = 'accounting'))
mostrar cuantos productos han sido ordenados, agrupados por años solo de aquellos cuyas cantidades sean mayores que las ordenadas por el producto ace tennis net
select * from item
select to_char (f.order_date, 'yyyy'), count(s.quantity) from item s, sales_order fwhere s.order_id = f.order_id/*and s.quantity > all(select l.quantity from item l, product k where l.product_id = k.product_id and k.description = 'ace tennis net')*/group by to_char (f.order_date, 'yyyy')
137
select to_char (f.order_date, 'yyyy'), count(s.quantity) from item s, sales_order fwhere s.order_id = f.order_idand s.quantity > all(select l.quantity from item l, product k where l.product_id = k.product_id and k.description = 'ace tennis net')group by to_char (f.order_date, 'yyyy')--esto muestra los valores de 19990 con 9 y 1991 con 18
creating view
create view clientes_tmpas select s.name , s.addressfrom customer swhere s.credit_limit > 1000 select * from clientes_tmp
crear una vista que contenga nombre, la comision y el doble del salario de los empleados que comision mayor a 800
create view empleaas select f.last_name, f.commission, f.salary*2 salaryfrom employee fwhere f.commission > 800
select * from emplea
138
or replace se puede mosificar una lista ya creada
create or replace view empleaas select f.first_name ||''||f.last_name nombres, f.commission comision, f.salary*12 salariofrom employee fwhere f.commission > 800
select * from emplea
actualiza la vista.- son rpresentaciones logicas que dependen de los datos y las tablas
update emplea set comision = 5
139
select * from emplea
select * from employee where commission = 5
para eliminar un avista
drop view emplea
select * from emplea´
uso de operadores de conjuntos
create table empleado_tmpas select * from employee where commission <1000
select * from empleado_tmp
create table empleado_tmp2as select * from employee where commission <400
select * from empleado_tmp2
140
Elimina tabla empleado_tmp2
drop table empleado_tmp2select * from empleado_tmp2
union si elimina los duplicados (11 registros)
select last_name, salary from empleado_tmpunionselect last_name, salary from empleado_tmp2
union all no elina duplicados (20 registros)
select last_name, salary from empleado_tmpunion allselect last_name, salary from empleado_tmp2
intersect los repetidos en tre los dos (9 registros)
select last_name, salary from empleado_tmpintersectselect last_name, salary from empleado_tmp2
141
minus es todo lo que a pero no b(2 registros)
select last_name, salary from empleado_tmpminusselect last_name, salary from empleado_tmp2
Otros objetos de base de datoscreate table personal( numero number, nombre varchar2 (20))
select * from personal
secuencia que empiece en uno y que incremente de uno en uno
create sequence seq_personalincrement by 1start with 1maxvalue 999nocachenocycle
insert into personal values (seq_personal.nextval, 'maria')
select * from personal
142
--sigo ingresando mas datos
para ver cuantos registros hay
select seq_personal.currval from dual
alter sequence seq_personalincrement by 20maxvalue 999nocachenocycle
creacion de indices
select * from employee twhere t.employee_id = 1898 --esta consulta va ser rapida
143
select * from employee rwhere r.last_name = 'king' --esta consulta va ser mas lenta
crea el indice para mejorar el preforma de los query
create index empleado_idxon employee(last_name)
select * from employee rwhere r.last_name = 'king'
los sinonimos.- simplifican el acceso del objeto sin ecesidad de anteponer el nombre del usuario el cual tenga los datos necesarios.
ejemplo del sinonimo.
select * from profesor.prueba_sin
select * from prueba_sin--porq ya esta creado el sinimo
para dar permiso y poder acceder a
grant select on prueba_sin to public--una tabla para todosgrant select on prueba_sin to s6j_ava--una tabla una sola psrsona
para evitar poner el nombre sel propietario de la tabla se debe poner
un sinonimo comocreate public synonym prueba_sinfor profesor.prueba_sin
eliminar el sinonimo ya creadodrop synonym prueba_sin
144
UNIDAD 13
Código Almacenado
Objetivos
Los principales objetivos de este capítulo son:• Realizar una breve revisión sobre las definiciones de paquetes, funciones y
procedimientos.• Definir cuando son más recomendables el uso de uno u otro.• Establecer la diferencia entre el código almacenado en la base y el código local
para una aplicación.• El uso de instrucciones DDL sobre código almacenado.• Especificar las maneras de ejecutar código almacenado desde SQL Plus.• Establecer restricciones al usar funciones.
Procedimientos y Funciones
• También son conocidos con el nombre de subprogramas.• Ambos pueden devolver más de un valor a través de parámetros con modo
OUT.• Ambos pueden tener secciones declarativa, ejecutable y de tratamiento de
excepciones.• Ambos aceptan valores predeterminados.• Se crean mediante la instrucción CREATE.
Creación de un Procedimiento
• Un procedimiento es un bloque PL/SQL con una sección declarativa, una sección ejecutable y una sección de tratamiento de excepciones.
• Únicamente la sección ejecutable es necesaria.• Se crean mediante la instrucción CREATE OR REPLACE PROCEDURE.• Cuando se crea un procedimiento, primero se compila y luego se almacena en la
B/D en formato compilado.• Un procedimiento puede ejecutarse desde cualquier otro bloque PL/SQL.
Sintaxis de un Procedimiento
CREATE [OR REPLACE] PROCEDURE nombre_procedimiento [(parámetro_1 [IN | OUT | IN OUT] tipo_dato, ………
parámetro_n [IN | OUT | IN OUT] tipo_dato) ] IS | ASCuerpo_procedimiento
145
Ejemplo de un Procedimiento
CREATE OR REPLACE PROCEDURE inserta_cliente(id_cliente NUMBER, nombre VARCHAR2, telefono
VARCHAR2) ASBEGIN
INSERT INTO CLIENTE VALUES (id_cliente, nombre, telefono);COMMIT;
END inserta_cliente;
Creación de una Función
• Una función es muy parecida a un procedimiento.• Ambos aceptan parámetros que pueden ser de cualquiera de los modos
existentes.• Ambos son bloques PL/SQL, con secciones declarativa, ejecutable y de
tratamiento de excepciones.• Una llamada a una función se produce como parte de una expresión.
Sintaxis de una Función
CREATE [OR REPLACE] FUNCTION nombre_función [(parámetro_1 [IN | OUT | IN OUT] tipo_dato, ………
parámetro_n [IN | OUT | IN OUT] tipo_dato) ] RETURN tipo_dato_retorno IS | ASCuerpo_función
Ejemplo de una Función
CREATE OR REPLACE FUNCTION get_telefono(id_cliente NUMBER) RETURN VARCHAR2 IS
telef VARCHAR2(9);
BEGIN
SELECT num_telefonoINTO telefFROM CLIENTEWHERE codigo_cliente = id_cliente;
RETURN (telef);
END get_telefono;
146
Eliminación de Procedimientos y Funciones
• Los procedimientos y funciones pueden eliminarse mediante la instrucción DROP.
• La sintaxis para eliminar un procedimiento es:DROP PROCEDURE nombre_procedimiento;
• Y la sintaxis para eliminar una función es: DROP FUNCTION nombre_función;
Creación de un Paquete
• Un paquete es una estructura PL/SQL que permite almacenar juntos varios objetos relacionados.
• Un paquete tiene 2 partes separadas: la especificación y el cuerpo.• Ambas partes se almacenan de manera independiente en la Base de Datos.• Cualquier código que pueda incluirse en la parte declarativa de un bloque puede
incluirse en un paquete, incluidos procedimientos, funciones, cursores, tipos y variables.
Sintaxis de un Paquete
CREATE [OR REPLACE] PACKAGE nombre_paquete IS | AS declaración_variables | excepciones | cursores especificación_funciones | procedimientos …………………END [nombre_paquete];
CREATE [OR REPLACE] PACKAGE BODY nombre_paquete IS | AS definición_funciones | procedimientos | bloque_PL/SQLEND [nombre_paquete];
Ejemplo de un Paquete
CREATE OR REPLACE PACKAGE clientes IStelef VARCHAR2(9);
PROCEDURE inserta_cliente (id_cliente NUMBER, nombre VARCHAR2, telefono VARCHAR2) ;FUNCTION get_telefono (id_cliente NUMBER) RETURN VARCHAR2;
END clientes;
CREATE OR REPLACE PACKAGE BODY clientes IS PROCEDURE inserta_cliente (id_cliente NUMBER,nombre VARCHAR2, telefono VARCHAR2) AS
147
BEGIN.......
END inserta_cliente;
FUNCTION get_telefono (id_cliente NUMBER)RETURNVARCHAR2 AS
BEGIN.......
END get_telefono;END clientes;
Subprogramas almacenados frente a subprogramas locales
Subprogramas almacenados Subprogramas localesEl subprograma almacenado se guarda en
código compilado en la Base de Datos. Cuando se produce una llamada al procedimiento, éste
no tiene que compilarse de nuevo.
El subprograma local se compila como parte del bloque que lo contiene. Si el
bloque se ejecuta varias veces, el subprograma tiene que compilarse
cada vez.Los subprogramas almacenados pueden
llamarse desde cualquier bloque ejecutado por un usuario que tenga privilegios de ejecución
(EXECUTE) sobre el subprograma.
Un subprograma local puede llamarse únicamente desde el bloque que lo
contiene.
Manteniendo el código del subprograma separado del bloque que realiza la llamada, el bloque que realiza la llamada es más corto y
fácil de entender.
El subprograma y el bloque que produce la llamada no están separados,
lo que puede inducir a la confusión.
Los subprogramas almacenados independiente no pueden sobrecargarse, pero los
empaquetados sí, dentro del mismo paquete.
Los subprogramas locales pueden sobrecargarse dentro del mismo
bloque.
DDL sobre código almacenado
• Al contrario de las instrucciones DML, las instrucciones DDL no están permitidas directamente en una aplicación PL/SQL.
• SQL dinámico permite la ejecución de instrucciones DDL desde PL/SQL.• Por ejemplo, se podría utilizar SQL dinámico para ejecutar las instrucciones
CREATE TABLE, ALTER TABLE o DROP TABLE desde una aplicación PL/SQL.
• Con SQL dinámico, la instrucción SQL se crea dinámicamente en tiempo de ejecución, luego se analiza y se ejecuta.
Ejecución de instrucciones DDL mediante SQL Dinámico
Existen 2 métodos distintos para ejecutar SQL dinámico utilizando PL/SQL.
• Mediante el paquete DBMS_SQL.
• Mediante SQL dinámico nativo.Uso del paquete DBMS_SQL para ejecutar instrucciones DDL
148
La ejecución de instrucciones DDL mediante el uso del paquete DBMS_SQL involucra los siguientes pasos:
1. Abrir el cursor (OPEN_CURSOR).2. Colocar la instrucción SQL o el bloque PL/SQL en una cadena.3. Analizar la cadena utilizando DBMS_SQL.PARSE.4. Ejecutar la instrucción con DBMS_SQL.EXECUTE.5. Cerrar el cursor (CLOSE_CURSOR).
Ejecutando instrucciones DDL mediante el paquete DBMS_SQL
CREATE OR REPLACE PROCEDURE elimina_tabla(tabla VARCHAR2) AS
v_cursor NUMBER;v_dropString VARCHAR2(100);
BEGIN
v_cursor := DBMS_SQL.OPEN_CURSOR; v_dropString := 'DROP TABLE ' || tabla ; DBMS_SQL.PARSE
(v_cursor,v_dropString,DBMS_SQL.NATIVE); DBMS_SQL.CLOSE_CURSOR (v_cursor);
END elimina_tabla;
Uso de SQL dinámico nativo para ejecutar instrucciones DDL
• Como ocurre con DBMS_SQL, la instrucción SQL o el bloque PL/SQL que se ejecute con SQL dinámico nativo, debe colocarse primero en una cadena.
• El SQL dinámico nativo gestiona el cursor automáticamente utilizando la instrucción EXECUTE IMMEDIATE.
• Como los cursores se gestionan automáticamente, no es necesario abrirlos y cerrarlos explícitamente.
Ejecutando instrucciones DDL mediante el SQL dinámico nativo
CREATE OR REPLACE PROCEDURE elimina_tabla(tabla VARCHAR2) AS
v_dropString VARCHAR2(100);
BEGIN v_dropString := 'DROP TABLE ' || tabla ; EXECUTE IMMEDIATE v_dropString;
END elimina_tabla;Ejecución de código almacenado desde SQL Plus
149
• SQL Plus proporciona una sintaxis abreviada para ejecutar un subprograma almacenado: la orden EXECUTE.
• EXECUTE recibe los argumentos, coloca BEGIN antes de los mismos y colocar END; al final.
• También se puede llamar a un subprograma o paquete desde un bloque PL/SQL, osea con un BEGIN y un END al final.
• Tras esta operación, el bloque resultante se envía a la Base de datos.
Ejecutando código almacenado desde SQL Plus
SQL> EXECUTE inserta_cliente (110, ‘Mario Cruz’, ‘094225864’);Procedimiento PL/SQL terminado correctamente.
O también:
SQL> BEGIN 2 inserta_cliente (110,’Mario Cruz’,’094225864’); 3 END; 4 /Procedimiento PL/SQL terminado correctamente.
Restricciones de accesos a funciones desde una expresión SQL
Para acceder mediante una expresión SQL a una función definida por el usuario debe: • Ser una función almacenada.• El envío de parámetros a la función debe ser por el método posicional.• Aceptar como parámetros solo tipos de datos SQL válidos, no tipos PL/SQL.• Los parámetros deben ser solamente de tipo IN.• Retornar tipos de datos SQL válidos, no tipos PL/SQL.• Si se está ejecutando una instrucción DML sobre una tabla, la función no debe
contener instrucciones DML o realizar consultas sobre la misma tabla.
150
Ejecicio de aplicacion
pl/sql (procedimiento)
creo una tabla aparte para crear un procedimiento
create table pro_gre(codigo number,nombre varchar2(30),apellido varchar2(30),telefono varchar2(10))
select * from pro_gre
A partir de aqui creo una tabla aparte para crear un procedimiento en otro sql window
create or replace procedure inserta_pro(ar_codigo number, ar_nombre varchar2, ar_apellido varchar2, ar_telefono varchar2) as begin insert into pro_gre values (ar_codigo, ar_nombre, ar_apellido, ar_telefono);
commit;
end;
151
Nota.- En la opción procedimiento se verifica si esta bien el procedimiento, si tiene un visto es por que tiene errores, los procedimientos se lo ejecuta en una ventana sql Windows nueva y se lo ejecuta con F8
create or replace procedure elimina_pro(ar_nombre varchar2) as
begin
delete from pro_grewhere nombre = ar_nombre;
commit;
end;
--para insertar
sql> execute inserta_pro(1, 'ana', 'lopez', '2343454');
pl/sql procedure successfully completed
sql> select * from pro_gre;
codigo nombre apellido telefono ---------- ------------------------------ ------------------------------ ---------- 1 ana lopez 2343454
sql> execute inserta_pro(2, 'jorge', 'alban', '2547896');
pl/sql procedure successfully completed
sql> select * from pro_gre;
codigo nombre apellido telefono ---------- ------------------------------ ------------------------------ ---------- 1 ana lopez 2343454
152
Nota.- cada procedimiento se lo realiza por separado
2 jorge alban 2547896 --para eliminar
sql> execute elimina_pro('ana');pl/sql procedure successfully completed
sql> select * from pro_gre;
codigo nombre apellido telefono ---------- ------------------------------ ------------------------------ ---------- 2 jorge alban 2547896
ejercicio con procedimiento
1.- crear una tabla de automoviles (max 5 campos), definir su pk. y crear una secuencia que incremente de 1 en 1.(a ser utilizada por la pk)
create table autos_gre1( codigo number, marcar varchar2(30), modelo varchar2(30), valor number, estado varchar2(1))select * from autos_gre1
--crea secuenciacreate sequence seq_autincrement by 1start with 1maxvalue 9999nocyclenocache
2.- crear un procedimiento que inserte un nuevo automovil los datos del mismo los recibe como parametros.
create or replace procedure inserta_aut( p_marca varchar2, p_modelo varchar2, p_valor number, p_estado varchar2)asbegininsert into autos_gre1values (seq_aut.nextval, p_marca, p_modelo, p_valor, p_estado);commit;end;
153
3.- crear un procedimiento que elimine un automovil, el codigo a eliminar lo recibe como parametro
create procedure elimina_aut( p_codigo number)as
begin
delete from autos_gre1where codigo = p_codigo;
commit;
end;
154
sql> execute inserta_aut(1, 'toyota', '13000', 'a');
pl/sql procedure successfully completed
sql> select * from autos_gre1;
codigo marcar modelo valor estado---------- -------------------------- ---------- ------ 3 1 toyota 13000 a
sql> execute inserta_aut(1, 'nissan', '13000', 'a');
pl/sql procedure successfully completed
sql> select * from autos_gre1;
codigo marcar modelo valor estado---------- --------------------------- ---------- ------ 3 1 toyota 13000 a 4 1 nissan 13000 a
4.- crear un procedimiento que reciba como parametros la marca y el modelo de un automovil y devuelva su valor
create or replace procedure devuelve_valor(p_marca in varchar2, p_modelo in varchar2, p_valor out number)as
begin
select valor into p_valorfrom autos_gre1where marcar = p_marcaand modelo = p_modelo;
end;
create procedure devuelve_valor(p_marca in varchar2, p_modelo in varchar2, p_valor out number)as
155
begin--consulta si existe el automovil o no--2da. formaselect valor into p_valorfrom autos_gre1where marcar = p_marcarand modelo = p_modeloend;--1era. formaselect valorfrom autos_gre1where marcar = 'toyota'and modelo = '1500'
pl/sql (funciones)
crear una función que reciba como parámetro el nombre de un cliente y retorne el total de ordenes de venta en un nuevo comand creo la función y ejecuto solo con f8 esta es la funcióndeclaro variables en la funcion primerocreate or replace function devuelve_total(p_nombre varchar2)return number as v_valor number;
beginutiliza la tabla customer donde estan los nombre de los clientes, a prueba el valor de un clienteselect sum(r.total) into v_valorfrom sales_order r, customer twhere r.customer_id=t.customer_idand t.name= p_nombre;return (v_valor);end;
156
esto es lo que se hace para ver las ordenes en la función veo las ordenes del cliente 102
select *from sales_order rwhere r.customer_id=102
quiero saber la suma total aqui ya tengo un cliente determinado
select sum(r.total)from sales_order rwhere r.customer_id=102
en la base de datos podemos tener almacenados paquetes y funciones diapositivas 1 codigo almacenado en la carpeta pl/sql creo los paquetes
pasos para verificar si esta bien la funcion.
1.- vamos a la opcion funcion, y damos clic derecho2.- escogemos la opcion test3.- en la pantalla que salio en la opcion nombre ponemos un dato de la base en este caso (vollyrite).4.- luego lo ejecutamos
157
pl/sql (paquetes)
crear un paquete que tenga: - un procedimiento que reciba como parámetro el nombre de un empleado y devuelva su salario - una función que reciba como parámetro un año y un producto y retorne las cantidades totales vendidas de dicho producto
cabecera del paquete
create or replace package ordenes_gre is
procedure devuelve_salario (p_nombre varchar2,p_salario out number) ;
function devuelve_cantidad (p_ano varchar2, p_producto varchar2)return varchar2;end ordenes_gre;
nota.- primero compilamos el package y lo revisamos en la opción package, si tiene un visto tiene errores, debemos escoger editar o edit space & body
158
cuerpo del paquete
create or replace package body ordenes_gre is procedure devuelve_salario (p_nombre varchar2,p_salario out number) as begin select salary into p_salario from employee where last_name = p_nombre;
end devuelve_salario;
function devuelve_cantidad(p_ano varchar2, p_producto varchar2)return varchar2 as v_valor number; begin
select count (a.quantity)into v_valor from item a, product b, sales_order c where a.product_id = b.product_id and b.description = p_producto and to_char(c.order_date, 'yyyy')= p_ano; return (v_valor); end devuelve_cantidad; end ordenes_gre ;
nota.- después compilamos el package bodies y lo revisamos en la opción package bodies, si tiene un visto tiene errores, debemos escoger editar o edit space & body
159
pl/sql (paquetes)
crear un paquete que tenga - un procedimiento que calcule la suma total de ordenes de un determinado cliente - una funcion que devuelva la cantidad de empleados de una determinada localidad
select * from sales_order
--luegoselect *from sales_order a, customer bwhere a.customer_id=b.customer_idand b.name='shape up'
--luego para que realize la suma total de ordenesselect sum (a.total)from sales_order a, customer bwhere a.customer_id=b.customer_idand b.name='shape up'
--realizo el query de la funcion que es unir las tablasselect* from employee x, department y,location zwhere x.department_id=y.department_idand y.location_id=z.location_id
--la funcion pide de una determinada localidadselect count(x.employee_id)
160
from employee x, department y,location zwhere x.department_id=y.department_idand y.location_id=z.location_idand z.regional_group='dallas'
- luego construimos los paquetes en otra ventama. creacion del paquete las 4 primera lineas es la cabecera solo es pecificacion del paquete
create or replace package ventas isprocedure suma(p_nombre varchar2,p_total out number);function cantidad(p_localidad varchar2)return number;end ventas;
creamos el cuerpo del paquete copio el select anterio pero con modificaciones
create or replace package body ventas isprocedure suma(p_nombre varchar2,p_total out number) asbegin select sum (a.total)into p_total from sales_order a, customer b where a.customer_id=b.customer_id and b.name=p_nombre;end suma;
function cantidad(p_localidad varchar2)return number asv_cant number; --variables que se definen
begin select count(x.employee_id) into v_cant from employee x, department y,location z
161
where x.department_id=y.department_id and y.location_id=z.location_id and z.regional_group= p_localidad; return(v_cant); --variable que va a retornar la cantiada de emplaeado de dicha localidad end cantidad;
end ventas;
pl/sql (anonimos)
- programas anonimos (estructura) utiliza un paquete ya predefinido - dbms_output.put_line que sirve para displayar en pantalla es decir el nombre de la variable
declare
v_var varchar2(30):=' hola ';v_localidad varchar2(30) :='dallas';v_cantidad number;
begin
dbms_output.put_line (v_var || ' este es un programa anonimo ');v_cantidad:=ventas.cantidad('v_localidad');dbms_output.put_line('la localidad de :'||v_localidad||' tiene: '||v_cantidad||' de empleados ');
end;
162
nota.- primero lo ejecutamos y luego nos dirigimos a la pestaña output para ver la ejecución, los anónimos no se graban en memoria
pl/sql (anonimos)
crear un programa anonimo que utilice el paquete de ventas la función cantidad.si la cantidad de empleado de esa localidades mayor a 12 se visualizara el mensaje"el dlocalidad: xxx tienen muchos empleados"caso contrario se visualizara: "el localidad: xxx tienen pocos empleados"
declarev_cantidad number;v_localidad varchar2(30) := 'dallas';
begin
v_cantidad:=ventas.cantidad(v_localidad);
if v_cantidad > 12 thendbms_output.put_line('la localidad: ' || v_localidad || 'tine muchos empleados' );elsedbms_output.put_line('la localidad: ' || v_localidad || 'tine pocos empleados' );end if;
end;
163
pl/sql (anonimos)Crear un programa anónimo,
que invoque a un procedimiento que reciba como parámetro un numero que indicara la cantidad de veces que inserto el registro en la tabla temporal (código, descripción) en el código se insertara el valor de un contador que se incrementara de a 1 y en la descripción lo sgt;procedimiento exitosola inserción será repetida a través de un lazo cuya condición de salida será que el contador sea mayor que el numero, ingresado como parámetro. finalmente el procedimiento tendrá un parámetro de salida que se seteara en 1 cuando haya finalizado el lazo e imprimirá en el programa anónimo:fin del programa
create table temporal5( codigo number, descripcion varchar2(25))create or replace procedure inserta5( p_numero number, p_salida out number)asv_contador number :=0;begin loop
164
insert into temporal5 values (v_contador, 'procedimiento'); v_contador:=v_contador+1; if(v_contador > p_numero) then p_salida:=1; exit; end if; end loop; commit;end;
declarev_numero number := 5;v_salida number := 0;
begin--asi se llama un procedimiento y a la funcion debo asignarle una variable.inserta5 (v_numero, v_salida);
if v_salida = 1 thendbms_output.put_line('fin del programa');end if;end;
165
Utilizando otros lazos como deber sea este como el: for, while
usando el while
create or replace procedure inserta7( p_numero number, p_salida out number)asv_contador number :=0;begin
while v_contador <= p_numero loopinsert into temporal5values (v_contador, 'procedimiento');v_contador := v_contador + 1;end loop;p_salida:=1;commit;
end;
aplico el for
create or replace procedure inserta8( p_numero number,
166
p_salida out number)asv_contador number :=0;begin
for v_contador in 0..50 loopinsert into temporal5values (v_contador, 'procedimiento');
if(v_contador > p_numero) then p_salida:=1; exit; end if;end loop;commit;end;
Cursores
¿Qué es un cursor?
Para poder procesar una orden SQL oracle le asigna una área de memoria que recibe el nombre de área de contexto. Esta área contiene informaciones necesarias para completar el proceso, incluyendo el número de filas procesadas por la orden, el conjunto activo de filas,...
Un cursor es un puntero en el área de contexto que permite controlar lo que sucede en ese área, .... Veamos un ejemplo que lo que va a hacer es una extracción mediante cursor en que una consulta devuelve múltiples filas de datos.
DECLARE/* Output variables to hold the results of the query */v_employeeID employee.employee_id%TYPE;v_FirstName employee.first_name%TYPE;v_LastName employee.last_name%TYPE;
/* Bind variable used in the query */v_Salary employee.salary%TYPE := 3000;
/* Cursor declaration */CURSOR c_employee ISSELECT employee_id, first_name, last_nameFROM employee
167
WHERE salary = v_Salary;BEGIN /* Identify the rows in the active set, and prepare for furtherprocessing of the data */OPEN c_employee;LOOP/* Retrieve each row of the active set into PL/SQL variables */FETCH c_employee INTO v_employeeID, v_FirstName, v_LastName;
/* If there are no more rows to fetch, exit the loop */EXIT WHEN c_employee%NOTFOUND;END LOOP;
/* Free resources used by the query */CLOSE c_employee;END;
Los cursores pueden ser de dos tipos:
* Implícitos: no los declaramos nosotros, se declaran automáticamente cuando ocurre una transacción.
* Explícitos: como el ejemplo anterior, lo declaramos nosotros y podemos decir que su proceso consta de cuatro pasos:
1. Declaración del cursor:
CURSOR c_employee ISSELECT employee_id, first_name, last_nameFROM employeeWHERE salary = v_Salary;
2. Apertura del cursor para una consulta:
OPEN c_employee;LOOP
3. Extracción de los datos de un cursor:
FETCH c_employee INTO v_employeeID, v_FirstName, v_LastName;
4. Cierre del cursor:
168
CLOSE c_employee;
Atributos De Los Cursores
Existen cuatro atributos de los cursores que podemos aplicar, se añaden dentro de un bloque PL/SQL al nombre del cursor, y estos atributos son:
%FOUND: es un atributo booleano, de forma que si la última orden FETCH devuelve una fila nos devuelve el valor TRUE, si no nos devuelve FALSE. %NOTFOUND: se comporta de forma opuesta a %FOUND. %ISOPEN: es también un atributo booleano que se utiliza para asociar si el cursor asociado está abierto o no. %ROWCOUNT: este atributo numérico devuelve el número de filas extraídas por el cursor hasta ese momento.
Cursores
Crear un programa anonimo que consulte el nombre de los clientes, el total generado de ordenes de ventas del año en que se genero solo de aquellos cuyo limite de credito sea > a 5000 y tengan ordenes > a 50
create table noventa_gre( nombre varchar2(45), total number)
create table noventayuno_gre( nombre varchar2(45), total number)
--saca los datos de 9 registros
select b.name, a.total, to_char(a.order_date, 'yyyy')from sales_order a, customer bwhere a.customer_id = b.customer_id and b.credit_limit > 5000and a.total > 50
169
luego evaluar el año de la orden de cada cliente y registrarla insertarla en tablas anuales en una tabla los del año 90 y en otra los del año 91
-programadeclare
v_credi_limit number := 5000; v_total number := 50;--v_totales sales_order.total&type;
v_nombre customer.name%type;v_totales sales_order.total%type;v_ano varchar2(4);
cursor c_totales isselect b.name, a.total, to_char(a.order_date, 'yyyy')from sales_order a, customer bwhere a.customer_id = b.customer_id and b.credit_limit > 5000and a.total > 50;
begin
--4 pasos del cursoropen c_totales;loop--recuperamos el primer registrofetch c_totales into v_nombre, v_totales, v_ano;
if v_ano = '1990'theninsert into noventa_gre values(v_nombre, v_totales)
else if v_ano = ' 1991 ' theninsert into noventayuno_gre values(v_nombre, v_totales)end if;
end loop;commit;close c_totales;
end;
declare
v_employeeID employee.employee_id%TYPE;v_FirstName employee.first_name%TYPE;
170
v_LastName employee.last_name%TYPE;
v_Salary employee.salary%TYPE := 30;
CURSOR c_employee ISSELECT employee_id, first_name, last_nameFROM employeeWHERE salary = v_Salary;BEGIN
OPEN c_employee;LOOP
FETCH c_employee INTO v_employeeID, v_FirstName, v_LastName;
EXIT WHEN c_employee%NOTFOUND;dbms_output.put_line(v_Firstname ||' '|| v_salary || ' Tiene un buen salario ' || c_employee%rowcount);END LOOP;--si el dbms va antes del exit se repite el registroCLOSE c_employee;END;
171