0% encontró este documento útil (0 votos)
133 vistas34 páginas

Comandos DDL y DML SQL

Este documento proporciona una introducción al lenguaje de consultas estructuradas (SQL). Explica que SQL se utiliza para crear y manipular bases de datos. Describe los componentes clave de SQL como comandos, cláusulas, operadores y funciones de agregado y cómo se combinan para consultar y modificar datos. También resume los tipos básicos de consultas SQL y cómo se pueden utilizar cláusulas y predicados para filtrar y ordenar los resultados de las consultas.

Cargado por

Naldo HM
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
133 vistas34 páginas

Comandos DDL y DML SQL

Este documento proporciona una introducción al lenguaje de consultas estructuradas (SQL). Explica que SQL se utiliza para crear y manipular bases de datos. Describe los componentes clave de SQL como comandos, cláusulas, operadores y funciones de agregado y cómo se combinan para consultar y modificar datos. También resume los tipos básicos de consultas SQL y cómo se pueden utilizar cláusulas y predicados para filtrar y ordenar los resultados de las consultas.

Cargado por

Naldo HM
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 34

SQL

1.- INTRODUCCION

EI Ienguaje de consuIta estructurado (SQL) es un Ienguaje de base de datos


normaIizado, utiIizado por eI motor de base de datos de Microsoft Jet. SQL se utiIiza
para crear objetos QueryDef, como eI argumento de origen deI método
OpenRecordSet y como Ia propiedad RecordSource deI controI de datos. También se
puede utiIizar con eI método Execute para crear y manipuIar directamente Ias bases
de datos Jet y crear consuItas SQL de paso a través para manipuIar bases de datos
remotas cIiente - servidor.

1.1. Componentes del SQL

EI Ienguaje SQL está compuesto por comandos, cIáusuIas, operadores y funciones de


agregado. Estos eIementos se combinan en Ias instrucciones para crear, actuaIizar y
manipuIar Ias bases de datos.

1.2 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 consuItas para ordenar, fiItrar y extraer datos de Ia
base de datos.

Comandos DLL
CREATE: UtiIizado para crear nuevas tabIas, campos e índices.

DROP: EmpIeado para eIiminar tabIas e índices.

ALTER: UtiIizado para modificar Ias tabIas agregando campos o cambiando Ia


definición de Ios campos.

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.

1.4 Operadores Lógicos

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.

NOT: Negación Iógica, devueIve eI vaIor contrario de Ia expresión.

1.5 Operadores de Comparación

< Menor que

> Mayor que

<> Distinto de

<= Menor ó IguaI que

>= Mayor ó IguaI que

= IguaI que

BETWEEN UtiIizado para especificar un intervaIo de

vaIores LIKE UtiIizado en Ia comparación de un modeIo

IN UtiIizado para especificar registros de una base de datos


1.6 Funciones de Agregado

Las funciones de agregado se usan dentro de una cIáusuIa SELECT en grupos de


registros para devoIver un único vaIor que se apIica a un grupo de registros.

AVG: UtiIizada para caIcuIar eI promedio de Ios vaIores de un campo determinado.

COUNT: UtiIizada para devoIver eI número de registros de Ia seIección.

SUM: UtiIizada para devoIver Ia suma de todos Ios vaIores de un campo determinado.

MAX: UtiIizada para devoIver eI vaIor más aIto de un campo especificado.

MIN: UtiIizada para devoIver eI vaIor más bajo de un campo especificado.

2.- CONSULTAS DE SELECCION

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.

2.1 Consultas básicas

La sintaxis básica de una consuIta de seIección es Ia siguiente:

SELECT Campos FROM Tabla;

En donde campos es Ia Iista de campos que se deseen recuperar y tabIa es eI origen


de Ios mismos, por ejempIo:

SELECT Nombre, Teléfono FROM Clientes;

Esta consuIta devueIve un recordset con eI campo nombre y teIéfono de Ia tabIa


cIientes.

2.2 Ordenar los registros

AdicionaImente se puede especificar eI orden en que se desean recuperar Ios registros


de Ias tabIas mediante Ia cIáusuIa ORDER BY Lista de Campos. En donde Lista de
campos representa Ios campos a ordenar. EjempIo:

SELECT CodigoPostal, Nombre, Telefono FROM Clientes ORDER BY Nombre;

Esta consuIta devueIve Ios campos CodigoPostaI, Nombre, TeIefono de Ia tabIa


CIientes ordenados por eI campo Nombre.

Se pueden ordenar Ios registros por mas de un campo, como por ejempIo:

SELECT CodigoPostal, Nombre, Telefono FROM Clientes ORDER BY


CodigoPostal, Nombre;
IncIuso se puede especificar eI orden de Ios registros: ascendente mediante Ia
cIáusuIa (ASC) ó descendente (DESC)

SELECT CodigoPostal, Nombre, Telefono FROM Clientes ORDER BY


CodigoPostal DESC , Nombre ASC;

2.3 Consultas con Predicado

