Recordatorio de SQL de MySql

Recordatorios del dialecto de SQL que utiliza MySql

IFNULL

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

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

IF

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

Funciones de Fecha

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

STR_TO_DATE

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

DATE_FORMAT

Para formatear una fecha, para convertir una cadena de carácteres en una fecha:

DATE_FORMAT(date,format)

Donde los formatos posibles son:

EspecificadorDescripción
%aDía de semana abreviado (Sun..Sat)
%bMes abreviado (Jan..Dec)
%cMes, numérico (0..12)
%DDía del mes con sufijo inglés (0th, 1st, 2nd, 3rd, …)
%dDía del mes numérico (00..31)
%eDía del mes numérico (0..31)
%fMicrosegundos (000000..999999)
%HHora (00..23)
%hHora (01..12)
%IHora (01..12)
%iMinutos, numérico (00..59)
%jDía del año (001..366)
%kHora (0..23)
%lHora (1..12)
%MNombre mes (January..December)
%mMes, numérico (00..12)
%pAM o PM
%rHora, 12 horas (hh:mm:ss seguido de AM o PM)
%SSegundos (00..59)
%sSegundos (00..59)
%THora, 24 horas (hh:mm:ss)
%USemana (00..53), donde domingo es el primer día de la semana
%uSemana (00..53), donde lunes es el primer día de la semana
%VSemana (01..53), donde domingo es el primer día de la semana; usado con %X
%vSemana (01..53), donde lunes es el primer día de la semana; usado con %x
%WNombre día semana (Sunday..Saturday)
%wDía de la semana (0=Sunday..6=Saturday)
%XAño para la semana donde domingo es el primer día de la semana, numérico, cuatro dígitos; usado con %V
%xAño para la semana, donde lunes es el primer día de la semana, numérico, cuatro dígitos; usado con %v
%YAño, numérico, cuatro dígitos
%yAñ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'

EXTRACT

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

DATE_ADD

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'

DELETE Y SUBCONSULTAS

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

CREAR VISTAS

tan sencillo como

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    VIEW nombre_vista [(columnas)]
    AS sentencia_select
    [WITH [CASCADED | LOCAL] CHECK OPTION]

 
sql/mysql.txt · Última modificación: 2010/01/05 14:34 por juantxu
 
Excepto donde se indique lo contrario, el contenido de esta wiki se autoriza bajo la siguiente licencia:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki