Recordatorios del dialecto de SQL que utiliza MySql
ifnull es una función que te permite devolver un valor concreto si el resultado de una consulta es un nulo. ifnull es el equivalente a nvl
IFNULL(expr1,expr2)
Ejemplos:
mysql> SELECT IFNULL(1,0);
-> 1
mysql> SELECT IFNULL(NULL,10);
-> 10
mysql> SELECT IFNULL(1/0,10);
-> 10
mysql> SELECT IFNULL(1/0,'yes');
-> 'yes'
CASE es una función de control de flujo. Es muy útil para mapear valores. Es un swich case de toda la vida.
CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END,
ejemplo
mysql> SELECT CASE 1 WHEN 1 THEN 'one'
-> WHEN 2 THEN 'two' ELSE 'more' END;
-> 'one'
mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
-> 'true'
mysql> SELECT CASE BINARY 'B'
-> WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;
-> NULL
Expresión condicional que nos permite hacer un if/else
IF(expr1,expr2,expr3)
Si la expresion expr1 es true entonces expr2 si es false entonces expr3 Ejemplo
mysql> SELECT IF(1>2,2,3);
-> 3
mysql> SELECT IF(1<2,'yes','no');
-> 'yes'
mysql> SELECT I
El listado completo de las funciones de fecha están disponibles en la documentación de MySql igualmente pongo aquí un resumen de las funciones mas empleadas
Convertir una cadena en una fecha. Una de las funciones mas utilizadas.
sintaxis: str_to_date('cadena', 'formato')
ejemplo:
mysql> SELECT STR_TO_DATE('03.10.2003 09.20','%d.%m.%Y %H.%i');
-> '2003-10-03 09:20:00'
mysql> SELECT STR_TO_DATE('10arp', '%carp');
-> '0000-10-00 00:00:00'
mysql> SELECT STR_TO_DATE('2003-15-10 00:00:00','%Y-%m-%d %H:%i:%s');
-> NULL
Para formatear una fecha, para convertir una cadena de carácteres en una fecha:
DATE_FORMAT(date,format)
Donde los formatos posibles son:
| Especificador | Descripción |
| %a | Día de semana abreviado (Sun..Sat) |
| %b | Mes abreviado (Jan..Dec) |
| %c | Mes, numérico (0..12) |
| %D | Día del mes con sufijo inglés (0th, 1st, 2nd, 3rd, …) |
| %d | Día del mes numérico (00..31) |
| %e | Día del mes numérico (0..31) |
| %f | Microsegundos (000000..999999) |
| %H | Hora (00..23) |
| %h | Hora (01..12) |
| %I | Hora (01..12) |
| %i | Minutos, numérico (00..59) |
| %j | Día del año (001..366) |
| %k | Hora (0..23) |
| %l | Hora (1..12) |
| %M | Nombre mes (January..December) |
| %m | Mes, numérico (00..12) |
| %p | AM o PM |
| %r | Hora, 12 horas (hh:mm:ss seguido de AM o PM) |
| %S | Segundos (00..59) |
| %s | Segundos (00..59) |
| %T | Hora, 24 horas (hh:mm:ss) |
| %U | Semana (00..53), donde domingo es el primer día de la semana |
| %u | Semana (00..53), donde lunes es el primer día de la semana |
| %V | Semana (01..53), donde domingo es el primer día de la semana; usado con %X |
| %v | Semana (01..53), donde lunes es el primer día de la semana; usado con %x |
| %W | Nombre día semana (Sunday..Saturday) |
| %w | Día de la semana (0=Sunday..6=Saturday) |
| %X | Año para la semana donde domingo es el primer día de la semana, numérico, cuatro dígitos; usado con %V |
| %x | Año para la semana, donde lunes es el primer día de la semana, numérico, cuatro dígitos; usado con %v |
| %Y | Año, numérico, cuatro dígitos |
| %y | Año, numérico (dos dígitos) |
| %% | Carácter '%' literal |
ejemplos:
mysql> select DATE_FORMAT('2/06/09 0:00' , '%e/%m/%Y %k:%i') ;
-> 9/06/0002 0:00
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
-> 'Saturday October 1997'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
'%D %y %a %d %m %b %j');
-> '4th 97 Sat 04 10 Oct 277'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
'%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
-> '1998 52'
Sirve para extraer una parte de la fecha, cuando sólo nos interesa el mes, el año, el día, etc.
EXTRACT(type FROM date)
Puedes extraer:
| Tipo de Valor | Formato del resultado esperado |
| MICROSECOND | MICROSECONDS |
| SECOND | SECONDS |
| MINUTE | MINUTES |
| HOUR | HOURS |
| DAY | DAYS |
| WEEK | WEEKS |
| MONTH | MONTHS |
| QUARTER | QUARTERS |
| YEAR | YEARS |
| SECOND_MICROSECOND | 'SECONDS.MICROSECONDS' |
| MINUTE_MICROSECOND | 'MINUTES.MICROSECONDS' |
| MINUTE_SECOND | 'MINUTES:SECONDS' |
| HOUR_MICROSECOND | 'HOURS.MICROSECONDS' |
| HOUR_SECOND | 'HOURS:MINUTES:SECONDS' |
| HOUR_MINUTE | 'HOURS:MINUTES' |
| DAY_MICROSECOND | 'DAYS.MICROSECONDS' |
| DAY_SECOND | 'DAYS HOURS:MINUTES:SECONDS' |
| DAY_MINUTE | 'DAYS HOURS:MINUTES' |
| DAY_HOUR | 'DAYS HOURS' |
| YEAR_MONTH | 'YEARS-MONTHS' |
Ejemplos:
mysql> SELECT EXTRACT(YEAR FROM '1999-07-02');
-> 1999
mysql> SELECT EXTRACT(YEAR_MONTH FROM '1999-07-02 01:02:03');
-> 199907
mysql> SELECT EXTRACT(DAY_MINUTE FROM '1999-07-02 01:02:03');
-> 20102
Sumar tiempo a una fecha. 1 dia, 1 mes, 3 años, etc.
la sintaxis es:
DATE_ADD(date,INTERVAL expr type), DATE_SUB(date,INTERVAL expr type)
aqui van algunos ejemplos:
mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 DAY);
-> '1999-01-02'
mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 HOUR);
-> '1999-01-01 01:00:00'
mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH);
-> '1998-02-28'
MySql no soporta el comando delete con una subconsulta apuntando a la misma tabla. De este modo una consulta del tipo delete from mi_tabla where id = ( select max(id) from mi_tabla) ; no está soportado. Puedes hacer subconsultas a cualquier otra tabla, pero no a sí misma.
Hay muchas soluciones posibles. La que yo he encontrado es guardar el resultado del subselect en una tabla temporal. Una tabla temporal es una tabla que existe mientras exista la sesión en la que ha sido creada. De este modo no nos tenemos que preocupar de la higiene.
Podemos solucionar el problema de:
SQL>delete from mi_tabla where id = ( select max(id) from mi_tabla);
De la siguente manera:
SQL>CREATE TEMPORARY TABLE tmp AS select max(id) from mi_tabla ; SQL>delete from mi_tabla where id = ( select max(id) from tmp);
tan sencillo como
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW nombre_vista [(columnas)]
AS sentencia_select
[WITH [CASCADED | LOCAL] CHECK OPTION]