[TALLER 2] :: Facultad Politécnica ::
Manual de SQL
«Structured Query Language»
sql
El Lenguaje de consulta estructurado (Structured Query Language) es un lenguaje
declarativo de acceso a bases de datos relacionales que permite especificar diversos tipos de
operaciones sobre las mismas.
Una de sus características es el manejo del álgebra y el cálculo relacional permitiendo
lanzar consultas con el fin de recuperar -de una forma sencilla- información de interés de una
base de datos, así como también hacer cambios sobre la misma.
Sintaxis
1. Para Consultar Registros | SELECT
SELECT <lista de campos separados por coma>|*;
FROM <lista de tablas separadas por coma>;
WHERE <lista de condiciones separados por operadores lógicos (AND|OR)>;
INTO (CURSOR|TABLE) <nombre de la tabla>;
ORDER BY <lista de campos para ordenación separados por coma>
Ejemplo:
SELECT * FROM alumnos WHERE alu_edad>18 and alu_ciudad=1 INTO CURSOR TEMP
Selecciona todos los campos (*) de los registros la tabla alumnos que cumplan las
condiciones: edad sea mayor que 18 y la ciudad de residencia sea 1. El resultado de la
consulta se guarda en una tabla temporal (cursor) llamado TEMP.
2. Para Insertar Registros | INSERT
INSERT INTO <nombre de la tabla> (<lista de campos separados por coma>);
VALUES (<lista de valores separados por coma>)
Ejemplo:
INSERT INTO ciudades (ciu_codigo, ciu_nombre);
VALUES (1,”Ciudad del Este”)
Inserta un nuevo registro en la tabla de ciudades, en donde en valor del campo ciu_codigo
es 1 y el valor del campo ciu_nombre es “Ciudad del Este”.
3. Para Eliminar Registros | DELETE
DELETE FROM <nombre de la tabla>;
WHERE <lista de condiciones separados por operadores lógicos>
MANUAL BÁSICO DE SQL - Esteban Maidana - Revisado 24/07/2009 1
[TALLER 2] :: Facultad Politécnica ::
Ejemplo:
DELETE FROM ciudades WHERE ciu_codigo=1
Elimina el registro de la tabla de ciudades cuyo código es igual 1.
Es importante tener en cuenta que los registros son eliminados únicamente de forma lógica,
es decir, permanecen físicamente en la tabla. Para eliminarlos físicamente se debe ejecutar
el comando PACK. El ejemplo completo se muestra a continuación:
DELETE FROM ciudades WHERE ciu_codigo=1
PACK
4. Para Modificar Registros | UPDATE
UPDATE <nombre de la tabla>;
SET <campo_uno=valor_uno>, <campo_dos=valor_dos>, <campo_n=valor_n>;
WHERE <lista de condiciones separados por operadores lógicos (AND|OR)>
Ejemplo:
UPDATE alumnos
SET alu_carrera=1, alu_inscripto=”si”
WHERE alu_carrera=4 and alu_fecha_inscri>={15/03/2009}
Modifica los campos alu_carrera y alu_inscripto de los registros cuyos campos alu_carrera
es igual a 4 y alu_fecha_inscri es mayor o igual al 15/03/2009.
Ejemplos prácticos
A fin de una mejor compresión de los ejemplos, se describen a continuación la estructura de
las tablas utilizadas así como los datos que contienen cada una de ellas y finalmente las
consultas de ejemplo con sus respectivos resultados si correspondiere.
Definición de las Tablas
a) PRODUCTOS
Nombre Tipo Long Dec. Descripción
PRO_CODIGO N 5 0 Código del producto
PRO_DESCRI C 40 Descripción del producto
PRO_CATEGO N 3 0 Categoría del producto (Clave Foránea)
PRO_PRECIO N 10 2 Precio de la mercadería
PRO_STOCK N 10 3 Stock existente.
b) CATEGORIAS
Nombre Tipo Long Dec. Descripción
CAT_CODIGO N 3 0 Código de la categoría
CAT_DESCRI C 40 Descripción de la categoría
MANUAL BÁSICO DE SQL - Esteban Maidana - Revisado 24/07/2009 2
[TALLER 2] :: Facultad Politécnica ::
c) CLIENTES
Nombre Tipo Long Dec. Descripción
CLI_CODIGO N 8 0 Código del cliente
CLI_NOMBRE C 40 Nombre del cliente
CLI_DIREC C 50 Dirección del cliente
CLI_CREDIT N 10 0 Límite de crédito del cliente
CLI_INTERE N 5 2 Interés aplicado al cliente en %
d) CTA_COBRAR
Nombre Tipo Long Dec. Descripción
CTA_NUMERO N 12 0 Número de la cuenta
CTA_CLIEN N 8 Código del cliente (Clave Foránea)
CTA_EMISIO F 8 Fecha del emisión (creación) de la cuenta
CTA_VENCI F 8 Fecha de vencimiento
CTA_MONTO N 10 0 Monto de la cuenta
Registros de las tablas
a) PRODUCTOS
CÓDIGO DESCRIPCIÓN CATEGORÍA PRECIO STOCK
1 Sierra de Calar Bosch GST 120 BE 1 100,00 1500,00
2 Mecha de acero corte diamante. 2 250,00 20,00
3 Glifosato 80% 3 150,52 18,15
4 Taladro de Percusión Skill 1 300,00 35,50
5 Remachadora Tramontina Pro 20151 1 55,55 0
b) CATEGORIAS
CÓDIGO DESCRIPCIÓN
1 Herramientas
2 Piezas y Repuestos
3 Agro Químicos
4 Semillas
5 Máquinas Usadas
c) CLIENTES
CÓDIGO NOMBRE DIRECCIÓN CREDITO INTERÉS
1 Juan Pérez Dirección uno 500.000 12,50
2 Fulano Martínez Dirección dos 750.000 10,12
3 Pedro Ferraina Dirección tres 1.500.000 8,00
4 Fausto Farreras Dirección cuatro 350.000 15,00
MANUAL BÁSICO DE SQL - Esteban Maidana - Revisado 24/07/2009 3
[TALLER 2] :: Facultad Politécnica ::
d) CTA_COBRAR
NÚMERO CLIENTE EMISIÓN VENCIMIENTO MONTO
1 1 15/01/2009 15/02/2009 150.000
2 1 20/01/2009 20/02/2009 47.000
3 3 23/01/2009 23/02/2009 130.000
4 2 13/02/2009 13/03/2009 200.000
5 4 15/02/2009 15/03/2009 180.000
6 3 18/03/2009 18/04/2009 555.000
7 1 24/03/2009 24/04/2009 100.000
8 2 05/05/2009 05/06/2009 53.000
9 3 05/05/2009 05/06/2009 350.000
Actividades
a. Construir una consulta SQL para obtener los siguientes datos:
- Código de producto
- Descripción del producto
- Descripción de la categoría del producto
SELECT pro_codigo, pro_descri, cat_descri;
FROM productos, categorías;
WHERE pro_catego=cat_codigo;
INTO CURSOR TEMP
Resultado: cursor TEMP
PRO_CODIGO PRO_DESCRI CAT_DESCRI
1 Sierra de Calar Bosch GST 120 BE Herramientas
2 Mecha de acero corte diamante. Piezas y Repuestos
3 Glifosato 80% Agro Químicos
4 Taladro de Percusión Skill Herramientas
5 Remachadora Tramontina Pro 20151 Herramientas
b. Construir una consulta SQL para obtener el valor de las mercaderías en stock:
SELECT pro_codigo, pro_descri,(pro_stock*pro_precio) AS valor;
FROM productos, categorías;
WHERE pro_catego=cat_codigo;
INTO CURSOR VALORES
Para obtener el valor de las mercaderías en stock se hace una simple operación matemática
(multiplicación) entre el precio unitario (pro_precio) y el stock existente (pro_stock).
Además, se utiliza la palabra reservada AS para renombrar la columna o campo.
MANUAL BÁSICO DE SQL - Esteban Maidana - Revisado 24/07/2009 4
[TALLER 2] :: Facultad Politécnica ::
Resultado: cursor VALORES
PRO_CODIGO PRO_DESCRI VALOR
1 Sierra de Calar Bosch GST 120 BE 150.000
2 Mecha de acero corte diamante. 5.000
3 Glifosato 80% 2.731,938
4 Taladro de Percusión Skill 10.650
5 Remachadora Tramontina Pro 20151 0
c. Construir una consulta SQL para obtener un listado con los códigos, nombres y límites de
crédito de los clientes:
SELECT cli_codigo AS CODIGO, cli_nombre AS NOMBRE, cli_credito AS CREDITO;
FROM clientes;
INTO CURSOR CLIENTES
Resultado: cursor CLIENTES
CODIGO NOMBRE CREDITO
1 Juan Pérez 500.000
2 Fulano Martínez 750.000
3 Pedro Ferraina 1.500.000
4 Fausto Farreras 350.000
d. Construir una consulta SQL para obtener un listado de clientes morosos conteniendo el
código, el nombre, el vencimiento y el monto. Considerar fecha actual como 01/05/2009.
SELECT cta_cliente, cli_nombre, cta_venci, cta_monto;
FROM cta_cobrar, clientes;
WHERE cta_venci<DATE() and cta_clien=cli_codigo;
INTO CURSOR CUENTAS
Resultado: cursor CUENTAS
CTA_CLIENTE CLI_NOMBRE CTA_VENCI CTA_MONTO
1 Juan Pérez 15/02/2009 150.000
1 Juan Pérez 20/02/2009 47.000
3 Pedro Ferraina 23/02/2009 130.000
2 Fulano Martínez 13/03/2009 200.000
4 Fausto Farreras 15/03/2009 180.000
3 Pedro Ferraina 18/04/2009 555.000
1 Juan Pérez 24/04/2009 100.000
e. Construir una consulta SQL para obtener un listado de clientes con sus respectivas
sumatorias de cuentas por pagar.
MANUAL BÁSICO DE SQL - Esteban Maidana - Revisado 24/07/2009 5
[TALLER 2] :: Facultad Politécnica ::
SELECT cta_clien AS codigo, cli_nombre AS nombre, SUM(cta_monto) AS suma;
FROM cta_cobrar, clientes;
WHERE cta_clien=cli_codigo;
GROUP BY cta_clien, cli_nombre;
INTO CURSOR SUMATORIA
Resultado: Cursor SUMATORIA
CODIGO NOMBRE SUMA
1 Juan Pérez 297.000
2 Fulano Martínez 253.000
3 Pedro Ferraina 1.035.000
4 Fausto Farreras 180.000
Para utilizar las funciones de sumatoria y similares, se debe utilizar la clausula Group By, en
el cual deben constar todos los campos incluidos en Select, teniendo en cuenta que el
campo por el cual se realizará el corte o grupo debe estar en primer lugar desde la
izquierda.
Es imprescindible incluir todos los campos, ya que de otra forma la consulta arrojará un
error. En este aspecto la sintaxis SQL de Visual FoxPro se contradice al estándar SQL, ya
que en dicho estándar no es necesario incluir todos los campos, sino únicamente el campo
por el cual se realizará el agrupamiento.
f. Construir una consulta SQL para obtener un listado de las cuentas que se encuentran
vencidas, incluir el número de cuenta, el nombre del cliente, el monto, y el interés.
Considerar la fecha actual como 01/05/2009.
SELECT cta_numero AS Numero, cli_nombre AS Nombre, cta_monto AS Monto,;
CALC_INTER(cta_monto, cta_venci, cli_intere) AS Interes;
FROM cta_cobrar, clientes;
WHERE cta_clien=cli_codigo and cta_venci>DATE();
INTO CURSOR VENCIDAS
FUNCTION CALC_INTER
PARAMETERS monto, venci, _inte
dias = venci-DATE()
const = ((_inte/30)*dias)/100
inter_ = monto*const
RETURN INT(inter_)
ENDFUNC
Resultado: Cursor VENCIDAS
NUMERO NOMBRE MONTO INTERES
7 Juan Pérez 100.000 14.583
8 Fulano Martínez 53.000 6.257
9 Pedro Ferraina 350.000 32.666
MANUAL BÁSICO DE SQL - Esteban Maidana - Revisado 24/07/2009 6
[TALLER 2] :: Facultad Politécnica ::
g. Construir una consulta SQL para insertar un producto con los siguientes datos:
- Codigo: 6
- Descripcion: Nuevo Producto
- Categoria: 3
- Precio: 5000
- Stock: 15
INSERT INTO productos (pro_codigo, pro_decri, pro_catego,;
pro_precio, pro_stock);
VALUES (6,”Nuevo Producto”, 3, 5000, 15)
h. Construir una consulta SQL para modificar el producto que posee el código 6, cambiar la
descripción a “Otra descripcion”, la categoría a 2, el precio a 15.700 y el stock a 254.
UPDATE productos SET
pro_descri=”Otra descripción”,;
pro_catego=2,;
pro_precio=15700,;
pro_stock=254;
WHERE pro_codigo=6
i. Construir una consulta SQL para eliminar el producto cuyo código es 6.
DELETE FROM productos WHERE pro_codigo=6
SELECT productos
PACK
Al eliminar un registro es necesaria la utilización de comando PACK para que dicha
eliminación sea física, de lo contrario, el registro sólo será marcado para su eliminación y
seguirá siendo visible para las consultas SQL.
Es importante observar que antes de utilizar PACK se debe seleccionar la tabla física con
SELECT, ya que generalmente tendremos seleccionado algún cursor con el que estuvimos
trabajando previamente dentro del programa. Al intentar ejecutar PACK con un cursor,
visual foxpro arrojará un error.
MANUAL BÁSICO DE SQL - Esteban Maidana - Revisado 24/07/2009 7