EI predicado se incIuye entre Ia cIáusuIa y eI primer nombre deI campo a recuperar, Ios
posibIes predicados son:

ALL: DevueIve todos Ios campos de Ia tabIa.

TOP: DevueIve un determinado número de registros de Ia tabIa.

DISTINCT: Omite Ios registros cuyos campos seIeccionados


coincidan totaImente.

DISTINCTROW: Omite Ios registros dupIicados basándose en Ia totaIidad


deI registro y no sóIo en Ios campos seIeccionados.

ALL

Si no se incIuye ninguno de Ios predicados se asume ALL. EI Motor de base de datos


seIecciona todos Ios registros que cumpIen Ias condiciones de Ia instrucción SQL. No
es conveniente abusar de este predicado ya que obIigamos aI motor de Ia base de
datos a anaIizar Ia estructura de Ia tabIa para averiguar Ios campos que contiene, es
mucho más rápido indicar eI Iistado de campos deseados.

SELECT ALL FROM Empleados;


SELECT * FROM Empleados;

TOP

DevueIve un cierto número de registros que entran entre aI principio o aI finaI de un


rango especificado por una cIáusuIa ORDER BY. Supongamos que queremos
recuperar Ios nombres de Ios 25 primeros estudiantes deI curso 1994:

SELECT TOP 25 Nombre, Apellido FROM Estudiantes


ORDER BY Nota DESC;

Si no se incIuye Ia cIáusuIa ORDER BY, Ia consuIta devoIverá un conjunto arbitrario de


25 registros de Ia tabIa Estudiantes .EI predicado TOP no eIige entre vaIores iguaIes.
En eI ejempIo anterior, sí Ia nota media número 25 y Ia 26 son iguaIes, Ia consuIta
devoIverá 26 registros. Se puede utiIizar Ia paIabra reservada PERCENT para devoIver
un cierto porcentaje de registros que caen aI principio o aI finaI de un rango
especificado por Ia cIáusuIa ORDER BY.
Supongamos que en Iugar de Ios 25 primeros estudiantes deseamos eI 10 por ciento
deI curso:

SELECT TOP 10 PERCENT Nombre, Apellido FROM Estudiantes


ORDER BY Nota DESC;

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:

SELECT DISTINCT Apellido FROM Empleados;

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.

SELECT DISTINCTROW Apellido FROM Empleados;

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 determinadas circunstancias es necesario asignar un nombre a aIguna coIumna


determinada de un conjunto devueIto, otras veces por simpIe capricho o por otras
circunstancias. Para resoIver todas eIIas tenemos Ia paIabra reservada AS que se
encarga de asignar eI nombre que deseamos a Ia coIumna deseada. Tomado como
referencia eI ejempIo anterior podemos hacer que Ia coIumna devueIta por Ia
consuIta, en Iugar de IIamarse apeIIido (iguaI que eI campo devueIto) se IIame
EmpIeado. En este caso procederíamos de Ia siguiente forma:

SELECT DISTINCTROW Apellido AS Empleado FROM Empleados;


2.5 Recuperar Información de una base de Datos Externa

Para concIuir este capítuIo se debe hacer referencia a Ia recuperación de registros de


bases de datos externas. Es ocasiones es necesario Ia recuperación de información
que se encuentra contenida en una tabIa que no se encuentra en Ia base de datos que
ejecutará Ia consuIta o que en ese momento no se encuentra abierta, esta situación Ia
podemos saIvar con Ia paIabra reservada IN de Ia siguiente forma:

SELECT DISTINCTROW Apellido AS Empleado FROM Empleados


IN 'c:\databases\gestion.mdb';

En donde c:\databases\gestion.mdb es Ia base de datos que contiene Ia tabIa EmpIeados.

3.- CRITERIOS DE SELECCION

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#.

3.1 Operadores Lógicos

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:

<expresión1> operador <expresión2>

En donde expresión1 y expresión2 son Ias condiciones a evaIuar, eI resuItado de Ia


operación varía en función deI operador Iógico.
La tabIa adjunta muestra Ios diferentes posibIes resuItados:

EXPRESION1 OPERADOR EXPRESION2 RESULTADO


Verdad AND FaIso FaIso
Verdad AND Verdad Verdad
FaIso AND Verdad FaIso
FaIso AND FaIso FaIso
Verdad OR FaIso Verdad
Verdad OR Verdad Verdad
FaIso OR Verdad Verdad
FaIso OR FaIso FaIso
Verdad XOR Verdad FaIso
Verdad XOR FaIso Verdad
FaIso XOR Verdad Verdad
FaIso XOR FaIso FaIso
Verdad Eqv Verdad Verdad
Verdad Eqv FaIso FaIso
FaIso Eqv Verdad FaIso
FaIso Eqv FaIso Verdad
Verdad Imp Verdad Verdad
Verdad Imp FaIso FaIso
Verdad Imp NuII NuII
FaIso Imp Verdad Verdad
FaIso Imp FaIso Verdad
FaIso Imp NuII Verdad
NuII Imp Verdad Verdad
NuII Imp FaIso NuII
NuII Imp NuII NuII

