Inicio‎ > ‎SQL‎ > ‎Lecciones SQL‎ > ‎

T02 Consultas

Uso de más de una tabla

Para la resolución de la mayoría de requerimientos es necesario trabajar con información que se obtiene de relacionar varias tablas. La forma de especificar qué tablas vamos a consultar es construir una lista de nombres de tablas en la cláusula from.

Si seleccionamos la BD Ejemplo, podemos preguntar por el

Nombre de los profesores y la descripción de las asignaturas que imparten

¿Dónde está la información solicitada?

Consultando el esquema de la base de datos Ejemplo:


nombre (del profesor) se encuentra en la tabla PROFESORES 
descripción (de la asignatura) en ASIGNATURAS.
Si no lo pensamos mucho podríamos ejecutar la siguiente orden confiando en el todopoderoso SGBD:

select nombre, descripcion 
from asignaturas, profesores

nombre descripcion
EVA GOMEZ DISEÑO Y GESTION DE BASES DE DATOS
MANUEL PALOMAR  DISEÑO Y GESTION DE BASES DE DATOS
RAFAEL ROMERO DISEÑO Y GESTION DE BASES DE DATOS
EVA GOMEZ FUNDAMENTOS DE LAS BASES DE DATOS 
MANUEL PALOMAR  FUNDAMENTOS DE LAS BASES DE DATOS 
RAFAEL ROMERO FUNDAMENTOS DE LAS BASES DE DATOS 
EVA GOMEZ FUNDAMENTOS DE LA PROGRAMACION
MANUEL PALOMAR  FUNDAMENTOS DE LA PROGRAMACION
RAFAEL ROMERO FUNDAMENTOS DE LA PROGRAMACION
EVA GOMEZ HISTORIA DE LA INFORMATICA
MANUEL PALOMAR  HISTORIA DE LA INFORMATICA
RAFAEL ROMERO HISTORIA DE LA INFORMATICA
EVA GOMEZ PROGRAMACION CONCURRENTE
MANUEL PALOMAR  PROGRAMACION CONCURRENTE
RAFAEL ROMERO PROGRAMACION CONCURRENTE



Obviamente, el resultado anterior no se corresponde con la información solicitada, hemos hecho un producto cartesiano entre dos conjuntos, la combinación de todos los nombres de profesor con todas las descripciones de asignatura.

En este caso, la relación entre profesores y asignaturas se encuentra en imparte que tiene 2 claves ajenas, una está asociada a la clave primaria de profesor y la otra a la clave primaria de asignaturas. Pensemos en imparte como un "puente" que nos permite enlazar la información de la primera tabla con la segunda: de profesores pasamos a imparte mediante el dni, y de imparte asignaturas mediante el código de la asignatura PROFESORES  dni=dni  IMPARTE  asignatura=codigo  ASIGNATURAS


Necesitamos, por tanto, incluir la tabla imparte en el from, y especificar en el where las condiciones para concatenar las tuplas deseadas.

Nombre de los profesores y descripción de las asignaturas que imparten
(lo que debemos mostar): select nombre, descripcion 
(donde está la información necesaria): from asignaturas, profesores, imparte 
(igualando claves ajenas y claves primarias): where imparte.dni = profesores.dni and asignatura = codigo

nombre descripcion
EVA GOMEZ DISEÑO Y GESTION DE BASES DE DATOS
EVA GOMEZ FUNDAMENTOS DE LAS BASES DE DATOS 
RAFAEL ROMERO  PROGRAMACION CONCURRENTE



Para entender mejor cómo se obtienen los resultados de una consulta podemos pensar que el orden de ejecución es

from asignaturas, profesores, imparte (producto cartesiano)
where profesores.dni = imparte.dni and asignatura = codigo (selección)
select nombre, descripcion (proyección)
1. 
select * from asignaturas, profesores, imparte

