SELECT - SQL (Comando)

Recupera datos de una o más tablas.

SELECT [ALL | DISTINCT] [TOP nExpr [PERCENT]] [Alias.] Select_Item 
   [[AS] Column_Name] [, [Alias.] Select_Item [[AS] Column_Name] ...] 
   FROM [FORCE][DatabaseName!]Table [[AS] Local_Alias] 
   [[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN 
      DatabaseName!] Table [[AS] Local_Alias] [ON JoinCondition …]
      [[INTO Destination] | [TO FILE FileName [ADDITIVE] | TO PRINTER 
      [PROMPT] | TO SCREEN]] [PREFERENCE PreferenceName]
      [NOCONSOLE] [PLAIN] [NOWAIT]
   [WHERE JoinCondition [AND JoinCondition ...]
      [AND | OR FilterCondition [AND | OR FilterCondition ...]]]
   [GROUP BY GroupColumn [, GroupColumn ...]] 
   [HAVING FilterCondition] [UNION [ALL] SELECTCommand] 
   [ORDER BY Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...]]

Parámetros

  • SELECT
    Especifica los campos, constantes y expresiones que se mostrarán en el resultado de la consulta.

  • ALL
    De forma predeterminada, se muestran todas las filas del resultado de la consulta.

  • DISTINCT
    Excluye duplicados de cualquier fila del resultado de la consulta.

    Nota   Puede utilizar DISTINCT únicamente una vez por cada cláusula SELECT.

  • TOP nExpr [PERCENT]
    Especifica que el resultado de la consulta contenga un número determinado de filas o un porcentaje de filas en el resultado de la consulta. Es necesario incluir una cláusula ORDER BY si incluye la cláusula TOP. La cláusula ORDER BY especifica las columnas en las que la cláusula TOP determinará el número de filas que se va a incluir en el resultado de la consulta.

    Puede especificar desde 1 a 32.767 filas. Las filas de valores idénticos para las columnas especificadas en la cláusula ORDER BY se incluyen en el resultado de la consulta. Por lo tanto, si especifica 10 para nExpr, el resultado de la consulta podrá obtener más de 10 filas, si hay más de 10 filas con valores idénticos para las columnas especificadas en la cláusula ORDER BY.

    Si se incluye la palabra clave PERCENT, se redondeará al número entero más alto el número de columnas devuelto en el resultado. Los valores permitidos para nExpr cuando se incluye la palabra clave PERCENT son de 0,01 a 99,99.

  • Alias.
    Califica nombres de elementos coincidentes. Cada elemento que especifique con Select_Item genera una columna de los resultados de la consulta. Si dos o más elementos tienen el mismo nombre, incluya el alias de la tabla y un punto antes del nombre del elemento para impedir la duplicación de las columnas.

    Select_Item especifica un elemento que se incluirá en el resultado de la consulta. Un elemento puede ser uno de los siguientes:

    • El nombre de un campo de una tabla de la cláusula FROM.
    • Una constante, especificando que el mismo valor constante debe aparecer en cada fila del resultado de la consulta.
    • Una expresión que puede ser el nombre de una función definida por el usuario (FDU).
  • AS Column_Name
    Especifica el título de una columna en el resultado de la consulta. Esta opción resulta muy útil cuando Select_Item es una expresión o contiene una función de campo y desea dar un nombre significativo a la columna. Column_Name puede ser una expresión, pero no puede contener caracteres (por ejemplo, espacios) que no estén permitidos para nombres de campos de tablas.

  • FROM
    Indica las tablas que contienen los datos que ha obtenido la consulta. Si no hay ninguna tabla abierta, Visual FoxPro muestra el cuadro de diálogo Abrir, donde puede especificar la ubicación del archivo. Una vez abierta, la tabla permanece abierta cuando finaliza la consulta.

    FORCE especifica que las tablas se combinen en el orden de aparición en la cláusula FROM. Si se omite FORCE, Visual FoxPro intentará optimizar la consulta. Sin embargo, es posible que la consulta se ejecute más rápido si se incluye la palabra clave FORCE para desactivar la optimización de consultas de Visual FoxPro.

  • DatabaseName!
    Especifica el nombre de una base de datos inactiva que contiene la tabla. Es necesario incluir el nombre de la base de datos que contiene la tabla en caso de que no sea la base de datos activa. Incluya el delimitador signo de exclamación (!) después del nombre de la base de datos y antes del nombre de la tabla.

  • [AS] Local_Alias
    Especifica un nombre temporal para la tabla indicada en Table. Si especifica un alias local, debe utilizar el alias local en lugar del nombre de la tabla en toda la instrucción SELECT.

    INNER JOIN especifica que el resultado de la consulta contenga sólo filas en una tabla con la que coincidan una o varias filas de otra tabla.

    LEFT [OUTER] JOIN especifica que el resultado de la consulta contenga todas las filas de la tabla a la izquierda de la palabra clave JOIN y sólo las filas que coincidan procedentes de la tabla a la derecha de la palabra clave JOIN. La palabra clave OUTER es opcional; se puede incluir para resaltar que se ha creado una combinación externa.

    RIGHT [OUTER] JOIN especifica que el resultado de la consulta contenga todas las filas de la tabla a la derecha de la palabra clave JOIN y sólo las filas que coincidan de la tabla a la izquierda de la palabra clave JOIN. La palabra clave OUTER es opcional; se puede incluir para resaltar que se ha creado una combinación externa.

    FULL [OUTER] JOIN especifica que el resultado de la consulta contenga todas las filas, coincidan o no, de ambas tablas. La palabra clave OUTER es opcional; se puede incluir para resaltar que se ha creado una combinación externa.

    ON Join Condition especifica las condiciones según las cuales se combinan las tablas.

  • INTO Destination
    Determina donde se almacenan los resultados de la consulta. Si incluye una cláusula INTO y una cláusula TO en la misma consulta, la cláusula TO se pasará por alto. Si no incluye la cláusula INTO, los resultados de la consulta se mostrarán en la ventana Examinar. Los resultados de la consulta pueden dirigirse también a la impresora o a un archivo con la cláusula TO.

    Destination puede ser uno de los siguientes:

    • ARRAY ArrayName, que almacena los resultados de la consulta en una matriz de variable de memoria. Si la consulta selecciona 0 registros, la matriz no se creará.

    • CURSOR CursorName [NOFILTER | READWRITE], que almacena los resultados de una consulta en un cursor. Si especifica el nombre de una tabla abierta, Visual FoxPro generará un mensaje de error. Después de ejecutar SELECT, el cursor temporal permanecerá abierto y estará activo y será de sólo lectura a menos que se especifique la opción READWRITE. Cuando cierre este cursor temporal, se borrará. Los cursores pueden existir como un archivo temporal en la unidad SORTWORK.

      Incluya NOFILTER para crear un cursor que se pueda usar en consultas posteriores. En versiones anteriores de Visual FoxPro, era necesario incluir una expresión o una constante adicional como un filtro para crear un cursor utilizable en consultas posteriores. Por ejemplo, la adición de un valor lógico verdadero como una expresión de filtro creaba una consulta que podía utilizarse en consultas posteriores:

      SELECT *, .T. FROM customers INTO CURSOR myquery
      

      Si se incluye NOFILTER, es posible que disminuya el rendimiento de la consulta, puesto que se crea una tabla temporal en el disco. Cuando se cierre el cursor se eliminará del disco la tabla temporal.

      La cláusula READWRITE especifica que el cursor es temporal y se puede modificar.

    • DBF | TABLE TableName[DATABASE DatabaseName [NAME LongTableName]] almacena los resultados de una consulta en una tabla. Si especifica una tabla que ya esté abierta y SET SAFETY está en OFF, Visual FoxPro sobrescribirá la tabla sin previo aviso. Si no ha especificado ninguna extensión, Visual FoxPro asignará la extensión .DBF a la tabla. La tabla permanecerá abierta y activa después de ejecutar SELECT.

      Incluya DATABASE DatabaseName para especificar una base de datos a la que se agregará la tabla. Incluya NAME LongTableName para especificar un nombre largo para la tabla. Los nombres largos pueden contener un máximo de 128 caracteres y se pueden utilizar en lugar de nombres de archivo cortos en la base de datos.

  • TO FILE FileName
    Si incluye una cláusula TO pero no una cláusula INTO, puede dirigir el resultado de la consulta a un archivo de texto ASCII llamado FileName, a la impresora o a la ventana principal de Visual FoxPro.

    ADDITIVE anexa los resultados de la consulta al contenido existente del archivo de texto especificado en TO FILE FileName.

    TO PRINTER [PROMPT] dirige los resultados de la consulta a una impresora. Utilice la cláusula PROMPT opcional para mostrar un cuadro de diálogo antes de que empiece la impresión. En este cuadro de diálogo puede modificar la configuración de la impresora. Las opciones de configuración de la impresora que puede ajustar dependen del controlador de impresora que tenga instalado actualmente. Coloque PROMPT justo después de TO PRINTER.

    TO SCREEN dirige los resultados de la consulta a la ventana principal de Visual FoxPro o a una ventana activa definida por el usuario.

  • PREFERENCE PreferenceName
    Si el resultado de una consulta se envía a una ventana Examinar, guarda los atributos y opciones de la ventana Examinar para utilizarlos después. PREFERENCE guarda los atributos, o preferencias, por tiempo indefinido en el archivo de recursos FOXUSER. Las preferencias se pueden recuperar en cualquier momento.

    Ejecutando SELECT con PREFERENCE PreferenceName por primera vez, se crea la preferencia. Ejecutando posteriormente SELECT con el mismo nombre de preferencia, se restaura la ventana Examinar con el mismo estado de preferencia. Cuando se cierre la ventana Examinar, se actualiza la preferencia.

    Si sale de una ventana Examinar presionando CTRL+Q+W, no se guardarán los cambios de la ventana Examinar en el archivo de recursos.

  • NOCONSOLE
    Impide que el resultado de la consulta se envíe a un archivo, a la impresora o a la ventana principal de Visual FoxPro.

  • PLAIN
    Impide que aparezcan los encabezados de las columnas al mostrar los resultados de la consulta. PLAIN puede utilizarse tanto si está presente una cláusula TO como si no. Si se incluye una cláusula TO, se pasará por alto PLAIN.

  • NOWAIT
    Continúa la ejecución del programa después de abrir la ventana Examinar y de dirigir a ella los resultados de la consulta. El programa no esperará a que la ventana Examinar se cierre, sino que continuará con la ejecución de la línea de programa inmediatamente siguiente a la instrucción SELECT.

    Cuando se incluye TO SCREEN para dirigir los resultados hacia la ventana principal de Visual FoxPro o una ventana definida por el usuario, los resultados se detienen cuando la ventana principal de Visual FoxPro o la ventana definida por el usuario se llena con resultados de la consulta. Presione una tecla para ver el siguiente conjunto de resultados de la consulta. Si se incluye NOWAIT, los resultados de la consulta se desplazarán fuera de la ventana principal de Visual FoxPro o de la ventana definida por el usuario sin esperar a que se presione una tecla. NOWAIT se pasa por alto si se incluye con la cláusula INTO.

  • WHERE
    Especifica que Visual FoxPro sólo debe incluir en los resultados de la consulta los registros que satisfagan los criterios especificados.

  • JoinCondition
    Especifica los campos que vinculan las tablas en la cláusula FROM. Si incluye más de una tabla en una consulta, deberá especificar una condición de combinación para cada tabla después de la primera.

    Las condiciones de combinación múltiples deben conectarse mediante el operador AND. Cada condición de combinación tiene la forma siguiente:

    FieldName1 Comparison FieldName2

    FieldName1 es el nombre de un campo de una tabla, FieldName2 es el nombre de un campo de otra tabla y Comparison es uno de los operadores siguientes:

    Operador Comparación
    = Igual
    == Exactamente igual
    LIKE SQL LIKE
    <>, !=, # Distinto de
    > Mayor que
    >= Mayor o igual que
    < Menor que
    <= Menor o igual que

    Cuando utiliza el operador = con cadenas, actúa de forma distinta dependiendo del ajuste de SET ANSI. Cuando SET ANSI está desactivado, Visual FoxPro trata las comparaciones de cadenas en la forma habitual en Xbase. Cuando SET ANSI está activado, Visual FoxPro sigue las normas ANSI para las comparaciones de cadenas. Vea SET ANSI y SET EXACT para obtener información adicional acerca de cómo realiza Visual FoxPro las comparaciones de cadenas.

    La cláusula WHERE admite el operador ESCAPE para la JoinCondition, lo que le permite realizar consultas significativas sobre datos que contengan caracteres comodín _ y % de SELECT - SQL.

    La cláusula ESCAPE le permite especificar que se traten los caracteres comodín de SELECT - SQL como si fueran caracteres literales. En la cláusula ESCAPE se especifica un carácter, que si se coloca inmediatamente antes del carácter comodín, indica que se tratará al carácter comodín como a un carácter literal.

  • FilterCondition
    Especifica los criterios que deben satisfacer los registros para ser incluidos en los resultados de la consulta. Una consulta puede incluir tantas condiciones de filtro como desee, conectadas con el operador AND y OR. También puede utilizar el operador NOT para invertir el valor de una expresión lógica o utilizar EMPTY( ) para comprobar si hay campos vacíos.

