Indice
1.
Introducción
2. Consultas de
Selección
3. Criterios de
Selección
4. Agrupamiento de
Registros
5. Consultas de
Acción
6. Tipos de
Datos
7. SubConsultas
8. Consultas de
Referencias Cruzadas
9. Consultas de
Unión Internas
10. Consultas de
Unión Externas
11. Estructuras de las
Tablas
12. Consultas con
Parámetros
13. Bases de Datos
Externas
14. Omitir los Permisos
de Ejecución
15. La Cláusula
PROCEDURE
1. Introducción
El lenguaje de
consulta estructurado (SQL) es un
lenguaje de
base de datos
normalizado, utilizado por el motor de base de
datos de
Microsoft Jet.
SQL se utiliza
para crear objetos QueryDef, como el argumento de origen del
método
OpenRecordSet y como la propiedad
RecordSource del control de
datos.
También se puede utilizar con el método
Execute para crear y manipular directamente las bases de datos
Jet y crear consultas SQL de paso a través para manipular
bases de datos
remotas cliente –
servidor.
Componentes del SQL
El lenguaje
SQL está compuesto por comandos,
cláusulas, operadores y funciones de
agregado. Estos elementos se combinan en las instrucciones para
crear, actualizar y manipular las bases de datos.
Comandos
Existen dos tipos de comandos SQL:
- los DLL que permiten crear y definir nuevas bases de
datos, campos e índices. - los DML que permiten generar consultas para ordenar,
filtrar y extraer datos de la base de
datos.
Comandos DLL | |
Comando | Descripción |
CREATE | Utilizado para crear nuevas tablas, campos e |
DROP | Empleado para eliminar tablas e |
ALTER | Utilizado para modificar las tablas agregando |
Comandos DML | |
Comando | Descripción |
SELECT | Utilizado para consultar registros |
INSERT | Utilizado para cargar lotes de datos en la base de |
UPDATE | Utilizado para modificar los |
DELETE | Utilizado para eliminar registros de una tabla de |
Cláusulas
Las cláusulas son condiciones de modificación
utilizadas para definir los datos que desea seleccionar o
manipular.
Cláusula | Descripción |
FROM | Utilizada para especificar la tabla de la cual se |
WHERE | Utilizada para especificar las condiciones que |
GROUP BY | Utilizada para separar los registros seleccionados |
HAVING | Utilizada para expresar la condición que |
ORDER BY | Utilizada para ordenar los registros seleccionados |
Operadores Lógicos
Operador | Uso |
AND | Es el "y" lógico. Evalua dos condiciones y |
OR | Es el "o" lógico. Evalúa dos |
NOT | Negación lógica. Devuelve el valor contrario |
Operadores de Comparación
Operador | Uso |
< | Menor que |
> | Mayor que |
<> | Distinto de |
<= | Menor ó Igual que |
>= | Mayor ó Igual que |
= | Igual que |
BETWEEN | Utilizado para especificar un intervalo de |
LIKE | Utilizado en la comparación de un |
In | Utilizado para especificar registros de una base |
Funciones de Agregado
Las funciones de
agregado se usan dentro de una cláusula SELECT en grupos de
registros para devolver un único valor que se aplica a un
grupo de
registros.
Función | Descripción |
AVG | Utilizada para calcular el promedio de los |
COUNT | Utilizada para devolver el número de |
SUM | Utilizada para devolver la suma de todos los |
MAX | Utilizada para devolver el valor más alto |
MIN | Utilizada para devolver el valor más bajo |
Las consultas de selección
se utilizan para indicar al motor de datos
que devuelva información de las bases de datos, esta
información es devuelta en forma de
conjunto de registros que se pueden almacenar en un objeto
recordset. Este conjunto de registros es modificable.
Consultas básicas
La sintaxis básica de una consulta de selección es
la siguiente:
SELECT Campos FROM Tabla;
En donde campos es la lista de campos que se deseen recuperar y
tabla es el origen de los mismos, por ejemplo:
SELECT Nombre, Telefono FROM Clientes;
Esta consulta devuelve un recordset con el campo nombre y
teléfono de la tabla clientes.
Ordenar los registros
Adicionalmente se puede especificar el orden en que se desean
recuperar los registros de las tablas mediante la claúsula
ORDER BY Lista de Campos. En donde Lista de campos representa los
campos a ordenar. Ejemplo:
SELECT CodigoPostal, Nombre, Telefono FROM Clientes ORDER BY
Nombre;
Esta consulta devuelve los campos CodigoPostal, Nombre, Telefono
de la tabla Clientes ordenados por el campo Nombre.
Se pueden ordenar los registros por mas de un campo, como por
ejemplo:
SELECT CodigoPostal, Nombre, Telefono FROM Clientes ORDER BY
CodigoPostal, Nombre;
Incluso se puede especificar el orden de los registros:
ascendente mediante la claúsula (ASC -se toma este valor
por defecto) ó descendente (DESC)
SELECT CodigoPostal, Nombre, Telefono FROM Clientes ORDER BY
CodigoPostal DESC , Nombre ASC;
Consultas con Predicado
El predicado se incluye entre la claúsula y el primer
nombre del campo a recuperar, los posibles predicados
son:
Predicado | Descripción |
ALL | Devuelve todos los campos de la tabla |
TOP | Devuelve un determinado número de registros |
DISTINCT | Omite los registros cuyos campos seleccionados |
DISTINCTROW | Omite los registros duplicados basandose en la |
ALL
Si no se incluye ninguno de los predicados se asume ALL. El Motor
de base de datos selecciona todos los registros que cumplen
las condiciones de la instrucción SQL. No se conveniente
abusar de este predicado ya que obligamos al motor de la base de
datos a analizar la estructura de
la tabla para averiguar los campos que contiene, es mucho
más rápido indicar el listado de campos
deseados.
SELECT ALL FROM Empleados;
SELECT * FROM Empleados;
TOP
Devuelve un cierto número de registros que entran entre al
principio o al final de un rango especificado por una
cláusula ORDER BY. Supongamos que queremos recuperar los
nombres de los 25 primeros estudiantes del curso 1994:
SELECT TOP 25 Nombre, Apellido FROM Estudiantes
ORDER BY Nota DESC;
Si no se incluye la cláusula ORDER BY, la consulta
devolverá un conjunto arbitrario de 25 registros de la
tabla Estudiantes .El predicado TOP no elige entre valores
iguales. En el ejemplo anterior, si la nota media número
25 y la 26 son iguales, la consulta devolverá 26
registros. Se puede utilizar la palabra reservada PERCENT para
devolver un cierto porcentaje de registros que caen al principio
o al final de un rango especificado por la cláusula ORDER
BY. Supongamos que en lugar de los 25 primeros estudiantes
deseamos el 10 por ciento del curso:
SELECT TOP 10 PERCENT Nombre, Apellido FROM Estudiantes
ORDER BY Nota DESC;
El valor que va a continuación de TOP debe ser un Integer
sin signo.TOP no afecta a la posible actualización de la
consulta.
DISTINCT
Omite los registros que contienen datos duplicados en los campos
seleccionados. Para que los valores de cada campo listado en la
instrucción SELECT se incluyan en la consulta deben ser
únicos.
Por ejemplo, varios empleados listados en la tabla Empleados
pueden tener el mismo apellido. Si dos registros contienen
López en el campo Apellido, la siguiente
instrucción SQL devuelve un único registro:
SELECT DISTINCT Apellido FROM Empleados;
Con otras palabras el predicado DISTINCT devuelve aquellos
registros cuyos campos indicados en la cláusula SELECT
posean un contenido diferente. El resultado de una consulta que
utiliza DISTINCT no es actualizable y no refleja los cambios
subsiguientes realizados por otros usuarios.
DISTINCTROW
Devuelve los registros diferentes de una tabla; a diferencia del
predicado anterior que sólo se fijaba en el contenido de
los campos seleccionados, éste lo hace en el contenido del
registro completo independientemente de los campo indicados en la
cláusula SELECT.
SELECT DISTINCTROW Apellido FROM Empleados;
Si la tabla empleados contiene dos registros: Antonio
López y Marta López el ejemplo del predicado
DISTINCT devuleve un único registro con el valor
López en el campo Apellido ya que busca no duplicados en
dicho campo. Este último ejemplo devuelve dos registros
con el valor López en el apellido ya que se buscan no
duplicados en el registro completo.
Alias
En determinadas circunstancias es necesario asignar un nombre a
alguna columna determinada de un conjunto devuelto, otras veces
por simple capricho o por otras circunstancias. Para resolver
todas ellas tenemos la palabra reservada AS que se encarga de
asignar el nombre que deseamos a la columna deseada. Tomado como
referencia el ejemplo anterior podemos hacer que la columna
devuelta por la consulta, en lugar de llamarse apellido (igual
que el campo devuelto) se llame Empleado. En este caso
procederíamos de la siguiente forma:
SELECT DISTINCTROW Apellido AS Empleado FROM Empleados;
Recuperar Información de una base de Datos Externa
Para concluir este capítulo se debe hacer referencia a la
recuperación de registros de bases de datos externa. Es
ocasiones es necesario la recuperación de
información que se encuentra contenida en una tabla que no
se encuentra en la base de datos que ejecutará la consulta
o que en ese momento no se encuentra abierta, esta
situación la podemos salvar con la palabra reservada IN de
la siguiente forma:
SELECT DISTINCTROW Apellido AS Empleado FROM Empleados
IN 'c:databasesgestion.mdb';
En donde c:databasesgestion.mdb es la base de datos que
contiene la tabla Empleados.
3. Criterios de Selección
En el capítulo anterior se vio la forma de
recuperar los registros de las tablas, las formas empleadas
devolvían todos los registros de la mencionada tabla. A lo
largo de este capítulo se estudiarán las
posibilidades de filtrar los registros con el fin de recuperar
solamente aquellos que cumplan una condiciones
preestablecidas.
Antes de comenzar el desarrollo de
este capítulo hay que recalcar tres detalles de vital
importancia. El primero de ellos es que cada vez que se desee
establecer una condición referida a un campo de texto la
condición de búsqueda debe ir encerrada entre
comillas simples; la segunda es que no se posible establecer
condiciones de búsqueda en los campos memo y; la tercera y
última hace referencia a las fechas. Las fechas se deben
escribir siempre en formato mm-dd-aa en donde mm representa el
mes, dd el día y aa el año, hay que prestar
atención a los separadores -no sirve la
separación habitual de la barra (/), hay que utilizar el
guión (-) y además la fecha debe ir encerrada entre
almohadillas (#). Por ejemplo si deseamos referirnos al
día 3 de Septiembre de 1995 deberemos hacerlo de la
siguente forma; #09-03-95# ó #9-3-95#.
3.1 Operadores Lógicos
Los operadores lógicos soportados por SQL son: AND, OR,
XOR, Eqv, Imp, Is y Not. A excepción de los dos
últimos todos poseen la siguiente sintaxis:
<expresión1>
operador <expresión2>
En donde expresión1 y expresión2 son las
condiciones a evaluar, el resultado de la operación
varía en función
del operador lógico. La tabla adjunta muestra los
diferentes posibles resultados:
<expresión1> | Operador | <expresión2> | Resultado |
Verdad | AND | Falso | Falso |
Verdad | AND | Verdad | Verdad |
Falso | AND | Verdad | Falso |
Falso | AND | Falso | Falso |
Verdad | OR | Falso | Verdad |
Verdad | OR | Verdad | Verdad |
Falso | OR | Verdad | Verdad |
Falso | OR | Falso | Falso |
Verdad | XOR | Verdad | Falso |
Verdad | XOR | Falso | Verdad |
Falso | XOR | Verdad | Verdad |
Falso | XOR | Falso | Falso |
Verdad | Eqv | Verdad | Verdad |
Verdad | Eqv | Falso | Falso |
Falso | Eqv | Verdad | Falso |
Falso | Eqv | Falso | Verdad |
Verdad | Imp | Verdad | Verdad |
Verdad | Imp | Falso | Falso |
Verdad | Imp | Null | Null |
Falso | Imp | Verdad | Verdad |
Falso | Imp | Falso | Verdad |
Falso | Imp | Null | Verdad |
Null | Imp | Verdad | Verdad |
Null | Imp | Falso | Null |
Null | Imp | Null | Null |
Si a cualquiera de las anteriores condiciones le
anteponemos el operador NOT el resultado de la operación
será el contrario al devuelto sin el operador NOT.
El último operador denominado Is se emplea para comparar
dos variables de
tipo objeto <Objeto1> Is <Objeto2>. este operador
devuelve verdad si los dos objetos son iguales
SELECT * FROM Empleados WHERE Edad > 25 AND Edad < 50;
SELECT * FROM Empleados WHERE (Edad > 25 AND Edad < 50) OR
Sueldo = 100;
SELECT * FROM Empleados WHERE NOT Estado =
'Soltero';
SELECT * FROM Empleados WHERE (Sueldo > 100 AND Sueldo <
500) OR
Provincia = 'Madrid' AND Estado =
'Casado');
Intervalos de Valores
Para indicar que deseamos recuperar los registros según el
intervalo de valores de un campo emplearemos el operador Between
cuya sintaxis es: campo [Not] Between valor1 And valor2 (la
condición Not es opcional)
En este caso la consulta devolvería los registros que
contengan en "campo" un valor incluido en el intervalo valor1,
valor2 (ambos inclusive). Si anteponemos la condición Not
devolverá aquellos valores no incluidos en el
intervalo.
SELECT * FROM Pedidos WHERE CodPostal Between 28000 And
28999;
(Devuelve los pedidos realizados en la provincia de Madrid)
SELECT IIf(CodPostal Between 28000 And 28999, 'Provincial',
'Nacional')
FROM Editores;
(Devuelve el valor 'Provincial' si el código
postal se encuentra en el intervalo,
'Nacional' en caso contrario)
El Operador Like
Se utiliza para comparar una expresión de cadena con un
modelo en una
expresión SQL. Su sintaxis es: expresión Like
modelo
En donde expresión es una cadena modelo o campo contra el
que se compara expresión. Se puede utilizar el operador
Like para encontrar valores en los campos que coincidan con el
modelo especificado. Por modelo puede especificar un valor
completo (Ana María), o se pueden utilizar caracteres
comodín como los reconocidos por el sistema operativo
para encontrar un rango de valores (Like An*).
El operador Like se puede utilizar en una expresión para
comparar un valor de un campo con una expresión de cadena.
Por ejemplo, si introduce Like C* en una consulta SQL, la
consulta devuelve todos los valores de campo que comiencen por la
letra C. En una consulta con parámetros, puede hacer que
el usuario escriba el modelo que se va a utilizar.
El ejemplo siguiente devuelve los datos que comienzan con la
letra P seguido de cualquier letra entre A y F y de tres
dígitos:
Like 'P[A-F]###'
Este ejemplo devuelve los campos cuyo contenido empiece con una
letra de la A a la D seguidas de cualquier cadena.
Like '[A-D]*'
En la tabla siguiente se muestra
cómo utilizar el operador Like para comprobar
expresiones con diferentes modelos.
Tipo de coincidencia | Modelo Planteado | Coincide | No coincide |
Varios caracteres | 'a*a' | 'aa', 'aBa', 'aBBBa' | 'aBC' |
Carácter especial | 'a[*]a' | 'a*a' | 'aaa' |
Varios caracteres | 'ab*' | 'abcdefg', 'abc' | 'cab', 'aab' |
Un solo carácter | 'a?a' | 'aaa', 'a3a', 'aBa' | 'aBBBa' |
Un solo dígito | 'a#a' | 'a0a', 'a1a', 'a2a' | 'aaa', 'a10a' |
Rango de caracteres | '[a-z]' | 'f', 'p', 'j' | '2', '&' |
Fuera de un rango | '[!a-z]' | '9', '&', '%' | 'b', 'a' |
Distinto de un dígito | '[!0-9]' | 'A', 'a', '&', '~' | '0', '1', '9' |
Combinada | 'a[!b-m]#' | 'An9', 'az0', 'a99' | 'abc', 'aj0' |
El Operador In
Este operador devuelve aquellos registros cuyo campo indicado
coincide con alguno de los en una lista. Su sintaxis es:
expresión [Not] In(valor1, valor2, . . .)
SELECT * FROM Pedidos WHERE Provincia In ('Madrid', 'Barcelona',
'Sevilla');
La cláusula WHERE
La cláusula WHERE puede usarse para determinar qué
registros de las tablas enumeradas en la cláusula FROM
aparecerán en los resultados de la instrucción
SELECT. Depués de escribir esta cláusula se deben
especificar las condiciones expuestas en los partados 3.1 y 3.2.
Si no se emplea esta cláusula, la consulta
devolverá todas las filas de la tabla. WHERE es opcional,
pero cuando aparece debe ir a continuación de FROM.
SELECT Apellidos, Salario FROM
Empleados WHERE Salario >
21000;
SELECT Id_Producto, Existencias FROM Productos
WHERE Existencias <= Nuevo_Pedido;
SELECT * FROM Pedidos WHERE Fecha_Envio = #5/10/94#;
SELECT Apellidos, Nombre FROM Empleados WHERE Apellidos =
'King';
SELECT Apellidos, Nombre FROM Empleados WHERE Apellidos Like
'S*';
SELECT Apellidos, Salario FROM Empleados WHERE Salario Between
200 And 300;
SELECT Apellidos, Salario FROM Empl WHERE Apellidos Between 'Lon'
And 'Tol';
SELECT Id_Pedido, Fecha_Pedido FROM Pedidos WHERE
Fecha_Pedido
Between #1-1-94# And #30-6-94#;
SELECT Apellidos, Nombre, Ciudad FROM Empleados WHERE Ciudad
In ('Sevilla', 'Los Angeles',
'Barcelona');
4. Agrupamiento de Registros
GROUP BY
Combina los registros con valores idénticos, en la lista
de campos especificados, en un único registro. Para cada
registro se crea un valor sumario si se incluye una función
SQL agregada, como por ejemplo Sum o Count, en la
instrucción SELECT. Su sintaxis es:
SELECT campos FROM tabla WHERE criterio GROUP BY campos del
grupo
GROUP BY es opcional. Los valores de resumen se omiten si
no existe una función SQL agregada en la
instrucción SELECT. Los valores Null en los campos GROUP
BY se agrupan y no se omiten. No obstante, los valores Null no se
evalúan en ninguna de las funciones SQL agregadas.
Se utiliza la cláusula WHERE para excluir aquellas filas
que no desea agrupar, y la cláusula HAVING para filtrar
los registros una vez agrupados.
A menos que contenga un dato Memo u Objeto OLE , un campo de la
lista de campos GROUP BY puede referirse a cualquier campo de las
tablas que aparecen en la cláusula FROM, incluso si el
campo no esta incluido en la instrucción SELECT, siempre y
cuando la instrucción SELECT incluya al menos una
función SQL agregada.
Todos los campos de la lista de campos de SELECT deben o bien
incluirse en la cláusula GROUP BY o como argumentos de una
función SQL agregada.
SELECT Id_Familia, Sum(Stock) FROM Productos
GROUP BY Id_Familia;
Una vez que GROUP BY ha combinado los registros, HAVING muestra
cualquier registro agrupado por la cláusula GROUP BY que
satisfaga las condiciones de la cláusula HAVING.
HAVING es similar a WHERE, determina qué registros se
seleccionan. Una vez que los registros se han agrupado utilizando
GROUP BY, HAVING determina cuales de ellos se van a mostrar.
SELECT Id_Familia Sum(Stock) FROM Productos GROUP BY
Id_Familia
HAVING Sum(Stock) > 100 AND NombreProducto Like
BOS*;
AVG
Calcula la media aritmética de un conjunto de valores
contenidos en un campo especificado de una consulta. Su sintaxis
es la siguiente
Avg(expr)
En donde expr representa el campo que contiene los datos
numéricos para los que se desea calcular la media o una
expresión que realiza un cálculo
utilizando los datos de dicho campo. La media calculada por Avg
es la media aritmética (la suma de los valores dividido
por el número de valores). La función Avg no
incluye ningún campo Null en el cálculo.
SELECT Avg(Gastos) AS
Promedio FROM Pedidos WHERE Gastos >
100;
Count
Calcula el número de registros devueltos por una consulta.
Su sintaxis es la siguiente
Count(expr)
En donde expr contiene el nombre del campo que desea contar. Los
operandos de expr pueden incluir el nombre de un campo de una
tabla, una constante o una función (la cual puede ser
intrínseca o definida por el usuario pero no otras de las
funciones agregadas de SQL). Puede contar cualquier tipo de datos
incluso texto.
Aunque expr puede realizar un cálculo sobre un campo,
Count simplemente cuenta el número de registros sin tener
en cuenta
qué valores se almacenan en los registros. La
función Count no cuenta los registros que tienen campos
null a menos que expr sea el carácter
comodín asterisco (*). Si utiliza un asterisco, Count
calcula el número total de registros, incluyendo aquellos
que contienen campos null. Count(*) es considerablemente
más rápida que Count(Campo). No se debe poner el
asterisco entre dobles comillas ('*').
SELECT Count(*) AS Total FROM Pedidos;
Si expr identifica a múltiples campos, la función
Count cuenta un registro sólo si al menos uno de los
campos no es Null. Si todos los campos especificados son Null, no
se cuenta el registro. Hay que separar los nombres de los campos
con ampersand (&).
SELECT Count(FechaEnvío & Transporte) AS
Total FROM Pedidos;
Max, Min
Devuelven el mínimo o el máximo de un conjunto de
valores contenidos en un campo especifico de una consulta. Su
sintaxis es:
Min(expr)
Max(expr)
En donde expr es el campo sobre el que se desea realizar el
cálculo. Expr pueden incluir el nombre de un campo de una
tabla, una constante o una función (la cual puede ser
intrínseca o definida por el usuario pero no otras de las
funciones agregadas de SQL).
SELECT Min(Gastos) AS ElMin FROM Pedidos WHERE Pais = 'España';
SELECT Max(Gastos) AS ElMax FROM Pedidos WHERE Pais =
'España';
StDev, StDevP
Devuelve estimaciones de la desviación estándar
para la población (el total de los registros de la
tabla) o una muestra de la población representada (muestra aleatoria)
. Su sintaxis es:
StDev(expr)
StDevP(expr)
En donde expr representa el nombre del campo que contiene los
datos que desean evaluarse o una expresión que realiza un
cálculo utilizando los datos de dichos campos. Los
operandos de expr pueden incluir el nombre de un campo de una
tabla, una constante o una función (la cual puede ser
intrínseca o definida por el usuario pero no otras de las
funciones agregadas de SQL)
StDevP evalúa una población, y StDev evalúa
una muestra de la población. Si la consulta contiene menos
de dos registros (o ningún registro para StDevP), estas
funciones devuelven un valor Null (el cual indica que la
desviación estándar no puede calcularse).
SELECT StDev(Gastos) AS Desviacion FROM Pedidos WHERE Pais =
'España';
SELECT StDevP(Gastos) AS Desviacion FROM Pedidos WHERE Pais=
'España';
Sum
Devuelve la suma del conjunto de valores contenido en un campo
especifico de una consulta. Su sintaxis es:
Sum(expr)
En donde expr respresenta el nombre del campo que contiene los
datos que desean sumarse o una expresión que realiza un
cálculo utilizando los datos de dichos campos. Los
operandos de expr pueden incluir el nombre de un campo de una
tabla, una constante o una función (la cual puede ser
intrínseca o definida por el usuario pero no otras de las
funciones agregadas de SQL).
SELECT Sum(PrecioUnidad * Cantidad) AS Total FROM
DetallePedido;
Var, VarP
Devuelve una estimación de la varianza de una
población (sobre el total de los registros) o una muestra
de la población (muestra aleatoria de registros) sobre los
valores de un campo. Su sintaxis es:
Var(expr)
VarP(expr)
VarP evalúa una población, y Var evalúa una
muestra de la población. Expr el nombre del campo que
contiene los datos que desean evaluarse o una expresión
que realiza un cálculo utilizando los datos de dichos
campos. Los operandos de expr pueden incluir el nombre de un
campo de una tabla, una constante o una función (la cual
puede ser intrínseca o definida por el usuario pero no
otras de las funciones agregadas de SQL)
Si la consulta contiene menos de dos registros, Var y VarP
devuelven Null (esto indica que la varianza no puede calcularse).
Puede utilizar Var y VarP en una expresión de consulta o
en una Instrucción SQL.
SELECT Var(Gastos) AS Varianza FROM Pedidos WHERE Pais =
'España';
SELECT VarP(Gastos) AS Varianza FROM Pedidos WHERE Pais = 'España';
5. Consultas de Acción
Las consultas de acción son aquellas que no
devuelven ningún registro, son las encargadas de acciones como
añadir y borrar y modificar registros.
Delete
Crea una consulta de eliminación que elimina los registros
de una o más de las tablas listadas en la cláusula
FROM que satisfagan la cláusula WHERE. Esta consulta
elimina los registros completos, no es posible eliminar el
contenido de algún campo en concreto. Su
sintaxis es:
DELETE Tabla.* FROM Tabla WHERE criterio
DELETE es especialmente útil cuando se desea eliminar
varios registros. En una instrucción DELETE con
múltiples tablas, debe incluir el nombre de tabla
(Tabla.*). Si especifica más de una tabla desde la que
eliminar registros, todas deben ser tablas de muchos a uno. Si
desea eliminar todos los registros de una tabla, eliminar la
propia tabla es más eficiente que ejecutar una consulta de
borrado.
Se puede utilizar DELETE para eliminar registros de una
única tabla o desde varios lados de una relación
uno a muchos. Las operaciones de
eliminación en cascada en una consulta únicamente
eliminan desde varios lados de una relación. Por ejemplo,
en la relación entre las tablas Clientes y Pedidos, la
tabla Pedidos es la parte de muchos por lo que las operaciones en
cascada solo afectaran a la tabla Pedidos. Una consulta de
borrado elimina los registros completos, no únicamente los
datos en campos específicos. Si desea eliminar valores en
un campo especificado, crear una consulta de actualización
que cambie los valores a Null.
Una vez que se han eliminado los registros utilizando una
consulta de borrado, no puede deshacer la operación. Si
desea saber qué registros se eliminarán, primero
examine los resultados de una consulta de selección que
utilice el mismo criterio y después ejecute la consulta de
borrado. Mantenga copias de seguridad de sus
datos en todo momento. Si elimina los registros equivocados
podrá recuperarlos desde las copias de seguridad.
DELETE * FROM Empleados WHERE Cargo = 'Vendedor';
Insert Into
Agrega un registro en una tabla. Se la conoce como una consulta
de datos añadidos. Esta consulta puede ser de dos tipo:
Insertar un único registro ó Insertar en una tabla
los registros contenidos en otra tabla.
Para insertar un único Registro:
En este caso la sintaxis es la siguiente:
INSERT INTO Tabla (campo1, campo2, .., campoN)
VALUES (valor1, valor2, …, valorN)
Esta consulta graba en el campo1 el valor1, en el campo2 y valor2
y así sucesivamente. Hay que prestar especial atención a acotar entre comillas simples
(') los valores literales (cadenas de caracteres) y las fechas
indicarlas en formato mm-dd-aa y entre caracteres de almohadillas
(#).
Para insertar Registros de otra Tabla:
En este caso la sintaxis es:
INSERT INTO Tabla [IN base_externa] (campo1, campo2, …,
campoN)
SELECT TablaOrigen.campo1, TablaOrigen.campo2, …,
TablaOrigen.campoN
FROM TablaOrigen
En este caso se seleccionarán los campos 1,2, …, n dela
tabla origen y se grabarán en los campos 1,2,.., n de la
Tabla. La condición SELECT puede incluir la
cláusula WHERE para filtrar los registros a copiar. Si
Tabla y TablaOrigen poseen la misma estrucutra podemos
simplificar la sintaxis a:
INSERT INTO Tabla SELECT TablaOrigen.* FROM TablaOrigen
De esta forma los campos de TablaOrigen se grabarán en
Tabla, para realizar esta operación es necesario que todos
los campos de TablaOrigen estén contenidos con igual
nombre en Tabla. Con otras palabras que Tabla posea todos los
campos de TablaOrigen (igual nombre e igual tipo).
En este tipo de consulta hay que tener especial atención
con los campos contadores o autonuméricos puesto que al
insertar un valor en un campo de este tipo se escribe el valor
que contenga su campo homólogo en la tabla origen, no
incrementandose como le corresponde.
Se puede utilizar la instrucción INSERT INTO para agregar
un registro único a una tabla, utilizando la sintaxis de
la consulta de adición de registro único tal y como
se mostró anteriormente. En este caso, su código
específica el nombre y el valor de cada campo del
registro. Debe especificar cada uno de los campos del registro al
que se le va a asignar un valor así como el valor para
dicho campo. Cuando no se especifica dicho campo, se inserta el
valor predeterminado o Null. Los registros se agregan al final de
la tabla.
También se puede utilizar INSERT INTO para agregar un
conjunto de registros pertenecientes a otra tabla o consulta
utilizando la cláusula SELECT … FROM como se
mostró anteriormente en la sintaxis de la consulta de
adición de múltiples registros. En este caso la
cláusula SELECT especifica los campos que se van a agregar
en la tabla destino especificada.
La tabla destino u origen puede especificar una tabla o una
consulta.
Si la tabla destino contiene una clave principal, hay que
segurarse que es única, y con valores no-Null ; si no es
así, no se agregarán los registros. Si se agregan
registros a una tabla con un campo Contador , no se debe incluir
el campo Contador en la consulta. Se puede emplear la
cláusula IN para agregar registros a una tabla en otra
base de datos.
Se pueden averiguar los registros que se agregarán en la
consulta ejecutando primero una consulta de selección que
utilice el mismo criterio de selección y ver el resultado.
Una consulta de adición copia los registros de una o
más tablas en otra. Las tablas que contienen los registros
que se van a agregar no se verán afectadas por la consulta
de adición. En lugar de agregar registros existentes en
otra tabla, se puede especificar los valores de cada campo en un
nuevo registro utilizando la cláusula VALUES. Si se omite
la lista de campos, la cláusula VALUES debe incluir un
valor para cada campo de la tabla, de otra forma fallará
INSERT.
INSERT INTO Clientes SELECT Clientes_Viejos.* FROM
Clientes_Nuevos;
INSERT INTO Empleados (Nombre, Apellido, Cargo)
VALUES ('Luis', 'Sánchez', 'Becario');
INSERT INTO Empleados SELECT Vendedores.* FROM Vendedores
WHERE Fecha_Contratacion < Now() – 30;
Update
Crea una consulta de actualización que cambia los
valores de los campos de una tabla especificada basándose
en un criterio específico. Su sintaxis es:
UPDATE Tabla SET Campo1=Valor1, Campo2=Valor2, …
CampoN=ValorN
WHERE Criterio;
UPDATE es especialmente útil cuando se desea cambiar un
gran número de registros o cuando éstos se
encuentran en múltiples tablas. Puede cambiar varios
campos a la vez. El ejemplo siguiente incrementa los valores
Cantidad pedidos en un 10 por ciento y los valores Transporte en
un 3 por ciento para aquellos que se hayan enviado al Reino
Unido.:
UPDATE Pedidos SET Pedido = Pedidos * 1.1, Transporte =
Transporte * 1.03
WHERE PaisEnvío = 'ES';
UPDATE no genera ningún resultado. Para saber qué
registros se van a cambiar, hay que examinar primero el resultado
de una consulta de selección que utilice el mismo criterio
y después ejecutar la consulta de
actualización.
UPDATE Empleados SET Grado = 5 WHERE Grado = 2;
UPDATE Productos SET Precio =
Precio *
1.1 WHERE Proveedor = 8 AND Familia = 3;
Si en una consulta de actualización suprimimos la
cláusula WHERE todos los registros de la tabla
señalada serán actualizados.
UPDATE Empleados SET Salario = Salario * 1.1
6. Tipos de
Datos
Los tipos de datos
SQL se clasifican en 13 tipos de datos
primarios y de varios sinónimos válidos reconocidos
por dichos tipos de datos.
Tipos de datos primarios:
Tipo de Datos | Longitud | Descripción |
BINARY | 1 byte | Para consultas sobre tabla adjunta de productos de |
BIT | 1 byte | Valores Si/No ó True/False |
BYTE | 1 byte | Un valor entero entre 0 y 255. |
COUNTER | 4 bytes | Un número incrementado |
CURRENCY | 8 bytes | Un entero escalable entre 922.337.203.685.477,5808 |
DATETIME | 8 bytes | Un valor de fecha u hora entre los años 100 |
SINGLE | 4 bytes | Un valor en punto flotante de precisión |
DOUBLE | 8 bytes | Un valor en punto flotante de doble |
SHORT | 2 bytes | Un entero corto entre -32,768 y 32,767. |
LONG | 4 bytes | Un entero largo entre -2,147,483,648 y |
LONGTEXT | 1 byte por carácter | De cero a un máximo de 1.2 |
LONGBINARY | Según se necesite | De cero 1 gigabyte. Utilizado para objetos |
TEXT | 1 byte por caracter | De cero a 255 caracteres. |
La siguiente tabla recoge los sinonimos de los tipos de
datos definidos:
Tipo de Dato | Sinónimos |
BINARY | VARBINARY |
BIT | BOOLEAN |
BYTE | INTEGER1 |
COUNTER | AUTOINCREMENT |
CURRENCY | MONEY |
DATETIME | DATE |
SINGLE | FLOAT4 |
DOUBLE | FLOAT |
SHORT | INTEGER2 |
LONG | INT |
LONGBINARY | GENERAL |
LONGTEXT | LONGCHAR |
TEXT | ALPHANUMERIC |
VARIANT (No Admitido) | VALUE |
Una subconsulta es una instrucción SELECT anidada
dentro de una instrucción SELECT, SELECT…INTO,
INSERT…INTO, DELETE, o UPDATE o dentro de otra subconsulta.
Puede utilizar tres formas de sintaxis para crear una
subconsulta:
comparación [ANY | ALL | SOME] (instrucción
sql)
expresión [NOT] IN (instrucción sql)
[NOT] EXISTS (instrucción sql)
En donde:
comparación
Es una expresión y un operador de comparación que
compara la expresión con el resultado de la
subconsulta.
expresión
Es una expresión por la que se busca el conjunto
resultante de la subconsulta.
instrucción sql
Es una instrucción SELECT, que sigue el mismo formato y
reglas que cualquier otra instrucción SELECT. Debe ir
entre paréntesis.
Se puede utilizar una subconsulta en lugar de una
expresión en la lista de campos de una instrucción
SELECT o en una cláusula WHERE o HAVING. En una
subconsulta, se utiliza una instrucción SELECT para
proporcionar un conjunto de uno o más valores
especificados para evaluar en la expresión de la
cláusula WHERE o HAVING.
Se puede utilizar el predicado ANY o SOME, los cuales son
sinónimos, para recuperar registros de la consulta
principal, que satisfagan la comparación con cualquier
otro registro recuperado en la subconsulta. El ejemplo siguiente
devuelve todos los productos cuyo precio unitario es mayor que el
de cualquier producto
vendido con un descuento igual o mayor al 25 por ciento.:
SELECT * FROM Productos WHERE PrecioUnidad > ANY
(SELECT PrecioUnidad FROM DetallePedido WHERE Descuento >= 0
.25);
El predicado ALL se utiliza para recuperar únicamente
aquellos registros de la consulta principal que satisfacen la
comparación con todos los registros recuperados en la
subconsulta. Si se cambia ANY por ALL en el ejemplo anterior, la
consulta devolverá únicamente aquellos productos
cuyo precio unitario sea mayor que el de todos los productos
vendidos con un descuento igual o mayor al 25 por ciento. Esto es
mucho más restrictivo.
El predicado IN se emplea para recuperar únicamente
aquellos registros de la consulta principal para los que algunos
registros de la subconsulta contienen un valor igual. El ejemplo
siguiente devuelve todos los productos vendidos con un descuento
igual o mayor al 25 por ciento.:
SELECT * FROM Productos WHERE IDProducto IN
(SELECT IDProducto FROM DetallePedido WHERE Descuento >=
0.25);
Inversamente se puede utilizar NOT IN para recuperar
únicamente aquellos registros de la consulta principal
para los que no hay ningún registro de la subconsulta que
contenga un valor igual.
El predicado EXISTS (con la palabra reservada NOT opcional) se
utiliza en comparaciones de verdad/falso para determinar si la
subconsulta devuelve algún registro.
Se puede utilizar también alias del nombre de la tabla en
una subconsulta para referirse a tablas listadas en la
cláusula FROM fuera de la subconsulta. El ejemplo
siguiente devuelve los nombres de los empleados cuyo salario es
igual o mayor que el salario medio de todos los empleados con el
mismo título. A la tabla Empleados se le ha dado el alias
T1::
SELECT Apellido, Nombre, Titulo, Salario FROM Empleados AS T1
WHERE Salario >= (SELECT Avg(Salario) FROM Empleados
WHERE T1.Titulo = Empleados.Titulo) ORDER BY Titulo;
En el ejemplo anterior , la palabra reservada AS es opcional.
SELECT Apellidos, Nombre, Cargo, Salario FROM Empleados
WHERE Cargo LIKE "Agente Ven*" AND Salario > ALL (SELECT
Salario FROM
Empleados WHERE (Cargo LIKE "*Jefe*") OR (Cargo LIKE
"*Director*"));
Obtiene una lista con el nombre, cargo y salario de todos los
agentes de ventas cuyo
salario es mayor que el de todos los jefes y directores.
SELECT DISTINCTROW NombreProducto, Precio_Unidad FROM
Productos
WHERE (Precio_Unidad = (SELECT Precio_Unidad FROM Productos
WHERE
Nombre_Producto = "Almíbar anisado");
Obtiene una lista con el nombre y el precio unitario de todos los
productos con el mismo precio que el almíbar anisado.
SELECT DISTINCTROW Nombre_Contacto, Nombre_Compañia,
Cargo_Contacto,
Telefono FROM Clientes WHERE (ID_Cliente IN (SELECT
DISTINCTROW
ID_Cliente FROM Pedidos WHERE Fecha_Pedido >= #04/1/93#
<#07/1/93#);
Obtiene una lista de las compañías y los contactos
de todos los clientes que han realizado un pedido en el segundo
trimestre de 1993.
SELECT Nombre, Apellidos FROM Empleados AS E WHERE EXISTS
(SELECT * FROM Pedidos AS O WHERE O.ID_Empleado =
E.ID_Empleado);
Selecciona el nombre de todos los empleados que han reservado al
menos un pedido.
SELECT DISTINCTROW Pedidos.Id_Producto, Pedidos.Cantidad,
(SELECT DISTINCTROW Productos.Nombre FROM Productos WHERE
Productos.Id_Producto = Pedidos.Id_Producto) AS ElProducto
FROM
Pedidos WHERE Pedidos.Cantidad > 150 ORDER BY
Pedidos.Id_Producto;
Recupera el Código del Producto y la
Cantidad pedida de la tabla pedidos, extrayendo el nombre del
producto de la tabla de productos.
Página siguiente |