Unidad VI

6. Lenguaje SQL

6.1 Introducción

SQL usa una combinación de álgebra relacional y construcciones del cálculo relacional. El lenguaje SQL se considera un lenguaje de consultas, contiene muchas otras capacidades además de la consulta en bases de datos. Incluye características para definir la estructura de los datos, para la modificación de los datos en la base de datos y para la especificación de restricciones de seguridad.

El lenguaje de consulta estructurado (SQL) es un lenguaje de base de datos normalizado, utilizado por los diferentes motores de bases de datos para realizar determinadas operaciones sobre los datos o sobre la estructura de los mismos. Pero como sucede con cualquier sistema de normalización hay excepciones para casi todo; de hecho, cada motor de bases de datos tiene sus peculiaridades y lo hace diferente de otro motor, por lo tanto, el lenguaje SQL normalizado (ANSI) no nos servirá para resolver todos los problemas, aunque si se puede asegurar que cualquier sentencia escrita en ANSI será interpretable por cualquier motor 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 (mientras ahora se usa como lenguaje hospedado en otros lenguajes) y la introducción de nuevos tipos de datos más complejos que permitan, por ejemplo, el tratamiento de datos multimediales.

6.2 Definición de datos

Conceptualmente, SQL es un lenguaje de definición de datos (LDD), un lenguaje de definiciones de vistas (LDV) y un lenguaje de manipulación de datos (LMD), que posee también capacidad para especificar restricciones y evolución de esquemas.

El lenguaje SQL está compuesto por comandos, cláusulas, operadores y funciones de agregado. Estos elementos se combinan en las instrucciones para crear, actualizar y manipular las bases de datos. ComandosExisten dos tipos de comandos SQL:
  • DLL ==> que permiten crear y definir nuevas bases de datos, campos e índices.
  • DML ==> que permiten generar consultas para ordenar, filtrar y extraer datos de la base de datos.
El lenguaje de definición de datos (en inglés Data Definition Language, o DDL), es el que se encarga de la modificación de la estructura de los objetos de la base de datos.Incluye ordenes para modificar,borrar o definir las tablas en las que se almacenan las base de datos. Existen cuatro operaciones básicas: CREATE, ALTER, DROP y TRUNCATE.

Comandos DLL
Comando Descripción
CREATE Utilizado para crear nuevas tablas, campos e índices
DROP Empleado para eliminar tablas e índices
ALTER Utilizado para modificar las tablas agregando campos o cambiando la definición de los campos.

Comandos DML
Comando Descripción
SELECT Utilizado para consultar registros de la base de datos que satisfagan un criterio determinado
INSERT Utilizado para cargar lotes de datos en la base de datos en una única operación.
UPDATE Utilizado para modificar los valores de los campos y registros especificados
DELETE Utilizado para eliminar registros de una tabla de una base de datos


6.3 Estructura básica de las consultas

La estructura básica de una expresión SQL consiste en tres cláusulas: select, from y where.

• La cláusula select corresponde a la operación proyección del álgebra relacional. Se usa para listar los atributos deseados del resultado de una consulta.

• La cláusula from corresponde a la operación producto cartesiano del álgebra relacional. Lista las relaciones que deben ser analizadas en la evaluación de la expresión.

• La cláusula where corresponde al predicado selección del álgebra relacional. Es un predicado que engloba a los atributos de las relaciones que aparecen en la cláusula from.

Una consulta típica en SQL tiene la forma
select A1, A2,…, An from r1, r2,…, rm where P

Cada Ai representa un atributo, y cada ri una relación.

P es un predicado. La consulta es equivalente a la expresión del álgebra relacional
Π A1, A2,…, An (σP (r1 × r2 ×… × rm ))

CLAUSULAS

Las cláusulas son condiciones de modificación utilizadas para definir los datos que desea seleccionar o manipular. 

