Está en la página 1de 5

-- INDICES

--Para poder obtener información sobrelos indices podemos consultar varios


diccionarios:

-- 1) "user_index": nos muestra las siguientes columnas (entre otras que no


analizaremos);
-- INDEX_NAME (NOMBRE DEL INDICE)
-- INDEX_TYPE (TIPO DE INDICE, NOSOTROS CREAREMOS EL STANDARD NORMAL)
-- TABLE_NAME (NOMBRE DE LA TABLA)
-- UNIQUENESS (SI ES ÚNICO O NO)

-- 2) "user_ind_columns": nos muestra las siguientes columnas (entre otras queno


analizaremos):
-- INDEX_NAME (NOMBRE DEL INDICE)
-- INDEX_TYPE (TIPO DE INDICE)
-- COLUMN_NAME (NOMBRE DEL CAMPO)
-- COLUMN_POSITION (POSICIÓN DEL CAMPO)

-- 3) "user_objects": es la columna "OBJECT_TYPE" muestra "INDEX", si es un indice

-- 4) "user_constraints": Si la restricción tiene un índice asociado


-- INDEX_NAME (NOMBRE DEL INDICE)

-- EJERCICIOS

-- CONSULTA LOS "user_constraints"

SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, INDEX_NAME FROM user_constraints WHERE


TABLE_NAME = 'ESTUDIANTE';

--VER LOS INDICES DE LA TABLA "EMPLEADO"


SELECT INDEX_NAME, INDEX_TYPE, UNIQUENESS
FROM user_indexes
WHERE TABLE_NAME = 'EMPLEADO';

-- CREA UN ÍNDICE ÚNICO SOBRE EL CAMPO APELLIDO1 DE LA TABLA EMPLEADO


CREATE UNIQUE INDEX I_APELLIDOS ON EMPLEADO (APELLIDO1)

-- AGREGAMOS A LA TABLA UNA RESTRICCION ÚNICA SOBRE EL CAMPO "APELLIDO1"


ALTER TABLE EMPLEADO ADD CONSTRAINT UK_empleado_Apellido1 UNIQUE (APELLIDO1)

-- CREA UN ÍNDICE NO ÚNICO, COMPUESTO (PARA LOS CAMPOS APELLIDO1 Y NOMBRE)


CREATE INDEX II_EMPLEADO_APELLIDO1NOMBRE ON EMPLEADO (APELLIDO1, NOMBRE);

-- VEAMOS TODOS LOS INDICES DE LA BASE DE DATOS ACTIVA CONSULTANDO "user_objects":


SELECT * FROM user_objects WHERE OBJECT_TYPE = 'INDEX';

-- OBTENEMOS INFORMACIÓN DE "USER_IND_COLUMNS"


SELECT INDEX_NAME, COLUMN_NAME, COLUMN_POSITION FROM user_ind_columns WHERE
TABLE_NAME ='EMPLEADO';

-- SI INTENTAMOS CREAR OTRO INDICE ÚNICO PARA EL CAMPO APELLIDO1


-- (QUE CONTIENE VALORE DUPLICADOS) ORACLE NO LO PERMITE:
CREATE UNIQUE INDEX I_APELLIDOS ON EMPLEADO (APELLIDO1)

-- ERROR: DICHA LISTA DE COLUMNAS YA ESTA INDEXADA


-- IGUALMENTE, SI HAY UN INDICE ÚNICO SOBRE UN CAMPO Y LUEGO INTENTAMOS INGRESAR UN
REGISTRO CON UN VALORE REPETIDO
-- PARA EL CAMPO INDEXADO , ORACLE NO LO PERMITE

-- CREA UN INDICE UNICO SOBRE EL CAMPO NOMBRE


CREATE UNIQUE INDEX III_EMPLEADO_NOMBRE ON EMPLEADO (NOMBRE);

-- INGRESA 2 REGISTROS
INSERT INTO EMPLEADO (NOMBRE, APELLIDO1, APELLIDO2, DNI, FECHANAC, DIRECCION, SEXO,
SUELDO, SUPERDNI, DNO)
VALUES('Araceli', 'Jacobo', 'Martínez', 01, TO_DATE ('12-12-2022', 'mm-dd-yyyy'),
'Zapata', 'M',3000, 888665555,1)