codigo descripcion creditos creditosp dni nombre categoria ingreso dni asignatura
DGBD DISEÑO Y GESTION DE BASES DE DATOS  6.0 3.0 21111222 EVA GOMEZ TEU 1993-10-01        21111222 DGBD
DGBD DISEÑO Y GESTION DE BASES DE DATOS  6.0 3.0 21222333 MANUEL PALOMAR  TEU 1989-06-16        21111222 DGBD
DGBD DISEÑO Y GESTION DE BASES DE DATOS  6.0 3.0 21333444 RAFAEL ROMERO ASO6 1992-06-16        21111222 DGBD
DGBD DISEÑO Y GESTION DE BASES DE DATOS  6.0 3.0 21111222 EVA GOMEZ TEU 1993-10-01        21111222 FBD
DGBD DISEÑO Y GESTION DE BASES DE DATOS  6.0 3.0 21222333 MANUEL PALOMAR  TEU 1989-06-16        21111222 FBD
DGBD DISEÑO Y GESTION DE BASES DE DATOS  6.0 3.0 21333444 RAFAEL ROMERO ASO6 1992-06-16        21111222 FBD
DGBD DISEÑO Y GESTION DE BASES DE DATOS  6.0 3.0 21111222 EVA GOMEZ TEU 1993-10-01        21333444 PC
DGBD DISEÑO Y GESTION DE BASES DE DATOS  6.0 3.0 21222333 MANUEL PALOMAR  TEU 1989-06-16        21333444 PC
DGBD DISEÑO Y GESTION DE BASES DE DATOS  6.0 3.0 21333444 RAFAEL ROMERO ASO6 1992-06-16        21333444 PC
FBD FUNDAMENTOS DE LAS BASES DE DATOS  6.0 1.5 21111222 EVA GOMEZ TEU 1993-10-01        21111222 DGBD
FBD FUNDAMENTOS DE LAS BASES DE DATOS  6.0 1.5 21222333 MANUEL PALOMAR  TEU 1989-06-16        21111222 DGBD
FBD FUNDAMENTOS DE LAS BASES DE DATOS  6.0 1.5 21333444 RAFAEL ROMERO ASO6 1992-06-16        21111222 DGBD
FBD FUNDAMENTOS DE LAS BASES DE DATOS  6.0 1.5 21111222 EVA GOMEZ TEU 1993-10-01        21111222 FBD
FBD FUNDAMENTOS DE LAS BASES DE DATOS  6.0 1.5 21222333 MANUEL PALOMAR  TEU 1989-06-16        21111222 FBD
FBD FUNDAMENTOS DE LAS BASES DE DATOS  6.0 1.5 21333444 RAFAEL ROMERO ASO6 1992-06-16        21111222 FBD
FBD FUNDAMENTOS DE LAS BASES DE DATOS  6.0 1.5 21111222 EVA GOMEZ TEU 1993-10-01        21333444 PC
FBD FUNDAMENTOS DE LAS BASES DE DATOS  6.0 1.5 21222333 MANUEL PALOMAR  TEU 1989-06-16        21333444 PC
FBD FUNDAMENTOS DE LAS BASES DE DATOS  6.0 1.5 21333444 RAFAEL ROMERO ASO6 1992-06-16        21333444 PC
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 21111222 EVA GOMEZ TEU 1993-10-01        21111222 DGBD
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 21222333 MANUEL PALOMAR  TEU 1989-06-16        21111222 DGBD
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 21333444 RAFAEL ROMERO ASO6 1992-06-16        21111222 DGBD
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 21111222 EVA GOMEZ TEU 1993-10-01        21111222 FBD
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 21222333 MANUEL PALOMAR  TEU 1989-06-16        21111222 FBD
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 21333444 RAFAEL ROMERO ASO6 1992-06-16        21111222 FBD
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 21111222 EVA GOMEZ TEU 1993-10-01        21333444 PC
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 21222333 MANUEL PALOMAR  TEU 1989-06-16        21333444 PC
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 21333444 RAFAEL ROMERO ASO6 1992-06-16        21333444 PC
HI HISTORIA DE LA INFORMATICA 4.5
21111222 EVA GOMEZ TEU 1993-10-01        21111222 DGBD
HI HISTORIA DE LA INFORMATICA 4.5
21222333 MANUEL PALOMAR  TEU 1989-06-16        21111222 DGBD
HI HISTORIA DE LA INFORMATICA 4.5
21333444 RAFAEL ROMERO ASO6 1992-06-16        21111222 DGBD
HI HISTORIA DE LA INFORMATICA 4.5
21111222 EVA GOMEZ TEU 1993-10-01        21111222 FBD
HI HISTORIA DE LA INFORMATICA 4.5
21222333 MANUEL PALOMAR  TEU 1989-06-16        21111222 FBD
HI HISTORIA DE LA INFORMATICA 4.5
21333444 RAFAEL ROMERO ASO6 1992-06-16        21111222 FBD
HI HISTORIA DE LA INFORMATICA 4.5
21111222 EVA GOMEZ TEU 1993-10-01        21333444 PC
HI HISTORIA DE LA INFORMATICA 4.5
21222333 MANUEL PALOMAR  TEU 1989-06-16        21333444 PC
HI HISTORIA DE LA INFORMATICA 4.5
21333444 RAFAEL ROMERO ASO6 1992-06-16        21333444 PC
PC PROGRAMACION CONCURRENTE 6.0 1.5 21111222 EVA GOMEZ TEU 1993-10-01        21111222 DGBD
PC PROGRAMACION CONCURRENTE 6.0 1.5 21222333 MANUEL PALOMAR  TEU 1989-06-16        21111222 DGBD
PC PROGRAMACION CONCURRENTE 6.0 1.5 21333444 RAFAEL ROMERO ASO6 1992-06-16        21111222 DGBD
PC PROGRAMACION CONCURRENTE 6.0 1.5 21111222 EVA GOMEZ TEU 1993-10-01        21111222 FBD
PC PROGRAMACION CONCURRENTE 6.0 1.5 21222333 MANUEL PALOMAR  TEU 1989-06-16        21111222 FBD
PC PROGRAMACION CONCURRENTE 6.0 1.5 21333444 RAFAEL ROMERO ASO6 1992-06-16        21111222 FBD
PC PROGRAMACION CONCURRENTE 6.0 1.5 21111222 EVA GOMEZ TEU 1993-10-01        21333444 PC
PC PROGRAMACION CONCURRENTE 6.0 1.5 21222333 MANUEL PALOMAR  TEU 1989-06-16        21333444 PC
PC PROGRAMACION CONCURRENTE 6.0 1.5 21333444 RAFAEL ROMERO ASO6 1992-06-16        21333444 PC


