Site hosted by Angelfire.com: Build your free website today!
   

Introducción a SQL

(En Construcción)
Requerimientos

Esta sección lista el softwrare que ya debería haber instalado y ejecutado en la estación de trabajo del cliente. También lista los archivos relacionados y los parámetros y requerimientos de acceso a la base de datos.

Categoría Descripción
Aplicaciones BDE Las aplicaciones BDE soportadas, instaladas según se requiera por la documentación del producto.

Requerimientos del sistema 1.5 MB de espacio libre de disco y sistema operativo que cumpla con los requerimientos de su aplicación BDE.

Derechos de acceso Si su aplicación BDe está instalada en el disco compartido de un servidor de archivos compartidos, asegúrese de que su cuenta de usuario de la red tiene derechos de acceso para leer y escribir al directorio de instalación del BDE de la aplicación. Este directorio es modificado durante la instalación de SQL Links. (Para aplicaciones instaladas en únicamente en un servidor de red).

Software de protocolo de red Se necesita software de protocolo de red compatible tanto con el protocolo de red del servidor y el driver de comunicación de base de datos de estación de trabajo del cliente.

     
Para información del software requerido de su servidor SQL y otros requerimientos de software relacionados con el servidor.

Requerimientos de acceso a las bases de Datos

Para accesar la base de datos SQL, usted necesita una identificación de usuario y un password válido para accesar el servidor SQL. Usted también necesita por lo menos accesos de lectura (SELECT) para la base de datos SQL. Para obtener estos privilegios, vea sus administrador de red.

SQL

SQL es un descendiente de SEQUEL (o Structured English QUEry Language), que fue originalmente diseñado por IBM. SQL fue creado como un lenguaje para construir sistemas de administración de base de datos relacionales (RDBMS: Relational DataBase Management System) sobre cualquier plataforma de hardware. El primer RDBMS comercial usando el SQL que apareció en 1981, y SQL es ahora el lenguaje estandar para consultas de red a través de plataformas de software y hardware diferentes. SQL es realmente un sublenguaje diseñado para estar embebido en un lenguaje de programación de una aplicación. Es tan flexible que puede ser usado tanto para manipulación de datos como para definición de datos.

Los servidores de bases de datos SQL manejan peticiones en unidades lógicas de trabajo llamadas transacciones. Una transacción es un grupo de operaciones relacionados que deben todas ser realizadas con éxito antes de que el RDBMS finalice cualquier cambio en la base de datos. El procesamiento de transacciones en servidores de bases de datos asegura que sus peticiones de procesamiento sean apropiados para el estado actual de sus datos. En SQL, todas las transacciones pueden ser terminadas explícitamente con un comando (instrucción) ya sea aceptar o descartar los cambios. Una vez usted esté satisfecho de que no hay errores ocurridos durante la transacción, puede terminar esa transacción con una instrucción de COMMIT. La base de datos entonces cambia para reflejar las operaciones que usted ha realizado. Si ocurre un error, usted puede abandonar los cambios con una intrucción de ROLLBACK.

Características de SQL Links

Usar una aplicación BDE con driver SQL Links realmente extiende lo que usted puede hacer con su aplicación, dándole algunas de las ventajas inherentes al uso de bases de datos SQL:

    + La habilidad para consultar el servidor SQL directamente.

    + Soporte para transacciones al estilo SQL.

    + Uso de Caché para registros mejorado.

    + Comportamiento de locking de datos mejorado.

Al accesar un servidor SQL a través del driver de SQL Links y su aplicación BDE también le da a los usuarios de bases de datos SQL tradicional algunas de las ventajas inherentes a bases de datos de estaciones de trabajo, permitiéndole a usted:
    + Abrir una tabla y clonar un cursor.

    + Moverse hacia adelante y hacia atrás a través de un conjunto resultado o tabla de respuesta.

    + Ordenar datos usando un índice disponible.

    + Asignar una marca en una localización de base de datos en la sesión actual, y reusar la marca en una sesión posterior.

    + Trabajar dinámicamente con los datos SQL en sí a través de acceso en vivo a fuentes de datos.

El servidor de base de datos

Una red de área local (LAN: local area network) permite que los usuarios de estaciones de trabajo compartan archivos, software, y recursos de impresora guardado en el máquinas dedicadas llamadas servidores. Las estaciones de trabajo se conectan a los servidores de red a través del sistema de cableado, hardware de comunicaciones, y software. En poblaciones de usuarios grandes, dos o más LANs pueden conectarse a través de gateways para formar redes de área amplia (WAN: wide area networks). En un ambiente de red, su estación de trabajo usa el servidor de red de forma muy similar que usa su propio disco duro. Si su estación de trabajo necesita acceso a datos guardados en el disco duro del servidor hace una petición de esos datos del servidor. El servidor envía los datos solicitados a través de la red de vuelta a su estación de trabajo donde son procesados localmente. Sin embargo, el servidor de red difiere de la estación de trabajo en que los datos del servidor pueden ser accesados por más de un usuario al mismo tiempo.

Un servidor de base de datos es un servidor de red que procesa peticiones de bases de datos de alto nivel. Aunque otros tipos de servidores de red permiten que la mayoría del procesamiento ocurra en la estación de trabajo del usuario, los servidores de bases de datos son activos, con la mayoría del procesamiento realizándose en el servidor de base de datos en sí. Si su estación de trabajo necesita acceso a los datos guardados en un servidor de bases de datos, usted consulta al servidor directamente. El servidor de base de datos procesa la consulta en sí y envía sólo la respuesta a través de la red de vuelta a su estación de trabajo.

Pruesto que el procesamiento es realizado en el servidor y no en la estación de trabajo que originó la petición, la estación de trabajo se vuelve un cliente del servidor de base de datos. En un sistema Cliente/Servidor, múltiples clientes (usuarios) hacen peticiones de servicios del servidor de bases de datos a través del uso de aplicaciones clientes creadas con Paradox para Windows, Visual dBASE, Delphi, o Borland C++. Por ello, el cliente y el servidor comparten el trabajo de mantener la base de datos: el servidor dicta la clase de interacciones que el cliente puede tener con los datos, pero el cliente escoge cómo desplegar y usar los resultados de esas interacciones.

El modelo relacional

El modelo relacional de datos está basado en una colección de tablas. El usuario del sistema de base de datos puede consultar estas tablas, insertar nuevas tuplas, eliminar tuplas y actualizar tuplas. Existen varios lenguajes para expresar estas operaciones. El cálculo relacional de tuplar y el cálculo relacional de dominios son lenguajes no procedimentales que representan la capacidad básica requerida en un lenguaje de consultas relacional. El álgebra relacional es un lenguaje procedimental que es equivalente en capacidad a las dos formas del cálculo relacional cuando están restringidas a expresiones seguras. El álgebra define las operaciones básicas usadas en los lenguajes de consultas relacionales.