INSERT INTO EMPLEADO (NOMBRE, APELLIDO1, APELLIDO2, DNI, FECHANAC, DIRECCION, SEXO,
SUELDO, SUPERDNI, DNO)
VALUES('Geraldine', 'Santibañez', 'Cruz', 02, TO_DATE ('12-12-2022', 'mm-dd-yyyy'),
'Zapata', 'M',7000, 987654321,1)

-- CÓMO SABER SI UN ÍNDICE SE ESTÁ UTILIZANDO O MONITORIZANDOEN ORACLE


SELECT INDEX_NAME, INDEX_TYPE, UNIQUENESS
FROM user_indexes
WHERE TABLE_NAME = 'EMPLEADO';

ALTER INDEX III_EMPLEADO_NOMBRE MONITORING USAGE;

SELECT * FROM V$OBJECT_USAGE;

SELECT NOMBRE FROM EMPLEADO;

-- PARA DESACTIVAR LA MONITORIZACIÓN EJECUTAREMOS EL SIGUIENTE COMANDO:


ALTER INDEX III_EMPLEADO_NOMBRE NOMONITORING USAGE;

-- OBTENER EL TAMAÑO OCUPADO POR UN ÍNDICE EN UNA TABLA DE ORACLE:


SELECT SEGMENT_NAME, SUM (BYTES)/1024/1024 MB
FROM DBA_EXTENTS WHERE SEGMENT_NAME ='III_EMPLEADO_NOMBRE'
GROUP BY SEGMENT_NAME;

-- ELIMINAR INDICES Y QUITAR UK EN APELLIDODROP INDEX III_EMPLEADO_NOMBRE


DROP INDEX III_EMPLEADO_NOMBRE;

DROP INDEX II_EMPLEADO_APELLIDO1NOMBRE;

ALTER TABLE EMPLEADO DROP CONSTRAINT UK_empleado_Apellido1;

DROP INDEX I_APELLIDOS;

-- 1) CREAR UNA TABLA QUE SE LLAME ESTUDIANTE, VA A TENER UNA MATRICULA, NOMBRE,
CURSO, MATERIA CALFINAL (CALIFICACION), NSS

CREATE TABLE ESTUDIANTE(


Nombre VARCHAR(15) NOT NULL,
Matricula CHAR(20) NOT NULL,
Curso VARCHAR(15) NOT NULL,
Materia VARCHAR(15) NOT NULL,
Calfinal float,
Nss CHAR (20) NOT NULL,
);
-- 2) INGRESAR 5 REGISTROS
INSERT INTO ESTUDIANTE (Nombre, Matricula, Curso, Materia, Calfinal, Nss)
VALUES ('Karol', '20223TN013', 'Tercero', 'Cálculo', 8.5, '555501234');

INSERT INTO ESTUDIANTE (Nombre, Matricula, Curso, Materia, Calfinal, Nss)


VALUES ('Damián', '20223TN007', 'Segundo', 'Inglés', 10, '575400657');

INSERT INTO ESTUDIANTE (Nombre, Matricula, Curso, Materia, Calfinal, Nss)


VALUES ('Lisset', '20203TN026', 'Noveno', 'Probabilidad', 9.7, '536001438');

INSERT INTO ESTUDIANTE (Nombre, Matricula, Curso, Materia, Calfinal, Nss)


VALUES ('Federico', '20213TN177', 'Segundo', 'Sistemas', 10, '585762739');

INSERT INTO ESTUDIANTE (Nombre, Matricula, Curso, Materia, Calfinal, Nss)


VALUES ('Pilar', '20223TN063', 'Noveno', 'Integradora', 9.5, '576770067');

SELECT * FROM ESTUDIANTE;

-- 3) CREAR UN INDICE UNICO PARA EL CAMPO NOMBRE