2. 
select * from asignaturas, profesores, imparte 
where profesores.dni = imparte.dni and asignatura = codigo

codigo descripcion creditos creditosp dni nombre categoria ingreso dni asignatura
DGBD DISEÑO Y GESTION DE BASES DE DATOS  6.0 3.0 21111222 EVA GOMEZ TEU 1993-10-01        21111222 DGBD
FBD FUNDAMENTOS DE LAS BASES DE DATOS  6.0 1.5 21111222 EVA GOMEZ TEU 1993-10-01        21111222 FBD
PC PROGRAMACION CONCURRENTE 6.0 1.5 21333444 RAFAEL ROMERO  ASO6 1992-06-16        21333444 PC


3. 
select nombre, descripcion 
from asignaturas, profesores, imparte where profesores.dni=imparte.dni 
and asignatura=codigo

nombre descripcion
EVA GOMEZ DISEÑO Y GESTION DE BASES DE DATOS
EVA GOMEZ FUNDAMENTOS DE LAS BASES DE DATOS 
RAFAEL ROMERO  PROGRAMACION CONCURRENTE

Resumiendo, podemos decir que

  1. from establece la fuente de datos,
  2. where la información objetivo en bruto, y
  3. select la extracción de la información deseada. 

IMPORTANTE: Esto no es necesariamente realuna de las ventajas de utilizar un SGBD es que las consultas se procesan de manera eficiente y de forma totalmente transparente para el usuario. Es sólo una forma de comprender las acciones básicas que representa cada parámetro de la orden select.



Nombres cualificados de atributo

Un nombre cualificado de atributo es el que especifica el nombre de la tabla a la que pertenece la columna:

profesores.dni
asignaturas.descripción

Es obligatorio utilizar nombres cualificados de atributo si hay ambigüedad, si varias tablas de la select tienen columnas que se llaman igual:

profesores.dni
imparte.dni

En cualquier otro caso no es necesario.

DNI y nombre de los profesores que imparten alguna asignatura

select profesores.dni, nombre 
from profesores, imparte 
where profesores.dni = imparte.dni

dni nombre
21111222 EVA GOMEZ
21111222 EVA GOMEZ
21333444 RAFAEL ROMERO 

Igual que el anterior pero no cualificando el dni de la proyección

select dni, nombre
from profesores, imparte 
where profesores.dni = imparte.dni

Error at Command Line:3 Column:0
Error report:
SQL Error: Column 'dni' in field list is ambiguous

También es útil cuando, a partir de varias tablas, se quieren todas las columnas de una y sólo alguna de las otras

select profesores.*, descripcion
from profesores, asignaturas, imparte
where profesores.dni = imparte.dni
and codigo = asignatura 

