Firebird Documentation Index → 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.
Firebird Documentation Index → Firebird 1.5 - Guía de arranque rápido → El lenguaje SQL de Firebird |