CREATE UNIQUE INDEX I_ESTUDIANTE _NOMBRE ON ESTUDIANTE (NOMBRE);
-- (NO PERMITE CREARLO, PORQUE HAY VALORES DUPLICADOS)

-- 4) CREAR UN INDICE NO ÚNICO PARA EL CAMPO NOMBRE


CREATE INDEX II_ESTUDIANTE_NOMBRE ON ESTUDIANTE (NOMBRE);

-- 5) CREAR UN ÍNDICE ÚNICO PARA EL CAMPO MATRÍCULA


CREATE UNIQUE INDEX ESTUDIANTE_MATRICULA ON ESTUDIANTE (MATRICULA);

-- 6) ESTABLECER UNA RESTRICCIÓN PRIMARY KEY (PK) SOBRE EL CAMPO MATRÍCULA


(I_ESTUDIANTE_MATRICULA)

ALTER TABLE ESTUDIANTE ADD CONSTRAINT I_ESTUDIANTE_MATRICULA PRIMARY KEY


(MATRICULA);

-- 7) VERIFICA QUE ORACLE NO CREÓ UN ÍNDICE AL AGREGAR LA RESTRICCIÓN


SELECT INDEX_NAME, INDEX_TYPE, UNIQUENESS FROM user_indexes WHERE TABLE_NAME =
'ESTUDIANTE';
-- no creo otro indice

-- 8) AGREGA UN RESTRICCION ÚNICA PARA EL CAMPO NSS


ALTER TABLE ESTUDIANTE ADD CONSTRAINT UQ_ESTUDIANTE_NSS UNIQUE (Nss);

-- 9) VERIFICA QUE ORACLE HAYA AGREGADO EL ÍNDICE


SELECT INDEX_NAME, INDEX_TYPE, UNIQUENESS FROM user_indexes WHERE TABLE_NAME =
'ESTUDIANTE';
-- (SI SE AGREGO EL INDICE "UQ_ESTUDIANTE_NSS")

--10) INDEXA LA TABLA ESTUDIANTE POR EL CAMPO "CALFINAL", EL ÍNDICE SERÁ NO ÚNICO
CREATE INDEX in_estudiante_calfinal ON ESTUDIANTE (CALFINAL);

--11) INDEXA LA TABKA ESTUDIANTE POR EL CAMPO "CURSO" Y "MATERIA", EL ÍNDICE SERÁ
NO ÚNICO
CREATE INDEX in_estudiante_cursomateria ON ESTUDIANTE (CURSO, MATERIA);

--12) INTENTA CREAR UN INDICE SOBRE "MATERIA" Y VERIFICA SI PUEDES TENER DATOS
DUPLICADOS
CREATE INDEX idx_estudiante_materia ON ESTUDIANTE (MATERIA);
--verificacion
INSERT INTO ESTUDIANTE (Nombre, Matricula, Curso, Materia, Calfinal, Nss)
VALUES ('Pilar', '20223TN063', 'Noveno', 'Integradora', 9.5, '576770067');
-- no se puede tener datos duplicado debido a la restricciòn unica de NSS

--13) CONSULTAR TODOS LOS ÍNDICES


SELECT * FROM user_objects WHERE OBJECT_TYPE = 'INDEX';

--14) CONSULTA EL DICCIONARIO "USER_IND_COLUMNS" Y ANALICE LA INFORMACIÓN QUE TE


RETORNA
SELECT INDEX_NAME, COLUMN_NAME, COLUMN_POSITION FROM user_ind_columns WHERE
TABLE_NAME ='ESTUDIANTE';
-- todos estan en la posicion 1, solo el indice de curso materia està en la
posicion 2

--15) VEA TODOS LOS ÍNDICES DE LA BASE DE DATOS ACTIVA


SELECT * FROM USER_INDEXES;

------ ****** BORRAR INDICES ****** -----