Cláusula Descripción
FROM Utilizada para especificar la tabla de la cual se van a seleccionar los registros
WHERE Utilizada para especificar las condiciones que deben reunir los registros que se van a seleccionar
GROUP BY Utilizada para separar los registros seleccionados en grupos específicos
HAVING Utilizada para expresar la condición que debe satisfacer cada grupo
ORDER BY Utilizada para ordenar los registros seleccionados de acuerdo con un orden específico

Ejemplos:

La sintaxis básica de una consulta de selección es la siguiente:
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:
SELECT Nombre, Teléfono FROM Clientes
 
Esta sentencia devuelve un conjunto de resultados con el campo nombre y teléfono de la tabla clientes.
En determinadas ocasiones nos puede interesar incluir una columna con un texto fijo en una consulta de selección, por ejemplo, supongamos que tenemos una tabla de empleados y deseamos recuperar las tarifas semanales de los electricistas, podríamos realizar la siguiente consulta:
SELECT Empleados.Nombre, 'Tarifa semanal: ', Empleados.TarifaHora * 40 FROM Empleados WHERE Empleados.Cargo = 'Electricista
Operadores Lógicos
 
Operador Uso
AND Es el "y" lógico. Evalúa dos condiciones y devuelve un valor de verdad sólo si ambas son ciertas.
OR Es el "o" lógico. Evalúa dos condiciones y devuelve un valor de verdad si alguna de las dos es cierta.
NOT Negación lógica. Devuelve el valor contrario de la expresión.
 
 Operadores de Comparación
Operador Uso
< Menor que
> Mayor que
<> Distinto de
<= Menor o igual que
>= Mayor o igual que
= Igual que
BETWEEN Utilizado para especificar un intervalo de valores.
LIKE Utilizado en la comparación de un modelo
In Utilizado para especificar registros de una base de datos
 
Ejemplos:
select número-préstamo from préstamo where nombre-sucursal = ‘Navacerrada’ and importe > 1200
SELECT *
FROM
Empleados
WHERE
(Sueldo > 100 AND Sueldo < 500)
OR
(Provincia = 'Madrid' AND Estado = 'Casado')
select número-préstamo
from
préstamo
where
importe between 90000 and 100000

La cláusula from define por sí misma un producto cartesiano de las relaciones que aparecen en la cláusula. 

Escribir una expresión SQL para la reunión natural es una tarea relativamente fácil, puesto que la reunión natural se define en términos de un producto cartesiano, una selección y una proyección. La expresión del álgebra relacional se escribe como sigue:

Πnombre-cliente, número-préstamo,importe (prestatario |x| préstamo)

para la consulta «Para todos los clientes que tienen un préstamo en el banco, obtener los nombres, números de préstamo e importes». Esta consulta puede escribirse en SQL como
select nombre-cliente, prestatario.número-préstamo, importe from prestatario, préstamo where prestatario.número-préstamo = préstamo.número-préstamo

Para asegurar la eliminación de duplicados en el resultado de los ejemplos de consultas, se usará la cláusula distinct siempre que sea necesario. En la mayoría de las consultas donde no se utiliza distinct, el número exacto de copias duplicadas de cada tupla que resultan de la consulta no es importante.

Podemos ver como funciona en el siguiente ejemplo, en el que preguntamos por los distintos oficios de nuestros empleados.

select oficio from emp

Sin utilizar la cláusula DISTINCT obtendremos la siguiente respuesta OFICIO
-----------
Presidente
Director
Secretario
Contable
Comercial
Comercial
Director
Analista
Programador
Programador
Director
Analista
Programador
Programador

14 rows selected. 
 
Pero si incluimos la cláusula DISTINCT la respuesta varía para adecuarse más a nuestras espectativas.
select distinct oficio from emp

OFICIO

-----------
Analista
Comercial
Contable
Director
Presidente
Programador
Secretario
7 rows selected. 

SQL proporciona un mecanismo para renombrar tanto relaciones como atributos. Para ello utiliza la cláusula as, que tiene la forma siguiente: nombre-antiguo as nombre-nuevo la cláusula as puede aparecer tanto en select como en from.

select nombre-cliente, prestatario.número-préstamo
as
id-préstamo, importe
from
prestatario, préstamo
where
prestatario.número-préstamo =
préstamo.número-préstamo

