TALLER DE SQL Componentes DB2 DML – Data manipulation language • • • • SELECT UPDATE INSERT DELETE DDL – Data Definition Language • CREATE • DROP CONTROL – Postulados de control • GRANT • REVOKE Postulado SELECT QUERY SECUENCIA REQUERIDA: SELECT NOMBRE, ANTIG, SALARIO FROM Q.EMP WHERE DEP = 38 ORDER BY NOMBRE - Dice que columnas usa - Dice que tabla(s) usa - Dice que renglón(es) usa - Dice el orden del resultado UN QUERY TIENE FORMATO LIBRE: SELECT NOMBRE, ANTIG, SALARIO FROM Q.EMP WHERE DEP = 38 ORDER BY NOMBRE Select ... From • SELECT(SELECCIONA) algunas de las columnas de una tabla • Nombra la columna(s) que desea en el resultado, en secuencia de izquierda a derecha • Múltiples nombres se separan con comas • FROM nombra la tabla(s) • Nombre simple: EMP • Nombre calificado completo: IDENT.EMP • Ejemplo: Resultado: SELECT NOMDEP, NUMDEP FROM Q.ORG NOMDEP -----------DIRECCION GUADALAJARA CHIHUAHUA MORELIA . . NUMDEP -----10 15 20 38 . . Selección de todas las columnas Para seleccionar todas las columnas de una tabla en la secuencia (de derecha a izquierda) como originalmente fueron definidas: SELECT * FROM Q.ORG Resultado: NUMDEP -----10 15 20 38 . . . NOMDEP GRTE -----------DIRECCION 160 GUADALAJARA 50 CHIHUAHUA 10 MORELIA 30 . . . . . . DIVISION ----------CORPORATIVO OCCIDENTE NORTE CENTRO . . . LOCALIDAD --------D.F. JALISCO CHIHUAHUA MICHOACAN . . . Where • RECUPERA CIERTOS RENGLONES • ESTABLECE LA(S) CONDICIONE(S) Liste unicamente los empleados del departamento 20 SELECT DEP, NOMBRE, PUESTO, COMIS FROM Q.EMP WHERE DEP = 20 Resultado: DEP ----20 20 20 20 NOMBRE ---------SANCHEZ PEREZ JASSO SOTO PUESTO -------GRTE VEND OFIC OFIC COMIS ----612.45 128.20 126.50 Ejemplos de Where • Selección de renglones con datos numéricos SELECT DEP, NOMBRE, PUESTO FROM Q.EMP WHERE DEP = 20 • Selección de renglones con datos tipo carácter SELECT NOMBRE, PUESTO, COMIS FROM Q.EMP WHERE NOMBRE = „SANCHEZ‟ Operadores de comparación = <> o ¬= > >= < <= ¬> ¬< Igual No igual Mayor que Mayor que o igual Menor que Menor que o igual No mayor que No menor que SELECT ID, COMIS FROM Q.EMP WHERE COMIS >= 1000 SELECT NOMBRE, DEP, ANTIG FROM Q.EMP WHERE PUESTO <> „GRTE‟ Características de nulidad Una columna que es .... • NOT NULL debe tener un valor, Blancos o ceros son permitidos • Una columna con valor NULO no requiere valor y es marcado como NULL NO CERO UN VALOR NULO (NULL) ES: NO BLANCO DESCONOCIDO Not Null With Default • Una columna puede ser descrita como “not null with default” • El sistema genera un valor de “default” si alguno no es especificado • Cero para una columna numérica • Blanco para una columna de longitud fija tipo carácter • Longitud cero para una columna de longitud variable tipo carácter Selección por nulos (Null) • Para seleccionar por valor nulo SELECT NOMBRE, PUESTO, COMIS FROM Q.EMP WHERE COMIS IS NULL Resultado: NOMBRE -----SANCHEZ MARES HERNANDEZ POZOS . PUESTO -----GRTE GRTE GRTE GRTE . COMIS ----- No nulos • Para seleccionar por valores no nulos SELECT NOMBRE, PUESTO, COMIS FROM Q.EMP WHERE COMIS IS NOT NULL Resultado: NOMBRE -----PEREZ ORDORICA QUEZADA RODRIGUEZ JASSO . PUESTO -----VEND VEND VEND VEND OFIC . COMIS ----612.45 846.55 650.25 1152.00 128.20 Múltiples condiciones • Condiciones múltiples para recuperación: AND OR • Dadas dos condiciones: PUESTO = „VEND‟ SALARIO < 17000 Para tener ambas condiciones: AND WHERE PUESTO = „VEND‟ AND SALARIO < 17000 Resultado: NOMBRE -----QUEZADA RODRIGUEZ DOMINGUEZ . . PUESTO -----VEND VEND VEND . . SALARIO -------16808.30 16502.83 15494.50 . . Múltiples condiciones WHERE (PUESTO = „VEND‟ AND COMIS > 1200) OR ANTIG > 10 Resultado: NOMBRE -----CASARES JIMENEZ GUTIERREZ ESPANA PUESTO -----VEND GRTE VEND VEND ANTIG ----6 12 13 7 COMIS ------1386.70 200.30 1285.00 NO ES LO MISMO QUE: WHERE PUESTO = „VEND‟ AND (COMIS > 1200 OR ANTIG > 10) Resultado: NOMBRE -----CASARES GUTIERREZ ESPANA PUESTO -----VEND VEND VEND ANTIG ----6 13 7 COMIS ------1386.70 200.30 1285.00 Postulado In • Para búsquedas en una lista de valores WHERE DEP IN (38,20,42) Es lo mismo que Usar múltiples OR en la misma columna: WHERE DEP = 38 OR DEP = 20 OR DEP = 42 Postulado Between • Para seleccionar un rango de valores SELECT NOMBRE, PUESTO, ANTIG FROM Q.EMP WHERE ANTIG BETWEEN 9 AND 11 Es lo mismo que SELECT NOMBRE, PUESTO, ANTIG FROM Q.EMP WHERE ANTIG >= 9 AND ANTIG <= 11 Resultado: NOMBRE -----HERNANDEZ LOPEZ LARIOS ZEPEDA CELEDON PUESTO -----GRTE GRTE GRTE VEND GRTE ANTIG ----10 10 9 9 10 Búsquedas parciales • Para encontrar en una porción de caracteres: LIKE % - Cero o cualquier número de caracteres ignorados _ - Solamente un carácter Ejemplos: WHERE NOMBRE LIKE ‘G%’ incluye: WHERE NOMBRE LIKE ‘%DA’ incluye: WHERE NOMBRE LIKE ‘%G%E%’ incluye: WHERE NOMBRE LIKE ‘_ _ _ _’ incluye: WHERE NOMBRE LIKE ‘_R%’ incluye: GUTIERREZ GONZALEZ GONGORA QUEZADA ZEPEDA RODRIGUEZ NOGUEZ DOMINGUEZ GUTIERREZ GONZALEZ CASO LUNA SOTO ORDORICA Uso de negación • Para negar el postulado de búsqueda WHERE NOMBRE NOT LIKE „G%‟ Excluye: GUTIERREZ GONZALEZ GONGORA WHERE ANTIG NOT BETWEEN 9 AND 11 Excluye ANTIG desde 9 hasta 11 Resultado de tablas Para ordenar los renglones ORDER BY Para descartar renglones duplicados SELECT DISTINCT Order By • Para ordenar los renglones en una secuencia específica Obtenga una lista alfabética de personas del Departamento 84 SELECT NOMBRE, PUESTO, ANTIG FROM Q.EMP WHERE DEP = 84 ORDER BY NOMBRE Resultado: NOMBRE --------CELEDON DOMINGUEZ ESPAÑA GONGORA PUESTO -----GRTE VEND VEND OFIC ANTIG ----10 5 7 5 Order By • Especifica nombre(s) de columnas, así como el orden ASCendente (default) o DESCendente SELECT NOMBRE, PUESTO, ANTIG FROM Q.EMP WHERE DEP = 84 ORDER BY PUESTO, ANTIG DESC Resultado: NOMBRE --------GONGORA ESPAÑA DOMINGUEZ CELEDON PUESTO -----OFIC VEND VEND GRTE ANTIG ----5 7 5 10 Order By ORDER BY ANTIG DESC, PUESTO Resultado: NOMBRE --------CELEDON ESPAÑA GONGORA DOMINGUEZ PUESTO -----GRTE VEND OFIC VEND ANTIG ----10 7 5 5 COMENTARIOS • Todas las columnas en el “ORDER BY” deben ser seleccionadas • Los renglones resultado son ordenados de acuerdo a las columnas del “ORDER BY” • Nulos son de orden más alto Select Distinct SELECT DEP FROM Q.EMP Para eliminar líneas duplicadas SELECT DISTINCT DEP FROM Q.EMP DEP ------20 20 38 38 15 38 10 . . DEP ------10 15 20 38 . . Select Distinct En múltiples columnas SELECT DISTINCT DEP, PUESTO FROM Q.EMP DEP -----10 15 15 15 20 20 20 38 .. PUESTO -----------GRTE OFIC GRTE VEND OFIC GRTE VEND OFIC Calculo de valores de Select + SUMA - SUBSTRACCION * MULTIPLICACION / DIVISION Obtenga el total de ingresos de cada persona del Departamento 20 SELECT ID, SALARIO, COMIS, SALARIO + COMIS FROM Q.EMP WHERE DEP = 20 Resultado: ID SALARIO COMIS ---------------------------------10 18357.50 20 18171.25 612.45 18783.70 80 13504.60 128.20 13632.80 190 14252.75 126.50 14379.25 Condiciones y calculo de valores en Select Obtenga las personas cuyo salario más comisión exceda $20,000 SELECT NOMBRE, SALARIO + COMIS FROM Q.EMP WHERE SALARIO + COMIS > 20000 Resultado: NOMBRE --------------------VAZQUEZ 20094.15 GUTIERREZ 21200.30 “Order By” y calculo de Valores en Select EJEMPLO 1: SELECT NOMBRE, SALARIO + COMIS FROM Q.EMP WHERE SALARIO + COMIS > 20000 ORDER BY 2 DESC Resultado: NOMBRE --------------------GUTIERREZ 21200.30 VAZQUEZ 20094.15 EJEMPLO 2: SELECT PUESTO, SALARIO + COMIS FROM Q.EMP ORDER BY PUESTO, 2 PRIMER LABORATORIO Select avanzado FUNCIONES DE COLUMNA • Resume datos de una columna • El resultado no contiene el detalle de renglones individuales SOLO PARA DATOS NUMERICOS SUM – Total del valor en una columna AVG – Promedio de los valores en una columna PARA CUALQUIER TIPO DE DATO MIN – El más bajo valor en una columna MAX – El más alto valor en una columna COUNT – Número de ocurrencias Uso de Sum, Avg, Max, Min EJEMPLO: SELECT SUM(SALARIO), AVG(SALARIO), MIN(COMIS), MAX(COMIS) FROM Q.EMP WHERE DEPT = 66 Resultado: ------------------------------------------86076.20 17215.240000000 55.50 844.00 • El resultado no contiene el detalle de renglones individuales • Los valores nulos son excluidos • Escala y precisión decimal derivan de la característica de columna • Se puede expresar AVG(SALARIO + COMISION) Postulado Count COUNT(*) Número de renglones que cumplen una condición COUNT(DISTINCT nombre-columna) - Número de valores únicos de una columna. Los valores nulos no son contados Cuente los departamentos y personas, donde el total de salario de las personas exceda $18000 y liste su salario promedio SELECT COUNT(DISTINCT DEP), COUNT(*), AVG(SALARIO) FROM Q.EMP WHERE SALARIO > 18000 Resultado: ----------------------------------8 16 19604.190625000 Uso de literales SELECT AVG(COMIS), SUM(COMIS) FROM Q.EMP Resultado: -------------------------513.31 12319.45 SELECT „AVG:‟, AVG(COMIS), „SUM:‟, SUM(COMIS) FROM Q.EMP Resultado: --------------------------------AVG: 513.31 SUM: 12319.45 Uso de Group By Con “GROUP BY”, una función de columna resulta en un solo valor por cada grupo y por cada función SELECT SUM(SALARIO), SUM(COMIS) FROM Q.EMP WHERE PUESTO <> „GRTE‟ GROUP BY DEP SELECT DEP, SUM(SALARIO), SUM(COMIS) FROM Q.EMP WHERE PUESTO <> „GRTE‟ GROUP BY DEP ----------------------41269.53 1468.70 45928.60 867.15 59778.80 1913.30 . . . . DEP -------------------------15 41269.53 1468.70 20 45928.60 867.15 38 59778.80 1913.30 Group By ... Order By • Para cambiar el orden de los resultados SELECT DEP, SUM(SALARIO), SUM(COMIS) FROM Q.EMP WHERE PUESTO <> „GRTE‟ GROUP BY DEP ORDER BY 3 Resultado: DEP ------------------------------20 45928.60 867.15 . . . . . . 15 41269.53 1468.70 . . . . . . 38 59778.80 1913.30 Group By... Having PARA PONER CONDICIONES EN GRUPOS SELECT ... FROM ... WHERE ... FILTROS GROUP BY ... HAVING ... WHERE - Selecciona renglones HAVING - Selecciona grupos Ejemplos de Having DEP SELECT DEP, SUM(SALARIO) FROM Q.DEP GROUP BY DEP SELECT DEP, SUM(SALARIO) FROM Q.EMP GROUP BY DEP HAVING SUM(SALARIO) > 65000 ---------------10 83463.45 15 61929.33 20 64286.10 38 77285.55 42 58369.05 . . . . DEP ---------------10 83463.45 38 77285.55 . . . . Ejemplos de Having (Continúa) Obtenga el salario promedio de los no gerentes por departamento, de todos los departamentos que tengan más de tres no gerentes SELECT DEP, AVG(SALARIO) FROM Q.EMP WHERE PUESTO <> „GRTE‟ GROUP BY DEP HAVING COUNT(*) > 3 Obtenga el salario promedio de los no gerentes por departamento, de aquellos que no tienen más de 5 años de experiencia. Organice el resultado desde el salario promedio más alto SELECT DEP,AVG(SALARIO) FROM Q.EMP WHERE PUESTO <> „GRTE‟ GROUP BY DEP HAVING MIN(ANTIG) <= 5 ORDER BY 2 DESC Funciones escalares • Operan sobre líneas individuales • Producen un solo valor • Funciones de columna pueden ser usadas como argumentos de funciones escalares • Las funciones escalares pueden ser usadas como argumentos de funciones de columna Substring SELECT NOMDEP, SUBSTR(NOMDEP,1, 4) FROM Q.ORG NOMDEP -----CORPORATIVO GUADALAJARA CHIHUAHUA MORELIA QUERETARO . . SELECT NUMDEP, DIVISION FROM Q.ORG WHERE SUBSTR(DIVISION,6) = „TE‟ NUMDEP -----51 -----CORP GUAD CHIH MORE QUER . . DIVISION -------SURESTE Substring NOTAS: • Sí longitud no es especificada, substring toma hasta el final de la string • Sí la especificación del inicio en substring se encuentra más allá del final de la string, esto causará un error • Si la especificación del inicio en substring más la longitud, resultan más allá del final de la string esto causará un error • Substring de nulo es nulo Argumento Lenght SELECT NOMBRE, LENGTH(NOMBRE), PUESTO, LENGTH(PUESTO) FROM Q.EMP - longitud variable - longitud fija Resultado: NOMBRE PUESTO ---------- ------- ---------- ---SANCHEZ 7 GRTE 5 PEREZ 5 VEND 5 MARES 5 GRTE 5 . . . . . . . . Si el argumento es nulo, la longitud tiene valor nulo Argumento Value • El resultado es un valor no nulo en la lista de argumentos SELECT ID, COMIS, VALUE(COMIS, 0) FROM Q.EMP Resultado: ID ---10 20 30 40 . . COMIS ----------612.45 846.55 . . -----------0.00 612.45 0.00 846.55 . . • Todos los argumentos deben ser del mismo tipo de dato (todos tipo carácter o numérico) • Si todos los argumentos son nulos, el resultado en nulo Funciones de conversión DECIMAL, FLOAT, INTEGER - Conversión de datos numéricos DIGITS - Representación carácter de un valor numérico HEX - Representación carácter de dígitos hexadecimales SELECT DECIMAL(SALARIO,9,1), INTEGER(SALARIO) FROM EMP WHERE ID = 55 SALARIO (DEC(7,2)) 17506.76 17506.7 17506 Formato de datos Date/Time • Las columnas con formato DATE, TIME, TIMESTAMP son almacenadas internamente como decimal empacado, pero sin signo TIPO DE DATOS FORMATO INTERNO DATE yyyymmdd TIME hhmmss TIMESTAMP yyyymmddhhmmssnnnnnn Aritmética en SQL Date/Time • • • • Solamente suma y substracción No se puede sustraer Timestamp de Timestamp Puede usar MIN, MAX, COUNT No puede usar SUM, AVG USO DE LAS DURACIONES • Simple Time – time ---> Formato duración hhmmss (empacado decimal (6,0)) date – date ----> Formato duración yyyymmdd (empacado decimal (8,0)) • Mediante palabra Un número “n” seguido por una de las siguientes palabras: - YEARS, MONTHS, DAYS, HOURS, MINUTES, - SECONDS, MICROSECONDS Aritmética en SQL Date/Time • ADICION / SUBSTRACCION DE DURACIONES Fecha + duración_fecha - Resulta una fecha Ejemplo: FECHACOL1 + 3 MONTHS Hora + duración_hora - Resulta una hora Ejemplo: HORACOL1 – 30 MINUTES – 20 SECONDS Timestamp + duración_fecha o Duración_hora- Resulta como timestamp Ejemplos: TSTCOL + 2 DAYS – 3 HOURS TESTCOL + 50000 MICROSECONDS Aritmética en SQL Date/Time • SUBSTRAYENDO FECHAS Y HORAS Date – date - Resulta una duración FECHACOL1 – FECHACOL2 FECHACOL1 – „1984-12-20‟ Time – time HORACOL1 – HORACOL2 ‟11:30 PM‟ – HORACOL1 - Resulta una duración Funciones escalares Date/Time • Se usa la palabra CHAR para controlar el formato SELECT CHAR(HFIN, USA), CHAR(HFIN, ISO) FROM DT WHERE NOPROY = „AX001‟ Resultado: --------03:30 PM ----------15.30.00 • DAY, MONTH, YEAR, HOUR, MINUTE, SECOND, MICROSECOND - Extrae porciones de una fecha, hora o timestamp - El resultado es un entero binario SELECT DAY(FINICIO), MONTH(FINICIO), YEAR(FINICIO) FROM DT WHERE YEAR(FINICIO) > 1988 Resultado: -------------------31 1 1990 Funciones escalares Date/Time • DAYS Número de días desde Dic. 31, 0000 SELECT FFIN – FINICIO, DAYS(FFIN) – DAYS (FINICIO) FROM DT WHERE NOPROY = „AX001‟ Resultado: ----------------00150200 5538 • DATE, TIME Extrae fecha u hora de un timestamp Valores Current • CURRENT DATE – Fecha de hoy • CURRENT TIME – Hora actual del día • CURRENT TIMESTAMP – Fecha y hora actual convertida a Timestamp SELECT * FROM DT WHERE FINICIO < CURRENTDATE – 90 DAYS Join de tablas PRIMARY KEY ID 10 20 30 40 50 60 70 80 90 100 110 NOMBRE SANCHEZ PEREZ MARES ORDORICA HERNANDEZ QUEZADA RODRIGUEZ JASSO CASARES POZOS NOGUEZ FOREIGN KEY DEP 20 20 38 38 15 38 15 20 42 42 15 PRIMARY KEY NUMDE P 10 FOREIGN KEY NOMDEP GRTE DIRECCION 160 15 GUADALAJARA 50 20 CHIHUAHUA 10 38 MORELIA 30 42 QUERETARO 100 51 MERIDA 140 66 JALAPA 270 84 D.F. 290 Join • El Join es implementado por la cláusula FROM • El resultado puede contener columnas de cualquier tabla descrita en la cláusula FROM • Las tablas se relacionan por datos comunes – Mediante el “predicado Join” de la cláusula WHERE NOTA: El predicado Join podría ser la llave primaria de una tabla igual a la llave foránea de otra tabla, ejemplo: NUMDEP = DEP o GRTE = ID Múltiples de tablas Liste los nombres de cada departamento con el nombre de su gerente SELECT NOMDEP, NOMBRE FROM Q.EMP, Q.ORG WHERE GRTE = ID Q.ORG NOMDEP Q.EMP GRTE . . JALAPA MERIDA . Resultado: DIVISION . . 270 140 . . . GOLFO . . NOMDEP NOMBRE -------------------------CHIHUAHUA SANCHEZ MORELIA MARES GUADALAJARA HERNANDEZ QUERETARO POZOS MERIDA FERNANDEZ DIRECCION MOLINAR JALAPA LARIOS D.F. CELEDON ID 140 . 270 . . NOMBRE FERNANDEZ . LARIOS . . Múltiples tablas Liste el nombre del departamento y el nombre de su gerente por cada departamento en la división Golfo SELECT NOMDEP, NOMBRE FROM Q.EMP, Q.ORG WHERE DIVISION = „GOLFO‟ AND GRTE = ID PRECAUCION: No haga Join en tablas sin un predicado de Join SELECT A1, B1 FROM TBLA, TBLB TBLA A1 A2 RESULT R1 R2 B1 A A X X B A Y Y C B X B Y C X C Y A3 TBLB B2 B3 Join con más de dos tablas SELECT ID, NOMBRE, DEP, NOMDEP, NUMORD FROM Q.EMP, Q.ORG, Q.VENTAS WHERE DEP = NUMDEP AND ID = NUMVEND Resultado: ID NOMBRE DEP NOMDEP NUMORD ------------------------------------------20 PEREZ 20 CHIHUAHUA 3456 20 PEREZ 20 CHIHUAHUA 6667 20 PEREZ 20 CHIHUAHUA 3580 20 PEREZ 20 CHIHUAHUA 7010 40 ORDORICA 38 MORELIA 4567 Calificadores Q.EMP NUMERO 10 20 . . NOMBRE SANCHEZ PEREZ . . Q.ORG DEP 20 20 . . PUESTO GRTE VEND . . NUMERO 10 . . 20 . . NOMDEP DIRECCION . . CHIHUAHUA . . Para los gerentes, liste sus nombres, número y nombre de departamento GRTE 160 . . 10 . . Calificadores SOLUCION: • Calificando con el nombre de la tabla SELECT NOMBRE, Q.ORG.NUMERO, NOMDEP FROM Q.EMP, Q.ORG WHERE PUESTO = „GRTE‟ AND DEP = Q.ORG.NUMERO • Calificador abreviado: Correlaciona SELECT NOMBRE, O.NUMERO, NOMDEP FROM Q.EMP, Q.ORG O WHERE PUESTO = „GRTE‟ AND DEP = O.NUMERO Join de una tabla consigo misma Liste cada empleado que haya ganado más que su gerente CONCEPTUALMENTE: 1. Obtenga renglones de empleados de VTEMPL NOEMP NOMBRE ... SALARIO ... NOGRTE ---------------------------------------------150 VAZQUEZ 19456.50 140 2. Obtenga renglones de gerentes de VTEMPL NOEMP NOMBRE ... SALARIO ... NOGRTE ---------------------------------------------140 SANCHEZ 18357.50 050 3. Compare los valores de las dos columnas por salario 4. Si las condiciones de búsqueda son satisfactorias, ponga un renglón en la tabla resultado, entonces obtenga otra columna de empleado y procese éste, etc. Join de una tabla consigo misma SOLUCION: SELECT E.NOMBRE, E.SALARIO, M.NOMBRE, M.SALARIO FROM VTEMPL E, VTEMPL M WHERE E.NOGRTE = M.NUMEMP AND E.SALARIO > M.SALARIO NOTA: Los calificadores son requeridos porque: Se refieren a 2 renglones en la misma tabla y 2 nombres de columnas para ambos renglones Resultado: NOMBRE SALARIO NOMBRE SALARIO --------------------------------------------VAZQUEZ 19456.50 SANCHEZ 18457.50 . . . . . . . . . . . . Unión • Utilizado para mezclar los resultados de multiples queries RESULTADO SELECT A1, A4 FROM TBLA WHERE A2 = „Z‟ . . UNION SELECT B3, B4 + B2 FROM TBLB WHERE B1 >= „N‟ • • • • . . RESULTADO Ejecución en serie de queries . . . . Mismo número de columnas en los SELECT Los tipos de dato deben de corresponder para las comparaciones UNION mezcla renglones de resultados de tablas, eliminando renglones duplicados • UNION ALL es semejante a UNION, excepto que duplicados NO son eliminados y SORTS no son ejecutados Unión Obtenga los rangos de salarios de ventas y oficinas, si dimos a los oficinistas el 17% de aumento y al personal de ventas el 2% SELECT PUESTO, SALARIO * 1.17 FROM Q.EMP WHERE PUESTO = „OFIC‟ UNION SELECT PUESTO, SALARIO * 1.02 FROM Q.EMP WHERE PUESTO = „VEND‟ ORDER BY 2 DESC Resultado: PUESTO ----------------------VEND 21420.0000 . . . . . . VEND 17144.4660 OFIC 16918.2000 VEND 16832.8866 OFIC 16675.7175 Unión all vs Unión SELECT NOMBRE FROM Q.ASPIRANTE WHERE DIRECC LIKE „%D.F.‟ UNION ALL UNION SELECT APELLIDO FROM Q.ENTREVISTA WHERE DISP = „NOCONT‟ NOMBRE -----------JACOBO REYNALDO LEONARDO FRANCISCO RICARDO LEONARDO GASPAR NOMBRE ------------FRANCISCO GASPAR JACOBO LEONARDO REYNALDO RICARDO SEGUNDO LABORATORIO Subquery • ES UN SELECT DENTRO DE UNA CONDICION DE BUSQUEDA, DE ALGUN OTRO SELECT... • LOS RESULTADOS DEL SUBQUERY SERAN USADOS COMO VALOR(ES) DENTRO DEL SELECT EXTERNO Ejemplo de subquery Liste los empleados cuyo departamento esté bajo el departamento administrativo „A00‟ EMP APELLIDO SELECT APELLIDO, DEP FROM EMP WHERE DEP IN (SELECT NUMDEP FROM DEP WHERE ADMDEP = „A00‟ DEP NUMDEP EL USUARIO VE SOLO LOS RESULTADOS DEL SELECT DE MAS ALTO NIVEL VALORES DEL SUBQUERY SON REGRESADOS AL SELECT DE MAS ALTO NIVEL DEP ADMDEP Comentario de Subquery • PUEDEN ESTAR EN LA CLAUSULA WHERE O EN LA CLAUSULA HAVING • PUEDEN ESTAR ANIDADOS • DEBEN ESTAR HACIA EL LADO DERECHO DE LA CONDICION DE BUSQUEDA • DEBEN ESTAR ENCERRADOS ENTRE PARENTESIS • PUEDEN REGRESAR UNO O VARIOS VALORES DESDE UNA SOLA COLUMNA • NO PUEDE CONTENER UNION, UNION ALL U ORDER BY Subquery con un solo valor Liste los empleados cuyos salarios son más altos que el promedio de la compañía • Encontrar el salario promedio para la compañía (SUBQUERY) SELECT AVG(SALARIO) FROM Q.EMP 16675.64 • Compare cada salario de los empleados con el resultado SELECT NOMBRE, SALARIO FROM Q.EMP WHERE SALARIO > (SELECT AVG(SALARIO) FROM Q.EMP) Resultado: NOMBRE ----------SANCHEZ PEREZ . . SALARIO -------18357.50 18171.25 . . Subquery con un solo valor Liste los empleados con el salario más alto SELECT NOMBRE, SALARIO FROM Q.EMP WHERE SALARIO = (SELECT MAX(SALARIO) FROM Q.EMP) Resultado: NOMBRE SALARIO ----------- -------- MOLINAR 22959.20 Subquery en lista de valores: All Liste alfabéticamente los empleados cuyos salarios son más altos que el salario promedio de cada departamento • Encuentre el salario promedio por cada departamento Resultado: (SELECT AVG(SALARIO) FROM Q.EMP GROUP BY DEP) 20865.862500000 15482.332500000 16071.525000000 . 14592.262500000 . • Compare cada salario de los empleados con la lista de promedios de departamentos SELECT NOMBRE, SALARIO FROM Q.EMP WHERE SALARIO > ALL (SELECT AVG(SALARIO) FROM Q.EMP GROUP BY DEP) ORDER BY NAME Resultado: NOMBRE SALARIO ---------------------FERNANDEZ 21150.00 GUTIERRES 21000.00 JIMENEZ 21234.00 MOLINAR 22959.20 Subquery: Any o Some Liste alfabéticamente los empleados cuyos salarios son más altos que el salario promedio de cualquier departamento • Encuentre el salario promedio por cada departamento (SELECT AVG(SALARIO) FROM Q.EMP GROUP BY DEP) Resultado: 20865.862500000 15482.332500000 16071.525000000 . 14592.262500000 . • Compare cada salario de los empleados con la lista de los promedios de departamento SELECT NOMBRE, SALARIO FROM Q.EMP WHERE SALARIO > ANY (SELECT AVG(SALARIO) FROM Q.EMP GROUP BY DEP) ORDER BY NAME Resultado: NOMBRE SALARIO ---------------------DORIGA 19260.25 DOMINGUEZ 15454.50 ESPAÑA 17844.00 FERNANDEZ 21150.00 GONZALES 16858.20 Subquery: AnyAny-In Liste los gerentes de la División Golfo SELECT DEP, NOMBRE FROM Q.EMP WHERE ID = ANY (SELECT GRTE FROM Q.ORG WHERE DIVISION=„GOLFO‟) • El resultado de el subquery es una lista de gerentes de los departamentos de la división Golfo (30, 100 y 290) • IN es equivalente a una serie de „OR ... =‟ sobre una sola columna • IN puede ser sustituido por = ANY SELECT DEP, NOMBRE FROM Q.EMP WHERE ID IN (SELECT GRTE FROM Q.ORG WHERE DIVISION = „GOLFO‟) Subquery dentro de Having Liste aquellos departamentos donde el salario de los no gerentes sean mayores al promedio de los gerentes de la compañía. Incluya en primer lugar el salario promedio más alto SELECT DEP, AVG(SALARIO) FROM Q.EMP WHERE PUESTO = „GRTE‟ GROUP BY DEP HAVING AVG(SALARIO) > (SELECT AVG(SALARIO) FROM Q.EMP WHERE PUESTO = „GRTE‟) ORDER BY 2 DESC Resultado: DEP ---------------------66 16808.175000000 51 16235.200000000 84 15443.000000000 20 15309.530000000 Subquery correlacionado Liste los empleados cuyos salarios son más altos que el salario promedio de su departamento SELECT NOMBRE, SALARIO FROM Q.EMP CN WHERE SALARIO > (SELECT AVG(SALARIO) FROM Q.EMP WHERE DEP = CN.DEP) • Un subquery correlacionado es ejecutado por cada renglón recuperado por el SELECT externo Subquery falso/verdadero Liste la información de aquellos gerentes que ganen menos de $18,000 y cuyo nombre inicie con “MAR” SELECT ID, NOMBRE, SALARIO, DEP FROM Q.EMP WHERE PUESTO = „GRTE‟ AND NOMBRE LIKE „MAR%‟ AND EXISTS(SELECT * FROM Q.EMP WHERE PUESTO = „GRTE‟ AND SALARIO < 18000) Resultado: ID NOMBRE SALARIO DEP ------------------------------30 MARES 17506.75 38 • Verdadero/Falso en el SELECT interno • Prueba de existencia en el SELECT externo TERCER LABORATORIO Mantenimiento de datos • INSERT • UPDATE • DELETE Insert • De un solo renglón: INSERT INTO PROY VALUES („MA2114‟, „ ‟, „B01‟, „ „, NULL, CURRENT DATE, NULL) , otra opción: INSERT INTO PROY (NUMDEP, NUMPROY, NOMPROY, EMPRESP, FECINI) VALUES („B01‟, „MA2114‟, „ „, „ „, CURRENT DATE) Resultado: NUMPROY NOMPROY NUMDEP EMPRESP NEMPS FECINI FECFIN ...... ...... OP2011 ............ ............ Soporte sistemas ....... ....... E21 ...... ...... 000320 ...... ...... 001.00 ...... ...... 20000101 ...... ...... 20010101 OP2012 Soporte aplicaciones E21 000330 001.00 20000101 20010101 OP2013 Soporte BD E21 000340 001.00 20000101 20010101 ...... B01 ...... ...... ? ...... 20000920 ...... ? ....... MA2114 ............. Insert • De múltiples líneas: PROYPBA NUMPROY NOMPROY NUMDEP EMPRESP NEMPS FECINI FECFIN INSERT INTO PROYPBA SELECT * FROM PROY WHERE NUMDEP LIKE „B%‟ OR NUMDEP IN(„E1‟, „E21‟, „E31‟) Resultado: NUMPROY NOMPROY NUMDEP EMPRESP NEMPS FECINI FECFIN PL2100 Planeación B01 000020 001.00 20000101 20000915 OP1010 Operación E11 000090 005.00 20000101 20000501 OP2010 Soporte técnico E21 000100 004.00 20000101 20010101 OP2011 Soporte sistemas E21 000320 001.00 20000101 20010101 OP2012 Soporte aplicaciones E21 000330 001.00 20000101 20010101 OP2013 Soporte BD E21 000340 001.00 20000101 20010101 Update de columnas ANTES: NUMPROY NOMPROY NUMDEP EMPRESP NEMPS FECINI FECFIN ...... MA2113 ...... Control producción ...... D11 ...... 000090 ...... 005.00 ...... 20000215 ...... 20000201 PL2100 Planeación B01 000020 001.00 20000101 20000915 ...... OP2012 ...... Soporte aplicaciones ...... E21 ...... 000330 ...... 001.00 ...... 20000101 ...... 20010101 OP2013 Soporte BD E21 000340 001.00 20000101 20010101 ? ? ? MA2114 B01 UPDATE PROYPBA SET NEMPS * 2, FECFIN = NULL, FECINI = „1999-12-01‟ WHERE NUMDEP = „B01‟ DESPUES: NUMPROY NOMPROY NUMDEP EMPRESP NEMPS FECINI FECFIN ...... MA2113 ...... Control producción ...... D11 ...... 000090 ...... 005.00 ...... 20000215 ...... 20000201 PL2100 Planeación B01 000020 002.00 19991201 ? ...... OP2012 ...... Soporte aplicaciones ...... E21 ...... 000330 ...... 001.00 ...... 20000101 ...... 20010101 OP2013 Soporte BD E21 000340 001.00 20000101 20010101 ? 19991201 ? MA2114 B01 Update de columnas • A un segmento de renglones UPDATE EMP SET SALARIO = SALARIO + 300 WHERE PUESTO = „OFICI‟ • A todos los renglones UPDATE EMP SET ANTIG = ANTIG + 1 Delete de renglones ANTES: NUMPROY NOMPROY NUMDEP EMPRESP NEMPS FECINI FECFIN ...... MA2113 ...... Control producción ...... D11 ...... 000090 ...... 005.00 ...... 20000215 ...... 20000201 PL2100 Planeación B01 000020 002.00 19991201 ? ...... OP2012 ...... Soporte aplicaciones ...... E21 ...... 000330 ...... 001.00 ...... 20000101 ...... 20010101 OP2013 Soporte BD E21 000340 001.00 20000101 20010101 ? 19991201 ? MA2114 B01 DELETE FROM PROYPBA WHERE NUMDEP = „B01‟ DESPUES: NUMPROY NOMPROY NUMDEP EMPRESP NEMPS FECINI FECFIN ...... ...... ...... ...... ...... ...... ...... D11 000090 005.00 20000215 20000201 MA2113 Control producción ...... ...... ...... ...... ...... ...... ...... OP2012 Soporte aplicaciones E21 000330 001.00 20000101 20010101 OP2013 Soporte BD E21 000340 001.00 20000101 20010101 Delete de todos los renglones ANTES: NUMPROY NOMPROY NUMDEP EMPRESP NEMPS FECINI FECFIN ...... MA2113 ...... Control producción ...... D11 ...... 000090 ...... 005.00 ...... 20000215 ...... 20000201 PL2100 Planeación B01 000020 002.00 19991201 ? ...... OP2012 ...... Soporte aplicaciones ...... E21 ...... 000330 ...... 001.00 ...... 20000101 ...... 20010101 OP2013 Soporte BD E21 000340 001.00 20000101 20010101 ? 19991201 ? MA2114 B01 DELETE FROM PROYPBA NUMPROY NOMPROY NUMDEP DESPUES: EMPRESP NEMPS FECINI FECFIN FIN DE MODULO Derechos de autor • Este producto has sido elaborado por • Jorge Godínez Rodríguez. • Derechos reservados – Prohibida su reproducción parcial o total 84