Unidad 4 - BD
Unidad 4 - BD
Unidad 4 - BD
Realización de consultas
1. La sentencia SELECT
Para recuperar o seleccionar los datos, de una o varias tablas puedes valerte del
lenguaje SQL, para ello utilizarás la sentencia SELECT, que consta de cuatro partes
básicas:
Clausulas opcionales:
ALL: para seleccionar todas las filas, estén o no, repetidas.
DISTINCT: Se usa para indicar que se devolverán solo los valores distintos en
una determinada columna.
En la cláusula FROM se definen los nombres de las tablas de las que proceden las
columnas.
Consulta combinada o JOIN: Si se utiliza más de una tabla, éstas deben aparecer
separadas por comas, para que la consulta combinada pueda realizarse, necesitaremos
aplicar una condición de combinación a través de una cláusula WHERE.
También puedes añadir el nombre del usuario que es propietario de esas tablas,
indicándolo de la siguiente manera:
USUARIO.TABLA
de este modo podemos distinguir entre las tablas de un usuario y otro (ya que esas
tablas pueden tener el mismo nombre).
También puedes asociar un alias a las tablas para abreviar, en este caso no es
necesario que lo encierres entre comillas.
Pongamos un ejemplo:
La cláusula WHERE en SQL es una sentencia que se utiliza para filtrar los
resultados de una consulta. La cláusula WHERE especifica una condición que
debe cumplirse para que un registro sea incluido en el resultado. Si un registro
no cumple la condición especificada en la cláusula WHERE, se omitirá del
resultado
FROM USUARIOS
WHERE sexo = 'M';
Debes saber que es posible ordenar por más de una columna. Es más, puedes ordenar
no solo por columnas sino a través de una expresión creada con columnas, una
constante (aunque no tendría mucho sentido) o funciones SQL.
Puedes colocar el número de orden del campo por el que quieres que se ordene en
lugar de su nombre, es decir, referenciar a los campos por su posición en la lista de
selección. Por ejemplo, si queremos el resultado del ejemplo anterior ordenado por
localidad:
SELECT EMPLEADO_DNI
FROM ESTUDIOS
ORDER BY UNIVERSIDAD DESC, AÑO
2. OPERADORES
Veíamos que en la cláusula WHERE podíamos incluir expresiones para filtrar el
conjunto de datos que queríamos obtener. Para crear esas expresiones necesitas
utilizar distintos operadores de modo que puedas comparar, utilizar la lógica o elegir
en función de una suma, resta, etc.
1. Relacionales o de comparación.
2. Aritméticos.
3. De concatenación.
4. Lógicos.
Los operadores de comparación son símbolos que se usan como su nombre indica para
comparar dos valores. Si el resultado de la comparación es correcto la expresión
considerada es verdadera, en caso contrario es falsa.
= Igualdad.
FROM actores a
- -el = no funciona!*/
SELECCIONA Todo de la tabla películas, y busca las que su título tenga como
segundo carácter una O,
SELECT *
FROM peliculas p
Además, cuando se utiliza un ORDER BY, los valores NULL se presentarán en primer lugar
si se emplea el modo ascendente y al final si se usa el descendente
SELECT nombre
FROM EMPLEADOS
WHERE SALARIO > 1000;
Ahora queremos aquellos empleados cuyo apellido comienza por R:
SELECT *
FROM clientes
WHERE SUBSTRING(apellidos, LOCATE(' ', apellidos) + 1) = 'Pérez';
SELECT*
FROM
clientes
WHERE
Operadores aritméticos y su
significado.
OPERADOR SIGNIFICADO
+ Suma
- Resta
* Multiplicación
/ División
SELECT SALARIO*1,05
FROM EMPLEADOS
WHERE SALARIO<=1000;
OPERADO
SIGNIFICADO
R
SELECT empleado_dni
FROM HISTORIAL_SALARIAL
WHERE salario<=800 OR salario>2000;
vamos a realizar una consulta donde obtengamos todos nombres de trabajos menos el de contable.
SELECT NOMBRE_TRAB
FROM TRABAJOS
WHERE NOMBRE_TRAB NOT IN ('CONTABLE');
2.4 PRECEDENCIA
Con frecuencia utilizaremos la sentencia SELECT acompañada de expresiones
muy extensas y resultará difícil saber que parte de dicha expresión se evaluará
primero, por ello es conveniente conocer el orden de precedencia que tiene Oracle:
SELECT APELLIDOS
FROM JUGADORES
WHERE APELLIDOS LIKE 'A%S%';
3. CONSULTAS CALCULADAS
En algunas ocasiones es interesante realizar operaciones con algunos campos
para obtener información derivada de éstos. Si tuviéramos un campo Precio,
podría interesarnos calcular el precio incluyendo el IVA o si tuviéramos los campos
Sueldo y Paga Extra, podríamos necesitar obtener la suma de los dos campos.
Estos son dos ejemplos simples, pero podemos construir expresiones mucho más
complejas. Para ello haremos uso de la creación de campos calculados.
Los operadores aritméticos se pueden utilizar para hacer cálculos en las consultas.
FROM USUARIOS;
4. FUNCIONES
Las funciones se pueden incluir en las cláusulas SELECT, WHERE y ORDER BY.
numéricas,
de cadena de caracteres,
de manejo de fechas,
de conversión,
otras
SELECT ABS(-17)
CEIL(n) se utiliza para redondear un número "n" al entero más cercano hacia
arriba. Si "n" ya es un número entero, la función CEIL(n) devolverá el mismo
número
FROM ventas;
FLOOR Se utiliza para redondear un número "n" al entero más cercano hacia
abajo. Si "n" ya es un número entero, la función FLOOR(n) devolverá el mismo
número
FROM tabla;
FROM DUAL;
FROM tabla;
4.2 Funciones de cadenas de caracteres
CONCAT: La función CONCAT se utiliza para concatenar dos o más cadenas de
caracteres.
SUBSTR: La función SUBSTR se utiliza para extraer una parte de una cadena de
caracteres. La sintaxis es la siguiente:
Donde "cadena" es la cadena de caracteres de la que se desea extraer una parte,
"inicio" es la posición inicial de la parte que se desea extraer, y "longitud" es la longitud
de la parte que se desea extraer. Si se omite "longitud", se extraerá la parte de la
cadena que empieza en la posición "inicio" y va hasta el final de la cadena.
UPPER y LOWER: Las funciones UPPER y LOWER se utilizan para convertir una cadena
de caracteres a mayúsculas o minúsculas, respectivamente. La sintaxis es la siguiente:
TRIM: La función TRIM se utiliza para eliminar espacios en blanco al principio y al final
de una cadena de caracteres.
LAST_DAY(fecha): Devuelve el último día del mes al que pertenece la fecha. El valor
devuelto es tipo DATE.
EXTRACT(valor FROM fecha): Extrae un valor de una fecha concreta. El valor puede
ser day, month, year, hours.
DECODE(expr1, cond1, valor1 [, cond2, valor2, ...], default ) Esta función evalúa una
expresión expr1, si se cumple la primera condición (cond1) devuelve el valor1, en caso
contrario evalúa la siguiente condición y así hasta que una de las condiciones se
cumpla. Si no se cumple ninguna condición se devuelve el valor por defecto que hemos
llamado default.
5. Consultas de resumen
La sentencia SELECT nos va a permitir obtener resúmenes de los datos de modo
vertical. Para ello consta de una serie de cláusulas específicas (GROUP
BY, HAVING) y tenemos también unas funciones llamadas de agrupamiento o de
agregado que son las que nos dirán qué cálculos queremos realizar sobre los datos
(sobre la columna).
Hasta ahora las consultas que hemos visto daban como resultado un subconjunto
de filas de la tabla de la que extraíamos la información. Sin embargo, este tipo de
consultas que vamos a ver no corresponde con ningún valor de la tabla sino
un total calculado sobre los datos de la tabla. Esto hará que las consultas de
resumen tengan limitaciones que iremos viendo.
Todas las funciones de agregado tienen una estructura muy parecida: FUNCIÓN ([ALL|
DISTINCT] Expresión) y debemos tener en cuenta que:
Si para la tabla Usuarios necesitamos sumar el nº total de créditos que tienen nuestros
jugadores. Con la función SUM, los valores de la columna crédito sería suficiente
siempre y cuando agrupáramos por cliente, de lo contrario obtendríamos el total de
todos los jugadores.
La función SUM solo puede usarse con tipos de dato numéricos. Si la columna contiene
valores nulos, estos no se tienen en cuenta. Si queremos que tenga en cuenta los null
como si fueran 0, hab´ra que usar COALESCE o IFNULL.
La función COUNT puede contar cualquier tipo de dato. Cuenta el nº de registros sin
tener en cuenta qué valores se almacenan. No cuenta registros que tienen campos
NULL a noser que expresión sea el carácter comodín asterísco *.
6. Agrupamiento de registros
Ya verás como en muchas ocasiones en las que utilizamos consultas de resumen nos va
a interesar calcular totales parciales, es decir, agrupados según un determinado
campo.
También podríamos tener una tabla clientes y obtener el número de veces que ha
realizado un pedido, etc.
En todos estos casos en lugar de una única fila de resultados necesitaremos una fila por
cada actividad, cada cliente, etc.
Podemos obtener estos subtotales utilizando la cláusula GROUP BY.
En la cláusula GROUP BY se colocan las columnas por las que vamos a agrupar. En la
cláusula HAVING se especifica la condición que han de cumplir los grupos para que se realice la
consulta.
Es muy importante que te fijes bien en el orden en el que se ejecutan las cláusulas:
Las columnas que aparecen en el SELECT y que no aparezcan en la cláusula GROUP BY deben tener
una función de agrupamiento. Si esto no se hace así producirá un error. Otra opción es poner en la
claúsula GROUP BY las mismas columnas que aparecen en SELECT.
7. Consultas multitabla
Las reglas para las composiciones son:
Puedes combinar una tabla consigo misma, pero debes poner de manera obligatoria un alias a uno
de los nombres de la tabla que vas a repetir.
Veamos un ejemplo, si queremos obtener el historial laboral de los empleados incluyendo nombres y
apellidos de los empleados, la fecha en que entraron a trabajar y la fecha de fin de trabajo si ya no
continúan en la empresa, tendremos:
Vamos a obtener el historial con los nombres de departamento, nombre y apellidos del empleado de
todos los departamentos:
7.1Composiciones externas
Imagina que tenemos en una base de datos guardadas en dos tablas la información de los
empleados de la empresa (Cod_empleado, Nombre, Apellidos, salario y Cod_dpto) por otro lado
los departamentos (Codigo_dep, Nombre) de esa empresa. Recientemente se ha remodelado la
empresa y se han creado un par de departamentos más pero no se les ha asignado los empleados.
Si tuviéramos que obtener un informe con los datos de los empleados por departamento, seguro que
deben aparecer esos departamentos, aunque no tengan empleados. Para poder hacer esta
combinación usaremos las composiciones externas.
¿Cómo es el formato? Muy sencillo, añadiremos un signo más entre paréntesis (+) en la igualdad
entre campos que ponemos en la cláusula WHERE. El carácter (+) irá detrás del nombre de la tabla
en la que deseamos aceptar valores nulos.
FROM peliculas
ON peliculas.idDirector = directores.codigo
/*2-Visualiza título y nombre y apellidos de los actores intervienen en cada
pelicula
* Entre películas y actores no hay ningún campo en común, por lo que habría
que enlazarlo con otra tabla, en este caso sería con la tabla actuaciones
primer enlazamos la tabla actores con actuaciones usando su nexo común
codActor con codigo actores, después hacemos otro inner join para unir la
tabla actuaciones con peliculas*/
FROM actores
ON actuaciones.codActor = actores.codigo
ON actuaciones.codPelicula = peliculas.codigo;
/*3-Muestra el nombre y dirección de los clientes que alquilaron películas
SELECT
clientes.nombre,
clientes.direccion
FROM clientes
ON alquileres.codCliente = clientes.codCliente
ON alquileres.codPelicula = peliculas.codigo
ON peliculas.idCategoria = categorias.idCategoria
SELECT clientes.nombre,clientes.direccion
FROM clientes
ON alquileres.codCliente = clientes.codCliente
ON peliculas.idCategoria = categorias.idCategoria
-----------------------------------------------------------------------------
*director */
FROM peliculas
ON peliculas.idDirector = directores.codigo;
/*En este caso se muestran todos los registros de los directores y las
películas,
FROM peliculas
ON peliculas.idDirector = directores.codigo;
FROM peliculas
UNION
FROM peliculas
-----------------------------------------------------------------------
-----------------------------------------------------------------------------
-
-----------------------------------------------------------------------------
SELECT MIN(num_publicaciones)
GROUP BY idUsuario)subConsulta);