La cláusula order by hace que las tuplas resultantes de una consulta se presenten en un cierto orden. Si deseamos seleccionar todos los empleados que residen en el estado de Hidalgo ordenados por edad.
Select * from empleados where estado='Hidalgo' order by edad

Tarea: Estudiar los temas siguientes:
4.2.6. Operaciones sobre cadenas
4.2.8 Duplicados

6.4 Operaciones sobre conjuntos

Las operaciones de SQL union, intersect y except operan sobre relaciones y corresponden a las operaciones del álgebra relacional ∪, ∩ y –. Al igual que la unión, intersección y diferencia de conjuntos en el álgebra relacional, las relaciones que participan en las operaciones han de ser compatibles; esto es, deben tener el mismo conjunto de atributos.
UNION

La operación de unión permite combinar datos de varias relaciones. Supongamos que una determinada empresa internacional posee una tabla de empleados para cada uno de los países en los que opera. Para conseguir un listado completo de todos los empleados de la empresa tenemos que realizar una unión de todas las tablas de empleados de todos los países.

No siempre es posible realizar consultas de unión entre varias tablas, para poder realizar esta operación es necesario e imprescindible que las tablas a unir tengan las mismas estructuras, que sus campos sean iguales.

Nom_TablaA   UNION Nom_TablaB

Su sintaxis es:
[TABLE] consulta1 UNION [ALL] [TABLE]
consulta2 [UNION [ALL] [TABLE] consultan [ ... ]]

El ejemplo siguiente combina una tabla existente llamada Nuevas Cuentas y una instrucción SELECT: 

TABLE
NuevasCuentas
UNION ALL
SELECT *
FROM
Clientes
WHERE
CantidadPedidos > 1000
Si no se indica lo contrario, no se devuelven registros duplicados cuando se utiliza la operación UNION, no obstante puede incluir el predicado ALL para asegurar que se devuelven todos los registros. Esto hace que la consulta se ejecute más rápidamente. Todas las consultas en una operación UNION deben pedir el mismo número de campos, no obstante los campos no tienen porqué tener el mismo tamaño o el mismo tipo de datos.
SELECT
NombreCompania, Ciudad
FROM
Proveedores
WHERE
Pais = 'Brasil'
UNION
SELECT
NombreCompania, Ciudad
FROM
Clientes
WHERE
Pais = 'Brasil'
(Recupera los nombres y las ciudades de todos proveedores y clientes de Brasil)
SELECT
NombreCompania, Ciudad
FROM
Proveedores
WHERE
Pais = 'Brasil'
UNION
SELECT
NombreCompania, Ciudad
FROM
Clientes
WHERE Pais = 'Brasil'
ORDER BY Ciudad
(Recupera los nombres y las ciudades de todos proveedores y clientes radicados en Brasil, ordenados por el nombre de la ciudad)
SELECT
NombreCompania, Ciudad
FROM
Proveedores
WHERE
Pais = 'Brasil'
UNION
SELECT
NombreCompania, Ciudad
FROM
Clientes
WHERE
Pais = 'Brasil'
UNION
SELECT
Apellidos, Ciudad
FROM
Empleados
WHERE
Region = 'América del Sur'
(Recupera los nombres y las ciudades de todos los proveedores y clientes de brasil y los apellidos y las ciudades de todos los empleados de América del Sur)
TABLE
Lista_Clientes
UNION TABLE
ListaProveedores
(Recupera los nombres y códigos de todos los proveedores y clientes)
INTERSECCIÓN 

La operación de intersección permite identificar filas que son comunes en dos relaciones. Supongamos que tenemos una tabla de empleados y otra tabla con los asistentes que han realizado un curso de inglés (los asistentes pueden ser empleados o gente de la calle). Queremos crear una figura virtual en la tabla denominada "Empleados que hablan Inglés", esta figura podemos crearla realizando una intersección de empleados y curso de inglés, los elementos que existan en ambas tablas serán aquellos empleados que han asistido al curso.

Nom_TablaA  INTERSEC Nom_tablaB