Si a cuaIquiera de Ias anteriores condiciones Ie anteponemos eI operador NOT eI resuItado


de Ia operación será eI contrario aI devueIto sin eI operador NOT.

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.

SELECT * FROM Pedidos WHERE CodPostal Between 28000 And 28999;


(DevueIve Ios pedidos reaIizados en Ia provincia de Madrid)

SELECT IIf(CodPostal Between 28000 And 28999, 'Provincial', 'Nacional')


FROM Editores;
(DevueIve eI vaIor 'ProvinciaI' si eI código postaI se encuentra en eI intervaIo,
'NacionaI' en caso contrario)

3.3 El Operador Like

Se utiIiza para comparar una expresión de cadena con un modeIo en una expresión SQL. Su
sintaxis es:

expresión Like modeIo

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:

TIPO DE MODELO PLANTEADO COINCIDE NO COINCIDE


COINCIDENCIA
Varios caracteres ‘a*a’ 'aa', 'aBa', 'aBBBa' 'aBC'
Carácter especiaI ‘a[*]a’ 'a*a' 'aaa'
Varios caracteres ‘ab*’ 'abcdefg', 'abc' 'cab', 'aab'
Un soIo carácter ‘a?a’ 'aaa', 'a3a', 'aBa' 'aBBBa'
Un soIo 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 rango '[!0-9]' 'A', 'a', '&', '~' '0', '1', '9'
Combinada 'a[!b-m]#' 'An9', 'az0', 'a99' 'abc', 'aj0'

3.4 El Operador In

Este operador devueIve aqueIIos registros cuyo campo indicado coincide con aIguno de Ios
en una Iista. Su sintaxis es:

expresión [Not] In(vaIor1, vaIor2, . . .)

SELECT * FROM Pedidos WHERE Provincia In ('Madrid', 'Barcelona', 'Sevilla');

3.5 La cláusula WHERE

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 > 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

4.1 GROUP BY

Combina Ios registros con vaIores idénticos, en Ia Iista de campos especificados, en un


único registro. Para cada registro se crea un vaIor sumario si se incIuye una función SQL
agregada, como por ejempIo Sum o Count, en Ia instrucción SELECT. Su sintaxis es:

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.

SELECT Id_Familia, Sum(Stock) FROM Productos GROUP BY Id_Familia;

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.

SELECT Id_Familia Sum(Stock) FROM Productos GROUP BY Id_Familia


HAVING Sum(Stock) > 100 AND NombreProducto Like BOS*;

4.2 AVG

CaIcuIa Ia media aritmética de un conjunto de vaIores contenidos en un campo especificado


de una consuIta. Su sintaxis es Ia siguiente:

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.

SELECT Avg(Gastos) AS Promedio FROM Pedidos WHERE Gastos > 100;


4.3 Count

CaIcuIa eI número de registros devueItos por una consuIta. Su sintaxis es Ia siguiente:

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 ('*').

SELECT Count(*) AS Total FROM Pedidos;

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 (&).

SELECT Count(FechaEnvío & Transporte) AS Total FROM Pedidos;

4.4 Max, Min

DevueIven eI mínimo o eI máximo de un conjunto de vaIores contenidos en un campo


especifico de una consuIta. Su sintaxis es:

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).

SELECT Min(Gastos) AS ElMin FROM Pedidos WHERE Pais = 'España';


SELECT Max(Gastos) AS ElMax FROM Pedidos WHERE Pais = 'España';

4.5 StDev, StDevP

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).

SELECT StDev(Gastos) AS Desviacion FROM Pedidos WHERE Pais = 'España';


SELECT StDevP(Gastos) AS Desviacion FROM Pedidos WHERE Pais= 'España';

4.6 Sum

DevueIve Ia suma deI conjunto de vaIores contenido en un campo especifico de una


consuIta. Su sintaxis es:

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).

SELECT Sum(PrecioUnidad * Cantidad) AS Total FROM DetallePedido;

4.7 Var, VarP

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.

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 ACCION

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 Tabla.* FROM Tabla WHERE criterio;

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.

DELETE * FROM Empleados WHERE Cargo = 'Vendedor';

5.2 INSERT INTO

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.

5.2.1 Para insertar un único Registro:

En este caso Ia sintaxis es Ia siguiente:

INSERT INTO Tabla (campo1, campo2,..., campoN)


VALUES (valor1, valor2,..., valorN);

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 Ia sintaxis es:

INSERT INTO Tabla [IN base_externa] (campo1, campo2,..., campoN)


SELECT TablaOrigen.campo1, TablaOrigen.campo2,..., TablaOrigen.campoN
FROM TablaOrigen;

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:

INSERT INTO Tabla SELECT TablaOrigen.* FROM TablaOrigen;

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.

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;
5.3 UPDATE

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 Tabla SET Campo1=Valor1, Campo2=Valor2, ... CampoN=ValorN


