0% encontró este documento útil (0 votos)
148 vistas67 páginas

GBD UD4 Manipulación Datos SQL.

Este documento presenta los conceptos básicos del lenguaje SQL para la manipulación de datos en bases de datos relacionales. Explica las características de SQL como lenguaje estándar para bases de datos, los diferentes sublenguajes y elementos como tipos de datos, constantes y operadores. También cubre temas como consultas SELECT simples y entre varias tablas, funciones, y las instrucciones DML para insertar, actualizar y eliminar datos.

Cargado por

Ainhoa
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
148 vistas67 páginas

GBD UD4 Manipulación Datos SQL.

Este documento presenta los conceptos básicos del lenguaje SQL para la manipulación de datos en bases de datos relacionales. Explica las características de SQL como lenguaje estándar para bases de datos, los diferentes sublenguajes y elementos como tipos de datos, constantes y operadores. También cubre temas como consultas SELECT simples y entre varias tablas, funciones, y las instrucciones DML para insertar, actualizar y eliminar datos.

Cargado por

Ainhoa
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 67

select country

distrinct
U.D. 4 Manipulación de datos en SQL e.department_id 1º ASIR-GBD. 2022-2023
from employees e;
U.D. 4 Manipulación de datos en SQL
Índice de contenido
1 Introducción..................................................................................................................3
2 Características del lenguaje SQL.................................................................................3
2.1 Componentes de un entorno de ejecución...........................................................4
2.2 Posibles agentes SQL. Posibles modos de ejecución SQL..................................5
3 Sublenguajes de SQL..................................................................................................5
3.1 Reglas sintácticas en SQL....................................................................................6
4 Elementos básicos de SQL..........................................................................................7
4.1 Tipos de datos...................................................................................................... 7
4.1.1 Tipos BUILT-IN de Oracle.............................................................................9
4.1.2 Tipos definidos por el usuario......................................................................12
4.2 Constantes..........................................................................................................12
4.3 Operadores básicos............................................................................................14
4.3.1 Operadores aritméticos...............................................................................14
4.3.2 Operadores relacionales............................................................................. 14
4.3.3 Operadores lógicos..................................................................................... 14
4.3.4 Operador Concatenación ||..........................................................................15
4.3.5 Prioridad y asociatividad de operadores.....................................................16
5 LENGUAJE DE MANIPULACIÓN DE DATOS (DML). SELECT................................17
5.1 Consultas simples con SELECT.........................................................................17
5.1.1 Introducción.................................................................................................17
5.1.2 Sintaxis de la sentencia SELECT:...............................................................17
5.1.3 Operadores BETWEEN, IS NULL, IN y LIKE..............................................21
Actividades propuestas 1.................................................................................25
5.2 Consultas sobre varias tablas. Cláusula JOIN....................................................26
5.2.1 JOIN. SINTAXIS SQL92..............................................................................27
5.2.2 JOIN. SINTAXIS SQL99..............................................................................29
5.2.3 Relaciones sin igualdad. No equijoins.........................................................33
Actividades propuestas 2.................................................................................34
5.3 Funciones de grupos de valores.........................................................................35
5.4 Agrupación de elementos. GROUP BY y HAVING.............................................36
Actividades propuestas 3.................................................................................39
5.5 Subconsultas...................................................................................................... 40
5.5.1 Subconsultas monofila................................................................................ 40
5.5.2 Subconsultas multifila..................................................................................41
5.5.3 Subconsultas multicolumna.........................................................................41
5.5.4 Subconsulta correlacionada........................................................................42
5.5.5 Operador EXISTS........................................................................................42
5.6 Operadores de conjunto.....................................................................................43
Actividades propuestas 4.................................................................................44
6 Funciones...................................................................................................................45
6.1 Funciones numéricas..........................................................................................45
6.2 Funciones de cadena......................................................................................... 47
6.3 Funciones de fechas...........................................................................................48
6.4 Funciones de conversión....................................................................................49
6.5 Otras funciones y variables de retorno...............................................................56

MLLS. Dpto. Informática. IES San Sebastián Página 1 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

7 DML (continuación)....................................................................................................58
7.1 Sentencia INSERT..............................................................................................58
7.1.1 Inserción con SELECT................................................................................59
7.2 Sentencia UPDATE............................................................................................ 61
7.2.1 UPDATE con SELECT................................................................................61
7.3 Sentencia DELETE.............................................................................................62
8 ROLLBACK, COMMIT y AUTOCOMMIT...................................................................62
9 ANEXO:......................................................................................................................65

Comentarios
Aunque estos apuntes sirven como guía de uso de SQL estándar, la base de datos
que se utiliza como referencia fundamental es la base de datos Oracle. Normalmente
se indican siempre las instrucciones para Oracle y para el SQL estándar. En las partes
donde no se indique explícitamente diferencia, significará que Oracle coincide con el
estándar. Sin embargo hay que avisar que todos los ejemplos han sido probados para
Oracle, mientras que no se puede decir lo mismo para SQL estándar.
En el caso de SQL estándar, el software PostgreSQL se ha tenido muy en cuenta ya
que parece el más respetuoso actualmente con el estándar. No obstante es posible
que muchos apartados se refieran sólo a Oracle y sobre todo los detalles de
funcionamiento y resultados no han tenido en cuenta el estándar, sino sólo el
funcionamiento de Oracle.
La razón de utilizar Oracle como base de trabajo se debe a su respeto por SQL
estándar (aunque desde luego no tan estricto como PostgreSQL), es decir que no es
excesivamente diferente; pero fundamentalmente por ser el SGBD de referencia más
importante desde hace ya muchos años. De hecho lo que Oracle aporta de novedoso
en cada versión, acaba formando parte del estándar futuro.

Formato de las instrucciones en los apuntes


En este manual en muchos apartados se indica sintaxis de comandos. Esta sintaxis
sirve para aprender a utilizar el comando, e indica la forma de escribir dicho comando
en el programa utilizado para escribir SQL.
Para indicar la sintaxis de un comando se usan símbolos especiales. Los símbolos
que utiliza este libro (de acuerdo con la sintaxis que se utiliza normalmente en
cualquier documentación de este tipo) son:
- Las palabras encerradas entre los símbolos < y > son los predicados que componen
las instrucciones y que se describen con la sintaxis.
- Las palabras reservadas se escriben en mayúsculas.
- [ ] (corchetes): Los corchetes sirven para encerrar texto que no es obligatorio en el
comando, es decir para indicar una parte opcional.
- | (barra vertical): Este símbolo (|), la barra vertical, indica opción. Las palabras
separadas con este signo indican que se debe elegir una de entre todas las palabras.
- { } (llaves): Las llaves sirven para indicar un texto que puede repetirse cero o muchas
veces.

MLLS. Dpto. Informática. IES San Sebastián Página 2 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

1 Introducción
En un sistema de gestión de bases de datos las operaciones sobre los datos se realizan
a través de consultas formuladas con un lenguaje específico declarativo.
SQL se considera el lenguaje estándar de base de datos relacional. SQL es una
abreviatura de Structured Query Language (Lenguaje de Consulta Estructurado). Pero es
algo más que un lenguaje de consulta, puesto que no sólo ofrece funciones de
recuperación, sino también una diversidad de operaciones de actualización y
manipulación de información y estructura de los datos.
El nacimiento del lenguaje SQL data de 1970 cuando E. F. Codd publica su libro: "Un
modelo de datos relacional para grandes bancos de datos compartidos". Ese libro
dictaría las directrices de las bases de datos relacionales. Apenas dos años después IBM
(para quien trabajaba Codd) utiliza las directrices de Codd para crear el Standard English
Query Language (Lenguaje Estándar Inglés para Consultas) al que se le llamó SEQUEL.
Más adelante se le asignaron las siglas SQL (Standard Query Language, lenguaje
estándar de consulta) aunque en inglés se siguen pronunciando secuel.
En 1979 Oracle presenta la primera implementación comercial del lenguaje. Poco
después se convertía en un estándar en el mundo de las bases de datos avalado por los
organismos ISO y ANSI. En el año 1986 se toma como lenguaje estándar por ANSI de
los SGBD relacionales. Un año después lo adopta ISO, lo que convierte a SQL en
estándar mundial como lenguaje de bases de datos relacionales. En 1989 aparece el
estándar ISO (y ANSI) llamado SQL89 o SQL1. En 1992 aparece la nueva versión
estándar de SQL llamada SQL92. En 1999 se aprueba un nuevo SQL estándar que
incorpora mejoras que incluyen disparadores, procedimientos, funciones y otras
características de las bases de datos objeto-relacionales; dicho estándar se conoce
como SQL99.
La última revisión del estándar es el del año 2016 (SQL2016).
Mas información en https://es.wikipedia.org/wiki/SQL

2 Características del lenguaje SQL


➢ Es un lenguaje unificado para todo tipo de usuarios y para todo tipo de tareas,
incluyendo:
• Consulta, actualización, inserción, borrado de filas en una tabla.
• Creación, modificación, reemplazamiento y borrado de objetos.
• Permite garantizar la integridad y consistencia de los datos.
➢ Es un lenguaje no procedimental o declarativo:
• Cuando se realiza una consulta, se describe cuál es el conjunto de datos que se
quiere obtener, sin tener que especificar cuál es la estrategia de recuperación de
esos datos. Especificamos QUÉ queremos, sin decir CÓMO conseguirlo. Los
lenguajes en los que es necesario decir cómo obtener los datos, se denominan
lenguajes imperativos.

MLLS. Dpto. Informática. IES San Sebastián Página 3 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

• Procesa varias filas a la vez, mejor que una sola.


• La navegación para buscar los datos es automática, utilizando unas rutinas de
acceso denominadas "Optimizador".
➢ Es relacionalmente completo, es decir, que permite la realización de cualquier
consulta de datos.
➢ El lenguaje es sencillo, muy similar al inglés y los comandos básicos pueden
aprenderse en pocas horas.
➢ Carácter estándar. Existe una especificación estándar de este lenguaje, la ANSI
SQL. No obstante, cada fabricante refleja las peculiaridades propias de su SGBD
modificando su SQL.

2.1 Componentes de un entorno de ejecución


Según la normativa ANSI/ISO cuando se ejecuta SQL, existen los siguientes elementos a
tener en cuenta en todo el entorno involucrado en la ejecución de instrucciones SQL:
● Un agente SQL. Entendido como cualquier elemento que cause la ejecución de
instrucciones SQL que serán recibidas por un cliente SQL
● Una implementación SQL. Se trata de un procesador software capaz de ejecutar
las instrucciones pedidas por el agente SQL. Una implementación está
compuesta por:
• Un cliente SQL. Software conectado al agente que funciona como interfaz
entre el agente SQL y el servidor SQL. Sirve para establecer conexiones entre
sí mismo y el servidor SQL.
• Un servidor SQL (puede haber varios). El software encargado de manejar los
datos a los que la instrucción SQL lanzada por el agente hace referencia. Es el
software que realmente ejecuta la instrucción y devuelve los datos al cliente.

MLLS. Dpto. Informática. IES San Sebastián Página 4 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

2.2 Posibles agentes SQL. Posibles modos de ejecución SQL


