Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Unidad 4 - BD

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 24

Unidad 4.

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:

 Cláusula SELECT seguida de la descripción de lo que se desea ver, es decir, de


los nombres de las columnas que quieres que se muestren separadas por
comas simples ( , ). Esta parte es obligatoria.
 Cláusula FROM seguida del nombre de las tablas de las que proceden las
columnas de arriba, es decir, de donde vas a extraer los datos. Esta parte
también es obligatoria.
 Cláusula WHERE seguida de un criterio de selección o condición. Esta parte es
opcional.
 Cláusula ORDER BY seguida por un criterio de ordenación. Esta parte también
es opcional.

SELECT [ALL | DISTINCT] columna1, columna2, ... FROM tabla1,


tabla2, ... WHERE condición1, condición2, ... ORDER BY ordenación;

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.

1.1 Clausula SELECT


Ya has visto que a continuación de la sentencia SELECT debemos especificar cada una
de las columnas que queremos seleccionar. Además, debemos tener en cuenta lo
siguiente:

 Se pueden nombrar a las columnas anteponiendo el nombre de la tabla de la


que proceden, pero esto es opcional y quedaría:
NombreTabla.NombreColumna

 Si queremos incluir todas las columnas de una tabla podemos utilizar el


comodín asterisco ("*"). Quedaría así: 
SELECT * FROM NombreTabla;

 También podemos ponerles alias a los nombres de las columnas. Cuando se


consulta una base de datos, los nombres de las columnas se usan como
cabeceras de presentación. Los alias se utilizan para proporcionar nombres más
descriptivos o convenientes para las columnas o las tablas en una consulta
SELECT F_Nacimiento "Fecha de Nacimiento" FROM USUARIOS;
 También podemos sustituir el nombre de las columnas por constantes,
expresiones o funciones SQL.
SELECT 4*3/100 "MiExpresión", Password FROM USUARIOS;

1.2 Clausula FROM


En la sentencia SELECT debemos establecer de dónde se obtienen las columnas que
vamos a seleccionar, para ello disponemos en la sintaxis de la cláusula FROM.

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: 

SELECT * FROM USUARIOS U;

1.3 CLAUSULA WHERE


Si queremos restringir esta selección a un subconjunto de filas debemos especificar
una condición que deben cumplir aquellos registros que queremos seleccionar. Para
poder hacer esto vamos a utilizar la cláusula WHERE.

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

A continuación de la palabra WHERE será donde pongamos la condición que han de


cumplir las filas para salir como resultado de dicha consulta.
El criterio de búsqueda o condición puede ser más o menos sencillo y para crearlo se
pueden conjugar operadores de diversos tipos, funciones o expresiones más o menos
complejas.

Si en nuestra tabla USUARIOS, necesitáramos un listado de los usuarios que son


mujeres, bastaría con crear la siguiente consulta:

SELECT nombre, apellidos

FROM USUARIOS
WHERE sexo = 'M';

1.4 CLAUSULA ORDER BY. ORDENACIÓN DE REGISTROS


En la consulta del ejemplo anterior hemos obtenido una lista de nombres y apellidos
de las usuarias de nuestro juego. Sería conveniente que aparecieran ordenadas por
apellidos, ya que siempre quedará más profesional además de más práctico. De este
modo, si necesitáramos localizar un registro concreto la búsqueda sería más rápida.
¿Cómo lo haremos? Para ello usaremos la cláusula ORDER BY.
ORDER BY se utiliza para especificar el criterio de ordenación de la respuesta a
nuestra consulta. Tendríamos:

SELECT [ALL | DISTINCT] columna1, columna2, ...


FROM tabla1, tabla2, ...
WHERE condición1, condición2, ...
ORDER BY columna1 [ASC | DESC], columna2 [ASC | DESC], …, columnaN
[ASC | DESC];

Después de cada columna de ordenación se puede incluir el tipo de ordenación


(ascendente o descendente) utilizando las palabras reservadas ASC o DESC. Por
defecto, y si no se pone nada, la ordenación es ascendente.

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.

En el siguiente ejemplo, ordenamos por apellidos y en caso de empate por nombre:

SELECT nombre, apellidos


FROM USUARIOS
ORDER BY apellidos, nombre;

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 nombre, apellidos, localidad