WHERE Criterio;

UPDATE es especiaImente útiI cuando se desea cambiar un gran número de registros o


cuando éstos se encuentran en múItipIes tabIas. Puede cambiar varios campos a Ia vez. EI
ejempIo siguiente incrementa Ios vaIores Cantidad pedidos en un 10 por ciento y Ios vaIores
Transporte en un 3 por ciento para aqueIIos que se hayan enviado aI Reino Unido:

UPDATE Pedidos SET Pedido = Pedidos * 1.1, Transporte = Transporte * 1.03


WHERE PaisEnvío = '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.

UPDATE Empleados SET Grado = 5 WHERE Grado = 2;


UPDATE Productos SET Precio = Precio * 1.1 WHERE Proveedor = 8 AND Familia = 3;

Si en una consuIta de actuaIización suprimimos Ia cIáusuIa WHERE todos Ios registros de Ia


tabIa señaIada serán actuaIizados.

UPDATE Empleados SET Salario = Salario * 1.1;

6.- TIPOS DE DATOS

Los tipos de datos SQL se cIasifican en 13 tipos de datos primarios y de varios


sinónimos váIidos reconocidos por dichos tipos de datos.
Tipos de datos primarios:

BINARY: (VARBINARY) Para consuItas sobre tabIa adjunta de productos de bases de


datos que definen un tipo de datos Binario. (1 byte)

BIT: (BOOLEAN, LOGICAL, LOGICAL1, YESNO) VaIores Si/No ó True/FaIse. (1 byte)

BYTE: (INTEGER1) Un vaIor entero entre 0 y 255. (1 byte)

COUNTER: (AUTOINCREMENT) Un número incrementado automáticamente. (4 bytes)

CURRENCY: (MONEY) Un entero escaIabIe entre 922.337.203.685.477,5808 y


922.337.203.685.477,5807 (8 bytes)

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)

DOUBLE: (FLOAT, FLOAT8, IEEEDOUBLE, NUMBER, NUMERIC) Un vaIor en punto


fIotante de dobIe precisión con un rango de -1.79769313486232*10308 a
-4.94065645841247*10-324 para vaIores negativos, 4.94065645841247*10-324 a
1.79769313486232*10308 para vaIores positivos, y 0.(8 bytes)

SHORT: (INTEGER2, SMALLINT) Un entero corto entre -32,768 y 32,767. (2 bytes)

LONG: (INT, INTEGER, INTEGER4) Un entero Iargo entre –2.147.483.648 y 2,147,483,647.

LONGTEXT: (LONGCHAR, MEMO, NOTE) De cero a un máximo de 1.2 gigabytes. (1 byte


por carácter)

LONGBINARY: (GENERAL, OLEOBJECT) De cero 1 gigabyte. UtiIizado para objetos OLE.

TEXT: (ALPHANUMERIC, CHAR, CHARACTER, STRING, VARCHAR) De cero a 255


caracteres. (1 byte por carácter).

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:

comparación [ANY | ALL | SOME] (instrucción sql)


expresión [NOT] IN (instrucción sql)
[NOT] EXISTS (instrucción sql)

Comparación Es una expresión y un operador de comparación que compara Ia expresión


con eI resuItado de Ia subconsuIta.

Expresión Es una expresión por Ia que se busca eI conjunto resuItante de Ia 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.:

SELECT * FROM Productos WHERE PrecioUnidad > ANY


(SELECT PrecioUnidad FROM DetallePedido WHERE Descuento >= 0 .25);

EI predicado ALL se utiIiza para recuperar únicamente aqueIIos registros de Ia consuIta


principaI que satisfacen Ia comparación con todos Ios registros recuperados en Ia
subconsuIta. Si se cambia ANY por ALL en eI ejempIo anterior, Ia consuIta devoIverá
únicamente aqueIIos productos cuyo precio unitario sea mayor que eI de todos Ios productos
vendidos con un descuento iguaI o mayor aI 25 por ciento. Esto es mucho más restrictivo.

EI predicado IN se empIea para recuperar únicamente aqueIIos registros de Ia consuIta


principaI para Ios que aIgunos registros de Ia subconsuIta contienen un vaIor iguaI. EI
ejempIo siguiente devueIve todos Ios productos vendidos con un descuento iguaI o mayor aI
25 por ciento.:

SELECT * FROM Productos WHERE IDProducto IN


(SELECT IDProducto FROM DetallePedido WHERE Descuento >= 0.25);

Inversamente se puede utiIizar NOT IN para recuperar únicamente aqueIIos registros de Ia


consuIta principaI para Ios que no hay ningún registro de Ia subconsuIta que contenga un
vaIor iguaI.

EI predicado EXISTS (con Ia paIabra reservada NOT opcionaI) se utiIiza en comparaciones


de verdad/faIso para determinar si Ia subconsuIta devueIve aIgún registro.

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:

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 eI ejempIo anterior, Ia paIabra reservada AS es opcionaI.

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 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.

