Está en la página 1de 12

UNIDAD 8.

RECUPERACION DE
DATOS EN SQL (SELECT)
1.CONSULTAS DE DATOS

2.SENTENCIA SELECT

3.SUBCONSULTAS

4.COMBINACIÓN DE TABLAS
1- CONSULTA DE LOS DATOS
Para consultar información de la B.D. utilizaremos una única sentencia
SELECT.
De una consulta se puede obtener: cualquier unidad de datos, todos los datos,
cualquier subconjunto de datos, cualquier conjunto de subconjunto de datos.
2- SENTENCIA SELECT
Formato:
SELECT [ALL|DISTINCT]
[expre_colum1,expre_colum2,...,expre_column | *]
FROM [nombre_tabla1, nombre tabla2,......,nombretablan]
[WHERE condición]
[ORDER BY expr_colum [DESC|ASC] [,expre_colum [DESC|
ASC]....];
- Expre_colum: puede ser una columna de una tabla, una constante, una
expresión aritmética, una función o varias funciones anidadas.
- FROM
Especifica la tabla o lista de tablas de donde se obtendrán los datos.
Ejemplo: SELECT Nom_alum, Nota FROM ALUMNOS;
Si el usuario que hace la consulta no es el propietario de la tabla deberá
especificarse el propietario.NBUSUARIO.NBTABLA.
Alias: Se puede asociar un alias a la tabla
Ejemplo: SELECT A.Nom_alum, A.Nota FROM ALUMNOS A;
- WHERE
Obtiene las filas que cumplen la condición expresada.
Formato: expresión operador expresión
Expresión puede ser una constante, una expresión aritmética, un valor
NULL o un nombre de columna. Se pueden utilizar los operadores de
comparación y los operadores lógicos.

Operadores de comparación:

✔ = > < >= <= != <>

✔ IN, NOT IN, BETWEEN, NOT BETWEEN

✔ LIKE
Estos se pueden combinar con los operadores lógicos AND, NOT y OR.
Ejemplos: WHERE NOTA=5
WHERE (NOTA<=10) AND (CURSO=1)
WHERE (NOTA IS NULL) OR (UPPER (NOM_ALUM) =
‘PEDRO’)
- ORDER BY especifica el criterio de clasificación de la consulta. Prevalece el de
la izquierda cuando hay varios atributos.
ORDER BY expre_columna [DESC|ASC] [,expre_columna [DESC|
ASC]...]
Ejem: SELECT * FROM ALUMNOS ORDER BY NOTA/5;
- ALL
Recupera todas las filas, aunque algunas estén repetidas. Es la opción por
omisión.
- DISTINCT
Sólo recupera las filas que son distintas.
Ejemplo: SELECT DEPT_NO FROM EMPLE;
SELECT DISTINCT DEPT_NO FROM EMPLE;

EJEMPLOS (COLUMNAS-FILAS-ALIAS)
Veamos la estructura de las tablas EMPLE y DEPART
DESC EMPLE;
DESC DEPART;

Selección de columnas:
Consultar todas las filas con todas sus columnas de EMPLE Y DEPART.

Seleccionar número y nombre del departamento de la tabla DEPART

Selección de algunas filas:


Seleccionamos de la tabla EMPLE a todos los empleados del departamento
20. Además, la consulta debe aparecer ordenada por APELLIDO. Los
campos que hay que consultar son: número de empleado, apellido, oficio y
número de departamento.
Consulta de los empleados cuyo oficio sea ‘ANALISTA’ ordenado por
Número de empleado:

Seleccionar de la tabla EMPLE aquellas filas del departamento 20 y cuyo


oficio sea ‘ANALISTA’. La consulta se ha de ordenar de modo descendente
por APELLIDO y también de manera descendente por número de empleado
(EMP_NO).

Utilización de alias de columnas: cuando el nombre es demasiado largo, corto o


críptico. Se puede cambiar en una consulta SELECT creando un alias. Se pone
entre comillas dobles.
SELECT DNOMBRE “Departamento”, DEPT_NO “Número Departamento”
FROM DEPART;

EJEMPLOS de operadores aritméticos.


Disponemos de la tabla NOTAS_ALUMNOS, que contiene las notas de los
alumnos de primer curso de ciclo DAI obtenidos en los tres módulos.
Mirar la descripción de la tabla, y su contenido
Obtener la nota media de cada alumno. Visualizaremos para cada uno de
ellos su nombre y su nota media. Etiquetar los datos.

Ejemplo de op de comparación y lógicos.


A partir de la tabla NOTAS_ALUMNOS, deseamos obtener aquellos
nombres de alumnos que tengan un 7 en NOTA1 y cuya media sea mayor
que 6
EJEMPLOS de op de comparación de cadenas de caracteres se utiliza
el operador LIKE con los caracteres (% y _).
✔ A partir de la tabla EMPLE. Obtener aquellos apellidos que empiecen
por una ‘J’
✔ Obtener aquellos apellidos que tengan una R en la segunda posición

✔ Obtener aquellos apellidos que empiecen por A y tengan una O en su


interior
✔ Mirar la descripción de la tabla librería

✔ Consulta las filas de la tabla LIBRERIA cuyo tema es ‘Labores’

✔ Hacemos lo mismo, pero ahora manejando el operador LIKE ¿Qué


pasa?

EJEMPLOS NOT NULL Y NULL

Se dice que una columna de una fila es NULL si está completamente


vacía.
Para comprobarlo emplearemos la expresión columna IS NULL
Si queremos comprobar si no es nulo emplearemos IS NOT NULL.

Ejemplo: Consultar en la tabla EMPLE los apellidos de los empleados


cuya comisión es NULL

EJEMPLO COMPROBACIONES CON CONJUNTOS DE VALORES (IN Y


BETWEEN)
Hasta ahora todas las comprobaciones lógicas que hemos visto comparan
una columna de una expresión con un valor, pero también esta comparación
se puede hacer con una lista de valores utilizando los operadores IN y
BETWEEN.

✔ IN

Nos permite comprobar si una expresión pertenece o no a un conjunto de


valores, su formato es:
<expresión> [NOT] IN (lista de valores separados por comas)
Ejemplo: Consultar los apellidos de la tabla EMPLE cuyo número de
departamento sea 10 ó 30:
Consultar los apellidos de la tabla EMPLE cuyo número de departamento
no sea ni 10 ni 30:

Consultar los apellidos de la tabla EMPLE cuyo oficio sea ‘VENDEDOR’,


‘ANALISTA’ O ‘EMPLEADO’:

✔ BETWEEN

El operador BETWEEN comprueba si un valor está comprendido o no


(NOT) dentro de un rango de valores. Su formato es:
<expresión> [NOT] BETWEEN valor_inicial AND valor_final
Ejemplo:
A partir de la tabla EMPLE obtener el apellido y el salario de los
empleados cuyo SALARIO esté comprendido entre 1500 y 2000

Lo que no este comprendido:

EJEMPLOS COMBINACIÓN DE OPERADORES AND Y OR


Ejemplos:
A partir de la tabla EMPLE. Obtener el APELLIDO, SALARIO y DEPT_NO de
los empleados cuyo salario sea mayor de 2000 en los departamentos 10 o 20.
3- SUBCONSULTAS
A veces para realizar alguna operación de consulta, necesitamos los datos
devueltos por otra consulta (Una SELECT dentro de otra SELECT).
Por ejemplo, queremos obtener los datos de los empleados que tienen el
mismo oficio que PEPE.
Una subconsulta será una SELECT incluida en una cláusula WHERE
SELECT .............. FROM .................
WHERE columna operador_comparativo = | in
(SELECT .........);

Ejemplo: Con la tabla EMPLE, obtener el APELLIDO de los empleados con el


mismo oficio que ‘GIL’.
SELECT APELLIDO FROM EMPLE WHERE OFICIO = (SELECT
OFICIO FROM EMPLE WHERE APELLIDO=’GIL’);
Hay subconsultas que generan valores simples: cuando devuelven una fila o
valor simple como la anterior. En estos casos se puede emplear el operador =.
Pero hay otras subconsultas que devuelven más de una fila no se puede
utilizar = hay que utilizar IN en la cláusula WHERE.
Ejemplo: Obtener los apellidos de los empleados cuyo oficio coincida con
algún oficio del departamento 20;
SELECT APELLIDOS FROM EMPLE WHERE OFICIO IN (SELECT
OFICIO FROM EMPLE WHERE DEPT_NO = 20);
EJERCICIOS:
1) En las tablas EMPLE y DEPART, queremos consultar los datos de los
empleados que trabajen en ‘MADRID’ y ‘BARCELONA’.
SELECT * FROM EMPLE WHERE DEPT_NO IN (SELECT DEPT_NO
FROM DEPART WHERE LOC IN (MADRID’,‘BARCELONA’));

