EJERCICIOS RESUELTOS SQL Dadas las siguientes tablas responda a las consultas en SQL1. Listar los datos de los autores select * from autor ; 2. Listar nombre y edad de los estudiantes select nombre,edad from estudiante ; 3. ¿Qué estudiantes pertenecen a la carrera de Industrias? select nombre from estudiante where carrera="Industrias" ; 4. Listar los nombres de los estudiantes cuyo apellido comience con la letra G? SELECT nombre FROM estudiante WHERE nombre LIKE "* G*" ; (observación: el primer * es el nombre, luego de un espacio en blanco viene G y luego cualquier expresión) 5. ¿Quiénes son los autores del libro “Visual Studio Net”, listar solamente los nombres? SELECT nombre FROM autor WHERE idautor IN ( SELECT idautor FROM libaut WHERE idlibro IN ( SELECT idlibro FROM libro WHERE titulo='Visual Studio Net' ) ); 6. ¿Qué autores son de nacionalidad USA o Francia? SELECT * FROM autor WHERE nacionalidad ='USA' OR nacionalidad ='Francia' ; SELECT * FROM autor WHERE nacionalidad IN('USA','Francia') ; 7. ¿Qué libros No Son del Area de Internet? SELECT * FROM libro WHERE area <> 'Internet' ; 8. ¿Qué libros se prestó el Lector “Raul Valdez Alanes”? SELECT * FROM libro WHERE idlibro IN ( SELECT idlibro FROM prestamo WHERE idlector IN ( SELECT idlector FROM estudiante WHERE nombre='Raul Valdez Alanes' ) ); Listar el nombre del estudiante de menor edad SELECT nombre FROM estudiante WHERE edad IN ( SELECT min(edad) FROM estudiante ).9. 10. Listar los libros que pertenecen al autor Mario Benedetti SELECT * FROM libro WHERE idlibro IN ( SELECT idlibro FROM libaut WHERE idautor IN ( SELECT idautor FROM autor WHERE nombre='Benedetti Mario' ) ) . 11. Listar los nombres de los estudiante que se prestaron Libros de Base de Datos SELECT * FROM estudiante WHERE idlector IN ( SELECT idlector FROM prestamo WHERE idlibro IN ( SELECT idlibro FROM libro WHERE area='Base de Datos' ) ). Listar los libros de editorial AlfayOmega SELECT * FROM libro WHERE editorial ='AlfaOmega' 12. Hallar la suma de las edades de los estudiantes SELECT sum(edad) AS [La suma de las edades es: ] FROM estudiante 15.600.200. 53 23-1 Cll.000 23423445 1.000 43890231 1.000 23423445 1.500.800.350.350.200.000 71134534 1.700. Listar los datos de los estudiantes cuya edad es mayor al promedio SELECT * FROM estudiante WHERE edad > ( SELECT avg(edad) FROM estudiante ) 0 2 Las operaciones SQL correspondientes al SELECT se realizarán con el siguente ejempo: PERSONAS Cedula 71134534 23423445 12453535 75556743 43533322 78900456 73456789 43890231 78900700 Nombre Juan Ana María Gloria Pedro Primer_Apelli Segundo_Apellido do Mesa Betancur Betancur Ochoa Uribe Bermudez Garces Pelaez Guzmán Agudelo Angel Beltran Pérez Sexo M F F M F M M F M Dirección Cra 25 22-1 Telefono 2567532 Salario Cedula_Su p Cod_de p 3 2 3 1 3 1 2 0 1 1.000 75556743 1. Listar los títulos de los libros que debían devolverse el 10/04/07 SELECT * FROM libro WHERE idlibro IN ( SELECT idlibro FROM prestamo WHERE fechadevolucion=#04/10/07# AND devuelto=No ) 14.000 43890231 1. 12 43-5 2756533 Cll. 45 23-1 Cir.000 75556743 Cra 45 11-13 3433444 Tr.000 71134534 1. 10 14-1 Tr.700. 3 32-1 2674563 4445775 3456789 2660356 4345678 Patricia Angel Carlos Mario Betancur Gómez Claudia Gonzalez Fabio Solano DEPENDIENTES Cedula 78900456 Nombre_Dep Juanita Sexo FechaN F 12-Abr-95 Parentesco Hija . 5 12-5 Cr.6ta 14-45 2686885 Cll.13.000 43890231 1. 78900456 23423445 71134534 71134534 75556734 Oscar Hector María Gloria Jorge M M F F M 15-Ene-89 23-Dic-67 05-Mar-60 27-Nov-97 14-Mar-96 Hijo Cónyuge Cónyuge Hija Hijo DEPARTAMENTOS Codigo_Dep Nombre_Dep 0 1 2 3 Gerencia Desarrollo Soporte Técnico Cedula_Jefe 43890231 23423445 71134534 Teleinformatica 75556734 PROYECTOS Numero_Proy Nombre 129001 139001 139002 129002 129003 149001 149002 149003 Registro y Matrícula Red Lan Instalación nuevo Switche Notas Lugar Bloque 21 Bloque 14 Bloque 21 Campus Codigo_Dep 2 1 1 2 2 3 3 3 Paso de aplicativos FOXPRO Bloque 21 A COBOL Inventario de HW y SW Licenciamiento Evaluación de equipos PC's Minas Campus Bloque 18 a. nombre FROM personas Resultado/ . Se desea obtener la cédula y el nombre de todas las personas que trabajan en la compañía. SELECT cedula. Select básico. Select combinando tablas y utilización del comodín '*'.OR. Se desea obtener toda la información de la persona cuya cédula sea igual a 12453535. 12 43-5 2756533 c.telefono FROM personas WHERE cedula = 12453535 Resultado/ Nombre Primer_Apellido Gloria Betancur Segundo_Apellido Garces Dirección Telefono Tr. SELECT nombre. Select con clausula WHERE.primer_apellido. se le debe anteponer el nombre de la tabla de la cual se desea extraer la información: SELECT dependientes. Se necesita la cédula y el nombre de las personas cuyo apellido sea BETANCUR y su sexo sea MASCULINO: SELECT cedula.segundo_apellido. Se desea obtener la información de todos los dependientes de las personas cuyo apellido sea BETANCUR y su sexo sea MASCULINO.Cedula 71134534 23423445 12453535 75556743 43533322 78900456 Nombre Juan Ana María Gloria Pedro Patricia Carlos b.nombre FROM personas WHERE primer_apellido = 'Betancur' AND sexo = 'M' Resultado/ Cedula 78900456 Nombre Carlos d.* FROM personas. En la clausula WHERE es posible utilizar los conectores lógicos AND . dependientes WHERE primer_apellido = 'Betancur' . Cuando se trabaja con varias tablas y se utiliza el '*'.direccion. * FROM personas p. La misma consulta anterior: SELECT d.AND sexo = 'M' AND dependiente.000 1.500. Cuando se necesita extraer información distintiva dentro de un grupo de tuplas.cedula Resultado/ Cedula 78900456 78900456 Nombre_Dep Juanita Oscar Sexo FechaN F M 12-Abr-95 15-Ene-89 Parentesco Hija Hijo e.000 1.000 .cedula = personas.350.cedula Resultado/ Cedula 78900456 78900456 Nombre_Dep Juanita Oscar Sexo FechaN F M 12-Abr-95 15-Ene-89 Parentesco Hija Hijo f.cedula = p.600. dependientes d WHERE primer_apellido = 'Betancur' AND sexo = 'M' AND d.800. Utilizando alias o sinónimos de trabajo a las tablas del Select. se necesita extraer los diferentes valores de salarios que se pagan en la compañía: SELECT distinct salario FROM personas Resultado/ Salario 1.000 1. Estos se utilizan por facilidad en el manejo de la instrucción.700. se utiliza la clausula DISTINCT. Por ejemplo.000 1.200.000 1. 139002) AND cod_dep = codigo_dep .3 Mostrar cuántos salarios diferentes o distintas se pagan en la compañía: SELECT count(distinct salario) FROM personas Resultado/ 6 h. proyectos WHERE numero_proy IN (139001. Ejemplo. Una de las clausulas más significativas en el Select es el COUNT.2 Mostrar el total de proyectos que tiene asignada la dependencia 3 SELECT count(*) FROM proyectos WHERE codigo_dep = 3 Resultado/ 3 g.1 Forma básica: SELECT personas.* FROM personas. la cual se utiliza para contar la cantidad de registros que cumplen con una condición específica: g. pero tambien es posible comparar con un "conjunto" de valores. se desea saber qué empleados están involucrados en los proyectos 139001 o 139002.2 Forma con IN: SELECT personas.* FROM personas. h.g. Esto es realizable a través del operador IN. Cláusula WHERE compara sus campos comunmente con valores únicos. proyectos WHERE (numero_proy = 139001 OR numero_proy =139002) AND cod_dep = codigo_dep h.1 Mostrar el total de empleados en la compañía: SELECT count(*) FROM personas Resultado/ 9 g. codigo_dep = d. Ejemplo. La clausula WHERE comunmente compara los campos con valores exactos. Otra cláusula que es posible utilizar en el Select es EXIST. segundo_apellido FROM personas WHERE salario > ALL (select salario from personas where cod_dep = 3) j. la cual ayuda a validar si el resultado de una consulta anidada es vacio o no. Aquí se utiliza la utilización de la cláusula ALL: SELECT nombre.codigo_dep and primer_apellido = 'Ochoa') i. Mostrar los empleados que no tengan asignado salario: SELECT * FROM personas WHERE salario IS NULL k. pero también es probable utilizarla comparando sus campos con otras sentencias Select.3 Mostrar el nombre de los empleados cuyo salario es mayor que el de todos los empleados del departamento 3. Operación Select con anidamientos. En el select es posible validar la existencia de información nula a través de la cláusula NULL. primer_apellido. departamentos d. personas where p.Resultado/ PENDIENTE i. Esta forma también es llamada Consulta anidada: i.1 Mostrar los diferentes proyectos en donde el ingeniero OCHOA participa: SELECT distinct numero_proy FROM proyectos WHERE numero_proy IN (select numero_proy from proyectos p.2 Mostrar los empleados cuyo jefe es de apellidos BETANCUR BERMUDEZ: SELECT personas.* FROM personas WHERE cedula_sup IN (select cedula from personas where primer_apellido = 'Betancur' and segundo_apellido = 'Bermudez') i. . p. avg(salario) FROM personas m. max(salario).segundo_apellido FROM personas p WHERE EXIST (select * from dependiente d where p. p. permite hacer operaciones sobre estas agrupaciones. La cláusula WHERE además de las anteriores instrucciones también puede utilizar la instrucción LIKE. el máximo y el mínimo salario y el promedio pagado: SELECT sum(salario).cedula = d. p.nombre.nombre.cedula) l. que le sirve para encontrar información string no precisa. Ejemplo.2 Seleccionar los empleados que no tienen dependientes: SELECT p.primer_apellido. numero_proy HAVING count(*) > 1 n. el total pagado por la compañía. Veamos el siguiente ejemplo: . maximizar (MAX). HAVING.cedula and d. trabaja_en WHERE numero_proy = nump GROUP BY nombre. la cual agrupa tuplas según las columnas puestas en la cláusula Select. Agrupación de tuplas y aplicación de condiciones para ellas. Con la operación de Select también es posible utilizar funciones agregadas para: sumar (SUM). min(salario). numero_proy FROM proyectos.sexo and nombre = nombre_dep) k.1 Mostrar el número y el nombre del proyecto en donde trabajen más de dos empleados SELECT nombre. Aquí se utilizan dos cláusulas nuevas: GROUP BY. minimizar (MIN) y promediar (AVG). Veamos: m.sexo = p. sexo y nombre.1 Seleccionar todos los empleados cuyo dependiente tenga la misma cedula. SELECT p.primer_apellido.k.segundo_apellido FROM personas p WHERE NOT EXIST (select * from dependiente d where p. p.cedula = d. Se pueden utilizar al nivel de la cláusula SELECT o en la cláusual HAVING (que veremos posteriormente. '-'. hora_llegada_programada) VIAJES_REALIZADOS(num_viaje. restricciones) TRAYECTO_VIAJE(num_viaje. numero_proy FROM proyectos WHERE nombre LIKE '%lic%' o.SELECT nombre. hora_salida. cod_tarifa. SELECT * FROM personas ORDER BY nombre. con los campos de valor: SELECT salario*1. nombre. Cada trayecto tiene horas y terminales de salida y de llegada programados. num_trayecto. cod_terminal_sale. cod_terminal_sale. fecha. cod_terminal_llega. monto. y consta de uno o más TRAYECTO_VIAJE con num_trayecto 1. Una cláusula más que podemos utilizar en la operación Select es la que me permite dale un orden a las tuplas. En la cláusula Select también es posible realizar operaciones aritméticas '+'. Se tiene el siguiente esquema de base de datos para el manejo de información de un Sistema de Transportes intermunicipales: TERMINALES_TRANSPORTE (cod_terminal. uno por cada fecha en que tiene lugar el viaje. hora_salida_programada. hora_llegada) VIAJES_AUTORIZADOS(tipo_transporte. fecha. etc. ORDER BY. cod_terminal) TRANSPORTE(id_transporte. según el o los criterios indicados a través de columnas. num_asientos_disponibles. num_asiento. 2. ciudad. cod_terminal_llega. segundo_apellido 3. num_trayecto. transportadora. tel_cliente) El anterior esquema describe una base de datos con información sobre viajes de líneas aéreas. Cada VIAJE se identifica con un número de viaje. Se mantienen TARIFAS para cada viaje. tipo_transporte) RESERVA_ASIENTOS(num_viaje. 3. días) TARIFAS(num_viaje. total_de_asientos. Para cada . num_trayecto. estado) VIAJES(número. primer_apellido.18 FROM personas WHERE salario < 1200000 p. '*'. nombre_cliente. id_transporte. y tiene muchos TRAYECTO_VIAJE. *. horas de llegada programadas y días de todos los viajes o trayectos de viajes que salgan de algún terminal de la ciudad de Santa Marta y lleguen a algún terminal de la ciudad de Buenaventura. Solución 2: SELECT tv. viajes WHERE cod_terminal_sale = 'CA001' AND cod_terminal_llega = 'BO001' AND numero = num_viaje 2.fecha FROM viajes_realizados WHERE cod_terminal_sale = 'CA001' AND cod_terminal_llega = 'BO001'. Especifique las siguientes consultas: 1. códigos de terminal de llegada. Cada TERMINAL se identifica con un cod_terminal. Obtenga una lista con los números de viaje. VIAJES AUTORIZADOS relaciona los tipo_transporte con los terminales en los que puede aterrizar. num_trayecto. dias FROM trayecto_viaje tv.movimiento de trayecto.cod_terminal) AND (numero = num_viaje). Solución 1: SELECT num_viaje.cod_terminal) AND (ciudad = 'Buenaventura' AND cod_terminal_llega = tt. se mantiene RESERVA_ASIENTOS. horas de salida programadas. códigos de terminal de salida. Un TRANSPORTE se identifica con id_transporte y es de un cierto tipo_transporte. el transporte empleado en el trayecto y las horas de salida y llegada y los terminales específicos. Solución 1: SELECT tv. viajes WHERE (ciudad = 'Santa Marta' AND cod_terminal_sale = tt. Prepare una lista con los números de viaje y los días de todos los viajes o trayectos de viaje que salen del terminal codigo ‘CA001’ y llegan al terminal código ‘BO001.*. viajes WHERE cod_terminal_sale = (SELECT cod_terminal FROM terminales_transporte WHERE ciudad = 'Santa Marta') AND cod_terminal_llega = (SELECT cod_terminal FROM terminales_transporte . dias FROM trayecto_viaje tv. dias FROM viajes_realizados. Solución 2: SELECT distinct numero. terminales_transporte tt. total) SELECT cod_terminal. Liste las diferentes tarifas que se aplicaron a los viajes que se realizaron entre los terminales de Santa Marta y Medellín.num_viaje. INSERT INTO tmp (term. 5. terminales_transporte WHERE cod_terminal_sale = (SELECT cod_terminal FROM terminales_transporte WHERE ciudad = 'Santa Marta') AND cod_terminal_llega = (SELECT cod_terminal FROM terminales_transporte WHERE ciudad = 'Medellín') AND fecha between '01/01/00' and '31/12/99' AND ta. Muestre los viajes con los correspondientes transportes. Liste los terminales que tienen el mayor tráfico en un día (haga el ejemplo con cualquier fecha).num_viaje = vr. . tarifas ta. monto FROM viajes_realizados vr.num_viaje. SELECT term. 3.num_viaje = vr. tarifas ta. que tuvieron más de 50 pasajero con reservas. terminales_transporte WHERE (ciudad = 'Santa Marta' AND cod_terminal_sale = cod_terminal) AND (ciudad = 'Medellín' AND cod_terminal_llega = cod_terminal) AND fecha between '01/01/00' and '31/12/99' AND ta.WHERE ciudad = 'Buenaventura') AND numero = num_viaje. Solución 2: SELECT distinct cod_tarifa. total number(10)). Solución 1: SELECT distinct cod_tarifa. 4. viajes_realizados WHERE fecha = '21/10/00' AND cod_terminal_sale = cod_terminal OR cod_terminal_llega = cod_terminal GROUP BY cod_terminal. MAX(total) FROM tmp GROUP BY term. en el año 1999. monto FROM viajes_realizados vr. count(*) FROM terminales_transporte. CREATE TABLE tmp (term varchar2(5). se usa para especificar valores numéricos.SELECT num_viaje. Tipos de datos en Oracle Los tipos de datos en Oracle son: NUMBER .especifica un entero de 10 dígitos NUMBER (10. Ejemplos: CHAR(3) . id_transporte FROM viajes_realizados WHERE num_viaje IN (SELECT num_viaje FROM reserva_asientos GROUP BY num_viaje HAVING count(*) > 50).especifica un número de 10 dígitos.especifica un tamaño fijo de 3 caracteres CHAR . ).se usa para especificar cadenas de caracteres de TAMAÑO FIJO.es el "default". VARCHAR2 . donde 2 lugares son decimales.es el "default" y su tamaño es de un caracter. ____________________________________________________ Creación de tablas de una base de datos Estructura general de la instrucción en SQL para crear una tabla Se usa la instrucción CREATE TABLE nombre de la tabla ( campo1 tipo de dato1. .se usa para especificar cadenas de caracteres de TAMAÑO VARIABLE. Requiere que el dato esté entre comillas sencillas.2) . Ejemplos: NUMBER(10) . etc. CHAR . campo2 tipo de dato2. NUMBER . BOOLEAN . campo2 varchar2(5).es el "default" y su tamaño es de . DATE . LONG RAW y otros. A cada ¨constraint¨ se le identtifica con un nombre. Puede asumir los valores TRUE.se usa para valores de cierto o falso..se usa para especificar fechas con formato dd-mmm-yy ó dd-mmm-yyyy.se puede especificar en forma directa cuando se declara el campo al crear la tabla o por medio de un "constraint" explícitamente. RAW. . FALSE o NULL.. Ejemplos: VARCHAR2(3) . tales como especificar los "primary key". '08-mar-1999' es un dato válido cuando el dato fue guardado en la base de datos con ese formato. Hay otros tipos de datos tales como: LONG.. en particular cuando es compuesto. Ejemplos: '08-mar-99' es un dato válido cuando el dato fue guardado en la base de datos con ese formato.especifica un tamaño fijo de 3 caracteres VARCHAR2 . Ejemplos CREATE TABLE tabla1 ( campo1 number(7) PRIMARY KEY.Requiere que el dato esté entre comillas sencillas. Requiere que la fecha se especifique entre comillas sencillas. ese nombre debe ser alusivo a su función o propósito. "CONSTRAINT" Sirven para especificar condiciones sobre los campos. los "foreign key" o requisitos de validación. "PRIMARY KEY" . . etc.camp2) ). CREATE TABLE tabla2 ( camp1 char(2). "FOREIGN KEY" .se puede especificar en forma directa cuando se declara el campo al crear la tabla o por medio de un "constraint" explícitamente. Ejemplo 2 CREATE TABLE tabla1 ( campo1 number(7) PRIMARY KEY. Ejemplo 1 CREATE TABLE tabla1 ( campo1 number(7) PRIMARY KEY.etc. En este último caso el "primary key" es compuesto. campo2 varchar2(5). CREATE TABLE tabla2 ( camp1 char(2). camp3 varchar2(20). campo2 varchar2(5). ). campo3 varchar2(20). CONSTRAINT keytabla2 PRIMARY KEY(campo1. Es importante que los tipos y tamaño de los campos aludidos en el foreign key correspondan. campo2 number(5). ). camp2 number(5). campo4 number)5). CREATE TABLE tabla2 ( campo1 char(2). etc.campo2) ). ). camp2 number(5). CONSTRAINT keytabla2 PRIMARY KEY(camp1. camp4 number(7) FOREIGN KEY tabla1(campo1). CONSTRAINT keytabla2 PRIMARY KEY(camp1. Otras instrucciones o mandatos que complementan la creación de tablas Las siguientes son instrucciones de SQL ALTER TABLE Esta instrucción nos permite añadir campos y modificar definiciones de campos a tablas que están creadas. campo2 varchar2(5).camp3 varchar2(20). Por ejemplo si tenemos la tabla TABLA1 creada de la forma siguiente: CREATE TABLE tabla1 ( campo1 number(7) PRIMARY KEY. DROP TABLE Esta instrucción nos permite eliminar la estructura de la tabla al igual que los datos que hayan. Por otro lado si queremos cambiar a que el campo3 permita 7 dígitos en lugar de 5. ).camp2) CONSTRAINT foreignkeytabla1 FOREIGN KEYcamp4 REFERENCES tabla1(campo1) ). y queremos añadir un campo3 esto se puede hacer con: ALTER TABLE tabla1 ADD( campo3 number(5) ). podemos hacer lo siguiente: ALTER TABLE tabla1 MODIFY( campo3 number(7) ). camp4 number)5). . Para más información leer el Capítulo 16 del libro de texto (Koch & Loney). y queremos insertar un récord completo lo podemos hacer con: INSERT INTO tabla1(campo1. INSERT INTO Esta instrucción nos permite insertar datos en una tabla ya creada. entonces quedaría así: INSERT INTO tabla1 VALUES (1234567. campo2 varchar2(5). ).'abcde').'abcde'). Por ejemplo si tenemos la tabla TABLA1 creada de la forma siguiente: CREATE TABLE tabla1 ( campo1 number(7) PRIMARY KEY. Por ejemplo si tenemos la tabla TABLA1 creada de la forma siguiente: CREATE TABLE tabla1 ( campo1 number(7) PRIMARY KEY. TRUNCATE TABLE Esta instrucción nos permite eliminar los datos de la tabla. Como en este caso se están insertando datos en todos los campos se pueden omitir los nombres de los campos. .Por ejemplo si queremos eliminar la tabla TABLA1 lo hacemos de la forma siguiente: DROP TABLE tabla1. SOLO ELIMINA LOS DATOS Por ejemplo si queremos eliminar los datos de la tabla TABLA1 lo hacemos de la forma siguiente: TRUNCATE TABLE tabla1. UPDATE Esta instrucción nos permite cambiar o actualizar datos en una tabla ya creada y ya poblada.campo2) VALUES (1234567. pero no elimina la estructura de la tabla. Los siguientes son mandatos de SQLPLUS . DELETE Esta instrucción nos permite eliminar récords de una tabla ya creada y ya poblada. esto lo podemos hacer con: DELETE FROM tabla1 WHERE campo1 = 1234567. drop view. audit o noaudit. grant. Por ejemplo si tenemos la tabla TABLA1 creada de la forma siguiente: CREATE TABLE tabla1 ( campo1 number(7) PRIMARY KEY. disconnect. drop table. Esta instrucción nos permite eliminar una operación de "insert". campo2 varchar2(5). revoke. connect. claro está se hace un COMMIT implícito si usted sale de la cuenta (con exit o quit) o hace un create table. y queremos eliminar el récord con "primary key" igual 12345. "update" o "delete" en una tabla si no se ha hecho un COMMIT. Esta instrucción nos permite confirmar una operación de "insert". Si se realiza una de esas operaciones y no se hace inmediatamente un COMMIT ese cambio no se hace en la base de datos. varchar2(5). alter. y queremos cambiar el campo2 por 'xyzwv' lo podemos hacer con: UPDATE tabla1 SET campo2 = 'xyzwv' WHERE campo1 = 1234567. ). ROLLBACK.campo2 ). create view. COMMIT. "update" o "delete" en una tabla. restar (-). . etc. salary+200 FROM s_emp. Veamos los siguientes ejemplos usando la base de datos de Summit Sporting Goods: SELECT last_name. DESC tabla Este mandato nos permite tener una descripción general de la tabla especificada. salary*12 FROM s_emp: Esa consulta muestra el apellido y el sueldo anual de los empleados. TTITLE. Por ejemplo si queremos saber que hay en la tabla1. Esa consulta muestra el apellido y el sueldo mensual aumentándole $200. Las operaciones fundamentales son sumar (+). SELECT last_name. dividir (/ ) y multiplicar (* ). esto el símbolo . Operaciones aritméticas en consultas Operaciones aritméticas Dentro de un SELECT podemos proyectar resultados que provienen de un cálculo relacionado a uno o varios campos de la base de datos usando operaciones aritméticas.Los mandatos de SQLPLUS no llevan el "semicolon" al final. escribiríamos DESC tabla Más adelante veremos otros mandatos de SQLPlus tales como SET. . restar (-). commision_pct*salary/100 FROM s_emp WHERE title= ´Sales Representative´. . NVL(commision_pc. del texto encontramos muchas más. ROUND(commision_pct*salary/100.0) COMISION FROM s_emp."group of values" 3. SELECT last_name APELLIDO. Esa consulta presenta el apellido y lo que gana el empleado en comisión para los empleados que son vendedores.2) FROM s_emp WHERE title= ´Sales Representative´. En el Capítulo 6 "Playing the Numbers". Estas se clasifican como: 1. Esa consulta presenta el apellido y lo que gana el empleado en comisión para los empleados que son vendedores redondeando a dos lugares decimales la ganancia de la comisión. Esa consulta presenta el apellido y el porciento comisión para todos los empleados y cuando no son son vendedores (que tienen valor nulo (NULL) en commision_pct asigna el valor cero(0). FUNCIONES Hay tres clases de funciones numéricas."single values" 2.SELECT last_name. También se consideran otras tales como la de valor absoluto (ABS(valor)). etc. Veamos ejemplos usando algunas funciones tomando en cuenta la base de datos de Summit Sporting Goods: SELECT last_name."lists of values" "Single values" Aquí se consideran las operaciones aritméticas tales como sumar (+). dividir (/ ) y multiplicar (* ). raíz cuadrada (SQRT(valor)). Esa consulta presenta el apellido y la cantidad de días que los empleados llevan en la empresa.SELECT last_name APELLIDO. Esa consulta presenta el apellido y la cantidad de SEMANAS días que los empleados llevan en la empresa. Son funciones para obterner el promedio. La cantidad de horas se presentarán en fracción decimal. La palabra reservada SYSDATE trae la fecha actual del sistema (la fecha de ese dia).7) DIAS FROM s_emp.Funciones agrupadas Estas funciones ofrecen resultados que se aplican a los valores de una columna en total o parte de ellos. TRUNC(SYSDATE . un contador. MOD(TRUNC(SYSDATE-start_date). Esa consulta presenta el apellido y la cantidad de días que los empleados llevan en la empresa. . SYSDATE . TRUNC((SYSDATE-start_date)/7) SEMANAS. "Group of values" . SELECT last_name APELLIDO. valor máximo. esto traerá como consecuencia que el resultado tenga lugares decimales en la cantidad de días dependiendo de las horas que hayan transcurrido del día en que hacemos la consulta.start_date DIAS FROM s_emp. La función MOD da como resultado el residuo que queda al dividir (SYSDATE-start_date) por 7.5 de un día) SELECT last_name APELLIDO. Por ejemplo si nos presenta 23.start_date) DIAS FROM s_emp. quiere decir que han pasado 23 días y 12 horas (que equivale al . Si te fijas hemos omitido la función TRUNC.etc Veamos ejemplos usando algunas funciones tomando en cuenta la base de datos de Summit Sporting Goods: SELECT AVG(salary) FROM s_emp.5 días. Aquí se cuenta cuántas filas (récords) de empleados hay en la tabla s_emp. Este ejemplo muestra los puestos (title) contando cuántas personas están en los diferentes puestos. SELECT MAX(salary) FROM s_emp. AVG(salary) "Promedio de sueldos". En este ejemplo tenemos cuántos puestos (titles) distintos hay y cuántos empleados hay en total. SELECT COUNT(*) FROM s_emp. Aquí vemos el total al sumar los sueldos de todos los empleados. SELECT COUNT(*) "Cantidad de empleados". SELECT title PUESTOS. En este ejemplo se proyecta el sueldo mayor de todos los empleados. COUNT(tilte) "CANTIDAD DE EMPLEADOS" FROM s_emp GROUP BY title.En este ejemplo se proyecta el promedio de los sueldos de todos los empleados. esto último lo hace la claúsula GROUP BY. SELECT COUNT(DISTINCT title). SELECT SUM(salary) FROM s_emp. En este ejemplo obtenemos cuántos empleados hay. COUNT(tilte) "CANTIDAD DE EMPLEADOS" FROM s_emp . cual es el sueldo promedio y a cuánto asciende el total de los sueldos. SUM(salary) "Total de sueldos" FROM s_emp. COUNT (*) FROM s_emp. SELECT title PUESTOS. (separándolos por coma. Este ejemplo muestar los puestos (title) contando cuántas personas están en los diferentes puestos. por ejemplo mostraría el nombre así : Rivera. En este ejemplo se produce una columna con el apellido y el nombre. Además solo se expondrán los puestos donde hay más de dos personas con ese puesto. por ejemplo mostraría el nombre así : Rivera José ) FUNCIONES . (no deja espacio en blanco entre ambos. En este ejemplo se produce una columna con el apellido y el nombre.GROUP BY title HAVING COUNT(title) >2. OPERACIONES La operación concatenar quiere decir unir dos cadenas de caracteres.José ) SELECT last_name||' '||first_name FROM s_emp. Aquí se usan los símbolos || para indicar la concatenación. por ejemplo mostraría el nombre así : RiveraJosé ) SELECT last_name||'.'||first_name FROM s_emp. esto último lo hace la claúsula GROUP BY. esto lo controla la claúsula HAVING COUNT(title) >2. (separándolos con un espacio en blanco. Ejemplos: SELECT last_name||first_name FROM s_emp. En este ejemplo se produce una columna pegando el apellido al nombre. En este ejemplo el resultado es el apellido del empleado (que es Havel) y la cantidad de caracteres que es 5. Por ejemplo: SELECT SUBSTR(last_name. El ejemplo nos proyecta los apellidos que tienen 5 caracteres. Esto es puede estar 'PATEL'. first_name FROM s_emp WHERE UPPER(last_name)='PATEL'. A continuación mostraremos el uso de algunas solamente. 3.Respecto a funciones para manejar cadenas de caracteres hay una gran variedad. Aquí se presentan los apellidos en letras minúsculas. sin importar como el dato está en la base de datos. Veamos ejemplos usando algunas funciones tomando en cuenta la base de datos de Summit Sporting Goods: SELECT last_name. LENGTH(last_name) FROM s_emp WHERE id =10. En este caso nos proyecta el apellido y nombre de los empleados que tengan apellido 'PATEL'. SELECT last_name. 'patel' o de cualquier otra forma. .2) FROM s_emp WHERE id = 10. Lea el Capítulo 5 -"Getting text information and changing it" del libro de texto. La función SUBSTR permite obtener una subcadena de caracteres a partir de una cadena de caracteres. Igual que las funciones LOWER y UPPER hay otra de INITCAP. SELECT last_name FROM s_emp WHERE LENGTH(last_name) =5. 'Patel'. SELECT LOWER(last_name) FROM s_emp. . id ID FROM s_emp WHERE id IN (3.') NOMBRE.. Veamos varios ejemplos: SELECT INSTR(last_name.... por lo tanto el resultado es 've'.....Roberta.Molly. 3 6 7 La función INSTR busca la posición de una subcadena en una cadena.'. 'a') FROM s_emp WHERE id IN (3.......'|| first_name" usando 20 espacios. Menchu.start_date from s_emp... La función RPAD justifica a la derecha. si esa concatenación no ocupa 20 espacios se rellena co puntos..En este ejemplo se toman 2 caracteres del apellido del empleado 10 empezando en el caracter # 3.. Operaciones con fechas en consultas OPERACIONES Podemos hacer operaciones con fechas tales como las siguientes: SELECT SYSDATE ....... La respuesta es 2... El empleado 10 tiene apellido 'Havel'..7).6.. Aquí se quiere saber en que posición se encuentra la letra 'a' en esos apellidos. En 'Nagayama' cuenta la primera 'a'. 20. 6 y 0..6..... Urguhart. Veamos que obtenemos de salida: NOMBRE______________ __ID Nagayama Midori. Aquí se proyecta la concatenación " last_name || '.'|| first_name... en 'Menchu' la respuesta es 0 por que no hay 'a'........ veamos el ejemplo siguiente: SELECT RPAD(last_name || '........... .7)... Hay otras operaciones. Conveniencia . Por lo general el resultado incluye decimales pues toma la facción de horas que han pasado de la fecha del sistema de ese día. 2. Seguridad .Esta consulta nos trae la cantidad de dias que lleva un empleado en la empresa. inclusive combinando con funciones aritméticas tales como ROUNd y TRUNC . El Capítulo 7 del texto presenta muchos ejemplos de como se pueden combinar funciones y/o operaciones. . first_name "Nombre". Veamos otro ejemplo: SELECT last_name. algunas se realizan a través de funciones. (Esa facción no es equivalente a horas.una consulta compleja se puede obtener de forma sencilla seleccionando datos del view. Por eso las veremos en la próxima sección.restringe al ususario de éstos los datos que pueden ver. solo es una facción del día). now."Dates: then. VENTAJAS 1. OJO: la creaci2n de un view no crea una tabla físicamente en la base de datos ni en el sistema. (Ver el Capítulo 7 . start_date) MONTHS FROM s_emp. and the difference" del texto) FUNCIONES Hay una gran variedad de funciones con fechas.6) "Fecha de evaluación" FROM s_emp. A continuación veremos un ejemplo donde le añadimos 6 meses a la fecha en que el empleado comenzó: SELECT last_name "Apellido". start_date "Fecha de inicio". first_name. MONTHS_BETWEEN(SYSDATE. ADD_MONTHS(start_date. Creación de Views DEFINICION Un view es una tabla "virtual" que podemos diseñar para que los usuarios puedan hacer consultas. title FROM s_emp WHERE DEPT_ID = 45 WITH CHECK OPTION. por ejemplo: UPDATE emp45 SET dept_id = 10 WHERE id = 10. last_name. EJEMPLOS 1CREATE VIEW emp45 AS SELECT id. first_name.SINTAXIS CREATE VIEW nombre AS query WITH CHECK OPTION (constraint). La claúsula WITH CHECK OPTION impide hacer actualizaciones a través del view. OJO: Antes de crear este view elimina el anterior con DROP VIEW emp45. Podemos ver los datos del view con la siguiente consulta: SELECT * FROM emp45. A través de este view podemos hacer actualizaciones. . 2- CREATE VIEW emp45 AS SELECT id. Si ahora haces la consulta al view verás que se eliminó un récord. te recomiendo que remuevas el cambio con ROLLBACK. no te permitirá actualizaciones. title FROM s_emp WHERE DEPT_ID = 45. Trata de actualizar con la siguiente instrucción y verás que te dará un error. last_name. Para NO alterar la base de datos. first_name. INFORMACION sobre los views Podemos conseguir información sobre los views creados en la tablas del diccionario de datos que se llama USER_VIEWS. Escribe el siguiente mandato de SQLPlus para que veas los campos de la tablas USER_VIEWS: DESCRIBE user_views También puedes ver los views con la siguiente consulta: SELECT * FROM user_views. .UPDATE emp45 SET dept_id = 10 WHERE id = 10.