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.