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
- SELECT Nombre, Teléfono FROM 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 de Comparación
- Ejemplos:
- select número-préstamo from préstamo where nombre-sucursal = ‘Navacerrada’ and importe > 1200
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. |
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 |
- 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
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.
-----------
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
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
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 [ ... ]]
- TABLE
- NuevasCuentas
- UNION ALL
- SELECT *
- FROM
- Clientes
- WHERE
- CantidadPedidos > 1000
El ejemplo siguiente combina una tabla existente llamada Nuevas Cuentas y una instrucción SELECT:
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)
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)
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)
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)
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:
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’
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