2) Consultar los apellidos y oficios de todos los empleados del departamento


30 cuyo trabajo sea idéntico al de cualquiera de los empleados del
departamento de VENTAS.
SELECT APELLIDOS , OFICIO FROM EMPLE WHERE DEPT_NO = 30 AND
OFICIO IN (SELECT OFICIO FROM EMPLE WHERE DEPT_NO = (SELECT
DEPT_NO FROM DEPART WHERE DNOMBRE =’VENTAS’));

2) Obtener el apellido de los empleados con el mismo oficio y salario que


‘GIL’. En esta consulta se introduce una variante, hasta ahora las
subconsultas nos devolvian una columna, pero también pueden devolver
más de una. En este caso la subconsulta devuelve oficio y salario.
SELECT APELLIDO FROM EMPLE WHERE
(OFICIO,SALARIO)=(SELECT OFICIO,SALARIO FROM EMPLE WHERE
APELLIDO=’GIL’);

● Si se detallan varios campos en la cláusula WHERE, se deben


encerrar entre paréntesis y han de coincidir en número y tipo de
datos con la sentencia SELECT de la consulta interior.

● También se podría haber puesto:

SELECT APELLIDO, SALARIO FROM EMPLE WHERE OFICIO =


(SELECT OFICIO FROM EMPLE WHERE APELLIDO=’GIL’) AND
SALARIO = (SELECT SALARIO FROM EMPLE WHERE
APELLIDO=’GIL’);
4- COMBINACIÓN DE TABLAS
A veces las consultas no se realizan en una sola tabla, sino que
necesitamos datos de varias tablas, entonces procedemos así:
SELECT columnas de las tablas citadas
FROM tabla1, tabla2,...
WHERE tabla1.columna=tabla2.columna;
Consideraciones:
- Es posible unir tantas tablas como queramos
- En la cláusula SELECT se puede citar columnas de todas ellas
- Si hay columnas con el mismo nombre en distintas tablas se
especificará la columna con NombreTabla.NombreColumna
- Si se omite la cláusula WHERE el resultado será el producto cartesiano
de las dos tablas.
EJEMPLOS:
a) A partir de las tablas EMPLE y DEPART obtenemos los siguientes datos
de los empleados APELLIDO, OFICIO, número de empleado (EMP_NO),
nombre de departamento (dnombre) y localidad (loc). Estas tablas tienen
en común el campo dept_no por el que se combinan las tablas: (JOIN)
SELECT APELLIDO , OFICIO, EMPLE_NO, DNOMBRE, LOC FROM
EMPLE, DEPART WHERE EMPLE.DEPT_NO = DEPART.DEPT_NO;