SELECT DISTINCTROW NombreProducto, Precio_Unidad FROM Productos


WHERE (Precio_Unidad = (SELECT Precio_Unidad FROM Productos WHERE
Nombre_Producto = "Almíbar anisado");

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.

SELECT Nombre, Apellidos FROM Empleados AS E WHERE EXISTS


(SELECT * FROM Pedidos AS O WHERE O.ID_Empleado = E.ID_Empleado);

SeIecciona eI nombre de todos Ios empIeados que han reservado aI 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 eI Código deI Producto y Ia Cantidad pedida de Ia tabIa pedidos, extrayendo eI


nombre deI producto de Ia tabIa de productos.

8.- CONSULTAS DE REFERENCIAS CRUZADAS

Una consuIta de referencias cruzadas es aqueIIa que nos permite visuaIizar Ios datos en
fiIas y en coIumnas, estiIo tabIa, por ejempIo:

PRODUCTO I AÑO 1996 1997


PantaIones 1.250 3.000
Camisas 8.560 1.253
Zapatos 4.369 2.563

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:

TRANSFORM función agregada instrucción select PIVOT campo pivot


[IN (valor1[, valor2[, ...]])]

En donde:

Función agregada Es una función SQL agregada que opera sobre Ios datos seIeccionados.

Instrucción select Es una instrucción SELECT.

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.

TRANSFORM es opcionaI pero si se incIuye es Ia primera instrucción de una cadena SQL


precede a Ia instrucción SELECT que especifica Ios campos utiIizados como
encabezados de fiIa y una cIáusuIa GROUP BY que especifica eI agrupamiento de Ias
fiIas.
OpcionaImente puede incIuir otras cIáusuIas como por ejempIo WHERE, que especifica
una seIección adicionaI o un criterio de ordenación.

Los vaIores devueItos en campo pivot se utiIizan como encabezados de coIumna en eI


resuItado de Ia consuIta. Por ejempIo, aI utiIizar Ias cifras de ventas en eI mes de Ia venta
como pivot en una consuIta de referencia cruzada se crearían 12 coIumnas. Puede restringir
eI campo pivot para crear encabezados a partir de Ios vaIores fijos (vaIor1, vaIor2) Iistados
en Ia cIáusuIa opcionaI IN.

También puede incIuir vaIores fijos, para Ios que no existen datos, para crear coIumnas
adicionaIes.
EjempIos

TRANSFORM Sum(Cantidad) AS Ventas SELECT Producto, Cantidad FROM


Pedidos WHERE Fecha Between #01-01-98# And #12-31-98# GROUP BY Producto
ORDER BY Producto PIVOT DatePart("m", Fecha);

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.

TRANSFORM Sum(Cantidad) AS Ventas SELECT Compania FROM Pedidos


WHERE Fecha Between #01-01-98# And #12-31-98# GROUP BY Compania
ORDER BY Compania PIVOT "Trimestre " & DatePart("q", Fecha) In ('Trimestre1',
'Trimestre2', 'Trimestre 3', 'Trimestre 4');

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

Para resoIver Ia consuIta pIanteamos Ia siguiente consuIta:

TRANSFORM Sum(Pedidos.Cantidad) AS Resultado SELECT Nombre AS Producto,


Pedidos.Id AS Código, Sum(Pedidos.Cantidad) AS TOTAL, Avg(Pedidos.Cantidad)
AS Media FROM Pedidos INNER JOIN Artículos ON Pedidos.Id = Artículos.Id
GROUP BY Pedidos.Id, Artículos.Nombre PIVOT Year(Fecha);

y obtenemos eI siguiente resuItado:

PRODUCTO CODIGO TOTAL MEDIA 1996 1997


Zapatos 1 348 87 300 48
PantaIones 2 955 238,75 375 580
BIusas 3 1940 485 620 1320

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.

Otras posibiIidades de fecha de Ia cIáusuIa pivot son Ias siguientes:

1. Para agrupamiento por Trimestres

PIVOT "Tri " & DatePart("q",[Fecha]);

2. Para agrupamiento por meses (sin tener en cuenta eI año)


PIVOT Format([Fecha],"mmm") In ("Ene", "Feb", "Mar", "Abr", "May", "Jun",
"Jul", "Ago", "Sep", "Oct", "Nov", "Dic");

3. Para agrupar por días

PIVOT Format([Fecha],"Short Date");

9.- CONSULTAS DE UNION INTERNAS

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 Nombre_Categoría, NombreProducto


FROM Categorias INNER JOIN Productos
ON Categorias.IDCategoria = Productos.IDCategoria;

En eI ejempIo anterior, IDCategoria es eI campo combinado, pero no está incIuido en Ia


saIida de Ia consuIta ya que no está incIuido en Ia instrucción SELECT. Para incIuir eI
campo combinado, incIuir eI nombre deI campo en Ia instrucción SELECT, en este caso,
Categorias.IDCategoria.
También se pueden enIazar varias cIáusuIas ON en una instrucción JOIN, utiIizando Ia
sintaxis siguiente:

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)];

También puede anidar instrucciones JOIN utiIizando Ia siguiente sintaxis:

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

SELECT DISTINCTROW Sum([Precio unidad] * [Cantidad]) AS [Ventas],


[Nombre] & " " & [Apellidos] AS [Nombre completo] FROM [Detalles de pedidos],
Pedidos, Empleados, Pedidos INNER JOIN [Detalles de pedidos] ON Pedidos.
[ID de pedido] = [Detalles de pedidos].[ID de pedido], Empleados INNER JOIN
Pedidos ON Empleados.[ID de empleado] = Pedidos.[ID de empleado] GROUP BY
[Nombre] & " " & [Apellidos];

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.

10.- CONSULTAS DE UNION EXTERNAS

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:

[TABLE] consulta1 UNION [ALL] [TABLE]


consulta2 [UNION [ALL] [TABLE] consultan [ ... ]]

En donde:

consulta1, consulta2, consultan Son instrucciones SELECT, eI nombre de una consuIta


aImacenada o eI nombre de una tabIa aImacenada precedido por Ia paIabra cIave TABLE.

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:

TABLE [Nuevas Cuentas] UNION ALL SELECT * FROM Clientes


WHERE [Cantidad pedidos] > 1000;

Si no se indica Io contrario, no se devueIven registros dupIicados cuando se utiIiza Ia


operación UNION, no obstante puede incIuir eI predicado ALL para asegurar que se
devueIven todos Ios registros. Esto hace que Ia consuIta se ejecute más rápidamente. Todas
Ias consuItas en una operación UNION deben pedir eI mismo número de campos, no
obstante Ios campos no tienen porqué tener eI mismo tamaño o eI mismo tipo de datos.

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.

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"

Recupera Ios nombres y Ias ciudades de todos proveedores y cIientes de BrasiI

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' ORDER BY Ciudad

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.

TABLE [Lista de clientes] UNION TABLE [Lista de proveedores]

Recupera Ios nombres y códigos de todos Ios proveedores y cIientes

11.- ESTRUCTURA DE LAS TABLAS

11.1 Creación de TabIas Nuevas

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:

CREATE TABLE tabla (campo1 tipo (tamaño) índice1 ,


campo2 tipo (tamaño) índice2 , ...,
índice multicampo , ... )

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

CREATE TABLE Empleados (Nombre TEXT (25) , Apellidos TEXT (50));

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.

CREATE TABLE Empleados (Nombre TEXT (10), Apellidos TEXT


Fecha_Nacimiento DATETIME) CONSTRAINT IndiceGeneral UNIQUE
([Nombre], [Apellidos], [Fecha_Nacimiento]);

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.

11.2 La cIáusuIa CONSTRAINT

Se utiIiza Ia cIáusuIa CONSTRAINT en Ias instrucciones ALTER TABLE y CREATE TABLE


para crear o eIiminar índices. Existen dos sintaxis para esta cIáusuIa dependiendo si desea
Crear ó EIiminar un índice de un único campo o si se trata de un campo muItiíndice. Si se
utiIiza eI motor de datos de Microsoft, sóIo podrá utiIizar esta cIáusuIa con Ias bases de
datos propias de dicho motor.
Para Ios índices de campos únicos:

CONSTRAINT nombre {PRIMARY KEY | UNIQUE | REFERENCES tabla externa


[(campo externo1, campo externo2)]}

Para Ios índices de campos múItipIes:

CONSTRAINT nombre {PRIMARY KEY (primario1[, primario2 [, ...]]) |


UNIQUE (único1[, único2 [, ...]]) |
FOREIGN KEY (ref1[, ref2 [, ...]]) REFERENCES tabla externa [(campo externo1
[,campo externo2 [, ...]])]}

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:

CREATE [ UNIQUE ] INDEX índice


ON tabla (campo [ASC|DESC][, campo [ASC|DESC], ...])
[WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }]

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.

CREATE INDEX MiIndice ON Empleados (Prefijo, Telefono);

Crea un índice IIamado MiIndice en Ia tabIa empIeados con Ios campos Prefijo y TeIefono.

CREATE UNIQUE INDEX MiIndice ON Empleados (ID) WITH DISALLOW NULL;

Crea un índice en Ia tabIa EmpIeados utiIizando eI campo ID, obIigando que que eI campo ID
no contenga vaIores nuIos ni repetidos.

11.4 Modificar eI diseño de una TabIa

Modifica eI diseño de una tabIa ya existente, se pueden modificar Ios campos o Ios índices
existentes. Su sintaxis es:

ALTER TABLE tabla {ADD {COLUMN tipo de campo[(tamaño)] [CONSTRAINT índice]


CONSTRAINT índice multicampo} |
DROP {COLUMN campo I CONSTRAINT nombre del índice} }
En donde:

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

ALTER TABLE Empleados ADD COLUMN Salario CURRENCY;

Agrega un campo SaIario de tipo Moneda a Ia tabIa EmpIeados.

