Sei sulla pagina 1di 15

SQLEXEC() - SQL (Comando)

INGLES
The following example shows various ways to use
SQLEXEC()
to execute ad-hoc queries and to call or create stored procedures:

CLEAR
LOCAL lnConn
LOCAL lnPercent AS Int && Input parameters must be typed.
LOCAL lnOutput
lnPercent = 50
lnOutput = 0

* Haga la conexión, suponiendo una conexión de confianza local. (1)


lnConn = SQLCONNECT('local')
IF m.lnConn > 0 && Success.

* Establecer la base de datos activa a PUBS.


SQLEXEC(m.lnConn, 'use pubs')

* Ejecutar instrucción SELECT.


SQLEXEC(m.lnConn, 'SELECT * FROM authors', 'PubAuthors')
BROWSE

* Ejecutar la sentencia INSERT, obtener el valor de campo de identidad.(4)

SQLEXEC(m.lnConn, "INSERT INTO JOBS (job_desc, min_lvl, max_lvl);


VALUES ('Developer',75,150)")
SQLEXEC(m.lnConn, "SELECT SCOPE_IDENTITY()", "job_id")
? "ID for added Job is " + LTRIM(STR(job_id.exp))

* Ejecutar instrucción DELETE. Obtiene el número de registros afectados.


SQLEXEC(m.lnConn, "DELETE FROM JOBS WHERE job_desc ='Developer'")
SQLEXEC(m.lnConn, "SELECT @@ROWCOUNT", 'rowcount')
? rowcount.exp, "record(s) deleted"

SQLEXEC(m.lnConn, 'sp_who', 'activeusers')


BROWSE

* Ejecutar procedimiento almacenado con un parámetro de entrada.


SQLEXEC(m.lnConn, 'exec byroyalty ?lnPercent','HalfOffAuthors')

* Crear temp procedimiento almacenado con parámetros OUTPUT y llamarlo.


SQLEXEC(m.lnConn, "CREATE PROCEDURE #MyProc @outparam int OUTPUT AS;
SELECT @outparam=100")
SQLEXEC(m.lnConn, "exec #myProc ?@lnOutput")
? m.lnOutput

Crear un procedimiento almacenado temporal con parámetros input-output


* Y lo llaman.
SQLEXEC(m.lnConn, "CREATE PROCEDURE #MyProc2 " + ;
"@inputparam INT, " + ;
"@outparam int OUTPUT " + ;
"AS SET @outparam=@inputparam*10")
SQLEXEC(m.lnConn, "exec #myProc2 ?lnPercent, ?@lnOutput")
? m.lnOutput

* Obtener información de la versión.


SQLEXEC(m.lnConn, 'SELECT @@VERSION','SQLVersion1')
? STRTRAN(SQLVersion1.Exp,CHR(0))

* Disconnect.
SQLDISCONNECT(m.lnConn)
ELSE
? "Unable to connect to SQL Server"
ENDIF
RETURN

INSERTAR UN REGISTRO EN UNA BASE DE DATO:

INSERT - SQL (Comando)


2003
Anexa un registro al final de una tabla que contiene los valores de campo especificados.

INSERT INTO dbf_name [(fname1 [, fname2, ...])]


VALUES (eExpression1 [, eExpression2, ...])
–O bien–

INSERT INTO dbf_name FROM ARRAY ArrayName | FROM MEMVAR


Parámetros
INSERT INTO dbf_name
Especifica el nombre de la tabla a la que se anexará un registro. dbf_name puede incluir una
ruta de acceso y puede ser una expresión de nombre.
Si la tabla especificada no está abierta, se abrirá en una área de trabajo nueva y se anexará el
nuevo registro a la tabla. El área de trabajo nueva no se selecciona, sino que permanece
seleccionada el área de trabajo actual.
Si la tabla que especifica está abierta, INSERT anexa el registro a la tabla. Si la tabla está abierta
en una área de trabajo distinta del área de trabajo actual, no se seleccionará después de anexar
el registro; el área de trabajo actual permanecerá seleccionada.
[(fname1 [, fname2 [, ...]])]
Especifica los nombres de los campos del nuevo registro donde se insertan los valores.
VALUES (eExpression1 [, eExpression2 [, ...]])
Especifica los valores de campo que se insertan en el nuevo registro. Si omite los nombres de
los campos, debe especificar los valores de campo en el orden definido por la estructura de la
tabla. Si SET NULL está ON, INSERT - SQL intentará insertar valores nulos en cualquier campo
no especificado de la cláusula VALUES.
FROM ARRAY ArrayName
Especifica la matriz cuyos datos se insertan en el nuevo registro. El contenido de los elementos
de la matriz, comenzando por el primer elemento, se inserta en los campos correspondientes
del registro. El contenido del primer elemento de la matriz se inserta en el primer campo del
nuevo registro, el contenido del segundo elemento se inserta en el segundo campo, y así
sucesivamente.
Se ignora cualquier valor predeterminado de los campos cuando se incluye la cláusula FROM
ARRAY.
FROM MEMVAR
Especifica que el contenido de las variables se inserta en los campos que tengan los mismos
nombres que dichas variables. Si no existe una variable con el mismo nombre que el campo,
éste permanecerá vacío.
Observaciones
El nuevo registro contiene los datos indicados en la cláusula VALUES o incluidos en la matriz o las
variables especificadas. El puntero de registro se coloca en el nuevo registro.
Ejemplo
En el siguiente ejemplo se abre la tabla employee y se agrega un registro.

USE employee
INSERT INTO employee (emp_no, fname, lname, officeno) ;
VALUES (3022, "John", "Smith", 2101)
El ejemplo siguiente abre la tabla customer de la base de datos testdata. El contenido del registro actual
se reparte en variables, y la estructura de la tabla se copia a una nueva tabla llamada cust2. Se usa
INSERT - SQL para insertar un registro nuevo en la tabla cust2 y se ejecuta BROWSE para mostrar el
nuevo registro.

CLOSE DATABASES
CLEAR

OPEN DATABASE (HOME(2) + 'Data\testdata')


USE Customer && Open customer table
* Scatter current record to memory variables
SCATTER MEMVAR

* Copy structure of current table to example table


COPY STRUCTURE TO cust2

* Insert record from memory variable


INSERT INTO cust2 FROM MEMVAR

SELECT CUST2
BROWSE

* Close and delete example table


USE
DELETE FILE cust2.dbf
Vea también
CREATE QUERY | CREATE TABLE – SQL | MODIFY QUERY | SELECT – SQL
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 nExprcuando 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. VeaSET 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 yExtension_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

Potrebbero piacerti anche