ejecución directa. SQL interactivo
Las instrucciones SQL se introducen a través de un cliente que está directamente
conectado al servidor SQL; por lo que las instrucciones se traducen sin intermediarios y
los resultados se muestran en el cliente. Normalmente es un modo de trabajo incómodo,
pero permite tener acceso a todas las capacidades del lenguaje SQL de la base de datos
a la que estamos conectados. SQLPlus o SQLcl.
ejecución incrustada o embebida
Las instrucciones SQL se colocan como parte del código de otro lenguaje que se
considera anfitrión (C++, C#, Java, Pascal, Visual Basic,...). Al compilar el código se
utiliza un precompilador de la propia base de datos para traducir el SQL y conectar la
aplicación resultado con la base de datos a través de un software adaptador (driver)
como JDBC u ODBC por ejemplo. La Aplicación de la figura anterior.
ejecución a través de clientes gráficos
Se trata de software que permite conectar a la base de datos a través de un cliente. El
software permite manejar de forma gráfica la base de datos y las acciones realizadas son
traducidas a SQL y enviadas al servidor. Los resultados recibidos vuelven a ser
traducidos de forma gráfica para un manejo más cómodo. SQL Developer.
ejecución dinámica
Se trata de SQL incrustado en módulos especiales que pueden ser invocados una y otra
vez desde distintas aplicaciones.

3 Sublenguajes de SQL
El lenguaje SQL se divide a su vez en tres tipos de lenguajes dependiendo del tipo de
operación que deseamos realizar sobre la Base de Datos. Estos tipos son DDL, DML y
DCL.
DDL (Data Definition Language): Este sublenguaje agrupa los comandos SQL utilizados
para definir, borrar, reemplazar o alterar estructuras de la base de datos.
DML (Data Manipulation Language) Este sublenguaje agrupa los comandos SQL que
permiten realizar consultas y modificaciones, inserciones y borrados sobre las tablas.
DCL (Data Control Language) Este sublenguaje permite establecer derechos de acceso
a los usuarios, comprobaciones de integridad y control de transacciones. Incluye órdenes
para dar y quitar privilegios, así como para completar y abortar transacciones.
En la siguiente tabla podemos ver un resumen de los tipos de lenguajes de SQL con sus
instrucciones principales.

MLLS. Dpto. Informática. IES San Sebastián Página 5 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

3.1 Reglas sintácticas en SQL


● En una sentencia SQL se pueden incluir tabuladores, retornos de carro, espacios
y comentarios. Los comentarios en el código SQL comienzan por /* y terminan
por */ (excepto en algunos SGBD) . Para introducir comentarios en una línea se
usa -- seguido del comentario.
● En SQL no se distingue entre mayúsculas y minúsculas.
● SQL emplea los siguientes términos:
• TABLE: tabla en lugar de relación.
• ROW: fila en lugar de tupla.
• COLUMN: columna en lugar de atributo.

MLLS. Dpto. Informática. IES San Sebastián Página 6 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Casi todas las sentencias SQL tienen una forma básica. Todas comienzan con un verbo,
que es una palabra clave que describe lo que hace la sentencia (por ejemplo SELECT,
INSERT, UPDATE, CREATE). A continuación, le siguen una o más cláusulas que
especifican los datos con los que opera la sentencia. Estas también comienzan con una
palabra clave como WHERE o FROM. Algunas son opcionales y otras obligatorias.
Muchas contienen nombres de tablas o de columnas, palabras reservadas, constantes o
expresiones adicionales.

Reglas para Nombrar Objetos


- El nombre del objeto debe tener una longitud entre 1 (mínimo) y 30 caracteres
(máximo). Excepto el nombre de una base de datos que está limitado a 8 caracteres y
el de un enlace de base de datos a 128.
- El nombre de un objeto no puede estar entre paréntesis, ni entrecomillado.
- El nombre de un objeto sólo contiene caracteres alfanuméricos aunque se permite
también el carácter _. También admite pero se DESACONSEJA los caracteres $ y #.

4 Elementos básicos de SQL

4.1 Tipos de datos


Cada valor de una columna es de un tipo de datos y cada tipo de dato tiene asociado una
serie de características (ejemplo el máximo de longitud). Cuando se define una tabla se
especifica qué tipo de datos tienen asociadas sus columnas. Luego dependiendo del tipo
de datos, se establecen ciertas restricciones sobre ellas.
El estándar SQL define una serie de tipos de datos. Estos tipos de datos son incluidos en
los diferentes SGBD que cuentan con soporte para SQL, aunque con leves
modificaciones o variaciones.

MLLS. Dpto. Informática. IES San Sebastián Página 7 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Correspondencia entre los principales tipos de datos SQL y los equivalentes en


Oracle

Descripción Tipos Estándar SQL Oracle SQL

Texto

Texto de anchura fija CHARACTER(n) CHAR(n)


CHAR(n)

Texto de anchura variable CHARACTER VARYING(n) VARCHAR2(n)


VARCHAR (n)

Texto de anchura fija para NATIONAL CHARACTER(n) NCHAR(n)


NATIONAL CHAR(n)
caracteres nacionales NCHAR(n)
Texto de anchura variable para NATIONAL CHARACTER NVARCHAR2(n)
caracteres nacionales VARYING(n)
NATIONAL CHAR VARYING(n)
NCHAR VARYING(n)
Números
Enteros pequeños (2 bytes) SMALLINT
Enteros normales (4 bytes) INTEGER
INT
Enteros largos (8 bytes) BIGINT
Enteros precisión decimal NUMBER(n)
Decimal de coma variable FLOAT NUMBER
DOUBLE
DOUBLE PRECISSION
REAL
Decimal de coma fija NUMERIC(m,d) NUMBER(m,d)
DECIMAL(m,d)
Fechas
Fechas DATE DATE
Fecha y hora TIMESTAMP TIMESTAMP
Intervalos INTERVAL INTERVAL
Booleanos y binarios
Lógicos BOOLEAN
BOOL
Binarios BIT
BIT VARYING(n)
VARBIT(n)
Datos de gran tamaño
Texto de gran longitud CHARACTER LARGE OBJECT LONG (en desuso)
CLOB CLOB
Binario de gran longitud BINARY LARGE OBJECT RAW (en desuso)
BLOB LONG RAW (en desuso)
BLOB

Como en el estudio de SQL nos vamos a centrar en el SQL de Oracle, procederemos a


definir los principales tipos de datos de Oracle.

MLLS. Dpto. Informática. IES San Sebastián Página 8 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

4.1.1 Tipos BUILT-IN de Oracle


CARACTERES
Tipo de dato Descripción
Almacena una cadena de caracteres de longitud variable, donde el tamaño
máximo viene indicado en la variable tamaño.
Longitud máxima permitida es de 4000 bytes y la mínima 1.
VARCHAR2(tamaño) Es obligatorio especificar la precisión.
Se permiten todos los caracteres alfanuméricos. No se malgasta espacio por
poner más tamaño del deseado ya que si el texto es más pequeño que el
tamaño indicado, el resto del espacio no se ocupa.
Cadena de caracteres de longitud variable teniendo un máximo de tamaño
caracteres dependiendo del juego de caracteres nacional indicado.
NVARCHAR2(tamaño) Longitud máxima permitida es de 2000 bytes y la mínima 1.
Es obligatorio especificar la precisión. Sirve para soportar BD de conjunto de
caracteres de varios bytes (UNICODE). Tampoco se malgasta el espacio.
Almacena una cadena alfanumérica de longitud fija. (No dinámica como los
anteriores)
CHAR(tamaño) Tamaño máximo 2000 bytes.
Si no se especifica precisión el valor mínimo y por defecto es 1.
Si se excede el rango permitido ORACLE dará ERROR.
Igual que la anterior. Usa un juego de caracteres nacional.
NCHAR(tamaño)
Sirve para soportar BD de conjunto de caracteres de varios bytes (UNICODE).

TIPOS DE DATOS NUMÉRICOS


Número entero o de punto flotante.
El rango de p (presición) es el nº de dígitos totales del número (está entre 1 y
38).
La escala s (nº de dígitos a la derecha del punto decimal) puede variar desde –
84 a 127. Los cogerá de la precisión indicada.
Tanto s como p son opcionales, pero si se incluye la escala hay que incluir
también la precisión.
Ejemplos:
DATO FORMATO ALMACENADO
7456123.89 NUMBER 7456123.89
7456123.89 NUMBER(9) 7456124
7456123.89 NUMBER(9,2) 7456123.89
NUMBER(p,s) 7456123.89 NUMBER(9,1) 7456123.9
7456123.89 NUMBER(6) EXCEDE
7456123.89 NUMBER(7,-2) 7456100
7456123.89 NUMBER(7,2) EXCEDE
Si la escala es mayor que la precisión, indica el número máximo de caracteres a la
derecha del punto decimal
DATO FORMATO ALMACENADO
.01234 NUMBER(4,5) .01234
.00012 NUMBER(4,5) .00012
.000127 NUMBER(4,5) .00013
.0000012 NUMBER(2,7) .0000012
.01234 NUMBER(4,6) .01234
Difiere de Number en la forma de almacenamiento en la BD. Se almacena en base
BINARY_FLOAT
binaria (sólo 1 y 0). Es de 32 bits. Con coma decimal o no.
BINARY_DOUBLE Difiere de Number en la forma de almacenamiento en la BD. Se almacena en base

MLLS. Dpto. Informática. IES San Sebastián Página 9 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

binaria (sólo 1 y 0).Es de 64 bits. Con coma decimal o no.


Es un subtipo de NUMBER. p es opcional y representa la cantidad de dígitos
binarios usados para representar el número. Su valor va de 1 a 126. 126 de
precisión de dígitos binarios equivale a 38 de precisión de dígitos decimales.

FLOAT(p) Dato FLOAT(5) Almacenado (en 5 bits llegamos a 31 max)


1.23 1.2
7.89 7.9
12.79 13

El separador decimal es el carácter que aparezca en el parámetro


NLS_NUMERIC_CHARACTERS (por defecto el punto).

TIPOS DE DATOS FECHAS


Para cada valor de date se almacena la siguiente información: el siglo, el año, el
mes, el día, hora, minuto y segundos.
Si no se especifica una hora, la hora por defecto son las 12:00:00 AM (del
mediodía).
Existe una función SYSDATE que recupera la fecha y hora del sistema.
Con datos de tipo fecha se pueden realizar la operaciones aritméticas + y -. Por
ejemplo: SYSDATE +1.
DATE Los tipos de datos DATE se almacenan en campos de longitud fija de siete octetos
cada uno, correspondiendo al siglo, año, mes, día, hora, minuto, y al segundo. Para
entrada/salida de fechas, Oracle utiliza por defecto el formato DD-MMM-AA. Para
cambiar este formato de fecha por defecto se utiliza el parámetro
NLS_DATE_FORMAT.
Para insertar fechas que no estén en el mismo formato de fecha estándar de Oracle,
se puede utilizar la función TO_DATE con una máscara del formato: TO_DATE (el
“13 de noviembre de 1992”, “DD del MES, YYYY”)
Es una extensión del anterior, almacena valores de día, mes y año, junto con hora,
TIMESTAMP minuto y segundos (incluso con decimales). Con lo que representa un instante
concreto en el tiempo. Un ejemplo de TIMESTAMP sería ‘2/2/2004 18:34:23,34521’.
TIMESTAMP WITH TIME Almacena datos de tipo hora incluyendo la zona horaria (explícita), fraccionando los
ZONE segundos.
Almacena datos de tipo hora incluyendo la zona horaria local (relativa), fraccionando
TIMESTAMP WITH LOCAL los segundos
TIME ZONE

Sirven para almacenar intervalos de tiempo (no fechas, sino una suma de elementos
de tiempo).
Este tipo de datos almacena años y meses. Tras la palabra YEAR se puede indicar
la precisión de los años (cifras del año), por defecto es de dos.
INTERVAL YEAR TO Para los intervalos de año a mes los valores se pueden indicar de estas formas:
MONTH

INTERVAL '123-6' YEAR(4) TO MONTH /* 123 años y seis meses */


INTERVAL '123' YEAR(4) TO MONTH /* 123 años */
INTERVAL '6' MONTH(3) TO MONTH /* 6 meses */
INTERVAL DAY TO Representa intervalos de tiempo que expresan días, horas, minutos y segundos. Se
MONTH puede indicar la precisión tras el texto DAY y el número de decimales de los
segundos tras el texto SECOND.
Ejemplos:

INTERVAL '4 10:12:7,352' DAY TO SECOND(3) /* 4 días 10 horas 12 minutos y


7 con 352 segundos */
INTERVAL '4 10:12' DAY TO MINUTE /* 4 días 10 horas 12 minutos */
INTERVAL '4 10' DAY TO HOUR /* 4 días 10 horas */

MLLS. Dpto. Informática. IES San Sebastián Página 10 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

INTERVAL '4' DAY /* 4 días*/


INTERVAL '10' HOUR /*10 horas*/
INTERVAL '25' HOUR /*25 horas*/
INTERVAL '12' MINUTE /*12 minutos*/
INTERVAL '30' SECOND /*30 segundos */
INTERVAL '8:50’ HOUR TO MINUTE; /*8 horas y 50 minutos */
INTERVAL '7:06' MINUTE TO SECOND; /*7 minutos 6 segundos*/
INTERVAL '8:07:06' HOUR TO SECOND; /*8 horas 7 minutos 6 segundos*/

TIPO DE DATOS BINAROS


Sirve para almacenar datos de tipo binario como sonidos, imágenes o arrays de tipo
RAW (tamaño) binario.
Longitud variable tamaño máximo 2000 bytes. Es obligatorio especificar el tamaño.
Sirve para almacenar datos de tipo binario como sonidos, imagénes o arrays de tipo
LONG RAW binario.
Longitud variable de hasta 2GB.

TIPOS DE DATOS DE OBJETOS GRANDES (LOB)


Almacena un objeto grande tipo carácter (cadena de caracteres) cuyos caracteres
CLOB
son de 1 byte y no soportan juego de caracteres de tamaño de variable. 4GB
Almacena un objeto grande tipo carácter cuyos caracteres son multibyte de tamaño
NCLOB
fijo.
BLOB Almacena un objeto grande binario máximo de 4GB.
Cadena de caracteres de longitud variable. Como máximo admite hasta 2 GB
LONG
Tipo obsoleto. Usar mejor LOB (CLOB, NCLOB, BLOB)
BFILE Contiene un localizador o puntero a un fichero binario almacenado fuera de la BD.
Tipo de datos abstracto. En realidad se trata de un CLOB.
XMLType
Se asocia a un esquema XML para la definición de su estructura.

TIPO DE DATOS DE FILA


Es una cadena hexadecimal que representa la dirección única de una fila en su
tabla.
ROWID Este tipo de datos se utiliza para almacenar los valores devueltos por la
pseudocolumna ROWID y cuyo formato es el siguiente BLOCK.ROW.FILE (bloque
de datos del archivo que contiene la fila ROW).
Es una cadena hexadecimal que representa la dirección lógica de una fila en una
UROWID [( tamaño )] tabla organizada con índices.
El máximo tamaño por defecto es 4000 bytes.

Precedencia numérica:
En operaciones que soporten varios tipos de datos numéricos: binary_double es el
que tiene mayor prioridad, seguido de binary_float y por último number. Es decir: Si
alguno de los operandos es binary_double, el resto de los operandos se convierten a
binary_double antes de realizar cualquier operación aritmética. Y así sucesivamente.

De los tipos anteriores, los más utilizados son: VARCHAR2 (cadenas de texto no muy
grandes), DATE (fechas, horas), NUMBER (números), BLOB (ficheros de tipo word,
excel, access, video, sonido, imágenes, etc) y CLOB (cadenas de texto muy grandes).

MLLS. Dpto. Informática. IES San Sebastián Página 11 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

4.1.2 Tipos definidos por el usuario


Entre ellos destacan (serán estudiados según convenga):
● Tipos objetos: Todo objeto posee:
• un nombre ( que lo identifica de forma única),
• un conjunto de atributos
• y unos métodos que son funciones o procedimientos escritos en lenguaje
PL/SQL y almacenados en la BD o escritos en algún otro lenguaje como C,
JAVA y almacenados externamente.
● REF: Referencia a objeto. Es un tipo de dato que contiene el identificador de un
objeto. REFS son punteros a objetos.
● VARRAY: Tipo de tabla.
● NESTED TABLES

4.2 Constantes
Texto
Especifica una constante de carácter o un conjunto de caracteres. La sintaxis se
representa mediante el siguiente diagrama:

Ej. : 'Hola que tal'


donde N indica la representación de la constante usando el juego de caracteres
nacionales.
Una constante de texto puede tener una longitud máxima de 4000 BYTES.

Entera
Un entero puede almacenar un máximo de 38 dígitos de precisión. Su sintaxis es:

Ej. : 15, -125, 8985

MLLS. Dpto. Informática. IES San Sebastián Página 12 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Real
Sintaxis:

f indica binary_float ej: 25f


d indica binary_double ej: 0.5d
Por ejemplo: +2.56, –5.31, 0.26 => .26
Por ejemplo: 25 e –3
NAN significa Not A Number (todo lo que no sea considerado número)

Constantes intervalos
Especifica un período de tiempo en términos de años y meses o en días, horas, minutos
y segundos.
Ej: INTERVAL '123-2' YEAR(3) TO MONTH (intervalo de 123 años y
dos meses)

Fecha y hora
Escritas como literal deben seguir el formato DATE 'YYYY-MM-DD' o TIMESTAMP
'YYYY-MM-DD HH24:MI:SS.FF'

Ejemplo: DATE '2005-11-09'


TIMESTAMP '2005-11-09 13:50:00'

MLLS. Dpto. Informática. IES San Sebastián Página 13 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

4.3 Operadores básicos


4.3.1 Operadores aritméticos
El resultado de una operación aritmética es un valor numérico. Para indicar dos signos
negativos seguidos se usan paréntesis (sino se confunde con un comentario). Son los
siguientes:

4.3.2 Operadores relacionales


Los básicos son:

Ejemplos: edad = 18 nombre = 'Juan' id <> 3


Existen otros operadores relacionales como BETWEEN, LIKE, IN, … que se tratarán más
adelante.

4.3.3 Operadores lógicos


Los operadores lógicos se utilizan para combinar los resultados de comparaciones y
producir un único resultado lógico. Son los siguientes:

Ej: entre 13 y 18

n>=13 and n<=18


[13,18]

MLLS. Dpto. Informática. IES San Sebastián Página 14 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

NOT : Unario, invierte el valor de su operando.


X NOT X
V (verdadero) F
F (falso) V
D (desconocido) D
AND
X Y X AND Y
V V V
V F F
V D D
F V F
F F F
F D F
D V D
D F F
D D D

OR que se cumpla una de las condiciones. Si alguna es verdadero pues V


X Y X OR Y
V V V
V F V
V D V
F V V
F F F
F D D
D V V
D F D
D D D

4.3.4 Operador Concatenación ||


• Manipula cadenas de caracteres y datos de tipo CLOB.
• El resultado de concatenar dos cadenas de caracteres es otra cadena de
caracteres.
• Si las dos cadenas son de tipo CHAR, el resultado también es de tipo CHAR con
límite de 2000 bytes.
• Si alguna es de tipo VARCHAR2, el resultado también es de VARCHAR2 con límite
de 4000 bytes.
• Si alguna es CLOB, el resultado también es CLOB.

Ej. : 'El nombre es' || ' Juan' se evalúa como 'El nombre es Juan';

MLLS. Dpto. Informática. IES San Sebastián Página 15 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

4.3.5 Prioridad y asociatividad de operadores


De mayor a menor prioridad:
+,- unario
*,/
+,-,|| suma, resta, concatenación
=,!=,<,<=,>,>= comparacion
IS [NOT] NULL, LIKE, [NOT]
BETWEEN
[NOT] IN, EXISTS
NOT
AND
OR

Si tienen igual prioridad la asociatividad es de izquierda a derecha. La potencia NOOOOO. Ej: 3^4^5
sería 3^(4^5)

MLLS. Dpto. Informática. IES San Sebastián Página 16 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

5 LENGUAJE DE MANIPULACIÓN DE DATOS (DML).


SELECT.

5.1 Consultas simples con SELECT Para seleccionar los datos k


te de la gana

5.1.1 Introducción
Regla para referenciar un objeto:
[<nom_esquema>.]<nombre_objeto>[.<Parte_objeto>]
Si no se es el propietario de la tabla, hay que especificar el propietario delante de la
tabla. SELECT * FROM HR.COUNTRIES; HR PORQ LA
TABLA ESTA EN ESE USUSARIO
SELECT department_name, manager_id FROM hr.departments;
SELECT * FROM regions: EL ASTERISCO ES PARA TODOS LOS
CAMPOS, ES LO MISMO Q PONER region_name, region_id from
Alias del nombre de una tabla:
regions; darle al play !!!! --> sentencia
de ejecucion
FROM <nombre_objeto> <alias>
El alias no es permanente y sólo es válido para este comando. Es útil cuando en el
FROM aparece más de una vez la misma tabla.
No es lo mismo crear un alias de una tabla que un sinónimo ya que éste último
permanece en la base de datos hasta que se borra.
SELECT * FROM jobs jb
WHERE jb.min_salary > 20000;

Alias de una columna:


<nombre_columna> [AS] <alias>

Permite visualizar la columna con otro nombre. Cuando contiene espacios o caracteres
especiales debe acotarse con doble comillas.
SELECT first_name Nombre, last_name "Los apellidos" FROM employees;

5.1.2 Sintaxis de la sentencia SELECT:


SELECT [ALL|DISTINCT] <lista_atributos>
FROM <tablas>
[WHERE <condición>]
[GROUP BY <lista_expresiones>]
[HAVING <predicado>]
[ORDER BY <lista_ordenación>]

Definición de los elementos:


• Lista de atributos: son aquellos valores que se quieren obtener con las consultas.
Si ponemos en lista de atributos * es lo mismo que si escribiéramos todos los
atributos de la lista de tablas.

MLLS. Dpto. Informática. IES San Sebastián Página 17 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

• Lista de tablas: serie de tablas separadas por comas necesarias para procesar la
consulta.
• Condición: sirve para identificar las filas que obtendrá la consulta.
• Lista de expresiones: por las que se agrupan las filas.
• Predicado: filtra las filas devueltas por los agrupamientos.
• Lista de ordenación: indica los nombres de los atributos por los que se pretende
ordenar el resultado de la consulta.
Dentro de la lista de atributos pueden aparecer expresiones, constantes y funciones no
sólo nombres de columnas.
No importa si se usan mayúsculas o minúsculas.

FROM: La única cláusula obligatoria de la sentencia SELECT es FROM, el resto son


opcionales. Especifica la lista de tablas de las que se obtendrá la información.
Ejemplo: Obtener los campos region_id y region_name de la tabla regions
SELECT region_id, region_name
FROM regions;

Ejemplo: Conectado como usuario SYSTEM obtener todo el contenido de la tabla


employees
SELECT *
FROM HR.employees;

Hay que usar HR. ya que SYSTEM no es propietario de employees.


Con el * pedimos que nos muestren todos las columnas o campos de HR.employees.

Ejemplo: Mostrar el nombre de país y su id utilizando el alias p para la tabla country


por si tengo q entrar en el
SELECT p.country_id, p.country_name FROM countries p; mimo campo dos veces a al
vez hay q distingitlo
WHERE: Obtiene las filas que cumplen la condición expresada. La complejidad de la
condición alcanza la que nos proporcionen los operadores de Oracle.
Las expresiones pueden ser una constante, una expresión aritmética, un valor nulo o un
nombre de columna. Se pueden construir condiciones múltiples usando los operadores
lógicos booleanos estándares: AND, OR y NOT. Está permitido emplear paréntesis para
forzar el orden de evaluación.
Ejemplo: Mostrar el id, nombre, teléfono, comisión y salario de todos aquellos
empleados que ganen más de 10000 dólares
SELECT employee_id, first_name, phone_number, commission_pct, salary informacion k me pide
FROM employees de la tabla
WHERE salary>10000;

MLLS. Dpto. Informática. IES San Sebastián Página 18 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Ejemplo: Mostrar el id, nombre, teléfono, comisión y salario de todos aquellos


empleados cuyo salario esté entre 8000 y 10000 dólares ambos inclusive.
SELECT employee_id, first_name, phone_number, commission_pct, salary
FROM employees
WHERE salary>=8000 and salary<=10000;

Ejemplo: Devuelve los países cuyo nombre sea mayor que 'Spain'.
SELECT *
FROM countries
WHERE country_name>'Spain';

Ejemplo: Devuelve los empleados contratados después del 1 de enero de 2007.


SELECT *
FROM employees
WHERE hire_date > '01/01/2007'; día/mes/año

Usamos el formato por defecto de fecha. Para hacer la condición independiente del
formato de fecha por defecto podríamos utilizar la función TO_DATE de la siguiente
forma:
where hire_date > TO_DATE('2007-01-01', 'yyyy-mm-dd');

Ejemplo: Devuelve los empleados cuyo nombre sea mayor que 'Donald' y menor que
'Stiles' o cuyo id de departamento sea 50.
SELECT *
FROM employees
WHERE (first_name>'Donald' AND first_name<'Stiles') OR department_id=50;

Al tener AND mayor prioridad que OR los paréntesis no serían necesarios.

ORDER BY: Esta cláusula especifica el criterio de clasificación del resultado de la


consulta. ASC especifica una ordenación ascendente, y DESC descendente.

Lista de ordenación:

[ORDER BY expre_columna[DESC|ASC] [,expre_columna[DESC|ASC]]...]

Ejemplo: Devuelve los empleados ordenados por nombre de menor a mayor


SELECT *
FROM employees
ORDER BY first_name;

Ejemplo: Devuelve los departamentos ordenados por nombre de mayor a menor


SELECT *
FROM departments
ORDER BY department_name DESC;

Asimismo, es posible anidar los criterios. El situado más a la izquierda será el principal.

MLLS. Dpto. Informática. IES San Sebastián Página 19 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Ejemplo: Devuelve los empleados ordenados por nombre ascendente y, dentro del
nombre, por apellido descendente
SELECT *
FROM employees
dentro de los de igual
ORDER BY first_name, last_name DESC; nombre ordena los apellidos

También podemos ordenar por el valor de una expresión.

Ejemplo: Devuelve los empleados ordenados por el año de contratación


SELECT *
FROM employees
ORDER BY extract(year from hire_date); te extrae el año de la fecha

ALL: Con la cláusula ALL recuperamos todas las filas, aunque algunas estén repetidas.
Es la opción por omisión.
DISTINCT: Sólo recupera las filas que son distintas.
Ejemplo: Observar las diferencias entre ejecutar la primera consulta y la segunda. La
primera consulta genera muchas filas repetidas.
SELECT department_id
FROM employees
ORDER BY department_id;

SELECT DISTINCT department_id


FROM employees
ORDER BY department_id;

Sin embargo, si añadimos a las SELECT el campo employee_id, las dos consultas
devolverían lo mismo ya que al añadir el campo clave no pueden existir filas repetidas.
-- Da igual poner o no poner DISTINCT
SELECT employee_id, department_id
FROM employees
ORDER BY department_id;

Existe un comando muy útil, sobre todo cuando estamos usando SQLPlus, que nos
permite ver la estructura de una tabla. El comando es DESC (de DESCRIBE).
Ejemplo: Muestra la estructura de la tabla locations.
DESC locations;

Mostrará:
Nombre ¿Nulo? Tipo
-------------- -------- ------------
LOCATION_ID NOT NULL NUMBER(4)
STREET_ADDRESS VARCHAR2(40)
POSTAL_CODE VARCHAR2(12)
CITY NOT NULL VARCHAR2(30)
STATE_PROVINCE VARCHAR2(25)
COUNTRY_ID CHAR(2)

MLLS. Dpto. Informática. IES San Sebastián Página 20 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Con el * las columnas se muestran en el orden en que se definieron cuando se creó la


tabla.
SELECT *
FROM locations;

También podemos escribir la sentencia de la siguiente forma para así decidir en que
orden se muestran las columnas.
Ejemplo: Muestra el id de la localización, la dirección, ciudad, provincia e id de país para
todas las localizaciones.
SELECT location_id, street_address, postal_code, city, state_province,
country_id
FROM locations;

Podemos incluir expresiones en los campos que ponemos en el SELECT


Ejemplo: Muestra el nombre de empleado y su apellido en una única columna.
SELECT first_name || ' ' || last_name "Nombre empleado"
FROM employees;

5.1.3 Operadores BETWEEN, IS NULL, IN y LIKE


BETWEEN
Comprueba si un valor se encuentra entre dos valores especificados(ambos incluidos).
Sintaxis: <exp1> [NOT] BETWEEN <exp2> AND <exp3>
V1 BETWEEN V2 and V3 significa:
Si V1 y V2 y V3 no son NULL
BETWEEN es verdad si V1 >= V2 y V1 <= V3 sino es falso
Sino
BETWEEN es desconocido
Finsi

Ejemplo: Obtener los países cuyo id de region esté entre 3 y 5


SELECT *
FROM countries
WHERE region_id BETWEEN 3 AND 5;

Ejemplo: Obtener los empleados contratados entre los años 2000 y 2003
SELECT *
FROM employees
WHERE hire_date BETWEEN '01/01/2000' AND '31/12/2003';

MLLS. Dpto. Informática. IES San Sebastián Página 21 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

IS [NOT] NULL
A la hora de evaluar una condición de tipo relacional o lógica el resultado puede ser
verdadero, falso ó desconocido. Cuando en un WHERE no se produce ninguna fila, o
resulte una tabla vacía se da un valor desconocido.
El resultado de una condición es diferente si es falso o si es desconocido porque:
NO FALSO equivale a VERDADERO
NO DESCONOCIDO no tiene porqué equivaler a VERDADERO.
Ej. : Tabla de comparación de un operando ‘a’ con otro NULL

Valor de ‘a’ Condición Resultado


15 a is NULL F
15 a is not NULL V
NULL a is NULL V
NULL a is not NULL F
15 a = NULL Desconocido
15 a != NULL Desconocido
NULL a = NULL Desconocido
NULL a != NULL Desconocido
NULL a = 10 Desconocido

Para comprobar si algo es nulo o no, solo se usa las condiciones “is NULL” e “is not
NULL”
Ejemplos: nombre IS NULL -- devuelve verdadero si nombre es NULL

direccion IS NOT NULL -- devuelve verdadero si direccion no es NULL

Ejemplo: Obtener los empleados con el campo comisión distinto a NULL


SELECT *
FROM employees
WHERE commission_pct IS NOT NULL;

Ejemplo: Obtener las localizaciones con el campo provincia a NULL y el campo ciudad
entre 'Geneva' y 'Tokio'
SELECT *
FROM locations
WHERE state_province IS NULL AND city BETWEEN 'Geneva' AND 'Tokio';

Pertenencia a un conjunto: IN (lista_valores)


Comprueba si el resultado de la expresión está incluido en la lista de valores
especificados detrás del IN o en el resultado de la subconsulta.
Es equivalente a: “Igual a algún valor de”

MLLS. Dpto. Informática. IES San Sebastián Página 22 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Sintaxis:
<exp> [NOT] IN (<lista_de _ctes>)
o
<exp> [NOT] IN (<subselect>)

Ejemplo: Obtener los países cuyo id de region sea 1, 3 ó 4


SELECT *
FROM countries
WHERE region_id IN (1,3,4);

Usando NOT IN obtenemos el resto de los países.


Ejemplo: Obtener los empleados cuyo trabajo sea SH_CLERK, SA_MAN, HR_REP
SELECT *
FROM employees
WHERE job_id IN ('SH_CLERK','SA_MAN','HR_REP');

Este operador resulta mucho más potente con la combinación de subconsultas. Una
subconsulta es una SELECT dentro de otra; este caso se estudiará más adelante.

LIKE
Sintaxis:
nombre_columna [NOT] LIKE <cte_alfanumérica> [ESCAPE char_de_esc]

Se usa en comparaciones de cadenas de caracteres con un patrón de búsqueda.


Para realizar búsquedas con LIKE se usan los caracteres comodines:
% equivale a cualquier cadena de 0 o más caracteres.
_ representa un carácter cualquiera.
ESCAPE <char escape> carácter que si precede al % o al _ los convierte en un literal. '$_'
escape '$'
Las comparaciones entre caracteres son CASE SENSITIVE. que se
llamen
Diferencias entre LIKE y = la mayúsculas y minúsculas influyen!!!!! literalmente _
El operador = busca cadenas idénticas.
LIKE busca cadenas que contengan la cadena indicada en el patrón.
'%a%'; va a salir que tenga una a si o si o '_a_'
Ejemplos:
lo mismo pero da pues que tengan un da en cualquier lado
LIKE 'Director' la cadena 'Director'. En este caso es lo mismo que =
LIKE 'M%' cualquier cadena que empiece por 'M'.
LIKE '%X%' cualquier cadena que contenga una 'X'.
LIKE '__M' cualquier cadena de 3 caracteres terminada en 'M'.
LIKE 'N_' una cadena de 2 caracteres que empiece por 'N'.
LIKE '_R%' cualquier cadena cuyo segundo carácter sea una 'R'.

MLLS. Dpto. Informática. IES San Sebastián Página 23 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Ejemplo: Obtener los nombres y apellidos de los empleados cuyo nombre empieza por
P.
SELECT first_name, last_name
FROM employees
WHERE first_name LIKE 'P%';

Ejemplo: Obtener los nombres y apellidos de los empleados cuyo nombre empieza por T
y contengan el carácter a en su interior.
SELECT first_name, last_name
FROM employees
WHERE first_name LIKE 'T%a%';

Ejemplo: Obtener de la tabla locations las direcciones que posean en su interior el


carácter _.
SELECT street_address
FROM locations
WHERE street_address LIKE '%$_%'ESCAPE '$';

MLLS. Dpto. Informática. IES San Sebastián Página 24 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Actividades propuestas 1

1. Seleccionar de la tabla employees a todos los empleados del departamento de id


30. La consulta debe aparecer ordenada por nombre. Los campos que deben
aparecer son: nombre, apellido, email, salario y id del departamento.
2. Consulta los oficios (jobs) cuyo salario mínimo sea 4000 y el máximo sea de 9000
dólares. Deben aparecer todos los campos.
3. Muestra las localizaciones (locations) ordenadas de forma descendente por ciudad.
La consulta mostrará las columnas id de país, provincia, ciudad en ese orden.
4. Muestra todas las columnas de la tabla countries pero con el nombre de la columna
traducido al español (utiliza alias de columnas).
5. Describe las tablas job_history y regions.
6. Obtener las localizaciones con el código postal mayor que 2901.
7. Obtener aquellos empleados cuyo job_id sea SA_REP o IT_PROG y que cobren
más de 10000 dólares.
8. Obtener los id de empleados que tengan historia laboral. Debe mostrar los id sin
repeticiones.
9. Obtener los países ordenados por id de region ascendente y dentro de esta por
nombre de país en orden descendente.
10. Obtener los empleados que cobran un salario entre 5000 y 20000 dólares.
11. Obtener las localizaciones con el cp a nulo.
12. Obtener los empleados con la comisión no nula y el salario superior o igual a
15000 dólares.
13. Obtener el nombre de país y el id de los países cuyo nombre tengan el carácter r
en la tercera posición.
14. Obtener el nombre y apellidos de los empleados cuyo nombre termine en m.
15. Obtener el nombre, apellidos, fecha de contratación e id de departamento de los
empleados cuyo email contenga una P.
16. Obtener los empleados cuyo job_id tenga exactamente tres letras después del
carácter _.

MLLS. Dpto. Informática. IES San Sebastián Página 25 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

5.2 Consultas sobre varias tablas. Cláusula JOIN.


Hasta ahora, en las consultas que hemos realizado sólo se ha utilizado una tabla,
indicada a la derecha de la palabra FROM; pero hay veces que una consulta necesita
columnas de varias tablas. En este caso, las tablas se expresarán a la derecha de la
palabra FROM.
Cuando combinamos varias tablas, hemos de tener en cuenta una serie de reglas:
• Es posible unir tantas tablas como deseemos.
• En la cláusula SELECT se pueden citar columnas de todas las tablas.
• Si hay columnas con el mismo nombre en las distintas tablas de la cláusula FROM,
se deben identificar, especificando NombreTabla.NombreColumna.
• Si el nombre de una columna existe sólo en una tabla, no será necesario
especificarla como NombreTabla.NombreColumna. Sin embargo, hacerlo mejoraría
la legibilidad de la sentencia SELECT.
• El criterio que se siga para combinar las tablas ha de especificarse en la cláusula
WHERE. Si se omite esta cláusula, que especifica la condición de combinación, el
resultado será un PRODUCTO CARTESIANO, que emparejará todas las filas de
una tabla con cada fila de la otra.

Producto cartesiano:
Cuando listamos más de una tabla en la cláusula FROM sin especificar ninguna
condición que las combine adecuadamente en el WHERE, se produce un producto
cartesiano entra las tablas listadas.
En un producto cartesiano se combinan todas las filas de todas las tablas implicadas
en el FROM: se forman todas las posibles combinaciones de todas las filas de una
tabla con las demás.
En un producto cartesiano de dos tablas, si la primera tabla tiene 10 filas y la segunda
tabla 23, el producto cartesiano generará 230 filas.

Ejemplo: Obtener el producto cartesiano de las tablas regions y countries


SELECT *
FROM regions, countries;

Se devuelven en total 100 filas, cada una de las 4 regiones se combina con los 25
países. Al poner * en el SELECT se muestran todas las columnas de las dos tablas.
Como vemos esta información no resulta muy útil. Tenemos que aprender a combinar las
tablas de manera apropiada. Para ello debemos disponer de alguna columna que permita
realizar esta combinación. En el ejemplo que nos ocupa la columna es region_id. Sólo
nos interesan las filas del producto cartesiano que cumplan la condición de que el
region_id de countries coincida con el region_id de regions. En realidad estamos
utilizando la relación del MER, la clave ajena del modelo relacional.

MLLS. Dpto. Informática. IES San Sebastián Página 26 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

La select que mostraría correctamente la combinación de las dos tablas podría ser:
SELECT *
FROM regions, countries
WHERE regions.region_id = countries.region_id;

Para mayor comodidad se suelen usar ALIAS para las tablas:


SELECT *
FROM regions r, countries c
WHERE r.region_id = c.region_id;

A este tipo de operación entre tablas se le denomina JOIN. La sintaxis para las
operaciones tipo join ha evolucionado junto con SQL. Todo lo que se imparte en este
tema es compatible con Oracle; para otros SGBD deberíamos consultar su
documentación.

5.2.1 JOIN. SINTAXIS SQL92.


Un ‘join’ es una select que combina filas de dos o más tablas o vistas. Es decir, cada fila
resultante contiene datos de dos o más tablas.
Las filas en una tabla pueden unirse a filas en otra tabla según los valores comunes
existentes en las columnas correspondientes, esto es, columnas de clave ajena y de
clave primaria. La cláusula WHERE es la que determina cómo se realiza la combinación.
Para combinar tablas se necesita como mínimo una cantidad de condiciones join
equivalentes a la cantidad de tablas menos uno. Por ejemplo, para combinar 4 tablas se
requerirían un mínimo de tres condiciones. (Esta regla no se puede aplicar con claves
compuestas).
No es necesario que las columnas mencionadas en el criterio de combinación sean
seleccionadas (incluidas en la cláusula SELECT).
Podemos diferencias varios tipos:

Inner join: Devuelve sólo filas que cumplen la condición de combinación.


Ejemplo: Obtener el id de la localización, su calle, código postal, provincia, id de país y
nombre de país de todas las localizaciones.
SELECT location_id, street_address, postal_code, state_province, l.country_id,
country_name
FROM locations l, countries c
WHERE l.country_id = c.country_id;

Cuidado con el campo country_id en la select. Debemos añadir de que tabla mostrarlo
con el alias l o c.
Se pueden añadir condiciones adicionales de búsqueda usando otros operadores.
Ejemplo: Obtener el nombre, apellido, id de trabajo, título o descripción del trabajo para
los empleados con un salario mayor de 10000 dólares.
SELECT e.first_name, e.last_name, e.job_id, j.job_title, e.salary
FROM employees e, jobs j

MLLS. Dpto. Informática. IES San Sebastián Página 27 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

WHERE e.job_id = j.job_id and salary>10000;

Ejemplo: Obtener el nombre, apellido, id de trabajo para los empleados, nombre de


departamento y título del trabajo que desempeña el empleado.
SELECT e.first_name, e.last_name, e.job_id, d.department_name, j.job_title
FROM employees e, departments d, jobs j
WHERE e.job_id = j.job_id and e.department_id = d.department_id;

Notese que la consulta anterior devuelve 106 empleados cuando la tabla de employees
tiene 107.

Outer join:
O combinación externa, amplifica el resultado de una combinación simple. Una
combinación externa recupera todas las filas de la combinación y también aquellas que
no encuentren su correspondiente fila pareja de una tabla a otra.
El operador outer join se representa por un (+) y puede aparecer sólo en un lado de la
expresión: el lado al que le falta información. Una condición que incluye un outer join no
puede usar el operador IN o unirse a otra condición por el operador OR.
Los outer joins pueden ser:

Tipo Operador SQL92 Explicación


FROM A, B Además muestra las filas de B que no tengan
LEFT
WHERE A (+) = B correspondiente en A

FROM A, B Además muestra las filas de A que no tengan


RIGHT
WHERE A = B (+) correspondiente en B

Ejemplo: Obtener listado con nombre, apellido, id de departamento y nombre del


departamento al que pertenece el empleado. Deben aparecer todos los empleados.
SELECT e.first_name, e.last_name, e.department_id, d.department_name,
d.department_id
FROM employees e, departments d
WHERE e.department_id=d.department_id(+);

Es un outer join right. Aparece el empleado Kimberely Grant que tiene el campo
department_id a null. Si no usáramos el + sólo obtendríamos 106 empleados.
Ejemplo: Obtener código y el nombre de todos los países, junto con sus localizaciones
(city, street_address y postal_code) existan éstas o no.
SELECT c.country_id, c.country_name, l.city, l.state_address, l.postal_code
FROM countries c, locations l
WHERE l.country_id(+) = c.country_id;

Es un outer join left. Aparecen once países al final que no tienen localizaciones.
Si existieran localizaciones sin países sería (l.country_id a null, no es el caso en nuestros
datos):

MLLS. Dpto. Informática. IES San Sebastián Página 28 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

SELECT c.country_id, c.country_name, l.city, l.state_province, l.postal_code


FROM countries c, locations l
WHERE l.country_id = c.country_id(+);

Self join: Es una combinación simple sobre la misma tabla.


Ejemplo: Obtener un listado del nombre de empleado e id junto con el de su manager e
id.
SELECT emp.employee_id, emp.first_name, emp.last_name, jefes.employee_id,
jefes.first_name "Nombre jefe", jefes.last_name "Apellido jefe"
FROM employees emp, employees jefes
WHERE emp.manager_id=jefes.employee_id;

Se han utilizado alias de tablas con significado por claridad: emp y jefes
Se han utilizado también alias de columnas por claridad.
Si os fijáis, el jefazo Steven King tiene el campo manager_id a null por lo que no sale en
la consulta anterior. Si hacemos un outer join sí podremos obtenerlo:
SELECT emp.employee_id, emp.first_name, emp.last_name, jefes.employee_id,
jefes.first_name "Nombre jefe", jefes.last_name "Apellido jefe"
FROM employees emp, employees jefes
WHERE emp.manager_id=jefes.employee_id (+);

5.2.2 JOIN. SINTAXIS SQL99.


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:
SELECT tabla1.columna1, tabla1.columna2,...
tabla2.columna1, tabla2.columna2,...
FROM tabla1
[CROSS JOIN tabla2]|
[NATURAL JOIN tabla2]|
[[LEFT|RIGHT|FULL] [OUTER] JOIN tabla2 USING(columna)]|
[[LEFT|RIGHT|FULL] [OUTER] JOIN tabla2
ON (tabla1.columa=tabla2.columna)]

La palabra OUTER es opcional.


CROSS JOIN
Utilizando la opción CROSS JOIN se realiza un producto cartesiano o cruzado entre las
tablas indicadas. Los productos cruzados se utilizan para consultas más avanzadas
Ejemplo: Obtener el producto cartesiano de las tablas regions y countries mostrando el
id y el nombre de la region el id y el nombre de país. Ordenar por region_name.
SELECT r.region_id, r.region_name, c.country_id, country_name
FROM regions r

MLLS. Dpto. Informática. IES San Sebastián Página 29 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

CROSS JOIN countries c


ORDER BY r.region_name;

Esto es equivalente a lo que hacíamos anteriormente: FROM regions, countries sin


condiciones en el WHERE

clave ajena y primaria tienen


NATURAL JOIN que coincidir

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.
Ejemplo: Obtener el listado de id, el nombre de la region y el id y nombre de país a la
que pertenece la region. Ordenar por region_name.
SELECT region_id, r.region_name, c.country_id, c.country_name
FROM regions r
NATURAL JOIN countries c
ORDER BY r.region_name;

En este caso se puede hacer el NATURAL JOIN ya que la clave ajena se llama igual que
la clave primaria a la que hace referencia: region_id. En este campo no se puede usar
cualificador (r o c) ya que NATURAL JOIN considera que no hay dos columnas region_id
sino solo una.
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.
Ejemplo: Obtener el listado de id, el nombre de la region y el id y nombre de país a la
que pertenece la region. Ordenar por region_name.
SELECT region_id, r.region_name, c.country_id, c.country_name
FROM regions r
JOIN countries c USING(region_id)
ORDER BY r.region_name;

A veces no es solo una columna la que sirve para relacionar, lo cual implica indicar todas
las columnas que relacionan. Ejemplo:
SELECT campo1, campo2, t1.campo3, t2.campo4
FROM tabla1 t1
JOIN tabla2 t2 USING(campo1,campo2);

Esta consulta supone que las tablas tabla1 y tabla2 comparten dos campos con el mismo
nombre: campo1 y campo2

MLLS. Dpto. Informática. IES San Sebastián Página 30 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

JOIN ON
A veces las tablas se relacionan en formas que no encajan con ninguno de los JOIN
anteriores. Los campos por los que queremos relacionar no tienen el mismo nombre. Si
deseamos mostrar la lista de departamentos con el nombre de su jefe nos encontramos
con que la clave ajena en departments se llama manager_id y la clave primaria de
employees se llama employee_id.
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:
SELECT d.department_id, d.department_name, d.manager_id, e.first_name,
e.last_name
FROM departments d
JOIN employees e ON (d.manager_id=e.employee_id);

Hay que señalar que cualquier JOIN USING se puede hacer con JOIN ON (sin embargo
esto no ocurre al revés)
Ejemplo: Obtener el listado de id, el nombre de la region y el id y nombre de país a la
que pertenece la region. Ordenar por region_name.
SELECT r.region_id, r.region_name, c.country_id, c.country_name
FROM regions r
JOIN countries c ON(r.region_id=c.region_id)
ORDER BY r.region_name;

JOIN ON sí requiere cualificar las columnas que se relacionan aunque tengan el mismo
nombre.
Podemos hacer un JOIN ON con más de dos tablas:
Ejemplo: Obtener el nombre, apellido, id de trabajo para los empleados, nombre de
departamento y título del trabajo que desempeña el empleado.
SELECT e.first_name, e.last_name, e.job_id, d.department_name, j.job_title
FROM employees e
JOIN departments d ON (e.department_id = d.department_id)
JOIN jobs j ON (e.job_id = j.job_id);

Hay que tener en cuenta que en cualquiera de las consultas anteriores podemos añadir
condiciones adicionales mediante la cláusula WHERE:
SELECT region_id, r.region_name, c.country_id, c.country_name
FROM regions r
NATURAL JOIN countries c
WHERE r.region_name like 'A%'
ORDER BY r.region_name;

SELECT region_id, r.region_name, c.country_id, c.country_name


FROM regions r
JOIN countries c USING(region_id)

MLLS. Dpto. Informática. IES San Sebastián Página 31 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

WHERE c.country_name > 'Israel'


ORDER BY r.region_name;

SELECT d.department_id, d.department_name, d.manager_id, e.first_name,


e.last_name
FROM departments d
JOIN employees e ON (d.manager_id=e.employee_id)
WHERE department_id = 100;

cláusula OUTER JOIN:


Los joins que hemos estudiado hasta ahora usando la sintaxis SQL99 son inner joins
(joins internos). Si deseamos que aparezcan filas en la selección que no tienen su
correspondiente valor en la otra tabla del join deberemos usar un outer join.
Su sintaxis es:
...
{LEFT | RIGHT | FULL} OUTER JOIN tabla
{ON(condición) | USING (expresion)}
...
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.
Ejemplo: Obtener listado con nombre, apellido, id de departamento y nombre del
departamento al que pertenece el empleado. Deben aparecer todos los empleados.
SELECT e.first_name, e.last_name, department_id, d.department_name
FROM employees e
LEFT OUTER JOIN departments d USING(department_id);

SELECT e.first_name, e.last_name, e.department_id, d.department_name


FROM employees e
LEFT OUTER JOIN departments d ON (d.department_id=e.department_id);

Ejemplo: Obtener listado con nombre, apellido, id de departamento y nombre del


departamento al que pertenece el empleado. Deben aparecer todos los departamentos.
SELECT e.first_name, e.last_name, e.department_id, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d ON (d.department_id=e.department_id);

MLLS. Dpto. Informática. IES San Sebastián Página 32 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Ejemplo: Obtener listado con nombre, apellido, id de departamento y nombre del


departamento al que pertenece el empleado. Deben aparecer todos los empleados y
todos los departamentos.
SELECT e.first_name, e.last_name, e.department_id, d.department_name
FROM employees e
FULL OUTER JOIN departments d ON (d.department_id=e.department_id);

5.2.3 Relaciones sin igualdad. No equijoins.


Son un tipo de joins poco habituales. Las tablas no tienen columnas que se correspondan
unas con otras de forma que se pueda hacer un join.
La combinación se produce usando un operador distinto al de =
Ejemplo: En la siguiente consulta podemos ver, para cada empleado, todos los trabajos
que cumplen el requisito de que su salario esté entre el salario mínimo y máximo de ese
trabajo.
SELECT e.first_name, e.last_name, e.salary, e.job_id, j.job_id, j.min_salary,
j.max_salary
FROM employees e, jobs j
WHERE e.salary BETWEEN j.min_salary AND j.max_salary
ORDER BY e.first_name, e.last_name, j.min_salary;

MLLS. Dpto. Informática. IES San Sebastián Página 33 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Actividades propuestas 2
1. Obtener el nombre, apellido, correo id de trabajo y descripción del trabajo para
todos los empleados que trabajan en el departamento de código 80.
2. ¿Cuál es el empleado que dirige el departamento 100? Mostrar todos sus datos.
3. Obtener los departamentos que están localizados en la ciudad de Seatle.
4. Obtener un listado con todos los departamentos que no tengan ningún
empleado. Debéis utilizar JOIN USING.
5. Obtener un listado con el historial de trabajos de nuestra empresa mostrando
también el nombre de departamento, la descripcion del trabajo y el nombre y
apellido del empleado.
6. Obtener el nombre, apellido, id de trabajo para los empleados que han sido
alguna vez ST_CLERK.
7. Obtener un listado con los países donde no exista ninguna localización. Debéis
utilizar JOIN ON.
8. Obtener las localizaciones de United Kingdom con el campo provincia a nulo.
Debéis mostrar el nombre de región, nombre de país y todos los campos de la
localización.
9. Obtener un listado de todos los trabajos que no aparecen en la tabla job_history.
Debéis utilizar la sintaxis SQL92.,
10. Obtener un listado con todos los nombres y apellidos de los empleados que son
jefes de algún empleado.
11. Obtener la información de los empleados que no tengan jefe.
12. Obtener un listado con todos los empleados que tengan el salario fuera de los
límites mínimo y máximo que marca su tipo de trabajo.
13. Obtener un listado con todos los empleados contratados antes del 2005 y que
sean Shipping Clerk.
14. Obtener un listado con el nombre y apellido del empleado, el nombre del
departamento y su comisión para todos aquellos empleados con la comisión inferior
a 0,1.

MLLS. Dpto. Informática. IES San Sebastián Página 34 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

5.3 Funciones de grupos de valores


En SQL se dispone de una serie de funciones de grupo o de dominio agregado. Estas
funciones se aplican a un conjunto de filas. Estas funciones permiten obtener por ejemplo
el número de empleados de la empresa, el que lleva más tiempo contratado, el número
total de regiones, etcétera. Los valores nulos son ignorados por las funciones de grupos
de valores y los cálculos se realizan sin contar con ellos.
Las funciones de grupo más usuales son:

Ejemplo: Obtener el salario medio de todos los empleados del departamento 100.
SELECT avg(salary)
FROM employees e
WHERE department_id=100;

Ejemplo: Obtener el número total de empleados.


SELECT count(employee_id) // o count(*)
FROM employees e;

Ejemplo: Obtener el número empleados de empleados con comision no nula


SELECT count(e.commission_pct)
FROM employees e;

Ejemplo: Obtener el máximo, el mínimo y la varianza del salario cobrado por un


empleado
SELECT max(e.salary) Máximo, min(e.salary) Mínimo, variance(e.salary) Varianza
FROM employees e;

Ejemplo: Obtener el importe total de la masa salarial de los empleados


SELECT sum(e.salary)
FROM employees e;

MLLS. Dpto. Informática. IES San Sebastián Página 35 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

DISTINCT en funciones de grupo


En todas las funciones de grupo, al indicar los argumentos se pueden emplear las
cláusulas DISTINCT y ALL, aunque no se suelen utilizar en las funciones AVG, SUM,
MAX ni MIN, pero sí es más normal su uso en COUNT.
Recordemos que DISTINCT realiza una selección de filas cuyos valores en la columna
especificada no están duplicados. La cláusula ALL recoge todas las filas aunque sus
valores estén duplicados.
El formato de COUNT incluyendo DISTINCT y ALL es éste:
COUNT ( * | [DISTINCT | ALL] expresión)

Si COUNT recibe como argumento una expresión o columna, ésta podrá ir precedida de
las cláusulas ALL o DISTINCT.
Ejemplo: Obtener cuántos departamentos tienen empleados
SELECT count(DISTINCT e.department_id)
FROM employees e;

5.4 Agrupación de elementos. GROUP BY y HAVING.


GROUP BY
Hasta ahora hemos utilizado la orden SELECT para recuperar filas de una tabla y la
cláusula WHERE para seleccionar el número de filas que se recuperan. También hemos
empleado funciones de grupo para trabajar con conjuntos de filas. Se puede pensar en
estos conjuntos como si fueran un grupo; así calculamos, por ejemplo, el salario medio
de todos los empleados: SELECT AVG(salary) FROM employees; o la suma de todos los
salarios: SELECT SUM(salary) FROM employees;.
Pero, a veces, nos interesa consultar los datos según grupos determinados. Así, para
saber cuál es el salario medio de los empleados por departamento, las cláusulas que
conocemos hasta ahora no son suficientes. Necesitamos realizar un agrupamientopor
departamento. Para ello utilizaremos la cláusula GROUP BY.
Ejemplo: Obtener un listado con el id de departamento y el salario medio de los
empleados de ese departamento.
SELECT department_id, avg(salary) SOLO PUEDES PONER COSAS RELACIOADAS CON LO K POONGAS
FROM employees e EN EL GROUP BY
GROUP by department_id; SALE 1 FILA POR CADA DEPARTAMENTO

La sentencia SELECT posibilita agrupar uno o más conjuntos de filas. El agrupamiento


se lleva a cabo mediante la cláusula GROUP BY por las columnas especificadas y en el
orden especificado. Éste es su formato:
SELECT ...
FROM ...
GROUP BY columna1, columna2, columna3,...
HAVING condición
ORDER BY ...

MLLS. Dpto. Informática. IES San Sebastián Página 36 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Si la select contiene GROUP BY, la lista de atributos a mostrar sólo puede contener los
siguientes tipos de expresiones:
• Constantes.
• Funciones de agrupación o de grupo.
• Expresiones idénticas a las que estarán en la cláusula GROUP BY.
• Expresiones implícitas en las expresiones mencionadas en la select que evalúen el
mismo valor para todas las filas de un grupo.
Las expresiones en la cláusula GROUP BY pueden contener cualquier columna de una
tabla o vista mencionada en el FROM, sin importar que estas columnas estén o no en la
lista de la select.
Los valores nulos en las columnas de agrupamiento se consideran iguales, es decir, se
incluyen en el mismo grupo.
Una vez formados los grupos, para cada uno de ellos se evalúan las expresiones de la
cláusula SELECT. Por tanto, cada grupo produce una fila en la tabla resultante.
Las columnas que no figuren en la cláusula GROUP BY, podrán especificarse en la lista
de atributos de la select sólo en los argumentos de funciones de agrupamiento.
GROUP BY no ordena el resultado de la consulta, para eso tendríamos que utilizar
ORDER BY.
Ejemplo: Obtener el número de empleados que existen en cada departamento.
SELECT department_id, count(employee_id)
FROM employees e
GROUP by department_id;

Esta consulta sería incorrecta; first_name no está en GROUP BY y no se usa en una


función de agrupamiento:
SELECT department_id, count(employee_id), first_name
FROM employees e
GROUP by department_id;

Ejemplo: Obtener el salario máximo por departamento.


SELECT department_id, max(salary)
FROM employees e
GROUP by department_id;

Ejemplo: Obtener un listado con el id de departamento, el nombre del departamento y el


número de empleados que tiene el departamento (los de 0 empleados deben aparecer).
Podemos partir de esta consulta que nos da una lista con los departamentos y todos los
empleados que tienen incluyendo (LEFT JOIN) a los departamentos que no tienen empleados:

SELECT department_id, d.department_name, e.employee_id, e.first_name


FROM departments d
LEFT JOIN employees e USING (department_id);

MLLS. Dpto. Informática. IES San Sebastián Página 37 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Si agrupamos por department_id y d.department_name y contamos cuantos e.employee_id hay


en cada grupo obtenemos la consulta deseada:

SELECT department_id, d.department_name, count(e.employee_id)


FROM departments d
LEFT JOIN employees e USING (department_id)
GROUP by department_id, d.department_name;

Notese que count(*) no es válido porque me cuenta el valor null como 1 (1 fila). Tampoco
podemos mostrar e.employee_id ni e.first_name porque no forman parte del group by ni están
en una función de grupo.

Ejemplo: Obtener el número de empleados del departamento que tiene más empleados.
SELECT max(count(e.employee_id))
FROM employees e
GROUP by department_id;

HAVING
Del mismo modo que existe la condición de búsqueda WHERE para filas individuales,
también hay una condición de búsqueda para grupos de filas: HAVING. La cláusula
HAVING se emplea para controlar cuál de los conjuntos de filas se visualiza. Se evalúa
sobre la tabla que devuelve el GROUP BY. No puede existir sin GROUP BY.
La condición es un predicado simple o compuesto, en el que las columnas que participen
y no sean de agrupamiento deberán figurar como argumentos de funciones de
agrupamiento. En la condición también pueden aparecer las funciones agregadas tal
como aparecen en el SELECT.
Ejemplo: Obtener los departamentos que tienen más de 4 empleados.
SELECT department_id, count(employee_id)
FROM employees e
GROUP by department_id
HAVING count(employee_id)>4;

Cuando usamos la cláusula ORDER BY con columnas y funciones de grupo hemos de


tener en cuenta que ésta se ejecuta detrás de las cláusulas WHERE, GROUP BY y
HAVING. En ORDER BY podemos especificar funciones de grupo, columnas de GROUP
BY o su combinación.
SELECT department_id, count(employee_id)
FROM employees e
GROUP by department_id
HAVING count(employee_id)>4
ORDER BY count(employee_id);

La evaluación de las cláusulas en tiempo de ejecución se efectúa en el siguiente orden:


WHERE Selecciona las filas.
GROUP BY Agrupa estas filas.
HAVING Filtra los grupos. Selecciona y elimina los grupos.
ORDER BY Clasifica la salida. Ordena los grupos.

MLLS. Dpto. Informática. IES San Sebastián Página 38 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Actividades propuestas 3
1. Obtener el salario máximo para el departamento 80.
2. Mostrar el salario máximo que puede llegar a ganarse en la empresa.
3. Obtener los nombres de departamentos que tengan más de 4 personas
trabajando.
4. Obtener el número de localizaciones que existen en cada país.
5. Obtener el número de localizaciones que existe en cada país pero mostrando
también los países con 0 localizaciones.
6. Obtener un listado con el id de empleado que es jefe y con el número de
empleados que dirige.
7. Obtener un listado con los nombres y apellidos de los empleados que son jefes
de otros empleados y con el número de empleados que dirige.
8. Por cada tipo de trabajo mostrar su id, descripción, número de empleados que
realizan ese trabajo y cuál es el salario máximo de empleado de entre todos los que
desempeñan ese trabajo.
9. Mostrar los departamentos para los que existe algún trabajador que gane igual o
más de salario máximo que establece su tipo de trabajo.
10. Mostrar el id de país y el nombre de aquellos países que tengan localizados más
de un departamento.

MLLS. Dpto. Informática. IES San Sebastián Página 39 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

5.5 Subconsultas
Es una sentencia SELECT que está incluida en una cláusula de otra sentencia SQL
(FROM (de una select o delete) o WHERE, HAVING).
Ejemplo: ¿Qué empleados son del mismo departamento que el empleado de id 100?
Para averiguar esto se necesitan dos consultas:
• Subconsulta: que averigüe el departamento del empleado de id 100.
• Consulta externa: hallar los empleados que sean de ese departamento.
Primero se ejecuta la subconsulta y luego se usa como valor para la consulta principal.
SELECT *
FROM employees
WHERE department_id = (SELECT department_id
FROM employees WHERE employee_id = 100)

Uso de una subconsulta:


• La subconsulta se ejecuta una vez y antes de la consulta principal.
• El resultado de la subconsulta es usado por la consulta principal externa.
• Las subconsultas se encierran entre paréntesis.
• Una subconsulta también puede utilizarse en la cláusula FROM de una SELECT e
incluso en el SELECT.
• No añada una cláusula ORDER BY a una subconsulta, en su lugar debe añadirse a
la consulta principal.

Tipos de subconsultas:
• Monofila
• Multifila
• Multicolumna

5.5.1 Subconsultas monofila


Devuelve sólo una fila de una sola columna. Se utilizan con operadores de comparación
(=, >, >=, <, <=, !=).
El ejemplo anterior es de una consulta monofila.
Ejemplo: ¿Qué empleados tienen el salario mínimo?
SELECT *
FROM employees
WHERE salary = (SELECT min(salary)
FROM employees)

MLLS. Dpto. Informática. IES San Sebastián Página 40 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Errores comunes:
• Que la subconsulta mono-fila contenga un group by que devuelva más de una fila.
• Que la subconsulta no devuelva ninguna fila con lo que el resultado de la principal
tampoco.

5.5.2 Subconsultas multifila


Devuelven más de una fila de una sola columna. Usan operadores multifila como IN, ANY
o SOME, ALL.

Sintaxis: Siendo X una expresión e Y una expresión que puede ser una subconsulta

Operador multifila Descripción Si Y no devuelve filas


Es Verdad <=> la comparación es verdad para
X op relacional ALL Y Resultado: Verdad
todos y cada uno de los valores resultantes de Y
X op relacional SOME Y Es Verdad <=> la comparación es verdad para
Resultado: Falso
(ANY) alguno de los valores resultantes de Y
Igual a algún valor de Y
X IN Y Resultado: Falso
Equivale a = ANY
Distinto a todos los valores de Y
X NOT IN Y Resultado: Verdad
Equivale a != ALL

Nota: Estos operadores pueden usarse con un subconsulta o con una lista de
expresiones separadas por comas.
Ejemplo: Obtener la lista de todos los id de empleados que son jefe de alguien.
SELECT DISTINCT manager_id
FROM employees;

Ejemplo: Obtener la lista de todos los id de empleados que son jefes actualmente y que
aparecen en el histórico de empleados.
SELECT DISTINCT employee_id
FROM job_history
WHERE employee_id IN (SELECT DISTINCT manager_id
FROM employees); -- =SOME o =ANY

Ejemplo: Obtener los datos de los empleados que están contratados por primera vez en
la empresa.
SELECT *
FROM employees
WHERE employee_id NOT IN (SELECT DISTINCT employee_id
FROM job_history); -- !=ALL

5.5.3 Subconsultas multicolumna


Devuelve más de una fila y con más de una columna.

Ejemplo: Obtener toda la información de los empleados junto con el departamento para
aquellos empleados que han estado contratados alguna vez.

MLLS. Dpto. Informática. IES San Sebastián Página 41 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

SELECT *
FROM employees e, departments d
WHERE (e.employee_id, d.department_id) = ANY (SELECT DISTINCT employee_id,
department_id FROM job_history);
Si se detallan varios campos en la cláusula WHERE, deben encerrarse entre paréntesis,
y han de coincidir en número y tipo de datos con los de la sentencia SELECT de la
consulta interior. Cada columna de la cláusula WHERE se referirá a la correspondiente
columna de la subconsulta.

5.5.4 Subconsulta correlacionada


Una subconsulta correlacionada es aquella que hace referencia a una columna o varias
de la consulta más externa. A veces la subconsulta hace uso de columnas que tienen el
mismo nombre que las columnas de las tablas usadas en la consulta mas externa. Si la
subconsulta necesita acceder a esas columnas deberá definirse un alias en la tabla más
externa.
Ejemplo: ¿Qué empleados tienen el salario máximo de su departamento?
SELECT *
FROM employees e
WHERE salary = (SELECT MAX(salary) FROM employees WHERE department_id =
e.department_id);

La subconsulta devuelve para cada fila que se recupere de la consulta más externa el
máximo salario del departamento que se está recuperando en la consulta externa; para
referenciar a dicho departamento se necesita el alias e usado en la tabla de la consulta
externa.
Ejemplo: ¿Qué empleados tienen el salario máximo de su tipo de trabajo?
SELECT *
FROM employees e
WHERE salary = (SELECT max_salary
FROM jobs
WHERE job_id=e.job_id);

Nótese como estamos pasando el dato job_id a la subconsulta por medio del uso del
alias e.

5.5.5 Operador EXISTS


El operador EXISTS comprueba la existencia de filas en una subconsulta.
Ejemplo: Obtener los tipos de oficio para los que existen empleados en la base de datos.
SELECT *
FROM jobs j
WHERE EXISTS (SELECT DISTINCT job_id
FROM employees
WHERE j.job_id = job_id);

MLLS. Dpto. Informática. IES San Sebastián Página 42 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Ejemplo: Obtener los países para los que no existe localizaciones.


SELECT *
FROM countries c
WHERE NOT EXISTS (SELECT DISTINCT location_id
FROM locations
WHERE c.country_id = country_id);

5.6 Operadores de conjunto


Combinan los resultados de 2 consultas en un sólo resultado.
Todos los operadores de conjuntos tienen igual precedencia. Si en una sentencia existen
varios operadores de conjuntos, Oracle los evalúa de izquierda a derecha (a no ser que
se especifiquen en paréntesis).
Restricciones:
• No son válidos en columnas de tipo BLOB, CLOB, BFILE, LONG, y tipos de tablas
VARRAY, NESTED TABLE o LONG.
• No se pueden utilizar en SELECT con la cláusula ORDER BY
• Tampoco con la cláusula FOR de la sentencia UPDATE
• Los datos con los que se va a trabajar deben de ser del mismo tipo en cada una de
las columnas de las subconsultas.
Los operadores son:
UNION:
Combina los resultados de dos consultas eliminando las filas repetidas.
Ejemplo: Obtener los países de la region 1 para los que existen localizaciones junto los
países de la región 4 para los que no existen localizaciones.
SELECT c.*
FROM countries c
JOIN locations l ON (c.country_id = l.country_id)
WHERE region_id = 1

UNION

SELECT c.*
FROM countries c
WHERE c.country_id NOT IN (SELECT DISTINCT country_id FROM locations)
AND c.region_id = 4;

UNION ALL:
Devuelve todas las filas de ambas consultas incluyendo todas las entradas duplicadas.

INTERSECT:
Devuelve todas las filas comunes eliminando duplicados.

MLLS. Dpto. Informática. IES San Sebastián Página 43 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

MINUS:
Devuelve todas las filas del resultado de la primera consulta menos las contenidas en el
resultado de la segunda consulta.

Actividades propuestas 4
1. Muestra los datos (nombre, apellido, id oficio, salario y fecha de alta) de aquellos
empleados que desempeñen el mismo oficio que Renske Ladwig o que tengan un
salario mayor o igual que Janette King.
2. Mostrar los datos del empleado jefe del departamento Administration.
3. Obtener la lista de todos los departamentos cuyo salario medio sea superior a la
media del salario medio de los departamentos.
4. Obtener aquellos nombres y apellidos de empleados cuyo oficio sea alguno de
los oficios que hay en el departamento 50.
5. Obtener los datos de los empleados cuyo salario sea menor a cualquier salario
de los empleados del departamento 80.
6. Obtener los datos de los empleados que trabajan en Toronto, Tokyo o Roma.
7. Consulta los nombres, apellidos y oficios de todos los empleados del
departamento 80 cuyo trabajo sea idéntico al de cualquiera de los empleados del
departamento de IT.
8. Obtén el nombre y apellido de los empleados con el mismo oficio y salario que
Patrick Sully.
9. Muestra en pantalla el nombre, apellido, oficio y salario de los empleados del
departamento de Alana Walsh que tengan su mismo salario.
10. Obtén los datos de los departamentos que no tengan empleados.
11. Obtén los datos de los departamentos que tengan empleados.
12. Obtén todos los datos de los departamentos con empleados excepto aquellos
departamentos que estén localizados en la región 3.
13. Obtén todos los datos de los empleados que son ST_CLERK y que han sido
13. select *From employees
ST_CLERK here job_id='SR_CLERK'
NION
14. Obtén todos los departamentos en cuyo historial de empleados tengamos al
ELECT E.*ßROM JOB_HISTORY J
menos 2 trabajadores junto con los
OIN EMPLOYEES departamentos
E ON que tienen
(E.EMPLOYEES_ID más de 7 empleados.
= J.EMPLOYEE_ID
HERE J.JOB_ID='ST_CLERK');
14. SELECT D.DEPARTEMNT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID
FROM JOB_HISTORY J
JOIN DEPARTMENT D ON (D.DEPARMENT_ID = J.DEPARTMENT_ID)
GRUP BY D.DEPARTEMNT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID
HAVING COUNT (EMPLOYEE_ID)>=2
UNION
SELECT D.*
FROM DEPARTMENT D
MLLS. Dpto. Informática. IES San Sebastián Página 44 de 67
JOIN EMPLOYEE E ON (D.DEPARMET_ID=E.DEPARTMENT.ID)
GRUP BY D.DEAPRT,MEMNT_ID, D.DEAPRTMENT_NAME, D.MANAGER_ID, D.LOCATION_ID

HAVING COUNT (E,EMPLOYEE_ID)>7


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

6 Funciones
Las funciones se usan dentro de expresiones y actúan con los valores de las columnas,
variables o constantes.
Si se llama a una función con un argumento de otro tipo que el esperado, Oracle intenta
su conversión al tipo adecuado de forma implícita.
Si se llama a una función con un argumento nulo, la función devuelve nulo (excepto NVL,
CONCAT , REPLACE). Es posible el anidamiento de funciones. Las funciones de SQL se
clasifican en :
1. Escalares (o de fila simple )
a) Numéricas
b) Carácter
c) De fecha y tiempo
d) De conversión
e) Otras
2. Agregadas o de agrupación. Ya estudiadas.
En Oracle existe una tabla denominada DUAL muy útil para comprobar el resultado de
las funciones. Su descripción es la siguiente:

Tiene una sola fila, por lo que podemos hacer pruebas como la que sigue:
SELECT abs(-100) FROM dual;

Devolvería una sóla fila de una columna llamada abs(-100) y con valor 100.

6.1 Funciones numéricas


Funciones numéricas
Función matemática Ejemplo Descripción
sql> select abs(-70) from dual; Devuelve el valor absoluto del valor. El resultado
abs(valor)
abs(-70) 70 siempre es positivo.
sql> select ceil(14.4) from dual;
ceil(14.4) 15 Devuelve el entero más próximo que sea mayor o igual
ceil(valor)
sql> select ceil(-15.1) from dual; que el valor.
ceil(-15.1) -15
sql> select cos(90) from dual;
cos(valor) Devuelve el coseno de valor.
cos(90) -,44807362
sql> select floor(14.9) from dual;
floor(14.9) 14 Devuelve el entero inmediatemento igual o menor que
floor(valor)
sql> select floor(-15.7) from dual; valor.
floor(-15.7) -16

MLLS. Dpto. Informática. IES San Sebastián Página 45 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Funciones numéricas
sql> select mod(25,3) from dual;
Devuelve el resto resultante de dividir valor entre
mod(25,3) 1
mod(valor) divisor. Si el divisor es igual a cero, entonces, se
sql> select mod(24,3) from dual;
devuelve valor.
mod(24,3) 0
sql> select power(2,4) from dual;
power(valor, exponente) El valor se eleva a la potencia del exponente.
power(2,4) 16
sql> select round(456.789,3) from dual; Devuelve valor redondeado a precision decimales. Si
round(456.789,3) 456,789 precision es negativo, el redondeo de dígitos se lleva a
round(valor, precision)
sql> select round(456.789,2) from dual; cabo a la izquierda del punto decimal. Si se omite
round(456.789,2) 456,79 precision, devuelve valor con 0 decimales y redondeado.
Devuelve un número que indica si el valor es positivo o
sql> select sign(-22) from dual;
negativo:
sign(-22) -1
sign (valor) Valor > 0, devuelve 1
sql> select sign(8) from dual;
Valor < 0, devuelve -1
sign(8) 1
Valor = 0, devuelve 0
sql> select sqrt(25) from dual;
sqrt(25) 5
sqrt(valor) Devuelve la raíz cuadrada de valor.
sql> select sqrt(26) from dual;
sqrt(26) 5,09901951
Devuelve el valor truncado con la precisión especificada.
Si precisión es positiva, truncará dicho número de
sql> select trunc(4.789,2) from dual;
posiciones a la derecha del punto decimal. Si precisión es
trunc(4.789,2) 4,78
trunc(valor, precisión) negativa, trucará dicho número de posiciones a la
sql> select trunc(456.789, -2) from dual;
izquierda del punto decimal. Si precisión no se
trunc(456.789,-2) 400
especifica, se supondrá el valor de cero, con lo que se
truncará en el punto decimal.
sql> select acos(1) from dual;
acos(1) 0
acos(valor) Devuelve el arcocoseno de valor.
sql> select acos(0) from dual;
acos(0) 1,57079633
sql> select asin(1) from dual;
asin(valor) Devuelve el arcoseno de valor.
asin(1) 1,57079633
sql> select atan(1) from dual;
atan(valor) Devuelve la arcotangente de valor.
atan(1) ,785398163
sql> select cosh(6) from dual;
cosh(valor) Devuelve el coseno hiperbólico de valor.
cosh(6) 201,715636
sql> select exp(2) from dual; Devuelve el resultado de elevar el número e al exponente
exp(valor)
exp(2) 7,3890561 valor.
sql> select ln(95) from dual;
ln (valor) Devuelve el logaritmo neperiano de valor.
ln(95) 4,55387689
sql> select log(10, 1000) from dual;
log(base, valor) Devuelve el logaritmo en base introducida, de valor.
log(10,1000) 3
sql> select sin(5) from dual;
sin(valor) Devuelve el seno de valor.
sin(5) -,95892427
sql> select sinh(4) from dual;
sinh(valor) Devuelve el seno hiperbólico.
sinh(4) 27,2899172
sql> select tan(6) from dual;
tan(valor) Devuelve la tangente de valor.
tan(6) -,29100619
sql> select tanh(15) from dual;
tanh(valor) Devuelve la tangente hiperbólica.
tanh(15) 1

MLLS. Dpto. Informática. IES San Sebastián Página 46 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

6.2 Funciones de cadena


Funciones de cadena
Función de cadena Ejemplo Descripción
sql> select chr(66) from dual; Devuelve el carácter ASCII correspondiente
chr(valor)
b a valor.
sql> select concat('calcu', 'ladora') from
Devuelve la concatenación de cadena2 con
concat(cadena1, cadena2) dual;
cadena1.
calculadora
sql> select initcap('braulio marclars') from
Devuelva la cadena original, con la primera
initcap(cadena) dual;
letra de cada palabra en mayúscula.
Braulio Marclars
sql> select lower('MaRkLArs') from dual; Devuelve la cadena original con todos sus
lower(cadena)
marklars caracteres convertidos a minúscula.
Inserta caracteres de relleno a la izquierda
de una cadena con el carácter de relleno
sql> select lpad ('prueba',11,'&') from dual; especificado hasta que la cadena tenga la
lpad(cadena, longitud[,relleno])
&&&&&prueba longitud especificada. Si no se especifica un
carácter de relleno, la opción
predeterminada son espacios.
Recorta la cadena por la izquierda,
eliminando cualquier carácter contenido en
sql> select ltrim('abbatermino','ba') from valor-recortar hasta que se encuentre un
ltrim(cadena,[,valor-recortar]) dual; carácter que no esté incluido en valor-
termino recortar. Si no se especifica un valor-
recortar, se utilizan espacios como opción
predeterminada.
select replace('cabra','a','o') from dual;
Busca la cadena encontrar y la reemplaza
replace(cadena,encontrar,sustituir) cobro
por sustituir.

Devuelve la longitud de valor,


select length(’candide’) from dual;
length(valor) independiente de que sea una cadena, un
7
número, una fecha o una expresión.
select upper(’large’)
Convierte la cadena de caracteres a
upper(cadena) from dual;
mayúsculas.
LARGE
Inserta caracteres de relleno a la derecha de
una cadena con el carácter de relleno
select rpad(’morrison’,12,’ab’) from dual; especificado hasta que la cadena tenga la
rpad(cadena,longitud[,relleno])
morrisonabab longitud especificada. Si no se especifica un
carácter de relleno, la opción
predeterminada son espacios.
Recorta la cadena por la derecha,
eliminando cualquier carácter contenido en
select rtrim(’browningyxxxy’,’xy’) from valor-recortar hasta que se encuentre un
rtrim(cadena,[valor-recortar]) dual; carácter que no esté incluido en valor-
browningyxx recortar. Si no se especifica un valor-
recortar, se utilizan espacios como opción
predeterminada.
cadena | | cadena Función que concatena dos cadenas.
Devuelve la posición de un valor dentro de
una cadena. Si se especifica una posición
select instr(’corporate floor’,’or’, 3, 2)
inicio, instr comienza a buscar a partir de
instr(cadena,valor[,inicio, from dual;
ahí, si se especifica un número de
[ocurrencia]]) 14
ocurrencia, instr devuelve la ubicación que
corresponde a dicha aparición del valor
indicado.

MLLS. Dpto. Informática. IES San Sebastián Página 47 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Funciones de cadena
Devuelve una porción de cadena,
select substr(’abcdefg’,3,4) from dual; empezando en el carácter de la posición
substr(cadena,valor1,[valor2])
cdef indicado valor1 de cadena, y con una
longitud especificada por valor2.
select ascii(’q’) from dual;
ascii(cadena) Devuelve el código ASCII de cadena.
81
Convierte caracteres de una cadena en
caracteres diferentes, según un plan de
sustitución marcado por el usuario.
Devuelve 'cad1' con los caracteres
translate (cad1, cad2, cad3)
encontrados en 'cad2' y sustituidos por los
caracteres de 'cad3'. Cualquier carácter que
no esté en la cadena 'cad2' permanece como
estaba.

TRANSLATE(cad1, cad2 , cad3). A partir de la cadena 'LOS PILARES DE LA TIERRA',


sustituye la 'A' por 'a', la 'E' por 'e', la 'I' por 'i', la 'O' por 'o', y la 'U' por 'u':
SQL> SELECT TRANSLATE('LOS PILARES DE LA TIERRA','AEIOU','aeiou') FROM DUAL;
TRANSLATE('LOSPILARESDEL
------------------------
LoS PiLaReS De La TieRRa
En este ejemplo TRANSLATE sustituye la 'L' por 'l':
SQL> SELECT TRANSLATE('LOS PILARES DE LA TIERRA','LAEIOU','l') FROM DUAL;
TRANSLATE('LOSP
---------------
lS PlRS D l TRR
Ahora la cadena "cad2" está formada por 'LAEIOU', pero en la cadena "cad3" sólo existe
'l', lo que hace que desaparezcan las vocales en la cadena resultante; ya que sólo la 'L'
se reemplaza por 'l'; el resto, 'AEIOU', se reemplaza por nada.

6.3 Funciones de fechas


Funciones de tratamiento de fechas
Función de fecha Ejemplo Descripción
select to_char(add_months(hire_date,1),
’dd-mon-yyyy’) from employees where last_name = Añade un número de meses a
Add_months (fecha, número) ’baer’; una fecha, y devuelve la fecha
resultante.
07-jul-1994
select current_date from dual; Devuelve la fecha actual del
Current_date 17-11-2002 sistema.
select extract(year from date ’1998-03-07’) from dual; Devuelve el dato especificado
Extract (dato FROM fecha) 1998 de la fecha introducida.
La función last_day devuelve el
Last_day (fecha) último día del mes de la fecha
especificada.
select months_between
Devuelve la fecha1 menos la
(to_date(’02-02-1995’,’mm-dd-yyyy’),
fecha2 en meses. Fecha1 suele
months_between (fecha1, fecha2) to_date(’01-01-1995’,’mm-dd-yyyy’) ) from dual;
ser la fecha futura. El resultado
suele ser una fracción.
1.03225806

MLLS. Dpto. Informática. IES San Sebastián Página 48 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Funciones de tratamiento de fechas


select new_time(to_date(
Devuelve la fecha que sería en
’11-10-99 01:23:45’, ’mm-dd-yy hh24:mi:ss’),
new_time (fecha_actual, la zona_futura, de acuerdo con
’ast’, ’pst’) from dual;
zona_actual, zona_futura) la fecha_actual y la zona_actual
proporcionadas.
09-nov-1999 21:23:45
select next_day(’02-feb-2001’,’tuesday’) from dual; Proporciona la siguiente fecha
next_day (fecha, ‘dia’) que cae en el día de la semana
06-feb-2001 ‘dia’ después de la fecha.
select round (to_date (’27-oct-00’),’year’) from dual;
Redondea una fecha según lo
round(fecha, ‘formato’)
especificado en ‘formato’.
01-jan-01
select to_char
(sysdate, ’mm-dd-yyyy hh24:mi:ss’) from dual; Devuelve la hora y fecha actual
SYSDATE
del sistema.
04-13-2001 09:45:51
Devuelve una cadena de
to_char (fecha, ‘formato’) caracteres con el formato
especificado.
Acepta una cadena de caracteres
to_date (cadena, ‘formato’) parecida a la cadena formato, y
devuelve un dato de tipo fecha.
Devuelve la fecha truncada
trunc(fecha, ‘formato’)
según el formato especificado.

6.4 Funciones de conversión


La mayoría de las funciones que hemos visto hasta ahora son funciones de
transformación, esto es, cambian los objetos. Hay otras funciones que cambian los
objetos de una manera especial, pues transforman un tipo de dato en otro.

Funciones de conversión elementales


Función de conversión Descripción
Convierte una _fecha_ (de tipo DATE) a tipo _VARCHAR2_ en el _formato_ especificado.
TO_CHAR El _formato_ es un cadena de caracteres que puede incluir las máscaras de formato definidas
(fecha, ‘formato’) en la Tabla de control de formato de fechas (Tabla 4.8), y donde es posible incluir literales
definidos por el usuario encerrados entre comillas dobles.
TO_CHAR Esta función convierte un 'número' (de tipo NUMBER) a tipo VARCHAR2 en el 'formato'
(numero, ‘formato’) especificado. Los formatos numéricos se muestran en la Tabla 4.9.
TO_DATE Convierte 'cad', de tipo VARCHAR2 o CHAR, a un valor de tipo DATE según el 'formato'
(cad, ‘formato’) especificado.
Convierte la 'cadena' a tipo NUMBER según el 'formato' especificado. La cadena ha de
TO_NUMBER contener números, el carácter decimal o el signo menos a la izquierda. No puede haber
(cadena [,’formato’]) espacios entre los números, ni otros caracteres.

Oracle puede almacenar datos de tipo fecha (DATE) y posee una interesante utilidad
para formatear las fechas de cualquier manera que se pueda concebir. Tiene un formato
por omisión: 'DD/MM/YYYY', pero con la función TO_CHAR es posible mostrar las fechas
de cualquier modo. Los literales de fecha deben encerrarse entre comillas simples.
Ejemplo: '18/11/2005'.

MLLS. Dpto. Informática. IES San Sebastián Página 49 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Recordemos que el tipo de datos DATE se almacena en un formato especial que incluye
Siglo/Año/Mes/Día/Hora/Minutos/Segundos.

Ejemplo: A partir de la tabla de empleados, obtén la fecha de alta (columna hire_date)


formateada, de manera que aparezca el nombre del mes con todas sus letras (month), el
número de día de mes (dd) y el año (yyyy), para aquellos empleados del departamento
80
SELECT TO_CHAR(hire_date, 'month dd, YYYY')
FROM employees
WHERE department_id=80;

MLLS. Dpto. Informática. IES San Sebastián Página 50 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Hay que hacer una observación: el nombre del mes aparece en minúscula porque en el
formato se definió month en minúscula, pero también puede aparecer en mayúscula o
con la primera letra mayúscula y las siguientes en minúsculas. Las opciones para month
son las siguientes: si el nombre de mes es Enero, Month produce Enero, month produce
enero, MONTH produce ENERO. Lo mismo ocurre con day y dy.
SELECT TO_CHAR(hire_date, 'mon ddd y yyy')
FROM employees
WHERE department_id=80;

Ahora la fecha de alta aparece con el nombre del mes con tres letras (mon), el número
de día del año (ddd), el último dígito del año (y) y los tres últimos dígitos del año (yyy).
Por defecto, el formato para la fecha viene definido por el parámetro NLS_TERRITORY,
que especifica el idioma para el formato de la fecha, los separadores de miles, el signo
decimal y el símbolo de la moneda. Este parámetro se inicializa al arrancar Oracle. Para
el idioma español, el valor de este parámetro es: NLS_TERRITORY=SPAIN.
Podemos cambiar el valor por omisión para la fecha con el parámetro
NLS_DATE_FORMAT, usando la orden ALTER SESSION. Por ejemplo, para cambiar el
formato de la fecha y que aparezca de la siguiente manera: día/nombre mes/ año
hora:minutos:segundos utilizaremos la siguiente sentencia:
ALTER SESSION SET NLS_DATE_FORMAT='DD/month/YYYY HH24:MI:SS';

SELECT SYSDATE FROM DUAL;

SYSDATE

14/november /2018 17:09:00

También podemos cambiar el lenguaje utilizado para nombrar los meses y los días con el
parámetro NLS_DATE_LANGUAGE.
ALTER SESSION SET NLS_DATE_LANGUAGE=French;

SELECT TO_CHAR(sysdate,'"Hoy es " day "," dd " de " month " de " yyyy')
"Fecha" FROM DUAL;

Para consultar los parámetros NLS de nuestra sesión podemos ejecutar la siguiente
sentencia SQL:
SELECT *
FROM NLS_SESSION_PARAMETERS;

NLS_INSTANCE_PARAMETERS muestra los parámetros NLS de la instancia.

NLS_DATABASE_PARAMETERS muestra los parámetros NLS de la base de datos. Estos


valores están almacenados en la BD.

MLLS. Dpto. Informática. IES San Sebastián Página 51 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

MLLS. Dpto. Informática. IES San Sebastián Página 52 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

MLLS. Dpto. Informática. IES San Sebastián Página 53 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Los caracteres devueltos en algunos de estos formatos se especifican inicializando una


serie de parámetros. Estos parámetros se muestran en la Tabla 4.10.

Supongamos, por ejemplo, que queremos definir como carácter de los miles el asterisco
(*) y como carácter decimal la barra (/). Hemos de usar el parámetro
NLS_NUMERIC_CHARACTERS con ALTER SESSION:
ALTER SESSION SET NLS_NUMERIC_CHARACTERS='/*';
Sesión modificada.

SELECT TO_CHAR(12345.67,'999G999D999') FROM DUAL;


-----------
12*345/670

Los valores para el carácter decimal y de los miles permanecerán hasta que el usuario
finalice la sesión o hasta que el usuario aplique de nuevo la orden ALTER SESSION para
cambiar estos caracteres.
Ejemplo: Cambia el formato de la fecha para que aparezca el año con cuatro dígitos:
ALTER SESSION SET NLS_DATE_FORMAT='DD/MM/YYYY';
Convertir una cadena a tipo DATE:
SELECT TO_DATE('01012006') FROM DUAL;
01/01/2006
Cuando en la orden TO_DATE no se indica el formato, una cadena de caracteres será
convertida a fecha sólo si está en el formato que tenga la fecha del sistema. En el
siguiente ejemplo no se convierte la cadena a tipo fecha porque no está en el formato
'DDMMYYYY' definido en la sesión para la fecha:
SELECT TO_DATE('010106') FROM DUAL;
ERROR en línea 1: ORA-01861: el literal no coincide con la cadena de formato

MLLS. Dpto. Informática. IES San Sebastián Página 54 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Lo correcto sería:
SELECT TO_DATE('01012006') FROM DUAL;

Ejemplo: Obtén el nombre del mes a partir de la cadena '01012007' (antes hay que
convertir la cadena a tipo fecha):
SELECT TO_CHAR(TO_DATE('01012007','ddmmyyyy'), 'Month') "MES" FROM DUAL;

TO_DATE y TO_CHAR son similares; la diferencia que los separa estriba en que
TO_DATE convierte una cadena de caracteres en una fecha y TO_CHAR convierte una
fecha en una cadena de caracteres. Ambas pueden utilizar las máscaras de formato de
fechas.

6.5 Otras funciones y variables de retorno


Función / Variable Ejemplo Descripción
Devuelve un tipo VARCHAR: el código
select dump(’abc’, 1016) from dual;
Dump(expresion) del tipo de dato, la longitud en bytes, y la
typ=96 len=3 characterset=we8dec: 61,62,63
representación interna de la expresión.
select greatest (’harry’, ’harriot’, ’harold’)
Devuelve la cadena con mayor valor
Greatest from dual;
alfabético.
harry
select leatest (’harry’, ’harriot’, ’harold’)
Devuelve la cadena con menor valor
Least from dual;
alfabético.
harold
Devuelve NULL si las expresiones son
Nullif(expresion1,expresion2) iguales, de lo contrario de vuelve siempre
expresión1.
Permite convertir valores nulos incluidos
en expresion1 a el valor de expresión2.
Esta función se utiliza para sustituir un
valor nulo por otro valor. Si 'valor' es
NULL, es sustituido por la 'expresión'; si
Nvl(expresion1,expresion2) select nvl(comission_pct,0) from employees;
no lo es, la función devuelve 'valor'.
NVL se puede usar con cualquier tipo de
datos: numéricos, carácter, tipo fecha,
pero 'valor' y 'expresión' deben ser del
mismo tipo.
Permite convertir valores de expr1. Si el
select nvl(comission_pct, comosion*2, 0)
Nvl2(expr1, expr2, expr3) valor de expr1 es nulo, devuelve expr3,
from employees;
si es no nulo devuelve expr2.
Devuelve un número que identifica a la
Uid select uid from dual;
sesión del usuario conectado.
Devuelve el nombre del usuario de la
User select user, uid from dual;
sesión actual.
select last_name, vsize (last_name)
Devuelve el tamaño en bytes de la
from employees
Vsize(expresión) expresión. Si la expresión es NULL
where department_id = 10;
devuelve NULL.
whalen 6

Una columna no-NULL indica que nunca puede estar vacía para ninguna fila. Si una
columna no tiene un valor en al menos una fila, entonces se dice que puede contener
NULL (valores nulos).

MLLS. Dpto. Informática. IES San Sebastián Página 55 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Nunca se debe utilizar el valor NULL para representar el 0 en un campo numérico. Si se


tienen que realizar operaciones aritméticas a una columna numérica se tiene que trabajar
con el valor 0.
Ej: 1 + null es null puede provocar sumas incorrectas si lo que se pretendía es sumar
1+0=1
Podemos usar la función NVL: NVL (expr1, expr2)
para cambiar NULL del campo expr1 por 0 (u otro valor; expr2)
Ejemplo: A partir de la tabla employees obtener el salario, la comisión y la suma de
ambos.
SELECT salary, commission_pct, salary + nvl(commission_pct,0)
FROM employees;

Todos los operadores, excepto la concatenación, con un operando NULL, dan como
resultado NULL.

MLLS. Dpto. Informática. IES San Sebastián Página 56 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023
rollback; --> para desacher todo lo k hsa hecho si no te gusta dede k
iniciate sesion
7 DML (continuación)
commit; --> para gurfdar IMPORTANTEEEE para validar
Hasta ahora nos hemos dedicado a consultar datos de la base de datos mediante la
sentencia SELECT. Hemos trabajado y seleccionado datos de tablas. Ha llegado el
momento de cambiar los datos de las tablas de la base de datos; para ello utilizaremos
las sentencias INSERT, UPDATE y DELETE.
Nota importante: Cuando modificamos el contenido de una tabla, los datos resultantes
deben seguir cumpliendo las restricciones definidas y activas sobre esa tabla. Es posible
que usando las sentencias INSERT, UPDATE y DELETE se nos de la circunstancia de
que no cumplamos una restricción de unicidad, o de clave ajena, o de valor no nulo, etc.
Esto no es un problema de la sentencia en sí; el problema radica en que estamos
intentando ir en contra de las reglas que nosotros mismos hemos definido para esa tabla
y Oracle diligentemente no nos lo permite.

7.1 Sentencia INSERT


Con ella se añaden filas de datos en una tabla. El formato de esta orden es el siguiente:
INSERT INTO NombreTabla [(columna [, columna] ...)]
VALUES (valor [, valor] ...);

NombreTabla es la tabla en la que se van a insertar las filas.


[(columna [, columna] ...)] representa la columna o columnas donde se van a introducir
valores. Si las columnas no se especifican en la cláusula INSERT, se consideran, por
defecto, todas las columnas de la tabla.
(valor [, valor] ...) representa los valores que se van a dar a las columnas. Éstos se
deben corresponder con cada una de las columnas que aparecen; además, deben
coincidir con el tipo de dato definido para cada columna. Cualquier columna que no se
encuentre en la lista de columnas recibirá el valor NULL, siempre y cuando no esté
definida como NOT NULL, en cuyo caso INSERT fallará. Si no se da la lista de columnas,
se han de introducir valores en todas las columnas.
Ejemplo: Vamos a insertar un nuevo pais en nuestra base de datos: Spain, con id ES e
id de region 1.
INSERT INTO countries (country_id, country_name, region_id)
VALUES ('ES', 'Spain', 1);

Al ejecutar la sentencia, Oracle emite un mensaje (1 fila creada.) con el que indica que la
fila se ha insertado correctamente.
Observamos en esta sentencia que:
• Las columnas a las que damos valores se identifican por su nombre.
• La asociación columna-valor es posicional.
• Los valores que se dan a las columnas deben coincidir con el tipo de dato definido en la
columna.
• Los valores constantes de tipo carácter han de ir encerrados entre comillas simples (' ')
(los de tipo fecha, también).

MLLS. Dpto. Informática. IES San Sebastián Página 57 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Esta sentencia sería equivalente a la anterior:


INSERT INTO countries
VALUES ('ES', 'Spain', 1);

Ahora no especificamos los nombres de las columnas por lo que los valores tendremos
que darlos todos y en el orden en el que se han definido en la tabla countries.
Especificando el nombre de las columnas puedo especificar, si quiero, los valores en un
orden diferente al de la creación de la tabla:
INSERT INTO countries (region_id, country_name, country_id)
VALUES (1, 'Spain', 'ES');

Cuando programamos una aplicación esta sería la práctica más recomendable ya que
garantizamos que nuestra sentencia INSERT no dependa del orden de columnas original
de la tabla countries. Este orden podría cambiar si el administrador de la base de datos
modificara la sentencia CREATE de countries o cambiara su diseño introduciendo o
eliminando alguna columna de la tabla.
Como en la tabla countries los campos region_id y country_name pueden tomar valores
nulos sería posible insertar filas en la misma de las siguientes formas:
INSERT INTO countries
VALUES ('XX', 'Xxxx', NULL);

INSERT INTO countries (country_id, country_name)


VALUES ('YY', 'Yyyy');

INSERT INTO countries (country_id)


VALUES ('ZZ');

En las dos últimas sentencias los campos no especificados toman el valor nulo de forma
automática.

7.1.1 Inserción con SELECT


Hasta el momento sólo hemos insertado una fila, pero si añadimos a INSERT una
consulta, es decir, una sentencia SELECT, se añaden tantas filas como devuelva la
consulta.
El formato de INSERT con SELECT es el siguiente:
INSERT INTO NombreTabla1 [(columna [, columna] ...)]
SELECT {columna [, columna] ... | *}
FROM NombreTabla2 [CLÁUSULAS DE SELECT];

No es necesario especificar las columnas siempre y cuando queramos dar valores a


todas ellas. El número y tipo de las columnas devueltas por la consulta debe coincidir con
las columnas que especificamos en el INSERT INTO.

MLLS. Dpto. Informática. IES San Sebastián Página 58 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Ejemplo: Vamos a crear en la tabla job_history las filas necesarias para que todos los
empleados del departamento 30 figuren como que ya estuvieron contratados en su
mismo puesto actual desde el día 1 de enero del 2000 hasta el día 10 de diciembre del
2001.
INSERT INTO job_history (employee_id, start_date, end_date, job_id,
department_id)
SELECT employee_id, TO_DATE('01/01/2000','dd/mm/yyyy'),
TO_DATE('10/12/2001','dd/mm/yyyy'),job_id,department_id
FROM employees
WHERE department_id=30;
Ejemplo: Insertar un empleado llamado Ana Quiroga, con id de empleado 1112 y
[email protected] de correo en la tabla empleados. Los restantes datos del nuevo empleado
serán los mismos que los de James Marlow y la fecha de alta será la fecha actual.
INSERT INTO employees
SELECT 1112, 'Ana', 'Quiroga', '[email protected]', phone_number, SYSDATE,
job_id, salary, commission_pct, manager_id, department_id
FROM employees
WHERE first_name='James' AND last_name='Marlow';

Ejemplo: Insertar un empleado de apellido 'Garcia' , con id de empleado 1111, en la


tabla empleados, en el departamento con mayor número de empleados. La fecha de alta
será la actual; inventamos el resto de los valores.
INSERT INTO employees
SELECT DISTINCT 1111, 'Juan', 'Garcia', '[email protected]', 666557566, SYSDATE,
'PU_CLERK', 2000, 0.25, 120, department_id
FROM employees
WHERE department_id IN (SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT(employee_id)=
(SELECT MAX(COUNT(employee_id))
FROM employees
GROUP BY department_id));

Al hacer la inserción sólo desconocemos el valor de la columna department_id, que es el


que devuelve la SELECT; el resto de valores los conocemos y, por tanto, los ponemos
directamente en la sentencia SELECT. La cláusula DISTINCT es necesaria, ya que sin
ella se insertarían tantas filas como empleados haya en el departamento con mayor
número de empleados. Si ejecutamos la sentencia sin DISTINCT intentaría insertar más
de una fila (aunque no se podría por incumplirse algunas restricciones en la tabla).
Otra forma:
INSERT INTO employees
SELECT 1111, 'Juan', 'Garcia', '[email protected]', 666557566, SYSDATE,
'PU_CLERK', 2000, 0.25, 120, department_id
FROM employees
GROUP BY department_id
HAVING COUNT(employee_id)= (SELECT MAX(COUNT(employee_id))
FROM employees
GROUP BY department_id));

MLLS. Dpto. Informática. IES San Sebastián Página 59 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

7.2 Sentencia UPDATE


Para actualizar los valores de las columnas de una o varias filas de una tabla utilizamos
la orden UPDATE, cuyo formato es el siguiente:
UPDATE NombreTabla
SET columna1=valor1, ..., columnan=valorn
WHERE condición;

• NombreTabla es la tabla cuyas columnas se van a actualizar.


• SET indica las columnas que se van a actualizar y sus valores.
• WHERE selecciona las filas que se van a actualizar. Si se omite, la actualización
afectará a todas las filas de la tabla.
Ejemplo: Aumenta en 100 el salario y en 0.05 la comisión a todos los empleados del
departamento 10, de la tabla empleados.
UPDATE employees
SET salary = salary + 100, commission_pct = nvl(commission_pct,0) + 0.05
WHERE department_id=10;

7.2.1 UPDATE con SELECT


Podemos incluir una subconsulta en una sentencia UPDATE que puede estar contenida
en la cláusula WHERE o puede formar parte de SET. Cuando la subconsulta (orden
SELECT) forma parte de SET, debe seleccionar una única fila y el mismo número de
columnas (con tipos de datos adecuados) que las que hay entre paréntesis al lado de
SET. Los formatos son:
UPDATE NombreTabla
SET columna1 = valor1, columna2 = valor2, ...
WHERE columna3 = (SELECT ...);

UPDATE NombreTabla
SET (columna1, columna2, ...) = (SELECT col1, col2, ...)
WHERE condición;

UPDATE NombreTabla
SET columna1 = (SELECT col1 ...), columna2 = (SELECT col2 ...)
WHERE condición;

Ejemplo: Asigna el salario y comisión del empleado Julia Nayer a los empleados del
departamento 30.
UPDATE employees SET (salary, commission_pct) = (SELECT salary, commission_pct
FROM employees WHERE first_name='Julia' AND last_name='Nayer')
WHERE department_id=30;

Ejemplo: Divide el salario a la mitad y pon la comisión a 0 para aquellos empleados que
pertenecen al departamento que tiene más empleados.
UPDATE employees SET salary = salary/2, commission_pct = 0
WHERE department_id =

MLLS. Dpto. Informática. IES San Sebastián Página 60 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

(SELECT department_id FROM employees GROUP BY department_id HAVING COUNT(*) =


(SELECT MAX(COUNT(*)) FROM employees GROUP BY department_id));

Ejemplo: Para los empleados del departamento de Sales ponemos su apellido a


minúsculas y cambiamos su salario al doble del empleado que menos cobra de la
empresa y.
UPDATE employees SET last_name = lower(last_name),
salary = 2 * (SELECT min(salary) FROM employees)
WHERE department_id = (SELECT department_id FROM departments
WHERE department_name = 'Sales')

7.3 Sentencia DELETE


Para eliminar una fila o varias filas de una tabla se usa la orden DELETE. La cláusula
WHERE es esencial para eliminar sólo aquellas filas deseadas. Sin la cláusula WHERE,
DELETE borrará todas las filas de la tabla. Éste es su formato:
DELETE [FROM] NombreTabla WHERE Condición;

Ejemplos:
Borramos todos los departamentos con id superior a 210
DELETE FROM departments WHERE department_id > 210;

Borramos todas las filas de la tabla job_history:


DELETE FROM job_history;

o
DELETE job_history;

Borramos todos los departamentos para los que no existen empleados.


DELETE FROM departments WHERE department_id NOT IN
(SELECT DISTINCT department_id
FROM employees
WHERE department_id IS NOT NULL);

En este caso si no usamos NOT NULL el operador NOT IN no funciona correctamente.

8 ROLLBACK, COMMIT y AUTOCOMMIT


Supongamos que queremos borrar una fila de una tabla pero, al teclear la orden SQL, se
nos olvida la cláusula WHERE y… ¡horror!, ¡borramos todas las filas de la tabla! Esto no
es problema, pues Oracle permite dar marcha atrás a un trabajo realizado mediante la
orden ROLLBACK, siempre y cuando no hayamos validado los cambios en la base de
datos mediante la orden COMMIT.

MLLS. Dpto. Informática. IES San Sebastián Página 61 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

Cuando hacemos transacciones sobre la base de datos, es decir, cuando insertamos,


actualizamos y eliminamos datos en las tablas, los cambios no se aplicarán a la base de
datos hasta que no hagamos un COMMIT. Esto significa que, si durante el tiempo que
hemos estado realizando transacciones, no hemos hecho ningún COMMIT y de pronto
se va la luz, todo el trabajo se habrá perdido, y nuestras tablas estarán en la situación de
partida.
Una transacción es una secuencia de una o más sentencias SQL que juntas forman una
unidad de trabajo.
Para validar los cambios que se hagan en la base de datos tenemos que ejecutar la
orden COMMIT:
SQL> COMMIT;
Validación terminada.

SQL*Plus e iSQL*Plus permiten validar automáticamente las transacciones sin tener que
indicarlo de forma explícita. Para eso sirve el parámetro AUTOCOMMIT. El valor de este
parámetro se puede mostrar con la orden SHOW, de la siguiente manera:
SQL> SHOW AUTOCOMMIT;
autocommit OFF

OFF es el valor por omisión, de manera que las transacciones (INSERT, UPDATE y
DELETE) no son definitivas hasta que no hagamos COMMIT. Si queremos que INSERT,
UPDATE y DELETE tengan un carácter definitivo sin necesidad de realizar la validación
COMMIT, hemos de activar el parámetro AUTOCOMMIT con la orden SET:
SQL> SET AUTOCOMMIT ON;
SQL> SHOW AUTOCOMMIT;
autocommit IMMEDIATE

Ahora, cualquier INSERT, UPDATE y DELETE se validará automáticamente.


La orden ROLLBACK aborta la transacción volviendo a la situación de las tablas de la
base de datos desde el último COMMIT:
SQL> ROLLBACK;
Rollback terminado.

COMMIT implícito
Hay varias órdenes SQL que fuerzan a que se ejecute un COMMIT sin necesidad de
indicarlo:

Usar cualquiera de estas órdenes es como usar COMMIT.

MLLS. Dpto. Informática. IES San Sebastián Página 62 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

ROLLBACK automático
Si, después de haber realizado cambios en nuestras tablas, se produce un fallo del
sistema (por ejemplo, se va la luz) y no hemos validado el trabajo, Oracle hace un
ROLLBACK automático sobre cualquier trabajo no validado. Esto significa que tendremos
que repetir el trabajo cuando pongamos en marcha la base de datos.

MLLS. Dpto. Informática. IES San Sebastián Página 63 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

9 ANEXO:
Soluciones actividades:
Actividades propuestas 2
1. Obtener el nombre, apellido, correo, id de trabajo y descripción del trabajo para todos
los empleados que trabajan en el departamento de código 80.
SELECT first_name, last_name, email, job_id, job_title
FROM employees e
JOIN jobs j USING(job_id)
WHERE department_id=80;
2. ¿Cuál es el empleado que dirige el departamento 100? Mostrar todos sus datos.
select e.*
SELECT e.* from employees e
FROM employees e, departments d join departments d on (e.employee_id =
WHERE e.employee_id = d.manager_id AND d.department_id=100; d.manager_id)
where d.department_id = 100;

3. Obtener los departamentos que están localizados en la ciudad de Seatle.


4. Obtener un listado con todos los departamentos que no tengan ningún empleado.
Debéis utilizar JOIN USING.
5. Obtener un listado con el historial de trabajos de nuestra empresa mostrando también
el nombre de departamento, la descripcion del trabajo y el nombre y apellido del
empleado.
6. Obtener el nombre, apellido, id de trabajo para los empleados que han sido alguna vez
ST_CLERK.
7. Obtener un listado con los países donde no exista ninguna localización. Debéis utilizar
JOIN ON.
8. Obtener las localizaciones de United Kingdom con el campo provincia a nulo. Debéis
mostrar el nombre de región, nombre de país y todos los campos de la localización.
9. Obtener un listado de todos los trabajos que no aparecen en la tabla job_history.
Debéis utilizar la sintaxis SQL92.,
10. Obtener un listado con todos los nombres y apellidos de los empleados que son jefes
de algún empleado.
11. Obtener la información de los empleados que no tengan jefe.
12. Obtener un listado con todos los empleados que tengan el salario fuera de los límites
mínimo y máximo que marca su tipo de trabajo.
13. Obtener un listado con todos los empleados contratados antes del 2005 y que sean
Shipping Clerk.
14. Obtener un listado con el nombre y apellido del empleado, el nombre del departamento
y su comisión para todos aquellos empleados con la comisión inferior a 0,1.

Actividades propuestas 3
1. Obtener el salario máximo para el departamento 80.
SELECT max(salary)
FROM EMPLOYEES

MLLS. Dpto. Informática. IES San Sebastián Página 64 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

WHERE department_id=80;
2. Mostrar el salario máximo que puede llegar a ganarse en la empresa.
SELECT max(max_salary)
FROM JOBS;
3. Obtener los nombres de departamentos que tengan más de 4 personas trabajando.
SELECT department_id, department_name
FROM departments d
JOIN employees e USING (department_id)
GROUP BY department_id, department_name
HAVING count(e.employee_id)>4;
4. Obtener el número de localizaciones que existen en cada país.
(l.country_id), c.county_name
SELECT l.country_id, count(location_id)
FROM locations l locations l
riggth join countries c on (l.country_id=c.country_id)
GROUP BY l.country_id;
c.countr_id,
5. Obtener elc.countrty_name;
número de localizaciones que existe en cada país pero mostrando también
los países con 0 localizaciones.
SELECT c.country_id, c.country_name, COUNT(l.location_id)
FROM countries c
LEFT OUTER JOIN locations l ON(l.country_id=c.country_id)
GROUP BY c.country_id, c.country_name;
6. Obtener un listado con el id de empleado que es jefe y con el número de empleados
que dirige.
SELECT count(e1.employee_id), e1.manager_id
FROM employees e1
group by e1.manager_id;
7. Obtener un listado con los nombres y apellidos de los empleados que son jefes de otros
empleados y con el número de empleados que dirige. select jefe.employee_id,
SELECT count(e1.employee_id), e1.manager_id, e2.first_name, e2.last_name
jefe.first_name,
FROM employees e1, employees e2 count(employee_id),
jefe.last_name
WHERE e1.manager_id = e2.employee_id (+)
GROUP BY e1.manager_id, e2.first_name, e2.last_name; from employees jefe
join employees e
on(jefe.employee_id=e.mana
Otra forma de ejecución más rápida ger_id)
group by jefe.employee_id,
jefe.first_name,
SELECT count(e1.employee_id), e1.manager_id, (select first_name || jefe.last_name;
' ' ||
last_name from employees e2 where e2.employee_id=e1.manager_id) Nombre
FROM employees e1
group by e1.manager_id;
8. Por cada tipo de trabajo mostrar su id, descripción, número de empleados que realizan
ese trabajo y cuál es el salario máximo de empleado de entre todos los que
SELECT j.job_id,
desempeñan ese trabajo. j.job_title,
count(e.employee_id),
SELECT j.job_id, j.job_title, count(e.employee_id), max(e.salary) max(e.salary)
FROM JOBS J
FROM jobs j, employees e LEFT JOIN EMPLOYEES E ON
WHERE j.job_id = e.job_id (+) (J.JOB_ID=E.JOB_ID)
GROUP BY J.JOB_ID,
GROUP BY j.job_id, j.job_title,j.max_salary; J.JOB_TITTLE

9. Mostrar los departamentos para los que existe algún trabajador que gane igual o más
de salario máximo que establece su tipo de trabajo.
SELECT DISTINCT e.department_id

MLLS. Dpto. Informática. IES San Sebastián Página 65 de 67


U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

FROM jobs j, employees e join jobs j


on (j.job_id=e.job_id)
WHERE j.job_id = e.job_id AND
wherej.max_salary
salaty >= max_salary =< e.salary

10. Mostrar el id de país y el nombre de aquellos países que tengan localizados más de un
departamento.
select c.country_id, country_name, count (location_id)
SELECT country_id, count(d.department_id) from location l
join countries c on (c.country_id = l.country_id)
FROM departments d group by c.country_id, country_name
having count (location_id)>1;
JOIN locations l USING (location_id)
JOIN countries c USING (country_id)
GROUP BY country_id
HAVING count(d.department_id)>1

Actividades propuestas 4
1. Muestra los datos (nombre, apellido, id oficio, salario y fecha de alta) de aquellos
empleados que desempeñen el mismo oficio que Renske Ladwig o que tengan un
salario mayor o igual que Janette King.
SELECT first_name, last_name, job_id, salary, hire_date
FROM employees
WHERE job_id = (SELECT job_id
FROM employees WHERE first_name = 'Renske' and last_name='Ladwig')
OR salary >= (SELECT salary
FROM employees WHERE first_name = 'Janette' and last_name='King');
2. Mostrar los datos del empleado jefe del departamento Administration.
SELECT *
FROM employees
WHERE employee_id = (SELECT manager_id
FROM departments WHERE department_name ='Administration') ;
3. Obtener la lista de todos los departamentos cuyo salario medio sea superior a la media
del salario medio de los departamentos. SELECT department_id
FROM employees
SELECT department_id, avg(salary) GROUP BY department_id
FROM employees HAVING avg(salary)>(SELECT
GROUP BY department_id avg(avg(salary)
FROM employees
HAVING avg(salary)>(SELECT avg(avg(salary))FROM employees GROUP
e BY
department_id); GROUP BY department_id);

4. Obtener aquellos nombres y apellidos de empleados cuyo oficio sea alguno de los
oficios que hay en el departamento 50. SELECT first_name, last_name,
deptrme_id. job_id
SELECT first_name||' '||last_name FROM employees
FROM employees WHERE job_id IN (SELECT job_id
WHERE job_id IN (SELECT job_id FROM employees WHERE
department_id=50);
FROM employees WHERE department_id=50);
5. Obtener los datos de los empleados cuyo salario sea menor a cualquier salario de los
empleados del departamento 80.
SELECT *
FROM employees
WHERE salary <ALL (SELECT salary
FROM employees WHERE department_id=80);
6. Obtener los datos de los empleados que trabajan en Toronto, Tokyo o Roma.
select *
from employees e
join departments d on (d.department_id= e.departmen_id)
MLLS. Dpto. Informática. IES San Sebastián Página 66 de 67
join locations l on (l.location_id = d.location_id)
where city in ('Toronto', 'Tokyo', 'Roma');
U.D. 4 Manipulación de datos en SQL 1º ASIR-GBD. 2022-2023

7. Consulta los nombres, apellidos y oficios de todos los empleados del departamento 80
cuyo trabajo sea idéntico al de cualquiera de los empleados del departamento de IT.
8. Obtén el nombre y apellido de los empleados con el mismo oficio y salario que Patrick
Sully.
SELECT first_name, last_name
FROM employees
WHERE (job_id, salary) =
(SELECT job_id, salary FROM employees WHERE first_name ='Patrick' AND
last_name='Sully');

O también:

SELECT first_name, last_name


FROM employees
WHERE job_id = (SELECT job_id FROM employees WHERE first_name ='Patrick' AND
last_name='Sully')
AND salary = (SELECT salary FROM employees WHERE first_name ='Patrick' AND
last_name='Sully');
9. Muestra en pantalla el nombre, apellido, oficio y salario de los empleados del
departamento de Alana Walsh que tengan su mismo salario.
10. Obtén los datos de los departamentos que no tengan empleados.
11. Obtén los datos de los departamentos que tengan empleados.
12. Obtén todos los datos de los departamentos con empleados excepto aquellos
departamentos que estén localizados en la región 3.

MLLS. Dpto. Informática. IES San Sebastián Página 67 de 67

También podría gustarte