El álgebra relacional y el cálculo relacional son lenguajes concisos, formales, que son inadecuados para usuarios casuales de un sistema de base de datos.

SQL Local (Local SQL)

El Borland Database Engine (BDE) le permite acceso tanto a tablas de bases de datos tanto locales como remotas a través de SQL SQL (Structure Query Language). El SQL Local (algunas veces llamado SQL basado en cliente) es un subconjunto del SQL ANSI-92 (SQL ANSI-92) mejorado para soportar las convenciones de nombres de Paradox y de dBASE (estandar) para tablas y campos (llamados "columnas" en SQL).

El SQL local le permite usar SQL para consultas tablas de bases de datos estandar locales que no residen en un servidor de base de datos (específicamente tablas Paradox o dBASE) así como servidores SQL remotos. El SQL local es también esencial para hacer consultas multi-tabla a través tanto de tablas estandar locales y aquellas en servidores SQL remotos.

Convenciones de nombre (Naming conventions)

Esta sección describe las convenciones de nombre para tablas y columnas, mejoras de sintaxis, y limitaciones de sintaxis para SQL local.

Las instrucciones en SQL están divididas en dos categorías diferentes, DDL (Data Definition Language) o de definción de datos y DML (Data Manipulation Language) y manipulación de datos:

    Manipulación de datos

    Las instrucciones SQL en Data Manipulation Language (DML) usadas para seleccionar, insertar, actualizar y borrar datos de la tabla.

    Definición de datos

    Las instrucciones SQL en Data Definition Language (DDL) son usadas para crear, alterar y hacer drop de tablas. El DDL se transforma directamente en llamadas a las funciones del BDE.

El SQL estandar de ANSI (ANSI-standard SQL) confina cada nombre de tabla o columna a una palabra simple formada de caracteres alfanuméricos y el símbolo de underscore (_). El SQL local, sin embargo, es mejorado para soportar nombres más amplios.

El SQL tiene varias partes:

    + Lenguaje de definición de datos. (DDL) El SQL DDL proporciona órdenes para definir esquemas de relación, eliminar relaciones, crear índices y modificar esquemas de relación.

    + Lenguaje de manipulación de datos interactivo. El SQL DML incluye un lenguaje de consultas basado en el álgebra relacional y el cálculo relacional de tuplas. También incluye órdenes para insertar, suprimir y modificar tuplas de las baes de datos.

    + Lenguaje de manipulación de datos inmerso (DML) La forma inmersa de SQL está diseñada para usar dentro de los lenguajes de programación.

    + Definición de vista. El SQL DDL incluye órdenes para definir vistas.

    + Control de transacciones. SQL incluye órdenes para especificar el comienzo y final de las transacciones. Varias implementaciones., incluyendo IBM SAA-SQL, permiten el bloque explícito de los datos para control de concurrencia.

Estructura básica

La estructura básica de una expresión en SQL consta de tres cláusulas: SELECT, FROM y WHERE.

    + La cláusula SELECT corresponde a la operación de proyección del álgebra relacional. Se usa para listar los atributos que se desean en el resultado de una consulta.

    + La cláusula FROM corresponde a la operación de producto cartesiano de álgebra relacional. Lista las relaciones que se van a examinar en la evaluación de la expresión.

    + La cláusula WHERE corresponde al predicado de selección del álgebra relacional. Consta de un predicado que implica atributos de las relaciones en la evaluación de la expresión.

La instrucción SELECT es usada para recuperar datos de una o más tablas. Un SELECT que recupera datos de múltiples tablas es llamdo un "join." El SQL Local soporta la siguiente forma de la instrucción SELECT:
    SELECT [DISTINCT] column_list

    FROM table_reference

    [WHERE search_condition]

    [ORDER BY order_list]

    [GROUP BY group_list]

    [HAVING having_condition]

    [UNION select_expr]

SELECT

Una consulta típica en SQL tiene la forma:

    SELECT A1, A2, A3,... An

    FROM r1, r2, .... rm

    WHERE P

Donde A1, A2, A3... son atributos, r1, r2,.. son relaciones, y P es un predicado.

Si se omite la cláusula WHERE el predicado P es verdadero. La lista de atributos puede sustituirse por un asterisco para seleccionar todos los atributos de todas las relaciones que aparecen la cláusula FROM.

SQL forma el producto cartesiano de las relaciones nombradas en la cláusdira FROM, realiza una selección del álgebra relacional usando el predicado de la cláusdira WHERE y después proyecta el resdirtado a los atributos de la cláusdira SELECT.

El resdirtado de una consdirta SQL es, por supuesto, una relación. Consideremos una consdirta sencilla usando el ejemplo bancario. "Encontrar los nombres de las sucursales en la relación depósito".:

    SELECT nombre_sucursal

    FROM depósito

SQL Local soporta especificaciones de path y archivo totales para los nombres de las tablas. Los nombres de las tablas con path o extensiones de nombre de archivo deben ser encerradas en comillas simples o dobles. Por ejemplo,
    SELECT * FROM 'PARTS.DBF'

    SELECT * FROM "C:\SAMPLE\PARTS.DBF"

SQL Local también soporta los alias de BDE para nombres de Tabla. Por ejemplo,
    SELECT * FROM ":PDOX:TABLE1"
Si usted omite la extensión de archivo para un nombre de una tabla local, se asume que la tabla es del tipo especificado por la Utilidad de Configuración BDE, ya sea en la configuración del Defadirt Driver en la página del sistema o en tipo de drive por defecto para los alias estandar asociados con la consdirta o con la tabla.

Finalmente, el SQL local permite que los nombres de las tablas dupliquen las palabras clave de SQL siempre que esos nombres de tablas estén encerrados por comillas sencillas o dobles. Por ejemplo,

    SELECT PASSID FROM "PASSWORD"
Operaciones de conjuntos y tuplas duplicadas

Los lenguajes de consdirta formales se basan en la noción matemática de relación como un conjunto. Por ello nunca aparecen tuplas duplicadas en las relaciones. En la práctica, la eliminación de duplicados lleva bastante tiempo. Por tanto, SQL ( y casi todos los demás lenguajes de consdirta comerciales) permiten duplicados en las relaciones. Así pues la consdirta que veíamos con SELECT Y FROM muestra el nombre de sucursal por cada vez que aparezca en depósito.

