Documentación Firebird → Base de Datos Firebird → Firebird 1.5 - Guía de arranque rápido → El lenguaje SQL de Firebird |
Cada sistema gestor de bases de datos tiene sus propias idiosincrasias en la forma en que implementa SQL. Firebird adhiere al estándar SQL más rigurosamente que cualquier otra RDMS excepto posiblemente por su “primo”, InterBase®. Los desarrolladores que migren desde productos que cumplen menos con los estándares frecuentemente suponen erróneamente que Firebird es rebuscado, mientras que muchos de sus aparentes particularidades no son más que restricciones del estándar.
Las cadenas de caracteres en Firebird están delimitadas por un par de comillas simples -'I am a string'– (código ASCII 39, no 96). Si Ud. ha usado versiones previas del pariente de Firebird, Interbase®, recordará que las comillas simples y dobles se podían intercambiar como delimitadores de cadenas. En Firebird, las comillas dobles no se pueden usar como delimitadores de cadenas.
Antes del estándar SQL-92, no era legal tener nombres de objetos (identificadores) en una base de datos que fueran iguales a las palabras claves del lenguaje, distinguieran mayúsculas de minúsculas, o contuvieran espacios. SQL-92 introdujo un nuevo estándar para hacer legales todas esas cosas, siempre que los identificadores fueran rodeados por un par de símbolos de comilla doble (ASCII 34) y fueran siempre referidos delimitados por comillas dobles.
El propósito de este “regalo” era hacer más fácil migrar metadatos desde RDBMSs no estándares. La parte mala es que, si Ud. elige encerrar un identificador con comillas dobles, distinguirá entre mayúsculas y minúsculas y será obligatorio siempre escribirlo entre comillas dobles.
Firebird permite una ligera relajación de esta regla si se cumple un conjunto de condiciones muy especial: si el identificador que fue definido entre comillas dobles:
fue definido totalmente en mayúsculas,
no es una palabra clave, y
no contiene espacios,
...entonces puede ser usado en SQL sin comillas y sin prestar atención a mayúsculas y minúsculas (¡pero en cuanto le pone comillas alrededor, debe coincidir las mayúsculas nuevamente!)
No abuse de esta posibilidad! Por ejemplo, si tiene las tablas "TESTTABLE" y "TestTable", ambas definidas entre comillas dobles, y ejecuta el comando:
SQL>select * from TestTable;
...obtendrá los registros de "TESTTABLE", no "TestTable"!
A menos que tenga una razón de peso para definir identificadores con comillas, se recomienda que los evite. Firebird acepta sin problemas una mezcla de identificadores con y sin comillas -por lo que no es problema incluir esa palabra clave que Ud. obtuvo de una base de datos antigua, si realmente lo necesita.
Algunas herramientas de administración de base de datos imponen el entrecomillado en todos los identificadores por defecto. Trate de elegir una herramienta que tome como opcional el entrecomillado.
Si Ud. necesita usar un apóstrofo dentro de una cadena de Firebird, puede “escapar” el caracter del apóstrofo precediéndolo con otro.
Por ejemplo, esta cadena producirá un error:
'Joe's Emporium'
porque el evaluador encuentra el apóstrofo e interpreta la cadena como 'Joe' seguida por algunas palabras claves desconocidas.
Para convertir el ejemplo en una cadena legal, duplique el caracter apóstrofo:
'Joe''s Emporium'
Note que son DOS comillas simples, no una doble.
El símbolo de concatenación en SQL es un doble “pipe” (ASCII 124, un par sin espacio entremedio). En SQL, el símbolo “+” es un operador aritmético y provocará un error si intenta usarlo para concatenar cadenas. La siguiente expresión agrega el siguiente texto “ Reportado por: ” delante de cada apellido:
'Reportado por: ' || LastName
Tenga cuidado con las concatenaciones. Tenga en cuenta que Firebird generará un error si su expresión intenta concatenar dos o más columnas de tipo char o varchar si la longitud combinada puede exceder el límite máximo de longitud para el tipo char o varchar (32 KB).
Vea también en las notas más abajo, Expresiones con NULL, sobre la concatenación de expresiones que involucran NULL.
Firebird respeta el estándar SQL truncando el resultado (cociente) de una división entero/entero al entero menor. Esto puede generar resultados extraños si no lo tiene en cuenta.
Por ejemplo, este cálculo es correcto en SQL:
1 / 3 = 0
Si Ud. está actualizando desde una RDBMS que resuelve divisiones entre enteros a un cociente real, necesitará alterar las expresiones afectadas para usar un tipo real o numérico escalado para el dividendo, divisor, o ambos.
Por ejemplo, el cálculo anterior puede ser modificado como sigue para producir un resultado distinto de cero:
1.000 / 3 = 0.333
En SQL, NULL no es un valor. Es una condición, o estado, de un dato, en el cual su valor es desconocido. Debido a que es desconocido, NULL no puede comportarse como un valor. Cuando Ud. intenta realizar operaciones aritméticas con NULL, o lo mezcla con valores en otras expresiones, el resultado de la operación será siempre NULL. No es cero o blanco o una “cadena vacía” y no se comporta como ninguno de estos valores.
Por lo tanto - aquí hay algunos ejemplos de las sorpresas que se puede llevar si intenta realizar cálculos y comparaciones con NULL:
1 + 2 + 3 + NULL = NULL
not (NULL) = NULL
'Hogar ' || 'dulce ' || NULL = NULL
if (a = b) then MiVariable = 'Igual'; else MiVariable = 'Distinta';
Después de ejecutar este código,MiVariable será 'Distinta' si ambos a and b son NULL. La razón es que la expresión 'a = b' se evalúa a NULL si al menos uno de ellos es NULL. En un contexto de “ if...then ” NULL se comporta como FALSE. Por lo tanto, el bloque 'then' no se ejecuta y se pasa directamente al bloque 'else'.
if (a <> b) then MiVariable = 'Distinta'; else MiVariable = 'Igual';
Aquí, MiVariable será 'Igual' si a es NULL y b no, o viceversa. La explicación es similar a la del ejemplo previo.
Nombre || ' ' || Apellido
resultará NULL si Nombre o Apellido es NULL.
Piense en NULL como DESCONOCIDO y todos estos extraños resultados comenzarán de repente a tener sentido! Si el valor de Numero es desconocido, el resultado de '1 + 2 + 3 + Numero' también será desconocido (y por lo tanto NULL). Si el contenido de MiCadena es desconocido, entonces también lo es 'MiCadena || SuCadena' (incluso si SuCadena no es NULL). Etcétera.
Documentación Firebird → Base de Datos Firebird → Firebird 1.5 - Guía de arranque rápido → El lenguaje SQL de Firebird |