FilterCondition puede adoptar cualquier de las formas de los siguientes ejemplos:

  • Ejemplo 1

En el ejemplo 1 se muestra FilterCondition como FieldName1 Comparison FieldName2

customer.cust_id = orders.cust_id
  • Ejemplo 2

En el ejemplo 2 se muestra FilterCondition como FieldName Comparison Expression

payments.amount >= 1000
  • Ejemplo 3

En el ejemplo 3 se muestra FilterCondition como FieldName Comparison ALL (Subquery)

Cuando la condición de filtro incluye ALL, el campo debe cumplir la condición de comparación para todos los valores generados por la subconsulta antes de que se incluya el registro en el resultado de la consulta.

company < ALL ;
(SELECT company FROM customer WHERE country = "UK")
  • Ejemplo 4

En el ejemplo 4 se muestra FilterCondition como FieldName Comparison ANY | SOME (Subquery)

Cuando la condición de filtro incluye ANY o SOME, el campo debe cumplir la condición de comparación en al menos uno de los valores generados por la subconsulta.

company < ANY ;
(SELECT company FROM customer WHERE country = "UK")
  • Ejemplo 5

En el ejemplo 5 se muestra FilterCondition como FieldName [NOT] BETWEEN Start_Range AND End_Range

Este ejemplo comprueba si los valores del campo están dentro de un intervalo de valores especificado.

