Contenido:
2.1 Operaciones de manipulación de datos
Como hemos visto, las instrucciones DML (Data Manipulation Language – Lenguaje de Manipulación de Datos) trabajan sobre los datos almacenados en nuestro SGBD, permitiendo consultarlos o modificarlos. En general a las operaciones básicas de manipulación de datos que podemos realizar con SQL se les denomina operaciones CRUD (de Create, Read, Update and Delete, o sea, Crear, Leer, Actualizar y Borrar, sería CLAB en español, pero no se usa). Lo verás utilizado de esta manera en muchos sitios, así que apréndete ese acrónimo.
Hay cuatro instrucciones para realizar estas tareas: INSERT: Inserta filas en una tabla. Se corresponde con la “C” de CRUD. SELECT: muestra información sobre los datos almacenados en la base de datos. Dicha información puede pertenecer a una o varias tablas. Es la “R”. UPDATE: Actualiza información de una tabla. Es, obviamente, la “U”. DELETE: Borra filas de una tabla. Se corresponde con la “D”.
2.2 Consultas simples
Para realizar consultas sobre las tablas de las bases de datos disponemos de la instrucción SELECT. Con ella podemos consultar una o varias tablas. Es sin duda el comando más versátil del lenguaje SQL. Existen muchas cláusulas asociadas a la sentencia SELECT (GROUP BY, ORDER, HAVING, UNION). También es una de las instrucciones en la que con más frecuencia los motores de bases de datos incorporan cláusulas adicionales al estándar, que es el que veremos aquí. Vamos a empezar viendo las consultas simples, basadas en una sola tabla. Veremos cómo obtener filas y columnas de una tabla en el orden en que nos haga falta. El resultado de una consulta SELECT nos devuelve una tabla lógica. Es decir, los resultados son una relación de datos, que tiene filas/registros, con una serie de campos/columnas. Igual que cualquier tabla de la base de datos. Sin embargo esta tabla está en memoria mientras la utilicemos, y luego se descarta. Cada vez que ejecutamos la consulta se vuelve a calcular el resultado.
La sintaxis básica de una consulta SELECT es la siguiente (los valores opcionales van entre corchetes): SELECT [ ALL / DISTINC ] [ * ] / [ListaColumnas_Expresiones] AS [Expresion] FROM Nombre_Tabla_Vista WHERE Condiciones ORDER BY ListaColumnas [ ASC / DESC ] A continuación analizaremos cada una de las partes de la consulta para entenderla mejor.
SELECT Permite seleccionar las columnas que se van a mostrar y en el orden en que lo van a hacer. Simplemente es la instrucción que la base de datos interpreta como que vamos a solicitar información.
ALL / DISTINCT ALL es el valor predeterminado, especifica que el conjunto de resultados puede incluir filas duplicadas. Por regla general nunca se utiliza.DISTINCT especifica que el conjunto de resultados sólo puede incluir filas únicas. Es decir, si al realizar una consulta hay registros exactamente iguales que aparecen más de una vez, éstos se eliminan. Muy útil en muchas ocasiones.
Nombres de campos Se debe especificar una lista de nombres de campos de la tabla que nos interesan y que por tanto queremos devolver. Normalmente habrá más de uno, en cuyo caso separamos cada nombre de los demás mediante comas. Se puede anteponer el nombre de la tabla al nombre de las columnas, utilizando el formato Tabla.Columna. Además de nombres de columnas, en esta lista se pueden poner constantes, expresiones aritméticas, y funciones, para obtener campos calculados de manera dinámica.
Los nombres indicados deben coincidir exactamente con los nombre de los campos de la tabla, pero si queremos que en nuestra tabla lógica de resultados tengan un nombre diferente podemos utilizar:
AS Permite renombrar columnas si lo utilizamos en la cláusula SELECT, o renombrar tablas si lo utilizamos en la cláusula FROM. Es opcional. Con ello podremos crear diversos alias de columnas y tablas. Enseguida veremos un ejemplo.
FROM Esta cláusula permite indicar las tablas o vistas de las cuales vamos a obtener la información. De momento veremos ejemplos para obtener información de una sola tabla.
WHERE Especifica la condición de filtro de las filas devueltas. Se utiliza cuando no se desea que se devuelvan todas las filas de una tabla, sino sólo las que cumplen ciertas condiciones. Lo habitual es utilizar esta cláusula en la mayoría de las consultas.
2.3 Consultas sobre múltiples tablas
En SQL es posible hacer esto especificando más de una tabla en la cláusula FROM de la instrucción SELECT. Tenemos varias formas de obtener esta información. Una de ellas consiste en crear combinaciones que permiten mostrar columnas de diferentes tablas como si fuese una sola tabla, haciendo coincidir los valores de las columnas relacionadas.
Vamos a ver este importante detalle con un ejemplo simple. Consideremos estas tres consultas sobre la base de datos Northwind:
SELECT COUNT(*) FROM Customers SELECT COUNT(*) FROM Orders SELECT COUNT(*) FROM Customers, Orders
Operaciones de unión - JOIN Domina SQL a un gran nivel con este curso avanzado » La operación JOIN o combinación permite mostrar columnas de varias tablas como si se tratase de una sola tabla, combinando entre sí los registros relacionados usando para ello claves externas.
Las tablas relacionadas se especifican en la cláusula FROM, y además hay que hacer coincidir los valores que relacionan las columnas de las tablas. Veamos un ejemplo, que selecciona el número de venta, el código y nombre del cliente y la fecha de venta en la base de datos Northwind:
2.3.1 Subconsultas
Una subconsulta es una instrucción SELECT anidada dentro de una instrucción SELECT, SELECT...INTO, INSERT...INTO, DELETE, o UPDATE o dentro de otra subconsulta.
Puede utilizar tres formas de sintaxis para crear una subconsulta: comparación [ANY | ALL | SOME] (instrucción sql) expresión [NOT] IN (instrucción sql) [NOT] EXISTS (instrucción sql)
comparación Es una expresión y un operador de comparación que compara la expresión con el resultado de la subconsulta.
expresión Es una expresión por la que se busca el conjunto resultante de la subconsulta.
instrucción sql Es una instrucción SELECT, que sigue el mismo formato y reglas que cualquier otra instrucción SELECT. Debe ir entre paréntesis. Se puede utilizar una subconsulta en lugar de una expresión en la lista de campos de una instrucción SELECT o en una cláusula WHERE o HAVING. En una subconsulta, se utiliza una instrucción SELECT para proporcionar un conjunto de uno o más valores especificados para evaluar en la expresión de la cláusula WHERE o HAVING.
Se puede utilizar el predicado ANY o SOME, los cuales son sinónimos, para recuperar registros de la consulta principal, que satisfagan la comparación con cualquier otro registro recuperado en la subconsulta. El ejemplo siguiente devuelve todos los productos cuyo precio unitario es mayor que el de cualquier producto vendido con un descuento igual o mayor al 25 por ciento.: SELECT * FROM Productos WHERE PrecioUnidad > ANY (SELECT PrecioUnidad FROM DetallePedido WHERE Descuento >= 0 .25);
El predicado ALL se utiliza para recuperar únicamente aquellos registros de la consulta principal que satisfacen la comparación con todos los registros recuperados en la subconsulta. Si se cambia ANY por ALL en el ejemplo anterior, la consulta devolverá únicamente aquellos productos cuyo precio unitario sea mayor que el de todos los productos vendidos con un descuento igual o mayor al 25 por ciento. Esto es mucho más restrictivo. El predicado IN se emplea para recuperar únicamente aquellos registros de la consulta principal para los que algunos registros de la subconsulta contienen un valor igual. El ejemplo siguiente devuelve todos los productos vendidos con un descuento igual o mayor al 25 por ciento.: SELECT * FROM Productos WHERE IDProducto IN (SELECT IDProducto FROM DetallePedido WHERE Descuento >= 0.25);
Inversamente se puede utilizar NOT IN para recuperar únicamente aquellos registros de la consulta principal para los que no hay ningún registro de la subconsulta que contenga un valor igual. El predicado EXISTS (con la palabra reservada NOT opcional) se utiliza en comparaciones de verdad/falso para determinar si la subconsulta devuelve algún registro.
Se puede utilizar también alias del nombre de la tabla en una subconsulta para referirse a tablas listadas en la cláusula FROM fuera de la subconsulta. El ejemplo siguiente devuelve los nombres de los empleados cuyo salario es igual o mayor que el salario medio de todos los empleados con el mismo título. A la tabla Empleados se le ha dado el alias T1::
SELECT Apellido, Nombre, Titulo, Salario FROM Empleados AS T1 WHERE Salario >= (SELECT Avg(Salario) FROM Empleados WHERE T1.Titulo = Empleados.Titulo) ORDER BY Titulo;
En el ejemplo anterior , la palabra reservada AS es opcional.
SELECT Apellidos, Nombre, Cargo, Salario FROM Empleados WHERE Cargo LIKE "Agente Ven*" AND Salario > ALL (SELECT Salario FROM Empleados WHERE (Cargo LIKE "*Jefe*") OR (Cargo LIKE "*Director*"));
Obtiene una lista con el nombre, cargo y salario de todos los agentes de ventas cuyo salario es mayor que el de todos los jefes y directores.
SELECT DISTINCTROW NombreProducto, Precio_Unidad FROM Productos WHERE (Precio_Unidad = (SELECT Precio_Unidad FROM Productos WHERE Nombre_Producto = "Almíbar anisado");
Obtiene una lista con el nombre y el precio unitario de todos los productos con el mismo precio que el almíbar anisado.
SELECT DISTINCTROW Nombre_Contacto, Nombre_Compañia, Cargo_Contacto, Telefono FROM Clientes WHERE (ID_Cliente IN (SELECT DISTINCTROW ID_Cliente FROM Pedidos WHERE Fecha_Pedido >= #04/1/93# <#07/1/93#).
Obtiene una lista de las compañías y los contactos de todos los clientes que han realizado un pedido en el segundo trimestre de 1993.
SELECT Nombre, Apellidos FROM Empleados AS E WHERE EXISTS (SELECT * FROM Pedidos AS O WHERE O.ID_Empleado = E.ID_Empleado);
Selecciona el nombre de todos los empleados que han reservado al menos un pedido.
SELECT DISTINCTROW Pedidos.Id_Producto, Pedidos.Cantidad, (SELECT DISTINCTROW Productos.Nombre FROM Productos WHERE Productos.Id_Producto = Pedidos.Id_Producto) AS ElProducto FROM Pedidos WHERE Pedidos.Cantidad > 150 ORDER BY Pedidos.Id_Producto;
2.3.2 Operadores de reunión y de conjuntos
SQL proporciona varias operaciones de conjuntos muy eficaces. Por ejemplo, incluye operadores de conjuntos del estilo de los de SQL como UNION, INTERSECT, EXCEPT y EXISTS. Entity SQL también es compatible con operadores para la eliminación de duplicados (SET), la prueba de pertenencia a un grupo (IN) y las combinaciones (JOIN). En los temas siguientes se describen los operadores de conjuntos de SQL.
UNION, disponible en todas las versiones de SQL Server. EXCEPT, nuevo en SQL Server 2005. INTERSECT, nuevo en SQL Server 2005.
UNIÓN Devuelve la suma de dos o más conjuntos de resultados. El conjunto obtenido como resultado de UNION tiene la misma estructura que los conjuntos originales. El siguiente ejemplo muestra el uso de UNION
SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento FROM EMPLEADOS UNION SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento FROM CLIENTES
EXCEPT Devuelve la diferencia (resta) de dos o más conjuntos de resultados. El conjunto obtenido como resultado de EXCEPT tiene la misma estructura que los conjuntos originales. El siguiente ejemplo muestra el uso de EXCEPT
SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento FROM EMPLEADOS UNION ALL SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento FROM CLIENTES
INTERSECT Devuelve la intersección entre dos o más conjuntos de resultados en uno. El conjunto obtenido como resultado de INTERSECT tiene la misma estructura que los conjuntos originales. El siguiente ejemplo muestra el uso de INTERSECT
SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento FROM EMPLEADOS EXCEPTSELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento FROM CLIENTES
2.4 Funciones de agregado y de agrupación