Documente Academic
Documente Profesional
Documente Cultură
Consultas de
MySQL.
1
UNIVERSIDAD NACIONAL DE TRUJILLO
ESCUELA DE INGENIERIA DE SISTEMAS
2
INDICE:
Creacin de una tabla . 4
Listado de las tablas de una base de datos con SHOW
TABLES . 6
Anlisis de la estructura de las tablas con DESCRIBE
6
Insercin de nuevos registros en una tabla . 7
Insercin de datos dentro de una instruccin INSERT
................................................................................. 8
Insercin de grandes cantidades de datos desde un
archivo de texto con LOAD DATA . 9
Recuperacin de informacin de una tabla . 11
Orden en el que MySQL procesa las condiciones . 12
Correspondencia de patrones 13
Ordenacin 14
Limitacin del nmero de resultados ...................... 16
Devolucin del valor mximo con MAX () . 16
Recuperacin de registros distintos . 17
Como contar ............................................................. 18
Como recuperar la media. el mnimo y el total con AVG ().
MIN () y SUM () . 19
Realizacin de clculos en una consulta...................... 20
Eliminacin de registros ............................................ 21
Como cambiar los registros de una tabla 21
Eliminacin de tablas y bases de datos....................... 22
Como modificar la estructura de la tabla ................... 22
Como agregar una columna .................................... 23
Modificacin de una definicin de columna............... 24
Como cambiar el nombre de una columna ................ 25
3
Como eliminar una columna ..................................... 25
Uso de las funciones de fecha 25
Como especificar el formato de fecha . 27
Recuperacin de la fecha y la hora actual . 28
Creacin de consultas ms avanzadas 29
Como aplicar un nuevo encabezado a una columna con
AS ............................................................................... 30
Combinacin de columnas con CONCAT....................... 30
Como buscar el da del ao . 31
Como trabajar con varias tablas 31
Combinacin de dos o ms tablas................................. 33
Realizacin de clculos con fechas................................ 35
Agrupacin de una consulta . 37
4
Creacin de una tabla
Tras conectarse a la base de datos, es probable que desee introducir datos. Para ello, vamos a
crear una base de datos que puede hacer el seguimiento de un equipo de ventas. Como ya
aprendimos, las bases de datos, se componen de una gran cantidad de tablas y, para empezar,
crearemos una tabla que contenga datos sobre 10 comerciales. Almacenaremos sus nombres,
nmeros de identificacin y comisiones. Para crear una tabla, tambin vamos a utilizar el
comando CREATE, pero necesitaremos especificar TABLE en lugar de DATABASE, as como
algunos elementos adicionales. Introduzca la siguiente instruccin CREATE:
ADVERTENCIA:
No se olvide el punto y coma al final de la lnea. Todos los comandos de MySQL
deben terminar en punto y coma.
Su olvido es la principal razn de frustacion para los principiantes. Adems, si no
introduce el punto y coma y pulsa intro, tendr que hacerlo antes de volver a pulsar
Intro. MySQL acepta comandos distribuidos en varias lneas.
5
sin problemas. Sin embargo, si utilizamos el siguiente fragmento:
ERROR 1064: You have an error in your SQL syntax near 'TABLES sales-
reps (emp1oyee-number INT, surname VARCHAR (40) , f irst-name
VARCHAR (30) ' at line 1
porque se ha escrito errneamente TABLE. Por lo tanto, a1 escribir texto en maysculas tenga
cuidado de no introducir errores; puede cambiar el texto en minsculas sin problemas (siempre
y cuando se haga de forma uniforme y se utilicen 10 mismos nombres de principio a fin). Puede
que se est preguntando por el significado de 10 trminos INT, VARCHAR y TINY INT que
aparecen tras 10s nombres de 10s campos. Es lo que se denominan tipos de datos o tipos de
columna. INT equivale a entero, un numero sin decimales cuyo valor oscila entre -2.147.483.648
y 2.147.483.647. Es aproximadamente a un tercio de la poblacin mundial, por lo que resultara
suficiente para el equipo de ventas, por mucho que crezca. VARCHAR equivale a caracter de
longitud variable. El nmero entre parntesis indica la longitud mxima de la cadena de
caracteres. Una cantidad de 30 y 40 caracteres resultar suficiente para el nombre y el apellido
de 10 comerciales, respectivamente. Y TINYINT equivale a entero pequeo, por lo general un
numero sin decimales cuyo valor oscila entre -128 y 127. El campo commission indica un valor
de porcentaje y, como nadie puede ganar ms del 100 por cien, basta con utilizar un numero
entero pequeo.
6
Listado de las tablas de una base de datos con SHOW TABLES
Ahora que ya tenemos una tabla, podemos confirmar su existencia con SHOW TABLES:
SHOW TABLES muestra todas las tablas existentes en la base de datos actual. En el caso de
nuestra tabla firs-tdb solo tenemos una: sales - rep. Por lo tanto, a menos que tenga un problema
de memoria, este comando no resulta de gran utilidad en este momento. Sin embargo, en las
bases de datos de gran tamao compuestas por una gran cantidad de tablas, este comando
resultara de utilidad para recordar el nombre de aquella tabla que creamos hace dos meses y
cuyo nombre hemos olvidado. Tambin puede ocurrir que tengamos que trabajar sobre una
base de datos que no hayamos creado. En este caso, el comando SHOW TABLES resultara de
gran valor.
Mysql>DESCRIBE sales-rep;
Esta tabla incluye todo tipo de columnas con las que no est todava familiarizado. Fjese por el
momento en la columna Field y en la columna Type.
7
Insercin de nuevos registros en una tabla
Ahora que ya tenemos una tabla, procederemos a introducir algunos datos en ella. Supongamos
que tenemos tres comerciales.
Para introducir estos datos en la tabla, se utiliza la instruccin SQL INSERT para crear un registro,
de la siguiente forma:
8
Existe otra forma ms sencilla de introducir datos con la instruccin INSERT, como se muestra
en la siguiente secuencia:
mysql> INSERT INTO sales-rep VALUES (1,' Rive', 'Sol ' ,10);
mysql> INSERT INTO sales-rep VALUES (2, 'Gordimer ', ' Charlene ' ,15);
mysql> INSERT INTO sales-rep VALUES (3, 'Serote', 'Mike' ,10);
Si introduce los comandos de esta forma, debe incluir los campos en el mismo orden en el que
se define en la base de datos. No puede utilizar la siguiente secuencia:
mysql> INSERT INTO sales-rep VALUES (1, 'Sol ', 'Rive' ,10);
Query OK, 1 row affected (0.00 sec)
Aunque esta secuencia funciona en apariencia, los datos se han introducido en el orden
incorrecto, ya que Sol ser el apellido y Rive el nombre.
Este mtodo reduce la cantidad de cdigo que resulta necesario escribir y el servidor procesa la
secuencia de manera ms rpida.
9
Insercin de grandes cantidades de datos desde un archivo de
texto con LOAD DATA
Una ltima forma de insertar datos (y la mejor en caso de que se necesiten introducir grandes
cantidades de datos a la vez) consiste en utilizar la instruccin LOAD DATA, de la siguiente forma:
El formato del archivo de datos debe ser correcto, sin excepciones. En este caso, en el que
estamos utilizando los valores predeterminados, el archivo de texto incluye cada registro en una
nueva lnea y cada campo se separa por medio de un tabulador. Si asumimos que el caracter \ t
representa un tabulador y que cada lnea termina en un caracter de nueva lnea, el archivo
presentara este aspecto:
Se utiliza una variacin de esta secuencia para restaurar copias de seguridad (comentadas en un
capitulo posterior). Esta instruccin resulta incluso ms eficaz que una instruccin INSERT para
introducir varios registros. La palabra clave LOCAL indica al servidor que el archivo se encuentra
incluido en el equipo cliente (el equipo desde el que se establece la conexin). Si se omite,
MySQL buscara el archivo en el servidor de la base de datos. De manera predeterminada, LOAD
DATA asume que los valores se encuentran en el mismo orden que en la definicin de la tabla,
que cada campo est separado por un tabulador y que cada registro se incluye en una lnea.
10
RECUPERACION DE INFORMACION DE UNA TABLA
La operacin de extraer informacin de una tabla resulta sencilla. Para ello, puede
utilizar el potente comando SELECT, como se muestra en el siguiente ejemplo:
Tambin puede utilizar el carcter comodn (*) para devolver todos los campos, de la
siguiente forma:
El uso del comodin * indica todos los campos de la tabla. Por lo tanto, en el ejemplo
anterior, se recuperan los cuatro campos, en el mismo orden en el que se recogen en la
estructura de la tabla. La parte de la instruccin SELECT situada tras el termino WHERE
se denomina clausula WHERE. Esta clausula es muy flexible y contiene una gran cantidad
de condiciones de distinto tipo. Examine el siguiente ejemplo:
11
La comprensin de los operadores AND y OR es fundamental para utilizar SQL
correctamente. Las condiciones situadas a ambos lados de la palabra clave AND deben
ser verdad para que el conjunto sea verdadero. En el caso de una instruccin OR basta
con que una de las condiciones sea verdadera. En la tabla 1.4 se recoge la tabla de
verdad de 10s operadores AND/OR. Tabla
12
ORDEN EN EL QUE MYSQL PROCESA LAS CONDICIONES
El siguiente ejemplo muestra una trampa en la que resulta sencillo caer. Suponga que
nuestro jefe nos pide una lista de los empleados cuyo apellido sea Rive y cuyo nombre
sea Sol o que su comission supere el 10 por ciento. Podramos construir la siguientes
consultas:
Puede que este sea el resultado que estbamos buscando. Pero puede que nuestro jefe
se refiriera a otra cosa: que el empleado tenga como apellido Rive y, dentro de estos
registros, que su nombre sea Sol o que tenga una comission superior al 10%. En este
caso, el segundo registro devuelto por la consulta no seria pertinente porque aunque su
porcentaje es superior al 10%, no se llama Sol. La construccin AND implica que ambas
clausulas deben ser verdaderas. En este caso, la consulta presentara este aspecto:
13
CORRESPONDENCIA DE PATRONES
A continuacin examinaremos algunos elementos adicionales de la instruccin SELECT.
Imagine que queremos recuperar los datos de Mike Serote. Sencillo, ya que bastara con
utilizar la siguiente consulta:
14
Tambin puede utilizar una consulta como la siguiente, en la que se buscan apellidos
que contengan una e en alguna parte de su nombre y que terminen en una e:
ORDENACION
Existe otra clausula til y de uso habitual que permite la ordenacin de los resultados.
Una lista alfabtica de empleados resulta de utilidad y puede recurrir a la clausula
ORDER BY para generarla.
Como habr observado, la lista no es correcta si desea ordenarla por nombres ya que
Sol Rive aparecen antes que Mongane Rive. Para corregir este problema, necesitara
ordenar la lista por los nombres cuando los apellidos de dos registros coincidan. Para
ello, utilice la siguiente instruccin:
15
Ahora el pedido es correcto. Para ordenar la lista de registros de forma inversa (en orden
descendente), se utiliza la palabra clave DESC. La siguiente consulta devuelve todos 10s
registros segn la comisin asignada, de mayor a menor:
De nuevo, puede ordenar los registros de los tres empleados que tienen asignado un 10
por ciento de comisin. Para ello, puede utilizar la palabra clave ASC. Aunque no resulta
estrictamente necesario porque se trata del orden aplicado de manera predeterminada,
el uso de esta palabra clave aporta mayor claridad:
16
LIMITACION DEL NLIMERO DE RESULTADOS
Hasta el momento siempre se ha obtenido el numero completo de resultados que
satisfacen las condiciones establecidas. Sin embargo, en una base de datos real, puede
que se trate de varios miles de registros y que no queramos verlos todos a la vez. Para
ello, MySQL permite utilizar la clausula LIMIT. Se trata de una clausula no convencional
de SQL que, por tanto, no podr utilizar de la misma forma en todas las bases de datos,
per0 resulta de gran potencia y utilidad en MySQL.
Si solo desea buscar el empleado con la mayor comission (suponiendo que solo sea uno,
como en nuestro conjunto de datos de ejemplo), puede ejecutar la siguiente consulta:
El empleado que estamos buscando es Charlene Gordime. Sin embargo, LIMIT permite
devolver nicamente dicho registro, de la siguiente manera:
17
DEVOLUCION DEL VALOR MAXIMO
con MAX () MySQL consta de una gran cantidad de funciones que permiten ajustar las
consultas. No es necesario aprenderse todas ellas. Nadie se las sabe. Pero una vez
conocida su existencia puede intentar averiguar si existe una para realizar una tarea
deseada. Con el tiempo descubrir que ha memorizado las mas habituales. Adems, este
mtodo exige mucho menos esfuerzo que aprenderlas de memoria. La primera funcin
que vamos a analizar es la funcin MAX ( ) . Utilizaremos esta funcin para recuperar la
comission mas ac asignada a un comercial:
Fjese en los parntesis al utilizar las funciones. Las funciones se aplican a todos los
elementos incluidos en su interior. A lo largo de este libro, se utilizan los parntesis para
indicar que se trata de una funcin y como utilizarla; por ejemplo, MAX ( ) .
Esta consulta es correcta, pero puede que no desee recuperar apellidos repetidos, como
en el caso de Rive en los registros correspondientes a los nombres Mongane y Sol,
sino solamente una vez. La solucin consiste en utilizar la instruccin DISTINCT, de la
siguiente forma:
18
COMO CONTAR
Como puede observar por los resultados de los ejemplos utilizados hasta ahora, MySQL
muestra el nmero de filas, como 4 rows in set. En ocasiones, solo necesitaremos
saber el nmero de resultados y no los contenidos de los registros. Para ello se utilizar
la funcin COUNT ( ).
Para contar el nmero de apellidos distintos que contiene la tabla, se combinan las
instrucciones COUNT ( ) y DISTINCT, de la forma siguiente:
19
COMO RECUPERAR LA MEDIA, EL MNIMO Y EL TOTAL CON AVG( ), MIN( ) Y
SUM()
Estas funciones se utilizan de la misma forma que MAX ( ). Dentro de los parntesis se
incluye el campo con el que se desee trabajar. Por ejemplo, para obtener la comisin
media, se utiliza la siguiente consulta:
20
REALIZACIN DE CLCULOS EN UNA CONSULTA
SQL le permite realizar clculos en las consultas. Examine la siguiente instruccin como
ejemplo:
21
ELIMINACIN DE REGISTROS
22
ELIMINACIN DE TABLAS Y BASES DE DATOS
Tambin existen instrucciones para definir la estructura de los datos y estas forman
parte del Lenguaje de definicin de datos de SQL (DDL). Ya hemos visto una (la
instruccin CREATE) que se utiliza para crear bases de datos y, tras ello, las tablas y las
estructuras dentro de las bases de datos. Como en el caso de los datos, tambin puede
eliminar o modificar las tablas. A continuacin, crearemos una tabla y la eliminaremos:
La tabla y todos sus datos desaparecern sin ningn aviso ni notificacin. Por lo tanto,
tenga cuidado con esta instruccin.
Puede hacer lo mismo con una base de datos
Ya se habr hecho una idea de por qu resultan tan importantes los permisos.
Si concede a todo el mundo un poder semejante, el resultado puede ser desastroso. En
un capitulo posterior se explica cmo evitar catstrofes de este tipo.
Suponga que necesita crear una columna en la tabla sales_reps para almacenar la
fecha en la que contrata a los comerciales. UPDATE no servira, ya que esta
instruccin solo modifica los datos, no la estructura. Para realizar este cambio, es
necesario utilizar la instruccin ALTER:
23
TRUCO: DATE es un tipo de columna que almacena datos en formato ao-mes-da
(AAAA-MM-DD). Si est acostumbrado a introducir las fechas de otras formas, como
en el formato estadounidense (MM/DD/AAAA), necesitara realizar una serie de
ajustes:
Pero adems, se nos pide otro requisito. (Aunque la mayor parte de los cambios
resultan fciles de realizar, es aconsejable determinar el diseo de la base de datos
correctamente desde el principio ya que algunos cambios pueden tener
consecuencias poco deseables. En un captulo posterior, se aborda el tema del
diseo de base de datos.) En concreto, se nos pide que almacenemos el ao de
nacimiento de los comerciales para poder analizar la distribucin de edad de la
plantilla. Para ello, puede utilizar el tipo de columna YEAR que incluye MySQL.
Pero segundos despus de agregar el ao, a nuestro jefe se le ocurre una idea mejor.
Por que no almacenar la fecha de nacimiento completa de los comerciales? De esta
forma se seguir almacenando el ao, pero adems la compaa podr sorprender a
sus comerciales con un regalo por sus cumpleaos. Utilice la siguiente secuencia
para modificar la definicin de columna:
24
el nombre de la columna, basta con mantener el nombre anterior, como se indica a
continuacin:
antiguo-nombre nueva_definicin_de_columna;
Tambin puede utilizar la clusula MODIFY, sin que resulte necesario repetir el
nombre, de la siguiente forma:
Una maana a su jefe deja de gustarle el nombre utilizado para designar a los
comerciales y le pide que sustituya sales rep por cash-flow enhancers y que se aada
una nueva columna para recoger el valor de la contribucin de los comerciales al
bienestar de la empresa. Para complacerle, decidimos agregar un nuevo campo en
primer lugar:
25
Query OK, 4 rows affected (0.00 sec)
NOTA: Observe la diferencia entre las instrucciones ALTER NAME: tras la segunda
instruccin RENAME se ha introducido TO. Ambas instrucciones son idnticas en
cuanto a su funcin. Existen varios casos en lo que MySQL dispone de ms de una
forma de realizar una accin. De hecho, podemos cambiar el nombre de una tabla de
otra forma: con la instruccin RENAME antiguo nombre_de_tabla TO
nuevo_nombre_de_tabla. La funcin de estas opciones es proporcionar
compatibilidad con otras bases de datos o con el estndar SQL ANSI.
26
Si realizamos una consulta que devuelva los valores data_joined y birthday,
obtendremos los siguientes valores:
Los valores NULL indican que nunca se ha introducido nada en estos campos. Habr
observado los encabezados NULL que se devuelven al describir una tabla. La opcin
predeterminada es YES, que permite que el campo este vaco. Sin embargo, puede
que necesitemos especificar que el campo no contenga un valor NULL (en un
captulo posterior aprenderemos a hacerlo). El uso de valores NULL suele afectar a
los resultados de las consultas y tienen sus particularidades, que se analizaran en
captulos posteriores. Para estar seguro de no utilizar valores NULL, actualice los
registros de los comerciales de la siguiente forma:
WHERE employee_number=1;
WHERE employee_number=2;
WHERE employee_number=3;
WHERE employee_number=4;
27
Existe una gran cantidad de Ctiles funciones de fecha. Aqu solo se muestran un
pequeo conjunto. En captulos posteriores encontrara ms informacin sobre las
funciones de fecha.
WHERE employee_number=1;
28
En la siguiente consulta, %a es el nombre del da de la semana en formato abreviado,
"d es el da del mes con el sufijo adjunto, %b es el nombre del mes en formato
abreviado y %Y es el ao en formato de cuatro dgitos:
29
mysql> SELECT YEAR(birthday) FROM sales-rep;
MySQL incluye otras funciones para recuperar una parte especifica de la fecha,
como MONTH ( ) y DAYOFMONTH ( ) :
30
Como aplicar un nuevo encabezado a una columna con AS
Las consultas anteriores no resultaban muy sencillas de leer o de entender. A continuacin,
modificaremos la consulta anterior ordenando los valores devueltos por los meses e incluyendo
los nombres de los comerciales en los resultados. Tambin se introducen alias con la palabra
clave AS para asignar otro nombre a una columna:
Puede combinar los resultados de las columnas, utilizando la funcin CONCAT ( ) (que equivale
a concatenar), de la siguiente forma:
NOTA: Fjese en el espacio utilizado dentro de CONCAT (). Como en el caso de los especificadores
de fecha, puede utilizar cualquier carcter para dar formato a CONCAT ().
31
Como buscar el da del ao
Para buscar el da del ao (de 1 a1 366) en el que Sol Rive se uni a la compaa, utilice la
siguiente secuencia:
WHERE employee-number=1;
DAYOFYEAR (date-joined)
46
Hasta ahora solo hemos trabajado con una tabla para familiarizarnos con la sintaxis de SQL. La
mayor parte de las aplicaciones del mundo real constan de varias tablas, por lo que
necesitaremos aprender a trabajar en estas situaciones.
En primer lugar, vamos a agregar dos nuevas tablas a la base de datos. La tabla 1.5 contendr
los datos de los clientes (un identificador de cliente, un nombre y un apellido) y la tabla 1.6
contendr 10s datos de venta (un identificador de cliente, un identificador de comercial, el valor
de las ventas en dlares y un cdigo exclusivo para la venta).
32
Puede crear estas tablas? A continuacin se incluyen las instrucciones usadas :
33
Combinacin de dos o ms tablas
Como puede ver, aqu se utiliza el nmero del comercial y el identificador del cliente de la tabla
de ventas. Si examina el primer registro de ventas, observara que se compone de sales_rep 1,
que, al examinar la tabla sales rep, veri que se corresponde con Sol Rive. El proceso manual de
examinar la relacin entre las dos tablas es el mismo que el que realiza MySQL, siempre que se
le indique que relacin utilizar. A continuacin, escribiremos una consulta que recupere toda la
informacin desde el primer registro de ventas as como el nombre del representante de ventas.
La primera parte de la consulta, tras el comando SELECT, incluye los campos que deseamos
recuperar. La operacin resulta bastante sencilla ya que todo consiste en indicar los campos que
deseamos de las dos tablas.
La segunda parte, tras FROM, indica a MySQL que tablas utilizar. En este caso, son dos: la tabla
sales y la tabla sales rep.
La tercera parte, tras WHERE, contiene la condicin code=1, que devuelve el primer registro de
la tabla de ventas. La siguiente parte es la seccion que convierte a esta consulta en un vnculo.
ste esel lugar en el que se indica a MySQL que campos vincular o entre que campos se
relacionan las tablas. La relacin entre la tabla sales y la tabla sales_ rep se establece entre el
campo employe- number de la tabla sales_rep y el campo sales_ rep de la tabla sales . Por lo
tanto, como en el campo sales_rep aparece un 1, debe buscar el empleado con dicho numero
en la tabla sales rep. Vamos a probar otra consulta. En esta ocasin queremos recuperar todas
las ventas realizadas por Sol Rive (con numero de empleada 1). Vamos a examinar el proceso de
pensamiento subyacente a la construccin de esta consulta:
Qu tablas necesitamos? Claramente, la tabla sales rep y la tabla sales, las cuales ya forma
parten de la consulta FROM sales_rep, sales.
Y finalmente cules son las condiciones? La primera es que solo necesitamos los resultados de
Sol Rive y la segunda consiste en especificar la relacion que se establece entre el campo sales
rep de la tabla sales y el campo employee - number de la tabla sales - rep. Por lo tanto, las
condiciones son las siguientes: WHERE first_ name=' Sol ' and surname=' Rive ' AND
sales.sales_rep = sales_rep.employee_ number.
34
WHERE firs t-name= ' Sol ' AND surname= 'Rive ' AND
sales.sales-rep = sales-rep.employee-number;
Sin utilizar los nombres de las tablas delante de los nombres de archivo porque los campos de
las diferentes tablas utilizan nombres exclusivos. Tambin podramos haber escrito la consulta
de la siguiente forma:
En ambos casos se obtienen los mismos resultados. Para mostrar qu ocurre cuando se utilizan
nombres de campo iguales, vamos a modificar el campo sales_rep de la tabla de ventas y vamos
a denominarlo employee_number. No se inquiete, lo volveremos a modificar antes de que nadie
se entere:
35
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
A continuacin, vamos a intentar realizar de nuevo la unin, una vez corregido cl nombre pero
sin utilizar cl punto para especificar los nombres de las tablas:
Leyendo la consulta es probable que se d cuenta de que no resulta clara. Por lo tanto
necesitamos utilizar los nombres de las tablas cada vez que hagamos referencia a uno de los
campos employee_ number:
Antes de continuar, vamos a cambiar el nombre del campo sustituyendolo por el antiguo:
La consulta anterior no devuelve la edad, solo la diferencia en aos. No tiene en cuenta los das
ni los meses. En esta seccin se describe como calcular la edad de una persona, tarea que puede
36
resultar un tanto complicada si no tiene experiencia. Pero no si desanime. Tras practicar con una
serie de consultas bsicas; le resultara muy sencillo.
Debemos restar los aos como hemos hecho anteriormente pero adems debemos restar otro
ao si no ha transcurrido uno entero. Una persona nacida el 10 de diciembre de 2002 no tendr
un ao en enero de 2003, sino que tendr que esperar a diciembre de 2003. Una buena forma
de realizar esta operacin consiste en tomar los componentes MM-DD de los dos campos de
datos (la fecha actual y la fecha de nacimiento) y compararlos. Si el actual es mayor, habr
transcurrido un ao; con lo que puede mantener el crculo de los aos sin modificar. Si la parte
MM-DD es menor que la fecha de nacimiento; no habr transcurrido un ao entero y debe restar
un ao al crculo de los aos. Este proceso puede resultar un tanto complicado y existen algunas
formas bastante complejas de realizar los clculos decimales, pero MySQL facilita la operacin
porque devuelve 1 si la expresin verdadera y 0 si resulta falsa.
El ao actual es mayor que el ao del cumpleaos del empleado 1. Esta afirmacin es verdadera
y se le asigna el valor 1. El ao actual es menor que el ao de nacimiento. Esto es falso y se le
asigna el valor 0. A continuacin necesitamos una forma rpida de devolver el componente
MMDD de la fecha. Para ello, es aconsejable utilizar la funcin de cadena RIGHT ( ) .
RIGHT(CURRENT_DATE,5) I RIGHT(birthday,5)
04-06 03-18
04-06 11-30
04-06 01-04
04-06 06-18
37
mysql> SELECT surname, first-name, (YEAR (CURRENT-DATE) -
YEAR ( b i r t h d a y ) ) - (RIGHT (CURRENT-DATE , 5 ) <RIGHT ( b i r t h d a y , 5 ) )
AS age FROM sales-rep;
Sus resultados puede que no coincidan con estos de manera exacta por el paso del tiempo y es
posible que este utilizando una fecha posterior.
Tras desarrollar una tabla dc ventas, vamos a aplicar la funcion SUM() a un mejor uso que el que
le dimos anteriormente para calcular el valor total de las ventas:
SUM(value)
7500
A continuacin, queremos calcular las ventas totales de cada comercial. Para realizar esta tarea
manualmente, necesitamos agrupar la tabla de ventas en funcin de los comerciales.
Necesitaramos colocar todas las ventas realizadas por el comercial 1, hallar el total y repetir la
misma operacin con el comercial nmero 2. SQL dispone de la instruccin GROUP BY, que
MySQL utiliza de la misma forma:
sales-rep SUM(value)
1 2950
2 500
3 3800
4 250
Si prueba a realizar la misma consulta sin agrupar las ventas, obtendra un error:
38
mysql> SELECT sales-rep , SUM(va1ue) FROM sales ;
ERROR 1140: Mixing of GROUP columns
(MIN ( ), MAX ( ), COUNT () . . .) with no GROUP columns is illegal if there is no GROUP BY clause
Esta consulta no tiene mucho sentido, ya que intenta combinar un campo de resumen, SUM ( ),
con un campo normal. Qu esperamos? La suma de todos los valores repetidos junto a cada
comercial? Tambin puede ordenar el resultado de una consulta agrupada. Para recuperar las
ventas totales de cada comercial desde la mayor a la menor, basta con agregar la instruccin
ORDER BY:
sales-rep sum
3 3800
2 2950
1 500
4 250
A continuacin, vamos a realizar una consulta ms compleja utilizando varios de los conceptos
aprendidos. Vamos a recuperar el nombre de los comerciales que hayan obtenido los peores
resultados de ventas. En primer lugar, tendremos que devolver un nmero de empleado. Puede
que obtenga un numero diferente a1 ejecutar la consulta, ya que hay tres personas que solo han
realizado una venta. No importa el que devuelva por ahora. La consulta presentara este aspecto:
Puede ir ms all y establecer un vnculo para recuperar el nombre del comercial 4? Si es capaz
de realizar esta operacin, y al comenzar este libro no haba trabajado nunca con bases de datos,
est en muy buen camino para convertirse en un experto. A continuation, se incluye la consulta:
39
BIBLIOGRAFIA:
Colaboradores de Wikipedia. Mecanismos de almacenamiento (MySQL) [en lnea].
Wikipedia, La enciclopedia libre, 2017 [fecha de consulta:4 de junio del 2017. Disponible
en
<https://es.wikipedia.org/w/index.php?title=Mecanismos_de_almacenamiento_(MySQL
)&oldid=98472796>.
40