viernes, 30 de diciembre de 2011

TEMA 5. CLAUSULAS AVANZADAS DE SELECCIÓN.

.
1.       AGRUPACION DE ELEMENTOS. GROUP BY Y HAVING.
A veces nos interesa consultar los datos según grupos determinados. Para realizar el agrupamiento utilizaremos la clausula GROUP BY.
La sentencia SELECT posibilita agrupar uno o mas conjuntos de filas. El agrupamiento se lleva a cabo en en orden especificado, según su formato:

SELECT…
FROM…
GROUP BY columna1,columna2,columna3…
HAVING condicion
ORDER BY…

Los datos seleccionados en la sentencia SELECT que lleva el GROUP BY deben ser: una constant, una function de grupo (SUM,COUNT,AVG…), una columna expresada en el GROUP BY.
La clausula GROUP BY sirve para calcula propiedades de uno o mas conjuntos de filas. Del mismo modo que existe la condición de búsqueda WHERE para filas individuales, la condición HAVING, se utilizara para condición de búsqueda de grupos de filas.
HAVING se emplea para controlar cual de los conjuntos de filas se visualiza. Se evalua sobre la tabla que devuelve el GROUP BY. El HAVING nunca existirá sin existir GROUP BY.

EJEMPLO:
Visualizar a partir de la tabla EMPLE el numero de empleados que hay en cada departamento.
Para hacer esta consulta,tenemos que agupar las filas de la tabla EMPLE por departamento (GROUP BY DEPT_NO) y contarlas (COUNT(*)).La consulta será:

SELECT DEPT_NO, COUNT(*) FROM EMPLE GROUP BY DEPT_NO;

COUNT  es una function de grupo y da informacion sobre un grupo de filas, no sobre filas individuals de la tabla. La clausula GROUP BY DEPT_NO, obliga a COUNT a contar las filas que se han agrupado por cada departamento.

Si en la anterior consulta solo queremos visualizar los departamentos con mas de 4 empleados, tendíamos que escribir:

SELECT DEPT_NO, COUNT(*) FROM EMPLE GROUP BY DEPT_NO HAVING COUNT(*)>4;

EJERCICIOS DE REFUERZO TEMA 4: Funciones.

1.        Obtener el empleado del departamento 10 que mas gana.
SELECT* FROM EMPLE WHERE SALARIO=(SELECT MAX(SALARIO)FROM EMPLE WHERE DEPT_NO=10)
/
2.        Obtener los empleados del departamento 20 que ganan menos de la media de ese departamento.
SELECT * FROM EMPLE WHERE DEPT_NO=20 AND SALARIO<(SELECT AVG(SALARIO) FROM EMPLE)
/
3.        Obtener los empleados de oficio VENDEDOR que ganan mas de la media de ese oficio.
SELECT * FROM EMPLE WHERE SALARIO>(SELECT AVG(SALARIO) FROM EMPLE WHERE OFICIO='VENDEDOR')
/
4.        Obtener los empleados que ganan mas de la media de la media de salarios del departamento 20.
SELECT * FROM EMPLE WHERE SALARIO>(SELECT AVG(SALARIO)FROM EMPLE)
/
5.        Obtener los empleados que ganan mas de la media.
SELECT * FROM EMPLE  WHERE SALARIO>(SELECT AVG(SALARIO) FROM EMPLE)
/
6.        Con la tabla Notas_Alumnos obtener la mayor nota de la tabla.
SELECT MAX (GREATEST(NOTA1,NOTA2,NOTA3))FROM NOTAS_ALUMNOS
7.        Ahora obtener quien es el alumno con esa nota máxima.
SELECT NOMBRE_ALUMNO FROM NOTAS_ALUMNOS WHERE GREATEST(NOTA1,NOTA2,NOTA3)=(9)
/
8.        Determina cuales son los títulos de la tabla mistextos que tienen 3 palabras o mas.
SELECT TITULO FROM MISTEXTOS WHERE TITULO LIKE '%%%'
/
9.        Crea una expresión con la tabla mistextos en la que visualizas el autor y el titulo (limpio de todo) con el siguiente formato:
a.    <autor> escribió <libro>.
SELECT AUTOR||'HA ESCRITO'||TITULO FROM MISTEXTOS
/