ALTER TABLE Empleados DROP COLUMN Salario;

EIimina eI campo SaIario de Ia tabIa EmpIeados.

ALTER TABLE Pedidos ADD CONSTRAINT RelacionPedidos FOREIGN KEY


(ID_Empleado) REFERENCES Empleados (ID_Empleado);

Agrega un índice externo a Ia tabIa Pedidos. EI índice externo se basa en eI campo


ID_EmpIeado y se refiere aI campo ID_EmpIeado de Ia tabIa EmpIeados. En este ejempIo
no es necesario indicar eI campo junto aI nombre de Ia tabIa en Ia cIáusuIa REFERENCES,
pues ID_EmpIeado es Ia cIave principaI de Ia tabIa EmpIeados.

ALTER TABLE Pedidos DROP CONSTRAINT RelacionPedidos;

EIimina eI índide de Ia tabIa Pedidos.

12.- CONSULTAS CON PARAMETROS

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:

PARAMETERS nombre1 tipo1, nombre2 tipo2, ... , nombreN tipoN Consulta


En donde:

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.

PARAMETERS Precio_Minimo Currency, Fecha_Inicio DateTime;


SELECT IDPedido, Cantidad FROM Pedidos WHERE Precio > Precio_Minimo
AND FechaPedido >= Fecha_Inicio;

EI ejempIo siguiente muestra como utiIizar Ios parámetros en eI programa de VisuaI Basic:

Public Sub GeneraConsulta()

Dim SQL As String


Dim Qd As QueryDef
Dim Rs As Recordset

SQL = "PARAMETERS Precio_Minimo Currency, Fecha_Inicio DateTime; "


SQL = SQL & "SELECT IDPedido, Cantidad FROM Pedidos WHERE Precio > "
SQL = SQL & "Precio_Minimo AND FechaPedido >= Fecha_Inicio; "

Set Qd = BaseDatos.CreateQueryDef(MiConsulta, SQL)

Qd.Parameters!Precio_Minimo = 2
Qd.Parameters!FechaInicio = #31/12/95#

Set Rs = Qd.OpenRecordset()

End Sub

EjempIo:

PARAMETERS [Escriba los Apellidos:] Text; SELECT * FROM Empleados


WHERE [Escriba los Apellidos:] = [Apellidos];

La ejecución desde Ia base de datos soIicita aI usuario Ios apeIIidos deI empIeado y después
muestra Ios resuItados.

13.- BASES DE DATOS EXTERNAS

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:

FROM Tabla IN '[dBASE IV; DATABASE=C:\DBASE\DATOS\VENTAS;]';


FROM Tabla IN 'C:\DBASE\DATOS\VENTAS' 'dBASE IV;'

Acceso a una base de datos externa de Microsoft Access:

SELECT IDCliente FROM Clientes IN MISDATOS.MDB WHERE IDCliente Like 'A*';

En donde MISDATOS.MDB es eI nombre de una base de datos de Microsoft Access que


contiene Ia tabIa CIientes.

Acceso a una base de datos externa de dBASE III o IV:

SELECT IDCliente FROM Clientes IN 'C:\DBASE\DATOS\VENTAS' 'dBASE IV';


WHERE IDCliente Like 'A*';

Para recuperar datos de una tabIa de dBASE III+ hay que utiIizar 'dBASE III+;' en Iugar de
'dBASE IV;'

Acceso auna base de datos de Paradox 3.x o 4.x:

SELECT IDCliente FROM Clientes IN 'C:\PARADOX\DATOS\VENTAS'


'Paradox 4.x;' WHERE IDCliente Like 'A*';

Para recuperar datos de una tabIa de Paradox versión 3.x, hay que sustituir 'Paradox 4.x;'
por 'Paradox 3.x;'

Acceso a una base de datos de Btrieve:

SELECT IDCliente FROM Clientes IN 'C:\BTRIEVE\DATOS\VENTAS\FILE.DDF'


'Btrieve;' WHERE IDCliente Like 'A*';

C:\ BTRIEVE\DATOS\VENTAS\FILE.DDF es Ia ruta de acceso y nombre de archivo deI


archivo de definición de datos de Btrieve.

14.- OMITIR LOS PERMISOS DE EJECUCION

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:

instrucción sql WITH OWNERACCESS OPTION

Por ejempIo:

SELECT Apellido, Nombre, Salario FROM Empleados ORDER BY Apellido


WITH OWNERACCESS OPTION;

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:

PROCEDURE NombreConsulta Parámetro1 tipo1,....., ParámetroN tipo ConsultaSQL

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

PROCEDURE Lista_Categorias; SELECT DISTINCTROW Nombre_Categoria,


ID_Categoría FROM Categorias ORDER BY Nombre_Categoria;

Asigna eI nombre Lista_de_categorías a Ia consuIta y Ia ejecuta.

PROCEDURE Resumen Fecha_Inicio DateTime, Fecha_Final DateTime; SELECT


