Estructuras Básicas DML (SQL)
Estructuras Básicas DML (SQL)
Esta consulta graba en el campo1 el valor1, en el campo2 y valor2 y así sucesivamente. Hay
que prestar especial atención a acotar entre comillas simples (') los valores literales (cadenas
de caracteres) y las fechas indicarlas en formato 'aaaammdd' también entre comillas simples y
sin separadores.
PARA INSERTAR REGISTROS DE OTRA TABLA: En este caso la sintaxis es:
INSERT INTO Tabla (campo1, campo2, ..., campoN)
SELECT campo1, campo2, ..., campoN FROM TablaOrigen
En este caso se seleccionarán los campos 1,2,..., n de la tabla origen y se grabarán en los
campos 1,2,.., n de la Tabla. La condición SELECT puede incluir la cláusula WHERE para filtrar
los registros a copiar. Si Tabla y TablaOrigen poseen la misma estrucutra podemos simplificar la
sintaxis a:
INSERT INTO Tabla
SELECT TablaOrigen.* FROM TablaOrigen
De esta forma los campos de TablaOrigen se grabarán en Tabla, para realizar esta operación
es necesario que todos los campos de TablaOrigen estén contenidos con igual nombre en
Tabla. Con otras palabras que Tabla posea todos los campos de TablaOrigen (igual nombre e
igual tipo).
Página 35 de 88
Guía de Base de Datos Volumen II
UPDATE es especialmente útil cuando se desea cambiar un gran número de registros. Puede
cambiar varios campos a la vez.
El ejemplo siguiente incrementa los valores Cantidad pedidos en un 10 por ciento y los valores
Transporte en un 3 por ciento para aquellos que se hayan enviado al Reino Unido:
UPDATE Pedidos
SET Pedido = Pedidos * 1.1, Transporte = Transporte * 1.03
WHERE PaisEnvío = 'AR';
UPDATE no genera ningún resultado. Para saber qué registros se van a cambiar, hay que
examinar primero el resultado de una consulta de selección que utilice el mismo criterio y
después ejecutar la consulta de actualización.
UPDATE Empleados
SET Grado = 5
WHERE Grado = 2;
UPDATE Productos
SET Precio = Precio * 1.1
WHERE Proveedor = 8 AND Familia = 3;
Página 36 de 88
Guía de Base de Datos Volumen II
El siguiente ejemplo elimina las filas de la tabla Empleados de todos aquellos emplados que
son vendedores.
DELETE FROM Empleados
WHERE Cargo = 'Vendedor';
Si desea eliminar todas las filas de una tabla, eliminar la propia tabla es más eficiente que
ejecutar una consulta de borrado.
Se puede utilizar DELETE para eliminar filas de una única tabla o desde varios lados de una
relación uno a muchos. Las operaciones de eliminación en cascada en una consulta
únicamente eliminan desde varios lados de una relación. Por ejemplo, en la relación entre las
tablas Clientes y Pedidos, la tabla Pedidos es la parte de muchos por lo que las operaciones en
cascada solo afectaran a la tabla Pedidos. Una consulta de borrado elimina las filas completas,
no únicamente los datos en campos específicos.
Si desea eliminar valores en un campo especificado, crear una consulta de actualización que
cambie los valores a Null.
Página 37 de 88
Guía de Base de Datos Volumen II
Una especificación de tabla puede ser el nombre de una vista guardada, o el nombre de una
tabla que a su vez puede tener el siguiente formato:
Utilización del * Se utiliza el asterisco * en la lista de selección para indicar 'todas las columnas
de la tabla'. Tiene dos ventajas:
a) Evitar nombrar las columnas una a una (es más corto)
b) Si añadimos una columna nueva en la tabla, esta nueva columna saldrá sin tener que
modificar la consulta.
Se puede combinar el * con el nombre de una tabla (ej. escuelas.*), pero esto se utiliza más
cuando el origen de la consulta son dos tablas.
Ejemplo:
SELECT * FROM escuelas
o bien
SELECT escuelas.* FROM escuelas
Página 38 de 88
Guía de Base de Datos Volumen II
Columnas de la tabla origen: Las columnas se pueden especificar mediante su nombre simple
(nbcol) o su nombre cualificado (nbtabla.nbcol, el nombre de la columna precedido del nombre
de la tabla que contiene la columna y separados por un punto).
El nombre cualificado se puede emplear siempre que queramos y es obligatorio en algunos
casos que veremos más adelante.
Ejemplos:
SELECT CodRes, CodTipoVisita, alumnosReserva, codGuia
FROM reservavisita
Lista el Código de la reserva, código del tipo de visita, la cantidad de alumnos reservados por
tipo de visita y los códigos de guía de todas las reservas.
SELECT CodEscuela, Nombre, Domicilio
FROM escuelas
Página 39 de 88
Guía de Base de Datos Volumen II
Lista el nombre, mes y año del contrato de cada vendedor. La función MONTH() devuelve el
mes de una fecha. La función YEAR() devuelve el año de una fecha.
SELECT oficina, 'tiene ventas de ', ventas
FROM oficinas
Listar las ventas en cada oficina con el formato: X tiene ventas de 999.
Para ordenar las filas del resultado de la consulta, tenemos la cláusula ORDER BY. Con esta
cláusula se altera el orden de visualización de las filas de la tabla pero en ningún caso se
modifica el orden de las filas dentro de la tabla. La tabla no se modifica. Podemos indicar la
columna por la que queremos ordenar utilizando su nombre de columna (nbcolumna) o
utilizando su número de orden que ocupa en la lista de selección (Nºcolumna).
Ejemplo:
SELECT nombre, oficina, contrato
FROM empleados
ORDER BY oficina
es equivalente a
SELECT nombre, oficina, contrato
FROM empleados
ORDER BY 2
Por defecto el orden será ascendente (ASC) (de menor a mayor si el campo es numérico, por
orden alfabético si el campo es de tipo texto, de anterior a posterior si el campo es de tipo
fecha/hora, etc.
Ejemplos:
SELECT nombre, numemp, oficinarep
FROM empleados
ORDER BY nombre
Obtiene un listado de los empleados por orden de antigüedad en la empresa (los de más
antigüedad aparecen primero).
Página 40 de 88
Guía de Base de Datos Volumen II
Obtiene un listado de los empleados ordenados por volumen de ventas sacando los de
menores ventas primero.
Si queremos podemos alterar ese orden utilizando la cláusula DESC (DESCendente), en este
caso el orden será el inverso al ASC.
Ejemplo:
SELECT nombre, numemp, contrato
FROM empleados
ORDER BY contrato des
Obtiene un listado de los empleados por orden de antigüedad en la empresa empezando por
los más recientemente incorporados.
También podemos ordenar por varias columnas, en este caso se indican las columnas
separadas por comas. Se ordenan las filas por la primera columna de ordenación, para un
mismo valor de la primera columna, se ordenan por la segunda columna, y así sucesivamente.
La cláusula DESC o ASC se puede indicar para cada columna y así utilizar una ordenación
distinta para cada columna. Por ejemplo ascendente por la primera columna y dentro de la
primera columna, descendente por la segunda columna.
Ejemplos:
SELECT region, ciudad, ventas
FROM oficinas
ORDER BY region, ciudad
Muestra las ventas de cada oficina, ordenadas por orden alfabético de región y dentro de cada
región por ciudad.
SELECT region, ciudad, (ventas - objetivo) AS superavit
FROM oficinas
ORDER BY region, 3 DESC
Lista las oficinas clasificadas por región y dentro de cada región por superávit de modo que las
de mayor superávit aparezcan las primeras.
Página 41 de 88
Guía de Base de Datos Volumen II
ó
SELECT ALL dir
FROM oficinas
Lista los códigos de los directores de las oficinas. Si el director 108 aparece en cuatro oficinas,
aparecerá cuatro veces en el resultado de la consulta.
SELECT DISTINCT dir
FROM oficinas
En este caso el valor 108 aparecerá una sola vez ya que le decimos que liste los distintos
valores de directores.
LA CLÁUSULA TOP: La cláusula TOP permite sacar las n primeras filas de la tabla origen. No
elige entre valores iguales, si pido los 25 primeros valores pero el que hace 26 es el mismo
valor que el 25, entonces devolverá 26 registros en vez de 25. Siempre se guía por la columna
de ordenación, la que aparece en la cláusula ORDER BY.
Por ejemplo queremos saber los dos empleados más antiguos de la empresa.
SELECT TOP 2 numemp, nombre
FROM empleado
ORDER BY contrato
Lista el código y nombre de los empleados ordenándolos por fecha de contrato, sacando
únicamente los dos primeros (serán los dos más antiguos).
SELECT TOP 3 numemp, nombre
FROM empleado
ORDER BY contrato
Página 42 de 88
Guía de Base de Datos Volumen II
En este caso tiene que sacar los tres primeros, pero si en las fechas de contrato tenemos
20/10/86, 10/12/86, 01/03/87, 01/03/87, la tercera fecha es igual que la cuarta, en este caso
sacará estas cuatro filas en vez de tres, y sacaría todas las filas que tuviesen el mismo valor
que la tercera fecha de contrato.
El número de filas que queremos visualizar se puede expresar con un número entero o como un
porcentaje sobre el número total de filas que se recuperarían sin la cláusula TOP. En este
último caso utilizaremos la cláusula TOP n PERCENT.
SELECT TOP 20 PERCENT nombre
FROM empleado
ORDER BY contrato
Lista el nombre de los empleados ordenándolos por fecha de contrato, sacando únicamente un
20% del total de empleados. Como tenemos 10 empleados, sacará los dos primeros, si
tuviésemos 100 empleados sacaría los 20 primeros.
LA CLÁUSULA WHERE: La cláusula WHERE selecciona únicamente las filas que cumplan la
condición de selección especificada.
En la consulta sólo aparecerán las filas para las cuales la condición es verdadera (TRUE), los
valores nulos (NULL) no se incluyen por lo tanto en las filas del resultado. La condición de
selección puede ser cualquier condición válida o combinación de condiciones utilizando los
operadores NOT (no) AND (y) y OR (ó).
Por ejemplo:
SELECT nombre
FROM empleados
WHERE oficina = 12
Lista el nombre de los empleados de la oficina 12 que tengan más de 30 años. (Oficina igual a
12 y edad mayor que 30).
CONDICIONES DE SELECCIÓN Las condiciones de selección son las condiciones que pueden
aparecer en la cláusula WHERE. En SQL tenemos cinco condiciones básicas:
a) El test de comparación
b) El test de rango
c) El test de pertenencia a un conjunto
d) El test de valor nulo
e) El test de correspondencia con patrón
Página 43 de 88
Guía de Base de Datos Volumen II
Por ejemplo:
SELECT numemp, nombre
FROM empleados
WHERE ventas > cuota
Lista los empleados contratados antes del año 88 (cuya fecha de contrato sea anterior al 1 de
enero de 1988).
SELECT numemp, nombre
FROM empleados
WHERE YEAR(contrato) < 1988
Este ejemplo obtiene lo mismo que el anterior pero utiliza la función year(). Obtiene los
empleados cuyo año de la fecha de contrato sea menor que 1988.
Por ejemplo:
SELECT numemp, nombre
FROM empleados
WHERE ventas BETWEEN 100000 AND 500000
Lista los empleados cuyas ventas estén comprendidas entre 100.000 y 500.00. Se podría
obtener lo mismo con la expresión WHERE ventas >= 100000 AND ventas <0 500000.
Página 44 de 88
Guía de Base de Datos Volumen II
Por ejemplo:
SELECT numemp, nombre, oficina
FROM empleados
WHERE oficina IN (12,14,16)
Lista los empleados de las oficinas 12, 14 y 16. Se podría obtener lo mismo con la expresión
WHERE (oficina = 12) OR (oficina = 14) OR (oficina = 16)
D. Test de valor nulo (IS NULL) Una condición de selección puede dar como resultado el
valor verdadero TRUE, falso FALSE o nulo NULL. Cuando una columna que interviene
en una condición de selección contiene el valor nulo, el resultado de la condición no es
verdadero ni falso, sino nulo, sea cual sea el test que se haya utilizado. Por eso si
queremos listar las filas que tienen valor en una determinada columna, no podemos
utilizar el test de comparación, la condición oficina = null devuelve el valor nulo sea cual
sea el valor contenido en oficina. Si queremos preguntar si una columna contiene el
valor nulo debemos utilizar un test especial, el test de valor nulo.
Tiene la siguiente sintaxis:
Por ejemplo:
SELECT oficina, ciudad
FROM oficinas
WHERE dir IS NULL
Página 45 de 88
Guía de Base de Datos Volumen II
Ejemplos:
SELECT numemp, nombre
FROM empleados
WHERE nombre LIKE 'Luis%'
Lista los empleados cuyo nombre empiece por Luis (Luis seguido de cero o más caracteres).
SELECT numemp, nombre
FROM empleados
WHERE nombre LIKE '%Luis%'
Lista los empleados cuyo nombre contiene Luis, en este caso también saldría los empleados
José Luis (cero o más caracteres seguidos de LUIS y seguido de cero o más caracteres).
SELECT numemp, nombre
FROM empleados
WHERE nombre LIKE '__a%'
Lista los empleados cuyo nombre contenga una a como tercera letra (dos caracteres, la letra a,
y cero o más caracteres.
Página 46 de 88
Guía de Base de Datos Volumen II
Las consultas de resumen introducen dos nuevas cláusulas a la sentencia SELECT, la cláusula
GROUP BY y la cláusula HAVING, son cláusulas que sólo se pueden utilizar en una consulta de
resumen, se tienen que escribir entre la cláusula WHERE y la cláusula ORDER BY y tienen la
siguiente sintaxis:
Las detallaremos en la página siguiente del tema, primero vamos a introducir otro concepto
relacionado con las consultas de resumen, las funciones de columna.
Página 47 de 88
Guía de Base de Datos Volumen II
El argumento de la función indica con qué valores se tiene que operar, por eso expresión suele
ser un nombre de columna, columna que contiene los valores a resumir, pero también puede
ser cualquier expresión válida que devuelva una lista de valores.
La función SUM() calcula la suma de los valores indicados en el argumento. Los datos que se
suman deben ser de tipo numérico (entero, decimal, coma flotante o monetario...). El resultado
será del mismo tipo aunque puede tener una precisión mayor.
Ejemplo:
SELECT SUM(ventas)
FROM oficinas
Obtiene una sola fila con el resultado de sumar todos los valores de la columna ventas de la
tabla oficinas.
La función AVG() calcula el promedio (la media aritmética) de los valores indicados en el
argumento, también se aplica a datos numéricos, y en este caso el tipo de dato del resultado
puede cambiar según las necesidades del sistema para representar el valor del resultado.
StDev() y StDevP() calculan la desviación estándar de una población o de una muestra de la
población representada por los valores contenidos en la columna indicada en el argumento. Si
la consulta base (el origen) tiene menos de dos registros, el resultado es nulo. Es interesante
destacar que el valor nulo no equivale al valor 0, las funciones de columna no consideran los
valores nulos mientras que consideran el valor 0 como un valor, por lo tanto en las funciones
AVG(), STDEV(), STDEVP() los resultados no serán los mismos con valores 0 que con valores
nulos.
Veámoslo con un ejemplo:
Página 48 de 88
Guía de Base de Datos Volumen II
Las funciones MIN() y MAX() determinan los valores menores y mayores respectivamente. Los
valores de la columna pueden ser de tipo numérico, texto o fecha. El resultado de la función
tendrá el mismo tipo de dato que la columna. Si la columna es de tipo numérico MIN() devuelve
el valor menor contenido en la columna, si la columna es de tipo texto MIN() devuelve el primer
valor en orden alfabético, y si la columna es de tipo fecha, MIN() devuelve la fecha más antigua
y MAX() la fecha más reciente.
La función COUNT(nb columna) cuenta el número de valores que hay en la columna, los
datos de la columna pueden ser de cualquier tipo, y la función siempre devuelve un número
entero. Si la columna contiene valores nulos esos valores no se cuentan, si en la columna
aparece un valor repetido, lo cuenta varias veces. COUNT(*) permite contar filas en vez de
valores. Si la columna no contiene ningún valor nulo, COUNT(nbcolumna) y COUNT(*)
devuelven el mismo resultado, mientras que si hay valores nulos en la columna, COUNT(*)
cuenta también esos valores mientras que COUNT(nb columna) no los cuenta.
Ejemplo:
SELECT COUNT(numemp)
FROM empleados
o bien
SELECT COUNT(*)
FROM empleados
En este caso las dos sentencias devuelven el mismo resultado ya que la columna numemp no
contiene valores nulos (es la clave principal de la tabla empleados).
SELECT COUNT(oficina)
FROM empleados
Esta sentencia por el contrario, nos devuelve el número de valores no nulos que se encuentran
en la columna oficina de la tabla empleados, por lo tanto nos dice cuántos empleados tienen
una oficina asignada.
Se pueden combinar varias funciones de columna en una expresión pero no se pueden anidar
funciones de columna, es decir:
SELECT (AVG(ventas) * 3) + SUM(cuota) FROM ... Es correcto
SELECT AVG(SUM(ventas)) FROM ... NO es correcto, no se puede incluir una
función de columna dentro de una función de columna.
Si queremos no considerar del origen de datos algunas filas, basta incluir la cláusula WHERE
que ya conocemos después de la cláusula FROM.
Ejemplo: Queremos saber el acumulado de ventas de los empleados de la oficina 12.
SELECT SUM(ventas)
FROM empleados
WHERE oficina = 12
Página 49 de 88
Guía de Base de Datos Volumen II
Hasta ahora las consultas de resumen que hemos visto utilizan todas las filas de la tabla y
producen una única fila resultado.
Se pueden obtener subtotales con la cláusula GROUP BY. Una consulta con una cláusula
GROUP BY se denomina consulta agrupada ya que agrupa los datos de la tabla origen y
produce una única fila resumen por cada grupo formado. Las columnas indicadas en el GROUP
BY se llaman columnas de agrupación.
Ejemplo:
SELECT SUM(ventas)
FROM repventas
Se forma un grupo para cada oficina, con las filas de la oficina, y la suma se calcula sobre las
filas de cada grupo. El ejemplo obtiene una lista con la suma de las ventas de los empleados de
cada oficina.
La consulta quedaría mejor incluyendo en la lista de selección la oficina para saber a qué
oficina corresponde la suma de ventas:
SELECT oficina,SUM(ventas)
FROM repventas
GROUP BY oficina
Equivaldría a agrupar las líneas de pedido por precio unitario y sacar de cada precio unitario el
importe total vendido.
Página 50 de 88
Guía de Base de Datos Volumen II
Y no está permitido:
SELECT SUM(importe), rep
FROM pedidos
GROUP BY rep*10
rep es una columna simple que no está encerrada en una función de columna, ni está en la lista
de columnas de agrupación. Se pueden agrupar las filas por varias columnas, en este caso se
indican las columnas separadas por una coma y en el orden de mayor a menor agrupación.
Ejemplo: Queremos obtener la suma de las ventas de las oficinas agrupadas por región y
ciudad:
SELECT SUM(ventas)
FROM oficinas
GROUP BY region, ciudad
Todas las filas que tienen valor nulo en el campo de agrupación, pasan a formar un único
grupo. Es decir, considera el valor nulo como un valor cualquiera a efectos de agrupación.
La cláusula HAVING nos permite seleccionar filas de la tabla resultante de una consulta de
resumen.
Para la condición de selección se pueden utilizar los mismos tests de comparación descritos en
la cláusula WHERE, también se pueden escribir condiciones compuestas (unidas por los
operadores OR, AND, NOT), pero existe una restricción.
En la condición de selección sólo pueden aparecer:
Valores constantes.
Funciones de columna,
Columnas de agrupación (columnas que aparecen en la cláusula GROUP BY).
Cualquier expresión basada en las anteriores.
Página 51 de 88
Guía de Base de Datos Volumen II
Ejemplo: Queremos saber las oficinas con un promedio de ventas de sus empleados mayor que
500.000 pesos.
SELECT oficina
FROM empleados
GROUP BY oficina
HAVING AVG(ventas) > 500000
NOTA: Para obtener lo que se pide hay que calcular el promedio de ventas de los empleados
de cada oficina, por lo que hay que utilizar la tabla empleados. Tenemos que agrupar los
empleados por oficina y calcular el promedio para cada oficina, por último nos queda
seleccionar del resultado las filas que tengan un promedio superior a 500.000 pesos.
Página 52 de 88