martes, 2 de septiembre de 2008

SQL

1. HISTORIA

La historia de SQL empieza en 1974 con la definición, por parte de Donald Chamberlin y de otras personas que trabajaban en los laboratorios de investigación de IBM, de un lenguaje para la especificación de las características de las bases de datos que adoptaban el modelo relacional. Este lenguaje se llamaba SEQUEL (Structured English Query Language) y se implementó en un prototipo llamado SEQUEL-XRM entre 1974 y 1975. Las experimentaciones con ese prototipo condujeron, entre 1976 y 1977, a una revisión del lenguaje (SEQUEL/2), que a partir de ese momento cambió de nombre por motivos legales, convirtiéndose en SQL. El prototipo (System R), basado en este lenguaje, se adoptó y utilizó internamente en IBM y lo adoptaron algunos de sus clientes elegidos. Gracias al éxito de este sistema, que no estaba todavía comercializado, también otras compañías empezaron a desarrollar sus productos relacionales basados en SQL. A partir de 1981, IBM comenzó a entregar sus productos relacionales y en 1983 empezó a vender DB2. En el curso de los años ochenta, numerosas compañías (por ejemplo Oracle y Sybase) comercializaron productos basados en SQL, que se convierte en el estándar industrial de hecho por lo que respecta a las bases de datos relacionales.

En 1986, el ANSI adoptó SQL como estándar para los lenguajes relacionales y en 1987 se transfomó en estándar ISO. Esta versión del estándar va con el nombre de SQL/86. En los años siguientes, éste ha sufrido diversas revisiones que han conducido primero a la versión SQL/89 y, posteriormente, a la actual SQL/92.
El hecho de tener un estándar definido por un lenguaje para bases de datos relacionales abre potencialmente el camino a la intercomunicabilidad entre todos los productos que se basan en él. Desde el punto de vista práctico, por desgracia las cosas fueron de otro modo. Efectivamente, en general cada productor adopta e implementa en la propia base de datos sólo el corazón del lenguaje SQL , extendiéndolo de manera individual según la propia visión que cada cual tenga del mundo de las bases de datos.

Actualmente, está en marcha un proceso de revisión del lenguaje por parte de los comités ANSI e ISO, que debería terminar en la definición de lo que en este momento se conoce como SQL3. Las características principales de esta nueva encarnación de SQL deberían ser su transformación en un lenguaje stand-alone y la introducción de nuevos tipos de datos más complejos que permitan, por ejemplo, el tratamiento de datos multimediales.

Año

Nombre

Alias

Comentarios

1986

SQL-86

SQL-87

Primera publicación hecha por ANSI. Confirmada por ISO en 1987.

1989

SQL-89


Revisión menor.

1992

SQL-92

SQL2

Revisión mayor.

1999

SQL:1999

SQL2000

Se agregaron expresiones regulares, consultas recursivas (para relaciones jerárquicas), triggers y algunas características orientadas a objetos.

2003

SQL:2003


Introduce algunas características de XML, cambios en las funciones, estandarización del objeto sequence y de las columnas autonumericas.

2006

SQL:2006


ISO/IEC 9075-14:2006 Define las maneras en las cuales el SQL se puede utilizar conjuntamente con XML. Define maneras importar y guardar datos XML en una base de datos SQL, manipulándolos dentro de la base de datos y publicando el XML y los datos SQL convencionales en forma XML. Además, proporciona facilidades que permiten a las aplicaciones integrar dentro de su código SQL el uso de XQuery, lenguaje de consulta XML publicado por el W3C (World Wide Web Consortium) para acceso concurrente a datos ordinarios SQL y documentos XML.

2. ESTRUCTURA BÁSICA

La estructura básica de una expresión para consulta SQL consta de tres cláusulas:

• SELECT

• FROM

• WHERE

La cláusula SELECT se usa para listar los atributos que se desean en el resultado de una consulta.

La cláusula FROM lista las relaciones que se van a examinar en la evaluación de la expresión

La cláusula WHERE costa de un predicado que implica atributos de las relaciones que aparecen en la cláusula FROM.

Una consulta básica en SQL tiene la forma:

SELECT A1,A2,...,An