10.     Obtener los empleados que llevan mas de 25 años trabajando en la empresa.
SELECT APELLIDO FROM EMPLE WHERE  MONTHS_BETWEEN(FECHA_ALT,SYSDATE)>(25*12)
/
11.     Obtener el empleado con mas antigüedad de cada departamento.
SELECT * FROM EMPLE E WHERE (MONTHS_BETWEEN(SYSDATE,FECHA_ALT)(SELECT MAX(MONTHS_BETWEEN(SYSDATE,FECHA_ALT)FROM EMPLE WHERE DEPT_NO=E.DEPT_NO)
/
12.     Obtener el empleado con menos antigüedad de cada oficio.
SELECT APELLIDO FROM EMPLE E WHERE FECHA_ALT=(SELECT MAX(FECHA_ALT)FROM EMPLE WHERE DEPT_NO=E.DEPT_NO)
/
13.     Muestra la fecha actual con el formato: ‘Hoy es 15 de abril de 2009’ (ej.)
SELECT TO_CHAR(SYSDATE,'"HOY ES "dd" DE "month" DE "yyyy"')FROM DUAL /


14.     Muestra la fecha actual con sólo 2 dígitos para el año y con el carácter guión ( - ) como separador entre días, meses y años.
ALTER SESSION SET NLS_DATE_FORMAT='dd-mm-yy'
/
15.     Obtener la fecha juliana actual.
SELECT TO_CHAR(SYSDATE,'J')FROM DUAL
/
16.     Obtener los días que quedan hasta el 1 de enero de 2012
SELECT TRUNC(MONTHS_BETWEEN('01/01/2012',SYSDATE)*30) FROM DUAL
/
17.     Obtener el número de días que llevamos este siglo
SELECT TRUNC(MONTHS_BETWEEN(SYSDATE,'01/01/2000')*30) FROM DUAL
/

Soluciones ejercicios Tema 4.SQL

EJERCICIOS TEMA4.FUNCIONES SQL.



Ø  A partir de la tabla EMPLE, visualiza cuantos apellidos empieza por la letra ‘A’.
SELECT COUNT (APELLIDO) FROM EMPLE WHERE APELLIDO LIKE 'A%'
/
Obtén el apellido o apellidos de empleados que empiecen por la letra ‘A’ y que tengan máximo salario de los que empiezan por la letra ‘A’.

SELECT APELLIDO FROM EMPLE WHERE APELLIDO LIKE 'A%' AND SALARIO= (SELECT MAX (SALARIO) FROM EMPLE WHERE APELLIDO LIKE ‘A %')
/


1.       Dada la tabla EMPLE, obtén el sueldo medio, el número de comisiones no nulas, el máximo sueldo y el mínimo sueldo de los empleados del departamento 30. Emplea el formato adecuado para la salida para las cantidades numéricas.
SELECT AVG(SALARIO), COUNT(COMISION), MAX(SALARIO), MIN(SALARIO) FROM EMPLE WHERE DEPT_NO= 30;
2.       Visualiza los temas con mayor número de ejemplares de la tabla LIBRERÍA y que tengan, al menos, una ‘E’ (pueden ser un tema o varios).

SELECT TEMA FROM LIBRERIA WHERE EJEMPLARES =(SELECT MAX(EJEMPLARES) FROM LIBRERIA )AND TEMA LIKE ('%E%')
/

3.       Dada la tabla MISTEXTOS, ¿Qué sentencia SELECT se debe ejecutar para tener este resultado?
RESULTADO__________________________________________________________
METODOLOGÍA DE LA PROGRAMACIÓN-^-^-^-^-
INFORMATICA BASICA-^-^-^-^-^-^-^-^-^-
SISTEMAS OPERATIVOS-^-^-^-^-^-^-^-^-^-
SISTEMAS DIGITALES-^-^-^-^-^-^-^-^-^-
MANUAL  DE C-^-^-^-^-^-^-^-^-^-^-^-^-^-

SELECT RPAD (LTRIM (RTRIM (TITULO,'-','^'), ‘‘) 45,'-1') FROM MIS TEXTOS
/

4.       Visualiza los títulos de la tabla MISTEXTOS sin los caracteres punto y comillas, y en minúsculas de dos formas conocidas.
SELECT LOWER (LTRIM(RTRIM(TITULO,'.'''''),''''))FROM MISTEXTOS
/
5.       Dada la tabla LIBROS, escribe la sentencia SELECT que visualice dos columnas, una con el autor y otra con el apellido del autor.

SELECT AUTOR, SUBSTR (AUTOR,0,INSTR(AUTOR, '.' , 1)-1)FROM LIBROS
/
6.       Escribe la sentencia select que visualice las columnas de autor y otra con el nombre del autor (sin el apellido, tabla LIBROS).

SELECT AUTOR,SUBSTR(AUTOR,0,INSTR(AUTOR,'.',1)+1)FROM LIBROS
/
7.       A partir de la tabla LIBROS, realice una sentencia select que visualice en una columna, primero el nombre del autor y luego su apellido.

SELECT SUBSTR(AUTOR,INSTR(AUTOR,',',1)+1),SUBSTR(AUTOR,0,INSTR(AUTOR,',',1)-1 ) FROM LIBROS
/

8.       A partir de la tabla LIBROS, realiza una sentencia select para que aparezcan los títulos ordenados por su número de caracteres.

SELECT TITULO FROM LIBROS ORDER BY LENGTH (TITULO)

9.       Dada la tabla NACIMIENTOS, realiza una sentencia select que obtenga la siguiente salida: NOMBRE,FECHANAC,FECHA_FORMATEADA, donde FECHA_FORMATEADA tiene el siguiente formato:
“Nació el 12 de mayo de 1982”

SELECT NOMBRE,FECHANAC,TO_CHAR(FECHANAC,'"NACIO EL "dd" DE "month" DE "yyyy"')FROM NACIMIENTOS
/

10.   Dada la tabla LIBRERÍA, haz una sentencia SELECT que visualice el TEMA, el ultimo carácter del tema que no sea blanco y el numero de caracteres de tema (sin contar los blancos de la derecha) ordenados por tema.
SELECT TEMA,SUBSTR(TEMA,INSTR(TEMA,' ')-1),INSTR(TEMA,' ')-1 FROM LIBRERIA ORDER BY TEMA
/
11.   A partir de la tabla NACIMIENTOS, visualiza en una columna el NOMBRE seguido de su fecha de nacimiento formateada(quita blancos del nombre)

SELECT NOMBRE,TO_CHAR(FECHANAC,'"NACIO EL,"DD" "MONTH" "YYYY"')FROM NACIMIENTOS
/

12.   Convierte la cadena ‘010721’a fecha y visualiza su nombre de mes en mayúsculas.
SELECT TO_CHAR (TO_DATE ('010712','DDMMYY'),'MONTH') FROM DUAL
/
13.   NO HAY QUE HACERLO

14.   A partir de la tabla EMPLE, obtén el apellido de los empleados que lleven más de 15 años trabajando.
SELECT APELLIDO FROM EMPLE WHERE SYSDATE-TO_NUMBER(TO_CHAR (FECHA_ALT,'YYYY'))>15
/
15.   Selecciona el apellido de los empleados de la tabla EMPLE que lleven más de 16 años trabajando en el departamento VENTAS.

SELECT APELLIDO FROM EMPLE WHERE MONTHS_BETWEEN (FECHA_ALT, SYSDATE)>16*15 AND DEPT_NO= (SELECT DEPT_NO FROM DEPART WHERE DNOMBRE='VENTAS')
/
Ø 

TEMA 4. FUNCIONES - - OTRAS FUNCIONES


1.       OTRAS FUNCIONES

·         DECODE(var,val1,cod1,val2,cod2…,valor por defecto)
Esta función sustituye un valor por otro. Si var es igual a cualquier valor de la lista (val1, val2), devuelve el correspondiente código (cod1, cod2), en caso contrario se obtiene el valor por defecto.
·         VSIZE (expresión): Devuelve el número de bytes que ocupa expresión.
·         DUMP(cadena[,formato[,comienzo[,longitud]]])
Visualiza el valor de cadena, que puede ser un literal o una expresión, en formato de datos interno.
·         USER: Devuelve el nombre del usuario actual.
·         UID: Devuelve el identificador del usuario actual.

TEMA 4. FUNCIONES - - FUNCIONES DE CONVERSIÓN

1.      4.   FUNCIONES DE CONVERSION.

·         TO_CHAR (fecha, formato): Convierte una fecha de tipo date a tipo varchar2.
·         TO_CHAR (número, formato): Convierte NUMBER a VARCHAR2.
·         TO_DATE (cad, formato): Convierte tipo VARCHAR2 a tipo DATE.
·         TO_NUMBER (cadena [, formato]: Convierte la cad a tipo NUMBER.

TEMA 4. FUNCIONES - - FUNCIONES PARA MANEJO DE FECHAS

113.       FUNCIONES PARA EL MANEJO DE FECHAS
·         SYSDATE: Devuelve la fecha del sistema.
·         ADD_MONTHS (fecha, n): Devuelve la fecha ‘fecha’, incrementada en n meses.
·         LAST_DAY: Devuelve la fecha del último día de mes que contiene ‘fecha’.
·         MONTHS_BETWEEN (fecha1, fecha2): Devuelve la diferencia de meses para fecha1 y fecha2.
·         NEXT_DAY (fecha_cad): Devuelve la fecha del primer día de la semana indicado por cad después de la fecha indicada por fecha.

jueves, 29 de diciembre de 2011

TEMA 4. FUNCIONES - - FUNCIONES DE CADENAS DE CARACTERES

1.       FUNCIONES DE CADENA DE CARACTERES.
Estas funciones trabajan con datos de tipo CHAR O VARCHAR2. Estos datos incluyen cualquier carácter alfanumérico: letras, números y caracteres especiales.

a.       FUNCIONES QUE DEVUELVEN VALORES CARÁCTER.
·         CHR(N): Devuelve el carácter cuyo valor binario es equivalente a ‘n’.
·         CONCAT(cad1,cad2): Devuelve la concatenación de cad1 con cad2. Es equivalente al operador ||.
·         LOWER(cad): Convierte cad a minúscula.
·         UPPER(cad): Convierte cad a mayúscula.
·         INITCAP(cad): Convierte cad a tipo “título”, la primera letra mayúscula las demás minúscula.
·         LPAD(cad1,n[,cad2]): Añade caracteres a la izquierda de cad1, hasta que alcanza una longitud de n caracteres.
·         RPAD(cad1,n[,cad2]): Añade caracteres a la derecha de cad1, hasta que alcanza una longitud de n caracteres.
·         LTRIM(cad [, set]): Suprime un conjunto de caracteres a la izquierda de cad. Set, es el conjunto de caracteres a suprimir.
·         RTRIM(cad [, set]): Suprime un conjunto de caracteres a la izquierda de cad. Set, es el conjunto de caracteres a suprimir.
·         REPLACE(cad,cadena_busqueda[,cadena_sustitucion]): Sustituye uno o varios caracteres de una cadena con 0 o mas caracteres. Devuelve ‘cad’ con cada ocurrencia de ‘cadena_busqueda’ sustituida por cadena_sustitucion.
·         SUBSTR(cad, m [,n]): Devuelve la subcadena cad, que abarca desde la posición indicada en m, hasta tantos caracteres como indique n.
·         TRANSLATE(cad1,cad2,cad3): Convierte caracteres de una cadena en caracteres diferentes, según un plan de sustitución marcado por el usuario.

b.      FUNCIONES QUE DEVUELVEN VALORES NUMÉRICOS
·         ASCII(cad): Devuelve el valor ASCII de la primera letra de la cadena cad.
·         INSTR(cad1,cad2[,comienzo[,m]]): Busca un conjunto de caracteres en una cadena.
·         LENGTH(cad): Devuelve el numero de caracteres o longitud de cadena.

TEMA 4. FUNCIONES - - FUNCIONES ARITMETICAS

1.       FUNCIONES ARITMETICAS
a.       FUNCIONES DE VALORES SIMPLES
Las funciones de valores simples son funciones sencillas que trabajan con valores simples, por ejemplo, son valores simples: un número, una variable o una columna de una tabla.
·         ABS(n): Devuelve el valor absoluto de n.
·         CEIL(n): Obtiene el valor entero inmediatamente superior o igual a n.
·         FLOOR(n): Es lo opuesto a CEIL devuelve el valor entero inmediatamente inferior o igual a n.
·         MOD(m,n): Devuelve el resto de m/n.
·         NVL(valor,expresión): Sustituye un valor nulo por otro valor.
·         POWER(m,exponente): Calcula la potencia de un numero.
·         ROUND: (numero,[,m]): Devuelve el valor de un numero redondeado a m decimales.
·         SIGN(valor): Indica el signo del valor.
·         SORT(n): Devuelve la raíz cuadrada de n.
·         TRUNC(numero,[m]): Trunca los números para que tengan un cierto numero de digitos de precisión.

b.      FUNCIONES DE GRUPOS DE VALORES
·         AVG (n): Calcula el valor medio de n ignorando valores nulos.
·         COUNT(*|expresión): Cuenta el numero de veces que la expresión evalua algún dato con valor no nulo.
·         MAX (expresión): Calcula el valor máximo de la expresión.
·         MIN(expresión): Calcula el minimo valor de la expresión.
·         SUM(expresión): Obtiene la suma de valores de la expresión distintos de nulo.
·         VARIANCE(expresión): Obtiene la varianza de los valores de expresión distintos de nulo.
DISTINCT Y ALL, son clausulas que se pueden utilizar en todas las funciones de grupo. DISTINCT hace una selección de filas cuyos valores en la columna especificada no están duplicados.ALL, recoge todas las filas aunque sus valores estén duplicados.
El formato COUNT con estas clausulas seria:
COUNT(*|[DISTINCT|ALL] expresión);
c.       FUNCIONES DE LISTAS
Trabajan sobre un grupo de columnas dentro de una misma fila.
·         GREATEST (valor1,valor2…): Obtiene el valor mayor de la lista.
·         LEAST(valor1,valor2…): Obtiene el valor menor de la lista.

Ejercicios refuerzo TEMA 3.Introduccion a SQL



1.        Con la tabla EMPLE calcula la media de los salarios de los registros del departamento ‘VENTAS’.

SELECT AVG(SALARIO) FROM EMPLE WHERE DEPT_NO=(SELECT DEPT_NO FROM DEPART
WHERE DNOMBRE='VENTAS')
/
2.        Visualiza los empleados del departamento de JIMENEZ.
SELECT * FROM EMPLE WHERE DEPT_NO IN(SELECT DEPT_NO FROM EMPLE WHERE APELLIDO='JIMENEZ')
/
3.        Visualiza los empleados con el mismo oficio que GIL.
SELECT * FROM EMPLE WHERE OFICIO IN(SELECT OFICIO FROM EMPLE WHERE APELLIDO='GIL')
/
4.        ¿Cuántos empleados hay en el departamento de ALONSO con el oficio de JIMENEZ?
SELECT COUNT(*) FROM EMPLE WHERE DEPT_NO=(SELECT DEPT_NO FROM EMPLE WHERE APELLIDO='ALONSO') AND (SELECT OFICIO FROM EMPLE WHERE APELLIDO= 'JIMENEZ')
/
5.        ¿Cuántos empleados hay en el departamento 10? (count(*))
SELECT COUNT(*) FROM EMPLE WHERE DEPT_NO=10
/

6.        Obtener los empleados que tienen una ‘o’ en su oficio en cualquier posición.
SELECT * FROM EMPLE WHERE OFICIO LIKE '%O%'
/

7.        Obtener los empleados que estén en el departamento 10 o en el 20.
SELECT * FROM EMPLE WHERE DEPT_NO IN(10,20)

8.        Obtener los temas que tienen más de 10 ejemplares.
SELECT TEMA FROM LIBRERIA WHERE EJEMPLARES>10
/
9.        ¿Quiénes son los empleados que ganan más en su oficio? (función Max.)
SELECT* FROM EMPLE E WHERE SALARIO=(SELECT MAX(SALARIO) FROM EMPLE WHERE OFICIO=E.OFICIO)
/
10.       ¿Quiénes son los empleados que ganan menos en su departamento? (función Min)
SELECT* FROM EMPLE E WHERE SALARIO=(SELECT MIN(SALARIO) FROM EMPLE WHERE DEPT_NO=E.DEPT_NO)
/
11.      ¿Qué alumnos han suspendido FOL?
SELECT * FROM ALUMNOS,ASIGNATURAS WHERE NOMBRE='FOL' AND DNI IN(SELECT DNI FROM NOTAS WHERE NOTA<5)
/
12.      ¿Qué alumnos han aprobado ‘Aplic. Entornos 4ªGen’?
SELECT*FROM ALUMNOS WHERE DNI =(SELECT DNI FROM NOTAS WHERE NOTA>=5 AND COD=(SELECT COD FROM ASIGNATURAS WHERE NOMBRE=
'Aplic. Entornos 4 Gen'))
/
13.      ¿Qué alumnos están matriculados en 1º?
SELECT * FROM ALUMNOS WHERE DNI =(SELECT DNI FROM NOTAS WHERE COD =(SELECT COD FROM ASIGNATURAS WHERE NOMBRE in ('prog.leng.estr.','sist.informaticos','analisis')))
/
14.      ¿Qué alumnos tienen asignaturas suspensas en 1º?
SELECT * FROM ALUMNOS WHERE DNI IN (SELECT DNI FROM NOTAS WHERE NOTA<5 AND COD IN
(SELECT COD FROM ASIGNATURAS WHERE NOMBRE IN ('ANALISIS','PROG.LENG.ESTRUCT','SIST.INFORMATICOS')))
/

15.      Visualiza los alumnos de Madrid que no tienen ninguna asignatura suspensa. (Observación: ¿Te sirve el ejercicio 12 de la página 73 del libro?)
SELECT * FROM ALUMNOS WHERE POBLA='Madrid' AND DNI IN (SELECT DNI FROM NOTAS WHERE NOTA<5)
/
16.      Busca los alumnos con asignaturas pendientes. Muestra además el nombre de la asignatura.
SELECT* FROM ALUMNOS AL,NOTAS N,ASIGNATURAS ASIG  WHERE AL.DNI=N.DNI AND ASIG.COD=N.COD AND N.NOTA<5
/
17.      Busca los alumnos que no tengan ninguna asignatura pendiente, muestra además todas sus notas, las asignaturas y ordenado por alumno.
SELECT* FROM ALUMNOS A,NOTAS N,ASIGNATURAS ASIG WHERE A.DNI=N.DNI AND ASIG.COD=N.COD AND N.DNI NOT IN(SELECT DISTINCT DNI FROM NOTAS WHERE NOTA<5)
/
18.      Busca las notas de alumnos suspensos de Madrid, su nombre, asignatura y nota.
SELECT * FROM ALUMNOS,NOTAS,ASIGNATURAS ASIG WHERE NOTA<5 AND POBLA='Madrid' AND ALUMNOS.DNI=NOTAS.DNI AND ASIG.COD=NOTAS.COD
/
19.      Obtener los artículos (PK: Articulo, Cod_fabricante, Peso, Categoria) que no tienen ni pedidos ni ventas.
SELECT ARTICULO, COD_FABRICANTE,PESO,CATEGORIA FROM ARTICULOS WHERE Cod_fabricante, Peso, Categoria NOT IN (SELECT Cod_fabricante, Peso, Categoria FROM PEDIDOS) AND Cod_fabricante, Peso, Categoria NOT IN (SELECT Cod_fabricante, Peso, Categoria FROM VENTAS)
/
20.      Obtener los artículos (PK: Articulo, Cod_fabricante, Peso, Categoria) que tienen pedidos y ventas
21.      Busca los artículos de fabricantes que tienen artículos vendidos. (tabla VENTAS)
SELECT ARTICULO,COD_FABRICANTE,PESO,CATEGORIA FROM ARTICULOS WHERE COD_FABRICANTE IN(SELECT COD_FABRICANTE FROM VENTAS)
/

Soluciones ejercicios Tema 3.Case

EJERCICIOS TEMA3.CASE-LIBRO
TABLA EMPLE Y DEPART
1.       Selecciona el apellido, oficio y localidad de los departamentos de aquellos empleados cuyo oficio sea ANALISTA.

SELECT APELLIDO, OFICIO, LOC FROM EMPLE, DEPART
WHERE OFICIO='ANALISTA'
/

2.       Obtén los datos de los empleados cuyo director (columna DIR de la tabla EMPLE) sea ‘CEREZO’

SELECT * FROM EMPLE
WHERE DIR= (SELECT EMP_NO FROM EMPLE WHERE OFICIO='DIRECTOR' AND APELLIDO= 'CEREZO')
/

3.       Obtén los datos de los empleados del departamento de VENTAS.
SELECT*FROM EMPLE
WHERE DEPT_NO= (SELECT DEPT_NO FROM DEPART WHERE DNOMBRE='VENTAS')
/
4.       Obtén los datos de los departamentos que no tengan empleados.
                SELECT * FROM DEPART
WHERE DEPT_NO NOT IN (SELECT DISTINCT DEPT_NO FROM EMPLE)
/
5.       Obtén los datos de los departamentos que tengan empleados.
SELECT*FROM DEPART
WHERE EXISTS (SELECT * FROM EMPLE, DEPART WHERE EMPLE.DEPT_NO=DEPART.DEPT_NO)
6.       Obtén el apellido y el salario de los empleados que superen todos los salarios de los empleados del departamento 20.
SELECT APELLIDO, SALARIO FROM EMPLE
WHERE SALARIO> (SELECT MAX (SALARIO) FROM EMPLE WHERE DEPT_NO=20)

TABLA LIBRERIA
7.      Visualiza el tema, estante y ejemplares de las filas de librería con ejemplares entre 8 y 15.
SELECT * FROM LIBRERIA WHERE EJEMPLARES BETWEEN 8 AND 15

8.      Visualiza las columnas tema, estante y ejemplares de las filas cuyo estante no este comprendido entre la “B” y la “D”.
SELECT TEMA, ESTANTE, EJEMPLARES FROM LIBRERIA
WHERE ESTANTE NOT BETWEEN 'B' AND 'D';

9.      Visualiza con una sola orden select todos los temas de librería cuyo número de ejemplares sea inferior a los que hay en medicina.

SELECT TEMA FROM LIBRERIA
 WHERE EJEMPLARES < (SELECT EJEMPLARES FROM LIBRERIA WHERE TEMA ='MEDICINA')
10.  Visualiza los temas de librería cuyo número de ejemplares no esté entre 15 y 20, ambos incluidos.
SELECT TEMA FROM LIBRERIA WHERE EJEMPLARES NOT BETWEEN 15 AND 20

11.  Visualiza todas las asignaturas que contengan tres letras “o” en su interior y tengan alumnos matriculados de “Madrid”.
SELECT * FROM ASIGNATURAS
WHERE NOMBRE LIKE '%O%' AND COD IN (SELECT COD FROM NOTAS
WHERE DNI IN (SELECT DNI FROM ALUMNOS WHERE POBLA='Madrid'))

12.  Visualiza los nombres de los alumnos de Madrid que tengan alguna asignatura suspensa.
SELECT APENOM FROM ALUMNOS
WHERE POBLA='Madrid' AND DNI IN (SELECT DNI FROM NOTAS WHERE NOTA<5);

13.  Muestra los nombres de alumnos que tengan la misma nota que tiene “Díaz Fernández, María” en FOL en alguna asignatura.

SELECT APENOM FROM ALUMNOS, NOTAS WHERE NOTA IN (SELECT NOTA FROM NOTAS WHERE COD IN
(SELECT COD FROM ASIGNATURAS WHERE NOMBRE='FOL')AND DNI IN (SELECT DNI FROM ALUMNOS
WHERE APENOM='Díaz Fernández, María') AND ALUMNOS.DNI=NOTAS.DNI)

14.  Obtén los datos de las asignaturas que no tengan alumnos.
SELECT*FROM ASIGNATURAS
WHERE COD NOT IN (SELECT COD FROM NOTAS)
/

15.  Obtén el nombre y apellido de los alumnos que tengan nota en la asignatura con código 1.
SELECT APENOM FROM ALUMNOS, NOTAS
WHERE ALUMNOS.DNI=NOTAS.DNI AND COD=1
16.  Obtén el nombre y apellido de los alumnos que no tengan nota en la asignatura con código 1.
SELECT UNIQUE APENOM FROM ALUMNOS
WHERE DNI NOT IN (SELECT DNI FROM NOTAS WHERE COD=1)