customer.postalcode BETWEEN 90000 AND 99999
  • Ejemplo 6

En el ejemplo 6 se muestra FilterCondition como [NOT] EXISTS (Subquery)

Este ejemplo comprueba si al menos una línea cumple los criterios de la subconsulta. Cuando la condición de filtro incluye EXISTS, la condición de filtro se evalúa como verdadero (.T.) a no ser que la subconsulta sea un conjunto vacío.

EXISTS ;(SELECT * FROM orders WHERE customer.postalcode =orders.postalcode)
  • Ejemplo 7

En el ejemplo 7 se muestra FilterCondition como FieldName [NOT] IN Value_Set

Cuando una condición de filtro incluye IN, el campo debe contener uno de los valores antes de que el registro se incluya en los resultados de la consulta.

customer.postalcode NOT IN ("98052","98072","98034")
  • Ejemplo 8

En el ejemplo 8 se muestra FilterCondition como FieldName [NOT] IN (Subquery)

Aquí, el campo debe contener uno de los valores devueltos por la subconsulta antes de que su registro se incluya en los resultados de la consulta.

customer.cust_id IN ;(SELECT orders.cust_id FROM orders WHERE orders.city="Seattle")
  • Ejemplo 9

En el ejemplo 9 se muestra FilterCondition como FieldName [NOT] LIKE cExpression

  • customer.country NOT LIKE "UK"

  • Esta condición de filtro busca cada uno de los campos que coinciden con cExpression.