dni nombre categoria ingreso descripcion
21111222 EVA GOMEZ TEU 1993-10-01          DISEÑO Y GESTION DE BASES DE DATOS
21111222 EVA GOMEZ TEU 1993-10-01          FUNDAMENTOS DE LAS BASES DE DATOS 
21333444 RAFAEL ROMERO  ASO6 1992-06-16          PROGRAMACION CONCURRENTE


Sinónimos temporales de tabla

select * from tabla alias

Una cadena de caracteres a continuación del nombre de la tabla en el from, es un alias temporal, un nombre sustitutivo.
Es recomendable para simplificar la escritura de la orden select o para hacerla más legible.
Es obligatorio para un producto cartesiano de una tabla por si misma: select p1.nombre, p2.nombre
from profesores p1, profesores p2
where p1.nombre <> p2.nombre

nombre nombre
MANUEL PALOMAR  EVA GOMEZ
RAFAEL ROMERO EVA GOMEZ
EVA GOMEZ MANUEL PALOMAR 
RAFAEL ROMERO MANUEL PALOMAR 
EVA GOMEZ RAFAEL ROMERO
MANUEL PALOMAR  RAFAEL ROMERO



Cuando se define el sinónimo en el from, sustituye totalmente al nombre de la tabla (no se permite utilizar los dos simultáneamente en el select o el where)
Por otro lado, no es necesario definir sinónimos para todas las tablas del from.

DNI y nombre de los profesores que imparten alguna asignatura (utilizando sinónimos temporales de tabla)

select p.dni, nombre
from profesores p, imparte i
where p.dni = i.dni 

dni nombre
21111222 EVA GOMEZ
21111222 EVA GOMEZ
21333444 RAFAEL ROMERO 

Rangos

Expresiones del tipo 10 <= x <= 100 se pueden construir utilizando el operador de construcción de rangos BETWEEN. La sintaxis de tal subexpresión de la cláusula where es la siguiente:

expresión [NOT] BETWEEN expresión AND expresión

Créditos y descripción de las asignaturas cuyo número de créditos está entre 5 y 8.

select creditos, descripcion
from asignaturas
where creditos between 5 and 8

creditos descripcion
6.0 DISEÑO Y GESTION DE BASES DE DATOS
6.0 FUNDAMENTOS DE LAS BASES DE DATOS
6.0 PROGRAMACION CONCURRENTE


Listas

Mediante el operador IN se puede buscar un determinado valor en una lista construida usando constantes.

expresión [NOT] IN (listaValores)

Descripción de las asignaturas FBD y DGBD.

select descripcion
from asignaturas
where codigo in ('FBD', 'DGBD')


descripcion
DISEÑO Y GESTION DE BASES DE DATOS
FUNDAMENTOS DE LAS BASES DE DATOS

Nombre de los profesores que no imparten HI, FBD o DGBD.

select nombre
from profesores p, imparte i
where p.dni = i.dni
and asignatura not in ('HI', 'FBD', 'DGBD')

nombre
RAFAEL ROMERO

Fijémonos en que MANUEL PALOMAR, que no imparte ninguna de las asignaturas objeto de la búsqueda, tampoco aparece en la tabla resultado puesto que su dni no aparece en la tabla IMPARTE.



Subcadenas de caracteres

Podemos preguntar por subcadenas dentro de columnas de tipo carácter. Para ello utilizaremos los operadores LIKE (o MATCHES), que soportan la siguiente sintaxis:

expresión [NOT] LIKE 'cadena'

La cadena de caracteres cadena admite los comodines % (tanto por ciento) y _ (subrayado):
  • % indica una cadena de caracteres de cualquier longitud (Ali% = Alicante, Aligerar, Ali, ...)
  • _ un carácter cualquiera (Ali_ = Alic, Alig, Ali, ...)

Profesores que atiendan al nombre de 'RAFA'.

select * from profesores where nombre like 'RAFA%'

dni nombre categoria ingreso
21333444 RAFAEL ROMERO ASO6 1992-06-16


Código de las asignaturas de 'Bases de Datos'

select codigo from asignaturas where descripcion like '%BASES DE DATOS%'

codigo
DGBD
FBD


Código de las asignaturas, siendo tal código de 2 caracteres

select codigo from asignaturas where codigo like '__'

codigo
FP
HI
PC


Descripción de las asignaturas cuya última palabra contiene 'INFORMATIC' y un caracter adicional.

