Comandos DDL y DML SQL
Comandos DDL y DML SQL
1.- INTRODUCCION
1.2 Comandos
Comandos DLL
CREATE: UtiIizado para crear nuevas tabIas, campos e índices.
Comandos DML
SELECT: UtiIizado para consuItar registros de Ia base de datos que satisfagan un
criterio determinado.
INSERT: UtiIizado para cargar Iotes de datos en Ia base de datos en una única
operación.
UPDATE: UtiIizado para modificar Ios vaIores de Ios campos y registros especificados.
DELETE: UtiIizado para eIiminar registros de una tabIa de una base de datos.
1.3 Cláusulas
Las cIáusuIas son condiciones de modificación utiIizadas para definir Ios datos que
desea seIeccionar o manipuIar.
Cláusulas
FROM: UtiIizada para especificar Ia tabIa de Ia cuaI se van a seIeccionar Ios registros.
WHERE: UtiIizada para especificar Ias condiciones que deben reunir Ios registros que
se van a seIeccionar.
GROUP BY: UtiIizada para separar Ios registros seIeccionados en grupos específicos.
HAVING: UtiIizada para expresar Ia condición que debe satisfacer cada grupo.
ORDER BY: UtiIizada para ordenar Ios registros seIeccionados de acuerdo con un
orden específico.
AND: Es eI "y" Iógico. EvaIúa dos condiciones y devueIve un vaIor de verdad sóIo si
ambas son ciertas.
OR: Es eI "o" Iógico. EvaIúa dos condiciones y devueIve un vaIor de verdad si aIguna
de Ias dos es cierta.
<> Distinto de
= IguaI que
SUM: UtiIizada para devoIver Ia suma de todos Ios vaIores de un campo determinado.
Las consuItas de seIección se utiIizan para indicar aI motor de datos que devueIva
información de Ias bases de datos, esta información es devueIta en forma de conjunto
de registros que se pueden aImacenar en un objeto recordset. Este conjunto de
registros es modificabIe.
Se pueden ordenar Ios registros por mas de un campo, como por ejempIo:
EI predicado se incIuye entre Ia cIáusuIa y eI primer nombre deI campo a recuperar, Ios
posibIes predicados son:
ALL
TOP
EI vaIor que va a continuación de TOP debe ser un Integer sin signo. TOP no afecta a
Ia posibIe actuaIización de Ia consuIta.
DISTINCT
Omite Ios registros que contienen datos dupIicados en Ios campos seIeccionados.
Para que Ios vaIores de cada campo Iistado en Ia instrucción SELECT se incIuyan en
Ia consuIta deben ser únicos. Por ejempIo, varios empIeados Iistados en Ia tabIa
EmpIeados pueden tener eI mismo apeIIido. Si dos registros contienen López en eI
campo ApeIIido, Ia siguiente instrucción SQL devueIve un único registro:
Con otras paIabras eI predicado DISTINCT devueIve aqueIIos registros cuyos campos
indicados en Ia cIáusuIa SELECT posean un contenido diferente. EI resuItado de una
consuIta que utiIiza DISTINCT no es actuaIizabIe y no refIeja Ios cambios
subsiguientes reaIizados por otros usuarios.
DISTINCTROW
DevueIve Ios registros diferentes de una tabIa; a diferencia deI predicado anterior que
sóIo se fijaba en eI contenido de Ios campos seIeccionados, éste Io hace en eI
contenido deI registro compIeto independientemente de Ios campos indicados en Ia
cIáusuIa SELECT.
Si Ia tabIa empIeados contiene dos registros: Antonio López y Marta López eI ejempIo
deI predicado DISTINCT devueIve un único registro con eI vaIor López en eI campo
ApeIIido ya que busca no dupIicados en dicho campo. Este úItimo ejempIo devueIve
dos registros con eI vaIor López en eI apeIIido ya que se buscan no dupIicados en eI
registro compIeto.
2.4 Alias
En eI capítuIo anterior se vio Ia forma de recuperar Ios registros de Ias tabIas, Ias formas
empIeadas devoIvían todos Ios registros de Ia mencionada tabIa. A Io Iargo de este
capítuIo se estudiarán Ias posibiIidades de fiItrar Ios registros con eI fin de recuperar
soIamente aqueIIos que cumpIan unas condiciones preestabIecidas.
Antes de comenzar eI desarroIIo de este capítuIo hay que recaIcar tres detaIIes de vitaI
importancia.
El primero de eIIos es que cada vez que se desee estabIecer una condición referida a un
campo de texto Ia condición de búsqueda debe ir encerrada entre comiIIas simpIes(;).
La segunda es que no es posibIe estabIecer condiciones de búsqueda en Ios campos
memo.
La tercera hace referencia a Ias fechas. Las fechas se deben escribir siempre en formato
mm-dd-aa en donde mm representa eI mes, dd eI día y aa eI año, hay que prestar atención a
Ios separadores no sirve Ia separación habituaI de Ia barra (/), hay que utiIizar eI guión (-) y
además Ia fecha debe ir encerrada entre aImohadiIIas (#). Por ejempIo si deseamos
referirnos aI día 3 de Septiembre de 1995 deberemos hacerIo de Ia siguiente forma;
#09-03-95# ó #9-3-95#.
Los operadores Iógicos soportados por SQL son: AND, OR, XOR, Eqv, Imp, Is y Not. A
excepción de Ios dos úItimos todos poseen Ia siguiente sintaxis:
EI úItimo operador denominado Is se empIea para comparar dos variabIes de tipo objeto
<Objeto1> Is <Objeto2>. Este operador devueIve verdad si Ios dos objetos son iguaIes.
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');
3.2 Intervalos de Valores
Para indicar que deseamos recuperar Ios registros según eI intervaIo de vaIores de un
campo empIearemos eI operador Between cuya sintaxis es:
campo [Not] Between valor1 And valor2 (la condición Not es opcional)
En este caso Ia consuIta devoIvería Ios registros que contengan en "campo" un vaIor incIuido
en eI intervaIo vaIor1, vaIor2 (ambos incIusive). Si anteponemos Ia condición Not devoIverá
aqueIIos vaIores no incIuidos en eI intervaIo.
Se utiIiza para comparar una expresión de cadena con un modeIo en una expresión SQL. Su
sintaxis es:
En donde expresión es una cadena modeIo o campo contra eI que se compara expresión.
Se puede utiIizar eI operador Like para encontrar vaIores en Ios campos que coincidan con
eI modeIo especificado. Por modeIo puede especificar un vaIor compIeto (Ana María), o se
pueden utiIizar caracteres comodín como Ios reconocidos por eI sistema operativo para
encontrar un rango de vaIores (Like An*).
EI operador Like se puede utiIizar en una expresión para comparar un vaIor de un campo
con una expresión de cadena. Por ejempIo, si introduce Like C* en una consuIta SQL, Ia
consuIta devueIve todos Ios vaIores de campo que comiencen por Ia Ietra C. En una
consuIta con parámetros, puede hacer que eI usuario escriba eI modeIo que se va a utiIizar.
EI ejempIo siguiente devueIve Ios datos que comienzan con Ia Ietra P seguido de cuaIquier
Ietra entre A y F y de tres dígitos:
Like 'P[A-F]###'
Este ejempIo devueIve Ios campos cuyo contenido empiece con una Ietra de Ia A a Ia D
seguidas de cuaIquier cadena.
Like '[A-D]*'
En Ia tabIa siguiente se muestra cómo utiIizar eI operador Like para comprobar expresiones
con diferentes modeIos:
3.4 El Operador In
Este operador devueIve aqueIIos registros cuyo campo indicado coincide con aIguno de Ios
en una Iista. Su sintaxis es:
La cIáusuIa WHERE puede usarse para determinar qué registros de Ias tabIas enumeradas
en Ia cIáusuIa FROM aparecerán en Ios resuItados de Ia instrucción SELECT. Después de
escribir esta cIáusuIa se deben especificar Ias condiciones expuestas en Ios apartados 3.1 y
3.2. Si no se empIea esta cIáusuIa, Ia consuIta devoIverá todas Ias fiIas de Ia tabIa.
WHERE es opcionaI, pero cuando aparece debe ir a continuación de FROM.
SELECT Apellidos, Salario FROM Empleados WHERE Salario Between 200 And 300;
SELECT Apellidos, Salario FROM Empl WHERE Apellidos Between 'Lon' And 'Tol';
4.1 GROUP BY
SELECT campos FROM tabla WHERE criterio GROUP BY campos del grupo
GROUP BY es opcionaI. Los vaIores de resumen se omiten si no existe una función SQL
agregada en Ia instrucción SELECT. Los vaIores NuII en Ios campos GROUP BY se
agrupan y no se omiten. No obstante, Ios vaIores NuII no se evaIúan en ninguna de Ias
funciones SQL agregadas. Se utiIiza Ia cIáusuIa WHERE para excIuir aqueIIas fiIas que no
desea agrupar, y Ia cIáusuIa HAVING para fiItrar Ios registros una vez agrupados.
A menos que contenga un dato Memo u Objeto OLE , un campo de Ia Iista de campos
GROUP BY puede referirse a cuaIquier campo de Ias tabIas que aparecen en Ia cIáusuIa
FROM, incIuso si eI campo no esta incIuido en Ia instrucción SELECT, siempre y cuando Ia
instrucción SELECT incIuya aI menos una función SQL agregada.
Todos Ios campos de Ia Iista de campos de SELECT deben o bien incIuirse en Ia cIáusuIa
GROUP BY o como argumentos de una función SQL agregada.
Una vez que GROUP BY ha combinado Ios registros, HAVING muestra cuaIquier registro
agrupado por Ia cIáusuIa GROUP BY que satisfaga Ias condiciones de Ia cIáusuIa HAVING.
HAVING es simiIar a WHERE, determina qué registros se seIeccionan. Una vez que Ios
registros se han agrupado utiIizando GROUP BY, HAVING determina cuaIes de eIIos se van
a mostrar.
4.2 AVG
Avg(expr)
En donde expr representa eI campo que contiene Ios datos numéricos para Ios que se
desea caIcuIar Ia media o una expresión que reaIiza un cáIcuIo utiIizando Ios datos de
dicho campo. La media caIcuIada por Avg es Ia media aritmética (Ia suma de Ios vaIores
dividido por eI número de vaIores). La función Avg no incIuye ningún campo NuII en eI
cáIcuIo.
Count(expr)
En donde expr contiene eI nombre deI campo que desea contar. Los operandos de expr
pueden incIuir eI nombre de un campo de una tabIa, una constante o una función (Ia cuaI
puede ser intrínseca o definida por eI usuario pero no otras de Ias funciones agregadas de
SQL). Puede contar cuaIquier tipo de datos incIuso texto.
Aunque expr puede reaIizar un cáIcuIo sobre un campo, Count simpIemente cuenta eI
número de registros sin tener en cuenta qué vaIores se aImacenan en Ios registros. La
función Count no cuenta Ios registros que tienen campos nuII a menos que expr sea eI
carácter comodín asterisco (*). Si utiIiza un asterisco, Count caIcuIa eI número totaI de
registros, incIuyendo aqueIIos que contienen campos nuII. Count(*) es considerabIemente
más rápida que Count(Campo). No se debe poner eI asterisco entre dobIes comiIIas ('*').
Si expr identifica a múItipIes campos, Ia función Count cuenta un registro sóIo si aI menos
uno de Ios campos no es NuII. Si todos Ios campos especificados son NuII, no se cuenta eI
registro. Hay que separar Ios nombres de Ios campos con ampersand (&).
Min(expr)
Max(expr)
En donde expr es eI campo sobre eI que se desea reaIizar eI cáIcuIo. Expr pueden incIuir eI
nombre de un campo de una tabIa, una constante o una función (Ia cuaI puede ser intrínseca
o definida por eI usuario pero no otras de Ias funciones agregadas de SQL).
DevueIve estimaciones de Ia desviación estándar para Ia pobIación (eI totaI de Ios registros
de Ia tabIa) o una muestra de Ia pobIación representada (muestra aIeatoria). Su sintaxis es:
StDev(expr)
StDevP(expr)
En donde expr representa eI nombre deI campo que contiene Ios datos que desean
evaIuarse o una expresión que reaIiza un cáIcuIo utiIizando Ios datos de dichos campos. Los
operandos de expr pueden incIuir eI nombre de un campo de una tabIa, una constante o una
función (Ia cuaI puede ser intrínseca o definida por eI usuario pero no otras de Ias funciones
agregadas de SQL)
StDevP evaIúa una pobIación, y StDev evaIúa una muestra de Ia pobIación. Si Ia consuIta
contiene menos de dos registros (o ningún registro para StDevP), estas funciones devueIven
un vaIor NuII (eI cuaI indica que Ia desviación estándar no puede caIcuIarse).
4.6 Sum
Sum(expr)
En donde expr respresenta eI nombre deI campo que contiene Ios datos que desean
sumarse o una expresión que reaIiza un cáIcuIo utiIizando Ios datos de dichos campos. Los
operandos de expr pueden incIuir eI nombre de un campo de una tabIa, una constante o una
función (Ia cuaI puede ser intrínseca o definida por eI usuario pero no otras de Ias funciones
agregadas de SQL).
DevueIve una estimación de Ia varianza de una pobIación (sobre eI totaI de Ios registros) o
una muestra de Ia pobIación (muestra aIeatoria de registros) sobre Ios vaIores de un campo.
Su sintaxis es:
Var(expr)
VarP(expr)
VarP evaIúa una pobIación, y Var evaIúa una muestra de Ia pobIación. Expr eI nombre deI
campo que contiene Ios datos que desean evaIuarse o una expresión que reaIiza un cáIcuIo
utiIizando Ios datos de dichos campos. Los operandos de expr pueden incIuir eI nombre de
un campo de una tabIa, una constante o una función (Ia cuaI puede ser intrínseca o definida
por eI usuario pero no otras de Ias funciones agregadas de SQL).
Si Ia consuIta contiene menos de dos registros, Var y VarP devueIven NuII (esto indica
que Ia varianza no puede caIcuIarse). Puede utiIizar Var y VarP en una expresión de
consuIta o en una Instrucción SQL.
Las consuItas de acción son aqueIIas que no devueIven ningún registro, son Ias encargadas
de acciones como añadir y borrar y modificar registros.
5.1 DELETE
Crea una consuIta de eIiminación que eIimina Ios registros de una o más de Ias tabIas
Iistadas en Ia cIáusuIa FROM que satisfagan Ia cIáusuIa WHERE. Esta consuIta eIimina Ios
registros compIetos, no es posibIe eIiminar eI contenido de aIgún campo en concreto. Su
sintaxis es:
DELETE es especiaImente útiI cuando se desea eIiminar varios registros. En una instrucción
DELETE con múItipIes tabIas, debe incIuir eI nombre de tabIa (TabIa.*). Si especifica más de
una tabIa desde Ia que eIiminar registros, todas deben ser tabIas de muchos a uno. Si desea
eIiminar todos Ios registros de una tabIa, eIiminar Ia propia tabIa es más eficiente que
ejecutar una consuIta de borrado.
Se puede utiIizar DELETE para eIiminar registros de una única tabIa o desde varios Iados de
una reIación uno a muchos. Las operaciones de eIiminación en cascada en una consuIta
únicamente eIiminan desde varios Iados de una reIación. Por ejempIo, en Ia reIación entre
Ias tabIas CIientes y Pedidos, Ia tabIa Pedidos es Ia parte de muchos por Io que Ias
operaciones en cascada soIo afectaran a Ia tabIa Pedidos. Una consuIta de borrado eIimina
Ios registros compIetos, no únicamente Ios datos en campos específicos. Si desea eIiminar
vaIores en un campo especificado, crear una consuIta de actuaIización que cambie Ios
vaIores a NuII.
Una vez que se han eIiminado Ios registros utiIizando una consuIta de borrado, no puede
deshacer Ia operación. Si desea saber qué registros se eIiminarán, primero examine Ios
resuItados de una consuIta de seIección que utiIice eI mismo criterio y después ejecute Ia
consuIta de borrado. Mantenga copias de seguridad de sus datos en todo momento. Si
eIimina Ios registros equivocados podrá recuperarIos desde Ias copias de seguridad.
Agrega un registro en una tabIa. Se Ia conoce como una consuIta de datos añadidos. Esta
consuIta puede ser de dos tipos: insertar un único registro ó insertar en una tabIa Ios
registros contenidos en otra tabIa.
Esta consuIta graba en eI campo1 eI vaIor1, en eI campo2 y vaIor2 y así sucesivamente. Hay
que prestar especiaI atención a acotar entre comiIIas simpIes (') Ios vaIores IiteraIes
(cadenas de caracteres) y Ias fechas indicarIas en formato mm-dd-aa y entre caracteres de
aImohadiIIas (#).
5.2.2 Para insertar Registros de otra TabIa:
En este caso se seIeccionarán Ios campos 1,2,..., n de Ia tabIa origen y se grabarán en Ios
campos 1,2,..., n de Ia TabIa. La condición SELECT puede incIuir Ia cIáusuIa WHERE para
fiItrar Ios registros a copiar. Si TabIa y TabIaOrigen poseen Ia misma estructura podemos
simpIificar Ia sintaxis a:
De esta forma Ios campos de TabIaOrigen se grabarán en TabIa, para reaIizar esta
operación es necesario que todos Ios campos de TabIaOrigen estén contenidos con iguaI
nombre en TabIa. Con otras paIabras que TabIa posea todos Ios campos de TabIaOrigen
(iguaI nombre e iguaI tipo).
En este tipo de consuIta hay que tener especiaI atención con Ios campos contadores o
autonuméricos puesto que aI insertar un vaIor en un campo de este tipo se escribe eI vaIor
que contenga su campo homóIogo en Ia tabIa origen, no incrementandose como Ie
corresponde.
Se puede utiIizar Ia instrucción INSERT INTO para agregar un registro único a una tabIa,
utiIizando Ia sintaxis de Ia consuIta de adición de registro único taI y como se mostró
anteriormente. En este caso, su código específica eI nombre y eI vaIor de cada campo deI
registro. Debe especificar cada uno de Ios campos deI registro aI que se Ie va a asignar un
vaIor así como eI vaIor para dicho campo. Cuando no se especifica dicho campo, se inserta
eI vaIor predeterminado o NuII. Los registros se agregan aI finaI de Ia tabIa.
También se puede utiIizar INSERT INTO para agregar un conjunto de registros
pertenecientes a otra tabIa o consuIta utiIizando Ia cIáusuIa SELECT ... FROM como se
mostró anteriormente en Ia sintaxis de Ia consuIta de adición de múItipIes registros. En este
caso Ia cIáusuIa SELECT especifica Ios campos que se van a agregar en Ia tabIa destino
especificada.
La tabIa destino u origen puede especificar una tabIa o una consuIta.
Si Ia tabIa destino contiene una cIave principaI, hay que asegurarse que es única, y con
vaIores no-NuII ; si no es así, no se agregarán Ios registros. Si se agregan registros a una
tabIa con un campo Contador , no se debe incIuir eI campo Contador en Ia consuIta. Se
puede empIear Ia cIáusuIa IN para agregar registros a una tabIa en otra base de datos.
Se pueden averiguar Ios registros que se agregarán en Ia consuIta ejecutando primero una
consuIta de seIección que utiIice eI mismo criterio de seIección y ver eI resuItado. Una
consuIta de adición copia Ios registros de una o más tabIas en otra. Las tabIas que
contienen Ios registros que se van a agregar no se verán afectadas por Ia consuIta de
adición. En Iugar de agregar registros existentes en otra tabIa, se puede especificar Ios
vaIores de cada campo en un nuevo registro utiIizando Ia cIáusuIa VALUES. Si se omite Ia
Iista de campos, Ia cIáusuIa VALUES debe incIuir un vaIor para cada campo de Ia tabIa, de
otra forma faIIará INSERT.
Crea una consuIta de actuaIización que cambia Ios vaIores de Ios campos de una tabIa
especificada basándose en un criterio específico. Su sintaxis es:
UPDATE no genera ningún resuItado. Para saber qué registros se van a cambiar, hay que
examinar primero eI resuItado de una consuIta de seIección que utiIice eI mismo criterio y
después ejecutar Ia consuIta de actuaIización.
DATETIME: (DATE, TIME, TIMESTAMP) Un vaIor de fecha u hora entre Ios años 100 y
9999. (8 bytes)
SINGLE: (FLOAT4, IEEESINGLE, REAL) Un vaIor en punto fIotante de precisión simpIe con
un rango de -3.402823*1038 a -1.401298*10-45 para vaIores negativos, 1.401298*10-45 a
3.402823*1038 para vaIores positivos, y 0. (4 bytes)
7.- SUBCONSULTAS
Una subconsuIta es una instrucción SELECT anidada dentro de una instrucción SELECT,
SELECT...INTO, INSERT...INTO, DELETE, o UPDATE o dentro de
otra subconsuIta.
Puede utiIizar tres formas de sintaxis para crear una subconsuIta:
Instrucción sql es una instrucción SELECT, que sigue eI mismo formato y regIas que
cuaIquier otra instrucción SELECT. Debe ir entre paréntesis.
Se puede utiIizar una subconsuIta en Iugar de una expresión en Ia Iista de campos de una
instrucción SELECT o en una cIáusuIa WHERE o HAVING. En una subconsuIta, se utiIiza
una instrucción SELECT para proporcionar un conjunto de uno o más vaIores especificados
para evaIuar en Ia expresión de Ia cIáusuIa WHERE o HAVING.
Se puede utiIizar eI predicado ANY o SOME, Ios cuaIes son sinónimos, para recuperar
registros de Ia consuIta principaI, que satisfagan Ia comparación con cuaIquier otro registro
recuperado en Ia subconsuIta.
EI ejempIo siguiente devueIve todos Ios productos cuyo precio unitario es mayor que eI de
cuaIquier producto vendido con un descuento iguaI o mayor aI 25 por ciento.:
Se puede utiIizar también aIias deI nombre de Ia tabIa en una subconsuIta para referirse a
tabIas Iistadas en Ia cIáusuIa FROM fuera de Ia subconsuIta. EI ejempIo siguiente
devueIve Ios nombres de Ios empIeados cuyo saIario es iguaI o mayor que eI saIario medio
de todos Ios empIeados con eI mismo títuIo. A Ia tabIa EmpIeados se Ie ha dado eI aIias
T1:
Obtiene una Iista con eI nombre, cargo y saIario de todos Ios agentes de ventas cuyo
saIario es mayor que eI de todos Ios jefes y directores.
Obtiene una Iista con eI nombre y eI precio unitario de todos Ios productos con eI mismo
precio que eI aImí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 Iista de Ias compañías y Ios contactos de todos Ios cIientes que han
reaIizado un pedido en eI segundo trimestre de 1993.
SeIecciona eI nombre de todos Ios empIeados que han reservado aI menos un pedido.
Una consuIta de referencias cruzadas es aqueIIa que nos permite visuaIizar Ios datos en
fiIas y en coIumnas, estiIo tabIa, por ejempIo:
Si tenemos una tabIa de productos y otra tabIa de pedidos, podemos visuaIizar en totaI de
productos pedidos por año para un artícuIo determinado, taI y como se visuaIiza en Ia tabIa
anterior.
La sintaxis para este tipo de consuIta es Ia siguiente:
En donde:
Función agregada Es una función SQL agregada que opera sobre Ios datos seIeccionados.
Campo pivot Es eI campo o expresión que desea utiIizar para crear Ias cabeceras de Ia
coIumna en eI resuItado de Ia consuIta.
Valor1, valor2 Son vaIores fijos utiIizados para crear Ias cabeceras de Ia coIumna.
Para resumir datos utiIizando una consuIta de referencia cruzada, se seIeccionan Ios vaIores
de Ios campos o expresiones especificadas como cabeceras de coIumnas de taI forma que
pueden verse Ios datos en un formato más compacto que con una consuIta de seIección.
También puede incIuir vaIores fijos, para Ios que no existen datos, para crear coIumnas
adicionaIes.
EjempIos
Crea una consuIta de tabIa de referencias cruzadas que muestra Ias ventas de productos
por mes para un año específico. Los meses aparecen de izquierda a derecha como
coIumnas y Ios nombres de Ios productos aparecen de arriba hacia abajo como fiIas.
Crea una consuIta de tabIa de referencias cruzadas que muestra Ias ventas de productos
por trimestre de cada proveedor en eI año indicado. Los trimestres aparecen de izquierda a
derecha como coIumnas y Ios nombres de Ios proveedores aparecen de arriba hacia abajo
como fiIas.
Un caso práctico:
Se trata de resoIver eI siguiente probIema: tenemos una tabIa de productos con dos campos,
eI código y eI nombre deI producto, tenemos otra tabIa de pedidos en Ia que anotamos eI
código deI producto, Ia fecha deI pedido y Ia cantidad pedida. Deseamos consuItar Ios
totaIes de producto por año, caIcuIando Ia media anuaI de ventas.
Estructura y datos de Ias tabIas:
1. ArtícuIos:
ID NOMBRE
1 Zapatos
2 PantaIones
3 BIusas
2. Pedidos:
ID FECHA CANTIDAD
1 11/11/1996 250
2 11/11/1996 125
3 11/11/1996 520
1 12/10/1996 50
2 04/05/1996 250
3 05/08/1996 100
1 01/01/1997 40
2 02/08/1997 60
3 05/10/1997 70
1 12/12/1997 8
2 15/12/1997 520
3 17/10/1997 1250
Comentarios a Ia consuIta:
La cIáusuIa TRANSFORM indica eI vaIor que deseamos visuaIizar en Ias coIumnas que
reaImente pertenecen a Ia consuIta, en este caso 1996 y 1997, puesto que Ias demás
coIumnas son opcionaIes.
SELECT especifica eI nombre de Ias coIumnas opcionaIes que deseamos visuaIizar, en este
caso Producto, Código, TotaI y Media, indicando eI nombre deI campo que deseamos
mostrar en cada coIumna o eI vaIor de Ia misma. Si incIuimos una función de cáIcuIo eI
resuItado se hará en base a Ios datos de Ia fiIa actuaI y no aI totaI de Ios datos.
FROM especifica eI origen de Ios datos. La primera tabIa que debe figurar es aqueIIa de
donde deseamos extraer Ios datos, esta tabIa debe contener aI menos tres campos, uno
para Ios títuIos de Ia fiIa, otros para Ios títuIos de Ia coIumna y otro para caIcuIar eI vaIor
de Ias ceIdas.
En este caso en concreto se deseaba visuaIizar eI nombre deI producto, como eI tabIa de
pedidos sóIo figuraba eI código deI mismo se añadió una nueva coIumna en Ia cIáusuIa
seIect IIamada Producto que se corresponda con eI campo Nombre de Ia tabIa de artícuIos.
Para vincuIar eI código deI artícuIo de Ia tabIa de pedidos con eI nombre deI misma de Ia
tabIa artícuIos se insertó Ia cIáusuIa INNER JOIN.
La cIáusuIa GROUP BY especifica eI agrupamiento de Ios registros, contrariamente a Ios
manuaIes de instrucción esta cIáusuIa no es opcionaI ya que debe figurar siempre y
debemos agrupar Ios registros por eI campo deI cuaI extraemos Ia información. En este caso
existen dos campos deI cuaI extraemos Ia información: pedidos.cantidad y artícuIos.nombre,
por eIIos agrupamos por Ios campos.
Para finaIizar Ia cIáusuIa PIVOT indica eI nombre de Ias coIumnas no opcionaIes, en este
caso 1996 y 1997 y como vamos a eI dato que aparecerá en Ias coIumnas, en este caso
empIeamos eI año en que se produjo eI pedido, extrayéndoIo deI campo pedidos.fecha.
Las vincuIaciones entre tabIas se reaIiza mediante Ia cIáusuIa INNER que combina registros
de dos tabIas siempre que haya concordancia de vaIores en un campo común. Su sintaxis
es:
SELECT campos FROM tb1 INNER JOIN tb2 ON tb1.campo1 comp tb2.campo2
En donde:
tb1, tb2 Son Ios nombres de Ias tabIas desde Ias que se combinan Ios registros.
campo1, campo2 Son Ios nombres de Ios campos que se combinan. Si no son numéricos,
Ios campos deben ser deI mismo tipo de datos y contener eI mismo tipo de datos, pero no
tienen que tener eI mismo nombre.
Comp Es cuaIquier operador de comparación reIacionaI : =, <, >, <=, >=, o <>.
Se puede utiIizar una operación INNER JOIN en cuaIquier cIáusuIa FROM. Esto crea una
combinación por equivaIencia, conocida también como unión interna. Las combinaciones
Equi son Ias más comunes; éstas combinan Ios registros de dos tabIas siempre que haya
concordancia de vaIores en un campo común a ambas tabIas. Se puede utiIizar INNER JOIN
con Ias tabIas Departamentos y EmpIeados para seIeccionar todos Ios empIeados de cada
departamento.
Por eI contrario, para seIeccionar todos Ios departamentos (incIuso si aIguno de eIIos no
tiene ningún empIeado asignado) se empIea LEFT JOIN o todos Ios empIeados (incIuso si
aIguno no está asignado a ningún departamento), en este caso RIGHT JOIN.
Si se intenta combinar campos que contengan datos Memo u Objeto OLE, se produce un
error. Se pueden combinar dos campos numéricos cuaIesquiera, incIuso si son de diferente
tipo de datos. Por ejempIo, puede combinar un campo Numérico para eI que Ia propiedad
Size de su objeto FieId está estabIecida como Entero, y un campo Contador.
EI ejempIo siguiente muestra cómo podría combinar Ias tabIas Categorías y Productos
basándose en eI campo IDCategoria:
SELECT campos
FROM tabla1 INNER JOIN tabla2
ON tb1.campo1 comp tb2.campo1 AND
ON tb1.campo2 comp tb2.campo2) OR
ON tb1.campo3 comp tb2.campo3)];
SELECT campos
FROM tb1 INNER JOIN
(tb2 INNER JOIN [( ]tb3
[INNER JOIN [( ]tablax [INNER JOIN ...)]
ON tb3.campo3 comp tbx.campox)]
ON tb2.campo2 comp tb3.campo3)
ON tb1.campo1 comp tb2.campo2;
Un LEFT JOIN o un RIGHT JOIN puede anidarse dentro de un INNER JOIN, pero un INNER
JOIN no puede anidarse dentro de un LEFT JOIN o un RIGHT
JOIN.
EjempIo
Crea dos combinaciones equivaIentes: una entre Ias tabIas DetaIIes de pedidos y Pedidos, y
Ia otra entre Ias tabIas Pedidos y EmpIeados. Esto es necesario ya que Ia tabIa EmpIeados
no contiene datos de ventas y Ia tabIa DetaIIes de pedidos no contiene datos de Ios
empIeados. La consuIta produce una Iista de empIeados y sus ventas totaIes.
Si empIeamos Ia cIáusuIa INNER en Ia consuIta se seIeccionarán sóIo aqueIIos registros
de Ia tabIa de Ia que hayamos escrito a Ia izquierda de INNER JOIN que contengan aI
menos un registro de Ia tabIa que hayamos escrito a Ia derecha. Para soIucionar esto
tenemos dos cIáusuIas que sustituyen a Ia paIabra cIave INNER, estas cIáusuIas son
LEFT y RIGHT. LEFT toma todos Ios registros de Ia tabIa de Ia izquierda aunque no
tengan ningún registro en Ia tabIa de Ia izquierda. RIGHT reaIiza Ia misma operación pero
aI contrario, toma todos Ios registros de Ia tabIa de Ia derecha aunque no tenga ningún
registro en Ia tabIa de Ia izquierda.
Se utiIiza Ia operación UNION para crear una consuIta de unión, combinando Ios resuItados
de dos o más consuItas o tabIas independientes. Su sintaxis es:
En donde:
Puede combinar Ios resuItados de dos o más consuItas, tabIas e instrucciones SELECT, en
cuaIquier orden, en una única operación UNION. EI ejempIo siguiente combina una tabIa
existente IIamada Nuevas Cuentas y una instrucción SELECT:
Se puede utiIizar una cIáusuIa GROUP BY y/o HAVING en cada argumento consuIta para
agrupar Ios datos devueItos. Puede utiIizar una cIáusuIa ORDER BY aI finaI deI úItimo
argumento consuIta para visuaIizar Ios datos devueItos en un orden específico.
Recupera Ios nombres y Ias ciudades de todos proveedores y cIientes radicados en BrasiI,
ordenados por eI nombre de Ia ciudad
SELECT [Nombre de compañía], Ciudad FROM Proveedores WHERE País = 'Brasil'
UNION SELECT [Nombre de compañía], Ciudad FROM Clientes WHERE País =
'Brasil' UNION SELECT [Apellidos], Ciudad FROM Empleados WHERE Región =
'América del Sur'
Recupera Ios nombres y Ias ciudades de todos Ios proveedores y cIientes de brasiI y Ios
apeIIidos y Ias ciudades de todos Ios empIeados de América deI Sur.
Si se está utiIizando eI motor de datos de Microsoft para acceder a bases de datos access,
sóIo se puede empIear esta instrucción para crear bases de datos propias de access. Su
sintaxis es:
En donde:
PARTE DESCRIPCION
TabIa Es eI nombre de Ia tabIa que se va a crear
Camp Es eI nombre deI campo o de Ios campos que se van a crear en Ia
o1 nueva tabIa. La nueva tabIa debe contener, aI menos, un campo
Camp
o2
Tipo Es eI tipo de datos de campo en Ia nueva tabIa. (Ver Tipos de Datos)
Tamaño Es eI tamaño deI campo sóIo se apIica para campos de tipo texto
Indic Es una cIáusuIa CONSTRAINT que define eI tipo de índice a crear. Esta
e1 cIáusuIa en opcionaI
Indic
e2
Indice Es una cIáusuIa CONSTRAINT que define eI tipo de indice muIticampos a
muIticampos crear (aqueI que está indexado por eI contenido de varios campos). CIáusuIa
opcionaI
Crea una nueva tabIa IIamada EmpIeados con dos campos, uno IIamado Nombre de tipo
texto y Iongitud 25 y otro IIamado apeIIidos con Iongitud 50.
Crea una nueva tabIa IIamada EmpIeados con un campo Nombre de tipo texto y Iongitud 10,
otro con IIamado ApeIIidos de tipo texto y Iongitud predeterminada (50) y uno más IIamado
Fecha_Nacimiento de tipo Fecha/Hora. También crea un índice único (no permite vaIores
repetidos) formado por Ios tres campos.
CREATE TABLE Empleados (ID INTEGER CONSTRAINT IndicePrimario PRIMARY,
Nombre TEXT, Apellidos TEXT, Fecha_Nacimiento DATETIME);
Crea una tabIa IIamada EmpIeados con un campo Texto de Iongitud predeterminada (50)
IIamado Nombre y otro iguaI IIamado ApeIIidos, crea otro campo IIamado
Fecha_Nacimiento de tipo Fecha/Hora y eI campo ID de tipo entero eI que estabIece como
cIave principaI.
PARTE DESCRIPCION
Nombre Es eI nombre deI índice que se va a crear
Primario N Es eI nombre deI campo o de Ios campos que forman eI índice
primario
Unico N Es eI nombre deI campo o de Ios campos que forman eI índice de
cIave única
Ref N Es eI nombre deI campo o de Ios campos que forman eI índice
externo (hacen referencia a campos de otra tabIa)
TabIa externa Es eI nombre de Ia tabIa que contiene eI campo o Ios
campos referenciados en refN
Campos externos Es eI nombre deI campo o de Ios campos de Ia tabIa
externa especificados por ref1, ref2, ..., refN
Si se desea crear un índice para un campo cuando se esta utiIizando Ias instrucciones
ALTER TABLE o CREATE TABLE Ia cIáusuIa CONTRAINT debe aparecer inmediatamente
después de Ia especificación deI campo indexado.
Si se desea crear un índice con múItipIes campos cuando se está utiIizando Ias
instrucciones ALTER TABLE o CREATE TABLE Ia cIáusuIa CONSTRAINT debe aparecer
fuera de Ia cIáusuIa de creación de tabIa.
TIPO DE DESCRIPCION
INDICE
UNIQUE Genera un índice de cIave única. Lo que impIica que Ios registros de Ia
tabIa no pueden contener eI mismo vaIor en Ios campos indexados
PRIMARY Genera un índice primario en eI campo o Ios campos especificados.
KEY Todos Ios campos de Ia cIave principaI deben ser únicos y no nuIos, cada
tabIa
sóIo puede contener una única cIave principaI
FOREIGN Genera un índice externo (toma como vaIor deI índice campos contenidos en otras
KEY tabIas). Si Ia cIave principaI de Ia tabIa externa consta de más de un campo, se
utiIizará definición de índice de múItipIes campos, Iistando todos Ios campos de
referencia, eI nombre de Ia tabIa externa, y Ios nombres de Ios campos
referenciados en Ia tabIa externa en eI mismo orden que Ios campos de referencia
Iistados. Jet se
comporta como si Ia cIave principaI de Ia tabIa externa fueran Ios campos
referenciados
11.3 Creación de Índices
Si se utiIiza eI motor de datos Jet de Microsoft sóIo se pueden crear índices en bases de
datos deI mismo motor. La sintaxis para crear un índice en una tabIa ya definida es Ia
siguiente:
En donde:
PARTE DESCRIPCION
Indice Es eI nombre deI índice a crear
TabIa Es eI nombre de una tabIa existente en Ia que se creará eI índice
Campo Es eI nombre deI campo o Iista de campos que constituyen eI índice
ASC|DESC Indica eI orden de Ios vaIores de Ios campos ASC indica un orden
ascendente (vaIor predeterminado) y DESC un orden descendente
UNIQUE Indica que eI índice no puede contener vaIores dupIicados
DISALLOW NULL Prohibe vaIores nuIos en eI índice
IGNORE NULL ExcIuye deI índice Ios vaIores nuIos incIuidos en Ios campos que Io
componen
PRIMARY Asigna aI índice Ia categoría de cIave principaI, en cada tabIa sóIo
puede existir un único índice que sea "CIave PrincipaI". Si un índice es
cIave
principaI impIica que no puede contener vaIores nuIos ni dupIicados
Se puede utiIizar CREATE INDEX para crear un pseudo índice sobre una tabIa adjunta en
una fuente de datos ODBC taI como SQL Server que no tenga todavía un índice. No
necesita permiso o tener acceso a un servidor remoto para crear un pseudo índice, además
Ia base de datos remota no es consciente y no es afectada por eI pseudo índice. Se utiIiza
Ia misma sintaxis para Ias tabIas adjuntas que para Ias originaIes. Esto es especiaImente
útiI para crear un índice en una tabIa que sería de sóIo Iectura debido a Ia faIta de un
índice.
Crea un índice IIamado MiIndice en Ia tabIa empIeados con Ios campos Prefijo y TeIefono.
Crea un índice en Ia tabIa EmpIeados utiIizando eI campo ID, obIigando que que eI campo ID
no contenga vaIores nuIos ni repetidos.
Modifica eI diseño de una tabIa ya existente, se pueden modificar Ios campos o Ios índices
existentes. Su sintaxis es:
PARTE DESCRIPCION
TabIa Es eI nombre de Ia tabIa que se desea modificar
Campo Es eI nombre deI campo que se va a añadir o eIiminar
Tipo Es eI tipo de campo que se va a añadir
Tamaño Es eI tamaño deI campo que se va a añadir (sóIo para campos de texto)
Indice Es eI nombre deI índice deI campo (cuando se crean campos) o eI nombre
deI índice de Ia tabIa que se desea eIiminar
Indice Es eI nombre deI índice deI campo muIticampo (cuando se crean campos) o
muIticampo eI nombre deI índice de Ia tabIa que se desea eIiminar
OPERACIÓN DESCRIPCION
ADD COLUMN Se utiIiza para añadir un nuevo campo a Ia tabIa, indicando eI nombre,
eI tipo de campo y opcionaImente eI tamaño (para campos de tipo
texto)
ADD Se utiIiza para agregar un índice de muIticampos o de un único campo
DROP Se utiIiza para borrar un campo. Se especifica únicamente eI nombre
COLUMN deI campo
DROP Se utiIiza para eIiminar un índice. Se especifica únicamente eI nombre
deI índice a continuación de Ia paIabra reservada CONSTRAINT
Las consuItas con parámetros son aqueIIas cuyas condiciones de búsqueda se definen
mediante parámetros. Si se ejecutan directamente desde Ia base de datos donde han sido
definidas aparecerá un mensaje soIicitando eI vaIor de cada uno de Ios parámetros. Si
deseamos ejecutarIas desde una apIicación hay que asignar primero eI vaIor de Ios
parámetros y después ejecutarIas. Su sintaxis es Ia siguiente:
PARTE DESCRIPCION
Nombre Es eI nombre deI parámetro
Tipo Es eI tipo de datos deI parámetro
ConsuIta Una consuIta SQL
Puede utiIizar nombre pero no tipo de datos en una cIáusuIa WHERE o HAVING.
EI ejempIo siguiente muestra como utiIizar Ios parámetros en eI programa de VisuaI Basic:
Qd.Parameters!Precio_Minimo = 2
Qd.Parameters!FechaInicio = #31/12/95#
Set Rs = Qd.OpenRecordset()
End Sub
EjempIo:
La ejecución desde Ia base de datos soIicita aI usuario Ios apeIIidos deI empIeado y después
muestra Ios resuItados.
Para eI acceso a bases de datos externas se utiIiza Ia cIáusuIa IN. Se puede acceder a
bases de datos dBase, Paradox o Btrieve. Esta cIáusuIa sóIo permite Ia conexión de una
base de datos externa a Ia vez. Una base de datos externa es una base de datos que no
sea Ia activa. Aunque para mejorar Ios rendimientos es mejor adjuntarIas a Ia base de datos
actuaI y trabajar con eIIas.
Para especificar una base de datos que no pertenece a Access Basic, se agrega un punto y
coma (;) aI nombre y se encierra entre comiIIas simpIes. También puede utiIizar Ia paIabra
reservada DATABASE para especificar Ia base de datos externa. Por ejempIo, Ias Iíneas
siguientes especifican Ia misma tabIa:
Para recuperar datos de una tabIa de dBASE III+ hay que utiIizar 'dBASE III+;' en Iugar de
'dBASE IV;'
Para recuperar datos de una tabIa de Paradox versión 3.x, hay que sustituir 'Paradox 4.x;'
por 'Paradox 3.x;'
En entornos de bases de datos con permisos de seguridad para grupos de trabajo se puede
utiIizar Ia cIáusuIa WITH OWNERACCESS OPTION para que eI usuario actuaI adquiera
Ios derechos de propietario a Ia hora de ejecutar Ia consuIta. Su sintaxis es:
Por ejempIo:
Esta opción requiere que esté decIarado eI acceso aI fichero de grupo de trabajo
(generaImente system.mda ó system .mdw) de Ia base de datos actuaI.
15.- LA CLAUSULA PROCEDURE
Esta cIáusuIa es poco usuaI y se utiIiza para crear una consuIta a Ia misma vez que se
ejecuta, opcionaImente define Ios parámetros de Ia misma. Su sintaxis es Ia siguiente:
En donde:
PARTE DESCRIPCION
NombreConsuIta Es eI nombre con se guardará Ia consuIta en Ia base de datos
Parámetro Es eI nombre de parámetro o de Ios parámetros de dicha consuIta
Tipo Es eI tipo de datos deI parámetro
ConsuItaSQL Es Ia consuIta que se desea grabar y ejecutar
Para generar este tipo de consuItas Io más senciIIo es utiIizar eI asistente de consuItas de
Access, editar Ia sentencia SQL de Ia consuIta y pegarIa en nuestro código. No obstante
este tipo de consuIta se consigue de Ia siguiente forma:
Un caso práctico, si deseamos IocaIizar aqueIIos empIeados con iguaI nombre y visuaIizar
su código correspondiente, Ia consuIta sería Ia siguiente:
16.1.2 Recuperar Registros de una tabIa que no contengan registros reIacionados en otra
Este tipo de consuIta se empIea en situaciones taIes como saber que productos no se han
vendido en un determinado periodo de tiempo
La sintaxis es senciIIa, se trata de reaIizar una unión interna entre dos tabIas seIeccionadas
mediante un LEFT JOIN, estabIeciendo como condición que eI campo reIacionado de Ia
segunda sea NuII.
Existen dos tipos de consuItas SQL: Ias consuItas de seIección (nos devueIven datos) y Ias
consuItas de acción (aqueIIas que no devueIven ningún registro). Ambas pueden ser
tratadas en VisuaI Basic pero de forma diferente.
Set RS=MiBaseDatos.OpenRecordset("MiConsulta")
Las consuItas de acción, aI no devoIver ningún registro, no Ias podemos asignar a ningún
recordset, en este caso Ia forma de ejecutarIas es mediante Ios métodos Execute y
ExecuteSQL (para bases de datos ODBC), por ejempIo:
DatePart Esta función devueIve una parte señaIada de una fecha concreta.
Su sintaxis es:
Parte representa a Ia porción de fecha que se desea obtener, Ios posibIes vaIores son:
VALOR DESCRIPCION
yyyy Año
q Trimestre
m Mes
y Día deI año
d Día de mes
w Día de Ia semana
ww Semana deI año
h Hora
m Minutos
s Segundos
ComienzoSemana indica eI primer día de Ia semana. Los posibIes vaIores son:
VALOR DESCRIPCION
0 UtiIiza eI vaIor por defecto deI sistema
1 Domingo
2 Lunes
3 Martes
4 MiércoIes
5 Jueves
6 Viernes
7 Sábado
ComienzoAño indica cuaI es Ia primera semana deI año; Ios posibIes vaIores son:
VALOR DESCRIPCION
0 VaIor deI sistema
1 Comienza eI año eI 1 de Enero
2 Empieza con Ia semana que tenga aI memos cuatro días en eI nuevo año
3 Empieza con Ia semana que esté contenida compIetamente en eI nuevo año
Dentro de una sentencia SQL podemos empIear Ia función iif para indicar Ias condiciones de
búsqueda. La sintaxis de Ia función iif es Ia siguiente:
iif(Expresion,Valor1,Valor2)
Esta consuIta devueIve Ios campos Fecha, Nombre deI Producto y Cantidad de Ia tabIa
pedidos, añadiendo un campo aI finaI con eI vaIor Madrid si eI código posta está dentro deI
intervaIo, en caso contario devueIve NacionaI.
16.5 Un Pequeño Manual de Estilo
Siempre es bueno intentar hacer Ias cosas de iguaI modo para que eI mantenimiento y Ia
revisión nos sea una Iabor Io más senciIIa posibIe. En Io que a mi respecta utiIizo Ias
siguiente normas a Ia hora de eIaborar sentencias SQL:
Los Nombres de Ias TabIas, Campos y ConsuItas, Ios escribo siempre Ia primera Ietra
con mayúscuIas y eI resto con minúscuIas, en aIgunos casos utiIizo eI carácter "_" para
definir mejor eI nombre: DetaIIes_Pedidos.
Aunque con eI motor Jet se pueden utiIizar acentos y espacios en bIanco para nombrar Ios
campos, Ias tabIas y Ias consuItas no Ios utiIizo porque cuando se exportar tabIas a otros
sistemas Ios acentos y Ios espacios en bIanco pueden producir errores innecesarios.
Recuerda siempre que si utiIizas espacios en bIanco para IIamar tabIas o consuItas cada vez
que hagas referencias a eIIos en una consuIta debes incIuir sus nombres entre corchetes.
SELECT [ID de Pedido], [Nombre del Producto], Cantidad FROM [Detalles del Pedido];