SQL son las siglas de Structured Query Language, es decir, lenguaje estructurado de consulta.
Es un lenguaje estándar no procedimental que se utiliza para definir, gestionar y manipular la información contenida en una Base de Datos Relacional.
SQL está compuesto a su vez por 3 lenguajes diferentes, en función de las acciones a realizar:
Existen diferentes Sistemas Gestores de Bases de Datos (SGBD) que implementan el estándar SQL, aunque en cada uno muestra algunas diferencias respecto de los demás, de forma que el estándar aunque muy similar, no se implementa exactamente igual en cada SGBD.
De entre los distintos SGBD que existen, nos vamos a centrar en MySQL, por ser libre, de código abierto y suficientemente potente para multitud de aplicaciones.
Además, hay que saber que MySQL no distingue mayúsculas de minúsculas, al contrario de otros gestores de bases de datos.
La información que almacena MySQL se guarda con literales que pueden ser de diferentes tipos:
Existen multitud de tipos de datos en MySQL. A continuación se comentarán algunos de los más significativos:
Los operadores utilizados en MySQL son:
La prioridad de los operadores es la marcada en la siguiente tabla:
| Prioridad | Operador | Operación |
|---|---|---|
| 1º | *, /, DIV | Multiplicación, división |
| 2º | +, - | Suma, resta |
| 3º | =, !=, <, >, ⇐, >=, IS, LIKE, BETWEEN, IN | Comparación |
| 4º | NOT | Negación |
| 5º | AND | Conjunción |
| 6º | OR, XOR | Inclusión, exclusión |
Existen multitud de funciones predefinidas en MysQL, que le dan una gran potencia al lenguaje. A continuación se indican las más comunes:
| Función | Operación |
|---|---|
| ABS(num) | Valor absoluto de num |
| CEIL(num) | Techo: Entero más pequeño mayor que num |
| FLOOR(num) | Suelo: Entero más grande menor que num |
| EXP(num) | Potencia de e: Devuelve e elevado a num |
| LN(num) | Logaritmo neperiano (en base e) de num |
| LOG(num) | Logaritmo en base 10 de num |
| MOD(num1, num2) | Resto de num1/num2 |
| PI() | Número PI |
| POWER(num1, num2) | num1 elevado a num2 |
| RAND() | Genera un número aleatorio comprendido entre 0 y 1 |
| ROUND(num1, num2) | Devuelve num1 redondeado a num2 decimales (0 si no se especifica num2) |
| SIGN(num) | Devuelve -1, 0, 1 si num es menor, igual o mayor a cero, respectivamente |
| SQRT(num) | Raíz cuadrada de num |
| TRUNCATE(num1, num2) | num1 truncado a num2 decimales (0 decimales si no se especifica num2) |
| Función | Operación |
|---|---|
| ASCII(c1) | Devuelve el código ASCII del carácter c1 |
| CHAR(num) | Devuelve el carácter cuyo código ASCII es num |
| CONCAT(cad1, cad2 [,cad3…]) | Concatena las cadenas cad1, cad2, cad3… |
| INSERT(cad1, pos, len, cad2) | Devuelve cad 1 con len caracteres sustituidos por cad2, desde pos en adelante |
| LENGTH(cad1) | Longitud de cad1 |
| LOCATE(cad1, cad2, pos) | Devuelve la posición de la primera ocurrencia de cad1 en cad2 empezando desde pos |
| LOWER(cad1) | cad1 en minúsculas |
| LPAD(cad1, n, cad2) | Añade a cad1 por la izquierda cad2 hasta n caracteres (si se omite cad2, añade espacios) |
| LTRIM(cad1) | Suprime blancos a la izquierda de cad1 |
| REPLACE(cad1, cad2, cad3) | devuelve cad1 con todas las ocurrencias de cad2 reemplazadas por cad3 |
| RPAD(cad1, n, cad2) | Añade a cad1 por la derecha cad2 hasta n caracteres (si se omite cad2, añade espacios) |
| RTRIM(c1) | Suprime blancos a la derecha de c1 |
| SUBSTR(c1, n, m) | Devuelve una subcadena a partir de c1, comenzando en la posición n, tomando m caracteres |
| UPPER(cad1) | La cadena cad1 en mayúsculas |
| Función | Operación |
|---|---|
| ADDDATE(fecha, num) | Fecha incrementada num días |
| SUBDATE(fecha, num) | Fecha decrementada num días |
| DATE_ADD(fecha, INTERVAL num formato) | Devuelve Fecha incrementada num veces lo indicado en formato(DAY, WEEK, HOUR, SECOND…) |
| DATE_SUB(fecha, INTERVAL num formato) | Devuelve Fecha decrementada num veces lo indicado en formato(DAY, WEEK, HOUR, SECOND…) |
| DATEDIFF(fecha1, fecha2) | Número de días entre fecha1 y fecha2 |
| DAYNAME(fecha) | Nombre del día de la semana de fecha |
| DAYOFMONTH(fecha) | Número del día del mes de fecha |
| DAYOFWEEK(fecha) | Número del día de la semana de fecha (de 1 a 7, empezando por el domingo) |
| DAYOFYEAR(fecha) | Número del día del año de fecha (de 1 a 366) |
| WEEKOFYEAR(fecha) | Número de la semana de fecha (de 1 a 53) |
| MONTH(fecha) | Número del mes de fecha (de 1 a 12) |
| YEAR(fecha) | Número del año con cuatro dígitos de fecha (de 0 a 9999) |
| HOUR(tiempo) | Hora de tiempo (de 0 a 23) |
| MINUTE(tiempo) | Minutos de tiempo (de 0 a 59) |
| SECOND(tiempo) | Segundos de tiempo (de 0 a 59) |
| CURDATE() | Fecha actual en formato 'YYYY-MM-DD' |
| CURTIME() | Hora actual en formato 'HH:MM:SS' |
| SYSDATE() | Fecha y hora actual con formato 'YYYY-MM-DD HH:MM:SS' |
Para la conversión a otro tipo de datos: DATE_FORMAT(fecha, formato)
| Máscara | Descripción |
|---|---|
| %a | Abreviatura (3 letras) del nombre del día de la semana |
| %b | Abreviatura (3 letras) del nombre del día del mes |
| %c | Número del mes (de 1 a 12) |
| %e | Número del día del mes (de 0 a 31) |
| %H | Número de la hora en formato 24 horas (de 00 a 23) |
| %h | Número de la hora en formato 12 horas (de 01 a 12) |
| %i | Número de minutos (de 00 a 59) |
| %j | Número del día del año (de 000 a 366) |
| %M | Nombre del mes |
| %m | Número del mes (de 01 a 12) |
| %p | AM o PM |
| %r | Hora en formato 12 horas (hh:mm seguido de AM o PM) |
| %s | Número de segundos (00 a 59) |
| %T | Hora en formato 24 horas (hh:mm:ss) |
| %u | Número de semana en el año (de 00 a 53) |
| %W | Nombre del día de la semana |
| %w | Número del día de la semana ( 0: domingo a 6 sábado) |
| %Y | Número del año con cuatro dígitos |
| %y | Número del año con dos dígitos |
| Función | Operación |
|---|---|
| GREATEST(lista de valores) | Mayor de la lista de columnas o expresiones de columna |
| LEAST(lista de valores) | Menor de la lista de columnas o expresiones de columna |
| IFNULL(exp1, exp2) | Si exp1 es nulo devuelve exp2, sino devuelve exp1 |
| ISNULL(exp) | TRUE si exp es NULL |
| STRCMP(cad1, cad2) | TRUE si cad1 y cad2 son iguales (NULL si alguna de las dos es NULL) |
| Función | Operación |
|---|---|
| DATABASE() | Nombre de la base de datos actual |
| USER() | Usuario y host de la sesión, de la forma: usuario@host |
| VERSION() | Devuelve una cadena indicando la versión de MySQL que estamos utilizando |
En SQL (y por extensión en MySQL) la ausencia de valor se representa como NULL.
Al operar con valores nulos hay que tener en cuenta las siguientes consideraciones:
Para evitar los problemas con valores nulos a la hora de que al realizar cálculos o comparaciones entre columnas, es recomendable usar la función IFNULL para devolver otro valor en caso de que un valor sea NULL.
Una expresión es un conjunto de variables, literales, funciones, operadores y paréntesis.
Los paréntesis sirven para variar el orden de prioridad y sólo son obligatorios en ese caso.
Las condiciones son casos especiales de expresiones, en cuyo caso el resultado será TRUE, FALSE o NULL.
Los gestores de bases de datos disponen de dos comandos que permiten confirmar o deshacer los cambios realiazdos en la base de datos:
Cuando hacemos modificaciones en las tablas no se hacen efectivas (escritura en disco) hasta que no ejecutamos la sentencia COMMIT. Cuando ejecutamos comandos DDL o de definición de datos (CREATE, DROP, ALTER), se ejecuta un COMMIT automático, así como cuando se cierra la sesión.
Cuando ejecutamos ROLLBACK, se deshacen todos los cambios hasta el último COMMIT ejecutado.
Existe una variable, AUTO_COMMIT, que indica la forma de trabajo, pudiéndo tomar los valores 0 y 1:
Para cambiar el valor de esta variable:
SET AUTO_COMMIT = 0; SET AUTO_COMMIT = 1;
Este control de transacciones puede ser extremadamente útil edurante la fase de depuración y prueba de nuestra base de datos.