Explora Libros electrónicos
Categorías
Explora Audiolibros
Categorías
Explora Revistas
Categorías
Explora Documentos
Categorías
Durante el presente tema utilizaremos algunas de las herramientas que hemos citado, teniendo en
cuenta que se trata solo de algunas de las numerosas herramientas presentes en el mercado, tanto
de software libre como propietario.
UT_4 GBD
Ejemplos de estos asistentes los podemos ver en OpenOffice Base y en Microsoft Access,
aunque tambin incorporan este tipo de asistentes bases de datos como Oracle.
Creacin de consultas desde la ventana de diseo de consultas:
Tanto en los propios SGBD como en aplicaciones que se pueden instalar para aumentar las
prestaciones y que son externas al SGBD, podemos encontrar herramientas grficas para
disear consultas mediante opciones como:
Sentencias
Incluye sentencias para gestionar las estructuras.
Incluye sentencias para gestionar los datos.
Incluye sentencias para gestionar la seguridad y los permisos.
UT_4 GBD
Pues bien, ahora vamos a tratar con el LMD, que es una parte del lenguaje SQL que se encarga de
la gestin de los datos almacenados. El LMD tiene instrucciones para ayudarnos a:
Para realizar una consulta a una o varias tablas con esta sentencia, es imprescindible utilizar
Tambin es vlido, y adems necesario cuando se seleccionan varias columnas con el mismo
nombre en diferentes tablas, especificar el nombre de la columna separado con un punto
del nombre de la tabla. Un ejemplo se muestra a continuacin:
UT_4 GBD
SELECT CLIENTES.Nombre, CLIENTES.Apellidos FROM CLIENTES;
Se pueden consultar datos de tablas de una base de datos que no est actualmente en uso,
escribiendo el nombre de la base de datos a la que pertenece, separado con un punto del
nombre de la tabla, como se muestra a continuacin:
SELECT * FROM TalleresFaber.CLIENTES;
UT_4 GBD
La clusula WHERE permite obtener los datos de las filas que cumplen con la condicin expresada.
Tras WHERE se escribe una expresin de tipo relacional o de comparacin, que usar alguno de
los operadores relacionales y lgicos que veremos en apartados posteriores.
El formato de la condicin es: expresin operador expresin
Pueden construirse condiciones mltiples con los operadores lgicos AND, OR o NOT.
En una clusula WHERE se puede usar cualquier funcin disponible en el SGBD que se est
usando, excluyendo slo las de resumen. Estas ltimas funciones estn diseadas especficamente
para usarse en clusulas GROUP BY y se vern en otro apartado.
El siguiente ejemplo muestra una consulta que incluye una condicin en la clusula WHERE:
SELECT Matricula FROM VEHICULOS WHERE color=azul OR marca=SEAT;
A lo largo de este tema realizaremos numerosos ejercicios para aprender a manejar el
lenguaje SQL. Como base de la mayora de los ejercicios usaremos la base de datos
bdempleados, que se crear en un servidor MySQL. En el siguiente ejercicio crearemos
dicha base de datos, e insertaremos algunos datos en sus tablas.
Ejercicio: Creacin de la base de datos bdempleados.
Utiliza el cliente grfico Navicat para crear la base de datos bdempleados en tu servidor MySQL.
Abajo se describe la estructura y contenido de las tablas que componen dicha base de datos, as
como las relaciones que existen entre las distintas tablas. Obsrvese que se ha duplicado la tabla
empleados para poder representar la interrelacin reflexiva sobre s misma, pero solo hay que crear
una tabla de empleados. Cada campo se definir del tipo ms apropiado para albergar los datos
que contendr. Recuerda que es muy importante definir el tipo de los campos que actan de clave
fornea, del mismo tipo con el que se defina la clave primaria a la que hacen referencia.
Tabla: empleados
Clave primaria: numemp
Claves forneas:
oficina->referencia a oficinas.oficina
jefe->referencia a empleados.numemp
UT_4 GBD
Tabla: oficinas
Clave primaria: oficina
Claves forneas:
dir->referencia a empleados.numemp
Tabla: clientes
Clave primaria: numclie
Claves forneas:
repclie->referencia a empleados.numemp
UT_4 GBD
Tabla: productos
Clave primaria: idproducto
Tabla: pedidos
Clave primaria: codigo
Claves forneas:
clie->referencia a clientes.numclie
rep->referencia a empleados.numemp
producto->referencia a productos.idproducto
UT_4 GBD
Recomendacin
Todas las consultas que se piden en los ejercicios deben probarse sobre el servidor MySQL.
Puedes escribir las consultas en la lnea de comandos o en cualquier cliente grfico de MySQL.
Es muy importante que se almacenen todas las sentencias que se realicen en los distintos
ejercicios. Para ello puedes utilizar cualquier editor de texto plano.
Ejercicio: Alias de columna.
Realiza las siguientes consultas en SQL sobre la BD bdempleados:
Seleccionar el nombre de todos los empleados, haciendo que aparezca como ttulo de la
columna Nombre de empleado.
de su cuota ser Mitad de la cuota. Slo aparecern los datos de los empleados para los
cuales el doble de sus ventas sea mayor que 650000 y menor que 800000.
Seleccionar el nombre de cada empleado y el nmero de aos que le restan para jubilarse,
encabezando estos valores con el ttulo Aos restantes de trabajo. Slo se incluirn en el
resultado de la consulta aquellos empleados mayores de 40 aos y cuyo contrato fuese
formalizado antes de octubre del 88.
Seleccionar el nombre de la ciudad, el cdigo del director de la oficina y la mitad de la
diferencia entre ventas y objetivo, de todas las oficinas para las que el 30% de las ventas
sea mayor que el 15% del objetivo. El formato de la salida ser:
Ciudad oficina: ciudad Cdigo director: dir Mitad diferencia: resultado
Nota: Condiciones para fechas -> WHERE
MONTH(fecha)=12 AND YEAR(fecha)<2014
fecha
<
"12/3/2014"
----
WHERE
UT_4 GBD
UT_4 GBD
Nota: empieza a contar desde cero, es decir, la fila 5 es la sexta.
mysql> SELECT * FROM table LIMIT 95,-1; # Devuelve las filas 96-ltima.
mysql> SELECT * FROM table LIMIT 5; # Devuelve las 5 primeras filas.<br />
Ejercicio resuelto
Queremos consultar la referencia, descripcin e importe de las 10 actuaciones ms baratas
que se pueden llevar a cabo en nuestro taller.
SELECT Referencia, Descripcion, Importe FROM ACTUACIONES ORDER BY Importe LIMIT 10;
Solution:
SELECT Referencia, Descripcion, Importe FROM ACTUACIONES ORDER BY Importe LIMIT 10;
Ejercicio: ORDER BY.
Realiza las siguientes consultas en SQL sobre la BD bdempleados:
Seleccionar la primera, tercera y ltima columna de la tabla empleados. Aparecern todos los
registros ordenados descendentemente por la tercera columna.
Seleccionar el nombre y la edad de todos los empleados cuya edad est comprendida
Seleccionar los aos en que se realizaron algn pedido (sin repeticiones). Los aos
aparecern ordenados cronolgicamente, de mayor a menor.
4.- Operadores.
Una vez vistas las clusulas que pueden intervenir en una consulta, Alejandra considera
importante conocer tambin los operadores que se pueden usar dentro de las expresiones
en el SGBD que est utilizando, en este caso MySQL, y que le ayudarn, entre otras cosas, a
establecer condiciones de bsqueda bsicas.
Aunque ya hemos usado algunos operadores que pueden intervenir en una sentencia SQL, dado
que en la mayor parte de los casos se incluyen en sentencias de tipo SELECT, vamos a ampliar en
este apartado los tipos de operadores.
Con el lenguaje SQL podemos utilizar muchos operadores diferentes para cada tipo de
columna. Veremos los operadores de que dispone MySQL, pero la mayora de ellos son
compatibles con otros SGBD.
Los operadores se utilizan para construir expresiones que se usan en clusulas WHERE,
ORDER BY y HAVING y adems se pueden emplear directamente en las sentencias.
10
UT_4 GBD
Los operadores sirven para construir expresiones. Se pueden utilizar con nmeros, cadenas de
caracteres, fechas, campos booleanos, binarios, etc.
Una expresin es una combinacin de operadores y operandos (como campos, constantes,
variables, funciones y otras expresiones) que se combinan unos con otros.
En el siguiente ejemplo hemos consultado los datos apellidos, nombre y direccin de los empleados
de Talleres Faber que viven en Cantabria. Se establece como condicin que los dos primeros
caracteres del cdigo postal sean 39. (No te preocupes por el operador LIKE, se ver en otro
apartado ms adelante)
SELECT Apellidos, Nombre, Direccin FROM EMPLEADOS WHERE CP LIKE 39%;
Si en una expresin aparecen varios operadores, se evalan en un orden determinado. Los
operadores de mayor prevalencia se evalan primero y as hasta los de menor prevalencia. Cuando
dos o ms operadores tienen igual prevalencia, se evalan de izquierda a derecha. En una
expresin en la que se utilicen parntesis para agrupar parte de los elementos de la expresin, se
evalan primero los parntesis ms internos y con lo que se obtiene se van evaluando los
parntesis siguientes hasta los ms externos.
Los parntesis tienen mayor prevalencia que cualquier operador.
Debes conocer
Para consultar el orden de prioridad de los operadores disponibles en MySQL pincha en el siguiente
enlace:
Orden de prioridad de los operadores: http://dev.mysql.com/doc/refman/5.6/en/operatorprecedence.html.
Reflexiona
En caso de que tengas que combinar varios operadores en una misma expresin, es aconsejable
que utilices tantos parntesis como consideres necesario para que stos se evalen en el orden
que te interese. De este modo evitars sorpresas desagradables.
Una variable sin asignar ser de tipo cadena y su valor ser NULL.
11
UT_4 GBD
Operadores aritmticos:
Los operadores aritmticos se aplican a valores numricos, ya sean enteros o en coma flotante. El
resultado
siempre
es
un
valor
numrico,
entero
o
en
coma
flotante.
MySQL dispone de los operadores aritmticos habituales: suma, resta, multiplicacin, divisin,
potencia, etc.
Operador
Significado
Se utiliza para sumar dos nmeros y, como operador unario, para simbolizar signo positivo
de un nmero.
Se utiliza para hallar la diferencia entre dos nmeros y, como operador unario, para
simbolizar signo negativo de un nmero.
Se utiliza para dividir dos nmeros y el resultado cociente en forma de entero (divisin
entera) entero.
% o mod
Los operadores de mayor prevalencia son los aritmticos, y entre ellos, el orden de prevalencia es:
1.
2.
3.
4.
Exponenciacin.
Operadores de signo.
Multiplicacin y divisin.
Suma y resta.
Significado
<=
Menor o igual.
<
Menor.
>
Mayor.
>=
Mayor o igual
12
UT_4 GBD
<=>
Funciona como =, salvo que si una de las dos expresiones o las dos es nula, el resultado no
es NULL. Si se comparan dos expresiones nulas, el resultado es verdadero (1).
Si solo una de las dos expresiones es nula, entonces el resultado es falso (0).
< > !=
Cuando se comparan cadenas, se considera menor la cadena que aparezca antes por orden
alfabtico no distinguiendo entre maysculas y minsculas, a no ser que se realicen sobre
campos definidos con el atributo BINARY.
Las cadenas constantes se han de expresar encerradas entre comillas dobles o simples.
Si son fechas, se considera menor cunto ms antigua sea.
TRUE
FALSE
desconocido
NULL
Operador
Funcin
AND &&
Devuelve el valor TRUE cuando las dos condiciones son verdaderas y FALSE si alguna
de ellas es falsa.
OR ||
NOT !
XOR
Devuelve NULL si cualquiera de los operadores es NULL. Cuando uno de los operadores
es verdadero, devuelve TRUE y si ambos son verdaderos o falsos devuelve FALSE.
Todos estos operadores tienen menor prevalencia en las expresiones que los operadores
aritmticos. Entre ellos, el orden de prevalencia es el siguiente:
1.
2.
3.
4.
Operadores de comparacin
Operador NOT
Operador AND
Operador OR
Al igual que todos los operadores binarios que veremos, los operadores AND y OR se pueden
asociar, es decir, se pueden crear expresiones como
13
UT_4 GBD
A AND B AND C.
El hecho de que se requieran dos operandos significa que las operaciones se realizan tomando los
operandos dos a dos, y estas expresiones se evalan de izquierda a derecha. Primero se evala A
AND B, y el resultado, R, se usa como primer operando de la siguiente operacin R AND C.
Ejercicio resuelto
Consultar las matrculas de los vehculos que hayan entrado a reparar en 2014 con menos de
100000 Km, y que hayan salido del taller sin reparar:
SELECT IdReparacion, Matricula FROM REPARACIONES WHERE
(FechaEntrada>=2014-01-01 AND km<100000)
AND Reparado=False;
Solution:
SELECT IdReparacion, Matricula FROM REPARACIONES WHERE
(FechaEntrada>=2014-01-01 AND km<100000)
AND Reparado=False;
Significado
Por ejemplo, para obtener los nombres y apellidos de los clientes cuyo primer apellido comience por
la letra M haramos lo siguiente:
SELECT Nombre, Apellidos FROM CLIENTES WHERE Apellidos LIKE M%;
Y para obtener los nombres y apellidos de los clientes cuyo apellido no sea Snchez escribiramos:
SELECT Nombre, Apellidos FROM CLIENTES WHERE Apellidos NOT LIKE %Snchez%;
Otros operadores especiales son BETWEEN y NOT BETWEEN, que sirven para comprobar si una
expresin est comprendida en un determinado rango de valores. Su sintaxis es:
Expresin [NOT] BETWEEN ValorInicial AND ValorFinal
14
UT_4 GBD
Por ejemplo, para obtener un listado con los nmeros de referencia y la descripcin de las
actuaciones cuyo tiempo estimado de realizacin est entre 30 y 60 minutos, podramos escribir
cualquiera de las dos siguientes consultas:
SELECT Referencia, Descripcion FROM ACTUACIONES WHERE TiempoEstimado BETWEEN 0.30 AND 0.60;
SELECT Referencia, Descripcion FROM ACTUACIONES WHERE TiempoEstimado >=0.30 AND TiempoEstimado
<= 0.60;
Reflexiona
Observa la diferencia entre las dos soluciones del ejemplo anterior:
Retroalimentacin:
Para poder buscar un carcter % _ como carcter dentro de una cadena, ste deber ir
precedido de un carcter de escape, que es la barra invertida o contrabarra.
Ejemplo: Queremos ver el Nombre de una serie de artculos que en la columna IVA contienen el
smbolo % al final.
SELECT Nombre FROM ARTICULOS WHERE IVA LIKE %\%;
Del carcter de escape se habl en el recurso: Reglas para escribir sentencias SQL de la
unidad anterior.
Ejercicio: BETWEEN, IN, LIKE
Realiza las siguientes consultas en SQL sobre la tabla empleados de la base de datos
bdempleados:
Seleccionar los nombres de los empleados cuya cuota de venta est comprendida entre
250000 y 300000, y cuyas ventas no estn comprendidas entre 50000 y 250000 ni entre
300000 y 500000 (usa BETWEEN siempre que sea posible).
15
UT_4 GBD
Seleccionar el nombre y las fechas de los contratos de los empleados cuyos contratos se
formalizasen entre 1989 y 2000, o bien su oficina sea la 21, la 13 o la 22. En el resultado
no aparecern los empleados cuyo jefe sea el de cdigo 108 (usa BETWEEN e IN).
Seleccionar el nombre y la edad de los empleados cuyo primer apellido no comience ni por G
ni por V (supn que todos los nombres propios son simples).
Seleccionar el nombre de los empleados cuyo ttulo no sea director de nada.
Seleccionar los nombres de los empleados que no tengan jefe o no pertenezcan a ninguna
oficina. Slo se visualizarn los nombres de empleados que no tengan asignada cuota de
venta.
Seleccionar el cdigo y el nombre de la provincia de todas las oficinas que no tengan ni
objetivo de ventas ni ventas, o bien que el objetivo de ventas o las ventas sean 0, o su
supervit mayor de 100000.
16
UT_4 GBD
6.- Funciones.
Las funciones se usan dentro de expresiones y actan sobre los valores de las columnas de las
tablas, con variables o con constantes. Se utilizan en clusulas SELECT, WHERE, ORDER BY, etc.
Las funciones pueden:
+--------------+
De forma general, podemos clasificar las funciones en las siguientes categoras:
Funciones aritmticas:
En MySQL existen numerosas funciones para trabajar con las fechas y las horas.
Por defecto, el formato de almacenamiento de las fechas es AAAA-MM-DD y de las horas
HH:MM:SS, pero existen muchas funciones que nos permiten descomponer la fecha y la
hora, obtener la fecha y hora actuales, etc.
Funciones de comparacin:
17
UT_4 GBD
Se trata de funciones que comparan los valores de cada una de las columnas en el interior de
una fila para obtener: el menor o el mayor valor de ellos, as como comprobar si el valor de una
columna es nulo.
Debes conocer
En el siguiente documento te presentamos un resumen de las funciones de cada tipo que se utilizan
con ms frecuencia en MyQL y algunos ejemplos de aplicacin:
Resumen de las funciones ms frecuentes en MySQL.(Anexo del tema)
Para saber ms
Como hemos dicho, existen muchas funciones que pueden aplicarse a las columnas de una tabla.
En algunas herramientas grficas se encuentran accesibles todas las funciones disponibles
agrupadas por categoras.
Para consultar la documentacin relativa a las funciones del manual de MySQL en espaol pincha
en el siguiente enlace:
Funciones internas para MySQL.: http://dev.mysql.com/doc/refman/5.6/en/functions.html
de la fecha, no el nombre del mes.
Ejercicio: Funciones de manejo de cadenas.
Crea una nueva base de datos llamada bdfunciones. A continuacin, realiza las operaciones de
abajo. Ejecuta las sentencias en el cliente de lnea de comandos o en cualquier cliente grfico de
MySQL. Puedes recurrir al manual de MySQL para buscar informacin sobre las funciones
necesarias para realizar el ejercicio.
Aade a la base de datos creada una nueva tabla, llamada funcionescadena, con 3 campos
Esta nueva tabla estar compuesta por cuatro campos de tipo entero pequeo, entero
normal, real simple y real doble, respectivamente, siendo el primero la clave principal.
Utiliza Workbench para aadir cuatro registros a la tabla creada. Aade, al menos, tres dgitos
decimales a cada valor de los dos ltimos campos.
Visualiza el contenido completo de la tabla.
Selecciona el resultado de multiplicar el primer y el segundo campo de la tabla por el valor de
la constante (PI). Utiliza una funcin para hacer referencia al valor de esta constante.
18
UT_4 GBD
Visualiza la raz cuadrada de todos los valores contenidos en el cuarto campo, dividida por 4.
Visualiza el resultado de redondear con 2 decimales los valores de los dos ltimos campos.
Visualiza el resultado obtenido al elevar el valor el contenido del tercer campo al valor
contenido en el segundo campo.
Esta nueva tabla estar compuesta por cuatro campos de tipo entero pequeo
autonumrico, date, datetime y time, siendo el primero la clave principal.
Utiliza Workbench para aadir a la tabla tres registros. Algunas fechas estarn dentro de los
ltimos 30 das.
Selecciona el valor del primer campo de la tabla para todos aquellos registros que tengan en
el tercer campo una fecha que est dentro de los ltimos 30 das.
Selecciona todos los registros que tengan un valor de segundo impar en el tercer o en el
cuarto campo.
Selecciona los nombres del da y del mes de las fechas contenidas en el tercer campo, de
todos los registros que contengan en el segundo campo una fecha que pertenezca a la
primera mitad de cualquier ao o al mes de septiembre.
En la clusula WHERE es necesario especificar el criterio que se sigue para combinar las
tablas ya que, si no se especifica, el resultado ser el producto cartesiano, que combina
todas las filas de una tabla con cada una de las filas de la otra. El producto cartesiano no
suele ser un resultado relevante.
En el siguiente ejemplo se obtiene un listado con los nombres y apellidos de los clientes y las
matrculas de los coches que nos han trado a reparar al talle. Debe observarse que si no se
especifica la clusula WHERE, se obtiene el producto cartesiano de las tablas CLIENTES y
VEHICULOS.
SELECT Nombre, Apellidos, Matricula FROM CLIENTES, VEHICULOS
WHERE CLIENTES.CodCliente = VEHICULOS.CodCliente;
19
UT_4 GBD
Para consultar los datos personales de los empleados cuya categora sea "oficial", junto con las
horas trabajadas en cada intervencin, ejecutaramos la siguiente consulta:
SELECT DNI, Nombre, Apellidos, Horas FROM EMPLEADOS, Intervienen
WHERE EMPLEADOS.CodEmpleado = Intervienen.CodEmpleado AND Categoria LIKE Oficial%;
En este ejemplo se efecta el producto cartesiano de la tabla de empleados con ella misma. Debe
observarse que en este caso resulta obligatorio el uso de un alias de tabla. Obtendremos todas las
posibles combinaciones de empleados con empleados.
SELECT * FROM empleados, empleados AS emp
Reflexiona
Cuando realizamos consultas a varias tablas y no especificamos las columnas por las que se
relacionan, el resultado de la consulta es el producto cartesiano, tal y como hemos explicado.
Este resultado casi siempre ser un error. En muy pocos casos nos interesa mezclar filas de una
tabla con filas de otra, sin ningn criterio para establecer esa combinacin.
Ejemplo: si combinamos en una consulta CLIENTES con VEHICULOS sin hacer coincidir el
CodCliente en ambas tablas, obtendremos un listado que mezcla cada cliente con todos los
vehculos de la tabla. Desde un punto de vista lgico esta consulta no tendra ningn sentido.
Ejercicio: Consultas multitabla y producto cartesiano.
Realiza, sobre la base de datos bdempleados, las siguientes consultas:
Obtener todos los campos de todos los registros de las tablas productos y pedidos. Es decir,
el producto cartesiano de estas tablas.
Todos los campos y registros de las tablas empleados y oficinas. Observa la forma de
nombrar los campos en la tabla resultado.
Los campos nombre, edad, oficina y ttulo de la tabla empleados, y los campos oficina, ciudad
y region de la tabla oficinas. No se incluirn en el resultado tuplas cuyo campo ttulo sea
representante.
En este apartado efectuaremos el producto cartesiano de la tabla productos consigo misma.
Se incluirn todos los campos de la primera relacin, pero slo el identificador de
fabricante y la descripcin del producto de la segunda. No se incluirn en el resultado
tuplas en las que ambos identificadores de fabricante sean idnticos.
Obtn una relacin que contenga, para cada trabajador menor de 45 aos, su nombre, su
ttulo, su fecha de contrato y la oficina en la que trabaja, incluyendo la ciudad de la oficina
as como sus ventas.
Descripcin
Cuenta el nmero de valores no nulos de la columna que aparece como
argumento. Podemos utilizar la clusula DISTINCT para contar el nmero de
20
UT_4 GBD
valores diferentes que aparecen en la columna. Si escribimos * cuenta las filas
que tengan valor no nulo.
SUM(Expresin o
Columna)
MIN(Expresin o
Columna)
MAX(Expresin o
Columna)
AVG(Expresin o
Columna)
Retroalimentacin:
En la primera consulta contamos en la tabla VEHICULOS cuantas marcas distintas aparecen. Si la
marca aparece repetida se cuenta una sola vez.
En la segunda consulta la clusula DISTINCT se aplica despus de contar. Eliminara las filas
duplicadas que devuelva la consulta. En este caso no tiene sentido porque la consulta devuelve
un nico valor, una sola fila, por tanto no es posible que haya duplicados.
Ejercicio resuelto
Realiza las siguientes consultas a las tablas de TalleresFaber:
Solucin:
21
UT_4 GBD
1.
2.
3.
Se pretende calcular la media de las edades de los empleados mayores de 50 aos. Este
resultado aparecer con el ttulo Media de mayores.
Se pretende obtener la media de las diferencias entre ventas y cuotas. No se considerarn los
empleados que tengan un nulo en su campo cuota o en su campo ventas. Este resultado
aparecer con el ttulo Desviacin media.
Se pretende calcular la media de las diferencias de las ventas de cada empleado menos las
ventas de la oficina que tiene asignada. El ttulo de esta columna ser Aportacin media
empleados.
Queremos visualizar el nmero de tuplas obtenido al realizar el producto cartesiano de la
tabla pedidos y la tabla clientes. El ttulo de este resultado ser Cuenta cartesiano.
Queremos visualizar el nmero de valores no nulos contenidos en la columna oficinas.objetivo
de la relacin que se obtiene al realizar el producto cartesiano de la tabla empleados y la
tabla oficinas. El ttulo de este resultado ser Cuenta objetivo cartesiano.
Visualizar la mayor edad de entre los empleados contratados antes de 1988.
Visualizar la mayor edad de los empleados cuya oficina est en la zona este o en la ciudad de
A Corua.
Visualizar la fecha del ltimo pedido que se hizo de un producto fabricado por aci.
Visualizar la media de los importes asociados al producto bisagra.
Si queremos saber, por ejemplo, cuntos coches de cada marca han visitado nuestro taller? Hasta
ahora lo que podamos hacer era mostrar las filas de la tabla automviles, ordenadas por marca y
contar visualmente cuntas filas haba por cada marca, de la siguiente forma:
22
UT_4 GBD
SELECT Marca FROM VEHICULOS ORDER BY Marca;
Y si la tabla tuviera miles de filas? No podramos hacerlo as. Es el momento de recurrir a la
clusula GROUP BY.
Seguidamente se obtiene un listado con dos columnas: la marca y el nmero de vehculos que
visitan nuestro taller. La consulta devolver una fila por cada marca distinta, con el nombre de la
marca y el nmero de vehculos de esa marca que nos han visitado. El listado estar ordenado por
marcas.
SELECT Marca, count(*) AS Nmero de vehculos FROM VEHICULOS GROUP BY Marca ORDER BY Marca;
Tanto GROUP BY como HAVING se usan en consultas agrupadas. La sintaxis de estas consultas
es la siguiente:
SELECT NombreColumna,, Funcin, FROM NombreTabla [WHERE Condiciones..]
GROUP BY NombreColumaDeGrupo [HAVING Condiciones] [ORDER BY Criterio]
Estas clusulas combinadas con funciones de resumen nos permiten:
o
o
o
o
valores constantes
funciones de columna
columnas de agrupacin (columnas que aparecen en la clusula GROUP BY)
cualquier expresin basada en las anteriores.
A continuacin podemos observar dos consultas agrupadas. La primera es vlida, ya que la lista de
seleccin contiene elementos vlidos. Sin embargo, la segunda columna no est permitida, ya que
el campo rep es una columna simple que no est encerrada en una funcin de columna, ni est en
la lista de columnas de agrupacin.
SELECT SUM(importe), rep*10 FROM pedidos GROUP BY rep*10
SELECT SUM(importe), rep FROM pedidos GROUP BY rep*10
Del mismo modo que para establecer condiciones de bsqueda para filas individuales se utiliza
WHERE, para establecer condiciones de bsqueda para grupos de filas se utiliza HAVING. La
clusula HAVING se emplea para evaluar condiciones sobre las filas que devuelve GROUP BY.
Ahora se escribe la consulta agrupada del apartado anterior, pero nicamente nos mostrar las
marcas para las que el nmero de vehculos que han visitado nuestro taller sea mayor de 5:
SELECT Marca, count(*) AS Numero de vehiculos FROM VEHICULOS GROUP BY Marca HAVING count(*)>2
ORDER BY Marca;
Seguidamente queremos obtener las oficinas con un promedio de ventas de sus empleados mayor
que 500000.
SELECT SUM(ventas), oficina FROM empleados GROUP BY oficina HAVING AVG(ventas) > 500000
o
o
o
valores constantes
funciones de columna
columnas de agrupacin (columnas que aparecen en la clusula GROUP BY)
23
UT_4 GBD
o
Ejercicio resuelto
Obtener la media de horas empleadas en cada tipo de actuacin, mostrando nicamente
aqullas cuya media no sea inferior a una hora.
SELECT Descripcion, AVG(Horas) AS Horas por trmino medio
FROM ACTUACIONES, Realizan
WHERE ACTUACIONES.Referencia = Realizan.Referencia
GROUP BY ACTUACIONES.Referencia
HAVING AVG(Horas) >= 1;
Solution:
SELECT Descripcion, AVG(Horas) AS Horas por trmino medio
FROM ACTUACIONES, Realizan
WHERE ACTUACIONES.Referencia = Realizan.Referencia
GROUP BY ACTUACIONES.Referencia
HAVING AVG(Horas) >= 1;
Ejercicio: GROUP BY
Realiza las siguientes consultas sobre la base de datos bdempleados:
La edad media de los trabajadores que tienen el mismo cargo. Se incluir el cargo en la
salida.
La fecha del contrato ms antiguo de los empleados de cada oficina. Se incluir el nmero de
cada oficina.
De entre los empleados que tienen el mismo jefe se obtendr la cuota mxima. Se incluir el
cdigo del jefe.
El nmero de empleados que tiene a su cargo cada empleado que es jefe. Se incluir el
cdigo del jefe. Implementa otra versin que adems incluya el nombre del jefe.
La suma de las ventas de los empleados de cada oficina. Se incluir en el resultado el cdigo
de cada oficina. No se incluirn en el resultado las oficinas cuyas ventas totales sean
menores de 200000 ni los empleados cuya oficina sea la 13.
La suma de las unidades vendidas de productos de un determinado fabricante. No se tendrn
en cuenta los pedidos cuyo representante pertenezca a una oficina del oeste. No se
24
UT_4 GBD
incluirn en el resultado final aquellas filas cuya suma de unidades al cuadrado sea menor
de 1000.
El promedio del lmite de crdito para los clientes asignados a cada empleado. No se tendrn
en cuenta los clientes cuyo lmite de crdito sea inferior a 30000. No se quieren en la
salida los datos de los clientes cuyo promedio del lmite de crdito sea inferior que 50000.
El resultado aparecer ordenado por el promedio. Se incluir en el resultado el cdigo del
representante del cliente.
UNION
[ALL
DISTINCT]
SELECT.
Se pueden establecer criterios o condiciones para la unin, no unir todas las columnas de las
tablas, ordenar el resultado, etc.
Si en las tablas unidas hay filas que contienen la misma informacin, slo aparece una fila en
el resultado de la consulta y no dos repetidas. (UNION DISTINCT)
Se puede hacer que las filas repetidas aparezcan en el resultado de la consulta usando
UNION ALL.
Sobre el resultado final no se pueden aplicar otras clusulas como GROUP BY, nicamente
puede contener ORDER BY al final de la sentencia SELECT.
Ejercicio resuelto
Supongamos que tenemos dos tablas de FACTURAS: Una denominada FACTURAS_2013 con las
facturas emitidas ese ao y otra FACTURAS_2014 con las facturas emitidas en este ao.
Realizar una consulta de unin entre las facturas de ambas tablas correspondientes al mes de
enero.
SELECT * FROM FACTURAS_2013 WHERE FechaFactura BETWEEN 2013-01-01 AND 201301-31 UNION SELECT * FROM FACTURAS_2014 WHERE FechaFactura BETWEEN 2014-0101 AND 2014-01-31;
Solution:
SELECT * FROM FACTURAS_2013 WHERE FechaFactura BETWEEN 2013-01-01 AND 201301-31 UNION SELECT * FROM FACTURAS_2014 WHERE FechaFactura BETWEEN 2014-0101 AND 2014-01-31;
Ejercicio: UNION.
Se pretende seleccionar, de la base de datos bdempleados, mediante una nica consulta la
oficina, el nombre de los empleados, sus cuotas de venta y sus ventas, junto con la oficina, la
ciudad, el objetivo de ventas y las ventas de cada oficina. Slo se incluirn en el resultado a los
empleados cuyo contrato sea posterior a 1986. Por otra parte no se incluirn las oficinas de la zona
norte y centro. El resultado podr incluir tuplas repetidas. Los registros del resultado debern
25
UT_4 GBD
aparecer ordenados por el cdigo de la oficina y, si existiesen cdigos repetidos, stos se
ordenaran por el segundo campo (nombre o ciudad).
de otra forma:
SELECT Nombre, Apellidos, IdFactura FROM CLIENTES INNER JOIN FACTURAS USING(CodCliente);
A continuacin se combinan 3 tablas para obtener el importe total (suma de unidades*precio) de los
recambios sustituidos en cada reparacin:
SELECT REPARACIONES.IdReparacion, sum(Unidades * PrecioReferencia) AS 'Importe recambios' FROM
REPARACIONES INNER JOIN INCLUYEN ON REPARACIONES.IdReparacion=Incluyen.IdReparacion) INNER JOIN
RECAMBIOS ON Incluyen.IdRecambio=RECAMBIOS.IdRecambio GROUP BY IdReparacion;
Reflexiona
Compara las siguientes alternativas para definir combinaciones internas:
a.
b.
26
UT_4 GBD
Porque para relacionar las tablas con USING la columna por la cual se establece la combinacin
se tiene que llamar igual en ambas tablas, y para establecer una relacin las columnas deben
tener el mismo tipo de datos y tamao, pero pueden tener distinto nombre de columna.
Retroalimentacin:
Porque para relacionar las tablas con USING la columna por la cual se establece la combinacin
se tiene que llamar igual en ambas tablas, y para establecer una relacin las columnas deben
tener el mismo tipo de datos y tamao, pero pueden tener distinto nombre de columna.
Ejercicio: INNER JOIN
Realiza las siguientes consultas sobre la base de datos bdempleados, usando INNER JOIN:
Selecciona todos los campos de la tabla clientes junto a los datos de los pedidos que han
realizado.
Selecciona todos los campos de la tabla clientes junto a los datos de los pedidos que han
27
UT_4 GBD
SELECT .FROM NombreTabla1 RIGHT JOIN NombreTabla2 ON condicin de relacin..
SELECT .FROM NombreTabla1 RIGHT JOIN NombreTabla2
USING(ColumnaRelacionada)
SELECT .FROM NombreTabla1 RIGHT OUTER JOIN NombreTabla2 ON condicin de
relacin..
En la siguiente consulta, aunque tengamos algn cliente al que no le hayamos girado an ninguna
factura se mostrar su nombre y apellidos. En el IdFactura aparecer NULL:
SELECT Nombre, Apellidos, IdFactura FROM CLIENTES LEFT JOIN FACTURAS ON CLIENTES.CodCliente =
FACTURAS.CodCliente;
En este caso el resultado mostrara el nmero de las facturas aunque no existiera ningn cliente
relacionado.
En
las
columnas
nombre
y
apellidos
mostrara
NULL.
En realidad, este caso no podra darse puesto que hemos exigido en la definicin de la relacin que
no pueda haber ninguna factura que no est asociada a ningn cliente (Integridad referencial):
SELECT Nombre, Apellidos, IdFactura FROM CLIENTES RIGHT JOIN FACTURAS ON CLIENTES.CodCliente =
FACTURAS.CodCliente;
Ejercicio resuelto
Obtener un listado de los vehculos registrados en nuestra base de datos que no hayan
sufrido reparaciones.
SELECT VEHICULOS.Matricula, Marca, Modelo, Color, Avera
FROM VEHICULOS LEFT JOIN REPARACIONES
ON VEHICULOS.Matricula = REPARACIONES.Matricula
WHERE Avera IS NULL;
Solution:
SELECT VEHICULOS.Matricula, Marca, Modelo, Color, Avera
FROM VEHICULOS LEFT JOIN REPARACIONES
ON VEHICULOS.Matricula = REPARACIONES.Matricula
WHERE Avera IS NULL;
Ejercicio: LEFT JOIN/RIGHT JOIN
Realiza las siguientes combinaciones sobre la base de datos bdempleados, usando siempre el
operador de combinacin ms apropiado:
Se pretende obtener una relacin en la que aparezcan los datos de todas las oficinas junto a
los nombres y las edades de los directores de cada una de ellas (si una oficina no tiene
director entonces los datos de este aparecern en blanco).
Obtener una relacin que contenga por un lado los nombres y ttulos de los empleados, y
adems cdigos y la ciudad de las oficinas de los mismos. Aparecern los datos de todas
las oficinas, aunque estas no tengan empleados asignados.
Se pretende obtener una relacin en la que aparezcan los nombres de todos los empleados
que son jefe junto con los nombres de todos los empleados, aunque estos ltimos no
tengan jefe.
28
UT_4 GBD
13.- Subconsultas.
Siguiendo los pasos de Alejandra, parece que ya estamos listos para escribir cualquier tipo de
consulta en SQL que nos permita acceder a la informacin almacenada, pero no es as. En
muchas ocasiones para realizar una consulta necesitaremos los datos devueltos por otra consulta.
Investigaremos con Alejandra si este tipo de consultas, denominadas subconsultas, estn
recogidas en el SQL de nuestro SGBD MySQL, y cmo se utilizan.
Para entender la necesidad de realizar una subconsulta veremos un ejemplo: supongamos que
queremos obtener un listado con las actuaciones que se llevan a cabo en nuestro taller, cuyo
importe est por encima del importe medio.
Con lo que hemos visto hasta ahora necesitaramos hacer dos consultas:
Las subconsultas permiten escribir estas dos consultas en una, escribiendo tras la clusula WHERE
otra sentencia SELECT. As el SELECT principal acta sobre las filas devueltas por el SELECT
anidado.
La sintaxis ser:
SELECT NombreColumna,. FROM NombreTabla, WHERE Expresin
OperadorRelacional (SELECT.)
En nuestro ejemplo sera:
SELECT Descripcion FROM ACTUACIONES WHERE Importe > <br />(SELECT avg(Importe) FROM
ACTUACIONES);
El tipo de dato de la expresin situada despus de WHERE debe coincidir con el tipo de dato
devuelto por la subconsulta.
Dentro de una consulta se pueden usar varias subconsultas enlazadas con el operador AND. Las
subconsultas se pueden usar dentro de otras sentencias como DELETE, INSERT, UPDATE o
CREATE.
Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal exceptuando que
aparece encerrada entre parntesis, no puede contener la clusula ORDER BY, ni puede ser la
UNION de varias sentencias SELECT, adems tiene algunas restricciones en cuanto a nmero de
columnas segn el lugar donde aparece en la consulta principal. Estas restricciones las iremos
describiendo en cada caso.
Cuando se ejecuta una consulta que contiene una subconsulta, la subconsulta se ejecuta por cada
fila de la consulta principal.
Se aconseja no utilizar campos calculados en las subconsultas, ralentizan la consulta.
29
UT_4 GBD
Las consultas que utilizan subconsultas suelen ser ms fciles de interpretar por el usuario.
A menudo, es necesario, dentro del cuerpo de una subconsulta, hacer referencia al valor de una
columna en la fila actual de la consulta principal, ese nombre de columna se denomina referencia
externa.
Una referencia externa es un nombre de columna que, estando en la subconsulta, no se refiere a
ninguna columna de las tablas designadas en la FROM de la subconsulta sino a una columna de las
tablas designadas en la FROM de la consulta principal. Como la subconsulta se ejecuta por cada
fila de la consulta principal, el valor de la referencia externa ir cambiando.
En la siguiente consulta se observa una subconsulta que contiene una referencia externa,
numemp, que es un campo de la tabla empleados, es decir, de la tabla origen de la consulta
principal.
SELECT numemp, nombre, (SELECT MIN(fechapedido) FROM pedidos WHERE rep= numemp) FROM
empleados;
Cuando se ejecuta la consulta anterior se coge el primer empleado y se calcula la subconsulta
sustituyendo numemp por el valor que tiene en el primer empleado, el 101; de este modo la
subconsulta obtiene la fecha ms antigua en los pedidos del representante 101. Seguidamente se
coge el segundo empleado y se calcula la subconsulta con numemp = 102 (numemp del segundo
empleado), y as sucesivamente hasta llegar al ltimo empleado. Al final obtenemos una lista con el
nmero, nombre y fecha del primer pedido de cada empleado. Si quitamos la clusula WHERE de
la subconsulta obtenemos la fecha del primer pedido de todos los pedidos no del empleado
correspondiente.
Las subconsultas pueden anidarse de forma que una subconsulta aparezca en la clusula WHERE,
por ejemplo, de otra subconsulta que a su vez forma parte de la consulta principal. En la prctica,
una consulta consume mucho ms tiempo y memoria cuando se incrementa el nmero de niveles
de anidamiento. La consulta resulta tambin ms difcil de leer, comprender y mantener cuando
contiene ms de uno o dos niveles de subconsultas.
En el siguiente ejemplo, por cada lnea de pedido, se calcula la subconsulta de clientes, y esto se
repite por cada empleado, en el caso de tener 10 filas de empleados y 200 filas de pedidos, la
subconsulta ms interna se ejecutara 2000 veces.
SELECT numemp, nombre FROM empleados WHERE numemp = (SELECT DISTINCT rep FROM pedidos WHERE
clie =
(SELECT numclie FROM clientes WHERE nombre = 'Julia Antequera'))
Cuando la subconsulta aparece en la lista de seleccin (vase ejemplo anterior) de la consulta
principal no puede devolver varias filas ni varias columnas, de lo contrario se genera error.
Muchos SQLs no permiten que una subconsulta aparezca en la lista de seleccin de la consulta
principal, pero eso no supone ningn problema, ya que normalmente se puede obtener lo mismo
utilizando como origen de datos las dos tablas. El resultado del ejemplo anterior se puede obtener
de la siguiente forma:
SELECT numemp, nombre, MIN(fechapedido) FROM empleados LEFT JOIN pedidos ON empleados.numemp =
pedidos.rep GROUP BY numemp, nombre
En la clusula FROM se puede encontrar una sentencia SELECT encerrada entre parntesis, pero
ms que subconsulta sera una consulta, ya que no se ejecuta para cada fila de la tabla origen sino
que se ejecuta una sola vez al principio, su resultado se combina con las filas de la otra tabla para
formar las filas origen de la SELECT primera y no admite referencias externas.
Se suelen utilizar subconsultas en las clusulas WHERE o HAVING cuando los datos que
queremos visualizar estn en una tabla pero para seleccionar las filas de esa tabla necesitamos
comprobar el valor de un dato que est en otra tabla. En este caso la subconsulta acta de
30
UT_4 GBD
operando dentro de la condicin.
En este ejemplo listamos el nmero y nombre de los empleados cuya fecha de contrato sea igual a
la primera fecha de todos los pedidos de la empresa.
SELECT numemp, nombre FROM empleados WHERE contrato = (SELECT MIN (fechapedido) FROM pedidos)
Reflexiona
En la prctica una consulta consume mucho ms tiempo y memoria cuando se incrementa el
nmero de niveles de anidamiento, adems resulta ms difcil de leer y de mantener cuando
contiene ms de dos niveles de anidamiento.
Ejercicio resuelto
Obtener los nombres de los empleados que no hayan intervenido en reparaciones desde
Enero.
SELECT Apellidos, Nombre FROM EMPLEADOS WHERE CodEmpleado NOT IN
(SELECT CodEmpleado FROM Intervienen, REPARACIONES WHERE
REPARACIONES.IdReparacion = Intervienen.IdReparacion AND FechaSalida>=2011-01-01);
Solution:
SELECT Apellidos, Nombre FROM EMPLEADOS WHERE CodEmpleado NOT IN
(SELECT CodEmpleado FROM Intervienen, REPARACIONES WHERE
REPARACIONES.IdReparacion = Intervienen.IdReparacion AND FechaSalida>=2011-01-01);
Ejercicio: Subconsultas en la lista de seleccin.
Utiliza subconsultas para obtener los siguientes resultados de la base de datos bdempleados:
Los cdigos y nombres de la ciudad de todas las oficinas junto a la cantidad mxima de
ventas de uno de sus trabajadores.
Los cdigos y nmeros de todos los pedidos cuyo importe sea mayor de 20000, junto con la
cuota del empleado que hizo el pedido.
Las descripciones de los productos junto al total de unidades vendidas y la media de los
importes vendidos del mismo.
Las ciudades de las oficinas, los nombres de los empleados y sus fechas de contrato, de
todos los empleados cuyas ventas multiplicadas por dos sean mayores que la media de
ventas de todas las oficinas que tengan unas ventas mayores de 600000.
Los nombres de los empleados que sean representantes cuyas ventas supongan al menos el
15% del total de ventas de todas las oficinas de las regiones este y centro juntas.
Cada fabricante y la media del precio de sus productos, descartando los productos para los
que las existencias sean menores que 20. En el resultado no aparecern los datos de un
fabricante cuya media de precios de productos sea menor que la treintava parte de la
media de precios de los productos vendidos en 2010.
Los nombres de los clientes y de sus empleados asignados, para los que su lmite de crdito
sea mayor que la media de los importes de las tres primeras lneas de la tabla pedido. En
el resultado los registros aparecern ordenados por el nombre de los clientes.
La descripcin de todos los productos as como el mayor precio del producto asociado a dicha
descripcin. En el resultado final no aparecern las descripciones de los productos cuyo
mayor precio sea inferior al menor importe de todos los pedidos cuyo importe sea mayor de
100. El resultado final aparecer ordenado por las descripciones de los productos.
31
UT_4 GBD
En el siguiente ejemplo se listan las oficinas cuyo objetivo sea superior a la suma de las ventas de
sus empleados. En este caso la subconsulta devuelve una nica columna y una nica fila (es un
consulta de resumen):
SELECT oficina, ciudad FROM oficinas WHERE objetivo > (SELECT SUM(ventas) FROM empleados WHERE
empleados.oficina = oficinas.oficina)
Con el test ANY se evala la comparacin con cada valor devuelto por la subconsulta. Si
alguna de las comparaciones individuales produce el resultado verdadero, el test ANY
devuelve el resultado verdadero. Si la subconsulta no devuelve ningn valor, el test ANY
32
UT_4 GBD
devuelve falso. Si el test de comparacin es falso para todos los valores de la columna,
ANY devuelve falso. Si el test de comparacin no es verdadero para ningn valor de la
columna, y es nulo para al menos alguno de los valores, ANY devuelve nulo.
La siguiente subconsulta devuelve una nica columna con las sumas de las cuotas de los
empleados de cada oficina. Se listarn en el resultado las oficinas cuyo objetivo sea
superior a alguna de las sumas obtenidas.
SELECT oficina, ciudad FROM oficinas WHERE objetivo > ANY (SELECT SUM(cuota) <br />FROM empleados
GROUP BY oficina);
Con el test ALL se evala la comparacin con cada valor devuelto por la subconsulta. Si
todas las comparaciones individuales producen un resultado verdadero, el test devuelve
el valor verdadero. Si la subconsulta no devuelve ningn valor el test ALL devuelve el
valor verdadero. Si el test de comparacin es falso para algn valor de la columna, el
resultado es falso. Si el test de comparacin no es falso para ningn valor de la columna,
pero es nulo para alguno de esos valores, el test ALL devuelve valor nulo.
A continuacin se listan las oficinas cuyo objetivo sea superior a todas las sumas.
SELECT oficina, ciudad FROM oficinas WHERE objetivo > ALL (SELECT SUM(cuota) <br />FROM empleados
GROUP BY oficina);
Ejercicio: ANY y ALL.
Utiliza subconsultas para obtener los siguientes resultados de la base de datos bdempleados:
Los nombres y ttulos de los empleados para los que el 50% de su cuota sea mayor que las
ventas asociadas a alguna de las oficinas del centro o del oeste.
Los nombres de los empleados para los que el doble de sus ventas sea mayor que las ventas
asociadas a cada una de las oficinas del este.
Los nombres de los empleados para los que la diferencia entre sus cuotas y sus ventas sea
mayor que el 20% de los objetivos de cada una de las oficinas del este y mayor que el 10%
de las ventas de todas y cada una de las oficinas del oeste.
Los identificadores de los productos as como su descripcin, para todos aquellos productos
para los cuales la dcima parte de sus existencias sea mayor que la cantidad incluida en
todas y cada una de sus lneas de pedido (una a una, sin sumarlas). Analiza el resultado y
determina, manualmente, cuales son los que realmente cumplen la condicin que se
indica. Por qu se cuelan en el resultado tantos registros?
El cdigo de los pedidos y los nombres de los clientes que lo hicieron, para todos aquellos
pedidos cuyo representante tenga jefe o tenga una cuota mayor que 300000.
El nombre de los clientes y los nombres de sus representantes y sus edades, para todos los
clientes que tengan un lmite de crdito al menos 40 veces mayor que el importe de cada
una de las lneas de pedido que hizo.
El cdigo y ciudad de las oficinas, as como los nombres y edades de los jefes de los
directores de las mismas. En el resultado slo se incluirn los datos de las oficinas que
tienen un director cuyo jefe haya hecho algn pedido de los productos 2a44l o 41002 o
xk47.
33
UT_4 GBD
SELECT numemp, nombre, oficina FROM empleado WHERE oficina IN (SELECT oficina FROM oficinas WHERE
region = 'este');
Cuando se trabaja con tablas muy voluminosas el test EXISTS suele dar mejor rendimiento que el
test IN.
Ejercicio: IN/EXISTS
Utiliza subconsultas para obtener los siguientes resultados de la base de datos bdempleados:
Se piden los identificadores de los productos as como su descripcin, para todos aquellos
productos para los cuales la cuarta parte de sus existencias sean mayor que la cantidad
incluida en todas y cada una de sus lneas de pedido, pero saldrn los datos de aquellos
productos que tengan asociada al menos una lnea de pedidos.
La descripcin de los artculos y su cdigo, para los que se hayan hecho pedidos con un
importe mayor que 20000 y una cantidad mayor que 8 en una sola lnea de pedido.
Los cdigos y nmeros de pedido, as como el nombre del empleado que los hizo y la ciudad
de su oficina, para todas las lneas de pedido hechas sobre un producto cuyas existencias
sean mayores de 20.
Los nombres de los clientes y su lmite de crdito, para todos los clientes que tengan un
representante que pertenezca a una oficina que tenga objetivo y venta mayores que cero
(cuidado con los nulos).
34
Funciones de comparacin:
GREATEST(valor1, valor2, )
LEAST(valor1, valor2, )
IFNULL(expr1, expr2)
Ejemplos:
1) Obtener el valor de los recambios que tenemos en el taller sin decimales, de dos formas:
a) Truncando el resultado:
SELECT IdRecambio, Descripcion, TRUNCATE(Stock*PrecioReferencia),0) AS 'Valor almacen' FROM
RECAMBIOS;
b) Redondeando el resultado:
SELECT IdRecambio, Descripcion, ROUND((Stock*PrecioReferencia),0) AS 'Valor almacen' FROM RECAMBIOS;
Orservar el resultado, por ejemplo, para el IdRecambio= 'RV_222_666'.
2) Obtener el nombre completo de los empleados del taller, en maysculas.
SELECT UPPER(CONCAT(Nombre,' ', Apellidos)) FROM EMPLEADOS;
3) Extraer las letras de las matrculas de los vehculos.
SELECT SUBSTR(Matricula,5,4) AS 'Letras de las matrculas' FROM VEHICULOS;
4) Cuntos das han transcurrido desde que sali del taller el vehculo de matrcula 1515 DEF.
SELECT CURDATE()-FechaSalida AS 'Dias transcurridos' FROM REPARACIONES WHERE Matricula='1515 DEF';
5) A los 3 meses de retirar un coche llamamos al cliente para valorar su satisfaccin. Obtener un listado con las
matriculas y las fechas en que haremos la llamada transcurridos esos 3 meses.
SELECT Matricula, DATE_ADD(FechaSalida, INTERVAL 3 MONTH) FROM REPARACIONES;
6) Mostrar los telfonos de los clientes. En caso de que no tengan telfono mostrar sin telfono.
SELECT IFNULL(telefono, 'Sin telfono') FROM CLIENTES;
7) Mostrar la antigedad de los empleados en aos.
SELECT CONCAT(Nombre,' ', Apellidos) AS 'Nombre del empleado',
YEAR(CURDATE())-YEAR(FechaAlta)-(RIGHT(FechaAlta, 5) > RIGHT(CURDATE(), 5)) AS 'Aos de Antiguedad'
FROM EMPLEADOS;
8) Cuantos das, por trmino medio, est un coche en el taller. Mostrar nicamente 2 decimales?
SELECT ROUND(AVG(TO_DAYS(FechaSalida)-TO_DAYS(FechaEntrada)),2) AS 'Dias transcurridos'
FROM REPARACIONES;