select descripcion from asignaturas where descripcion like '%INFORMATIC_'

descripcion
HISTORIA DE LA INFORMATICA



Consultas anidadas

A veces, las condiciones de filtrado de tuplas o de cálculos de agregación son más complejas que la simple comparación con una constante o un valor almacenado en una tabla. Este dato intermedio, no un resultado final, ha de obtenerse mediante una consulta auxiliar, una subconsulta. 

En la condición de filtrado de la orden select (en la cláusula where o en la having) también podemos:

  • comparar una expresión con el resultado de otra orden select
  • determinar si el valor de una expresión está incluido en los resultados de otra orden select
  • preguntar si una orden select ha obtenido alguna fila.


Descripción y créditos de las asignaturas con menos créditos.

select descripcion, creditos
from asignaturas
where creditos = ( select min(creditos) from asignaturas )

descripcion creditos
HISTORIA DE LA INFORMATICA 4.5

En primer lugar se calcula la select anidada (entre paréntesis) y se obtiene el valor mínimo para la columna créditos de la tabla asignaturas. Con ese valor se compara tupla a tupla y se obtiene la asignatura (o asignaturas) cuya cantidad de créditos es igual al mínimo.

De lista de valores: inclusión  


expr [NOT] IN (orden select)

También podemos consultar la pertenencia de un valor a la lista de valores devuelta por la subconsulta.

Obtener todos los datos de los profesores que imparte alguna asignatura.

select * from profesores
where dni IN (select dni from imparte)

dni nombre categoria ingreso
21111222 EVA GOMEZ TEU 1993-10-01
21333444 RAFAEL ROMERO ASO6 1992-06-16

O dicho de otra manera: "datos de los profesores cuyo dni aparece en la tabla imparte".

En este caso daría lo mismo procesar la orden

select p.*
from profesores p, imparte i
where p.dni = i.dni

NOTA: el resultado no es exactamente el mismo porque el uso de IN consigue el mismo resultado que si hubiéramos aplicado el modificador distinct. Mientras que IN va recorriendo la tabla profesores y preguntando por cada uno si se encuentra en la tabla imparte o no, la segunda realiza el producto cartesiano y descarta las filas en las que no coinciden los valores de DNI. Es decir, la segunda consulta muestra filas duplicadas (en este estado de base de datos) mientras que la anterior no. Lo que queremos decir, no obstante, es que ambas dan como resultado "profesores que imparten algo".

Se verá más clara la utilidad de este operador si preguntamos justo lo contrario.

Obtener todos los datos de los profesores que no imparten asignaturas.

select * from profesores
where dni NOT IN (select dni from imparte)

dni nombre categoria ingreso
21222333 MANUEL PALOMAR TEU 1989-06-16


Fechas y tiempos