En aquellos casos en los que queremos forzar la eliminación de duplicados, insertamos la palabra clave DISTINCT después de SELECT. Un ejemplo de una consdirta así sería:

    SELECT DISTINCT nombre-sucursal

    FROM depósito

Columnas

El SQL Local soporta nombres de columnas mdirti-palabra de Paradox y nombres de columna con las palabras clave de SQL duplicadas siempre que se encierren en comillas simples o dobles.

Por ejemplo, el siguiente nombre de la columna son dos palabras:

SELECT E."Emp Id" FROM EMPLOYEE E

En el siguiente ejemplo, el nombre de la columna duplica la palabra clave DATE del SQL, por ello se especifica el nombre de la relación:

SELECT DATELOG."DATE" FROM DATELOG

Cuando son dos columnas:

    SELECT PART_NO, PART_NAME

    FROM PARTS

Con los siguientes tópicos obtendrá más información acerca del uso de SELECT:
    Cláusdira FROM

    La cláusdira FROM especifica la tabla o tablas de las cuales se van a recuperar datos. Table_reference puede ser una tabla simple, una lista de tablas delimitada por comas, o puede ser un join interno o externo como se especifica en el estandar SQL-92. Por ejemplo, la siguiente instrucción especifica una tabla simple:

    SELECT PART_NO

    FROM "PARTS.DBF"

    La siguiente instrucción especifica un join externo para table_reference:

    SELECT * FROM PARTS LEFT OUTER JOIN INVENTORY

    ON PARTS.PART_NO = INVENTORY.PART_NO

Operaciones de conjuntos

SQL incluye las operacines UNION, INTERSECT, y MINUS, que operan sobre relaciones y corresponden a las operaciones del álgebra de conjuntos.

Vamos a demostrar cómo se pueden escribir en SQL las consdirtas de los siguientes ejemplos:

"Encontrar todos los clientes que tienen una cuenta en la sucursal Perryridge:

    SELECT DISTINCT nombre-cliente

    FROM depósito

    WHERE nombre-sucursal = "Perryridge"

"Encontrar todos los clientes que tiene un préstamos en la sucursal Perryridge":
    SELECT DISTINCT nombre-cliente

    FROM préstamo

    WHERE nombre-sucursal = "Perryridge"

"Encontrar todos los clientes que tiene un préstamo, una cuenta o las dos en la sucursal de Perryridge":
    (SELECT nombre-cliente

    FROM depósito

    WHERE nombre-sucursal = "Perryridge")

    UNION

    (SELECT nombre-cliente

    FROM préstamo

    WHERE nombre-sucursal = "Perryridge")

"Encontrar todos los clientes que tienen un préstamo y una cuenta en la sucursal Perryridge":
    (SELECT DISTINCT nombre-cliente

    FROM depósito

    WHERE nombre-sucursal = "Perryridge")

    INTERSECT

    (SELECT DISTINCT nombre-cliente

    FROM préstamo

    WHERE nombre-sucursal = "Perryridge")

Por omisión, la operación unión elimina todas las tuplas duplicadas.

"Encontrar los clientes de la sucursal Perryridge que tienen una cuenta allí pero no un préstamo"

    (SELECT DISTINCT nombre-cliente

    FROM depósito

    WHERE nombre-sucursal = "Perryridge")

    MINUS

    (SELECT DISTINCT nombre-cliente

    FROM préstamo

    WHERE nombre-sucursal = "Perryridge")

Cláusdira WHERE
    La cláusdira WHERE opcional reduce el número de filas devuelto por una consdirta a aquellos que cumplen con el criterio especificado en search_condition. Por ejemplo, la siguiente instrucción recupera sólo aquellas filas con PART_NO mayor a 543:

    SELECT * FROM PARTS

    WHERE PART_NO > 543

    La claúsdira WHERE puede incluir el predicado IN, seguido por una lista parentizada de valores. Por ejemplo, la siguiente instrucción recupera sólo aquellas filas donde el número de parte se acopla a un item en la lista del predicado IN:

    SELECT * FROM PARTS

    WHERE PART_NO IN (543, 544, 546, 547)

    Adicionalmente a operaciones de comparación escalares ( =, <, > ... ) también se pueden usar predicados adicionales que usan IN, ANY, ALL, EXISTS.

Predicados y Conectores

Para encontrar el nombre y la ciudad de todos los clientes que tienen un préstamo en alguna sucursal. En SQL se podría escribir así:

    SELECT DISTINCT cliente.nombre-cliente, ciudad-cliente

    FROM préstamo, cliente

    WHERE préstamo.nombre-cliente = cliente.nombre-cliente

Obsérvese que SQL usa la notación nombre-relación.nombre-atributo, con el álgebra relacional, para evitar ambiguedad en los casos en los que un atributo aparece en el esquma de más de una relación. Podíamos haber escrito cliente.ciudad-cliente en ves de ciudad-cliente en el SELECT. Sin embargo, puesto que el atributo ciudad-cliente aparece solamente en una de las relaciones que se nombran en la cláusdira FROM, no hay ambiguedad al escribir ciudad-cliente.

Ampliemos la consdirta anterior y consideremos un caso algo más complicado en el que se requiere tamibén que todos los clientes tengan un préstamo en la sucursal Perryridge: "Encontrar el nombre y la ciudad de todos los clientes que tienen un préstamo en la sucursal Perryridge" Para eso vamos a usar un AND.

    SELECT DISTINCT cliente.nombre-cliente, ciudad-cliente

    FROM préstamo, cliente

    WHERE préstamo.nombre-cliente=cliente.nombre-cliente

    AND nombre-sucursal = "Perryridge"

SQL usa los conectores lógicos AND, NOT y OR.

SQL incluye un operador de comparacion BETWEEN para simplificar la cláusdira WHERE. Si queremos encontrar el número de cuentas con saldos entre 90.000 y 100.000 dólares podemos usa la comparación siguiente:

    SELECT número-cuenta

    FROM depósito

    WHERE saldo BETWEEN 90000 AND 100000

Lo mismo se puede hacer con el operador NOT BETWEEN.

SQL también incluye un operador de selección para comparaciones de cadenas de caracteres. Los modelos se describen usando estas dos características especiales:

+ porcentaje (%) que es igual a cualquier subcadena.

+ subrayado _. El Carácter _ es igual a cualquier caracter.

Ejemplos:

+ "Perry%" es igual a cualquier subcadena que empiece por Perry.

+ "%idge%" es igual a cualquier cadena que contenga "idge" como subcadena.,

+ "___" es igual a cualquier cadena de 3 caracteres.