Puede utilizar el signo de porcentaje (%) y subrayado ( _ ) como parte de cExpression. El signo de porcentaje representa a cualquier secuencia de caracteres desconocidos en la cadena. El subrayado representa un solo carácter desconocido en la cadena.

  • GROUP BY GroupColumn [, GroupColumn ...]
    Agrupa las filas de la consulta basándose en los valores de una o más columnas. GroupColumn puede ser el nombre de un campo normal de una tabla, o un campo que incluya una función de campo SQL o una expresión numérica que indique la posición de la columna en la tabla de resultados (la columna más a la izquierda tiene el número 1).

  • HAVING FilterCondition
    Especifica una condición de filtro que los grupos deben satisfacer para quedar incluidos en el resultado de la consulta. HAVING debe utilizarse con GROUP BY. Puede incluir tantas condiciones de filtro como desee, conectadas con los operadores AND u OR. También puede utilizar NOT para invertir el valor de una expresión lógica.

    FilterCondition no puede contener una subconsulta.

    Una cláusula HAVING sin una cláusula GROUP BY actúa como una cláusula WHERE. Puede utilizar alias locales y funciones de campo en la cláusula HAVING. Utilice una cláusula WHERE para acelerar el rendimiento si la cláusula HAVING no contiene funciones de campo. No olvide que la cláusula HAVING debería de aparecer antes de una cláusula INTO porque de lo contrario se producirá un error de sintaxis.

  • [UNION [ALL] SELECTCommand]
    Combina el resultado final de un SELECT con el resultado final de otro SELECT. De forma predeterminada, UNION comprueba el resultado combinado y elimina las filas duplicadas. Puede utilizar paréntesis para combinar varias cláusulas UNION.

    ALL impide que UNION elimine filas duplicadas de los resultados combinados.

    Las cláusulas UNION siguen las reglas siguientes:

    • No puede utilizar UNION para combinar subconsultas.
    • Los resultados de ambos SELECT deben tener el mismo número de columnas.
    • Cada columna de resultados de la consulta de un SELECT debe tener el mismo tipo de datos y ancho que su columna correspondiente en el otro SELECT.
    • Únicamente el SELECT final puede tener una cláusula ORDER BY, que debe referirse a las columnas de resultados por su número. Si se incluye otra cláusula ORDER BY, afectará al resultado completo.

    También puede utilizar la cláusula UNION para simular una combinación externa.

    Al combinar dos tablas en una consulta, sólo se incluirán en los resultados los registros que tengan valores coincidentes en los campos combinados. Si un registro de la tabla primaria no tiene un registro correspondiente en la tabla secundaria, no se incluirá en los resultados. Una combinación externa permite incluir todos los registros de la tabla primaria en los resultados, junto con los registros coincidentes de la tabla secundaria. Para crear una combinación externa en Visual FoxPro, debe utilizar un comando SELECT anidado, como en el siguiente ejemplo:

    SELECT customer.company, orders.order_id, orders.emp_id ;
       FROM customer, orders ;
       WHERE customer.cust_id = orders.cust_id ;
    UNION ;
       SELECT customer.company, 0, 0 ;
       FROM customer ;
       WHERE customer.cust_id NOT IN ;
       (SELECT orders.cust_id FROM orders)
    

    **Nota   **Asegúrese de incluir el espacio que precede a cada punto y coma. Si no lo hace así; se producirá un error.

    La sección del comando anterior a la cláusula UNION selecciona registros de las dos tablas que tengan valores coincidentes. No se incluirán las compañías de clientes que no tengan facturas asociadas. La sección del comando situada después de la cláusula UNION selecciona registros de la tabla de clientes que no tengan registros coincidentes en la tabla de pedidos.

    En cuanto a la segunda sección del comando, tenga en cuenta lo siguiente:

    • Se procesará primero la instrucción SELECT escrita entre paréntesis. Esta instrucción realiza una selección de todos los números de cliente de la tabla de pedidos.

    • La cláusula WHERE busca todos los números de cliente de la tabla de clientes que no estén en la tabla de pedidos. Como la primera sección del comando proporcionaba todas las compañías que tuvieran un número de cliente en la tabla de pedidos, ahora se incluirán en el resultado de la consulta todas las compañías de la tabla de clientes.

    • Como las estructuras de las tablas incluidas en una cláusula UNION deben ser idénticas, hay dos marcadores en la segunda instrucción SELECT para representar los parámetros orders.order_id y orders.emp_id de la primera instrucción SELECT.

      **Nota   **Los marcadores deben tener el mismo tipo que los campos que representan. Si el campo es un tipo de datos, el marcador debe ser { / / }. Si el campo es un tipo Character, el marcador debe ser la cadena vacía ("").

      En determinadas circunstancias puede producirse una transformación de datos automática, como en los dos ejemplos siguientes:

      CREATE CURSOR table1 (field1 c(1))
      CREATE CURSOR table2 (field1 c(2))
      SELECT field1 FROM table1 UNION SELECT NVL(field1,'  ') FROM table2  
      
      CREATE CURSOR table1 (field1 n(20,5))
      CREATE CURSOR table2 (field1 i)
      SELECT field1 FROM table1 UNION SELECT field1 FROM table2 
      
  • ORDER BY Order_Item
    Ordena el resultado de la consulta basándose en los datos de una o varias columnas. Cada Order_Item debe corresponder a una columna de resultados de la consulta y puede ser uno de los siguientes:

    • Un campo de una tabla FROM que también es un elemento de selección en la cláusula principal SELECT (no en una subconsulta).
    • Una expresión numérica que indica la ubicación de la columna en la tabla de resultados. (La columna de la izquierda es la número 1.)

    ASC especifica un orden ascendente para los resultados de la consulta, de acuerdo con el elemento o los elementos de orden, y es el valor predeterminado para ORDER BY.

    DESC especifica un orden descendente para los resultados de la consulta.

    Los resultados de la consulta aparecerán desordenados si no especifica un orden con ORDER BY.