La administración y manejo de valores temporales es la parte de los motores de base de datos menos estandarizada y con más diferencias entre uno y otro. Aparte, y junto con la codificación de caracteres y las características regionales (por ejemplo, formato de las fechas) forma parte de un conjunto de parámetros globales del sistema que el administrador del mismo debe comprender y tener presente dependiendo del medio en el que se vayan a ver los resultados de una consulta. Si fuera a formar parte de un conjunto de páginas web dinámicas no solo el servidor de base de datos debe estar correctamente configurado sino que debe tener en cuenta el servidor http, el del lenguaje huesped (php, por ejemplo) e incluso los clientes (navegadores, ordenadores, etc.). Es muy posible que la misma fecha, en SQL Developer, vista en la pestaña resultados o en la script output tenga formato diferente (la primera está controlada por el programa cliente y la segunda muestra los datos tal cual se los envía el servidor.

Puestas así las cosas, aquí se va a tratar la superficie de todo lo que se puede hacer con fechas y tiempos y siempre desde el punto de vista estrictamente de la consulta SQL.

MySQL ofrece varios tipos de datos relacionados con el tiempo:

DATETIME     '0000-00-00 00:00:00'
DATE     '0000-00-00'
TIMESTAMP     00000000000000
TIME     '00:00:00'
YEAR     0000

Lo que se muestra en la lista anterior da una idea de qué datos maneja cada tipo. En realidad, lo anterior es la relación de "valores cero" que pueden almacenar y que tienen carácter de valor por defecto o valor de prueba. Dejando de lado el tipo TIMESTAMP que tiene unas propiedades y aplicaciones propias, todos los tipos están relacionados y difieren en cuanto a las limitaciones de almacenamiento y, más importante, de conversión automática de tipos.

De cadenas de caracteres, números y fechas y tiempos

Profesores que han ingresado antes de 1990.

select * 
from profesores
where ingreso < '1990-01-01';

dni nombre categoria ingreso
21222333 MANUEL PALOMAR TEU 1989-06-16

Nótese que se está comparando un tipo date con una cadena de caracteres. Lo que ocurre es que  MySQL analiza la cadena y determina si tiene un formato adecuado para el tipo de datos y la procesa si así es. De hecho, aunque la salida genérica de una fecha siempre es aaaa-mm-dd, la cadena de caracteres que usamos para la comparación asume cierta libertad de formato:

ingreso < '1990@01@01'
ingreso < '1990/01/01'
ingreso < '1990.01.01'
ingreso < '1990:01:01'

En todos los casos el resultado es idéntico al anterior. Lo que ya no funciona es 

select * 
from profesores
where ingreso < '01-01-1990'

0 rows selected

Y, además, no se genera ningún mensaje de error, simplemente, no muestra fila alguna en el resultado. Tampoco se comporta como nosotros esperaríamos

select * 
from profesores
where ingreso < 1990-01-01;

0 rows selected

Pero sí de 

select *
from profesores
where ingreso < 19900101;

dni nombre categoria ingreso
21222333 MANUEL PALOMAR TEU 1989-06-16

Otro aspecto en el que se da cierta libertad en es la forma del año:

select * 
from profesores
where ingreso < '90-01-01';

dni nombre categoria ingreso
21222333 MANUEL PALOMAR TEU 1989-06-16

Ahora bien, hay que tener en cuenta que MySQL hace una interpretación de esa parte de la fecha de tal forma que años en el rango 00-69 los convierte en 2000-2069, y los 70-99 en 1970-1999. Si manejamos años anteriores o posteriores debemos usar los 4 caracteres. 


Funciones de fecha y hora

En el manual de referencia de MySQL 5.0 puede consultarse la funcionalidad completa relativa al manejo del tiempo. Aquí solo expondremos algunas: now(), curdate(), curtime()
date_format(), str_to_date()
day(), dayofweek(), dayname(), month(), year(), hour(), minute(), second()

 

Ahora

now() devuelve la fecha y hora del servidor en formato datetime. curdate() y curtime() hacen lo mismo pero con la fecha y la hora respectivamente.

select now()curdate()curtime();
now() curdate() curtime()
2010-12-03 19:40:17 2010-12-03 19:40:17

Formato

Las funciones principales de formato podemos decir que son date_format() y str_to_date(). Una es la inversa de la otra: dateformat() transforma la fecha a un formato de texto determinado y str_to_date() una cadena de caracteres en un formato concreto a fecha. Las dos trabajan con 2 parámetros, una expresión y una cadena de formato.

La cadena de formato indica a la función que aspecto tiene o queremos que tenga (depende de si es una u otra función) el dato que le suministramos en el primer parámetro:

Profesores, con la fecha de ingreso en formato "dd/mm/aaaa".

select dni, nombre, date_format(ingreso, '%d/%m/%Y') ingreso from profesores;

dni nombre ingreso
21111222 EVA GOMEZ 01/10/1993
21222333 MANUEL PALOMAR 16/06/1989
21333444 RAFAEL ROMERO 16/06/1992


Profesores que han ingresado antes de 1/1/1990.

select * 
from profesores
where ingreso < str_to_date('1/1/90','%d/%m/%y');.

dni nombre categoria ingreso
21222333 MANUEL PALOMAR TEU 1989-06-16


Así, la cadena de formato para la primera consulta representa "cómo queremos la salida" y la de la segunda "cómo está escrita la fecha que quiero comparar". La totalidad de los códigos posibles se puede consultar en la descripción de la función date_format() en https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html.

Extracción

Las otras funciones a las que vamos a prestar atención son las que extraen parte de la expresión temporal.

select day(ingreso) día, month(ingreso) mes, year(ingreso) año 
from profesores
where nombre='EVA GOMEZ';

día mes año
1 10 1993


select dayname(ingreso) día, dayofweek(ingreso) ndía, monthname(ingreso) mes 
from profesores
where nombre='EVA GOMEZ';

d nd m
Friday 6 October


select date_format(now(),'%Y%m%d -- %H:%i:%s') ahora;

ahora
20101203 -- 20:12:49
Subpáginas (1): T02B Consultas anidadas