b) Con las tablas ALUMNOS, ASIGNATURAS, NOTAS realizar una consulta


para obtener el nombre de alumno, su asignatura y su nota.
SELECT APENOM , NOMBRE, NOTA FROM ALUMNOS,
ASIGNATURAS, NOTAS WHERE ALUMNOS.DNI=NOTAS.DNI AND
NOTAS.COD=ASIGNATURAS.COD;

c) Obtener los nombres de los alumnos matriculados en FOL

SELEC APENOM FROM ALUMNOS, ASIGNATURAS, NOTAS WHERE


ALIMNOS.DNI=NOTAS.DNI AND NOTASCOD=ASIGNATURAS.COD AND NOMBRE =
‘FOL’;

EJERCICIOS PROPUESTOS
SELECT DE UNA SOLA TABLA:
1. Seleccionar de la tabla EMPLE aquellas filas cuyo APELLIDO empiece por
“A” y el OFICIO tenga una “E” en cualquier posición.
SELECT APELLIDO, OFICIO FROM EMPLE WHERE APELLIDO LIKE ‘A
%’ AND OFICIO LIKE ‘%E%’;
2. Visualizar el tema, estante y ejemplares de las filas de LIBRERÍA con
ejemplares comprendidos entre 8 y 15.
SELECT TEMA, ESTANTE, EJEMPLARES FROM LIBRERIA WHERE
EJEMPLARES BETWEEN 8 AND 15;
3. Visualizar las columnas TEMA, ESTANTE, EJEMPLARES de las filas cuyo
ESTANTE no esté comprendido entre la ‘B’ y la ‘D’.
SELECT TEMA, ESTANTE, EJEMPLARES FROM LIBRERIA WHERE
ESTANTE NOT BETWEEN 'B' AND 'D';
4. Visualizar 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;
SUBCONSULTAS:
5. Mostrar los empleados (nombre, oficio, salario y fecha de alta) que
desempeñen el mismo oficio que “JIMENEZ” o que tengan un salario mayor o
igual que “FERNANDEZ”.
SELECT APELLIDO, OFICIO, FECHA_ALT, SALARIO FROM EMPLE
WHERE OFICIO IN (SELECT OFICIO FROM EMPLE WHERE APELLIDO=
'JIMENEZ') OR SALARIO >= (SELECT SALARIO FROM EMPLE WHERE
APELLIDO = 'FERNANDEZ');
6. Mostrar en pantalla el nombre, oficio y salario de los empleados del
departamento de “FERNANDEZ” que tengan su mismo salario.
SELECT EMP_NO, OFICIO, SALARIO FROM EMPLE WHERE
(DEPT_NO, SALARIO) IN (SELECT DEPT_NO, SALARIO FROM EMPLE
WHERE APELLIDO = ‘FERNANDEZ’);
SELECT EMP_NO, OFICIO, SALARIO FROM EMPLE WHERE DEPT_NO
IN (SELECT DEPT_NO FROM EMPLE WHERE APELLIDO =
‘FERNANDEZ’) AND (SELECT SALARIO FROM EMPLE WHERE
APELLIDO = ‘FERNANDEZ’);
SELECT EMP_NO, OFICIO, SALARIO FROM EMPLE WHERE DEPT_NO
IN (SELECT DEPT_NO FROM EMPLE WHERE APELLIDO =
‘FERNANDEZ’)AND SALARIO IN (SELECT SALARIO FROM EMPLE
WHERE APELLIDO =‘FERNANDEZ’);
7. Presentar los nombres y oficios de los empleados que tienen el mismo
trabajo que “JIMENEZ”.
SELECT EMP_NO, OFICIO FROM EMPLE WHERE OFICIO IN (SELECT
OFICIO FROM EMPLE WHERE APELLIDO = 'JIMENEZ');
8. Visualizar todos los temas de LIBRERÍA cuyo número de ejemplar sea
inferior a los que hay en ‘Medicina’.
SELECT TEMA FROM LIBRERIA WHERE EJEMPLARES < (SELECT
EJEMPLARES FROM LIBRERIA WHERE TEMA = 'MEDICINA');
COMBINACION DE TABLAS:
9. Visualizar todas las asignaturas que contengan tres letras “o” en su interior
y tengan alumnos matriculados de “Madrid”.
SELECT ASIGNATURAS.NOMBRE FROM ASIGNATURAS INNER JOIN
NOTAS ON ASIGNATURAS.COD = NOTAS.COD INNER JOIN ALUMNOS
ON ALUMNOS.DNI = NOTAS.DNI WHERE ASIGNATURAS.NOMBRE
LIKE '%o%o%o%' AND ALUMNOS.POBLA = 'Madrid';
SELECT NOMBRE FROM ASIGNATURAS A, ALUMNOS AL, NOTAS N
WHERE NOMBRE LIKE '%o%o%o%' AND POBLA = ‘Madrid’ AND A.COD
= N.COD AND N.DNI = AL.DNI;
10. Visualizar los nombres de alumnos que tengan una nota entre 7 y 8 en la
asignatura de “FOL”.
SELECT ALUMNOS.APENOM FROM ALUMNOS INNER JOIN NOTAS ON
ALUMNOS.DNI = NOTAS.DNI INNER JOIN ASIGNATURAS ON
ASIGNATURAS.COD = NOTAS.COD WHERE ASIGNATURAS.NOMBRE =
'FOL' AND NOTAS.NOTA BETWEEN 7 AND 8;
SELECT APENOM FROM ALUMNOS AL, ASIGNATURAS A, NOTAS N
WHERE NOTA BETWEEN 1 AND 8 AND NOMBRE = ‘FOL’ AND A.COD =
N.COD AND N.DNI = A.DNI;
11. Visualizar los nombres de asignaturas que no tengan suspensos.
SELECT ASIGNATURAS.NOMBRE FROM ASIGNATURAS INNER JOIN
NOTAS ON ASIGNATURAS.COD = NOTAS.COD WHERE NOTAS.NOTA
>= 5;
SELECT NOMBERE FROM ASIGNATURAS WHERE COD IN (SELECT
COD FROM NOTAS WHERE NOTAS >=5)AND COD NOT UN (SELECT
COD FROM NOTAS WHERE NOTAS < 5);
12. Visualizar los nombres de alumnos de “Madrid” que tengan alguna
asignatura suspensa.
SELECT ALUMNOS.APENOM FROM ALUMNOS INNER JOIN NOTAS ON
ALUMNOS.DNI = NOTAS.DNI WHERE POBLA= 'Madrid' AND NOTA <=4;
13. Mostrar los nombres de alumnos que tengan la misma nota que tiene “Díaz
Fernández, María” en FOL en alguna asignatura.
SELECT ALUMNOS.APENOM FROM ALUMNOS INNER JOIN NOTAS ON
ALUMNOS.DNI = NOTAS.DNI INNER JOIN ASIGNATURAS ON
ASIGNATURAS.COD = NOTAS.COD WHERE ALUMNOS.APENOM IN
(SELECT APENOM FROM ALUMNOS WHERE ALUMNOS.APENOM =
'DÝaz Fernßndez, MarÝa') AND ASIGNATURAS.NOMBRE = 'FOL';
SELECT DISTINCT APENOM FROM ALUMNOS AL, NOTAS N
WHERE NOTA IN
(SELECT NOTA FROM NOTAS
WHERE DNI IN (SELECT DNI FROM ALUMNOS WHERE APENOM =
‘DÝaz Fernßndez, MarÝa’)
AND COD IN (SELECT COD FROM ASIGNATURAS WHERE NOMBRE =
‘FOL’))
AND N.DNI = AL.DNI;
14. Seleccionar el apellido, el oficio y la localidad de los departamentos donde
trabajan los ANALISTAS.
SELECT APELLIDO, OFICIO, LOC
FROM EMPLE, DEPART
WHERE OFICIO = ‘ANALISTA’ AND
EMPLE.DEPT_NO = DEPART.DEPT_NO;