Observaciones

SELECT es un comando SQL incorporado en Visual FoxPro como cualquier otro comando de Visual FoxPro. Cuando utiliza SELECT para componer una consulta, Visual FoxPro interpreta la consulta y recupera los datos especificados de las tablas. Puede crear una consulta SELECT:

  • En la ventana Comandos
    • En un programa de Visual FoxPro (como cualquier otro comando de Visual FoxPro)
    • En el Diseñador de consultas

Cuando ejecuta SET TALK ON y ejecuta SELECT, Visual FoxPro muestra la duración de la consulta y el número de registros del resultado. _TALLY contiene el número de registros del resultado de la consulta.

SELECT no respeta la condición de filtro actual especificada con SET FILTER.

Nota   Una subconsulta, a la que se hace referencia en los argumentos siguientes, es un comando SELECT dentro de otro SELECT y debe incluirse entre paréntesis. Puede tener hasta dos subconsultas al mismo nivel (no anidadas) en la cláusula WHERE (consulte esta sección de los argumentos). Las subconsultas pueden contener condiciones de combinación múltiples.

Cuando se obtiene el resultado de una consulta, las columnas se denominan según las siguientes reglas:

  • Si un elemento seleccionado es un campo con un nombre único, el nombre de la columna de resultados es el nombre del campo.
  • Si hay más de un elemento seleccionado con el mismo nombre, se anexarán un signo de subrayado y una letra al nombre de la columna. Por ejemplo, si una tabla llamada Customer tiene un campo llamado STREET, y una tabla llamada Employees también tiene un campo llamado STREET, las columnas de resultado se llamarán Extension_A y Extension_B (STREET_A y STREET_B). En el caso de un elemento seleccionado con un nombre de 10 caracteres, se truncará el nombre para agregar el símbolo de subrayado y la letra. Por ejemplo, DEPARTMENT se convertiría en DEPARTME_A.
  • Si un elemento seleccionado es una expresión, su columna de resultado se llamará EXP_A. Cualquier otra expresión recibirá el nombre de EXP_B, EXP_C, y así sucesivamente.
  • Si un elemento seleccionado contiene una función de campo como, por ejemplo, COUNT( ), la columna de resultado se llamará CNT_A. Si otro elemento seleccionado contiene SUM( ), su columna de resultado se llamará SUM_B.

Funciones definidas por el usuario con SELECT   Aunque la utilización de funciones definidas por el usuario en la cláusula SELECT ofrece unas ventajas evidentes, también debería tener en cuenta las siguientes limitaciones:

  • Es posible que la velocidad de las operaciones con SELECT se vea limitada por la velocidad a la que se ejecutan las funciones definidas por el usuario. Las manipulaciones de un gran volumen que impliquen funciones definidas por el usuario se pueden realizar mejor utilizando funciones API y funciones definidas por el usuario escritas en C o en lenguaje ensamblador.
  • No se puede suponer nada acerca de la entrada/salida (E/S) de Visual FoxPro ni del entorno de la tabla en funciones definidas por el usuario invocadas a partir de SELECT. Generalmente no se puede saber qué área de trabajo se ha seleccionado, el nombre de la tabla actual, ni los nombres de los campos que se están procesando. El valor de estas variables depende del lugar específico, en el proceso de optimización, en el que se invoque la función definida por el usuario.
  • En funciones definidas por el usuario invocadas desde SELECT, no es seguro cambiar la E/S de Visual FoxPro ni el entorno de la tabla. En general, los resultados son impredecibles.
  • La única forma segura de pasar valores a funciones definidas por el usuario invocadas desde SELECT es por medio de la lista de argumentos pasada a la función al invocarla.
  • Si prueba y descubre una manipulación teóricamente prohibida que funciona correctamente en una versión determinada de FoxPro, eso no significa que también funcione en versiones posteriores.

