Introduccion SQL Structured Query Langua
Introduccion SQL Structured Query Langua
SQL (Structured Query Language) es un potente lenguaje informático que cumple las
funciones de DDL y DML en los SGBD relacionales. Su origen está en el lenguaje SEQUEL
(Structured English QUEry Language) desarrollado en IBM en los años 1974-75. Oracle fue el
primer fabricante de sistemas de bases de datos en comercializar una implementación de
SQL en 1979. IBM lanzó el producto SQL/DS en 1981 y dos años más tarde el conocido DB2.
Se trata de un lenguaje fuertemente basado en el inglés, que puede ser utilizado en modo
conversacional mediante un intérprete o bien formando parte de un programa desarrollado
en un lenguaje de programación anfitrión como C, Cobol, etc. (SQL embebido). La
característica relacional más importante de SQL es que permite acceder a los datos sin
necesidad de especificar cómo se ha de realizar dicho acceso permitiendo así la "navegación
automática" por los datos.
El lenguaje ha sido normalizado por varios organismos, si bien los muchos aspectos que
tradicionalmente han quedado indefinidos en tales normalizaciones y qu e por lo tanto en la
práctica quedan como responsabilidad de los fabricantes han ocasionado variaciones de
diversa importancia entre las diferentes implementaciones comerciales. La versión actual
más común del lenguaje es la denominado SQL2 que respecto al estándar anterior presenta
las ventajas de un mayor incremento de la capacidad expresiva, nuevos operadores añadidos
y mejor tratamiento de errores, entre otras. SQL3 incorpora al lenguaje características
propias del paradigma de orientación a objeto.
DDL y DML
Lenguaje de definición de datos (DDL: Data Definition Language):Sencillo lenguaje
artificial para definir y describir los objetos de la base de datos, su estructura, relaciones y
restricciones. En la práctica puede consistir en un subconjunto de instrucciones de otro
lenguaje informático. Aparte suele poseer dos subconjuntos de instrucciones:
Comando Descripción
Comandos DML
Comando Descripción
Consultas de Selección
Las consultas de selección se utilizan para indicar al motor de datos que devuelva
información de las bases de datos, esta información es devuelta en forma de conjunto de
registros que se pueden almacenar en un objeto recordset. Este conjunto de registros es
modificable.
Consultas básicas
SELECT Campos
FROM Tabla
En donde campos es la lista de campos que se deseen recuperar y tabla es el origen de los
mismos, por ejemplo:
Esta consulta devuelve un recordset con el campo nombre y teléfono de la tabla clientes.
Ordenar los registros
Adicionalmente se puede especificar el orden en que se desean recuperar los registros de las
tablas mediante la claúsula ORDER BY Lista de Campos. En donde Lista de campos
representa los campos a ordenar. Ejemplo:
Esta consulta devuelve los campos CodigoPostal, Nombre, Telefono de la tabla Clientes
ordenados por el campo Nombre.
Se pueden ordenar los registros por mas de un campo, como por ejemplo:
El predicado DISTINCT
El predicado DISTINCT omite los registros que contienen datos duplicados en los campos
seleccionados. Para que los valores de cada campo listado en la instrucción SELECT se
incluyan en la consulta deben ser únicos.
Por ejemplo, varios empleados listados en la tabla Empleados pueden tener el mismo
apellido. Si dos registros contienen López en el campo Apellido, la siguiente instrucción SQL
devuelve un único registro:
Con otras palabras el predicado DISTINCT devuelve aquellos registros cuyos campos
indicados en la cláusula SELECT posean un contenido diferente. El resultado de una consulta
que utiliza DISTINCT no es actualizable y no refleja los cambios subsiguientes realizados por
otros usuarios.
Selección Condicional, Operadores de Comparación y
Lógicos
Selección Condicional
La cláusula WHERE se utiliza para determinar qué registros de las tablas enumeradas en
la cláusula FROM aparecerán en los resultados de la instrucción SELECT. Depués de escribir
esta cláusula se deben especificar las condiciones expuestas a continuación. Si no se emplea
esta cláusula, la consulta devolverá todas las filas de la tabla. WHERE es opcional, pero
cuando aparece debe ir a continuación de FROM.
Operadores de Comparación
= Igual
<> Distinto
< Menor
> Mayor
<= Menor Igual
<= Mayor Igual
between Utilizado para especificar un intervalo de valores.
like Utilizado en la comparación de un campo contra un patrón
Utilizado para verificar la existencia de un valor dentro de un
in
conjunto de valores
El operador Between
Para indicar que deseamos recuperar los registros según el intervalo de valores de un
campo emplearemos el operador Between cuya sintaxis es:
En este caso la consulta devolvería los registros que contengan en "campo" un valor
incluido en el intervalo valor1, valor2 (ambos inclusive). Si anteponemos la condición Not
devolverá aquellos valores no incluidos en el intervalo.
SELECT *
FROM Pedidos
WHERE CodPostal
BETWEEN 28000 and 28999
El Operador Like
Se utiliza para comparar una expresión de cadena con un modelo en una expresión SQL. Su
sintaxis es:
El operador like se puede utilizar en una expresión para comparar un valor de un campo
con una expresión de cadena. Por ejemplo, si introduce Like "C%" en una consulta SQL, la
consulta devuelve todos los valores de campo que comiencen por la letra C. En una consulta
con parámetros, puede hacer que el usuario escriba el modelo que se va a utilizar.
El Operador in
Este operador devuelve aquellos registros cuyo campo indicado coincide con alguno de los
valores que se encuentran una lista explicitada. Su sintaxis es:
Operadores Lógicos
Agrupamiento de Registros
GROUP BY
SELECT campos FROM tabla WHERE criterio GROUP BY campos del grupo
GROUP BY es opcional. Los valores de resumen se omiten si no existe una función SQL
agregada en la instrucción SELECT. Los valores Null en los campos GROUP BY se agrupan y
no se omiten. No obstante, los valores Null no se evalúan en ninguna de las funciones SQL
agregadas.
Se utiliza la cláusula WHERE para excluir aquellas filas que no desea agrupar, y la
cláusula HAVING para filtrar los registros una vez agrupados.
Todos los campos de la lista de campos de SELECT deben o bien incluirse en la cláusula
GROUP BY o como argumentos de una función SQL agregada.
HAVING es similar a WHERE, determina qué registros se seleccionan. Una vez que los
registros se han agrupado utilizando GROUP BY, HAVING determina cuales de ellos se van a
mostrar.
Avg(expr)
En donde expr representa el campo que contiene los datos numéricos para los que se desea
calcular la media o una expresión que realiza un cálculo utilizando los datos de dicho campo.
La media calculada porAvg es la media aritmética (la suma de los valores dividido por el
número de valores). La función Avg no incluye ningún campo Null en el cálculo.
Count(expr)
En donde expr contiene el nombre del campo que desea contar. Los operandos de expr
pueden incluir el nombre de un campo de una tabla, una constante.
Aunque expr puede realizar un cálculo sobre un campo, Count simplemente cuenta el
número de registros sin tener en cuenta qué valores se almacenan en los registros. La
función Count no cuenta los registros que tienen campos null. Si utiliza un asterisco, Count
calcula el número total de registros, incluyendo aquellos que contienen campos null.
Count(*) es considerablemente más rápida que Count(Campo).
Min(expr)
Max(expr)
En donde expr es el campo sobre el que se desea realizar el cálculo. Expr pueden incluir el
nombre de un campo de una tabla, una constante.
Sum(expr)
En donde expr respresenta el nombre del campo que contiene los datos que desean
sumarse o una expresión que realiza un cálculo utilizando los datos de dichos campos.
Determina si un valor dado coincide con algún valor de una subconsulta o lista. Su sintaxix
es:
El resultado del operador lógico IN es un valor booleano, es decir Verdadero o Falso, para
cada valor de Campo que se encuentre ( o no ) en la sub-consulta.
EXISTS
SELECT
Nombre_Editor
DISTINCT
FROM Editores E
WHERE
(
EXISTS
SELECT *
FROM Titulos T
T.IdEditor =
WHERE
E.IdEditor
AND T.Tipo="Negocios"
)
WHERE T.Tipo="Negocio
s"
)
Ejemplo
Supongamos que tenemos tres tablas, correspondientes a los esquemas Estudiante (Nro,
Nombre, ... ), Materia (Código, Nombre, Año, ... ) y Cursa (Nro, Código) y deseamos saber
los nombres de los alumnos que cursan todas las materias de 4º año.
En Álgebra Relacional, la respuesta se obtendría evaluando la expresión: Nombre(Nombre
(Estudiante |X| (Cursa / (σAño="4º"M(Materia)))
Veamos cómo se expresa ahora en SOL:
select nombre
from Estudiante e
where not exists (
select *
from Materia m
where m.Año = "4º" and not exists (
select *
from Cursa c
where c.Nro = e.Nro and c.Codigo = m.Codigo
)
)
Ejercicios Resueltos
select * from proveedores p where
not exists(
select * from proveedores p1 where
exists(
select * from provisto_por p2 where
not exists(
select * from compuesto_por p3 where p3.cod_art=p2.cod_art
and p1.cod_prov=p2.Cod_prov
and p.cod_prov=p1.cod_prov)))