DROP INDEX II_ESTUDIANTE_NOMBRE;
ALTER TABLE ESTUDIANTE DROP CONSTRAINT I_ESTUDIANTE_MATRICULA;
DROP INDEX ESTUDIANTE_MATRICULA;
DROP INDEX IN_ESTUDIANTE_CALFINAL;
DROP INDEX IN_ESTUDIANTE_CURSOMATERIA;
DROP INDEX IDX_ESTUDIANTE_MATERIA;
ALTER TABLE ESTUDIANTE DROP CONSTRAINT UQ_ESTUDIANTE_NSS;
DROP INDEX UQ_ESTUDIANTE_NSS;
ALTER TABLE EMPLEADO DROP CONSTRAINT UK_empleado_Apellido1;

------- VistaS: UN OBJETO, DATOS DE TABLAS, SUBCONSULTAS, JOINS --------


-- 1. MUESTRA EL NOMBRE DEL PROYECTO Y NUMERO, SIEMPRE Y CUANDO SEA EL NUMERO 1
SELECT NOMBREPROYECTO, NUMPROYECTO FROM PROYECTO WHERE NUMPROYECTO= 1;

--- CREAR VISTA ----


CREATE VIEW VISTAPROYECTOS AS SELECT NOMBREPROYECTO, NUMPROYECTO FROM PROYECTO
WHERE NUMPROYECTO= 1;

SELECT * FROM VISTAPROYECTOS;

---- REEMPLAZAR LA VISTA CREADA (VISTAPROYECTOS) ----


CREATE OR REPLACE VIEW VISTAPROYECTOS AS SELECT NOMBREPROYECTO, NUMPROYECTO FROM
PROYECTO WHERE NUMPROYECTO= 10;

--- SINTAXIS PARA VISUALIZAR LAS VISTAS CREADAS ---


SELECT * FROM user_objects WHERE OBJECT_TYPE = 'VIEW';

--- SINTAXIS PARA ELIMINAR LAS VISTAS ---


DROP VIEW VISTAPROYECTOS;

-- 1) REALIZA UNA CONSULTA QUE MUESTRE EL NOMBRE DEL PROYECTO EN LA QUE TRABAJA
ALBERTO CAMPO SASTRE (3 TABLAS (TRABAJA_EN, PROYECTO Y EMPLEADO)) DNI EMPLEADO CON
DNI, NUMPROY CON NUMPROYECTO
CREATE OR REPLACE VIEW DATOPROYECTO AS
SELECT NOMBREPROYECTO FROM EMPLEADO INNER JOIN TRABAJA_EN ON EMPLEADO.DNI =
TRABAJA_EN.DNIEMPLEADO
INNER JOIN PROYECTO ON TRABAJA_EN.NUMPROY = PROYECTO.NUMPROYECTO WHERE
EMPLEADO.NOMBRE ='Alberto' AND
EMPLEADO.APELLIDO1='Campos' AND EMPLEADO.APELLIDO2='Sastre';

-- 2) VER LA INFORMACIÓN DE LA VISTA REALIZADA


SELECT * FROM DATOPROYECTO;

-- 3) REALIZAR UNA CONSULTA DE LA VISTA COMO SI SE TRATARÁ DE UNA TABLA, ORDENADO


DE FORMA ASCENDENTE.
SELECT * FROM DATOPROYECTO ORDER BY NOMBREPROYECTO ASC;
SELECT * FROM DATOPROYECTO ORDER BY NOMBREPROYECTO DESC;

-- 4) REALIZA UNA VISTA DONDE SE PUEDA VISUALIZAR EL NOMBRE, APELLIDO Y SUELDO DE


CADA EMPLEADO.
CREATE OR REPLACE VIEW DATOEMPLEADO AS
SELECT NOMBRE, APELLIDO1, SUELDO FROM EMPLEADO;

SELECT * FROM DATOEMPLEADO;

-- 5) DE LA VISTA ANTERIOR, REALIZAR UNA CONSULTA DONDE DE VISUALICEN LOS EMPLEADOS


QUE GANAN 25000
CREATE OR REPLACE VIEW DATOEMPLEADO AS
SELECT NOMBRE, APELLIDO1, SUELDO FROM EMPLEADO WHERE SUELDO = 25000;

SELECT * FROM DATOEMPLEADO;

También podría gustarte