Documentos de Académico
Documentos de Profesional
Documentos de Cultura
. Introducción al Sql
¿ Que es el Sql ?
Hace algunos año, empezó a dar aparición un sistema de getión de bases de datos, que se ha convertido en un estandar en la gestión de datos.
SQL son la iniciales de Structured Query Language, osea Consultas mediante Lenguaje Estructurado.
Aunque éste sistema de gestión de datos, debe estar disponible en aquellas máquinas donde deseemos trabajar bajo éste lenguaje, la mayoría de
los ordenadores ya tienen disponible dicho sistema de trabajo.
En la gestión de datos, es necesario utilizar un lenguaje que sea fácil, sencillo en manejo y rápido.
El Sql nos ofrece ampliamente dichas opciones mediante consultas generales bajo determinados parámetros que nosotros le especificamos.
Es en realidad un selector de datos, que conecta con la base de datos que le indicamos y se mueve uno a uno por todos los registros de la base
filtrando y analizando los datos para encontrar lo que nosotros le especificamos.
2. Tipos de Sql
El Sql es un lenguaje estructurado en instrucciones, que cumplen determinadas funciones dentro del propio lenguaje.
El motivo de que estén o no soportadas algunas de esas instrucciones, depende del tipo de gestor de sql, que tengamos o que vayamos a usar.
Dicho sistema de soporte de Sql, en realidad lo que nos ofrece es la gestión de una base de datos mediante Sql, a través de determinadas
instrucciones, que puede o no que estén disponibles.
Para averiguar que instrucciones tenemos disponibles para la gestión de datos, deberemos ir a la ayuda del propio sistema que vayamos a usar y
comprobar que instrucciones de Sql nos ofrece.
Cuando hablo de Sistema o gestor de Sql, me refiero a que sistema o lenguaje de programación vamos a usar, desde Visual Basic, C++, Delphi,
etc...
Cada uno de ellos y otros muchos, soportan el Sql, en determinadas instrucciones, que pueden ser todas las del propio sql o solo algunas de ellas.
Es por esto por lo que debemos consultar la ayuda técnica antes de programar un sistema basado en sql, pues puede que estemos intentando
usar instrucciones de sql que no nos permite por que no estén soportadas, y ello nos daría errores.
3. La orden Select
Como hemos visto en capítulos anteriores, el lenguaje sql ,está contenido por instrucciones que manejan los datos que contienen las bases de
datos.
Esta instrucción lo que hace es elegir un campo de la base de datos en concreto o seleccionar todos los campos, ejemplo:
El Select sería:
Select nombre : con esto seleccionamos el campo Nombre al cual despues le aplicamos una determinada instruccion, como buscar a los Jose,
Pedro, etc... , al igual en vez de poner nombre podemos elegir cualquiera de los otros campos de que se compone la base de datos.
Select *: Con esto seleccionamos todos los campos, indistintamente de cuantos campos tengamos, ya sean tres como antes o más, da igual el
número de campos, con esto los seleccionamos todos.
* Todos los sistemas que usan Sql , tieneTn esta instrucción disponible.
* La sintesis mínima de Select es Select * from Tabla, from se utiliza para especificar cual de las tablas es la que vamos a usar, si no conoce que
es una tabla, le aconsejo que vaya al curso de Base de Datos.
Con ésta orden hacemos lo siguiente, supongamos que tenemos un campo muy largo, como Fechaaltaafiliacion, como este campo tiene un
nombre muy largo, podemos asignarle una variable que sea mas pequeña, osea que sería:
Select Fechaaltaafiliacion as fealta from tabla , con esto conseguimos que la variable fealta que es más fácil de conocer, contenga los datos de
Fechaaltaafiliacion.
4. La orden From
From significa desde, con esta orden hacemos referencia a la tabla que vamos a usar, el formato seria asi:
Con esto especificamos que seleccionamos (select) todos (*) desde la tabla , la tabla sera sustitutida por el nombre de nuestra tabla o base de
datos, supongamos que tenemos una tabla llamada Clientes y que dentro tenemos los datos de todos nuestros clientes, para poder hacer uso de
ellas, hariamos esto:
Lo que hemos hecho es seleccionar con el Select todos los registros (clientes) que tiene la base de datos, pues le hemos puesto el asterisco (*)
que significa que lo coga todo, osea que cogeria todos los clientes que tuvieramos en ese momento dentro de la base de clientes, pues con el from
le decimos que de donde tiene que cogerlo todo es desde la base clientes.
5. La orden Where
Where significa donde y la usaremos para hacer referencia a algo en concreto dentro de un campo de la base de datos (tabla).
Esto como ya sabemos nos coge a todos los clientes que en ese momento haya dentro de la base de datos Clientes, pero y si nosotros
quisieramos solo los que se llamasen por ejemplo JUAN, tendriamos que cogerlos todos y tener que comprobarlos uno a uno y ver como se
llaman, pero con la clausula Where no es necesario, pues lo hace por nosotros.
Where solo necesita dos parametros, el nombre del campo donde tiene que buscar y lo que tiene que buscar, lo demas lo hace sola.
Entonces, en nuestra base de datos Clientes, tendriamos un campo que se llama Nombre y dentro de el, estan los nombre de cada uno de los
clientes en sus respectivas fichas.
Para sacar a aquellos que se llamasen JUAN, solo tendriamo que hacer esto:
Select * from clientes where nombre='JUAN', puede ser que en vez de estas comillas ', sean comillas dobles ", o tambien que no use comillas,
osea que ira el nombre directamente, esto depende del programa que estemos usando, pero no habra mas problemas al respecto.
Esta orden, lo que hace es coger uno a uno todos los clientes e ir comprobando que en el campo Nombre, se encuentre o no JUAN, si se
encuentra , entonces lo seleccionara para mostrarlo despues, si no estuviera dicho nombre entonces lo ignoraria, como es obvio el ahorro de
tiempo es muy grande.
Pero ademas, la clausula Where tiene unos parametros para hacer mas completo su uso:
INTRODUCCIÓN
Visual Basic es un lenguaje de programación de propósito general, con una gran potencia en toda
su estructura. Su implementación en el sistema operativo Windows y sus herramientas visuales,
han hecho de este lenguaje un líder indiscutible en lo que a desarrollo de aplicaciones se refiere.
Con la versión 3.0. se implementó la gestión de bases de datos a muy alto nivel, pudiendo
gestionar bases de datos de tipo Access, Paradox, dBASE, FoxPro, etc.
Este paso de gigante ha hecho de Visual Basic uno de los lenguajes favoritos por los
desarrolladores de aplicaciones de bases de datos, en especial el hecho de que Visual Basic
implemente el lenguaje SQL, uno de los más potentes y sencillos lenguajes de bases de datos.
¿ QUÉ ES SQL ?
He aquí una serie de consejos (a veces normas), que hay que tener en cuenta a la hora de escribir
mandatos SQL en nuestras aplicaciones en Visual Basic:
1. Un mandato en SQL se expresa en una cadena de caracteres o String.
2. Dicho mandato se puede escribir en la propiedad RecordSource de un control Data (más
adelante, podremos prescindir del control Data para realizar nuestras consultas), con el fin de
crear una consulta en la interfaz.
3. Los nombres de los campos especificados (y de las tablas), que contengan más de una palabra,
han de encerrarse entre corchetes ([nombre]). Como norma general, se suelen escribir siempre
entre corchetes.
4. Para especificar un determinado campo de una determinada tabla, se ha de escribir primero el
nombre de la tabla, un punto y, a continuación, el nombre del campo
(nombre_tabla.nombre_campo).
5. Al especificar una expresión de búsqueda, si ésta se refiere a una expresión de caracteres,
éstos han de encerrarse entre comillas, normalmente simples ('expresión_a_buscar').
6. Para especificar una fecha en una búsqueda, ésta debe encerrarse entre almohadillas o
pragmas (#fecha#).
7. Si se utiliza la propiedad RecordSource del control Data, para crear nuestras consultas en SQL,
tras introducir el mandato SQL (siempre como una expresión de cadena) es necesario refrescar el
control Data (control_data.Refresh).
El lenguaje SQL está compuesto por una serie de sentencias y de cláusulas muy reducidas en
número, pero muy potentes en efectividad. De entre todas las palabras, existen cuatro que son las
más utilizadas, estando compuestas por una sentencia y por tres cláusulas:
SELECT lista_campos FROM lista_tablas [WHERE criterios [ORDER BY lista_campos]]
LA SENTENCIA SELECT Y LA CLÁUSULA FROM
La sentencia SELECT "selecciona" los campos que comformarán la consulta, es decir, que
establece los campos que se visualizarán o compondrán la consulta. El parámetro 'lista_campo'
está compuesto por uno o más nombres de campos, separados por comas, pudiéncose especificar
también el nombre de la tabla a la cual pertenecen, seguido de un punto y del nombre del campo
correspondiente. Si el nombre del campo o de la tabla está compuesto de más de una palabra,
este nombre ha de escribirse entre corchetes ([nombre]). Si se desea seleccionar todos los
campos de una tabla, se puede utilizar el asterisco (*) para indicarlo.
Una sentencia SELECT no puede escribirse sin la cláusula FROM. Una cláusula es una extensión de
un mandato que complementa a una sentencia o instrucción, pudiendo complementar también a
otras sentencias. Es, por decirlo así, un accesorio imprescindible en una determinada máquina,
que puede también acoplarse a otras máquinas. En este caso, la cláusula FROM permite indicar en
qué tablas o en qué consultas (queries) se encuentran los campos especificados en la sentencias
SELECT. Estas tablas o consultas se separan por medio de comas (,), y, si sus nombres están
compuestos por más de una palabra, éstos se escriben entre corchetes ([nombre]).
He aquí algunos ejemplos de mandatos SQL en la estructura SELECT...FROM...:
SELECT nombre,apellidos FROM clientes;
Selecciona los campos 'nombre' y 'apellidos' de la tabla 'clientes'.
SELECT clientes.nombre, producto FROM clientes, productos;
Selecciona el campo 'nombre' de la tabla 'clientes', y el campo 'producto' de la tabla productos.
Hay que tener en cuenta que si dos tablas poseen el mismo nombre de campo (un 'nombre' de
cliente y un 'nombre' de producto, hay que especificar también la tabla a la cual pertenece dicho
campo, ya, que de lo contrario, seleccionaría ambos nombres).
SELECT pedidos.* FROM pedidos;
Selecciona todos los campos de la tabla 'pedidos'.
SELECT * FROM pedidos;
Selecciona todos los campos de la tabla 'pedidos'.
SELECT nombre, apellidos, telefono FROM clientes;
Selecciona los campos 'nombre', 'apellidos' y 'telefono' de la tabla 'clientes'. De esta manera
obtenemos una agenda telefónica de nuestros clientes.
SELECT [codigo postal] FROM [tabla morosos];
Selecciona el campo 'codigo postal' de la tabla 'tabla morosos'.
CLAÚSULA WHERE
La claúsula WHERE es opcional, y permite seleccionar qué registros aparecerán en la consulta (si
no se especifica aparecerán todos los registros). Para indicar este conjunto de registros se hace
uso de criterios o condiciones, que no es más que una comparación del contenido de un campo
con un determinado valor (este valor puede ser constante (valor predeterminado), el contenido de
un campo, una variable, un control, etc.).
He aquí algunos ejemplos que ilustran el uso de esta claúsula:
SELECT * FROM clientes WHERE nombre='ALFREDO';
Selecciona todos los campos de la tabla 'clientes', pero los registros de todos aquellos clientes que
se llamen 'ALFREDO'.
SELECT * FROM abonados WHERE provincia='MADRID' OR provincia='VALENCIA OR
provincia='BARCELONA';
Selecciona todos los campos de la tabla 'abonados', pero los registros de todos los abonados de
las provincias de 'MADRID', 'VALENCIA' o 'BARCELONA'.
SELECT nombre, apellidos FROM abonados WHERE edad>=18;
Selecciona los campos 'nombre' y 'apellidos' de la tabla abonados, escogiendo a aquellos abonados
que sean mayor de edad (a partir de 18 años).
SELECT * FROM abonados WHERE edad>=18 AND edad<=45;
Selecciona todos los abonados con edades comprendidas entre los 18 y los 45 años.
SELECT * FROM abonados WHERE edad BETWEEN 18 AND 45;
Selecciona todos los abonados con edades comprendidas entre los 18 y los 45 años.
SELECT * FROM diario WHERE fecha=#7/1/97#;
Selecciona los apuntes de 'diario' realizados el 1 de Julio de 1.997 (la fecha ha de indicarse en
inglés (mes/día/año)).
SELECT * FROM diario WHERE fecha<=#12/31/96#;
Selecciona los apuntes de 'diario' realizados antes del 1 de Enero de 1.997.
SELECT * FROM diario WHERE fecha BETWEEN #7/1/97# AND #7/31/97#;
Selecciona los apuntes de 'diario' realizados en Julio de 1.997.
SELECT * FROM clientes WHERE nombre LIKE 'AL*';
Selecciona los clientes cuyo nombre comience con los caracteres 'AL'.
SELECT * FROM clientes WHERE apellidos LIKE '*EZ';
Selecciona los clientes cuyos apellidos terminen con los caracteres 'EZ'.
SELECT * FROM clientes WHERE apellidos LIKE '*ZAMO*'
Selecciona los clientes cuyos apellidos contengan, en cualquier posición, los caracteres 'ZAMO'.
SELECT * FROM clientes WHERE provincia IN ('MADRID', 'BARCELONA', 'VALENCIA','TOLEDO',
'AVILA');
Selecciona todos los clientes de las provincias de MADRID, BARCELONA, VALENCIA, TOLEDO o
AVILA.
CLÁUSULA ORDER BY
La cláusula ORDER BY suele escribirse al final de un mandato en SQL. Dicha cláusula establece un
criterio de ordenación de los datos de la consulta, por los campos que se especifican en dicha
cláusula. La potencia de ordenación de dicha cláusula radica en la especificación de los campos por
los que se ordena, ya que el programador puede indicar cuál será el primer criterio de ordenación,
el segundo, etc., así como el tipo de ordenación por ese criterio: ascendiente o descendiente.
(...) ORDER BY campo1 [ASC/DESC][,campo2 [ASC/DESC]...]
La palabra reservada ASC es opcional e indica que el orden del campo será de tipo ascendiente (0-
9 A-Z), mientras que, si se especifica la palabra reservada DESC, se indica que el orden del campo
es descendiente (9-0 Z-A). Si no se especifica ninguna de estas palabras reservadas, la cláusula
ORDER BY toma, por defecto, el tipo ascendiente [ASC].
He aquí algunos ejemplos:
SELECT nombre, apellidos, telefono FROM clientes ORDER BY apellidos, nombre;
Crea una agenda telefónica de 'clientes' ordenada por 'apellidos' y 'nombre'.
SELECT * FROM pedidos ORDER BY fecha DESC;
Relación de 'pedidos' ordenados desde el más antiguo hasta el más moderno.
SELECT * FROM abonados ORDER BY apellidos, nombre, fecha_nacimiento DESC;
Relación de 'abonados' por 'apellidos' y 'nombre' ascendientemente, y por 'fecha_nacimiento' en
orden descendiente (del más viejo al más joven).
Gracias al control 'Data' podremos hacer nuestros primeros pinitos en SQL. Lo primero que hay
que tener en cuenta es que la consulta realizada en SQL posea los mismos campos que la interfaz
diseñada, y que los controles encargados de mostrar o modificar la base de datos, estén
perfectamente vinculados al control Data. Por ejemplo: realizamos una ficha de 'clientes', por lo
que diseñamos una interfaz con diversas Text Box vinculadas a un control Data que contendrá los
datos. Estas Text Box se vinculan gracias a las propiedades 'DataSource' y 'DataField'. La
propiedad 'DataSource' corresponde a la fuente de los datos, en este caso, el nombre del control
'Data'. En la propiedad 'DataField' se especifica el nombre del campo a tratar por cada Text Box
('nombre', 'direccion', 'nif', 'telefono', etc.). Por otro lado, en la propiedad 'DatabaseName' del
control 'Data', se ha de especificar la ruta completa de la base de datos (fichero .MDB), y la
propiedad 'RecordSource' se reservará para indicar, en una cadena o String, el mandato en SQL
correspondiente cuando sea necesario.
Siguiendo con este ejemplo, esta ficha se reservará para consultas determinadas, y la Form será
mostrada desde una Form anterior, desde la que se establece las condiciones de la consulta ('que
sean de Madrid', 'que hayan nacido antes de 1960', 'que habiten en Peñaranda de Bracamonte',
etc.). Se podría crear una variable de tipo String en un módulo, e insertar el mandato en SQL
correspondiente antes de llamar a la ficha. Al llamar a la ficha, la Form correspondiente tendrá un
evento Load, donde se insertará un código parecido a éste:
control_data.RecordSource = variable_SQL
control_data.Refresh
Obviamente, dependiendo del caso, la programación se hará diferente. Pero la norma común es
crear una interfaz en concreto, con unos campos concretos y, cuando sea necesario, establecer
como valor de la propiedad 'RecordSource' el mandato en SQL, y refrescar el control Data
correspondiente. De esta manera, el control Data contendrá el resultado de la consulta.
¿Quién no ha echado en falta el saber el total de ingresos o de gastos de esta fecha a esta otra?.
¿Quién no ha deseado saber la media de ventas de los comerciales en este mes?. ¡Tranquilos!: el
lenguaje SQL nos permitirá resolver estas y otras cuestiones de forma muy sencilla, ya que posee
una serie de funciones de carácter aritmético:
SUMAS O TOTALES
Para sumar las cantidades numéticas contenidas en un determinado campo, hemos de utilizar la
función SUM, cuya sintaxis es la siguiente:
SUM(expresión)
donde 'expresión' puede representar un campo o una operación con algún campo.
La función SUM retorna el resultado de la suma de la expresión indicada en todos los registros que
son afectados por la consulta. Veamos algunos ejemplos:
SELECT SUM(unidades) FROM pedidos;
Retorna el total de unidades pedidas (la suma de todos los valores almacenados en el campo
'unidades' de la tabla 'pedidos'). Este resultado se toma como un nuevo campo en el RecordSet.
SELECT SUM(ingresos-gastos) AS saldo FROM diario;
Retorna el saldo final de una tabla llamada 'diario'. Este resultado se toma como un nuevo campo
en el RecordSet y se le llama 'saldo'.
SELECT SUM(unidades) AS total FROM pedidos WHERE fecha=Now();
Retorna el total de unidades pedidas hoy. Este resultado se toma como un nuevo campo en el
RecordSet y se le llama 'total'.
PROMEDIOS O MEDIAS ARITMÉTICAS
Para averiguar el promedio de unas cantidades utilizaremos la función AVG, cuya sintaxis es la
siguiente:
AVG(expresión)
La función AVG retorna el promedio o media aritmética de la expresión especificada, en todos los
registros afectados por la consulta. Esto es lo mismo que realizar una suma (SUM) y, después,
dividir el resultado entre el número de registros implicados.
He aquí algunos ejemplos:
SELECT AVG(unidades) FROM PEDIDOS;
Retorna el promedio de unidades pedidas (la media de todos los valores almacenados en el campo
'unidades' de la tabla 'pedidos'). Este resultado se toma como un nuevo campo en el RecordSet.
SELECT AVG(ingresos-gastos) AS saldo_medio FROM diario;
Retorna el saldo medio de una tabla llamada 'diario'. Este resultado se toma como un nuevo
campo en el RecordSet y se le llama 'saldo_medio'.
SELECT AVG(unidades) AS media FROM pedidos WHERE fecha=Now();
Retorna el promedio de unidades pedidas hoy. Este resultado se toma como un nuevo campo en el
RecordSet y se le llama 'media'.
VALORES MÍNIMOS Y MÁXIMOS
También es posible conocer el valor mínimo o máximo de un campo, mediante las funciones MIN y
MAX, cuyas sintaxis son las siguientes:
MIN(expresión)
MAX(expresión)
He aquí algunos ejemplos:
SELECT MIN(unidades) AS minimo FROM pedidos;
Retorna el pedido más pequeño y lo refleja en el campo 'minimo'.
SELECT MAX(unidades) AS maximo FROM pedidos WHERE fecha=Now();
Retorna el pedido más grande de hoy y lo refleja en el campo 'maximo'.
SELECT MAX(gastos) AS maximo FROM diario;
Retorna el gasto más costoso reflejado en el diario contable, y lo representa en el campo
'maximo'.
CONTAR REGISTROS
Otra operación muy común es realizar un recuento de registros. Aunque a primera vista pueda
parecer poco práctico, la realidad es bien distinta. ¿Q quién no le gustaría conocer cuántos pedidos
se han realizado hoy?. ¿O comprobar cuántos pagos se han realizado por una determinada
cantidad?. ¿O saber cuántos clientes cumplen hoy años, se jubilan, son menores o mayores de
edad, tienen alguna deuda, viven en esta ciudad o en tal otra, tienen teléfono móvil, están
casados o solteros, etc.?. Para conocer cuántos registros hay utilizaremos la función COUNT, cuya
sintaxis es la siguiente:
COUNT(expresión)
La función COUNT retorna el número de registros indicados en la expresión.
He aquí algunos ejemplos:
SELECT COUNT(*) AS num_pedidos FROM pedidos WHERE fecha=Now();
Retorna el número de pedidos realizados hoy. Este resultado se toma como un nuevo campo en el
RecordSet y se le llama 'num_pedidos'.
SELECT COUNT(*) AS casados FROM clientes WHERE casado=True;
Retorna el número de clientes casados. Este resultado se toma como un nuevo campo y se le
llama 'casados'.
SELECT COUNT(*) AS num_pagos FROM diario WHERE gastos=25594;
Retorna el número de pagos por un importe equivalente a 25594. Este resultado se toma como un
nuevo campo en el RecordSet, y se le llama 'num_pagos'.
SELECT SUM(unidades) AS total, AVG(unidades) AS media, COUNT(*) AS registros,
MAX(unidades) AS maximo, MIN(unidades) AS minimo FROM pedidos WHERE fecha BETWEEN
#1/1/97# AND #6/30/97#;
Retorna el total, la media, el máximo y el mínimo de unidades pedidas, y el número de pedidos
realizados, durante el primer semestre de 1.997.
OMISIÓN DE REGISTROS DUPLICADOS
En una consulta podría ser útil omitir registros que estén duplicados. Por ejemplo, en nuestros
pedidos hay duplicación, puesto que un cliente realiza varios pedidos en el mismo día. Quizá
necesitemos una historia para conocer los días y los clientes que realizaron algún pedido, pero no
necesitaremos toda la lista, si no que nos diga, únicamente, mediante una línea, qué cliente
realizó algún pedido y en qué día. Para ello, utilizaremos el predicado DISTINCT, cuya sintaxis es
la siguiente:
SELECT DISTINCT lista_campos ...
El predicado DISTINCT omite aquellos registros duplicados en los campos especificados. En el
problema expuesto, utilizaremos la siguiente sentencia:
SELECT DISTINCT [codigo cliente],fecha FROM pedidos;
Si deseamos que la consulta sea más completa y nos visualice también el nombre y los apellidos
correspondientes del cliente en cuestión (estos datos están en la tabla 'clientes' y no en 'pedidos'),
escribiríamos este mandato:
SELECT DISTINCT pedidos.fecha, pedidos.[codigo cliente], clientes.nombre, clientes.apellidos
FROM pedidos, clientes WHERE clientes.[codigo cliente] = pedidos.[codigo cliente];
REEMPLAZAR DATOS
Imaginemos por un momento que el precio de los productos ha subido un 10%, y que tenemos
que actualizar nuestra tabla de productos con el nuevo importe. La solución más primitiva sería
acceder a la tabla y, el precio de cada prodcuto multiplicarlo por 1.1 y reemplazarlo a mano. Con
diez productos, la inversión de tiempo podría llegar al cuarto de hora, y no estaremos exentos de
fallos al tipear el importe o al realizar el cálculo en la calculadora. Si la tabla de productos
superase la cantidad de 100 productos (algo muy probable y fácil de cumplir), la cosa ya no es
una pequeña molestia y un poco de tiempo perdido.
El lenguaje SQL nos permite solucionar este problema en cuestión de pocos segundos, ya que
posee una sentencia llamada Update, que se ocupa de los cálculos y reemplazos. Su sintaxis es la
siguiente:
UPDATE lista_tablas SET campo=nuevo_valor [,campo=nuevo_valor] [WHERE...]
donde lista_tablas representa el nombre de las tablas donde se realizarán las sustituciones o
reemplazos. El parámetro campo indica el campo que se va a modificar, y el parámetro
nuevo_valor respresenta una expresión (constante, valor directo, un cálculo, etc.) cuyo resultado
o valor será el nuevo valor del campo.
En el problema expuesto anteriormente escribiríamos la siguiente sentencia:
UPDATE productos SET pvc=pvc*1.1;
Si este incremento de precio de costo debe afectar al precio de venta al público un 30% de
beneficio, podríamos escribir la siguiente línea para ahorrar trabajo y tiempo:
UPDATE productos SET pvc=pvc*1.1, pvp=pvp*1.3;
La sentencia UPDATE es muy versátil y potente, por lo que podemos realizar reemplazos
condicionantes, ya que permite la cláusula WHERE. De ello se deduce que - por ejemplo -, si se
desea bajar un 10% el importe del seguro a aquellos asegurados que cumplan más de dos años
de carnet de conducir, y que tengan más de 22 años de edad, tendríamos que escribir la siguiente
sentencia:
UPDATE asegurados SET importe=importe/1.1 WHERE edad>22 AND
YEAR(Now)-YEAR(expedicion)>2;
Pero ahí no queda la cosa, porque es posible utilizar varias tablas y sustituir el valor de un campo
de una de las tablas con el valor del campo de otra tabla, o bien reemplazar el valor de unos
campos de alguna tabla si el valor de los campos de otras tablas cumple una serie de requisitos.
Estos casos no son tan frecuentes, pero en el caso de haberlos se agradecerá un buen
planteamiento en el diseño inicial de la base de datos.
GRUPOS DE REGISTROS
A veces, puede ser necesario mostrar un resumen de los datos que tenemos, especificando el total
- por ejemplo -, de los ingresos y de los gastos de cada día, en lugar de visualizar todos los
ingresos y gastos realizados al detalle. Para llevar a cabo esta tarea hemos de tener en cuenta, en
primer lugar, bajo qué campo se van a agrupar los datos (en lo expuesto, sería el campo fecha),
y, a continuación, realizar la consulta mediante la cláusula GROUP BY, cuya sintaxis es la
siguiente:
SELECT ... FROM ... [WHERE ...] GROUP BY lista_campos
Básicamente, la cláusula GROUP BY agrupa o combina registros con idéntico valor en los campos
especificados, en un único registro. Esto significa que en un sólo registro se mostrará la
información común a muchos registros, como si dijésemos, al terminar las cuentas: "hoy se ha
ingresado tanto y se ha gastado tanto, con lo que hay un beneficio de tanto", sin necesidad de
especificar cada movimiento (cada ingreso, cada cobro, cada pago, cada factura, cada
transferencia bancaria, etc.).
Imaginemos que queremos hacer un resumen de nuestros pedidos, y queremos saber cuántos
pedidos y unidades han realizado cada uno de nuestros clientes. Para ello, se escribiría una
sentencia como ésta:
SELECT codigo_cliente, count(codigo_cliente) AS num_pedidos,
SUM(unidades) AS cantidad FROM pedidos GROUP BY codigo_cliente;
Para saber cuántos pedidos se realizaron cada día, escribiríamos esta línea:
SELECT fecha, count(fecha) AS num_pedidos FROM pedidos GROUP BY fecha;
Para conocer cuántas unidades se pidieron cada día, tipearíamos esta sentencia:
SELECT fecha, SUM(unidades) AS cantidad FROM pedidos GROUP BY fecha;
En la siguiente sentencia se muestra para cada cliente aquellos días en que se realizó un pedido,
resumiéndose el número de pedidos realizados así como el total de unidades pedidas:
SELECT fecha, codigo_cliente, COUNT(codigo_cliente) AS num_pedidos,
SUM(unidades) AS cantidad FROM pedidos GROUP BY fecha,
codigo_cliente HAVING fecha<#1/6/97#;
Como se puede apreciar, se ha especificado una condición a través de la cláusula HAVING, que
indica los criterios o condiciones a cumplir por los registros a visualizar en un agrupamiento. En
esta ocasión, la condición era de aquellos pedidos realizados antes del seis de Enero de 1.997.
Para conocer una estadítica de pedidos diaria, utilizaremos la siguiente sentencia:
SELECT fecha, COUNT(fecha) AS pedidos, SUM(unidades) AS subtotal,
MIN(unidades) AS minimo, MAX(unidades) AS maximo, AVG(unidades)
AS promedio FROM pedidos GROUP BY fecha;
Un resultado de ejemplo sería el siguiente:
FECHA PEDIDOS UNIDADES MINIMO MAXIMO PROMEDIO
----- ------- -------- ------ ------ --------
2/01/97 9 1599 2 1500 177,6
3/01/97 5 113 1 100 22,6
4/01/97 3 33 3 25 11,0
6/01/97 6 90 5 50 15,0
7/01/97 1 1 1 1 1,0
COMBINACIÓN DE DATOS
Las consultas realizadas hasta ahora requerían de una dosis de habilidad para conseguir crear un
conjunto de datos que tuviese información combinada de dos tablas. Pero, podemos combinar
datos de una manera mucho más sencilla y eficaz: mediante las operaciones JOIN, las cuales
permiten combinar datos de dos tablas. La operación JOIN más común es INNER JOIN, cuya
sintaxis es:
tabla1 INNER JOIN tabla2 ON tabla1.campo_común=tabla2.campo_común
donde tabla1 y tabla2 representan el nombre de las tablas a combinar. Ambas tablas han de tener
un campo común o igual para poder realizar correctamente la combinación de los datos. Pero
veamos un ejemplo para entenderlo mejor:
SELECT * FROM pedidos INNER JOIN clientes ON pedidos.codigo_cliente =
clientes.codigo_cliente;
El resultado será un conjunto de registros con los datos de las dos tablas. Este conjunto poseerá el
nombre de todos los campos de la tabla pedidos y de todos los campos de la tabla clientes. En
cada registro aparecerán los datos relacionados, es decir, que en un pedido aparecerán los datos
del mismo y los datos personales del cliente que realizó el pedido.
La operación INNER JOIN combina los datos de las dos tablas siempre que haya valores
coincidentes en los campos comunes o enlazados.
Existen también otras dos formas de combinar: LEFT JOIN y RIGHT JOIN. Ambas tienen la misma
sintaxis que INNER JOIN, pero estas operaciones incluyen todos los registros de una tabla y
aquellos registros de la otra en que los campos comunes sean iguales. En la operación LEFT JOIN,
incluye todos los registros de la primera tabla (parámetro tabla1) y aquellos registros de la
segunda tabla (parámetro tabla2) en que los campos comunes sean iguales. En la operación
RIGHT JOIN ocurre lo contrario: incluye todos los registros de la segunda tabla y aquellos registros
de la primera tabla en que los campos comunes sean iguales.
Aunque la diferencia entre las tres operaciones parezca inexistente, en realidad sí existe. La
operación INNER JOIN realiza una combinación con todos aquellos registros de las dos tablas en
que el campo común de ambas tenga el mismo valor, mientras que las operaciones LEFT JOIN y
RIGHT JOIN realizan la combinación de todos los registros de la tabla que combinan (ya sea la
primera para LEFT JOIN o la segunda para RIGHT JOIN), aunque en la otra tabla, en el campo
común no haya coincidencia. La prueba se ve rápidamente si se introduce un código de cliente en
el campo campo_cliente de la tabla pedidos que no exista:
SELECT * FROM pedidos INNER JOIN clientes ON pedidos.codigo_cliente =
clientes.codigo_cliente;
El registro que contiene el pedido del cliente que no existe no aparece, pueste que no hay
coincidencia. Si escribimos:
SELECT * FROM pedidos LEFT JOIN clientes ON pedidos.codigo_cliente =
clientes.codigo_cliente;
observaremos que aparecen todos los registros de la tabla pedidos, incluído aquel donde
indicamos que el pedido fue solicitado por el cliente inexistente, pero en los campos relacionados
(campos de la tabla clientes) no habrá ningún dato relacionado o combinado. Si ahora escribimos
lo siguiente:
SELECT * FROM pedidos LEFT JOIN clientes ON pedidos.codigo_cliente =
clientes.codigo_cliente;
obtendremos el mismo resultado que con la operación INNER JOIN, puesto que se visualizan todos
aquellos registros que existen en clientes y aquellos que coincidan con el campo clave en la tabla
pedidos. Como el código inexistente no existe en la tabla clientes, este registro no aparece. Para
comprobar el efecto aún mejor, modificar el código inexistente en el registro de la tabla pedidos
por uno que sí exista. Tras ello, volver a introducir las sentencias SQL para comprobar la
diferencia.
Lo más normal es utilizar la operación INNER JOIN para omitir aquellos registros no coincidentes,
aunque las operaciones LEFT JOIN y RIGHT JOIN nos pueden servir para descubrir entradas
erróneas en códigos.
Veamos algunos ejemplos más:
SELECT fecha, codigo_producto, unidades, apellidos, nombre FROM pedidos
INNER JOIN clientes ON pedidos.codigo_cliente =
clientes.codigo_cliente WHERE fecha<#1/6/97#;
Combina pedidos y clientes, visualizando aquellos pedidos realizados antes del 6 de Enero de 1997
por los campos fecha, codigo_producto, unidades, apellidos y nombre.
SELECT fecha, unidades, productos.* FROM pedidos INNER JOIN productos
ON pedidos.codigo_producto = productos.codigo_producto;
Combina pedidos y productos, visualizando los pedidos por los campos fecha y unidades, y por
todos los campos de la tabla productos.
SELECT fecha, unidades, productos.* FROM pedidos INNER JOIN productos
ON pedidos.codigo_producto = productos.codigo_producto ORDER BY
fecha, producto;
El resultado será el mismo que con el anterior ejemplo, salvo que la presentación de los registros
se realizará ordenada por la fecha y el nombre del producto.
SQL SERVER 7
El objetivo de esta investigación, es estudiar en forma concreta una
aplicación diseñada especialmente para operar dentro del ambiente de
las redes de computadoras, tal como lo es Microsoft SQL Server 7.0;
con el fin de poder conocer su arquitectura, las plataformas en las
cuales es capáz de operar,sus metodos de instalación, los
procedimientos necesarios para trabajar en él y los elementos por los
cuales se encuentra constituída dicha aplicación.
INTRODUCCIÓN
Figura 1
ARQUITECTURA CLIENTE / SERVIDOR:
TRANSACT - SQL:
Éste es una versión de SQL (Structured Query Languaje) usado como
lenguaje de programación para SQL Server. SQL es un conjunto de
comandos que permite especificar la información que se desea restaurar
o modificar. Con Transact – SQL se puede tener acceso a la
información, realizar búsquedas, actualizar y administrar sistemas de
Bases de Datos Relacionales.
PLATAFORMAS PARA SQL
Figura 2
Microsoft Windows NT Si Si
Workstation 4.0 y
posteriores
Microsoft Windows NT Si Si
Server 4.0 y
posteriores
Microsoft Windows NT Si Si
Server Enterprise
Edition 4.0 y
posteriores
Windows 3.X No Si
MS-DOS No Si
Internet browsers No Si
Tabla 1.
INTEGRACIÓN DE SQL CON MICROSOFT WINDOWS NT
SEGURIDAD:
SOPORTE MULTIPROCESADOR:
INTEGRACIÓN DE SQL CON MICROSOFT BACK OFFICE
Figura 3.
Tabla 2.
SERVICIOS DE SQL SERVER
Figura 4.
SERVICIO MSSQLServer:
SERVICIO SQLServerAgent:
SERVICIO MICROSOFT DISTRIBUTED TRANSACTION COORDIRATOR:
SOFTWARE DE SQL SERVER
HERRAMIENTA APLICACIÓN
GRÁFICA
Tabla 3.
ARQUITECTURA DE SQL SERVER
COMUNICACIÓN:
Figura 5.
SQL Server usa una arquitectura de comunicación por capas para aislar
aplicaciones internas de red y protocolos. Esta arquitectura permite
desplegar la misma aplicación en diferentes ambientes de red. Los
componentes en la arquitectura de comunicación incluyen:
DESARROLLO DE APLICACIONES:
Los usuarios accesan al SQL Server a través de una aplicación que está
escrita con una interfaz de objetos de datos o con una API. SQL Server
soporta interfaces comunes y APIs nativos de bajo nivel.
Una Base de Datos API define como escribir una aplicación para
conectar una Base de Datos y pasar comandos a la Base de Datos. SQL
Server provee soporte nativo para dos clases principales de Bases de
Datos API, lo cual define la interfaz de objetos de datos que se puede
usar. Las Bases de Datos API se usan para tener mayor control sobre el
comportamiento y desarrollo de las aplicaciones.
Figura 6.
ADMINISTRACIÓN:
Figura 7.
SEGURIDAD EN SQL SERVER
AUTENTIFICACIÓN DEL LOGIN:
Un usuario debe tener una cuenta para conectarse al SQL Server. Este
reconoce 2 mecanismos de autentificación: Autentificación de SQL
Server y de Windows NT. Cada uno tiene un diferente tipo de cuenta.
Figura 8.
MODO DE AUTENTIFICACIÓN:
Figura 9.
ROLES:
VALIDACIÓN DE PERMISOS:
Figura 10.
Cada SQL Server tiene dos tipos de Bases de datos: Bases de Datos del
Sistema y Bases de Datos del usuario. Las Bases de Datos del sistema
almacenan información acerca de SQL Server como un total. SQL Server
usa la Base de Datos del sistema para operar y administrar al sistema.
Las Bases de Datos de usuarios, son Bases de Datos creadas por los
usuarios. Una copia del SQL Server puede administra una o más Bases de
datos de usuario.
Figura 11.
INSTALANDO SQL SERVER
Computadora: DEC Alpha AXP y sistemas compatibles, Intel o
compatibles (Pentium 166 MHz o superior, Pentium PRO, o Pentium II).
- Memoria: 32 MB de RAM.
TÍPICA:
PERSONALIZADA:
Windows\Sqlstp.log
C:\Mssql7\Log\Errorlog
C:\Mssql7\Install\Cnfgsvr.out
INSTALACIÓN REMOTA:
La primera pantalla de instalación de SQL
Server da la opción de realizar una instalación remota, pero los
prerequisitos deben estar previamente instalados en la computadora
remota.
Figura 12.
INSTALACIÓN AUTOMÁTICA:
Cualquier error encontrado durante este proceso es escrito en el
archivo Cnfgsvr.out. Cuando SQL Server inicia, genera un registro
(log) de error que contiene los errores que SQL Server puede
encontrar. Este archivo, llamado errorlog, se encuentra en el
directorio
DESINSTALACIÓN AUTOMÁTICA:
POR QUÉ SQL SERVER 7.0 NO SE INSTALA EN UNA COMPUTADORA QUE TENGA UN
CHIP CYRIX:
Autenticación Windows NT
I/O Asíncrono
Publicación por Transacción
Clustering
Búsqueda de texto completo
Detección automática de archivos Unicode
CONFIGURACIONES DE MEMORIA RECOMENDADAS PARA SQL SERVER PARA WINDOWS
NT:
Por lo tanto, configurar SQL Server para más memoria virtual que la
cantidad de memoria física disponible, resultará en un desempeño bajo.
Esto resulta en una cantidad variable de memoria que podrá ser usada
por SQL Server dependiendo de la configuración de memoria de la
computadora. La tabla que sigue, muestra un estimado general de
configuraciones de memoria y asume que se cuenta con un servidor
dedicado para base de datos. Si la computadora se comparte entre
varios usuarios (tal como un servidor de archivos, servidor de base de
datos, y/o estaciones clientes), menor cantidad de memoria se deberá
asignar a SQL Server y más se deberá dejar para el sistema operativo y
otros usos.
16 MB 4 MB
24 MB 8 MB
32 MB 16 MB
48 MB 28 MB
64 MB 40 MB
128 MB 100 MB
256 MB 216 MB
512 MB 464 MB
1 GB 950 MB
1.5 GB 950 MB
2 GB 1500 MB
SORT ORDER:
SMS usará para ejecutar las consultas y ordenar los datos el mismo
"sort order" y "character set" que SQL Server.
Microsoft SMS requiere que cada Primary site tenga su propia base de
datos, y el "transaction log" debe residir en su propio device. Los
devices de la base de datos del site y la propia base de datos se
pueden crear de dos formas:
USER CONNECTIONS:
MEMORIA:
El parámetro óptimo depende de cuanta RAM esté instalada en el
servidor SQL Server y de qué otras aplicaciones estén en ejecución en
dicho servidor. En un servidor dedicado para SQL Server, con 32 MB de
memoria física RAM, podemos configurar 16 MB para uso por SQL Server.
OPEN OBJECTS:
LOCKS:
SYNCHRONIZE TIME:
ACTUALIZACIÓN:
6.0 y 6.5.
6.5.
En el caso de SMS 1.0 y SQL Server 4.21a, los sites de SMS se deberían
actualizar primero a SMS 1.1 y, posteriormente, SQL Server debería ser
la versión 6.x. Esto se debe a que SQL Server 6.x es incompatible con
SMS 1.0. Después, SQL Server 6.0 se puede actualizar a la versión 6.5
sin ningún problema, puesto que los site servers de SMS ya estarán
todos ejecutanto SMS 1.1.
Para el caso de una actualización de SMS 1.1 a SMS 1.2, el primer paso
sería actualizar SQL Server de la versión anterior (4.21a) a la
versión SQL Server 6.x, y en segundo lugar pasaríamos a la
actualización de SMS de la versión 1.1 a la versión 1.2.
NETWORK SUPPORT:
No CheckPoint on Recovery
Single User
Read Only
Opciones activadas para la base de datos SMS:
necesario)
No CheckPoint on Recovery
Single User
Read Only
En SQL Server 6.5 se pueden cambiar las opciones de una base de datos
usando el interface de usuario del "SQL Enterprise Manager" y haciendo
clic en "Databases" del menú "Manage". A continuación, hacer doble-
clic en la base de datos a editar y escoger la ficha "Options".
También es posible hacer doble-clic en el nombre de la base de datos
en la ventana del "Server Manager".
En SQL Server 6.5 se pueden cambiar las opciones de una base de datos
usando el procedimiento almacenado SP_DBOPTION.
CUÁNDO USAR TEMPDB EN RAM:
Figura 13.
ARQUITECTURA DE SOFTWARE:
Se puede elegir de entre muchas arquitecturas de aplicación para
implementar aplicaciones cliente/servidor. Sin embargo elegir un
enfoque de aplicación por capas permite flexibilidad y elegir entre
opciones de administración. Las aplicaciones de Software se pueden
dividir entre capas lógicas, las cuales pueden residir físicamente en
uno o más servidores.
DISEÑO ARQUITECTÓNICO:
CÓMO CONVERTIR UNA BASE DE DATOS DE ACCESS A SQL SERVER:
La forma más fácil de convertir una base de datos a SQL Server es usar
el asistente Upsizing Wizard. El Upsizing Wizard:
MÁS INFORMACIÓN:
ACCESS 2000:
Si se tiene un servidor que tiene instalado SQL Server 6.X, se
puede instalar SQL Server 7.0, pero no se podrá ejecutar
simultáneamente SQL Server 6.x y SQL Server 7.0. La instalación de
SQL Server agrega una versión con un interruptor, que cambia entre
SQL Server 6.x y SQL Server 7.0. Si está instalando SQL Server 7.0
junto con SQL Server versión 6.x en la misma computadora, no se debe
instalar SQL Server 7.0 en el mismo directorio que SQL Server 6.x.
No se necesita Microsoft Internet Explorer 4.01 Service Pack 1
para instalar sólo las herramientas de conectividad cliente. Si sólo
desea instalar las herramientas de conectividad cliente, no se
necesita de Internet Explorer 4.01 Service Pack 1. Sin embargo, si se
pretende instalar las herramientas de administración o SQL Server 7.0
Books Online, se necesitará Internet Explorer 4.01 Service Pack 1.
Es posible administrar bases de datos de SQL Server 6.5 desde
SQL Server Enterprise Manager 7.0, si previamente se han instalado
las herramientas de SQL Server 6.5 en la computadora cliente y ésta
ha sido actualizada a la versión 7.0. Cuando intenta conectarse a SQL
Server 6.5 usando SQL Server Enterprise Manager 7.0, abrirá la
versión 6.5 de SQL Enterprise Manager.
Actualmente no es posible instalar SQL Server 7.0 en un servidor
ejecutando Windows NT 4.0 Terminal Server Edition, pero se está
estudiando para posiblemente incluirlo en un futuro Service Pack de
SQL Server 7.0.
CONCLUSIONES
LOS PROS:
LOS CONTRAS:
Y aunque el SQL Server 7.0 tenga muchas ventajas, también tiene varias
desventajas. Aquí tiene algunas áreas en las cuales debe mejorar en
próximas versiones...
BLIOGRAFÍA
Implementing a database on Microsoft SQL
Server 7.0.
Workbook
http://www.microsoft.com
http://www.microsoft.com/latam/soporte
http://windowsnt.about.com
http://support.microsoft.com/support/sql/70faq
.asp