Fuera de estas limitaciones, las funciones definidas por el usuario son aceptables en la cláusula SELECT. Sin embargo, recuerde que la utilización de SELECT puede reducir el rendimiento.

Las siguientes funciones de campo están disponibles para ser utilizadas con un elemento seleccionado que sea un campo o una expresión que incluya a un campo:

  • AVG(Select_Item), que promedia una columna de datos numéricos.
  • COUNT(Select_Item), que cuenta el número de elementos seleccionados en una columna. COUNT(*) cuenta el número de filas en el resultado de la consulta.
  • MIN(Select_Item), que determina el menor valor de Select_Item en una columna.
  • MAX(Select_Item), que determina el mayor valor de Select_Item en una columna.
  • SUM(Select_Item), que proporciona el total de la suma de una columna de datos numéricos.

No se pueden anidar las funciones de campo.

Combinaciones   Visual FoxPro admite sintaxis de combinación de 1992 SQL ANSI, lo que le permite crear consultas que vinculen las filas en dos o más tablas mediante la comparación de los valores de campos especificados. Por ejemplo, una combinación interna selecciona filas procedentes de dos tablas sólo cuando los valores de los campos combinados son iguales. Visual FoxPro admite combinaciones anidadas.

Como SQL está basado en la teoría matemática de conjuntos, cada tabla se puede representar como un círculo. La cláusula ON que especifica las condiciones de la combinación determina el punto de intersección, que representa el conjunto de filas que coinciden. En el caso de una combinación interna, la intersección tendrá lugar en el interior o en una parte “interna” de los dos círculos. Una combinación externa incluye tanto las filas coincidentes que se han encontrado en la sección de intersección interna de las tablas, como las filas de la parte externa del círculo, a la izquierda o a la derecha de la intersección.

Nota    Tenga presente la siguiente información a la hora de crear condiciones de combinación:

  • Si incluye dos tablas en una consulta y no especifica una condición de combinación, cada registro de la primera tabla se combinará con cada registro de la segunda tabla mientras se cumplan las condiciones del filtro. Una consulta de este tipo puede producir unos resultados muy largos.
  • Sea prudente al utilizar, en condiciones de combinación, funciones como DELETED( ), EOF( ), FOUND( ), RECCOUNT( ) y RECNO( ), que aceptan un área de trabajo o un alias opcional. La inclusión de un alias o de un área de trabajo en estas funciones puede producir resultados inesperados. SELECT no utiliza sus áreas de trabajo; realiza lo mismo que USE ... AGAIN. Las consultas de una sola tabla que utilizan estas funciones sin un área de trabajo o un alias opcional, devolverán resultados correctos. De todas formas, las consultas de varias tablas que utilicen dichas funciones (incluso sin un área de trabajo o un alias opcional) pueden devolver resultados inesperados.
  • Tenga cuidado al combinar tablas que contengan campos vacíos, ya que Visual FoxPro establece coincidencias entre los campos vacíos. Por ejemplo, si combina CUSTOMER.ZIP e INVOICE.ZIP, y CUSTOMER contiene 100 códigos postales vacíos e INVOICE contiene 400 códigos postales vacíos, el resultado de la consulta contendrá 40.000 registros más, como resultado de los campos vacíos. Use la función EMPTY( ) para eliminar los registros vacíos del resultado de la consulta.
  • El número de combinaciones que puede utilizar está limitado. Por cada instrucción Select se admiten nueve combinaciones como máximo.

Si se incluye la función EVALUATE( ) en la cláusula WHERE de una consulta SQL, podrían devolverse datos incorrectos.

Para obtener información adicional acerca de las combinaciones, vea Definir múltiples condiciones de combinación en Crear vistas.

Ejemplos

