M7 Taller de SQL

Anuncio
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
Descargar