FROM usuarios
ORDER BY 3;
Si colocamos un número mayor a la cantidad de campos de la lista de selección,
aparece un mensaje de error y la sentencia no se ejecuta.
No todos los tipos de campos te servirán para ordenar, únicamente aquellos de tipo
carácter, número o fecha.

Utilizando las tablas y datos de la empresa JuegosCA descargados anteriormente, vamos a


realizar una consulta donde obtengamos de la tabla ESTUDIOS, DNI de los empleados
ordenados por Universidad descendente y año de manera ascendente.

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.

Oracle reconoce 4 tipos de operadores:

1. Relacionales o de comparación.
2. Aritméticos.
3. De concatenación.
4. Lógicos.

2.1 OPERADORES DE COMPARACIÓN/RELACIONALES


Los puedes conocer con otros nombres como relacionales, nos permitirán comparar
expresiones, que pueden ser valores concretos de campos, variables, etc.

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.

Tenemos los siguientes operadores y su operación

= Igualdad.

!=, < >, ^= Desigualdad.

< Menor que

> Mayor que.

<= Menor o igual que.

>= Mayor o igual que.

IN Igual que cualquiera de los miembros entre paréntesis.

NOT IN Distinto que cualquiera de los miembros entre paréntesis.


BETWEEN Entre. Contenido dentro del rango.

NOT BETWEEN Fuera del rango.

Se utiliza sobre todo con textos y permite obtener columnas


cuyo valor en un campo cumpla una condición textual. El
carácter "%" se utiliza como un comodín para hacer coincidir
LIKE '_abc%'
cualquier secuencia de caracteres pueden ser 0, incluyendo la
ausencia de caracteres.

El carácter "_" se utiliza como un comodín para hacer


coincidir con cualquier carácter individual.

IS NULL Devuelve verdadero si el valor del campo de la fila que examina es


nulo.

Aquí buscará los apellidos que empiecen por la letra F

SELECT codigo, nombre, apellidos

FROM actores a

WHERE (apellidos LIKE 'F%');

/*Like únicamente para caracteres comodín/especial como %;

- % puede haber 0 o infinitos caracteres;

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

WHERE (titulo LIKE '_O%');

/*Con _ :cualquier caracter, si pusieramos % estaríamos diciendo que puede


tener o no tener el primer caracter y no valdría */

El valor NULL significaba valor inexistente o desconocido y por tanto es tratado de forma


distinta a otros valores. Si queremos verificar que un valor es NULL no serán validos los
operadores que acabamos de ver. Debemos utilizar los valores IS NULL como se indica
en la tabla o IS NOT NULL que devolverá verdadero si el valor del campo de la fila no es
nulo.

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

Si queremos obtener aquellos empleados cuyo salario es superior a 1000€


podemos crear la siguiente consulta:

SELECT nombre
FROM EMPLEADOS
WHERE SALARIO > 1000;
Ahora queremos aquellos empleados cuyo apellido comienza por R:

SELECT nombre FROM EMPLEADOS

WHERE APELLIDO1 LIKE 'R %';


Clientes cuyo segundo apellido sea Perez

SELECT *
FROM clientes
WHERE SUBSTRING(apellidos, LOCATE(' ', apellidos) + 1) = 'Pérez';

SELECT*

FROM

clientes

WHERE

apellidos LIKE ("% Perez");

consulta donde obtengamos las universidades de Sevilla o Cádiz.

SELECT UNIV_COD, NOMBRE_UNIV


FROM UNIVERSIDADES
WHERE CIUDAD IN ('SEVILLA', 'CÁDIZ');

Fíjate que buscará aquellas ciudades que coincidan textualmente con


las que ponemos entre comillas.
2.2 OPERADORES ARITMÉTICOS Y DE CONCATENACIÓN
Aprendimos que los operadores son símbolos que permiten realizar distintos tipos de
operaciones. Los operadores aritméticos permiten realizar cálculos con valores
numéricos. Son los siguientes:

Operadores aritméticos y su
significado.

OPERADOR SIGNIFICADO

+ Suma

- Resta

* Multiplicación

/ División

Utilizando expresiones con operadores es posible obtener salidas en las


cuales una columna sea el resultado de un cálculo y no un campo de una tabla.
Mira este ejemplo en el que obtenemos el salario aumentado en un 5%  de
aquellos empleados que cobran menos de 1000€:

SELECT SALARIO*1,05
FROM EMPLEADOS
WHERE SALARIO<=1000;

Cuando una expresión aritmética se calcula sobre valores NULL, el resultado es el


propio valor NULL.

Para concatenar cadenas de caracteres existe el operador de concatenación (" | |


"). Oracle puede convertir automáticamente valores numéricos a cadenas para una
concatenación.

En la tabla EMPLEADOS tenemos separados en dos campos el primer y segundo


apellido de los empleados, si necesitáramos mostrarlos juntos podríamos crear la
siguiente consulta:

SELECT Nombre, Apellido1 || Apellido2


FROM EMPLEADOS;

Si queremos dejar un espacio entre un apellido y otro, debemos concatenar


también el espacio en blanco de la siguiente manera:

SELECT Nombre, Apellido1 || ' ' ||Apellido2


FROM EMPLEADOS

2.3 OPERADORES LÓGICOS


Habrá ocasiones en las que tengas que evaluar más de una expresión y necesites
verificar que se cumple una única condición, otras veces comprobar si se cumple
una u otra o ninguna de ellas. Para poder hacer esto utilizaremos los operadores
lógicos.

Tenemos los siguientes:

Operadores lógicos y su significado.

OPERADO
SIGNIFICADO
R

AND Devuelve verdadero si sus expresiones a derecha e izquierda son ambas


verdaderas.

OR Devuelve verdadero si alguna de sus expresiones a derecha o izquierda es


verdaderas.

NOT Invierte la lógica de la expresión que le precede, si la expresión es verdadera


devuelve falsa y si es falsa devuelve verdad

Fíjate en los siguientes ejemplos:


Si queremos obtener aquellos empleados en cuyo historial salarial tengan
sueldo menor o igual a 800€ o superior a 2000€:

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:

1. Se evalúa la multiplicación (*) y la división (/) al mismo nivel.


2. A continuación, sumas (+) y restas (-).
3. Concatenación (| |).
4. Todas las comparaciones (<, >, …).
5. Después evaluaremos los operadores IS NULL, IN NOT NULL, LIKE,
BETWEEN.
6. NOT.
7. AND
8. OR

Si quisiéramos variar este orden necesitaríamos utilizar paréntesis.

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.

Estos campos calculados se obtienen a través de la sentencia SELECT poniendo


a continuación la expresión que queramos. Esta consulta no modificará los valores
originales de las columnas ni de la tabla de la que se está obteniendo dicha
consulta, únicamente mostrará una columna nueva con los valores calculados. Por
ejemplo:

SELECT Nombre, Credito, Credito + 25


FROM USUARIOS;
Con esta consulta hemos creado un campo que tendrá como nombre la expresión
utilizada. Podemos ponerle un alias a la columna creada añadiéndolo detrás de la
expresión junto con la palabra AS. En nuestro ejemplo quedaría de la siguiente
forma:
SELECT Nombre, Credito, Credito + 25 AS CreditoNuevo

FROM USUARIOS;

4. FUNCIONES
Las funciones se pueden incluir en las cláusulas SELECT, WHERE y ORDER BY.

Las funciones se especifican de la siguiente manera:

NombreFunción [(parámetro1, [parámetro2, …)]

Puedes anidar funciones dentro de funciones.

Existe una gran variedad para cada tipo de datos:

 numéricas,
 de cadena de caracteres,
 de manejo de fechas,
 de conversión,
 otras

4.1 Funciones numéricas

ABS(n):Calcula el valor absoluto, el valor absoluto de un nº , es el mismo pero sin


tener en cuenta el signo

SELECT ABS(-17)

FROM DUAL;--dara como resultado 17

EXP(n):Calcula еn , es decir, el exponente en base e del número n.


Ejemplo: 

SELECT EXP(2) FROM DUAL; -- Resultado: 7,38

SELECT EXP(número) FROM tabla;

"número" es el valor numérico para el cual se desea calcular el exponencial, y


"tabla" es la tabla de la base de datos que contiene la columna con los valores
numéricos.

En el ejemplo proporcionado, se está utilizando la palabra clave "DUAL" en


lugar de una tabla real. DUAL es una tabla especial en Oracle que se puede
utilizar para realizar cálculos simples y no requiere el uso de una tabla real. En
otras bases de datos, puede ser necesario utilizar una tabla real en lugar de la
palabra clave DUAL

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

Devolverá una tabla con dos columnas: "fecha" y


"total_venta_redondeado".

La segunda columna contendrá el total de ventas redondeado hacia arriba


para cada venta.

SELECT fecha, CEIL(total_venta) as total_venta_redondeado

FROM ventas;

SELECT CEIL(17.4) FROM DUAL; -- Resultado: 18

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

SELECT FLOOR(17.4) FROM DUAL; -- Resultado: 17

El resultado de esta consulta sería 3, ya que la división de 10 entre 3 es 3.333..., y


la función FLOOR redondea hacia abajo el resultado al entero más cercano

SELECT FLOOR(10 / 3) FROM DUAL;

MOD(m,n) se utiliza para calcular el resto de la división entera de dos números


"m" y "n". El resultado de la función MOD(m,n) es el valor del resto de la división
de "m" entre "n".

SELECT MOD(10, 3) FROM DUAL;--daría como resultado 1

POWER(valor, exponente) se utiliza para calcular la potencia de un valor "valor"


elevado a un exponente "exponente". El resultado de la función POWER(valor,
exponente) es el valor de la potencia calculada.

SELECT POWER(valor, exponente) FROM tabla;

donde "valor" es el número base que se desea elevar a una potencia,


"exponente" es el exponente al que se desea elevar el número base.

SELECT POWER(2, 3) FROM DUAL;--resultado 8

En esta consulta, estamos utilizando la función POWER para calcular el interés


compuesto de un préstamo. Multiplicamos el valor del préstamo por la potencia
de (1 + tasa de interés) elevado al tiempo de duración del préstamo para
obtener el total a pagar al final del período de préstamo.
SELECT prestamo * POWER(1 + tasa_interes, tiempo) as total_a_pagar

FROM tabla;

ROUND(n, decimales) se utiliza para redondear un número "n" al número de


decimales especificado por "decimales". Si "decimales" no se especifica, la
función ROUND redondea "n" al número entero más cercano. Si "decimales" es
negativo, la función ROUND redondea "n" al múltiplo más cercano de 10
elevado a la potencia del valor absoluto de "decimales"

El resultado de esta consulta sería 4.72, ya que el número redondeado a dos


decimales más cercano es 4.72.

SELECT ROUND(4.7236, 2) FROM DUAL;

Redondear el resultado de la división de 10 entre 3 a dos decimales. El resultado


de esta consulta sería 3.33, ya que el resultado de la división es 3.333..., y el
número redondeado a dos decimales más cercano es 3.33.

SELECT ROUND(10 / 3, 2) as resultado_redondeado

FROM DUAL;

SIGN(n) se utiliza para obtener el signo de un número "n". El resultado de la


función SIGN(n) es un número entero que indica el signo de "n" de la siguiente
manera:

 Si "n" es mayor que cero, el resultado de la función SIGN(n) es 1.

 Si "n" es igual a cero, el resultado de la función SIGN(n) es 0.

 Si "n" es menor que cero, el resultado de la función SIGN(n) es -1.

SELECT SIGN(4,3) FROM DUAL;--devuelve 1

SELECT SIGN(-4,3) FROM DUAL;--devuelve -1

SELECT SIGN(0) FROM DUAL;-- devuelve 0

En esta consulta, estamos utilizando la función SIGN para obtener el signo de


un número y multiplicarlo por el valor absoluto de ese número, lo que nos da
como resultado el valor absoluto del número original.

SELECT ABS(n) * SIGN(n) as valor_absoluto

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.

SELECT CONCAT('Hola ', 'mundo') as saludo FROM DUAL;--Resultado Hola Mundo

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.

SUBSTR(cadena, inicio, longitud)

SELECT SUBSTR('Hola mundo', 6, 5) as palabra FROM DUAL;--mundo

LENGTH: La función LENGTH se utiliza para obtener la longitud de una cadena de


caracteres.

SELECT LENGTH('Hola mundo') as longitud FROM DUAL;

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:

SELECT UPPER('Hola mundo') as mayusculas, LOWER('Hola mundo') as minusculas


FROM DUAL;--HOLA MUNDO y hola mundo

TRIM: La función TRIM se utiliza para eliminar espacios en blanco al principio y al final
de una cadena de caracteres.

SELECT TRIM(' Hola mundo ') as saludo FROM DUAL;--holamundo

LTRIM: La función LTRIM se utiliza para eliminar espacios en blanco o caracteres a la


izda

RTRIM: para eliminar espacios en blanco o caracteres a la derecha

INSTR(cad, cadBuscada [, posInicial [, Nparición ] ] ): obtiene la posición en la que


se encuentra la cadena buscada en la cadena inicial cad. Se puede comenzar a buscar
desde una posición inicial concreta e incluso indicar el nº de aparición de la cadena
buscada. Si no encuentra nada devuelve 0.

SELECT INSTR(‘usuarios’, ‘u’) FROM DUAL—Resultado 1


SELECT INSTR(‘usuarios’, ‘u’, 2) FROM DUAL—Resultado 3

SELECT INSTR(‘usuarios’, ‘u’, 2, 2) FROM DUAL—Resultado 0

INITCAP(cad): Devuelve la cad con su primer carácter en mayúscula.

LPAD(cad1, n, cad2):Devuelve cad1 con longitud n, ajustada a la derecha, rellenando


por la izda con cad2.

SELECT LPAD(‘M’, 5, ‘*’) FROM DUAL;-----****M

RPAD(cad1,n,cad2): Devuelve cad1 con longitud n, ajustada a la derecha, rellenando


por la derecha con cad2

4.4. Funciones de manejo de fechas

SYSDATE: Devuelve fecha y hora actual. SELECT SYSDATE FROM DUAL—fecha/hora


actual

SYSTIMESTAMP: Devuelve fecha y hora actual en formato TIMESTAMP.

ADD_MONTHS(fecha,n): Añade a la fecha el nº de meses indicado

MONTHS_BETWEEN(fecha1,fecha2):Devuelve el nº de meses entre dos fechas

LAST_DAY(fecha): Devuelve el último día del mes al que pertenece la fecha. El valor
devuelto es tipo DATE.

NEXT_DAY(fecha, d): Indica el día que corresponde si añadimos a la fecha el día d.

EXTRACT(valor FROM fecha): Extrae un valor de una fecha concreta. El valor puede
ser day, month, year, hours.

4.5. Funciones de conversión

TO_NUMBER(cad, formato): Convierte textos en números.


TO_CHAR(d, formato) Convierte un número o fecha d a cadena de caracteres, se
utiliza normalmente para fechas ya que de número a texto se hace de forma implícita
como hemos visto antes.

TO_DATE( cad, formato) Convierte textos a fechas. Podemos indicar el formato con el


que queremos que aparezca.

Para las funciones TO_CHAR y TO_DATE, en el caso de fechas, indicamos el formato incluyendo los


siguientes símbolos:
4.6. NVL y DECODE

NVL(valor, expr1) Si valor es NULL, entonces devuelve expr1. Ten en cuenta


que expr1 debe ser del mismo tipo que valor.

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.

Si en la tabla EMPLEADOS queremos un listado de sus direcciones, podemos pedir que


cuando una dirección no exista, aparezca el texto No tiene dirección, para ello
podemos utilizar la siguiente consulta:

SELECT NVL(DIRECC1, 'No tiene dirección conocida') FROM EMPLEADOS;

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.

Las funciones que podemos utilizar se llaman de agrupamiento (de agregado).


Éstas toman un grupo de datos (una columna) y producen un único dato que resume
el grupo. Por ejemplo, la función SUM() acepta una columna de datos numéricos y
devuelve la suma de estos.

Todas las funciones de agregado tienen una estructura muy parecida: FUNCIÓN ([ALL|
DISTINCT] Expresión) y debemos tener en cuenta que:

 La palabra ALL indica que se tienen que tomar todos los valores de la columna.


Es el valor por defecto.
 La palabra DISTINCT indica que se considerarán todas las repeticiones del
mismo valor como uno solo (considera valores distintos).
 El grupo de valores sobre el que actúa la función lo determina el resultado de la
expresión que será el nombre de una columna o una expresión basada en una o
varias columnas. Por tanto, en la expresión nunca puede aparecer ni una
función de agregado ni una subconsulta.
 Todas las funciones se aplican a las filas del origen de datos una vez ejecutada
la cláusula WHERE (si la tuviéramos).
 Todas las funciones (excepto COUNT) ignoran los valores NULL.
 Podemos encontrar una función de agrupamiento dentro de una lista de
selección en cualquier sitio donde pudiera aparecer el nombre de una columna.
Es por eso que puede formar parte de una expresión pero no se pueden anidar
funciones de este tipo.
 No se pueden mezclar funciones de columna con nombres de columna
ordinarios, aunque hay excepciones que veremos más adelante.

5.1 Funciones de agregado: SUM Y COUNT

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.

- SELECT SUM(COALESCE(columna, 0)) FROM tabla;

- SELECT SUM(IFNULL(columna, 0)) FROM tabla;

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 *.

Usando COUNT(*)calculamos el total de filas incluyendo las que tienen NULL.

5.1 Funciones de agregado: MIN y MAX

Función MIN: devuelve el valor mínimo sin considerar los nulos.

Función MAX: devuelve el valor máximo sin considerar nulos.

5.2 Funciones de agregado: AVG, VAR, STDEV y STDEVP

AVG: devuelve el promedio, se omiten null. Se aplica a datos numéricos.


VAR: devuelve la varianza estadística de todos los valores de la expresión.

STDEV: devuelve la desviación típica estadística de todos los valores de la expresión.


Admite solo números. Se omiten null

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.

De este modo podríamos obtener de una tabla EMPLEADOS, en la que se guarda su


sueldo y su actividad dentro de la empresa, el valor medio del sueldo en función de la
actividad realizada en la empresa.

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.

SELECT columna1, columna2, ...


FROM tabla1, tabla2, ...
WHERE condición1, condición2, …
GROUP BY columna1, columna2, …
HAVING condición
ORDER BY ordenación;

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:

1. WHERE que filtra las filas según las condiciones que pongamos.


2. GROUP BY que crea una tabla de grupos nueva.
3. HAVING filtra los grupos.
4. ORDER BY que ordena o clasifica la salida.

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:

 Pueden combinarse tantas tablas como se desee.


 El criterio de combinación puede estar formado por más de una pareja de columnas.
 En la cláusula SELECT pueden citarse columnas de ambas tablas, condicionen o no, la
combinación.
 Si hay columnas con el mismo nombre en las distintas tablas, deben identificarse
especificando la tabla de procedencia o utilizando un alias de tabla.

Las columnas que aparecen en la cláusula WHERE se denominan columnas de


emparejamiento ya que son las que permiten emparejar las filas de las dos tablas. Éstas no
tienen por qué estar incluidas en la lista de selección. Emparejaremos tablas que estén
relacionadas entres sí y además, una de las columnas de emparejamiento será clave principal
en su tabla. Cuando emparejamos campos debemos especificar de la siguiente
forma: NombreTabla1. Camporelacionado1 = NombreTabla2.Camporelacionado2.

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:

SELECT Nombre, Apellido1, Apellido2, Fecha_inicio, Fecha_fin


FROM EMPLEADOS, HISTORIAL_LABORAL
WHERE HISTORIAL_LABORAL.Empleado_DNI= EMPLEADOS.DNI;

Vamos a obtener el historial con los nombres de departamento, nombre y apellidos del empleado de
todos los departamentos:

SELECT Nombre_Dpto, Nombre, Apellido1, Apellido2


FROM DEPARTAMENTOS, EMPLEADOS, HISTORIAL_LABORAL
WHERE EMPLEADOS.DNI= HISTORIAL_LABORAL. EMPLEADO_DNI
AND HISTORIAL_LABORAL.DPTO_COD = DEPARTAMENTOS. DPTO_COD;

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.

En nuestro ejemplo, la igualdad que tenemos en la cláusula WHERE es Cod_dpto (+)= Codigo_dep ya


que es en la tabla empleados donde aparecerán valores nulos.

SELECT D.NOMBRE_DPTO, D.JEFE, E.NOMBRE, E.APELLIDO1, E.APELLIDO2


FROM DEPARTAMENTOS D, EMPLEADOS E
WHERE D.JEFE = E.DNI(+);

INNER JOIN: Opción predeterminada si no se especifica ningún tipo de unión.


Si unimos dos tablas en una columna común, solo retornarán los datos que
coincidan en ambas tablas. Es la mas utilizada. Composición interna. Para
saber cual es el campo común en ambas tablas tenemos que conocer la clave
foránea.

Si no hay nexo de unión (clave foránea) no se puede usar INNER


JOIN!!

*1-Muestra título película y nombre y apellidos del director */

SELECT titulo,nombre,apellidos //selecciona título pelicula, nombre y


apellidos del director

FROM películas// de la tabla películas

INNER JOIN directores //unir internamente

ON peliculas.idDirector = directores.codigo; // igualamos clave foránea de la


tabla películas, con clave primaria de la tabla directores

Si tuviéramos un título de película en el que su campo idDirector fuera nulo,


esta película no se mostraría. Aquí se muestran las películas que tengan un
idDirector con su código de director. Para sacar las nulas habría que hacer
un LEFT JOIN

*Se puede hacer referencia a las tablas con un punto*/

SELECT peliculas.titulo,directores.nombre, directores.apellidos

FROM peliculas

INNER JOIN directores

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*/

SELECT titulo, nombre, apellidos

FROM actores

INNER JOIN actuaciones

ON actuaciones.codActor = actores.codigo

INNER JOIN peliculas

ON actuaciones.codPelicula = peliculas.codigo;
/*3-Muestra el nombre y dirección de los clientes que alquilaron películas

* de la categoría DRAMA, ORDENADOS por el campo nombre ascendente */

SELECT

clientes.nombre,

clientes.direccion

FROM clientes

INNER JOIN alquileres

ON alquileres.codCliente = clientes.codCliente

INNER JOIN peliculas

ON alquileres.codPelicula = peliculas.codigo

INNER JOIN categorias

ON peliculas.idCategoria = categorias.idCategoria

WHERE (categorias.nombre = 'Drama')

ORDER BY clientes.nombre ASC;

/*Igual que la anterior pero el campo dirección no puede ser NULL*/

SELECT clientes.nombre,clientes.direccion

FROM clientes

INNER JOIN alquileres

ON alquileres.codCliente = clientes.codCliente

INNER JOIN peliculas


ON alquileres.codPelicula = peliculas.codigo

INNER JOIN categorias

ON peliculas.idCategoria = categorias.idCategoria

WHERE (categorias.nombre = 'Drama') AND clientes.direccion IS NOT NULL

ORDER BY clientes.nombre ASC;

-----------------------------------------------------------------------------

/*1-Muestra titulo película y nombre y apellidos del director

*De esta forma se muestran los registros de la tabla izda, en

*este caso de películas y los que coiniciden con la tabla de la derecha

*directores, en este caso.Se mostrarán títulos de películas que no tengan

*director */

SELECT peliculas.titulo,directores.nombre, directores.apellidos

FROM peliculas

LEFT JOIN directores

ON peliculas.idDirector = directores.codigo;

/*En este caso se muestran todos los registros de los directores y las
películas,

* Se mostrarán directores que no tengan peliculas*/

SELECT peliculas.titulo,directores.nombre, directores.apellidos

FROM peliculas

RIGHT JOIN directores

ON peliculas.idDirector = directores.codigo;

/*Ahora vamos a mostrar ambos, directores sin películas y peliculas sin


directores*/

SELECT peliculas.titulo,directores.nombre, directores.apellidos

FROM peliculas

LEFT JOIN directores ON peliculas.idDirector = directores.codigo

UNION

SELECT peliculas.titulo,directores.nombre, directores.apellidos

FROM peliculas

RIGHT JOIN directores ON peliculas.idDirector = directores.codigo;


/*Hay que sacar el id usuario con menos publicaciones de todas las
publicaciones, varias formas, apartado ejercicio u05*/

SELECT idUsuario, COUNT(*) AS 'totalPublicaciones'

FROM publicaciones p GROUP BY idUsuario ORDER BY idPublicacion DESC;

-----------------------------------------------------------------------

SELECT idUsuario FROM ( SELECT idUsuario, COUNT(*) AS num_publicaciones

FROM publicaciones GROUP BY idUsuario) t1

WHERE num_publicaciones = (SELECT MIN(num_publicaciones)

FROM (SELECT idUsuario, COUNT(*) AS num_publicaciones FROM publicaciones

GROUP BY idUsuario) t2);

-----------------------------------------------------------------------------
-

SELECT idUsuario, COUNT(*) FROM publicaciones

GROUP BY idUsuario HAVING COUNT(*) = (SELECT MIN(cnt)

FROM (SELECT COUNT(*) AS cnt FROM publicaciones GROUP BY idUsuario) subCons);

-----------------------------------------------------------------------------

SELECT idUsuario FROM publicaciones GROUP BY idUsuario HAVING COUNT(*) = (

SELECT MIN(num_publicaciones)

FROM (SELECT COUNT(*) AS num_publicacionesFROM publicaciones

GROUP BY idUsuario)subConsulta);

También podría gustarte