TABLAS EMPLE y DEPART

1. Obtener los datos de los empleados cuyo director (columna DIR de EMPLE)
sea ‘CEREZO’.
SELECT NVL(DIR, 0), * FROM EMPLE WHERE DIR = 0;
2. Obtener los datos de los empleados del departamento de ‘VENTAS’.
SELECT * FROM DEPART WHERE DNOMBRE = 'VENTAS';
3. Obtener los datos de los departamentos que no tengan empleados.
4. Obtener los datos de los departamentos que tengan empleados.
5. Obtener el apellido y el salario de los empleados que superen todos los
salarios de los empleados del departamento 20. DESPUÉS DEL WHERE
PONER EL SALARIO > ALL
SELECT APELLIDO, SALARIO FROM EMPLE WHERE SALARIO > ALL
(SELECT SALARIO FROM EMPLE WHERE DEPT_NO = 20);
EL ALL NECESITA UNA SUBCONSULTA PARA Q FUNCIONE

TABLAS ALUMNOS, ASIGNATURAS y NOTAS

1. Obtener los datos de las asignaturas que no tengan alumnos.


2. Obtener el nombre y apellido de los alumnos que tengan nota en la
asignatura con código 1.
SELECT ALUMNOS.APENOM FROM ALUMNOS INNER JOIN NOTAS ON
ALUMNOS.DNI = NOTAS.DNI INNER JOIN ASIGNATURAS ON
ASIGNATURAS.COD = NOTAS.COD WHERE ASIGNATURAS.COD = 1;
3. Obtener el nombre y apellido de los alumnos que no tengan nota en la
asignatura con código 1.

También podría gustarte