Documentos de Académico
Documentos de Profesional
Documentos de Cultura
El lenguaje de manipulación de datos más popular hoy día es SQL, usado para recuperar y
manipular datos en una base de datos relacional. Otros ejemplos de DML son los usados por bases
de datos IMS/DL1, CODASYL u otras.
1- INSERT
Una sentencia INSERT de SQL agrega uno o más registros a una (y sólo una) tabla en una base de
datos relacional.
2-UPDATE
Una sentencia UPDATE de SQL es utilizada para modificar los valores de un conjunto de registros
existentes en una tabla.
3-DELETE
Una sentencia DELETE de SQL borra uno o más registros existentes en una tabla.
Ejemplo 1 (borro todos los valores de las columnas alumno y materia donde la materia sea spd2):
Capacidades
DQL es la abreviatura del Data Query Language (lenguaje de consulta de datos) de SQL. El único
comando que pertenece a este lenguaje es el versátil comando SELECT Este comando permite
fundamentalmente:
• Obtener registros (filas) de una tabla de acuerdo con ciertos criterios (selección)
• Agrupar datos
Sintaxis sencilla del comando SELECT
SELECT * | {[DISTINCT] columna | expresión [[AS] alias], ...}
FROM tabla;
Donde:
Ejemplos:
El símbolo * (asterisco) sirve para seleccionar todas las columnas de una tabla. Ejemplo:
Sólo se puede utilizar tras la palabra SELECT y no puede estar acompañado de ninguna expresión.
Por ejemplo, no es correcto:
SELECT *, precio+iva
FROM empleado;
alias
Los alias sirven para dar otro nombre a una columna. Por ejemplo:
Usar o no AS es cuestión de gustos. Sus defensores lo hacen porque la instrucción SELECT es más
legible.
En los alias, es muy normal utilizar espacios en blanco para indicar el nombre a fin de conseguir
nombres más claros. En ese caso se debe utilizar comillas dobles para especificar el alias:
FROM trabajos;
Con comillas dobles podemos utilizar cualquier carácter para dar nombre al alias.
Cálculos
- Aritméticos
Los operadores + (suma), - (resta), * (multiplicación) y / (división), se pueden utilizar para hacer
cálculos en las consultas. Cuando se utilizan como expresión en una consulta SELECT, no modifican
los datos originales sino que como resultado de la vista generada por SELECT, aparece un nueva
columna. Ejemplo:
Esa consulta obtiene tres columnas. La tercera muestra el resultado de la operación. Al no indicar
nombre alguno, se toma la propia expresión (precio*1,16) como cabecera de esa columna. Eso
significa que no tiene un nombre válido, por lo que se debería siempre utilizar alias:
FROM articulos;
• Tienen más prioridad las operaciones de multiplicación y división que las de suma y la
resta.
Cuando una expresión aritmética se aplica sobre valores NULL, el resultado es el propio valor
NULL.
Se puede utilizar cualquiera de los operadores aritméticos: suma (+), resta (-), multiplicación (*),
división (/). Como es habitual, la multiplicación y la división tienen preferencia sobre la suma y la
resta en el orden de ejecución de la instrucción; dicho orden se puede alterar mediante el uso de
los paréntesis.
- Concatenación de textos
El operador de concatenar texto permite unir dos textos. Normalmente se usa para juntar
resultados de diferentes expresiones en una miasma columna de una tabla. Todas las bases de
datos incluyen algún operador para encadenar textos. En SQL Server y otros gestores es el signo +
(suma), en Oracle son los signos ||. Ejemplo (Oracle):
FROM piezas;
El resultado sería:
AR 6 AR-6
AR 7 AR-7
AR 8 AR-8
AR 9 AR-9
AR 12 AR-12
AR 15 AR-15
AR 20 AR-20
AR 21 AR-21
BI 10 BI-10
BI 20 BI-20
BI 22 BI-22
BI 24 BI-24
En la mayoría de bases de datos, la función CONCAT (se describe más adelante) realiza la misma
función.
- Condiciones
Se pueden realizar consultas que restrinjan los datos de salida de las tablas. Para ello se utiliza la
cláusula WHERE. Esta cláusula permite colocar una condición que han de cumplir todos los
registros, los que no la cumplan no aparecen en el resultado.
Ejemplo:
Operadores de comparación
Se pueden utilizar en la cláusula WHERE, son:
Operador Significado
= Igual
<> Distinto
!= Distinto
Se pueden utilizar tanto para comparar números como para comparar textos y fechas. En el caso
de los textos, las comparaciones se hacen en orden alfabético.
En muchas bases de datos hay problemas con la Ñ y otros símbolos nacionales al ordenar o
comparar con el signo de mayor o menor, ya que la el orden ASCII no respeta el orden de cada
alfabeto nacional.
No obstante, es un problema que prácticamente está solucionado, ya que la mayoría de los SGBD
son compatibles con Unicode. En concreto Oracle no tiene este problema desde hace ya unas
cuantas versiones del producto).
Valores lógicos
Son:
Operador Significado
AND Devuelve verdadero si las expresiones a su izquierda y derecha son ambas verdaderas
OR Devuelve verdadero si cualquiera de las dos expresiones a izquierda y derecha del OR, son
verdaderas
NOT Invierte la lógica de la expresión que está a su derecha. Si era verdadera, mediante NOT
pasa a ser falso.
Ejemplos:
A y la O */
BETWEEN
El operador BETWEEN nos permite obtener datos que se encuentren en un rango. Uso:
Saca piezas cuyos precios estén entre 3 y 8 (ambos incluidos). En realidad es una forma más rápida
de hacer esta consulta:
IN
Permite obtener registros cuyos valores estén en una lista de valores:
Obtiene piezas cuyos precios sean 3, 5 u 8 (no valen ni el precio 4 ni el 6, por ejemplo).
LIKE
Se usa sobre todo con textos, permite obtener registros cuyo valor en un campo cumpla una
condición textual. LIKE utiliza una cadena que puede contener estos símbolos:
Símbolo Significado
_ Un carácter cualquiera
Ejemplos:
IS NULL
En SQL para valorar los nulos, es frecuente cometer este error:
WHERE telefono=NULL
Esa expresión no es correcta. No debemos usar los operadores de comparación normales con
valores nulos. La consulta anterior no muestra a las personas sin teléfono (que es lo que
pretendemos).
Existe también la expresión contraria: IS NOT NULL que devuelve verdadero en el caso contrario,
ante cualquier valor distinto de nulo.
Precedencia de operadores
A veces las expresiones que se producen en los SELECT son muy extensas y es difícil saber que
parte de la expresión se evalúa primero. Por ello es necesario conocer la tabla de precedencia que
indica qué operadores tienen prioridad entre sí. Los que están al nivel 1 tienen la máxima
prioridad.
1 *(Multiplicar) /(dividir)
2 + (Suma) - (Resta)
3 || (Concatenación)
7 NOT
8 AND
9 OR
Las reglas de prioridad se pueden alterar mediante paréntesis. Por ejemplo, supongamos que
tenemos esta expresión:
FROM alumnos
Parece que queremos obtener el nombre y apellidos de los alumnos aprobados (nota>=5) de las
clases número 11 y 13. Pero como AND tiene prioridad sobre el OR, sacaremos los alumnos
aprobados de la clase 13 y además se mostrarán todos los alumnos de la clase 11 (hayan aprobado
o no).
FROM alumnos
En esa cláusula se coloca una lista de campos por los que queremos ordenar los resultados. Se
ordena primero por el primer campo de la lista, si hay coincidencias por el segundo, si ahí también
las hay por el tercero, y así sucesivamente.
Se puede colocar las palabras ASC O DESC (por defecto se toma ASC). Esas palabras permiten
ordenar en ascendente (de la A a la Z, de los números pequeños a los grandes) o en descendente
(de la Z a la a, de los números grandes a los pequeños) respectivamente. Por defecto, si no se
indica nada, la ordenación es ascendente.
FROM tabla
[WHERE condición]
Las expresiones de la cláusula ORDER BY pueden ser cualquiera que haga referencia a una
columna o a cálculos sobre la columna. Ejemplo:
SELECT nombre,apellido1,apellido2
FROM alumnos
Obtendrá la lista de alumnos ordenados por su primer apellido, luego por el segundo y luego por el
nombre.
Ascendente y descendente
Normalmente ordena en ascendente, pero si usamos DESC ordenará en descendente:
f_n fecha_nacimiento
FROM alumnos
Mostrará la lista de alumnos ordenada de forma que aparezcan primero los más jóvenes.
f_n fecha_nacimiento
FROM alumnos
f_n fecha_nacimiento
FROM alumnos
ORDER BY 4 DESC;
FROM alumnos
Este último SELECT muestra los datos de los alumnos de forma que salgan ordenados en
ascendente por el número de clase. Dentro de cada clase saldrán primero por fecha de
nacimiento, pero ordenando en descendente la fecha.
Orden por número de columnas
Oracle permite ordenar en base a números que representan las columnas en el orden en el que
aparecen en esta instrucción. Ejemplo:
fecha_nacimiento, id_clase
FROM alumnos
ORDER BY 2,3,1;
En este ejemplo se ordena por primer apellido, luego por segundo y luego por el nombre.
fecha_nacimiento, id_clase
FROM alumnos
ORDER BY 2,3,nombre;
A la hora de ordenar si tenemos valores nulos en las columnas por las que estamos ordenando, las
filas con valores nulos aparecen al final de la consulta.
Pero podemos indicar si queremos que los nulos vayan al principio o al final indicándolo de
manera correcta tras la cláusula ORDER BY. Posibilidades:
• NULLS LAST
• NULLS FIRST
Ejemplo:
FROM alumnos
Variables de sustitución.
Es posible tener que repetir consultas en las que sólo cambia un dato. Por ejemplo, esta consulta:
edad, salario
FROM trabajadores
WHERE cod_trabajador=198;
Muestra los datos del trabajador 198. Si ahora quisiéramos los datos del trabajador 199,
repetiríamos la consulta pero modificando el 198 por un 199.
Cuando se detecta este tipo de consultas repetitivas en las que varía un solo dato (o unos pocos),
algunos Sistemas de Bases de Datos proporcionan un mecanismo conocido como variables de
sustitución.
En realidad no forman parte del lenguaje SQL, pero casi todos los sistemas las incluyen. En el caso
de Oracle se utilizan mediante el operador ampersand (&). Tras este símbolo se indica el nombre
de la variable, que será cualquier nombre válido. Esa validez es la misma que las de los nombres de
tablas y columnas en Oracle: 64 caracteres, nada de espacios en blanco, etc.
Ejemplo:
edad, salario
FROM trabajadores
WHERE cod_trabajador=&codigo_trabajador;
Al ejecutar la consulta Oracle permite indicar el valor que deseamos para la variable. Por ejemplo,
de la forma que se muestra en esta imagen:
edad, salario
FROM trabajadores
WHERE nombre=&v_nombre;
Y luego, cuando Oracle nos lo reclame, escribimos Antonio como valor para sustituir en la variable,
no se nos mostrarán los datos de Antonio, sino que ocurrirá un error. La razón está en que al
sustituir el valor de la variable, se obtendría esta consulta:
edad, salario
FROM trabajadores
WHERE nombre=Antonio;
El error ocurre porque faltan las comillas. Para no tener ese problema, que obliga a introducir las
comillas en el cuadro, debemos hacer lo siguiente:
edad, salario
FROM trabajadores
WHERE nombre=’&v_nombre’;
El uso de variables de sustitución no sólo está restringido a la cláusula WHERE, se pueden utilizar
en cualquier cláusula.
En Oracle es posible reutilizar el valor de una variable de sustitución en la misma instrucción. Para
ello se utiliza el doble ampersand (&&). Donde aparezca, se reutilizará el valor de esa variable. Por
ejemplo:
SELECT &&columna
FROM alumnos
ORDER BY &columna;
Sólo se nos preguntará una vez por el valor de la variable. El doble ampersand permite reutilizar el
valor de la variable. Para que funcione este uso correctamente, el simple ampersand se pone
después que el doble ampersand en la instrucción.
WHERE n_curso=&numero_curso;
WHERE n_curso=&numero_curso;
Todo el código anterior se ejecutará sin preguntar al usuario por el valor de la variable. Se tomará
el valor 301 para la columna n_curso en ambas instrucciones SELECT.
Hay otro comando muy interesante que es SET VERIFY ON. Este comando (también es de tipo
SQL*Plus) nos mostrará la instrucción SELECT antes y después de la sustitución para comprobar
cómo quedan las instrucciones tras ejecutarlas como script (es decir ejecutar todo el conjunto de
instrucciones, muy útil si las almacenamos en un archivo, por ejemplo). En el caso anterior con SET
VERIFY ON, se mostraría algo como:
WHERE n_curso=&numero_curso
WHERE n_curso=301
FECHA_INICIO FECHA_FIN
--------------------------- ---------------------------
WHERE n_curso=&numero_curso
WHERE n_curso=301
DNI_PROFESOR
------------
71656565U
2.3 Consultas sobre múltiples tablas.
Combinaciones internas - INNER JOIN
Las combinaciones internas se realizan mediante la instrucción INNER JOIN. Devuelven únicamente
aquellos registros/filas que tienen valores idénticos en los dos campos que se comparan para unir
ambas tablas. Es decir aquellas que tienen elementos en las dos tablas, identificados éstos por el
campo de relación.
La mejor forma de verlo es con un diagrama de Venn que ilustre en qué parte de la relación deben
existir registros:
En este caso se devuelven los registros que tienen nexo de unión en ambas tablas. Por ejemplo,
en la relación entre las tablas de clientes y pedidos en Northwind, se devolverán los registros de
todos los clientes que tengan al menos un pedido, relacionándolos por el ID de cliente.
Esto puede ocasionar la desaparición del resultado de filas de alguna de las dos tablas, por tener
valores nulos, o por tener un valor que no exista en la otra tabla entre los campos/columnas que
se están comparando.
Su sintaxis es:
Así, para seleccionar los registros comunes entre la Tabla1 y la Tabla2 que tengan correspondencia
entre ambas tablas por el campo Col1, escribiríamos:
Por ejemplo, para obtener en Northwind los clientes que tengan algún pedido, bastaría con
escribir:
Que nos devolverá 830 registros. Hay dos pedidos en la tabla de Orders sin cliente asociado, como
puedes comprobar, y éstos no se devuelven por no existir la relación entre ambas tablas.
En realidad esto ya lo conocíamos puesto que en las combinaciones internas, el uso de la palabra
INNER es opcional (por eso lo hemos puesto entre corchetes). Si simplemente indicamos la palabra
JOIN y la combinación de columnas (como ya hemos visto en el artículo anterior) el sistema
sobreentiende que estamos haciendo una combinación interna. Lo hemos incluido por ampliar la
explicación y por completitud.
Combinaciones externas (OUTER JOIN)
Las combinaciones externas se realizan mediante la instrucción OUTER JOIN. Como enseguida
veremos, devuelven todos los valores de la tabla que hemos puesto a la derecha, los de la tabla
que hemos puesto a la izquierda o los de ambas tablas según el caso, devolviendo además valores
nulos en las columnas de las tablas que no tengan el valor existente en la otra tabla.
Es decir, que nos permite seleccionar algunas filas de una tabla aunque éstas no tengan
correspondencia con las filas de la otra tabla con la que se combina. Ahora lo veremos mejor en
cada caso concreto, ilustrándolo con un diagrama para una mejor comprensión.
En todas estas combinaciones externas el uso de la palabra OUTER es opcional. Si utilizamos LEFT,
RIGHT o FULL y la combinación de columnas, el sistema sobreentiende que estamos haciendo una
combinación externa.
Así, para seleccionar todas las filas de la Tabla1, aunque no tengan correspondencia con las filas de
la Tabla2, suponiendo que se combinan por la columna Col1 de ambas tablas escribiríamos:
Obtendremos 832 registros ya que se incluyen todos los clientes y sus pedidos, incluso aunque no
tengan pedido alguno. Los que no tienen pedidos carecen de la relación apropiada entre las dos
tablas a partir del campo CustomerID. Sin embargo se añaden al resultado final dejando la parte
correspondiente a los datos de la tabla de pedidos con valores nulos, como se puede ver en esta
captura de SQL Server:
Variante RIGHT JOIN
Análogamente, usando RIGHT JOIN se obtienen todas las filas de la tabla de la derecha, aunque no
tengan correspondencia en la tabla de la izquierda.
Así, para seleccionar todas las filas de la Tabla2, aunque no tengan correspondencia con las filas de
la Tabla1 podemos utilizar la cláusula RIGHT:
Si en nuestra base de datos de ejemplo queremos obtener todos los pedidos aunque no tengan
cliente asociado, junto a los datos de dichos clientes, escribiríamos:
En este caso se devuelven 830 registros que son todos los pedidos. Si hubiese algún pedido con el
CustomerID vacío (nulo) se devolvería también en esta consulta (es decir, órdenes sin clientes),
aunque en la base de datos de ejemplo no se da el caso.
Es equivalente a obtener los registros comunes (con un INNER) y luego añadirle los de la tabla A
que no tienen correspondencia en la tabla B, con los campos de la tabla vacíos, y los registros de la
tabla B que no tienen correspondencia en la tabla A, con los campos de la tabla A vacíos.
Su sintaxis es:
nos devuelve nuevamente 832 registros: los clientes y sus pedidos, los clientes sin pedido (hay 2) y
los pedidos sin cliente (que en este caso son 0).
Funciones de Agregación
Las funciones de agregación nos permites realizar algunas operaciones sobre un conjunto de
datos, generalmente se utilizarán en conjunto con la agrupación para potencializar su
rendimiento.
SUM(): Suma los valores del campo que le especifiquemos. NOTA: Solo se pueden utilizar campos
de tipo numérico