FROM r1,r2,...,rn

WHERE P

Donde Ai = atributo ( Campo de la tabla )

ri = relación ( Tabla )

P = predicado ( condición )

Ejemplo 2.1 : Seleccionar todos los nombres de las personas que tengan el apellido MARQUESI de la tabla persona

SELECT nombre

FROM persona

WHERE apellido = " MARQUESI"

Answer

Nombre

1

MARTIN

2

PABLO

El resultado de una consulta es por supuesto otra relación. Si se omite la cláusula WHERE, el predicado P es verdadero. La lista A1, A2,..., An puede sustituirse por un asterisco (*) para seleccionar todos los atributos de todas las relaciones que aparecen en la cláusula FROM, aunque no es conveniente elegir esta ultima opción salvo que sea necesario pues desperdiciamos mucho tiempo en obtenerlo

Alias

Es posible renombrar los atributos y las relaciones, a veces por conveniencia y otras veces por ser necesario, para esto usamos la clausula AS como en el siguiente ejemplo.

Ejemplo 2.2

SELECT P.nombre AS [Primer Nombre]

FROM persona P

WHERE apellido = "MARQUESI"

Answer

Primer Nombre

1

MARTIN

2

PABLO

En este ejemplo cabe destacar un par de cosas. Cuando nos referimos a un atributo como es el caso de nombre, podemos referirnos a este usando la relación ( o el alias en este ejemplo ) a la que pertenece el atributo seguido de un punto seguido del atributo , a veces esta notación será necesaria para eliminar ambigüedades. Los corchetes los usamos cuando usamos espacios en blancos o el caratér (–) en el nombre de atributo o alias.

Usar alias en los atributos nos permite cambiar el nombre de los atributos de la respuesta a la consulta.

Cuando asociamos un alias con una relación decimos que creamos una variable de tupla. Estas variables de tuplas se definen en la cláusula FROM después del nombre de la relación.

En las consultas que contienen subconsultas, se aplica una regla de ámbito a las variables de tupla. En una subconsulta esta permitido usar solo variables de tupla definidas en la misma subconsulta o en cualquier consulta que tenga la subconsulta.

3. ORDENES SQL

Seleccionar los datos a cargar de una tabla

Esta es la forma más sencilla y habitual de usar las órdenes SQL.

Normalmente usaremos este tipo de instrucciones para cargar los datos en un DataTable (si trabajamos con ADO.NET o en un Recordset si trabajamos con ADO o DAO).

Por ejemplo:

SELECT * FROM Clientes WHERE Provincia = 'Madrid'

Este código SQL selecciona los registros de la tabla Clientes que residan en Madrid.

Los campos que devolvería serían todos, ya que hemos indicado * después de SELECT.

Si sólo queremos que devuelva los datos contenidos en los campos Nombre, Apellidos y NIF haríamos esto otro:

SELECT Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid'

TIP:

Por rendimiento, es recomendable devolver sólo los campos que realmente necesitamos en lugar de devolver todos los campos.

Clasificar los datos seleccionados (ORDER BY)

También podemos indicar que esos datos se devuelvan clasificados por cualquier campo, por ejemplo por los Apellidos de forma ascendente (la forma predeterminada):

SELECT Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' ORDER BY Apellidos

Pero si queremos los datos de mayor a menor (descendente), le añadimos la instrucción DESC después del campo por el que queremos clasificar:

SELECT Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' ORDER BY Apellidos DESC

O si queremos que la clasificación se haga usando dos campos, esos campos los indicaremos separados por comas:

SELECT Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' ORDER BY Apellidos, Nombre

Y si queremos que el orden sea descendente, le añadimos a continuación la instrucción DESC detrás de cada campo:

SELECT Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' ORDER BY Apellidos DESC, Nombre DESC

También podemos clasificar en distinto orden los campos indicados tras ORDER BY, por ejemplo:

SELECT * FROM Clientes ORDER BY Apellidos DESC, Nombre ASC, NIF DESC

Indicar el número máximo de filas a devolver (TOP)

Al realizar una selección de datos clasificados (usando ORDER BY), podemos indicar el número de filas (registros) máximos que queremos devolver, para ello indicaremos TOP y el número de filas o el porcentaje de filas a devolver:

Con las siguientes instrucciones se devolverán los primeros 50 registros (si los hay) que cumplan las condiciones indicadas:

SELECT TOP 50 Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' ORDER BY Apellidos DESC

TOP no diferencia filas que sean iguales, es decir, si la fila 50 y la 51 tienen los mismos Apellidos, devolverá 51.

En este otro ejemplo, se devolverá el 20% de las filas que coincidan con las instrucciones SQL indicadas:

SELECT TOP 20 PERCENT Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' ORDER BY Apellidos DESC

Nota:

Dependiendo de que estemos usando DAO o ADO el número de filas devueltas puede que sea distinto de cuando usamos ADO.NET, al menos en una misma tabla, usando TOP 150, con ADO me devolvía 151 filas y con ADO.NET me devolvía 150.

No se si es que TOP se comporta de forma diferente en ADO.NET

Actualizar los datos según un criterio (UPDATE)

Si lo que quieres es actualizar el contenido de un campo cuando se cumpla un criterio indicado, en lugar de recorrer todas las filas, podemos usar UPDATE / SET, por ejemplo:

UPDATE Clientes SET NPr = 28 WHERE Provincia = 'Madrid'

Esto hará que se asigne un valor 28 al campo NPr de todos los clientes que cumplan lo que se indica después de WHERE, es decir que cumplan el criterio indicado.

También podemos indicar (después de SET) varios campos a actualizar, separándolos por comas:

UPDATE Clientes SET NPr = 28, Patrón = 'San Isidro' WHERE Provincia = 'Madrid'

Una vez ejecutadas estas instrucciones SQL no se podrá deshacer los cambios, al menos si estamos trabajando con Recordsets DAO o ADO, ya que si trabajamos con ADO.NET, esos datos sólo se harán permanentes al actualizar "físicamente" los datos con el DataAdapter.

Eliminar los datos según un criterio (DELETE)

De la misma forma que podemos actualizar la información mediante un criterio WHERE, podemos eliminar los registros de forma "masiva" usando la instrucción DELETE.

Por ejemplo para eliminar todos los Clientes de Madrid:

DELETE * FROM Clientes WHERE Provincia = 'Madrid'

Nota:

Ni que decir tiene que este tipo de instrucciones SQL hay que usarla con muchísima precaución, ya que si la tabla está ligada a otra, también se perderán los datos relacionados.

Y una vez eliminados los datos... ya no se pueden recuperar.

El uso de DELETE no elimina la tabla, aunque se eliminaran todos los registros.

4. EJEMPLOS

Varios ejemplos para verlo mas claro:

SELECT JUGADOR_NO, APELLIDO, POSICION, EQUIPO

FROM JUGADORES

WHERE EQUIPO_NO = 'VALENCIA'

ORDER BY APELLIDO;

Este ejemplo mostrar el número de jugador (jugador_no) el apellido (Apellido), la posición en la que juega (Posición), y el equipo (Equipo) al que pertenece.

Seleccionara todos los datos de la tabla jugadores donde (Where) el nombre de equipo (Equipo_No) sea igual que la palabra 'Valencia' y se ordenara (order by) apellido. Notemos también que no pone ni 'Distinct' ni 'All'. Por defecto generara la sentencia con ALL.

SELECT *

FROM JUGADORES

WHERE POSICION = 'DELANTERO'

ORDER BY JUGADOR_NO;

Este ejemplo muestra todos los campos de la tabla jugadores donde (Where) la posición sea igual que 'Delantero' y lo ordena por número de jugador. Al no poner nada se presupone que es ascendentemente (Asc).

SELECT *

FROM JUGADORES

WHERE EQUIPO_NO = 'VALENCIA' AND POSICION = 'DELANTERO'

ORDER BY APELLIDO DESC, JUGADOR_NO ASC;

En este ejemplo selecciona todos los campos de la tabla jugadores donde (Where) el nombre del equipo sea igual a 'Valencia' y la posición de los jugadores sea igual a 'Delantero'. Por ultimo los ordena por 'Apellido' descendentemente y por numero de jugador ascendentemente.

No hay comentarios: