DAW/DAM
Desarrollo de Aplicaciones Web / Multiplataforma
1º Curso
BD
Bases de Datos
UD 5
Selección de datos
UD5 – Selección de datos 1 / 38
UD5 – Selección de datos – Parte 1
INDICE
1. Introducción
2. Consultas SELECT básicas
2.1 Con operaciones numéricas y literales
2.2 Consultas básicas a tablas
2.3 Ejemplos de las primeras consultas
2.4 Consultas con selección de registros
2.5 Consultas con varias condiciones
2.6 Consultas con funciones (cadenas, números y fechas)
2.7 Ejercicios
3. Consultas SELECT de agrupación (GROUP BY / HAVING)
3.1 Consultas de agrupación
3.2 Ejemplos de las primeras consultas agrupadas
3.3 Ejercicios
4. Consultas SELECT de varias tablas
4.1 Consultas JOIN entre varias tablas
4.2 Consultas de conjuntos
4.2.1 Unión
4.2.2 Intersección
4.2.3 Diferencia
4.3 Subconsultas
5. Vistas
UD5 – Selección de datos 2 / 38
1. Introducción
El Lenguaje de Manipulación de Datos (LMD, en inglés Data Manipulation
Language, DML) es un lenguaje proporcionado por el sistema de gestión de base de
datos que permite a los usuarios de la misma llevar a cabo las tareas de consulta o
manipulación de los datos (inserción, borrado, actualización y consultas) basado en el
modelo de datos adecuado.
SQL Server Oficial – Sintaxis de las instrucciones DML
[Link]
Las consultas recuperan información de las tablas de una base de datos mediante la
selección de campos, la realización de filtros y la transformación de los datos
recuperados.
El uso de consultas permite:
• Elegir tablas. Se puede obtener información de una sola tabla o de varias.
• Elegir campos. Se pueden especificar los campos a visualizar de cada tabla.
• Elegir registros. Se pueden seleccionar los registros a mostrar en la hoja de
respuestas dinámica, especificando un criterio.
• Ordenar registros. Se puede ordenar la información en forma ascendente o
descendente.
• Realizar cálculos. Se pueden emplear las consultas para hacer cálculos con los
datos de las tablas.
Además, en consultas más complejas se puede:
• Crear tablas. Se puede generar otra tabla a partir de los datos combinados de
una consulta. La tabla se genera a partir de la hoja de respuestas dinámica.
• Consultas encadenadas. Utilizar una consulta como origen de datos para otras
consultas (subconsulta). Se pueden crear consultas adicionales basadas en un
conjunto de registros seleccionados por una consulta anterior.
UD5 – Selección de datos 3 / 38
2. Consultas SELECT básicas
2.1 Consultas con operaciones numéricas y literales
Comenzaremos por utilizar la instrucción SELECT como si fuera una calculadora. Para
ello utilizaremos los operadores aritméticos:
Operador Función
+ Suma
- Resta
* Producto o Multiplicación
/ División
% Resto de la división. Ejemplo. 12%5 = 2, porque el resto
de 12 dividido entre 5 es 2.
Ejemplos.
SELECT 20*150;
SELECT ((5*4.5)/3)+7;
SELECT 100/3, 100 % 3;
Documentación oficial SQL Server – Operadores aritméticos
[Link]
sql?view=sql-server-ver15
Para el uso de literales o cadenas de caracteres basta con colocar comillas simples. Para
concatenar cadenas podemos utilizar el operador +
SELECT 'Hola mundo!';
Si queremos darle un nombre a la columna podemos utilizar AS NombreCol
SELECT 'Hola mundo!' AS Columna1;
También podemos seleccionar tablas con un nombre diferente al original:
SELECT codCliente AS CodCli, NomCliente AS Nombre, Telefono AS Tlf
FROM CLIENTES;
Por último, es posible concatenar cadenas de caracteres con datos fijos y con
datos variables (necesitaremos hacer un ‘cast’ o conversión a VARCHAR si el
dato no es VARCHAR):
SELECT '25*1.21 = ' + CAST(25*1.21 AS VARCHAR);
UD5 – Selección de datos 4 / 38
2.2 Consultas básicas a tablas
La sintaxis para realizar una consulta a una tabla es:
SELECT [TOP(n)] [DISTINCT] campo/s
[FROM nombre_tabla
[WHERE condición/es]
[ORDER BY {columna/s } [ASC | DESC] , ...]
Es importante conocer el orden de las cláusulas:
SELECT … FROM … WHERE … ORDER BY
2.3 Ejemplos de las primeras consultas
Ejemplo 01 - Tablas completas
Mostrar todos los campos de todos los clientes
SELECT *
FROM CLIENTES;
Ejemplo 02 - Seleccionar campos a mostrar
Mostrar los campos codCliente, nombre_cliente, telefono, ciudad, region, pais de todos los clientes
SELECT codCliente, nombre_cliente, telefono, ciudad, region, pais
FROM CLIENTES;
Ejemplo 03 – Campos calculados
Mostrar los campos codCliente, nombre_cliente, limite_credito de todos los clientes añadiendo un
campo calculado que sea el limiteCreditoMensual como limite_credito/12. Hacer la división entera
para evitar decimales.
Utilizaremos el alias de campo con la palabra reservada AS.
SELECT codCliente, nombre_cliente, limite_credito,
limite_credito / 12 AS limiteCreditoMensual
FROM CLIENTES;
Ejemplo 04 – No mostrar repetidos
Mostrar las regiones (campo region) todos los clientes evitando resultandos repetidos
SELECT DISTINCT Region
FROM CLIENTES;
UD5 – Selección de datos 5 / 38
Ejemplo 05 – Ordenar registros
Mostrar todos los campos de todos los clientes ordenados por limite_credito ordenado
descendentemente
SELECT *
FROM CLIENTES
ORDER BY limite_credito DESC;
Ejemplo 06 – Limitar el número de registros a mostrar del resultado
Utilizando la consulta del ejercicio anterior muestra únicamente los 5 primeros registros.
SELECT TOP(5) *
FROM CLIENTES
ORDER BY limite_credito DESC;
2.4 Consultas con selección de registros
Para poder seleccionar registros es necesario indicar la condición que deben cumplir
los campos de un registro para ser mostrado.
Para ello se utiliza la sección WHERE de la instrucción SQL. Los operadores relacionales
que nos permiten comparar el valor de los campos son:
Operador Función
= Igual a
< Menor que
> Mayor que
<= Menor o igual
>= Mayor o igual
<> Distinto
LIKE Patrón que debe cumplir un campo cadena
BETWEEEN Intervalo de valores
IN Conjunto de valores
IS NULL Es nulo
IS NOT NULL No es nulo
UD5 – Selección de datos 6 / 38
Veamos algunos ejemplos:
Ejemplo 01 – Buscar un registro por el valor de su clave
Mostrar todos los campos del cliente con código igual a 6.
Nota: Al ser el campo clave, el resultado sólo mostrará un registro.
SELECT *
FROM CLIENTES
WHERE codCliente = 6;
Ejemplo 02 – Ejemplo con IN
Mostrar los clientes que sean de la ciudad de Madrid, Paris o London
SELECT *
FROM CLIENTES
WHERE ciudad IN ('Madrid', 'Paris', 'London');
Ejemplo 03 – Buscar registros por el valor de un campo
Mostrar todos los campos de los clientes de la región de Barcelona
Nota: Al no ser un campo clave, el resultado puede mostrar más de un registro.
SELECT *
FROM CLIENTES
WHERE region = 'Barcelona';
Ejemplo 04 – Buscar registros por comparación del valor de un campo
Mostrar todos los campos de los clientes con Límite de Crédito mayor de 50000€.
SELECT *
FROM CLIENTES
WHERE limite_credito > 50000;
Ejemplo 05 – Buscar registros por comparación del valor de un campo
Mostrar todos los campos de los clientes con Límite de Crédito entre 3000€ y 7500€.
SELECT *
FROM CLIENTES
WHERE limite_credito BETWEEN 3000 AND 7500;
UD5 – Selección de datos 7 / 38
Ejemplo 06 – Buscar registros por comparación del valor de un campo
Mostrar todos los campos de los clientes con la Región nula
SELECT *
FROM CLIENTES
WHERE region IS NULL;
Ejemplo 07 – Ejemplo combinando con el apartado anterior
Mostrar los Países de los clientes con la Región nula, sin repetir valores
SELECT DISTINCT Pais
FROM CLIENTES
WHERE Region IS NULL;
Comodines que podemos utilizar para realizar consultas:
% es una cadena de caracteres cualquiera
_ es un sólo carácter cualquiera (subrayado)
Ejemplo 08 – Ejemplo con LIKE
Mostrar los Empleados cuyo email contenga "jardin"
SELECT *
FROM EMPLEADOS
WHERE email LIKE '%jardin%';
Ejemplo 09 – Ejemplo con LIKE
Mostrar los Empleados cuyo email esté compuesto por cualquier cadena y un servidor de 9 letras
(como jardineria o cualquier otro) y que acabe en .es
SELECT *
FROM EMPLEADOS
WHERE email LIKE '%@__________.es';
SQL Server Documentación Oficial – Operadores de comparación
[Link]
sql?view=sql-server-ver15
UD5 – Selección de datos 8 / 38
2.5 Consultas con varias condiciones
Para poder realizar consultas con varias condiciones necesitamos combinarlas con
operadores lógicos, que en SQL Server (y en otros SGBD) son:
Operador Función
AND Y
OR O
NOT No
Veamos algunos ejemplos:
Ejemplo 01 – Ejemplo con varias condiciones
Mostrar código y nombre de los Productos que sean de la Gama 'Frutales' y Cantidad_en_stock sea
mayor que 50 unidades.
Nota: Mostremos también los campos implicados en las condiciones para comprobar el resultado
SELECT codProducto, nombre, gama, cantidad_en_stock
FROM PRODUCTOS
WHERE Gama='Frutales' AND cantidad > 50;
Ejemplo 02 – Ejemplo con varias condiciones
Mostrar codigo y nombre de los Clientes que sean de la Ciudad 'Madrid' o 'Barcelona'.
Nota: Mostremos también los campos implicados en las condiciones para comprobar el resultado
SELECT codCliente, nombre_cliente, ciudad
FROM CLIENTES
WHERE Ciudad='Madrid' OR Ciudad='Barcelona';
Podemos colocar tantas condiciones como sean necesarias. Es posible que sea
necesario utilizar paréntesis para que se evalúe una condición antes que otras.
(Ciudad = 'Madrid' AND codCliente=2) OR Ciudad='Barcelona'
UD3 – Diseño Físico y Edición de Datos 9 / 38
2.6 Consultas con funciones
Las funciones nos permiten realizar transformaciones de los datos para obtener
información. Existen multitud de funciones que procesan diferentes tipos de datos.
Algunas funciones con cadenas de caracteres
Función Descripción
CONCAT (cad1,cad2, ...) Concatena cadenas
UPPER (cad) Pasa a MAYÚSCULAS una cadena
LOWER (cad) Pasa a minúsculas una cadena
LTRIM (cad) Elimina de la cadena los espacios iniciales
RTRIM (cad) Elimina de la cadena los espacios finales
TRIM (cad) Elimina de la cadena los espacios iniciales y finales
LEFT (cad, X) Obtiene los X primeros caracteres de la cadena
RIGHT (cad, X) Obtiene los X últimos caracteres de la cadena
LEN (cad) Longitud de una cadena
Obtiene una cadena tomando cad como origen y
REPLACE (cad,ant,pos) cambiando la cadena ant por pos.
SELECT REPLACE('hola mundo', 'hola', 'adios');
> adios mundo
SQL Server Documentación Oficial – Funciones cadenas de caracteres
[Link]
Algunas funciones numéricas de un campo
Función Descripción
RAND() Número aleatorio entre 0 y 1
POWER(num,exp) Obtiene la potencia de numexp
FLOOR(num) Obtiene la parte entera de un número decimal
ROUND(num,X) Redondea un número a X decimales
SIGN(num) Devuelve 1 para positivo, 0 para 0 y -1 para negativo
Obtiene el valor absoluto de un número,es decir, su valor
ABS(num)
sin signo
UD5 – Selección de datos 10 / 38
Algunas funciones numéricas con varios registros
Función Descripción
COUNT(*) o COUNT(1) Cuenta los registros seleccionados
MIN (campo) Valor mínimo del campo de los registros seleccionados
MAX (campo) Valor máximo del campo de los registros seleccionados
SUM (campo) Suma de los valores del campo de los registros
AVG (campo) Media de los valores del campo de los registros
Algunas funciones de fechas de un campo
Función Descripción
YEAR (campo) Muestra el año del valor de un campo de tipo fecha
MONTH (campo) Muestra el mes del valor de un campo de tipo fecha
DAY (campo) Muestra el día del valor de un campo de tipo fecha
DATEADD Datepart puede ser: day, month o year.
(datepart, cantidad, fecha) Ejemplo. SELECT DATEADD(year, 1, '20191230');
DATEDIFF Datepart puede ser: day, month o year.
(datepart, fechaIni, fechaFin) Ejemplo. SELECT DATEDIFF(year, '20060730', '20100830');
DATENAME Datepart puede ser: day, month o year.
(datepart, fecha) Ejemplo. SELECT DATENAME(month, '20200630');
SQL Server Documentación Oficial – Funciones con fechas
[Link]
Funciones para campos calculados y para condiciones
Ejemplo 01 – Ejemplo con funciones
Mostrar código, nombre y "precio de venta al público" de los productos, pero ese precio debe ser
con IVA incluido, es decir, agregarle al PrecioVenta el 21% multiplicándolo por 1.21. Asignar el
alias pvp al nuevo campo calculado.
SELECT codProducto, nombre, precio_venta,
ROUND(precio_venta * 1.21, 2) AS PVP
FROM PRODUCTOS;
UD5 – Selección de datos 11 / 38
Ejemplo 02 – Ejemplo con funciones
Obtener el email de cada empleado teniendo en cuenta que el usuario es su nombre en minúsculas
y el dominio '@[Link]'
SELECT CONCAT(LOWER(nombre),'@[Link]') AS email
FROM EMPLEADOS;
Funciones con cadenas de caracteres
Ejemplo 03 – Ejemplo con funciones
Seleccionar de los empleados el nombre completo (NombreCompleto) concatenando el nombre y
los dos apellidos.
SELECT CONCAT(Nombre,' ',Apellido1,' ',Apellido2) AS NomCompleto
FROM EMPLEADOS;
Ejemplo 04 – Ejemplo con funciones
Obtener la inicial del nombre de todos los empleados
SELECT LEFT(apellido1,1) AS Inicial
FROM EMPLEADOS;
Ejemplo 05 – Ejemplo con funciones
Obtener el nombre de los empleados todo en mayúsculas
SELECT UPPER(Nombre)
FROM EMPLEADOS;
Ejemplo 06 – Ejemplo con funciones
Obtener el correo de los empleados, pero sustituyendo “[Link]” por “[Link]”
SELECT REPLACE(email,'[Link]','[Link]')
FROM EMPLEADOS;
Ejemplo 07 – Ejemplo con funciones
Obtener las tres primeras letras del nombre de los productos
SELECT SUBSTRING (nombre, 1, 3)
FROM PRODUCTOS;
UD5 – Selección de datos 12 / 38
Ejemplo 08 – Ejemplo con funciones
Obtener el nombre de los productos, pero con el orden de los caracteres invertido
SELECT nombre, REVERSE(nombre)
FROM PRODUCTOS;
Ejemplo 09 – Ejemplo con funciones
Obtener la abreviatura del nombre y primer apellido de los empleados concatenando la inicial del
nombre y la inicial del apellido1
SELECT CONCAT(LEFT(Nombre,1), LEFT(Apellido1,1)) AS inicial
FROM EMPLEADOS;
Ejemplo 10 – Ejemplo con funciones
Obtener un número aleatorio entre 0 y 9
SELECT FLOOR(RAND()*10);
Funciones con fechas
Ejemplo 11 – Ejemplo con funciones
Mostrar todos los campos de los pedidos que se realizaron el mes de enero
SELECT *
FROM PEDIDOS
WHERE DATENAME (month, fecha_pedido) = 'Enero';
Ejemplo 12 – Ejemplo con funciones
Mostrar en campos diferentes el año, el mes y el día de la fecha de los pedidos
SELECT YEAR(fecha_pedido), MONTH(fecha_pedido), DAY(fecha_pedido)
FROM PEDIDOS;
Ejemplo 13 – Ejemplo con funciones
Mostrar todos los campos de los pedidos que se registraron el mes de diciembre de 2008
SELECT *
FROM PEDIDOS
WHERE YEAR(fecha_pedido) = 2008
AND DATENAME(MONTH, fecha_pedido) = 'Diciembre';
UD5 – Selección de datos 13 / 38
Funciones numéricas de varios registros
Ejemplo 14– Ejemplo con funciones
Mostrar el número total de clientes
SELECT COUNT(*)
FROM CLIENTES;
Ejemplo 15 – Ejemplo con funciones
Mostrar la cantidad en euros de los productos dados de alta
SELECT SUM(precio_venta)
FROM PRODUCTOS;
Ejemplo 16– Ejemplo con funciones
Mostrar el importe del producto más barato y el del producto más caro
SELECT MIN(precio_venta), MAX(precio_venta)
FROM PRODUCTOS;
Ejemplo 17– Ejemplo con funciones
Obtener la media del importe de todos los productos dados de alta
SELECT AVG(precio_venta)
FROM PRODUCTOS;
UD5 – Selección de datos 14 / 38
2.7 Ejercicios
Ejercicio 1. Obtén las siguientes consultas con funciones
/* Valor absoluto de un número entero (-17) */
/* Número parte entera de un número decimal (35. 789) */
/* Resto de una división entre dos números enteros (15 y 4) */
/* Potencia de un número y su exponente: 5 elevado a 2 */
/* Raíz cuadrada de un número (64) */
/* Número aleatorio decimal entre 0 y 1 */
/* Redondea el número 45.267 a un decimal */
/* Obtiene el signo del número (-45.6) */
/* Concatenar varias cadenas: ‘Juan’, ‘López’ y ‘García’ */
/* Pasar a mayúsculas: ‘Soy alumno de FP’ */
/* Pasar a minúsculas: ‘Soy alumno de FP’ */
/* Obtener la inicial de una cadena (el nombre) de ‘Juan López García’ */
/* Obtener una parte final de la cadena anterior (apellido2) */
/* Obtener una parte central de la cadena anterior (apellido1) */
/* Obtener la longitud la cadena anterior */
/* Eliminar de la cadena ' Juan López García ' los espacios al principio y al final*/
/* Reemplaza en la cadena 'SQL Tutorial', SQL por HTML */
/* Muestra 'SQL Tutorial' de forma inversa */
UD5 – Selección de datos 15 / 38
/* Obtener la FECHA y HORA actual */
/* Añadir 10 días a la FECHA ‘03/05/2020’ */
/* Añadir 2 años a la FECHA ‘29/10/2020’ */
/* Diferencia de días entre las FECHAS: 10/02/2020 y 25/03/2020 */
/* Obtener el valor del DÍA de una FECHA */
/* Obtener el valor del MES de una FECHA */
/* Obtener el valor del AÑO de una FECHA */
/* Obtener nombre del mes de una FECHA */
UD5 – Selección de datos 16 / 38
Ejercicio 2. Ejecuta el siguiente código para crear la base de datos, tablas e insertar
registros y realiza las siguientes consultas.
CREATE DATABASE tienda;
USE tienda;
CREATE TABLE fabricante (
codigo INT IDENTITY(1,1),
nombre VARCHAR(100) NOT NULL
CONSTRAINT PK_fabricante PRIMARY KEY (codigo)
);
CREATE TABLE producto (
codigo INT IDENTITY(1,1),
nombre VARCHAR(100) NOT NULL,
precio DECIMAL(9,2) NOT NULL,
codigo_fabricante INT NOT NULL
CONSTRAINT PK_producto PRIMARY KEY (codigo)
FOREIGN KEY (codigo_fabricante) REFERENCES fabricante(codigo)
);
INSERT INTO fabricante VALUES('Asus');
INSERT INTO fabricante VALUES('Lenovo');
INSERT INTO fabricante VALUES('Hewlett-Packard');
INSERT INTO fabricante VALUES('Samsung');
INSERT INTO fabricante VALUES('Seagate');
INSERT INTO fabricante VALUES('Crucial');
INSERT INTO fabricante VALUES('Gigabyte');
INSERT INTO fabricante VALUES('Huawei');
INSERT INTO fabricante VALUES('Xiaomi');
INSERT INTO producto VALUES('Disco duro SATA3 1TB', 86.99, 5);
INSERT INTO producto VALUES('Memoria RAM DDR4 8GB', 120, 6);
INSERT INTO producto VALUES('Disco SSD 1 TB', 150.99, 4);
INSERT INTO producto VALUES('GeForce GTX 1050Ti', 185, 7);
INSERT INTO producto VALUES('GeForce GTX 1080 Xtreme', 755, 6);
INSERT INTO producto VALUES('Monitor 24 LED Full HD', 202, 1);
INSERT INTO producto VALUES('Monitor 27 LED Full HD', 245.99, 1);
INSERT INTO producto VALUES('Portátil Yoga 520', 559, 2);
INSERT INTO producto VALUES('Portátil Ideapad 320', 444, 2);
INSERT INTO producto VALUES('Impresora HP Deskjet 3720', 59.99, 3);
INSERT INTO producto VALUES('Impresora HP Laserjet Pro M26nw', 180, 3);
CONSULTAS
1. Lista el nombre de todos los productos que hay en la tabla producto.
2. Lista los nombres y los precios de todos los productos de la tabla producto.
3. Lista todas las columnas de la tabla producto.
4. Lista los nombres y los precios de todos los productos de la tabla producto,
convirtiendo los nombres a mayúscula.
5. Lista los nombres y los precios de todos los productos de la tabla producto,
convirtiendo los nombres a minúscula.
6. Lista el nombre de todos los fabricantes en una columna, y en otra columna obtenga en
mayúsculas los dos primeros caracteres del nombre del fabricante.
7. Lista los nombres y los precios de todos los productos de la tabla producto,
redondeando el valor del precio al primer decimal.
UD5 – Selección de datos 17 / 38
8. Lista los nombres y los precios de todos los productos de la tabla producto,
truncando el valor del precio para mostrarlo sin ninguna cifra decimal.
9. Lista los nombres de los fabricantes ordenados de forma ascendente.
10. Lista los nombres de los fabricantes ordenados de forma descendente.
11. Lista los nombres de los productos ordenados en primer lugar por el nombre de forma
ascendente y en segundo lugar por el precio de forma descendente.
12. Devuelve una lista con las 5 primeras filas de la tabla fabricante.
13. Lista el nombre de todos los productos del fabricante cuyo código de fabricante es
igual a 2.
14. Lista el nombre de los productos que tienen un precio menor o igual a 120€.
15. Lista el nombre de los productos que tienen un precio mayor o igual a 400€.
16. Lista el nombre de los productos que no tienen un precio mayor o igual a 400€.
17. Lista todos los productos que tengan un precio entre 80€ y 300€. Sin utilizar el
operador BETWEEN.
18. Lista todos los productos que tengan un precio entre 60€ y 200€. Utilizando el
operador BETWEEN.
19. Lista todos los productos donde el código de fabricante sea 1, 3 o 5. Sin utilizar el
operador IN.
20. Lista todos los productos donde el código de fabricante sea 1, 3 o 5. Utilizando el
operador IN.
21. Lista el nombre y el precio de los productos en céntimos (Habrá que multiplicar por
100 el valor del precio). Cree un alias para la columna que contiene el precio que se
llame céntimos.
22. Lista los nombres de los fabricantes cuyo nombre empiece por la letra S.
23. Lista los nombres de los fabricantes cuyo nombre termine por la vocal e.
24. Lista los nombres de los fabricantes cuyo nombre contenga el carácter w.
25. Lista los nombres de los fabricantes cuyo nombre sea de 4 caracteres.
26. Devuelve una lista con el nombre de todos los productos que contienen la cadena
Portátil en el nombre.
27. Devuelve una lista con el nombre de todos los productos que contienen la cadena
Monitor en el nombre y tienen un precio inferior a 215 €.
28. Lista el nombre y el precio de todos los productos que tengan un precio mayor o igual
a 180€. Ordene el resultado en primer lugar por el precio (en orden descendente) y en
segundo lugar por el nombre (en orden ascendente).
UD5 – Selección de datos 18 / 38
3. Consultas SELECT de AGRUPACIÓN
3.1 Consultas de agrupación
Cuando necesitamos agrupar varios registros para realizar operaciones para sumar
(SUM), contar (COUNT), o calcular la media (AVG), el mínimo (MIN) o el máximo
(MAX), necesitaremos realizar una instrucción SELECT indicando qué registros
agrupamos, es decir, qué campos mostramos de los registros comunes y sobre qué
campos realizamos la agrupación.
La sintaxis para realizar una consulta agrupada a una tabla es la siguiente:
SELECT [DISTINCT] campos
[FROM tabla/s
[WHERE condiciones sobre los campos]
[GROUP BY expresión1, expresión2 ,... ]
[HAVING condiciones sobre la agrupación]
[ORDER BY {col_name | expr | position} [ASC | DESC] , ...]
Es importante conocer el orden de las cláusulas:
SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY
Es importante recalcar que sólo podremos utilizar las funciones de agregado (MIN,
MAX, AVG, COUNT, etc.) en la cláusula SELECT y en el HAVING, pero nunca en
el WHERE.
Con este tipo de consultas, podremos dar respuesta a preguntas como estas:
- ¿Cuántos clientes son de la ciudad de Madrid?
- ¿Cuál es la cantidad total que ha gastado cada cliente en la tienda virtual?
- ¿Cuál es la media del gasto de los clientes?
UD5 – Selección de datos 19 / 38
Cláusula GROUP BY
Se utiliza con la instrucción SELECT y siempre se coloca después de la cláusula
WHERE. Sirve para combinar registros y utilizar funciones de agregado (COUNT(*),
MAX, MIN, SUM, AVG) para combinarlos en una columna o en varias. Es
conveniente recordar que GROUP BY mostrará un único resultado por grupo de datos.
Error típico al realizar estas consultas:
Cuando se ejecuta una SELECT con GROUP BY se comprueba que todas las columnas
incluidas en la cláusula SELECT estén dentro de la cláusula GROUP BY, aunque
pueden estar en cualquier orden o bien tener funciones de agregado (SUM, MIN,
MAX, etc.). Si encuentra alguna columna en el SELECT (que no esté dentro de una
función sumaria) que no aparezca en el GROUP BY, devuelve el error: “Not a GROUP
BY expression”
Cláusula HAVING
Se puede utilizar en las SELECT que tengan cláusula GROUP BY y sirve para poner
condiciones sobre la agrupación (es como el WHERE del GROUP BY).
UD5 – Selección de datos 20 / 38
3.2 Ejemplos de las primeras consultas agrupadas
A continuación, veremos algunos ejemplos de consultas agrupadas:
Ejemplo 01 - Contar
Mostrar el número de clientes (nombrar el nuevo campo NumClientes) que tenemos en cada ciudad
SELECT Ciudad, COUNT(*) AS NumClientes
FROM CLIENTES
GROUP BY Ciudad;
Ejemplo 02 – Sumar operaciones numéricas
Mostrar el pedido y el importe total (ImpTotal) de todas las líneas de cada pedido.
En la tabla lineapedidos tenemos el codPedido, y la Cantidad y PrecioUnidad de cada artículo del
pedido. Deberemos sumar Cantidad * PrecioUnidad de cada línea y luego sumarlas todas.
// Sin Agrupar
SELECT codPedido, cantidad * precio_unidad AS ImpLinea
FROM DETALLE_PEDIDOS;
//Agrupando por Pedido
SELECT codPedido, SUM(cantidad * precio_unidad) AS ImpTotal
FROM DETALLE_PEDIDOS
GROUP BY codPedido;
Podemos añadir también filtros que deban cumplir los registros mediante condiciones en la cláusula
WHERE.
Ejemplo 03 – Agrupaciones con condiciones WHERE
Mostrar el número de artículos (NumArticulos) de cada Gama cuyas PrecioVenta mayor que 20€
SELECT gama, COUNT(*) AS NumArticulos
FROM PRODUCTOS
WHERE precio_venta > 20
GROUP BY gama;
Pero puede ser que la condición a cumplir sea sobre los campos calculados. En estos casos, la
condición irá en la cláusula HAVING.
Ejemplo 04 – Agrupaciones con condiciones HAVING
Mostrar las Gamas de artículos que tengan más de 100 diferentes. Mostrar también el número de
artículos (NumArticulos)
SELECT gama, COUNT(*) AS NumArticulos
FROM productos
GROUP BY gama
HAVING COUNT(*) > 100;
UD5 – Selección de datos 21 / 38
Incluso podemos tener consultas que combinen WHERE y HAVING simultáneamente.
Ejemplo 05 – Agrupaciones con condiciones WHERE y HAVING
Mostrar los clientes que hayan realizado más de 1 pago de importe superior a 5€.
SELECT codCliente, COUNT(*) AS NumPagos
FROM pagos
WHERE total > 5
GROUP BY codCliente
HAVING COUNT(*) > 1;
3.3 Ejercicios
Ejercicio 1. Utilizando la misma tabla del ejercicio 2 del punto 2.7, resuelve las
siguientes consultas
1. Calcula el número total de productos que hay en la tabla productos.
2. Calcula el número de valores distintos de código de fabricante aparecen en la tabla
productos.
3. Calcula la media del precio de todos los productos.
4. Calcula el precio más barato de todos los productos.
5. Calcula el precio más caro de todos los productos.
6. Calcula la suma de los precios de todos los productos.
7. Calcula el precio más barato de todos los productos del fabricante Asus.
8. Calcula la suma de todos los productos del fabricante Asus.
9. Muestra el precio máximo, precio mínimo, precio medio y el número total de productos
que tiene el fabricante Crucial.
10. Calcula el número de productos que tienen un precio mayor o igual a 180€.
11. Calcula el número de productos que tiene cada fabricante con un precio mayor o igual
a 180€.
12. Lista el precio medio los productos de cada fabricante, mostrando solamente el código
del fabricante.
13. Lista el precio medio los productos de cada fabricante, mostrando solamente el código
del fabricante.
14. Lista el código de los fabricantes cuyos productos tienen un precio medio mayor o
igual a 150€.
15. Devuelve un listado con los códigos de los fabricantes que tienen 2 o más productos.
16. Devuelve un listado con los código de los fabricantes y el número de productos que
tiene cada uno con un precio superior o igual a 220 €. No es necesario mostrar el
nombre de los fabricantes que no tienen productos que cumplan la condición.
UD5 – Selección de datos 22 / 38
Ejemplo del resultado esperado.
17. Devuelve un listado con los códigos de los fabricantes donde la suma del precio de
todos sus productos es superior a 1000 €.
UD5 – Selección de datos 23 / 38
4. Consultas SELECT de varias tablas
Las bases de datos relacionales almacenan sus datos en varias tablas. Lo normal, en
casi cualquier consulta, es requerir datos de varias tablas a la vez. Esto es posible
porque los datos de las tablas están ligados por columnas que contienen claves ajenas
que permiten relacionar los datos de esa tabla con datos de otra tabla.
4.1 Consultas JOIN entre varias tablas
En SQL es posible hacer esto especificando más de una tabla en la cláusula FROM de
la instrucción SELECT. La única condición que deberemos tener muy en cuenta será
que deberemos utilizar ALIAS para las tablas y en la cláusula WHERE igualar los
campos relacionados como claves ajenas.
Ejemplo.
Tabla DEPARTAMENTOS Tabla EMPLEADOS
codEmpl nombre apellido edad codDpto
codDpto nombre 1 Carmen Sánchez 34 1
1 Dirección 2 Felipe Palomar 18 1
2 Informática 3 Andrés Fuster 27 2
3 RRHH 4 Isabel Jiménez 54 2
4 Administración 5 Ana Albert 44 3
6 Javier Rodríguez 21 4
7 Antonio Pérez 64
La columna codDpto en la tabla de empleados es una clave ajena. A través de ella
sabemos que Ana Albert, por ejemplo, es del departamento de RRHH.
La consulta que devolverá los datos de los empleados y el nombre del departamento
en el que trabajan será:
SELECT [Link], [Link], [Link],
[Link], [Link]
FROM DEPARTAMENTOS dpto,
EMPLEADOS emple
WHERE [Link] = [Link];
NOTAS
1) dpto y emple son alias de las tablas Departamentos y Empleados
2) Si no lo hubiéramos planteado de este modo, no podríamos distinguir el campo
codDpto entre ambas tablas puesto que se llama igual.
3) También podemos utilizar el nombre completo de la tabla como alias.
UD5 – Selección de datos 24 / 38
A continuación, veremos varios ejemplos de consultas con varias tablas involucradas:
Ejemplo 01 – SELECT multitabla
Mostrar los valores de la tabla pagos añadiendo el campo nombreCliente
SELECT [Link], p.*
FROM PAGOS p,
CLIENTES c
WHERE [Link] = [Link];
¿Cuántos registros tiene la tabla pagos? ___
¿Cuántos registros tiene la tabla clientes? ___
¿Cuántos registros devuelve la consulta anterior? ___
Si se elimina la condición WHERE, ¿cuántos registros obtenemos? Justifícalo.
Ejemplo 02 – SELECT multitabla
Mostrar los valores de la tabla pedidos añadiendo el campo nombreCliente
SELECT [Link], p.*
FROM PEDIDOS AS p,
CLIENTES AS c
WHERE [Link] = [Link];
¿Cuántos registros tiene la tabla pedidos? ___
¿Cuántos registros tiene la tabla clientes? ___
¿Cuántos registros devuelve la consulta anterior? ___
Si se elimina la condición WHERE, ¿cuántos registros obtenemos? Justifícalo.
En relaciones reflexivas, debemos cruzar una tabla consigo misma. Para poder hacer
esto, tenemos que asignar un alias a cada tabla para diferenciarlas. Veamos un
ejemplo.
Ejemplo 03 – SELECT multitabla
Mostrar los valores de la tabla empleados añadiendo los campos Nombre y Apellido1 de su jefe
SELECT [Link] nombreJefe, jefes.Apellido1 apellidoJefe,
trabajadores.*
FROM EMPLEADOS AS trabajadores,
EMPLEADOS AS jefes
WHERE [Link] = [Link];
¿Cuántos registros tienen la tabla empleados? ___
¿Cuántos registros devuelve la consulta anterior? ___
Si se elimina la condición WHERE, ¿cuántos registros obtenemos? Justifícalo.
UD5 – Selección de datos 25 / 38
También podemos relacionar más de una tabla. Veamos otro ejemplo.
Ejemplo 04 – SELECT multitabla
Mostrar los siguientes valores:
• De PEDIDOS: codPedido y fechaPedido
• De LINEAPEDIDOS: codProducto y cantidad
• De PRODUCTOS: nombre y gama
SELECT [Link], [Link],
[Link], [Link],
[Link], [Link]
FROM PEDIDOS ped,
LINEAPEDIDOS linped,
PRODUCTOS prod
WHERE [Link] = [Link]
AND [Link] = [Link];
¿Cuántos registros tienen la tabla empleados? ___
¿Cuántos registros devuelve la consulta anterior? ___
Si se elimina la condición WHERE, ¿cuántos registros obtenemos? Justifícalo.
Se puede observar que cuando se muestran datos de la tabla padre de relaciones con
cardinalidad 1-N, estos se repiten ya que pueden tener muchos hijos. En el ejemplo
anterior se puede ver claramente que los datos de la tabla pedidos se repiten tantas
veces como líneas de detalle tengan.
Además de utilizar los ALIAS para relacionar tablas en las consultas JOIN, también
podemos utilizar una sintaxis alternativa para hacerlo que nos permitirá entender mejor
las combinaciones derecha, izquierda y externa.
Las sintaxis es la siguiente:
tabla1 INNER JOIN tabla2 ON condicion
UD5 – Selección de datos 26 / 38
El ejemplo anterior quedaría:
Ejemplo 01 – SELECT multitabla con INNER JOIN
Mostrar los valores de la tabla pagos añadiendo el campo nombreCliente
SELECT [Link], pagos.*
FROM (pagos INNER JOIN clientes
ON [Link] = [Link]);
Veamos otro ejemplo de consulta multitabla:
Ejemplo 02 – SELECT multitabla con INNER JOIN
Mostrar los valores de la tabla lineapedidos pero añadiendo el campo fechaPedido y estado de la
tabla pedidos. Comprueba que el resultado contiene el mismo número de registros que
lineapedidos.
SELECT [Link], [Link], lineapedidos.*
FROM (lineapedidos INNER JOIN pedidos
ON [Link] = [Link]);
En las consultas multitabla mediante INNER JOIN, es posible que haya registros que
no se muestren por no haber cruce entre ellos. Por ejemplo, si queremos saber el
número de pedidos realizados por cada cliente, podríamos pensar en realizar la
siguiente consulta:
Ejemplo 03 – SELECT multitabla con INNER JOIN
SELECT [Link], [Link],
COUNT([Link]) AS Cuenta
FROM clientes INNER JOIN pedidos
ON [Link] = [Link]
GROUP BY [Link], [Link];
En la tabla de clientes hay 8 registros, pero el resultado de la consulta sólo muestra
5. Esto ocurre porque hay clientes que no han realizado todavía ningún pedido.
Para evitar esto, se introduce un cambio en la consulta que permite incluir todos los
registros de una tabla de la intersección, que en nuestro caso es clientes.
UD5 – Selección de datos 27 / 38
Lo haremos con la cláusula LEFT de la relación clientes-pedidos:
Ejemplo 04 – SELECT multitabla con LEFT JOIN
SELECT [Link], [Link],
COUNT([Link]) AS Cuenta
FROM clientes LEFT JOIN pedidos
ON [Link] = [Link]
GROUP BY [Link], [Link];
Para aquellos clientes que no hayan realizado ningún pedido se le asignará 0 en la
cuenta.
Veamos otro ejemplo:
Ejemplo 05 – SELECT multitabla con LEFT JOIN
Mostrar de la tabla productos el codProducto y su nombre, junto a la suma de la cantidad
(SumCantidad) pedida en todos los pedidos existentes. (tabla lineapedidos).
Nota: Ten en cuenta que de los productos que no haya habido ningún pedido debe aparecer 0.
SELECT [Link], [Link],
SUM([Link]) AS SumCantidad
FROM productos LEFT JOIN lineapedidos
ON [Link] = [Link]
GROUP BY [Link], [Link];
UD5 – Selección de datos 28 / 38
Para evitar que muestre NULL cuando no haya registros y en su lugar aparezca 0 o
cualquier otro valor podemos recurrir a la función integrada ISNULL.
ISNULL (valor, valor-siNulo)
• Si valor IS NOT NULL, mostrará valor
• Si valor IS NULL, mostrará valor-siNulo
Por otra parte, podemos utilizar la cláusula RIGHT, la cual permitiría que se mostrarán
los de la segunda tabla en la relación, en vez de LEFT que muestra la primera.
La consulta anterior quedaría como sigue:
SELECT [Link], [Link],
SUM([Link]) AS SumCantidad
FROM productos RIGHT JOIN lineapedidos
ON [Link] = [Link]
GROUP BY [Link], [Link];
UD5 – Selección de datos 29 / 38
4.2 Consultas de conjuntos
En este punto del tema recuperamos todos los conocimientos aprendidos acerca de los
conjuntos del Modelo Relacional. Recordemos que teníamos:
UNION
R S, la unión de R y S define el conjunto de elementos que están en R, en S o en
ambos. Un elemento solo aparece una vez, por lo que no habrá tuplas repetidas.
Requisitos para poder utilizarla:
• R y S deben tener esquemas idénticos.
• El orden de las columnas debe ser el mismo
INTERSECCIÓN
R S, define el conjunto de elementos que aparecen en simultáneamente tanto en la
relación R como en la relación S.
Requisitos para poder utilizarla:
• R y S deben tener esquemas idénticos.
• El orden de las columnas debe ser el mismo
DIFERENCIA
R – S o también denominada diferencia de R y S, define el conjunto de elementos que
están en R pero no en S. Es importante resaltar que R - S es diferente a S - R.
Requisitos para poder utilizarla:
• R y S deben tener esquemas idénticos.
• El orden de las columnas debe ser el mismo
A continuación, estudiaremos cada uno de ellos por separado aportando ejemplos para
comprender mejor este tipo de consultas.
UD5 – Selección de datos 30 / 38
4.1.1 UNION
En ocasiones necesitamos unir el resultado de dos consultas. Para ello el resultado
debe mostrar los mismos campos y con los mismos tipos de datos.
Por ejemplo, tenemos por un lado los clientes que han realizado pagos en el año 2019:
SELECT DISTINCT codCliente
FROM pagos
WHERE YEAR(fechaPago) = 2019;
Por otra parte, tenemos los clientes que han realizado pedidos en el año 2021:
SELECT DISTINCT codCliente
FROM pedidos
WHERE YEAR(fechaPedido) = 2021;
La unión de los registros de ambas consultas da como resultado la UNION de ambas
consultas.
Sintácticamente se realizaría del siguiente modo:
SELECT DISTINCT codCliente
FROM pagos
WHERE YEAR(fechaPago) = 2019
UNION
SELECT DISTINCT codCliente
FROM pedidos
WHERE YEAR(fechaPedido) = 2021;
Recuerda que los registros repetidos NO aparecen en estas consultas.
UD5 – Selección de datos 31 / 38
4.1.2 INTERSECCIÓN
Cuando deseamos obtener únicamente aquellos registros que se encuentran en una
tabla/consulta y que también se encuentran en otra tabla/consulta, utilizaremos la
palabra reservada INTERSECT.
Continuando con el ejemplo anterior, si quisiéramos obtener los registros que están en
una consulta y en la otra utilizaremos la siguiente sintaxis:
SELECT DISTINCT codCliente
FROM pagos
WHERE YEAR(fechaPago) = 2019
INTERSECT
SELECT DISTINCT codCliente
FROM pedidos
WHERE YEAR(fechaPedido) = 2021;
4.1.3 DIFERENCIA
Si queremos obtener los registros que están en una tabla MENOS los que están en la
otra utilizaremos la palabra reservada EXCEPT.
Continuando con el ejemplo anterior, si quisiéramos obtener los registros que están en
una consulta y en la otra utilizaremos la siguiente sintaxis:
SELECT DISTINCT codCliente
FROM pagos
WHERE YEAR(fechaPago) = 2019
EXCEPT
SELECT DISTINCT codCliente
FROM pedidos
WHERE YEAR(fechaPedido) = 2021;
No devuelve ningún registro porque el cliente 6 realizó un pago en 2019 y
también realizó un pedido en 2021.
SELECT DISTINCT codCliente
FROM pedidos
WHERE YEAR(fechaPedido) = 2021
EXCEPT
SELECT DISTINCT codCliente
FROM pagos
WHERE YEAR(fechaPago) = 2019;
Devuelve los clientes que realizaron pedidos en 2021 menos los que realizaron
pagos en 2019 (por ello, el codCliente 6 NO aparece en el resultado).
UD5 – Selección de datos 32 / 38
4.3 Subconsultas
Una subconsulta es una instrucción SELECT que se usa dentro de otra instrucción
SELECT.
Podemos distinguir tres tipos de subconsultas:
1. Las que aparecen junto con un OPERADOR DE COMPARACIÓN
WHERE expresión operador [ANY | ALL] (subconsulta)
2. Aquellas que utilizan LISTAS incorporadas (IN)
WHERE expresión [NOT] IN (subconsulta)
3. Las que son PRUEBAS DE EXISTENCIA mediante el operador EXISTS
WHERE [NOT] EXISTS (subconsulta)
A continuación, estudiaremos cada una de ellas por separado:
1. Subconsultas en WHERE con operador de comparación
Para el siguiente ejemplo, primero buscamos la cantidad media que pagan los clientes.
SELECT AVG(importe) AS ImporteMedio
FROM pagos;
Tabla pagos:
Ejemplo 01 – Subconsulta en WHERE con operador de comparación
Mostrar los registros de pagos que tengan importes superiores a la media.
SELECT *
FROM pagos
WHERE importe > (SELECT AVG(importe) AS ImporteMedio FROM pagos);
Para realizar las consultas podemos especificar ALL o ANY del siguiente modo:
• > ALL: significa “mayor que cualquier valor de la subconsulta” o de dicho de
otro modo “mayor que el máximo de todos los valores devueltos por la
subconsulta”
• > ANY: significa “mayor que algún valor de la subconsulta”
UD5 – Selección de datos 33 / 38
Veamos ejemplos de uso de ALL / ANY:
Tabla clientes:
Tabla pagos:
Ejemplo 02 – Subconsulta en WHERE con operador de comparación ANY
Muestra aquellos clientes que tengan un limiteCredito mayor que algún pago realizado en 2019.
SELECT *
FROM clientes
WHERE limiteCredito > ANY (SELECT importe FROM pagos
WHERE YEAR([Link]) = 2019);
Muestra todos los clientes porque tienen el limiteCredito mayor que cualquier pago realizado (se
compara con el menor de ellos que fue de 8,50 €)
Ejemplo 03 – Subconsulta en WHERE con operador de comparación ALL
Muestra aquellos clientes que tengan un limiteCredito mayor que todos los pagos realizados en 2019.
SELECT *
FROM clientes
WHERE limiteCredito > ALL (SELECT importe FROM pagos
WHERE YEAR([Link]) = 2019);
Aparecen los clientes cuyo limiteCredito es más mayor que el pago de más importe (se compara con el
mayor de todos ellos que fue de 510,99 €)
UD5 – Selección de datos 34 / 38
2. Subconsultas en WHERE con operador IN
El operador IN devuelve verdadero si el valor del campo de un registro está en el
conjunto de valores devuelto por la subconsulta.
Ejemplo 04 – Subconsulta en WHERE con operador de IN
Mostrar la gama de los productos que de los que se haya pedido más de 2 unidades
SELECT DISTINCT gama
FROM productos
WHERE codProducto IN (SELECT codProducto
FROM lineapedidos
WHERE cantidad > 2 );
NOTA: También puede usarse de forma negativa con NOT IN
3. Subconsultas en WHERE con operador EXISTS
El operador EXISTS es verdadero si la subconsulta devuelve al menos un registro.
Ejemplo 05 – Subconsulta en WHERE con operador de EXISTS
Utiliza una subconsulta correlacionada para obtener los datos de los clientes que hayan realizado algún
pedido.
SELECT DISTINCT codcliente
FROM clientes
WHERE EXISTS (SELECT *
FROM pedidos
WHERE codCliente = [Link]);
También puede usarse de forma negativa con NOT EXISTS
Subconsultas en la cláusula FROM
No es un tipo de subconsulta, sino un recurso al que podemos recurrir en caso de
necesitarlo. Podemos utilizar subconsultas como tablas y colocarlas en la cláusula
FROM.
Debemos recordar que estas subconsultas en el FROM deben contener ALIAS para
que funcionen correctamente.
Ejemplo 06 – Subconsulta en FROM
Aunque la siguiente consulta se puede obtener mediante una consulta JOIN típica, usaremos una
subconsulta para probar su funcionamiento en FROM de forma sencilla. Las subconsultas de FROM
deben tener un alias que asignaremos con AS.
Muestra los datos de los empleados que trabajen en oficinas de Madrid
UD5 – Selección de datos 35 / 38
SELECT empleados.*
FROM empleados,
(SELECT *
FROM oficinas
WHERE Ciudad='Madrid') AS OficinasMadrid
WHERE [Link] = [Link];
La consulta anterior sin usar subconsulta sería:
SELECT empl.*
FROM empleados empl,
Oficinas ofic
WHERE [Link] = [Link]
AND [Link] = 'Madrid';
Ambas consultas devuelven lo mismo, “Empleados que trabajen en la oficina de
Madrid”:
5. Vistas
Una vista es una tabla virtual cuyo contenido está definido por una consulta. Al igual
que una tabla, una vista consta de un conjunto de columnas y filas de datos con un
nombre asociado a ellos.
Sin embargo, una vista no existe como conjunto de valores de datos almacenados en
una base de datos, es decir, NO es en ningún caso una tabla. Las filas y las columnas
de datos proceden de tablas a las que se hace referencia en la consulta que define la
vista y se producen de forma dinámica cuando se hace referencia a la vista.
Una vista actúa como filtro de las tablas subyacentes a las que se hace referencia en
ella. La consulta que define la vista puede provenir de una o de varias tablas, o bien
de otras vistas de la base de datos actual u otras bases de datos.
Las vistas suelen usarse para centrar, simplificar y personalizar la percepción de la
base de datos para cada usuario.
A continuación, estudiaremos cómo crear vistas, modificarlas y borrarlas.
UD5 – Selección de datos 36 / 38
Creación de vistas
Para crear una vista, utilizaremos la siguiente sintaxis;
CREATE VIEW VNombreVista AS
SELECT …
Es una buena práctica poner una V como la primera letra del nombre de la vista.
A continuación, se muestra un ejemplo para crear una vista de una de las consultas de
los ejemplos anteriores:
CREATE VIEW VJefeTrabajadores AS
SELECT [Link] nombreJefe, jefes.Apellido1 apellidoJefe,
trabajadores.*
FROM EMPLEADOS AS trabajadores,
EMPLEADOS AS jefes
WHERE [Link] = [Link];
Para poder ver el contenido de la vista, haremos la SELECT igual que si de una tabla
se tratara:
SELECT *
FROM VJefeTrabajadores;
Modificación de vistas
La modificación de vistas se realiza de acuerdo con la siguiente sintaxis:
ALTER VIEW VNombreVista AS
SELECT …
De este modo se actualizará la consulta que utiliza la vista.
UD5 – Selección de datos 37 / 38
Borrado de vistas
Por último, para eliminar vistas utilizaremos la siguiente sintaxis:
DROP VIEW VnombreVista;
De este modo se borrará la vista de la base de datos.
UD5 – Selección de datos 38 / 38