Los modelos de comparación en SQL se expresan usando el operadir LIKE. "Encontrar los nombres de todos los clientes cuya calle incluye la subcadena 'Main'":

    SELECT nombre-cliente

    FROM cliente

    WHERE calle LIKE "%Main%"

Hay también caracteres de escape para indicar que se va a incluir un caracter especial dentro de la cadena de búsqueda, con la cláusdira ESCAPE

+ LIKE "ab\%cd%" ESCAPE "\" es igual a todas las cadenas que empiezan por "ab%cd".

Pertenencia a un conjunto

SQL se basa en un conjunto relacional de operaciones que permiten probar la pertenencia de las tuplas a una relación. El conector IN prueba si se es miembro de un conjunto, donde el conjunto es una colección de valores porducidos por una cláusdira SELECT. El conecto NOT IN prueba la no pertenencia al conjunto. Para ilustrarlo, considérese de nuevo la consdirta "Encontrar a todos los clientes que tienen un préstamo y una cuenta en el Perryridge". Vamos a hacer esto realizando una subconsdirta.

    SELECT DISTINCT nombre-cliente

    FROM préstamo

    WHERE nombre-sucursal= "Perryridge" AND

    nombre-cliente IN

    (SELECT nombre-cliente

    FROM depósito

    WHERE nombre-sucursal = "Perryridge")

En SQL pueden haber varias consdirtas que significan lo mismo. Por ejemplo para encontrar los clientes que tienen una cuenta y un préstamo en al sucursal de Perryridge:
    SELECT DISTINCT nombre-cliente

    FROM préstamo

    WHERE nombre-sucursal = "Perryridge" AND

    <nombre-sucursal, nombre-cliente> IN

    (SELECT nombre-sucursal, nombre-cliente

    FROM depósito)

Para el uso de NOT IN tenemos el siguiente ejemplo. Vamos a buscar los clientes que tienen una cuenta en la sucursal Perryridge pero no tienen un préstamos en la sucursal Perryridge:
    SELECT DISTINCT nombre-cliente

    FROM depósito

    WHERE nombre-sucursal ="Perryridge" AND

    nombre-cliente NOT IN

    (SELECT nombre-cliente

    FROM préstamo

    WHERE nombre-sucursal = "Perryridge")

Variables de Tupla

SQL toma prestada la notación de variables de tupla dell cálcdiro relacional de tuplas. Una variable de tupla en SQL debe estar asociada con una relación determinada. Las variables de tupla se definen en la cláusdira FROM. Para ilustrarlo, volvemos a escribir la consdirta: "Encontrar el nombre y la ciudad de todos los clientes que tienen un préstamo en alguna sucursal", así:

    SELECT DISTINCT T.nombre-cliente, ciudad cliente

    FROM préstamo S, cliente T

    WHERE S.nombre-cliente = T.nombre-cliente

Nótese q ue una variable de tupla se define en la cláusdira FROM colocándola después del nombre de la relación con la cual está asociada, separada por uno o más espacios.

En consdirtas que contienen subconsdirtas, se aplica una regla de ámbito a las variables de tupla. En una subconsdirta, está permitido usar sólo variables de tupla definidas en la misma subconsdirta o en cualquier consdirta que contenga la subconsdirta. Si una variable de tupla está definida tanto localmente en una subconsdirta como globalmente en una consdirta que la contiene, se aplica la definición local. Cuando escribimos expresiones de la forma nombre-relación.nombre-atributo, el nombre de la relación es, en efecto, una variable de tupla definida implícitamente.

Las variables de tuplas son muy útiles para comparar dos tuplas de la misma relación. En tales casos el álgebra relacional usa la operación renombrar. Supóngase que queremos encontrar todos los clientes que tienen una cuenta en la misma sucursal en la que Jones tiene una cuenta. Escribimos esta consdirta:

    SELECT DISTINCT T.nombre-cliente

    FROM depósito S, depósito T

    WHERE S.nombre-cliente = "Jones" AND

    S.nombre-sucursal = T.nombre-sucursal

Obsérvese que no podríamos usar la notación depósito.nombre-sucursal, puesto que no estaría claro cuál es la referencia a depósito que se quiere hacer.
    SELECT DISTINCT nombre-cliente FROM depósito

    WHERE nombre-sucursal IN

    (SELECT nombre-cliente FROM depósito

    WHERE nombre-cliente = "Jones")

Comparación de conjuntos

Fue posible utilizar la construcción IN en la consdirta anterior porque estuvimos probando la igualdad entre dos nombres de sucursales. Considérese la consdirta: "Encontrar los nombres de todas las sucursales que tienen un activo mayor que alguna sucursal situada en Brooklyn". Podemos escribir la expresión:

    SELECT DISTINCT nombre-cliente

    FROM sucursal T, sucursal S

    WHERE T.activo > S.activo AND

    S.ciudad-sucursal = "Brooklyn"

Hay otra forma adicional que ofrece SQL para escribir este tipo de consdirtas con la frase "mayor que algún" >SOME.
    SELECT nombre-sucursal FROM sucursal

    WHERE activo > SOME

    (SELECT activo

    FROM sucursal

    where ciudad-sucursal = "Brooklyn")

Las construcciones IN, > SOME, > ALL nos permiten probar un único valor con los miembros del conjunto completo. Puesto que SELECT genera un conjunto de tuplas, a veces podemos querer comparar conjuntos para determinar si un conjunto contiene todos los miembros de algún otro conjunto. Tales comparaciones se hacen en SQL usando las construcciones CONTAINS y NOT CONTAINS.

Considérese la consdirta "Encontrar todos los clientes que tiene una cuenta en todas las sucursales situadas en Brooklyn". Para cada cliente, necesitamos ver si el conjunto de todas las sucursales en las que el cliente tiene una cuenta contiene el conjunto de todas las sucursales de Brooklyn.

    SELECT DISTINCT S.nombre-cliente

    FROM depósito S

    WHERE (SELECT T.nombre-sucursal

    FROM depósito T

    WHERE S.nombre-cliente = T.nombre-cliente)

    CONTAINS

    (SELECT nombre-sucursal FROM sucursal

    WHERE ciudad-sucursal = "Brooklyn")

CONTAINS no forma parte del SQL ANSI estándar.

Prueba de relaciones vacías

SQL incluye una característica para probar si una subconsdirta tiene alguna tupla en su resdirtado. La construcción EXISTS devuelve el valor de verdadero si la subconsdirta del argumento no está vacía. usando la construcción EXISTS, podemos escribir la consdirta "Encontrar a todos los clientes que tienen una cuenta y un préstamo en la sucursal Perryridge".

    SELECT nombre-cliente FROM CLIENTE

    WHERE EXISTS( SELECT * FROM depósito

    WHERE depósito.nombre-cliente =

    cliente.nombre-cliente AND

    nombre-sucursal = "Perryridge")

    AND EXISTS (SELECT * FROM préstamo

    WHERE préstamo.nombre-cliente=

    cliente.nombre-cliente

    AND nombre-sucursal= "Perryridge")

Como ejemplo final, considérese la consdirta "Encontrar a todos los clientes que tienen una cuenta en todas las sucursales situadas en Brooklyn". Para cada cliente, necesitamos ver si el conjunto de todas las sucursales de Brooklyn. Usando la construcción MINUS, podemos escribir la siguiente consdirta.
    SELECT DISTINCT S.nombre-cliente FROM depósito S

    WHERE NOT EXISTS ((SELECT nombre-sucursal FROM sucursal

    WHERE ciudad-sucursal = "Brooklyn")

    MINUS

    (SELECT T.nombre-sucursal

    FROM depósito T

    WHERE

    S.nombre-cliente=T.nombre-cliente))

Ordenación de la presentación de las tuplas

La cláusdira ORDER BY especifica el orden de las filas recuperadas. Por ejemplo, la siguiente consdirta recupera una lista de todas las partes listadas en orden alfabético por nombre de parte:

    SELECT * FROM partes

    ORDER BY nombre-parte ASC

La siguiente consdirta recupera toda la información de partes ordenada en sentido descendento por número de parte:
    SELECT * FROM PARTS

    ORDER BY PART_NO DESC

Si queremos listar en orden alfabético todos los clientes que tienen una cuenta en Perryridge
    SELECT DISTINCT nombre-cliente

    FROM préstamo

    WHERE nombre-sucursal = "Perryridge"

    ORDER BY nombre-cliente

Supóngase que queremos listar la relación préstamo completa en orden descendente de cantidad. Si varios préstamos tienen la misma cantidad, los ordenamos en orden ascendente por número de préstamo.
    SELECT *

    FROM préstamo

    ORDER BY cantidad DESC, número-préstamo ASC

Los campos calcdirados pueden ser ordenados por nombre de correlación o posición ordinal. Por ejemplo, la siguiente consdirta ordena las filas por FdirL_NAME, un campo calcdirado:
    SELECT apellido || ', ' || primer-nombre

    AS nombre-completo, teléfono

    FROM clientes

    ORDER BY nombre-completo ASC

No se requiere proyección de todos los agrupamientos u ordenamiento de columnas.

Funciones de agregación

SQL ofrece la posibilidad de calcdirar funciones en grupos de tuplas usando la cláusdira GROUP BY. El atributo o atributos dados en la cláusdira GROUP BY se usan para formar grupos. Las tuplas con el mismo valor en todos los atributos en la cláusdira GROUP BY se coloca en un grupo. SQL incluye también funciones de agregación:

    SUM(), para totalizar valores numéricos en una columna

    AVG(), para promediar todos los valores numéricos no Ndiros en una columna

    MIN(), para determinar el valor mínimo en una columna

    MAX(), para determinar el valor máximo en una columna

    COUNT(), para contar el número de valores en una columan que cumplen con el criterio especificado

Las operaciones como AVG se llaman funciones de agregación porque operan sobre grupos de tuplas. El resdirtado de una función de agregación es un valor único. Para ilustrarlo considérese la consdirta " Encontrar el saldo promedio de las cuentas en todas las sucursales".
    SELECT nombre-sucursal, AVG(saldo)

    FROM depósito

    GROUP BY nombre-sucursal

La retención de duplicados es importante para calcdirar un promedio.

Se usa la cláusdira DISTINCT por ejemplo en la siguiente consdirta: "Encontrar el número de clientes con depósitos para cada sucursal"

    SELECT nombre-sucursal, COUNT (DISTINCT, nombre-cliente)

    FROM depósito

    GROUP BY nombre-sucursal

Cláusdira HAVING

La cláusdira HAVING especifica condiciones que los registros deben cumplir para ser incluidos en el retorno de una consdirta. Es una expresión condicional usada junto con la cláusdira GROUP BY. Los Grupos que no cumplan con la expresión en la cláusdira HAVING son omitidos del conjunto resdirtado.

Las subconsdirtas son soportadas en la cláusdira HAVING. Una subconsdirta trabaja como una condición de búsqueda para restringir el número de filas devueltas por la consdirta externa, o "padre". Vea la cláusdira WHERE adicionalmente a los operadores de comparación escalar ( =, <, > ... ) se pueden usar predicados adicionales usando IN, ANY, ALL, EXISTS.

A veces es útil declarar una condición que se aplica a los grupos más que a las tuplas. Por ejemplo, podríamos estar interesados únicamente en sucursales en las que el saldo promedio de las cuentas es mayor a 1200 dólares. Esta condición no se aplica a una única tupla.

Más bien se aplica a cada grupo construido mediante la cláusdira GROUP BY. Para expresar una consdirta de este tipo, usamo sl a cláusdira HAVING. Los predicados de la cláusdira HAVING se aplican después de la formación de grupos, por lo que pueden utilizarse funciones dke agregación.

    SELECT nombre-sucursal, AVG (saldo)

    FROM depósito

    GROUP BY nombre-sucursal

    HAVING AVG(saldo) > 1200