Para encontrar todos los clientes que tienen tanto un préstamo como una cuenta en el banco, se escribirá:

(select distinct nombre-cliente
from impositor)
intersect
(select distinct nombre-cliente
from prestatario)

La operacion intersect (intersección) elimina duplicados automáticamente. Así, en la consulta anterior, si un cliente —por ejemplo, Santos— tiene varias cuentas o préstamos (o ambas cosas) en el banco, entonces Santos aparecerá solo una vez en el resultado. Para conservar los duplicados se utilizará intersect all en lugar de intersect:

(select nombre-cliente
from impositor) intersect all
(select nombre-cliente
from prestatario)

El número de tuplas duplicadas en el resultado es igual al mínimo número de duplicados que aparecen en i y p. 

Así, si Santos tuviese tres cuentas y dos préstamos en el banco, entonces en el resultado de la consulta aparecerían dos tuplas con el nombre de Santos.

EXCEPT

Para encontrar todos los clientes que tienen cuenta pero no tienen ningún préstamo en el banco se escribirá:

(select distinct nombre-cliente
from impositor)
except
(select distinct nombre-cliente
from prestatario)

La operacion except (excepto) elimina duplicados automáticamente. Así, en la consulta anterior, una tupla con el nombre de Santos aparecerá en el resultado (exactamente una vez), sólo si Santos tiene una cuenta en el banco, pero no tiene ningún préstamo en el mismo. Para conservar los duplicados, se utilizará except all en lugar de except:

(select nombre-cliente
from impositor)
except all
(select nombre-cliente
from prestatario)

El número de copias duplicadas de una tupla en el resultado es igual al número de copias duplicadas de dicha tupla en i menos el número de copias duplicadas de la misma tupla en p, siempre que la diferencia sea positiva. 

Así, si Santos tuviese tres cuentas y un préstamo en el banco, entonces en el resultado aparecerían dos tuplas con el nombre de Santos. Si, por el contrario, dicho cliente tuviese dos cuentas y tres préstamos en el banco, no habrá ninguna tupla con el nombre de Santos en el resultado.

6.5 Funciones de agregación

El SQL nos ofrece las siguientes funciones de agregación para efectuar varias operaciones sobre los datos de una base de datos:

Funciones de agregación
Función Descripción
COUNT Nos da el número total de filas seleccionadas
SUM Suma los valores de una columna
MIN Nos da el valor mínimo de una columna
MAX Nos da el valor máximo de una columna
AVG Calcula el valor medio de una columna


En general, las funciones de agregación se aplican a una columna, excepto la función de agregación COUNT, que normalmente se aplica a todas las columnas de la tabla o tablas seleccionadas. Por lo tanto,COUNT (*) contará todas las filas de la tabla o las tablas que cumplan las condiciones. Si se utilizase COUNT(distinct columna), sólo contaría los valores que no fuesen nulos ni repetidos, y si se utilizase COUNT(columna), sólo contaría los valores que no fuesen nulos.

Ejemplo de utilización de la función COUNT (*)

Veamos un ejemplo de uso de la función COUNT, que aparece en la cláusula SELECT, para hacer la consulta 

“¿Cuántos departamentos están ubicados en la ciudad de Pachuca?”: 

SELECT COUNT(*) AS numero_dep
FROM departamentos
WHERE ciudad_dep = ‘Pachuca’;

numero_dep
1

 La respuesta a esta consulta sería la que aparece reflejada en la tabla que encontraréis en el margen.

Considérese la consulta «Obtener la media de saldos de las cuentas de la sucursal Navacerrada ». Esta consulta se puede formular del modo siguiente:

select avg (saldo)
from cuenta
where nombre-sucursal = ‘Navacerrada’

El resultado de esta consulta será una relación con un único atributo, que contendrá una única fila con un valor numérico correspondiente al saldo medio de la sucursal Navacerrada.

Tarea: Desarrollar al menos 3 ejemplos para cada una de las siguientes funciones : SUM, MIN, MAX y AVG.





No hay comentarios:

Publicar un comentario