Alumno:
Alexis Guadalupe Cano Mesias
Base de Datos
Lenguaje de Manipulación de Datos
Lenguaje de Manipulación de Datos (Data Manipulation Language, DML) es un lenguaje proporcionado por los sistemas gestores de bases de datos que permite a los usuarios de la misma llevar a cabo las tareas de consulta o modificación de los datos contenidos en las Bases de Datos del Sistema Gestor de Bases de Datos.
El lenguaje de manipulación de datos más popular hoy en 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.
2.1 Operaciones de manipulación de datos
La sintaxis básica de select es la siguiente utilizando el estándar de SQL:
select columna from tabla;
donde se sustituye la palabra columna por el nombre del campo a consultar y la palabra tabla por el nombre de la tabla que contiene el campo mencionado.
La estructura básica para la sentencia insert utilizando el estándar de SQL es la siguiente:
insert into usuario (nombre, apellidos, edad, carrera) values ("Martín", "Bastida Godínez", "23", "Ingeniería en TI");
Tomando como ejemplo si se tuviera una tabla llamada 'usuario' con los campos de tipo cadena de caracteres (nombre, apellidos, edad, carrera), donde se inserta los valores que se encuentran en después de la palabra values, los valores se insertan en el orden correspondiente a como se hizo la llamada de los campos, los valores van separados por comas, las comillas dobles indican que se está insertando datos de tipo cadena de caracteres.
Delete
Para eliminar los registros de una tabla usamos el comando "delete":
delete from usuarios;
La ejecución del comando indicado en la línea anterior borra TODOS los registros de la tabla.
Si queremos eliminar uno o varios registros debemos indicar cuál o cuáles, para ello utilizamos el comando "delete" junto con la clausula "where" con la cual establecemos la condición que deben cumplir los registros a borrar. Por ejemplo, queremos eliminar aquel registro cuyo nombre de usuario es 'Martín':
delete from usuarios where nombre='Martín';
Si solicitamos el borrado de un registro que no existe, es decir, ningún registro cumple con la condición especificada, no se borrarán registros, pues no encontró registros con ese dato.
Update
Para modificar uno o varios datos de uno o varios registros utilizamos "update" (actualizar).
Por ejemplo, en nuestra tabla "usuarios", queremos cambiar los valores de todas las claves, por "Sevilla":
update usuarios set clave='Sevilla';
Utilizamos "update" junto al nombre de la tabla y "set" junto con el campo a modificar y su nuevo valor.
El cambio afectará a todos los registros.
Podemos modificar algunos registros, para ello debemos establecer condiciones de selección con "where".
Por ejemplo, queremos cambiar el valor correspondiente a la clave de nuestro usuario llamado 'Martín', queremos como nueva clave 'Boca', necesitamos una condición "where"que afecte solamente a este registro:
update usuarios set clave='Boca'
where nombre='Martín';
Si no encuentra registros que cumplan con la condición del "where", ningún registro es afectado.
Las condiciones no son obligatorias, pero si omitimos la cláusula "where", la actualización afectará a todos los registros.
También se puede actualizar varios campos en una sola instrucción:
update usuario set nombre='MarceloDuarte', clave='Marce'
where nombre='Marcelo';
Para ello colocamos "update", el nombre de la tabla, "set" junto al nombre del campo y el nuevo valor y separado por coma, el otro nombre del campo con su nuevo valor.
Vídeo Recomendado
2.2 Consultas Simples
Las consultas simples son aquellas que se hacen sobre una sola tabla.
Los contenidos que se presentan a continuacion muestran los principales usos de las consultas simples, los ejemplos presentados están basados en el script tienda.sql
Sintaxis:
La sintaxis básica de una consulta de selección es la siguiente:
SELECT * FROM Tabla; /*Selecciona todos los campos de la tabla*/
SELECT Campos FROM Tabla; /*Selecciona los campos que se requieran de la tabla.*/
Select:
Definición:
El comando SELECT es utilizado para consultar registros de la base de datos que satisfagan un criterio determinado. La clausula FROM especifica de que tabla se filtran o consultan los datos.
Clausulas:
Las clausulas son condiciones de modificacion utilizadas para definir los datos que se desean seleccionar o manipular. Entre estas se encuentran:
- FROM
- ORDER BY
- WHERE
- GROUP BY
- HAVING
Selección de Todos los Campos y Registros (Ejemplo Script tienda.sql):
> SELECT * FROM ARTICULO /*Selecciona todos los registros de los campos de la tabla ARTICULO*/
Selección de Algunos Campos:
> select ultimacomra, ultimaventa from articulo; /*Selecciona todos los registros de los campos ultimacomra, ultimaventa de la tabla articulo*/
Order By:
Definición:
La clausula ORDER BY es utilizada para ordenar los registros seleccionados de acuerdo con un orden específico.
Ejemplos:
>select CODCLI, NOMCLIE, DIRCLIE, TIPOCLIE from cliente order by NOMCLIE; /*Selecciona los campos CODCLI, NOMCLIE, DIRCLIE, TIPOCLIE ordenados por nombre de cliente */
>select CODCLI, NOMCLIE, TIPOCLIE FROM CLIENTE ORDER BY TIPOCLIE, NOMCLIE; /*Selecciona los campos CODCLI, NOMCLIE, TIPOCLIE ahora ordenados por dos campos: TIPOCLIE, NOMCLIE */
>select CODCLI, NOMCLIE, TIPOCLIE FROM CLIENTE ORDER BY NOMCLIE asc; /*Ordena los campos seleccionados por el nombre del cliente descendentemente*/
>select CODCLI, NOMCLIE, TIPOCLIE FROM CLIENTE ORDER BY codcli desc; /*Ordena los campos seleccionados por código de cliente descendentemente*/
Where:
Definición:
La clausula WHERE es utilizada para especificar las condiciones que deben reunir los registros que se van a seleccionar.
Ejemplo:
>select CODARTICULO, NOMARTICULO FROM ARTICULO WHERE NOMARTICULO= 'Mogolla'; /*Selecciona el código y el nombre del articulo donde el nombre es Mogolla*/
Operadores de Comparación:
Ejemplos:
>select codarticulo, nomarticulo, saldo from articulo where saldo >50; /*Selecciona el código, nombre y saldo de la tabla articulo donde el saldo es mayor a 50*/
>select codarticulo, nomarticulo, saldo from articulo where saldo <300; /*Selecciona el código, nombre y saldo de la tabla articulo donde el saldo es menor a 300*/
>select codarticulo, nomarticulo, saldo from articulo where saldo <=100; /*Selecciona el código, nombre y saldo de la tabla articulo donde el saldo es menor o igual a 100*/
>select codarticulo, nomarticulo, saldo from articulo where saldo >=100; /*Selecciona el código, nombre y saldo de la tabla articulo donde el saldo es menor o igual a 100*/
>select codarticulo, nomarticulo, saldo from articulo where saldo <>60; /*Selecciona el código, nombre y saldo de la tabla articulo donde el saldo es distinto a 60*/
>select codarticulo, nomarticulo, saldo from articulo where saldo = 20; /*Selecciona el código, nombre y saldo de la tabla articulo donde el saldo es igual a 20*/
Operadores Lógicos:

Ejemplos:
>select codarticulo, nomarticulo, saldo from articulo where saldo > 50 and saldo <100; /*Selecciona el código, nombre y saldo del articulo cuando el saldo es mayor a 50 y es menor a 100*/
>select codcli, nomclie , saldoclie from cliente where not nomclie= 'JULIE DIAZ'; /*Selecciona el código, nombre y saldo del cliente cuando el nombre no sea JULIE DIAZ*/
>select codcli, nomclie , saldoclie from cliente where saldoclie= 5000 or saldoclie=22000; /*Selecciona el código, nombre y saldo del cliente cuando el saldo es 5000 o cuando el saldo es 22000*/
BETWEN:
Definición:
El operador BETWEN utilizado para especificar un intervalo de valores.
Ejemplos:
>select codcli, nomclie, saldoclie from cliente where saldoclie Between 32 and 253; /*Selecciona el código, nombre y saldo del cliente en donde el saldo esta entre 32 y 253*/
IN:
Definición:
El operador IN es utilizado para especificar registros determinados de una base de datos.
Ejemplos:
>select nomclie, saldoclie from cliente where codcli in (2,5,3); /*Selecciona el nombre y saldo del cliente que estén en los códigos 2, 5 y 3 */
>SELECT CODCLI, SALDOCLIE, NOMCLIE FROM CLIENTE WHERE NOMCLIE IN ('JULIE DIAZ','CARLOS BIANCHA'); /*Selecciona el código y saldo del cliente de JULIE DIAZ Y CARLOS BIANCHA*/
LIKE:
Definición:
El operador LIKE es utilizado principalmente para realizar búsquedas de registros que contengan determinados caracteres en alguna posición.
Este operador se combina con los caracteres comodines % y _ , El % se utiliza para determinar cualquier cadena de caracteres y el _ se utiliza para determinar cualquier carácter.
Ejemplos:
>select CODARTICULO, NOMARTICULO FROM ARTICULO WHERE NOMARTICULO like 'M%';/*Selecciona el código y el nombre del articulo donde el nombre empieza por M */
>select CODARTICULO, NOMARTICULO FROM ARTICULO WHERE NOMARTICULO like '_i%'; /*Selecciona el código y el nombre del articulo donde el segundo carácter es i*/
>select CODARTICULO, NOMARTICULO FROM ARTICULO WHERE NOMARTICULO like '%s'; /*Selecciona el código y el nombre del articulo donde el ultimo carácter es s*/
>select CODARTICULO, NOMARTICULO FROM ARTICULO WHERE NOMARTICULO like '%a_'; /*Selecciona el código y el nombre del articulo donde el penúltimo carácter es a*/
DISTINCT:
DEFINICIÓN:
DISTINCT Omite los registros cuyos campos seleccionados coincidan totalmente.
EJEMPLO:
>SELECT DISTINCT saldo from articulo; /*Muestra los saldos de los ARTICULOS sin repetirlos*/
RESULTADO OBTENIDO SIN UTILIZAR DISTINCT
>SELECT SALDO FROM ARTICULO /*Selecciona el saldo de los artículos pero muestra los que están repetidos*/
RESULTADO OBTENIDO USANDO DISTINCT
>select distinct saldo from articulo /*Muestra los saldos de los artículos sin repetirlos*/
AS:
DEFINICIÓN:
EL operador AS se utiliza para asignar a las columnas nombres diferentes al original de forma temporal.
EJEMPLOS:
>SELECT NOMCLIE AS CLIENTES FROM CLIENTE; /*Muestra la columna nomclie de la tabla cliente con el nombre CLIENTES*/
>SELECT CODARTICULO AS CODIGO_ARTICULO, NOMARTICULO AS ARTICULO FROM ARTICULO; /*Muestra CODARTICULO como CODIGO_ARTICULO Y NOMARTICULO como ARTICULO*/
IS NULL:
DEFINICIÓN:
IS NULL: Devuelve verdadero cuando una expresión contiene valores nulos.
EJEMPLOS:
>select codcli, nomclie, dirclie, tipoclie, saldoclie from cliente where dirclie is null; /*Muestra el valor nulo en la dirección del cliente*/
>select codcli, nomclie, dirclie, tipoclie, saldoclie from cliente where nomclie is null; /*Muestra valores null en nombre del cliente*/
Concatenación:
DEFINICIÓN:
El operador de concatenación es || (Alt + 124) y sirve para unir textos, para adicionar caracteres cuando se requiere o para formar frases.
EJEMPLOS:
>select codcli codigo, nomclie || ' debe ' || saldoclie saldo_cliente from cliente; /*Muestra como resultado los que se aprecia en la imagen*/
>select codcli codigo, nomclie || ' es ' || tipoclie || ' y debe ' || saldoclie tipo_y_saldo from cliente; /*Muestra como resultado lo que se observa en la imagen*/
Columnas Calculadas:
Las columnas calculadas se utilizan para realizar operaciones de forma temporal.
EJEMPLOS
>select nomclie cliente, tipoclie tipo, saldoclie * 1.16 as saldo_con_incremento from cliente; /*Muestra el saldo del cliente incrementado un 16%*/
>select nomclie cliente, tipoclie, saldoclie - 10 as saldo_con_descuento from cliente; /*Muestra el saldo del cliente con descuento de $10*/
Vídeo Recomendado
2.3 Consultas sobre múltiples 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 secundarias o externas que permiten relacionar los datos de esa tabla con datos de otra tabla.
Como ejemplo, veamos esta tabla de departamentos:
Por otro lado tenemos una tabla de empleados:
La columna cod_dep en la tabla de empleados es una clave secundaria. A través de ella sabemos que Marisa León, por ejemplo, es del departamento de Ventas.
Producto cruzado o cartesiano de tablas:
Usando las tablas del apartado anterior, si se quiere obtener una lista de los datos de los departamentos y los empleados, se podría hacer de esta forma:
La sintaxis es correcta ya que, efectivamente, en el apartado FROM se pueden indicar varias tareas separadas por comas.
Sin embargo el resultado es confuso:
Parece que todos los trabajadores trabajan en todos los departamentos. Algo que no es cierto a tenor de los datos originales. Ana Díez trabaja en el departamento de Ventas, es lo que nos dice su columna cod_dep.
La razón de este resultado es que no hemos utilizado la relación entre las tablas para ligar los datos de ambas. Por ello aparece cada fila de la primera tabla combinada con cada fila de la segunda. Como la primera tabla (departamentos) tiene seis filas, y la segunda (empleados) cuatro, el resultado son 24 filas.
A esta forma de combinar datos de varias tablas se la conoce como producto cruzado o cartesiano. Y se utiliza para resolver algunas consultas complejas, pero normalmente no es lo que necesitamos para combinar datos de diferentes tablas.
Normalmente necesitaremos discriminar ese producto para que sólo aparezcan, como es el caso, los datos de los empleados combinados con los de sus departamentos. A eso se le llama asociar (join) tablas
Asociaciones simples:
La forma de realizar correctamente la consulta anterior (asociado los empleados con sus departamentos), sería:
Nótese, que se utiliza la notación tabla.columna para evitar la ambigüedad. Tanto la tabla de departamentos como la de empleados tienen una columna llamada cod_dep, por ello hay que distinguirla anteponiendo el nombre de la tabla a la que pertenece.
Para evitar repetir continuamente el nombre de la tabla, se puede utilizar un alias de tabla:
En cualquier caso el resultado muestra realmente los empleados y los departamentos a los que pertenecen.
Al apartado WHERE se le pueden añadir condiciones encadenándolas con el operador AND. Ejemplo:
Asociar más de una tabla:
Por supuesto es posible asociar datos de más de dos tablas. Por ejemplo supongamos que tenemos estas tablas, mostradas desde su diseño relacional:
Queremos mostrar el nombre y apellidos de los alumnos junto con el número de curso a los que están asociados y las fecha de inicio y fin de los mismos.
Aunque los datos que necesitamos están en dos tablas (alumnos y cursos), no hay relación entre ambas, la relación entre esas tablas es la indicada por la tabla asistir, por lo que necesitamos indicar esa tabla. La consulta resultante sería:
Por lo tanto, podemos ligar más de dos tablas sin ningún problema.
Al hacer consultas sobre varias tablas hay que tener en cuenta estos detalles:
- Deberemos añadir las tablas que contienen los datos que necesitemos
- Además deberemos añadir las tablas necesarias para asociar correctamente a las tablas anteriores
- Por último, de todas las anteriores, deberemos usar las mínimas tablas. Cuantas menos mejor. Especialmente en los inicios de un desarrollador en SQL, conviene tener en cuenta este último punto. Añadir tablas de más puede cambiar el resultado.Por ejemplo, si en el ejemplo anterior usamos y asociamos una tabla con información sobre los profesores de los cursos, solo aparecerían datos de cursos que tienen asignado al menos un profesor, y eso puede cambiar notablemente el resultado.
Sintaxis SQL 1999:
En la versión SQL de 1999 se ideó una nueva sintaxis para consultar varias tablas. La razón fue separar las condiciones de asociación respecto de las condiciones de selección de registros, lo cual otorga una mayor claridad a las instrucciones SQL.
Oracle Database es totalmente compatible con esta normativa.
La sintaxis completa de las consultas en formato SQL 99 es:
Se explica en detalle las capacidades de esta forma de indicar consultas.
CROSS JOIN:
Utilizando la opción CROSS JOIN se realiza un producto cruzado entre las tablas indicadas. Los productos cruzados se utilizan para consultas más avanzadas (se explican más adelante).
Usando el mismo ejemplo visto anteriormente, en SQL 99 quedaría así el producto cruzado:
NATURAL JOIN:
Establece una relación de igualdad entre las tablas a través de los campos que tengan el mismo nombre en ambas tablas. No es raro que las únicas columnas con el mismo nombre entre dos tablas son las que permiten relacionar sus datos.
Para entender mejor la idea observemos este ejemplo:
Supongamos que deseamos obtener el título de cada tipo de curso junto con los números de curso asociados a ese tipo. Necesitamos usar ambas tablas y observamos que la relación entre ambas tablas la lleva la columna cod_curso (presente en ambas tablas) y que, además, es la única columna que tiene el mismo nombre entre ambas tablas.
En ese caso podemos usar un NATURAL JOIN sin problemas:
Se ha resaltado la columna cod_curso para hacer notar que no se ha cualificado. Aunque es la misma columna en ambas tablas, no se considera (como sí ocurriría si hubiéramos usado la forma SQL 92) que haya ambigüedad, ya que NATURAL JOIN considera que no hay dos columnas cod_curso sino solo una.
Sin embargo observemos este otro diagrama:
Si quisiéramos obtener el nombre de las empresas y el nombre de los alumnos, viendo que ambas tablas se relacionan a través de la columna llamada cif, en ellas podíamos tener la tentación de usar este código:
La instrucción devuelve un error por cualificar la columna nombre. La razón es que, en este caso, no es solo el cif la columna común sino también el nombre, el teléfono y la dirección.
Oracle solo mostraría, con un NATURAL JOIN, datos de ambas tablas si esas cuatro columnas tuvieran los mismos valores. No tiene ningún sentido hacer un NATURAL JOIN sobre esas tablas.
Por ello hay que recordar que NATURAL JOIN solo se puede aplicar a tablas donde las únicas columnas que tienen el mismo nombre son las que sirven para relacionar las tablas.
JOIN USING:
JOIN USING permite asociar tablas indicando las columnas que las relacionan, si estas tienen el mismo nombre en ambas tablas., A diferencia de NATURAL JOIN no tienen porque ser las únicas con el mismo nombre.
El problema indicado al final del apartado anterior se puede resolver mediante JOIN USING de esta forma.
Al indicar que es el cif la columna común, ahora sí hay ambigüedad en las columnas nombre, ya que ahora se necesita discriminar si estamos hablando del nombre de las empresas o del de los alumnos. La consulta funcionará correctamente.
A veces no es solo una columna la que sirve para relacionar, lo cual implica indicar todas las columnas que relacionan. Ejemplo:
JOIN ON:
A veces las tablas se relacionan en formas que no encajan con ninguno de los JOIN anteriores. Esta situación se puede entender observando el diagrama de la Ilustración 9.
Supongamos que queremos obtener el número de cada curso y el nombre del profesor o profesora que imparte ese curso. Necesitamos usar las tablas cursos y profesores. Eso implica relacionar ambas y, en este caso, la columna que asocia ambas se llama dni en la tabla de profesores y dni_profesor en la taba de cursos.
Esta situación no encaja ni en un NATURAL JOIN ni en un JOIN USING. Para esto sirve JOIN ON.
JOIN ON permite indicar la condición (al estilo de SQL 92) que relaciona las tablas. En este caso sería:
Hay que señalar que cualquier JOIN se puede hacer con JOIN ON (sin embargo esto no ocurre al revés). Por ejemplo si tenemos:
Podemos hacer un SELECT equivalente de esta forma:
JOIN ON sí requiere cualificar las columnas que se relacionan aunque tengan el mismo nombre.
Uso de condiciones en las consultas con sintaxis 1999:
La ventaja principal de la sintaxis 1999 de SQL es la separación entre las indicaciones sobre las relaciones entre las tablas (normalmente referidas a claves principales y claves foráneas relacionadas) y las condiciones que permiten seleccionar las filas que cumplan una determinada condición. Por ejemplo en:
La cláusula JOIN es la que se encarga de ligar las tablas empresas y alumnos a través de la columna cif presente en ambas tablas. De ese modo conseguimos que se nos indique el nombre de la empresa en la que trabaja cada persona. La cláusula WHERE restringe esta información para que sólo aparezcan las personas que trabajan en empresas de Palencia.
Esta consulta también se podría realizar de esta forma:
De modo que, incluso, se puede obviar la cláusula WHERE.
Asociaciones internas o INNER JOIN:
Utilizando las formas anteriores de relacionar tablas (incluidas las explicadas con la sintaxis SQL 92), sólo aparecen en el resultado de la consulta filas presentes en las tablas relacionadas.
Si recordamos las tablas con las que se inició esta unidad. Departamentos era:
Y empleados era:
Este SELECT:
Devuelve:
Se observa que no aparece Pedro Andérez porque no tiene asignado ningún departamento.
Esto ocurre porque la cláusula JOIN utiliza por defecto el valor INNER, es decir usan solo los valores internos a la relación. Es decir, como ya se ha dicho, solo aparecen las filas relacionadas en ambas tablas.
Cláusula OUTER JOIN:
Sin embargo, es posible forzar que aparezcan los valores que están fuera de la relación (externos, OUTER).
Su sintaxis es:
Se puede observar que solo se puede utilizar la cláusula OUTER en JOIN de tipo ON o USING.
LEFT se indica si queremos que aparezcan todos los datos de la tabla que queda a la izquierda de la palabra JOIN (hay que recordar que para Oracle la instrucción tiene una sola línea).
De la misma forma, si queremos que sea la tabla de la derecha la que muestre todos los datos, se indica RIGHT.
Finalmente, si queremos que sean ambas las que muestren todos los datos se usa FULL.
Así esta consulta:
Muestra:
Ahora sí aparece Pedro Andérez.
Asociaciones externas en SQL 92:
Oracle permite indicar relaciones externas también en el formato SQL 92. Para ello usa un símbolo especial (+). Ese símbolo se usa, dentro de la cláusula WHERE, en la condición que establece la asociación entre tablas.
Se coloca al final del nombre de la columna, de modo que aparecen todos los datos de la tabla contraria.
Por ejemplo, usando el ejemplo anterior, este código:
Obtiene el mismo resultado. Saca todos los empleados (incluido Pedro Andérez). El signo más muestra todos los datos de la tabla que está al otro lado de la igualdad. Así:
Muestra los empleados y los departamentos que se relacionan y se incluirían, si fuera el caso, los datos de los departamentos que no tuvieran empleados.
El FULL OUTER JOIN se provoca así:
En todo caso, es más aconsejable, por clara, la sintaxis SQL 99.
Consultas de no coincidentes:
Un caso típico de uso de las relaciones externas es el uso de las llamadas consultas de no coincidentes. Estas consultas permiten obtener datos de una tabla que no se relacionan con otras.
Usando las tablas empleados y departamentos anteriores. Supongamos que necesitamos saber qué empleados no están asignados a un departamento. La consulta que lo consigue es:
Aparecería solo Pedro Andérez, único empleado sin departamento. La consulta funciona ya que forzamos a que aparezcan todos los empleados y luego indicamos (en el WHERE) que elimine a los empleados que tengan un departamento.
Uso de productos cruzados para solucionar consultas complejas:
Visto toda esta unidad, los productos cruzados parece que no ofrecen ventajas. Sin embargo, sí es así.
Hay una restricción importante en el manejo de SQL y es el hecho de no poder comparar datos de diferentes filas.
Por ejemplo, usando la tabla de empleados vista anteriormente, supongamos que queremos saber el nombre, apellido y edad de los trabajadores y trabajadoras que tienen más años que Ana Díez.
La solución pasa por hacer un producto cruzado de todos los empleados con una tabla que solo muestre a Ana Diez.
Así este código:
Obtiene:
Este resultado ya está cerca. Rematamos cambiando el código así:
Se obtiene:
Este es solo un ejemplo de la potencia de consultas que permite esta técnica. Aunque bien es cierto, que, en muchos casos, se pueden realizar con otras técnicas más sencillas, como veremos en unidades posteriores.
Relaciones sin igualdad:
A las relaciones descritas en todos los apartados anteriores, salvo los dedicados al producto cruzado, se las llama relaciones en igualdad (equijoins), ya que las tablas se relacionan a través de campos que contienen valores iguales en dos tablas. Sin duda, es la situación habitual.
Sin embargo, no siempre las tablas tienen ese tipo de relación. Supongamos que tenemos esta tabla de Empleados:
Y, por otro lado, una tabla de Categorías.
En el ejemplo anterior podríamos averiguar la categoría a la que pertenece cada empleado, en relación a donde encaja su salario en la tabla de categorías.
La cuestión es que tenemos que usar otro tipo de relación que no implica el uso de claves secundarias, las cuales se relacionan por su igualdad con claves primarias.
Estamos utilizando otro tipo de relación, pero perfectamente válida. Para saber la categoría de los empleados, tenemos que comprobar que su salario está entre el sueldo mínimo y máximo.
El código que lo permite es (SQL 92):
También de una forma más semántica (SQL 99):
En todo caso obtenemos:
Vídeos Recomendados
Parte 1
Parte 2
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)
expresión [NOT] IN (instrucción sql)
[NOT] EXISTS (instrucción sql)
En donde:
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);
(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);
(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;
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*"));
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");
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#);
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);
(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;
(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;
- Recupera el Código del Producto y la Cantidad pedida de la tabla pedidos, extrayendo el nombre del producto de la tabla de productos.
Vídeo Recomendado
2.3.2 Operadores de reunión y de conjuntos
Estas consultas utilizan al menos dos SELECT cuyos resultados se pueden combinar para formar una única consulta. Se basan en los operadores matemáticos de conjuntos (unión, intersección y diferencia).
El funcionamiento es el mismo que con los conjuntos. Lo más importante a tener en cuenta es que en estas operaciones: el número de columnas, el tipo y el orden de dichas columnas debe de ser el mismo en todas las consultas que se combinan. Por ejemplo:
Este código daría lugar a un error, ya que las columnas nombre (normalmente de tipo VARCHAR2) y edad (normalmente de tipo NUMBER) no son del mismo tipo, lo que provocaría un error.
En este otro código:
Aunque ambas consultas a unir tienen las mismas columnas y del mismo tipo, no están el mismo orden por lo que tendremos un nuevo error.
Uniones:
La palabra UNION permite añadir el resultado de un SELECT a otro SELECT. Para ello ambas instrucciones tienen que utilizar el mismo número y tipo de columnas. Ejemplo:
El resultado es una tabla que contendrá nombres de provincia y de comunidades. Es decir, UNION, retorna una consulta en la que el resultado son las filas de ambas consultas.
Manejo de los duplicados en las uniones:
El operador UNION une los resultados de varios SELECT. Pero si hay datos duplicados en ellos, elimina los mismos. Ejemplo:
Si hay alguna persona que es cliente y socio a la vez solo aparecería una vez.
Por ello SQL aporta otro operador, UNION ALL:
El funcionamiento y uso es similar, pero UNION ALL no elimina los datos repetidos.
Intersecciones:
De la misma forma, la palabra INTERSECT permite unir dos consultas SELECT de modo que el resultado serán las filas que estén presentes en ambas consultas.
Ejemplo; tipos y modelos de piezas que se encuentren sólo en los almacenes 1 y 2:
Diferencias:
Con MINUS también se combinan dos consultas SELECT de forma que aparecerán los registros del primer SELECT que no estén presentes en el segundo.
Ejemplo; tipos y modelos de piezas que se encuentren el almacén 1 y no en el 2:
Combinación de operaciones:
Se pueden hacer varias combinaciones anidadas, lo que permite realizar consultas muy complejas.
Para aclarar qué operaciones deseamos realizar primero es conveniente utilizar paréntesis. Ejemplo:
Este código devuelve los tipos y modelos de piezas que están en los almacenes 1 y 2, pero no en el almacén número 3.
Ordenación de consultas combinadas:
Si deseamos que el resultado de los operaciones UNION, INTERSECT o MINUS salga ordenado, hay que tener en cuenta que la cláusula ORDER BY se debe indicar al final de la instrucción. El problema es que el nombre de la columna puede ser distinto en los diferentes SELECT que usa la consulta, como en:
La solución es utilizar el nombre dado a las columnas en el primer SELECT de la instrucción. Ejemplo:
No funcionaría este otro código:
También, como siempre, podemos indicar el número de la columna por la que deseamos ordenar:
Además, hay que tener muy en cuente que la cláusula ORDER BY solo se puede utilizar al final de todos los SELECT que se han combinado. Es incorrecto el código:
También lo es:
Solo es correcto:
Vídeo Recomendado
2.4 Funciones de agregado y de agrupación
GROUP BY:
Combina los registros con valores idénticos, en la lista de campos especificados, en un único registro. Para cada registro se crea un valor sumario si se incluye una función SQL agregada, como por ejemplo Sum o Count, en la instrucción SELECT. Su sintaxis es:
SELECTcampos FROM tabla WHERE criterio GROUP BY campos del grupo
GROUP BY es opcional. Los valores de resumen se omiten si no existe una función SQL agregada en la instrucción SELECT. Los valores Null en los campos GROUP BY se agrupan y no se omiten. No obstante, los valores Null no se evalúan en ninguna de las funciones SQL agregadas.
Se utiliza la cláusula WHERE para excluir aquellas filas que no desea agrupar, y la cláusula HAVING para filtrar los registros una vez agrupados.
A menos que contenga un dato Memo u Objeto OLE , un campo de la lista de campos GROUP BY puede referirse a cualquier campo de las tablas que aparecen en la cláusula FROM, incluso si el campo no esta incluido en la instrucción SELECT, siempre y cuando la instrucción SELECT incluya al menos una función SQL agregada.
Todos los campos de la lista de campos de SELECT deben o bien incluirse en la cláusula GROUP BY o como argumentos de una función SQL agregada.
SELECT Id_Familia, Sum(Stock)FROM Productos GROUP BY Id_Familia;
Una vez que GROUP BY ha combinado los registros, HAVING muestra cualquier registro agrupado por la cláusula GROUP BY que satisfaga las condiciones de la cláusula HAVING.
HAVING es similar a WHERE, determina qué registros se seleccionan. Una vez que los registros se han agrupado utilizando GROUP BY, HAVING determina cuales de ellos se van a mostrar.
SELECT Id_Familia Sum(Stock) FROM Productos GROUP BY Id_Familia
HAVINGSum(Stock) > 100 AND NombreProducto Like BOS*;
SELECTcampos FROM tabla WHERE criterio GROUP BY campos del grupo
GROUP BY es opcional. Los valores de resumen se omiten si no existe una función SQL agregada en la instrucción SELECT. Los valores Null en los campos GROUP BY se agrupan y no se omiten. No obstante, los valores Null no se evalúan en ninguna de las funciones SQL agregadas.
Se utiliza la cláusula WHERE para excluir aquellas filas que no desea agrupar, y la cláusula HAVING para filtrar los registros una vez agrupados.
A menos que contenga un dato Memo u Objeto OLE , un campo de la lista de campos GROUP BY puede referirse a cualquier campo de las tablas que aparecen en la cláusula FROM, incluso si el campo no esta incluido en la instrucción SELECT, siempre y cuando la instrucción SELECT incluya al menos una función SQL agregada.
Todos los campos de la lista de campos de SELECT deben o bien incluirse en la cláusula GROUP BY o como argumentos de una función SQL agregada.
SELECT Id_Familia, Sum(Stock)FROM Productos GROUP BY Id_Familia;
Una vez que GROUP BY ha combinado los registros, HAVING muestra cualquier registro agrupado por la cláusula GROUP BY que satisfaga las condiciones de la cláusula HAVING.
HAVING es similar a WHERE, determina qué registros se seleccionan. Una vez que los registros se han agrupado utilizando GROUP BY, HAVING determina cuales de ellos se van a mostrar.
SELECT Id_Familia Sum(Stock) FROM Productos GROUP BY Id_Familia
HAVINGSum(Stock) > 100 AND NombreProducto Like BOS*;
AVG:
Calcula la media aritmética de un conjunto de valores contenidos en un campo especificado de una consulta. Su sintaxis es la siguiente
Avg(expr)
En donde expr representa el campo que contiene los datos numéricos para los que se desea calcular la media o una expresión que realiza un cálculo utilizando los datos de dicho campo. La media calculada por Avg es la media aritmética (la suma de los valores dividido por el número de valores). La función Avg no incluye ningún campo Null en el cálculo.
SELECT Avg(Gastos) AS Promedio FROM Pedidos WHERE Gastos > 100;
Avg(expr)
En donde expr representa el campo que contiene los datos numéricos para los que se desea calcular la media o una expresión que realiza un cálculo utilizando los datos de dicho campo. La media calculada por Avg es la media aritmética (la suma de los valores dividido por el número de valores). La función Avg no incluye ningún campo Null en el cálculo.
SELECT Avg(Gastos) AS Promedio FROM Pedidos WHERE Gastos > 100;
Count:
Calcula el número de registros devueltos por una consulta. Su sintaxis es la siguiente:
Count(expr)
En donde expr contiene el nombre del campo que desea contar. Los operandos de expr pueden incluir el nombre de un campo de una tabla, una constante o una función (la cual puede ser intrínseca o definida por el usuario pero no otras de las funciones agregadas de SQL). Puede contar cualquier tipo de datos incluso texto.
Aunque expr puede realizar un cálculo sobre un campo, Count simplemente cuenta el número de registros sin tener en cuenta qué valores se almacenan en los registros. La función Count no cuenta los registros que tienen campos null a menos que expr sea el carácter comodín asterisco (*). Si utiliza un asterisco, Count calcula el número total de registros, incluyendo aquellos que contienen campos null. Count(*) es considerablemente más rápida que Count(Campo). No se debe poner el asterisco entre dobles comillas ('*').
SELECT Count(*) AS Total FROM Pedidos;
Si expr identifica a múltiples campos, la función Count cuenta un registro sólo si al menos uno de los campos no es Null. Si todos los campos especificados son Null, no se cuenta el registro. Hay que separar los nombres de los campos con ampersand (&).
SELECT Count(FechaEnvío & Transporte) AS Total FROM Pedidos;
Count(expr)
En donde expr contiene el nombre del campo que desea contar. Los operandos de expr pueden incluir el nombre de un campo de una tabla, una constante o una función (la cual puede ser intrínseca o definida por el usuario pero no otras de las funciones agregadas de SQL). Puede contar cualquier tipo de datos incluso texto.
Aunque expr puede realizar un cálculo sobre un campo, Count simplemente cuenta el número de registros sin tener en cuenta qué valores se almacenan en los registros. La función Count no cuenta los registros que tienen campos null a menos que expr sea el carácter comodín asterisco (*). Si utiliza un asterisco, Count calcula el número total de registros, incluyendo aquellos que contienen campos null. Count(*) es considerablemente más rápida que Count(Campo). No se debe poner el asterisco entre dobles comillas ('*').
SELECT Count(*) AS Total FROM Pedidos;
Si expr identifica a múltiples campos, la función Count cuenta un registro sólo si al menos uno de los campos no es Null. Si todos los campos especificados son Null, no se cuenta el registro. Hay que separar los nombres de los campos con ampersand (&).
SELECT Count(FechaEnvío & Transporte) AS Total FROM Pedidos;
Max, Min:
Devuelven el mínimo o el máximo de un conjunto de valores contenidos en un campo especifico de una consulta. Su sintaxis es:
Min(expr)
Max(expr)
En donde expr es el campo sobre el que se desea realizar el cálculo. Expr pueden incluir el nombre de un campo de una tabla, una constante o una función (la cual puede ser intrínseca o definida por el usuario pero no otras de las funciones agregadas de SQL).
SELECT Min(Gastos) AS ElMin FROM Pedidos WHERE Pais = 'España';
SELECT Max(Gastos) AS ElMax FROM Pedidos WHERE Pais = 'España';
Min(expr)
Max(expr)
En donde expr es el campo sobre el que se desea realizar el cálculo. Expr pueden incluir el nombre de un campo de una tabla, una constante o una función (la cual puede ser intrínseca o definida por el usuario pero no otras de las funciones agregadas de SQL).
SELECT Min(Gastos) AS ElMin FROM Pedidos WHERE Pais = 'España';
SELECT Max(Gastos) AS ElMax FROM Pedidos WHERE Pais = 'España';
StDev, StDevP:
Devuelve estimaciones de la desviación estándar para la población (el total de los registros de la tabla) o una muestra de la población representada (muestra aleatoria) . Su sintaxis es:
StDev(expr)
StDevP(expr)
En donde expr representa el nombre del campo que contiene los datos que desean evaluarse o una expresión que realiza un cálculo utilizando los datos de dichos campos. Los operandos de expr pueden incluir el nombre de un campo de una tabla, una constante o una función (la cual puede ser intrínseca o definida por el usuario pero no otras de las funciones agregadas de SQL)
StDevP evalúa una población, y StDev evalúa una muestra de la población. Si la consulta contiene menos de dos registros (o ningún registro para StDevP), estas funciones devuelven un valor Null (el cual indica que la desviación estándar no puede calcularse).
SELECT StDev(Gastos) AS Desviacion FROM Pedidos WHERE Pais = 'España';
SELECT StDevP(Gastos) AS Desviacion FROM Pedidos WHERE Pais = 'España';
StDev(expr)
StDevP(expr)
En donde expr representa el nombre del campo que contiene los datos que desean evaluarse o una expresión que realiza un cálculo utilizando los datos de dichos campos. Los operandos de expr pueden incluir el nombre de un campo de una tabla, una constante o una función (la cual puede ser intrínseca o definida por el usuario pero no otras de las funciones agregadas de SQL)
StDevP evalúa una población, y StDev evalúa una muestra de la población. Si la consulta contiene menos de dos registros (o ningún registro para StDevP), estas funciones devuelven un valor Null (el cual indica que la desviación estándar no puede calcularse).
SELECT StDev(Gastos) AS Desviacion FROM Pedidos WHERE Pais = 'España';
SELECT StDevP(Gastos) AS Desviacion FROM Pedidos WHERE Pais = 'España';
Sum:
Devuelve la suma del conjunto de valores contenido en un campo especifico de una consulta. Su sintaxis es:
Sum(expr)
En donde expr respresenta el nombre del campo que contiene los datos que desean sumarse o una expresión que realiza un cálculo utilizando los datos de dichos campos. Los operandos de expr pueden incluir el nombre de un campo de una tabla, una constante o una función (la cual puede ser intrínseca o definida por el usuario pero no otras de las funciones agregadas de SQL).
SELECT Sum(PrecioUnidad * Cantidad) AS Total FROM DetallePedido;
Sum(expr)
En donde expr respresenta el nombre del campo que contiene los datos que desean sumarse o una expresión que realiza un cálculo utilizando los datos de dichos campos. Los operandos de expr pueden incluir el nombre de un campo de una tabla, una constante o una función (la cual puede ser intrínseca o definida por el usuario pero no otras de las funciones agregadas de SQL).
SELECT Sum(PrecioUnidad * Cantidad) AS Total FROM DetallePedido;
Var, VarP:
Devuelve una estimación de la varianza de una población (sobre el total de los registros) o una muestra de la población (muestra aleatoria de registros) sobre los valores de un campo. Su sintaxis es:
Var(expr)
VarP(expr)
VarP evalúa una población, y Var evalúa una muestra de la población. Expr el nombre del campo que contiene los datos que desean evaluarse o una expresión que realiza un cálculo utilizando los datos de dichos campos. Los operandos de expr pueden incluir el nombre de un campo de una tabla, una constante o una función (la cual puede ser intrínseca o definida por el usuario pero no otras de las funciones agregadas de SQL)
Si la consulta contiene menos de dos registros, Var y VarP devuelven Null (esto indica que la varianza no puede calcularse). Puede utilizar Var y VarP en una expresión de consulta o en una Instrucción SQL.
SELECT Var(Gastos) AS Varianza FROM Pedidos WHERE Pais = 'España';
SELECT VarP(Gastos) AS Varianza FROM Pedidos WHERE Pais = 'España';
Var(expr)
VarP(expr)
VarP evalúa una población, y Var evalúa una muestra de la población. Expr el nombre del campo que contiene los datos que desean evaluarse o una expresión que realiza un cálculo utilizando los datos de dichos campos. Los operandos de expr pueden incluir el nombre de un campo de una tabla, una constante o una función (la cual puede ser intrínseca o definida por el usuario pero no otras de las funciones agregadas de SQL)
Si la consulta contiene menos de dos registros, Var y VarP devuelven Null (esto indica que la varianza no puede calcularse). Puede utilizar Var y VarP en una expresión de consulta o en una Instrucción SQL.
SELECT Var(Gastos) AS Varianza FROM Pedidos WHERE Pais = 'España';
SELECT VarP(Gastos) AS Varianza FROM Pedidos WHERE Pais = 'España';
Vídeo Recomendado
Bibliográfica:
http://basededatos.umh.es/sql/sql04.htm
https://jorgesanchez.net/manuales/sql/select-conjuntos-sql2016.html
http://seminariosql.galeon.com/consimples.html
https://www.microsoft.com/es-mx
https://www.ibm.com/support/knowledgecenter/es/SSEPEK_10.0.0/intro/src/tpc/db2z_sqlfunctionsandexpressions.html
https://jorgesanchez.net/manuales/sql/select-conjuntos-sql2016.html
http://seminariosql.galeon.com/consimples.html
https://www.microsoft.com/es-mx
https://www.ibm.com/support/knowledgecenter/es/SSEPEK_10.0.0/intro/src/tpc/db2z_sqlfunctionsandexpressions.html






























































Comentarios
Publicar un comentario