Los siguientes ejemplos ilustran la utilización de las funciones definidas por el usuario con SELECT - SQL:

Ejemplo 1

En el ejemplo 1 se muestran los nombres de todas las compañías en customer (un campo de una tabla).

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT customer.company ;
   FROM customer

Ejemplo 2

El ejemplo 2 muestra el contenido de tres campos de dos tablas y combina las dos tablas basándose en el campo cust_id. Utiliza alias locales para ambas tablas.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT x.company, y.order_date, y.shipped_on ;
   FROM customer x, orders y ;
   WHERE x.cust_id = y.cust_id

Ejemplo 3

El ejemplo 3 muestra únicamente registros con datos únicos en los campos especificados.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT DISTINCT x.company, y.order_date, y.shipped_on ;
   FROM customer x, orders y ;
   WHERE  x.cust_id = y.cust_id

Ejemplo 4

El ejemplo 4 muestra los campos country, postalcode y company en orden ascendente.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT country, postalcode, company ;
   FROM customer ;
   ORDER BY country, postalcode, company

Ejemplo 5

El ejemplo 5 almacena el contenido de los campos de dos tablas en una tercera tabla.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT x.company, y.order_date, y.shipped_on ;
   FROM customer x, orders y ;
   WHERE x.cust_id = y.cust_id ;
   INTO TABLE custship.dbf
BROWSE

Ejemplo 6

El ejemplo 6 muestra únicamente los registros con una fecha de pedido anterior al 16/02/1994.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT x.company, y.order_date, y.shipped_on ;
   FROM customer x, orders y ;
   WHERE x.cust_id = y.cust_id ;
   AND y.order_date < {^1994-02-16}

Ejemplo 7

El ejemplo 7 muestra los nombres de todas las compañías de customer con un código postal que coincida con el código postal de la tabla orders.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT company FROM customer x WHERE ;
   EXISTS (SELECT * FROM orders y WHERE x.postalcode = y.postalcode)

Ejemplo 8

El ejemplo 8 muestra todos los registros de customer que tengan un nombre de compañía que comience por una C mayúscula y tenga cualquier longitud.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer x WHERE x.company LIKE "C%"

Ejemplo 9

El ejemplo 9 muestra todos los registros de customer que tengan un nombre de país que comience por U mayúscula seguido de un carácter desconocido.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer x WHERE x.country LIKE "U_"

Ejemplo 10

El ejemplo 10 muestra los nombres de todas las ciudades de customer en mayúsculas y llama CityList a la columna de resultados.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT UPPER(city) AS CityList FROM customer

Ejemplo 11

El ejemplo 11 muestra cómo se puede realizar una consulta de datos que contengan signos de porcentaje (%). Se colocará una barra inversa (\) antes del signo de porcentaje para indicar que debe ser tratado como un literal, y la barra inversa se especifica como el carácter de escape en la cláusula ESCAPE.

Dado que las tablas de ejemplo incluidas con Visual FoxPro no contienen el carácter de signo de porcentaje, esta consulta no devolverá ningún resultado.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer;
WHERE company LIKE "%\%%" ESCAPE "\"

Ejemplo 12

En el ejemplo 12 se muestra cómo se puede realizar una consulta de datos que contenga signos de subrayado (_). Se coloca una barra inversa (\) antes del signo de subrayado para indicar que debe ser tratado como un literal, y se especifica la barra inversa como el carácter de escape en la cláusula ESCAPE.

Dado que las tablas de ejemplo incluidas con Visual FoxPro no contienen el carácter de subrayado, esta consulta no devolverá ningún resultado.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer;
WHERE company LIKE "%\_%" ESCAPE "\"

Ejemplo 13

En el ejemplo 13, el carácter Escape se utiliza como un literal. El guión es tanto el carácter escape como un literal. La consulta devuelve todas las filas en las que el nombre de la organización contiene un signo de porcentaje seguido de un guión.

Dado que las tablas de ejemplo incluidas con Visual FoxPro no contienen el carácter de signo de porcentaje, esta consulta no devolverá ningún resultado.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer;
WHERE company LIKE "%-%--%" Escape "-"

Vea también

CREATE QUERY | CREATE TABLE - SQL | INSERT - SQL | MODIFY QUERY | SET ANSI | SET EXACT | SET PATH | _TALLY | Definir múltiples condiciones de combinación