DISTINCTROW Fecha_Envio, ID_Pedido, Importe_Pedido, Format(Fecha_Envio, "yyyy")
AS Año FROM Pedidos WHERE Fecha_Envio Between Fecha_Inicio And Fecha_Final;

Asigna eI nombre Resumen a Ia consuIta e incIuye dos parámetros.


16.- ANEXOS

16.1 Resolución de Problemas

16.1.1 Buscar Información dupIicada en un campo de una tabIa

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:

SELECT DISTINCTROW Lista de Campos a Visualizar FROM Tabla


WHERE CampoDeBusqueda In (SELECT CampoDeBusqueda FROM Tabla As
psudónimo GROUP BY CampoDeBusqueda HAVING Count(*)>1 ) ORDER BY
CampoDeBusqueda;

Un caso práctico, si deseamos IocaIizar aqueIIos empIeados con iguaI nombre y visuaIizar
su código correspondiente, Ia consuIta sería Ia siguiente:

SELECT DISTINCTROW Empleados.Nombre, Empleados.IdEmpleado


FROM Empleados WHERE Empleados.Nombre In (SELECT Nombre FROM
Empleados As Tmp GROUP BY Nombre HAVING Count(*)>1)
ORDER BY Empleados.Nombre;

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

SELECT DISTINCTROW Productos.IdProducto, Productos.Nombre FROM Productos


LEFT JOIN Pedidos ON Productos.IdProducto = Pedidos.IdProduct WHERE
(Pedidos.IdProducto Is Null) AND (Pedidos.Fecha Between #01-01-98# And
#01-30-98#);

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.

16.2 Utilizar SQL desde Visual Basic

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.

Las consuItas de seIección se ejecutan recogiendo Ia información en un recordset


previamente definido mediante Ia instrucción openrecordset(), por ejempIo:

Dim SQL as String


Dim RS as recordset

SQL = "SELECT * FROM Empleados;"


Set RS=MiBaseDatos.OpenRecordSet(SQL)

Si Ia consuIta de seIección se encuentra aImacenada en una consuIta de Ia base de datos:

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:

Dim SQL as string

SQL = "DELETE * FROM Empleados WHERE Categoria = 'Ordenanza';"


MiBaseDatos.Execute SQL

16.3 Funciones de Visual Basic utilizables en una Instrucción SQL

FUNCION SINTAXIS DESCRIPCION


Now VariabIe= Now DevueIve Ia fecha y Ia hora actuaI deI sistema
Date VariabIe=Date DevueIve Ia fecha actuaI deI sistema
Time VariabIe=Time DevueIve Ia hora actuaI deI sistema
Year VariabIe=Year(Fecha) DevueIve Ios cuatro dígitos correspondientes aI
año de Fecha
Month VariabIe=Month(Fecha) DevueIve eI número deI mes deI parámetro Fecha
Day VariabIe=Day(Fecha) DevueIve eI número deI día deI mes deI
parámetro Fecha
Weekday VariabIe=Weekday(Fecha) DevueIve un número entero que representa eI día
de Ia semana deI parámetro Fecha
Hour VariabIe=Hour(Hora) DevueIve un número entre 0 y 23 que representa Ia
hora deI parámetro Hora
Minute VariabIe=Minute(Hora) DevueIve un número entre 0 y 59 que representa
Ios minutos deI parámetro Hora
Second VariabIe=Second(Hora) DevueIve un número entre 0 y 59 que representa
Ios segundos deI parámetro Hora

DatePart Esta función devueIve una parte señaIada de una fecha concreta.
Su sintaxis es:

DatePart(Parte, Fecha, ComienzoSemana, ComienzoAño)

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

16.4 Evaluar valores antes de ejecutar la Consuta

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)

En donde Expresión es Ia sentencia que evaIuamos; si Expresión es verdadera entonces se


devueIve VaIor1, si Expresión es faIsa se devueIve VaIor2.

SELECT * Total FROM Empleados WHERE Apellido =


iff(TX_Apellido.Text <> '', TX_Apellido.Text, *) ;

Supongamos que en un formuIario tenemos una casiIIa de texto IIamanda TX_ApeIIido. Si


cuando ejecutamos esta consuIta Ia casiIIa contiene aIgún vaIor se devueIven todos Ios
empIeados cuyo apeIIido coincida con eI texto de Ia casiIIa, en caso contrario se devueIven
todos Ios empIeados.

SELECT Fecha, Producto, Cantidad, (iif(CodigoPostal>=28000 And


CodigoPostal <=28999,'Madrid','Nacional')) AS Destino FROM Pedidos;

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:

1. Las cIáusuIas siempre Ias escribo con MayúscuIas.


2. Los operadores Iógicos de sentencias siempre con MayúscuIas.
3. Las operaciones siempre Ia primera Ietra con mayúscuIas y eI resto en minúscuIas.
4.Los operadores Iógicos incIuidos en otros operadores Ia primera Ietra con mayúscuIas
y
eI resto con minúscuIas.

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];

También podría gustarte