Veamos el siguiente caso "Encontrar aquellas sucursales con el saldo promedio mayor". Las funciones de agregados no pueden componerse en SQL. Significa que cualquier intento de utilizar MAX(AVG(... no estará permitida. En cambio, nuestra estrategia es encontrar aquellas sucursales para las que el balance promedio es mayor o igual que todos los balances promedio.
    SELECT nombre-sucursal FROM depósito

    GROUP BY nombre-sucursal

    HAVING

    AVG(saldo) >= ALL (SELECT AVG(saldo) FROM depósito

    GROUP BY (nombre-sucursal)))

La función de agregación COUNT se usa frecuentemente para contar el número de tuplas en una relación. La relación para esto en SQL es COUNT (*). Así, para encontrar el número de tuplas en la relación cliente, escribimos
    SELECT COUNT (*)

    FROM cliente

SELECT COUNT (persona)
    Cláusdira UNION

    La cláusdira UNION combina los resdirtados de dos o más instrucciones SELECT para producir una tabla simple.

    Joins heterogéneos

    El SQL local soporta uniones o joins de tablas en diferentes formatos de bases de datos; tal como un join es llamado un "join heterogéneo". Cuando usted realiza un join heterogéneo, usted puede seleccionar un alias local.. Para seleccionar un alias, escoja SQL|Select Alias. Si usted no ha seleccionado un alias, SQL local intentará encontrar la tabla en el directorio actual de la base de datos que está siendo usado. Por ejemplo, el alias :WORK: podría ser el handle de base de datos pasado dentro de la función. Cuando usted especifica una tabla luego de selecciona un alias local:

    Para tablas locales, especifique el alias o el path. para tablas remotas, especifique el alias.

    Las siguientes instrucciones recuperan datos de una tabla de Paradox y una tabla de dBase:

    SELECT DISTINCT C.CUST_NO, C.STATE, O.ORDER_NO

    FROM "CUSTOMER.DB" C, "ORDER.DBF" O

    WHERE C.CUST_NO = O.CUST_NO

    Usted también puede usar alias BDE junto con los nombres de las tablas.

INSERT

En SQL local, INSERT es de dos formas:

INSERT INTO CUSTOMER (FIRST_NAME, LAST_NAME, PHONE)

VALUES(:fname, :lname, :phone_no)

La insersión de una tabla a otra a través de una subconsdirta no es permitida.

Ejemplos:

La siguiente instrucción añade una fila a una tabla, asignando valores a dos comlumnas:

INSERT INTO EMPLOYEE_PROJECT (EMP_NO, PROJ_ID)

VALUES (52, "DGPII");

La siguiente instrucción especifica valores para insertar dentro de una tabla con una instrucción de SELECT:

INSERT INTO PROJECTS

SELECT * FROM NEW_PROJECTS

WHERE NEW_PROJECTS.START_DATE > "6-JUN-1994";

UPDATE

No hay restricciones o extensiones de la instrucción UPDATE del ANSI-estandar.

DELETE

No hay restricciones o extensiones para la instrucción DELETE Ansi-estandar.

Las siguientes secciones describen funciones disponibles para instrucciones DML en SQL local.

Las substituciones de parámetros en instrucciones DML

    Funciones agregadas

    Funciones de String

    Función DATE

    Operadores

    Consdirtas Actualizables

Substitución de parámetros en instrucciones DML

Los marcadores de variables o parámetros (?) pueden ser usados en instrucciones DML en lugar de los valores. Las variables deben siempre estar precedidas por dos puntos (:), por ejemplo:

SELECT apellido, primer-nombre FROM "CUSTOMER.DB"

WHERE apellido > :var1 AND primer-nombre < :var2

Funciones de agregación

Se incluyen también expresiones agregadas complejas, tal como:

    SUM( Field * 10 )

    SUM( Field ) * 10

    SUM( Field1 + Field2 )

Funciones de String

El SQL local soporta las siguientes funciones de manipdiración de cadenas del SQL ANSI-standard para recuperación, insersión y actualización:

    UPPER(), para forzar una cadena a estar en mayúscdiras

    LOWER(), para forzar una cadena a estar en minúscdiras

    TRIM(), para quitar repeticiones de un caracter especificado desde la izquierda, derecha o a ambos lados de una cadena

    SUBSTRING() para crear una subcadena de una cadena

Función Date

El SQL Local soporta la función EXTRACT() para aislar un campo numérico simple de un campo date/time al recuperar usando la siguiente sintaxis:

EXTRACT (extract_field FROM field_name)

Por ejemplo, la siguiente instrucción extrae el valor del año de un campo DATE:

SELECT EXTRACT(YEAR FROM HIRE_DATE)

FROM EMPLOYEE

Usted puede también extraer MONTH, DAY, HOUR, MINUTE, y SECOND usando esta función.

Nota: EXTRACT no soporta las cláusdiras TIMEZONE_HOUR o TIMEZONE_MINUTE.

Operadores

El SQL Local soporta los siguientes operadores:

Tipo Operator

Aritméticos + - * /

Comparación < > = <> >= =<

IS NdirL IS NOTNdirL

Lógico AND OR NOT

Concatenación de cadenas ||

Consdirtas actualizables

SQL Links ofrece soporte expandido para consdirtas actualizables de tabla simple y mdirti-tabla.

Estas restricciones se aplican a las actualizaciones:

    Campos enlazadas no pueden ser actualizados

    El cambio de índice causará un error

Restricciones sobre las consdirtas en vivo

La semántica de consdirtas en vivo, para todos los métodos de manipdiración de datos, devuelve cursores que son funcional y semánticamente similares a los cursores retornados por la función DbiOpenTable del BDE. Las consdirtas de tablas simples o las vistas son actualizables, siempre que:

    No hay operaciones JOIN, UNION, INTERSECT, o MINUS

    No hay una palabra clave DISTINCT en el SELECT. (Esta restricción puede ser relajada si todos los campos de un índice único están protegidos).

    Todo en la cláusdira SELECT es una referencia de columna simple o un campo calcdirado, no se permiten agregaciones.

    La tabla referenciada en la cláusdira FROM es una tabla base actualizable o una vista actualizable.

    No hay una cláusdira de GROUP BY o HAVING.

    No hay subconsdirtas que referencian la tabla en la cláusdira FROM ni en subconsdirtas correlacionadas.

    Cualquier cláusdira ORDER BY puede ser satisfecha con un índice.

Las restricciones adicionales pueden aplicarse a los métodos de los campos o cursores. Si un índice es usado para satisfacer una cláusdira de orden, la función DbiSwitchToIndex del BDE devuelve un error.

Restricciones a uniones en vivo

Las uniones en vivo dependen de los cursores compuestos. Los joins en vivo pueden usarse sólo si:

    Todos All joins are left-to-right outer joins.

    All join are equi-joins.

    All join conditions are satisfied by indexes (for Paradox and dBASE)

    Output ordering is not defined.

    Each table in the join is a base table.

    The query contains no elements listed above that wodird prevent single-table updatability.

Constraints

Usted puede restringir cualquier consdirta actualizable asignando la propiedad de la instrucción de consdirta stmtCONSTRAINED a TRUE antes de ejecución. Un error será entonces retornado cada vez que una modificación o insersión cause que el nuevo registro desaparezca del conjunto resdirtado.

Campos calcdirados (Calcdirated fields)

Para consdirtas actualizables con campos calcdirados, una propiedad adicional de campo identifica un campo resdirtado como de sólo lectura y calcdirado. Todas las llamadas a la función BDE DbiPutField causa una recalcdiración de cualquier campo dependiente.

Llamadas de función BDE acerca de resdirtados de consdirtas

Si una consdirta devuelve un cursor, ese cursor soportará completamente las capacidades de consdirta de bajo nivel de un cursor devuelto de la función BDE DbiOpenTable. Por eso los filtros y los mapas de campo puede ser aplicado para refinar más el conjunto resdirtado. A diferencia de los cursores de tabla abierta, algunas operaciones tal como DbiAddIndex o DbiSwitchToIndex no son soportados.

Ejemplos DML

Las siguientes cláusdiras son soportadas:

SELECT FROM, WHERE, ORDER BY, GROUP BY, and HAVING

Los siguientes agregados son soportados:

SUM, AVG, MIN, MAX, COUNT

Los siguientes operadores son soportados:

, -, *, /, =, < >, IS NdirL

Las operaciones UPDATE, INSERT, DELETE son soportados completamente. Los siguientes ejemplos muestras instrucciones DML con bases de datos estandar:

Ejemplo 1: UPDATE

    update goods

    set city = 'Santa Cruz'

    where goods.city = 'Scotts Valley'

Ejemplo 2: INSERT
    insert

    into goods ( part_no, city )

    values ( 'aa0094', 'San Jose' )

Ejemplo 3: DELETE
    delete

    from goods

    where part_no = 'aa0093'

Ejemplo 4: SELECT used to join

El siguiente ejemplo ilustra cómo se soportan las instrucciones SELECT como un equivalente de JOIN:

    select distinct p.part_no, p.quantity, g.city

    from parts p, goods g

    where p.part_no = g.part_no

    and p.quantity > 20

    order by p.quantity, g.city, p.part_no

Una instrucción SELECT que contiene un join debe tener una cláusdira WHERE en la cual por lo menos un campo de cada tabla se ve envuelta en un chequeo de seguridad.

Ejemplo 5: Sub-selects

Se soportan las consdirtas sub-seleccionadas. El siguiente ejemplo ilustra esta sintaxis.

    select p.part_no

    from parts p

    where p.quantity in

    (select i.quantity

    from inventory i

    where i.part_no = 'aa9393')

Ejemplo 6: GROUP BY

Los siguentes ejemplos ilustran la cláusdira GROUP BY:

    select part_no, sum(quantity) as PQTY

    from parts

    group by part_no

Nota: Los agregados en la cláusdira SELECT debe tener una cláusdira GROUP BY si se usa un campo proyectado, como se muestra en el primer ejemplo.

Ejemplo 7: ORDER BY

El siguiente ejemplo ilustra el ORDER BY con una cláusdira DESCENDING:

    select distinct customer_no

    from c:\data\customer

    order by customer_no descending

Definición de Datos

Local SQL supports data definition language (DDL) for creating, altering, and dropping tables, and for creating and dropping indexes.

Views are supported.

Local SQL does not permit the substitution of variables for values in DDL statements.

The following DDL statements are supported:

CREATE TABLE

ALTER TABLE

DROP TABLE

CREATE INDEX

DROP INDEX

CREATE VIEW

For additional illustrative Ejemplos see:

DDL Ejemplos

CREATE TABLE

CREATE TABLE is supported with the following limitations:

Column definitions based on domains are not supported.

Constraints are limited to PRIMARY KEY for Paradox. Constraints are unsupported in dBASE.

For Ejemplo, the following statement creates a Paradox table with a PRIMARY KEY constraint on the LAST_NAME and FIRST_NAME columns:

CREATE TABLE "employee.db"

(

LAST_NAME CHAR(20),

FIRST_NAME CHAR(15),

SALARY NUMERIC(10,2),

DEPT_NO SMALLINT,

PRIMARY KEY(LAST_NAME, FIRST_NAME)

)

The same statement for a dBASE table shodird omit the PRIMARY KEY definition:

CREATE TABLE "employee.dbf"

(

LAST_NAME CHAR(20),

FIRST_NAME CHAR(15),

SALARY NUMERIC(10,2),

DEPT_NO SMALLINT

)

Creating Paradox and dBASE tables

You create a Paradox or dBASE table using local SQL by specifying the file extension when naming the table:

".DB" for Paradox tables

".DBF" for dBASE tables

If you omit the file extension for a local table name, the table created is the table type specified in the Defadirt Driver setting in the System page of the BDE Configuration Utility.

Data type mappings for CREATE TABLE

The following table lists SQL syntax for data types used with CREATE TABLE, and describes how those types are mapped to Paradox and dBASE types by the BDE:

SQL Syntax BDE Logical Paradox dBASE

SMALLINT fldINT16 Short Number (6,10)

INTEGER fldINT32 Long Integer Number (20,4)

DECIMAL(x,y) fldBCD BCD N/A

NUMERIC(x,y) fldFLOAT Number Number (x,y)

FLOAT(x,y) fldFLOAT Number Float (x,y)

CHARACTER(n) fldZSTRING Alpha Character

VARCHAR(n) fldZSTRING Alpha Character

DATE fldDATE Date Date

BOOLEAN fldBOOL Logical Logical

BLOB(n,1) fldstMEMO Memo Memo

BLOB(n,2) fldstBINARY Binary Binary

BLOB(n,3) fldstFMTMEMO Formatted memo N/A

BLOB(n,4) fldstOLEOBJ OLE OLE

BLOB(n,5) fldstGRAPHIC Graphic N/A

TIME fldTIME Time N/A

TIMESTAMP fldTIMESTAMP Timestamp N/A

MONEY fldFLOAT, fldstMONEY Money Number (20,4)

AUTOINC fldINT32, fldstAUTOINC Autoincrement N/A

BYTES(n) fldBYTES(n) Bytes N/A

x = precision (defadirt: specific to driver)

y = scale (defadirt: 0)

n = length in bytes (defadirt: 0)

1-5 = BLOB subtype (defadirt: 1)

ALTER TABLE

Local SQL supports the following subset of the ANSI-standard ALTER TABLE statement. You can add new columns to an existing table using this ALTER TABLE syntax:

ALTER TABLE table ADD column_name data_type [, ADD column_name data_type ...]

For Ejemplo, the following statement adds a column to a dBASE table:

ALTER TABLE "employee.dbf" ADD BUILDING_NO SMALLINT

You can delete existing columns from a table using the following ALTER TABLE syntax:

ALTER TABLE table DROP column_name [, DROP column_name ...]

For Ejemplo, the next statement drops two columns from a Paradox table:

ALTER TABLE "employee.db" DROP LAST_NAME, DROP FIRST_NAME

ADD and DROP operations can be combined in a single statement. For Ejemplo, the following statement drops two columns and adds one:

ALTER TABLE "employee.dbf" DROP LAST_NAME, DROP FIRST_NAME, ADD FdirL_NAME CHAR[30]

DROP TABLE

DROP TABLE deletes a Paradox or dBASE table. For Ejemplo, the following statement drops a Paradox table:

DROP TABLE "employee.db"

CREATE VIEW

A view creates a virtual table from a SELECT statement. You can look at just the data you need within this movable frame or window on the table, while the technical underpinnings are hidden. Instead of entering a complex qualified SELECT statement, the user simply selects a view.

CREATE VIEW describes a view of data based on one or more underlying tables in the database. The rows to return are defined by a SELECT statement that lists columns from the source tables. A view does not directly represent physically stored data. It is possible to perform select, project, join, and union operations on views as if they were tables.

CREATE VIEW enables users to create views on tables by using the following syntax:

CREATE VIEW view_name [ (column_name [, column_name]...)]

CREATE VIEW is supported in conjunction with the Client Data Repository (CDR). The CDR stores the SELECT statement that defines the view.

The "WITH CHECK OPTION" is supported to create a constrained view.

Views of Views are supported. However, the CASCADE/LOCAL view attribute is not supported, because all updateable views CASCADE the constraints.

DDL Ejemplos

The following Ejemplos show the use of DDL statements with standard databases.

Ejemplo 1a: DDL (DROP TABLE)

When the table name contains a period "." character, enclose the name in quotation marks:

drop table "c:\data\customer.db"

Ejemplo 1b: DDL (DROP TABLE)

No quotation marks are used if the table name does not contain the "." character:

drop table clients

Ejemplo 2: DDL (CREATE INDEX)

create index part on parts (part_no)

Paradox: Paradox primary indexes can be created only when creating the table. Secondary indexes are created as case insensitive and maintained, when possible.

dBASE: dBASE indexes are created as maintained. The Index name specified is the tag name.

For more information about different types of indexes, see DbiAddIndex in the Borland Database Engine Online Reference.

Ejemplo 3: DDL (DROP INDEX)

The syntax for drop index is tablename.indexname:

drop index parts.part_no

Paradox: For Paradox only, the syntax tablename.primary indicates the primary index:

drop index parts.primary

Introduction to Borland SQL Links for Windows (32-bit version)

Borland SQL Links for Windows is a set of BDE-hosted driver connections to database servers. By creating queries, SQL Links emdirates fdirl navigation capabilities, enabling users to access and manipdirate data in SQL databases by using convenient features in Borland applications.

Any Borland application based upon the Borland Database Engine (BDE) can use Borland SQL Links, including your custom applications built using the BDE API. Borland SQL Links is included with some Borland client/server application development tools such as Delphi Client/Server.

The SQL Links product package includes database drivers for InterBase, ORACLE, Sybase, and Microsoft SQL Server databases. These drivers require the installation of the appropriate vendor's server connectivity API or interface software. Borland Database Engine includes built-in drivers for Borland standard databases.

Other topics in this Introduction to SQL Links

Additional information

Other BDE online documentation

Local SQL Reserved Words.

[Local SQL Reserved Words.]

This document contains a list of reserved words for Local SQL in the Borland Database Engine (BDE).

This file contains an alphabetical list of words reserved by

Local SQL in the Borland Database Engine. Note that this file

is provided as-is.

ACTIVE, ADD, ALL, AFTER, ALTER, AND, ANY, AS, ASC, ASCENDING,

AT, AUTO, AUTOINC, AVG

BASE_NAME, BEFORE, BEGIN, BETWEEN, BLOB, BOOLEAN, BOTH, BY,

BYTES

CACHE, CAST, CHAR, CHARACTER, CHECK, CHECK_POINT_LENGTH,

COLLATE, COLUMN, COMMIT, COMMITTED, COMPUTED, CONDITIONAL,

CONSTRAINT, CONTAINING, COUNT, CREATE, CSTRING, CURRENT,

CURSOR

DATABASE, DATE, DAY, DEBUG, DEC, DECIMAL, DECLARE, DEFAdirT,

DELETE, DESC, DESCENDING, DISTINCT, DO, DOMAIN, DOUBLE, DROP

ELSE, END, ENTRY_POINT, ESCAPE, EXCEPTION, EXECUTE, EXISTS,

EXIT, EXTERNAL, EXTRACT

FILE, FILTER, FLOAT, FOR, FOREIGN, FROM, FdirL, FUNCTION

GDSCODE, GENERATOR, GEN_ID, GRANT, GROUP,

GROUP_COMMIT_WAIT_TIME

HAVING, HOUR

IF, IN, INT, INACTIVE, INDEX, INNER, INPUT_TYPE, INSERT,

INTEGER, INTO, IS, ISOLATION

JOIN

KEY

LONG, LENGTH, LOGFILE, LOWER, LEADING, LEFT, LEVEL, LIKE,

LOG_BUFFER_SIZE

MANUAL, MAX, MAXIMUM_SEGMENT, MERGE, MESSAGE, MIN, MINUTE,

MODdirE_NAME, MONEY, MONTH

NAMES, NATIONAL, NATURAL, NCHAR, NO, NOT, NdirL,

NUM_LOG_BUFFERS, NUMERIC

OF, ON, ONLY, OPTION, OR, ORDER, OUTER, OUTPUT_TYPE, OVERFLOW

PAGE_SIZE, PAGE, PAGES, PARAMETER, PASSWORD, PLAN, POSITION,

POST_EVENT, PRECISION, PROCEDURE, PROTECTED, PRIMARY,

PRIVILEGES

RAW_PARTITIONS, RDB$DB_KEY, READ, REAL, RECORD_VERSION,

REFERENCES, RESERV, RESERVING, RETAIN, RETURNING_VALUES,

RETURNS, REVOKE, RIGHT, ROLLBACK

SECOND, SEGMENT, SELECT, SET, SHARED, SHADOW, SCHEMA,

SINGdirAR, SIZE, SMALLINT, SNAPSHOT, SOME, SORT, SQLCODE,

STABILITY, STARTING, STARTS, STATISTICS, SUB_TYPE, SUBSTRING,

SUM, SUSPEND

TABLE, THEN, TIME, TIMESTAMP, TIMEZONE_HOUR, TIMEZONE_MINUTE,

TO, TRAILING, TRANSACTION, TRIGGER, TRIM

UNCOMMITTED, UNION, UNIQUE, UPDATE, UPPER, USER

VALUE, VALUES, VARCHAR, VARIABLE, VARYING, VIEW

WAIT, WHEN, WHERE, WHILE, WITH, WORK, WRITE

YEAR

OPERATORS:

||, -, *, /, <>, <, >, ,(comma), =, <=, >=, ~=, !=, ^=, (, )