Está en la página 1de 32

Módulo 1

Manipulación de
Datos en la Base
de Datos.
1.1- Sentencia SELECT
El sub lenguaje DML (data manipulation languaje) define las sentencias de
manipulación de datos SELECT, INSERT, UPDATE y DELETE, que permiten
seleccionar, insertar, modificar y eliminar datos de tablas que están dentro
de una base de datos, datos restringidos por la cláusula WHERE en caso
que sea utilizada.

En éste caso, la sentencia SELECT permite obtener datos que se encuentran


guardados o almacenados en columnas de una o varias filas dentro de una
tabla de una base de datos.

A esta sentencia, también se la denomina consulta, dado que es lo que


realiza el motor cuando recibe este tipo de peticiones, consultar los valores
guardados en una o varias tablas invocadas a través de la cláusula FROM
obligatoria para ésta sentencia.

Esta sentencia se compone de varias cláusulas detalladas a continuación:

SELECT <lista de columnas, valores constantes, funciones, subconsultas,


etc…>

FROM <lista de tablas, vistas, subconsultas>

WHERE <condicion> [AND, OR, NOT] <condicion>

GROUP BY <lista de columnas>

HAVING <condicion> [AND, OR, NOT] <condicion>

ORDER BY <lista de columnas, numero de orden o alias de la columna>


[DESC, ASC]

Las cláusulas obligatorias sólo son SELECT y FROM.

En la cláusula SELECT, se pueden combinar campos de una o varias tablas


(según lo mencionado en la cláusula FROM), campos de una o varias vistas
(también depende de lo mencionado en la cláusula FROM), resultados de
sub consultas, funciones numéricas, de carácter o fechas y funciones
propias.

También se pueden agregar valores constantes o literales que se mostrarán


así por cada fila seleccionada.

Como por ejemplo:

1
Dada la tabla EMPLEADOS con los campos:
EMPLEADOS
ID: clave primaria.
PK ID
APELLIDOS: apellido/s del empleado.
APELLIDOS NOMBRES: nombre/s del empleado.
NOMBRES
SALARIO SALARIO: salario mensual del empleado.

La consulta siguiente:

select apellidos||’, ’||nombres as EMPLEADO,

‘con salario de:’ as CONSTANTE_1,

salario as SALARIO,

‘con un 20% resulta:’ as CONSTANTE_2,

salario*1,2 as AUMENTO

from empleados

devuelve los apellidos y nombres concatenados en una sola columna, como


si fuesen un solo campo de la tabla, un valor constante, el salario que es un
valor que variará, otro valor constante y por último el salario
incrementado:

EMPLEADO CONSTANTE_1 SALARIO CONSTANTE_2 AUMENTO

GOMEZ, EDUARDO con salario de: 100 con un 20% resulta: 120

RODRIGUEZ, SEBASTIAN con salario de: 123 con un 20% resulta: 147,6

FERNANDEZ, PABLO con salario de: 345 con un 20% resulta: 414

En todos los casos de las columnas mencionadas en el SELECT se utilizan


alias de campos para dar un título significativo a las columnas resultantes.

En el caso anterior, se utilizó como una función de fila simple el operador *


(que significa multiplicación), operador que en otro contexto puede
significar la obtención de todos los campos de cada fila obtenida en el
SELECT.

Las funciones de filas simples, retornan un solo valor por cada fila de una
tabla o vista consultada.

2
Estas funciones pueden ser utilizadas en la sentencia SELECT dentro de la
propia sentencia o en las cláusulas WHERE o HAVING.

Los operadores aritméticos permiten realizar cálculos con valores


numéricos.

Son: multiplicación (*), división (/), suma (+) y resta (-).

Es posible obtener salidas en las cuales una columna sea el resultado de un


cálculo y no un campo de una tabla.

Es posible obtener salidas en las cuales una columna sea el resultado de un


cálculo y no un campo de una tabla.

- Si queremos ver los apellidos, nombres y salario cantidad de cada


empleado escribimos la siguiente sentencia:

select apellidos,
nombres,
salario
from empleados;

- Si queremos saber el sueldo precio de cada empelado con un 10% de


aumento incluimos en la sentencia los siguientes cálculos:

select apellidos,
nombres,
salario * 1.1
from empleados;

- También podemos actualizar los datos empleando operadores


aritméticos:

update empleados set salario = salario* 1.1;

- Para concatenar cadenas de caracteres existe el operador de


concatenación ||. Para concatenar el apellido y el nombre de cada
empelado usamos el operador de concatenación ("||"):

select apellidos || ' - ' || nombres from empleados;

Note que concatenamos además un guión para separar los campos.

1.1.1- Cláusula From.

3
La cláusula FROM es utilizada dentro de la sentencia SELECT para enumerar
los orígenes desde donde se traerán los datos mostrados en la propia
sentencia SELECT.

Estos datos de origen pueden ser:


- Tablas.
- Vistas.
- Subconsultas.

Cuando existe más de una tabla en la cláusula FROM, se considera a la


consulta como multitabla. De esta forma, estamos en presencia de la
operación unión del álgebra relacional, conocida y enunciada en la cláusula
con el nombre JOIN.

En el caso que se mencionen más de una tabla y no se especifiquen los


JOIN en la cláusula FROM o luego en la sentencia SELECT, el motor de la
base de datos, a través del optimizador de consultas realizará el producto
cartesiano que combinará todas las filas de todas las tablas mencionadas,
lo que hará incurrir en falsos resultados.

Supongamos que el campeonato de futbol argentino está compuesto por


veintidós equipos que deberán, como posible, enfrentarse al menos una
vez entre sí (imposible sería un equipo jugase contra sí mismo), podríamos
armar una tabla relacionada consigo misma para armar los
enfrentamientos:

4
CLUBES Dada la tabla CLUBES con los campos.
PK ID ID: clave primaria.
NOMBRE NOMBRE: nombre del club.

con la siguiente información dentro:

1- Aldosivi de Mar del Plata


2- Almirante Brown
3- Atlético Tucumán
4- Banfield
5- Boca Unidos de Corrientes
6- Brown de Adrogué
7- Crucero del Norte
8- Defensa y Justicia
9- Douglas Haig de Pergamino
10- Ferro Carril Oeste
11- Gimnasia de Jujuy
12- Huracán
13- Independiente de Avellaneda
14- Independiente Rivadavia de Mendoza
15- Instituto de Córdoba
16- Patronato de Paraná
17- San Martin de San Juan
18- Sarmiento de Junín
19- Sportivo Belgrano de San Francisco
20- Talleres de Córdoba
21- Unión de Santa Fe
22- Villa SanelCarlos
armamos SELECT de la siguiente forma:

select l.nombre as Local,


‘ juega con ‘,
v.nombre Visita
from clubes l,clubes v

el producto cartesiano mostrará que cada club juega con el resto e incluso
consigo mismo, lo cual resultaría imposible:

5
Aldosivi de Mar del Plata Aldosivi de Mar del Plata
Aldosivi de Mar del Plata Almirante Brown
Aldosivi de Mar del Plata Atlético Tucumán
Aldosivi de Mar del Plata Banfield
Aldosivi de Mar del Plata Boca Unidos de Corrientes
Aldosivi de Mar del Plata Brown de Adrogué
Aldosivi de Mar del Plata Crucero del Norte
Aldosivi de Mar del Plata Defensa y Justicia
Aldosivi de Mar del Plata Douglas Haig de Pergamino
Aldosivi de Mar del Plata Ferro Carril Oeste
Aldosivi de Mar del Plata Gimnasia de Jujuy
Aldosivi de Mar del Plata Huracán
Aldosivi de Mar del Plata Independiente de Avellaneda
Aldosivi de Mar del Plata Independiente Rivadavia de Mendoza
Aldosivi de Mar del Plata Instituto de Córdoba
Aldosivi de Mar del Plata Patronato de Paraná
Aldosivi de Mar del Plata San Martin de San Juan
Aldosivi de Mar del Plata Sarmiento de Junín
Aldosivi de Mar del Plata Sportivo Belgrano de San Francisco
Aldosivi de Mar del Plata Talleres de Córdoba
Aldosivi de Mar del Plata Unión de Santa Fe
Aldosivi de Mar del Plata Villa San Carlos
Almirante Brown Aldosivi de Mar del Plata
Almirante Brown Almirante Brown
Almirante Brown Atlético Tucumán
Almirante Brown Banfield
Almirante Brown Boca Unidos de Corrientes
Almirante Brown Brown de Adrogué
Almirante Brown Crucero del Norte
Almirante Brown Defensa y Justicia
Almirante Brown Douglas Haig de Pergamino
Almirante Brown Ferro Carril Oeste
Almirante Brown Gimnasia de Jujuy
Almirante Brown Huracán
Almirante Brown Independiente de Avellaneda
Almirante Brown Independiente Rivadavia de Mendoza
Almirante Brown Instituto de Córdoba
Almirante Brown Patronato de Paraná
Almirante Brown San Martin de San Juan
Almirante Brown Sarmiento de Junin
Almirante Brown Sportivo Belgrano de San Francisco
Almirante Brown Talleres de Córdoba
Almirante Brown Unión de Santa Fe
Almirante Brown Villa San Carlos

6
si modificamos el SELECT colocando la condición en el WHERE (veremos
más adelante su utilización) evitamos que se muestre información
imposible (marcada en rojo anteriormente):

Aldosivi de Mar del Plata Almirante Brown


Aldosivi de Mar del Plata Atlético Tucumán
Aldosivi de Mar del Plata Banfield
Aldosivi de Mar del Plata Boca Unidos de Corrientes
Aldosivi de Mar del Plata Brown de Adrogué
Aldosivi de Mar del Plata Crucero del Norte
Aldosivi de Mar del Plata Defensa y Justicia
Aldosivi de Mar del Plata Douglas Haig de Pergamino
Aldosivi de Mar del Plata Ferro Carril Oeste
Aldosivi de Mar del Plata Gimnasia de Jujuy
Aldosivi de Mar del Plata Huracán
Aldosivi de Mar del Plata Independiente de Avellaneda
Aldosivi de Mar del Plata Independiente Rivadavia de Mendoza
Aldosivi de Mar del Plata Instituto de Córdoba
Aldosivi de Mar del Plata Patronato de Paraná
Aldosivi de Mar del Plata San Martin de San Juan
Aldosivi de Mar del Plata Sarmiento de Junín
Aldosivi de Mar del Plata Sportivo Belgrano de San Francisco
Aldosivi de Mar del Plata Talleres de Córdoba
Aldosivi de Mar del Plata Unión de Santa Fe
Aldosivi de Mar del Plata Villa San Carlos
Almirante Brown Aldosivi de Mar del Plata
Almirante Brown Atlético Tucumán
Almirante Brown Banfield
Almirante Brown Boca Unidos de Corrientes
Almirante Brown Brown de Adrogué
Almirante Brown Crucero del Norte
Almirante Brown Defensa y Justicia
Almirante Brown Douglas Haig de Pergamino
Almirante Brown Ferro Carril Oeste
Almirante Brown Gimnasia de Jujuy
Almirante Brown Huracán
Almirante Brown Independiente de Avellaneda
Almirante Brown Independiente Rivadavia de Mendoza
Almirante Brown Instituto de Córdoba
Almirante Brown Patronato de Paraná
Almirante Brown San Martin de San Juan
Almirante Brown Sarmiento de Junin
Almirante Brown Sportivo Belgrano de San Francisco
Almirante Brown Talleres de Córdoba
Almirante Brown Unión de Santa Fe
Almirante Brown Villa San Carlos

7
La consulta debe quedar así:

select l.nombre as Local,


‘ juega con ‘,
v.nombre Visita
from clubes l, clubes v
where l.nombre <> v.nombre

Es importante destacar que se han usado alias de tablas para identificar las
columnas ‘nombre’, que como vienen de la misma tabla, pero repetida en
el FROM, se las ha calificado con la letra que se escribe, en esta cláusula, a
continuación de la tabla. Esta forma de nombrar las columnas de una tabla,
en una posición determinada, se denomina alias de tabla y, como
recomendación, se usó la letra inicial del rol o del significado que tiene
cada repetición de la tabla SELECT, para este caso, se adoptó la ‘l’ para local
y la ‘v’ para visitante.

En este caso puntual, se utilizó en WHERE para filtrar información


imposible, pero en un principio en el WHERE también se incluían las
relaciones entre cada una de las tablas relacionadas.

ALUMNOS ALUMNOS_X_CARRERAS CARRERAS

PK ID PK ID PK ID

APELLIDOS ID_ALU NOMBRES


NOMBRES ID_CAR
DNI FECHA_INSCRIPCION
MAIL_1
MAIL_2

Dada la tabla ALUMNOS con los campos:


ID: clave primaria.
APELLIDOS: apellidos del alumno.
NOMBRES: nombres del alumno.
DNI: número de DNI del alumno.
MAIL_1: mail del alumno.
MAIL_2: mail del alumno.

Dada la tabla CARRERAS con los campos:


ID: clave primaria.
NOMBRES: nombre de la carrera.

Dada la tabla ALUMNOS_X_CARRERAS con los campos:


ID: clave primaria.
ID_ALU: clave primaria del alumno en la tabla ALUMNOS.
ID_CAR: clave primaria de la carrera en la tabla CARRERAS.
FECHA_INSCRIPCIÓN: fecha y hora en que el alumno se inscribió a la
carrera.
8
como se comenta en el párrafo anterior, se puede usar el WHERE y AND
para relacionar las tablas:

select a.apellidos||’, ‘||a.nombres as ALUMNO,


c.nombre as CARRERA
from alumnos a,
alumnos_x_carreras ac,
carreras c
where a.id = ac.id_alu -- unión entre tablas.
and ac.id_car = c.id -- unión entre tablas.
and a.dni = 23925838 -- restricción.

pero de mejor forma se pueden hacer las relaciones en el FROM a través


de la cláusula JOIN y dejar el WHERE solo para las restricciones:

select a.apellidos||’, ‘||a.nombres as ALUMNO,


c.nombre as CARRERA
from alumnos a
join alumnos_x_carreras ac on a.id = ac.id_alu
join carreras c on ac.id_car = c.id
where a.dni = 23925838 -- restricción.

1.1.2- Cláusula Where.


La cláusula WHERE es utilizada dentro de la sentencia SELECT para
restringir las filas o datos a mostrar.
Posee como elementos una columna, un operador de comparación y un
valor constante, puede tener otra columna, una variable o una sub
consulta que devuelva uno o varios valores.

Ejemplos de condiciones: ‘una fila es elegida si…’

WHERE nota > 8


… es verdad que la nota de la fila es mayor a 8.

WHERE nombre = ‘BOCA JUNIORS’


… es verdad que el nombre de la fila es ‘BOCA JUNIORS’ (en mayúsculas).

WHERE fecha_inscripcion < ‘01/03/1998’


… es verdad que la fecha de inscripción es anterior al primero de marzo de
1998.

WHERE NOT nota > 8


… no es verdad que la nota de la fila es mayor a 8.

9
También se pueden combinar las condiciones, lo que permite que se las
evalúe, simultáneamente, con los coordinadores AND y OR.

De esta manera se obtendrá que: ‘una fila es elegida si…’

WHERE (nota > 8) AND (apellido < ‘DOMINGUEZ’)


… es verdad que la nota > 8 y es verdad que el apellido de la fila es
‘DOMINGUEZ’ (en mayúsculas).

WHERE (fecha_inscripcion < ‘01/03/1998’) AND (ename = ‘DOMINGUEZ’)


… es verdad que la fecha de inscripción es anterior al primero de marzo de
1998 y es verdad que el apellido de la fila es ‘DOMINGUEZ’ (en
mayúsculas).

Los operadores de comparación son:

= igual

< menor que

> mayor que

<> distinto de

= ANY/ALL compara con todos los valores de una lista, =ANY es


equivalente a IN

< ALL es menor que todos los valores de una lista o sub consulta.

> ALL es mayor que todos los valores de una lista o sub consulta.

<= ALL permite detectar al menor de todos los valores de una lista o
sub consulta.

>= ALL permite detectar al mayor de todos los valores de una lista o
sub consulta.

< ANY es menor que algunos de los valores de una lista o sub
consulta.

> ANY es mayor que algunos de los valores de una lista o sub
consulta.

IN es igual que al menos uno de los valores de una lista o sub


consulta.

10
NOT IN no es igual que al menos uno de los valores de una lista o
sub consulta.

BETWEEN límite inferior y límite superior está dentro de un rango


inclusivo.

NOT BETWEEN límite inferior y límite superior está fuera de un


rango inclusivo.

LIKE patrón como % (comodines de múltiples valores y múltiple


cantidad) y _ ídem pero solo de una posición.

NOT LIKE no cumple con un patrón como % (comodines de


múltiples valores y múltiple cantidad) y _ ídem pero solo de una
posición.

EXIST test de existencia en una sub consulta.

NOT EXIST test de no existencia en una sub consulta.

No hay límites en la cantidad en la cantidad de condiciones a definir en la


cláusula WHERE. Las múltiples combinaciones posibles de éstas, permiten
obtener las filas requeridas para responder cualquier requerimiento de
datos de tablas correctamente normalizadas.

1.1.3- Cláusula Group By.


Esta cláusula define sobre que valores de una o varias columnas se
agruparan las filas por sus distintos valores.

Estas cláusulas o funciones devuelven una sola fila como resultado de


contar, sumar, etc. todas las filas resultantes de una consulta. En la cláusula
WHERE no se puede usar GROUP BY porque ésta actúa sobre los resultados
del SELECT, no en el momento de su ejecución, es decir, actúa luego que el
motor de base de datos ejecutó la consulta aplicando el WHERE
correspondiente.

Por ejemplo, dadas las tres tablas mencionadas anteriormente, se puede


obtener:

11
ALUMNOS ALUMNOS_X_CARRERAS CARRERAS

PK ID PK ID PK ID

APELLIDOS ID_ALU NOMBRES


NOMBRES ID_CAR
DNI FECHA_INSCRIPCION
MAIL_1
MAIL_2

APELLIDOS NOMBRES CARRERAS

SIMON JUAN SIS


HARABINA ENRIQUE SIS
SCHELOTTO GUILLERMO SOF
BERMUDEZ JULIO ABO
PALERMO MARTIN SOF
GRACIANI ALFREDO ABO
GIUNTA BLAS ABO
NAVARRO FERNANDO SOF

Al agrupar por los valores del campo CARRERAS:

select carrera, count(*) from estudiantes group by carreras

nos da como resultado:

CARRERAS COUNT(*)

SIS 2
SOF 3
ABO 3

En el ejemplo anterior, se aplicó la función COUNT(), que cuenta las filas


seleccionadas y filtradas por la consulta y muestra el resultado del conteo.

Si se usa una función de grupo sin la cláusula GROUP BY, éstas se aplicarán
a todo el conjunto de filas seleccionadas. Se usan las funciones de grupo
también en la cláusula HAVING, para filtrar los grupos que no cumplen con
las condiciones. WHERE filtra grupos antes que se armen los grupos y
HAVING filtra filas una vez que se armaron los grupos.

Todas las funciones de grupo ignoran los valores nulls, esto es, si en la
columna ‘Apellido’ se va contar con COUNT(Apellidos) y tiene en todas las
filas valores null, esta función devolverá 0 (cero); si solo en algunas tuviera
nulls, contará todas las filas con valores distintos de null.

12
El asterisco en COUNT(*) le indica a la función que cuente todas las filas de
la o las tablas que están en el FROM. Según la definición de una tabla
relacional, ésta no puede tener una fila con dos valores null o fila nula.

EposibleLEGAJO MATERIA
anidar funciones de grupo, por NOTA
ejemplo, dada la tabla ‘Notas’:
a calcular el promedio de la nota más alta de cada materia, se puede hacer:
ABG67489 DER201 7
select avg(max(nota)) from notas group by id_materia;
ADM98654 ADM235 7
avg(max(nota))
7,5CPB67923 ADO123 8
RHU98342 DER435el agrupamiento interno
Esta consulta evalúa 9 (MAX(nota)) trayendo
PSI98462 ADM152 10
las notas más altas de cada materia, las agrupa nuevamente y, luego, les
CPB95642
calcula el promedio. ADM023 10
RHU98546 DER123 de cada materia (7,
Tomó la nota máxima 2 9, 10, 4) y las promedió
CPB87235
(30/4)=7,5. ADM023 4

Para calcular el promedio de la nota más alta de cada materia, se puede


hacer:

select avg(max(nota)) from notas group by id_materia;

dará como resultado 7,5

Esta consulta evalúa el agrupamiento interno (MAX(nota)) trayendo las


notas más altas de cada materia, las agrupa nuevamente y, luego, les
calcula el promedio.

Tomó la nota máxima de cada materia (7, 9, 10, 4) y las promedió (30/4) =
7,5.

1.1.4- Cláusula Having.


Una vez definidos los grupos, se puede escribir en HAVING una condición
que usa las funciones de grupo para filtrar o seleccionar y mostrar solo
aquellos grupos que cumplen con las condiciones presentadas en el
HAVING.
Se la suele comparar con las clausula WHERE, porque aplica condiciones,
pero que quede claro que WHERE filtra filas, HAVING filtra grupos armados
en GROUP BY.

1.1.5- Cláusula Order By.

La cláusula ORDER BY de la sentencia SELECT permite dar el orden deseado


a las filas encontradas que cumplan la condición, junto con los valores de

13
las funciones y otros cálculos y formateos realizados con esta sentencia. Es
posible combinar varias columnas para ordenar y el orden de aparición de
estas columnas en la cláusula ORDER BY no es trivial, comenzará por la
primera columna que aparece luego de la palabra BY.

Existen dos indicadores del sentido en que se debe ordenar, DESC de


descendente o ASC de ascendente. Si no se indica ninguno, se toma por
defecto ASC.

Así, si se usa DESC como indicador del sentido del ordenamiento, mostrará
de mayor a menor y, si es ASC, de menor a mayor. Esto es, en cada
columna.

En RESUMEN la sentencia SELECT…


Obtiene filas de la base de datos y permite realizar la selección de una o
varias filas o columnas de una o varias tablas. La sintaxis completa de la
instrucción SELECT es compleja, aunque las cláusulas principales se pueden
resumir del modo siguiente:

SELECT s.apellidos as APELLIDOS,


s.nombres as NOMBRES,
d.calle as CALLE,
d.numero as NUMERO,
d.piso as PISO,
d.departamento as DEPTO,
FROM socios s
JOIN socios_domicilios sd on s.id = sd.id_soc
JOIN domicilios d on sd.id_dom = d.id
WHERE s.apellidos = ‘LOPEZ’
AND s.nombres = ‘JUAN’
AND sd.tipo_domicilio = 1
AND s.fecha_nacimiento < ‘01/01/1990’
ORDER BY s.apellidos [ ASC | DESC ]

donde:

AS: especifica el título de una columna en el resultado de la consulta o el


alias de una tabla para la abreviación en la escritura de la consulta.

FROM: especifica las tablas de las que se van a obtener filas. La cláusula
FROM es necesaria excepto cuando la lista de selección sólo contiene
constantes, variables y expresiones aritméticas (no nombres de columna).

JOIN: especifica las tablas, vistas, tablas derivadas y tablas combinadas


para la instrucción SELECT.
La cláusula JOIN puede estar precedida de:

14
INNER: especifica que se devuelvan todos los pares de filas
coincidentes. Descarta las filas no coincidentes de las dos tablas.
Éste es el valor predeterminado si no se especifica ningún tipo de
combinación.
LEFT: especifica que todas las filas de la tabla de la izquierda que no
cumplan la condición especificada se incluyan en el conjunto de
resultados, además de todas las filas que devuelva la combinación
interna. Las columnas de salida de la tabla de la izquierda se
establecen a NULL.
RIGHT: especifica que todas las filas de la tabla de la derecha que no
cumplan la condición especificada se incluyan en el conjunto de
resultados, además de las que devuelva la combinación interna. Las
columnas de salida de la tabla de la derecha se establecen a NULL.
FULL: si una fila de la tabla de la izquierda o de la derecha no
coincide con los criterios de selección, especifica que la fila se
incluya en el conjunto de resultados y las columnas de resultados
que corresponden a la otra tabla se establezcan como NULL. Se
trata de una adición a todas las filas que normalmente devuelve la
combinación interna.
WHERE: limita las filas devueltas en el conjunto de resultados mediante el
uso de predicados. No hay límite en el número de predicados que se
pueden incluir en una condición de búsqueda.

ORDER BY: especifica la columna según la que se ordenará. Se puede


especificar una columna de orden como un nombre o alias de columna
(que puede estar calificado con el nombre de una tabla o vista), una
expresión o un entero no negativo que representa la posición del nombre,
alias o expresión en la lista de selección.
Se puede especificar varias columnas de orden. La secuencia de columnas
de orden en la cláusula ORDER BY define la estructura del conjunto
ordenado de resultados.
ASC: indica que los valores de la columna especificada se deben
ordenar de manera ascendente, desde el valor más bajo al más alto.
DESC: indica que los valores de la columna especificada se deben
ordenar de manera descendente, desde el valor más alto al valor
más bajo.
Los valores NULL se tratan como los valores más bajos posibles.

15
1.1.6- Funciones de Caracteres.
Las funciones de manejo de caracteres alfanuméricos aceptan argumentos
de tipo carácter y retornan caracteres o valores numéricos.

chr(x): retorna un carácter equivalente al código enviado como argumento


"x".

select chr(65) from dual;


-- al ejecutarlo devolverá 'A'.

select chr(100) from dual;


-- al ejecutarlo devolverá 'd'.

concat(cadena1,cadena2): concatena dos cadenas de caracteres; es


equivalente al operador.

select concat ('bienvenidos','a la',’universidad’) from dual;


-- al ejecutarlo devolverá 'bienvenidos a la universidad'.

initcap (cadena): retorna la cadena enviada como argumento con la


primera letra (letra capital) de cada palabra en mayúscula.

select initcap (‘bienvenidos a la universidad') from dual;


-- al ejecutarlo devolverá 'Bienvenidos A La Universidad'.

lower (cadena): retorna la cadena enviada como argumento en


minúsculas. "lower" significa reducir en inglés.

select lower(' bienvenidos a la UNIVERSIDAD') from dual;


-- al ejecutarlo devolverá 'bienvenidos a la universidad'.

upper (cadena): retorna la cadena con todos los caracteres en mayúsculas.

select upper(' bienvenidos a la UNIVERSIDAD') from dual;


-- al ejecutarlo devolverá 'BIENVENIDOS A LA UNIVERSIDAD'.

lpad (cadena,longitud,cadenarelleno): retorna la cantidad de caracteres


especificados por el argumento "longitud", de la cadena enviada como
primer argumento (comenzando desde el primer caracter); si "longitud" es
mayor que el tamaño de la cadena enviada, rellena los espacios restantes
con la cadena enviada como tercer argumento (en caso de omitir el tercer
argumento rellena con espacios); el relleno comienza desde la izquierda.

select lpad ('universidad',15,'x') from dual;


-- al ejecutarlo devolverá 'xxxxuniversidad'

16
select lpad ('universidad',4,'x') from dual;
-- al ejecutarlo devolverá 'univ'

rpad (cadena,longitud,cadenarelleno): retorna la cantidad de caracteres


especificados por el argumento "longitud", de la cadena enviada como
primer argumento (comenzando desde el primer caracter); si "longitud" es
mayor que el tamaño de la cadena enviada, rellena los espacios restantes
con la cadena enviada como tercer argumento (en caso de omitir el tercer
argumento rellena con espacios); el relleno comienza desde la derecha
(último caracter).

select rpad ('universidad',15,'x') from dual;


-- al ejecutarlo devolverá 'universidadxxxx'

select rpad ('universidad',4,'x') from dual;


-- al ejecutarlo devolverá 'idad'

ltrim (cadena1,cadena2): borra todas las ocurrencias de "cadena2" en


"cadena1", si se encuentran al comienzo; si se omite el segundo
argumento, se eliminan los espacios.

select ltrim ('la casa de la cuadra','la') from dual;


-- al ejecutarlo devolverá 'casa de la cuadra'

select ltrim (' es la casa de la cuadra’,’ la') from dual;


-- al ejecutarlo no elimina ningún carácter

select ltrim (' la casa') from dual;


-- al ejecutarlo devolverá 'la casa'

rtrim (cadena1, cadena2): borra todas las ocurrencias de "cadena2" en


"cadena1", si se encuentran por la derecha (al final de la cadena); si se
omite el segundo argumento, se borran los espacios.

select rtrim ('la casa lila','la') from dual;


-- al ejecutarlo devolverá 'la casa li'

select rtrim ('la casa lila ','la') from dual;


-- al ejecutarlo no borra ningún carácter

select rtrim ('la casa lila ') from dual;


-- al ejecutarlo devolverá 'la casa lila'

trim (cadena): retorna la cadena con los espacios de la izquierda y derecha


eliminados. "Trim" significa recortar.

17
select trim (' Universidad ') from dual;
-- al ejecutarlo devolverá 'Universidad'

replace (cadena, subcade1,subcade2): retorna la cadena con todas las


ocurrencias de la subcadena de reemplazo (subcade2) por la subcadena a
reemplazar (subcae1).

select replace('xxx.universidad.com','x','w') from dual;


-- al ejecutarlo devolverá ‘www.universidad.com'

substr (cadena,inicio,longitud): devuelve una parte de la cadena


especificada como primer argumento, empezando desde la posición
especificada por el segundo argumento y de tantos caracteres de longitud
como indica el tercer argumento.

select substr('www.universidad.com',1,10) from dual;


-- al ejecutarlo devolverá 'www.univer'

select substr('www.universidad.com',5,5) from dual;


-- al ejecutarlo devolverá ‘niver'

length (cadena): retorna la longitud de la cadena enviada como


argumento. "lenght" significa longitud en inglés.

select length('www.universidad.com') from dual;


-- al ejecutarlo devolverá 19

instr (cadena,subcadena): devuelve la posición de comienzo (de la primera


ocurrencia) de la subcadena especificada en la cadena enviada como
primer argumento. Si no la encuentra retorna 0.

select instr (‘www.universidad.com','.') from dual;


-- al ejecutarlo devolverá 4

select instr (‘www.universidad.com','-') from dual;


-- al ejecutarlo devolverá 0, no se encuentra.

translate(): reemplaza cada ocurrencia de una serie de caracteres con otra


serie de caracteres. La diferencia con "replace" es que aquella trabaja con
cadenas de caracteres y reemplaza una cadena completa por otra, en
cambio "translate" trabaja con caracteres simples y reemplaza varios. En el
siguiente ejemplo se especifica que se reemplacen todos los caracteres "V"
por el carácter "0", todos los caracteres "U" por el carácter "5" y todos los
caracteres "S" por "6":

18
select translate ('UNIVERSIDAD','VUS','056') from dual;
-- al ejecutarlo devolverá 5NI0ER6IDAD.

decode(): traduce una expresión a un valor de retorno. Si expr es igual a


value1, la función devuelve Return1. Si expr es igual a value2, la función
devuelve Return2. Y asi sucesivamente. Si expr no es igual a ningún valor la
función devuelve el valor por defecto.

select decode(ESTADO,0,'bien',1,'regular','mal') from pedidos;


-- al ejecutarlo devolverá bien, regular o mal

La funciones de conversión, transforman un valor de tipo de datos a otro


tipo de datos.

to_date: convierte una cadena a tipo de dato "date".

select to_date ('05-SEP-2007 10:00 AM','DD-MON-YYYY HH:MI AM') from


dual;
-- al ejecutarlo devolverá 05/09/07

to_char: convierte una fecha a cadena de caracteres.

to_number: se puede utilizar para pasar de carácter a numérico.

1.1.7- Funciones Numéricas.


También son funciones de filas simples, aquellas que permiten realizar
tareas sobre campos numéricos, como por ejemplo:

abs(x): retorna el valor absoluto del argumento "x".

select abs(-15) from dual;


-- al ejecutarlo devolverá 15.

ceil(x): redondea a entero, hacia arriba, el argumento "x".

select ceil(19.34) from dual;


-- al ejecutarlo devolverá 20.

floor(x): redondea a entero, hacia abajo, el argumento "x".

select floor(19.34) from dual;


-- al ejecutarlo devolverá 19.

19
mod(x,y): devuelve el resto de la división x/y.

select mod(10,3) from dual;


-- al ejecutarlo devolverá 1.

select mod(10,2) from dual;


-- al ejecutarlo devolverá 0.

power(x,y): retorna el valor de "x" elevado a la "y" potencia.

select power(2,3) from dual;


-- al ejecutarlo devolverá 8.

round(n,d): retorna "n" redondeado a "d" decimales; si se omite el


segundo argumento, redondea todos los decimales. Si el segundo
argumento es positivo, el número de decimales es redondeado según "d";
si es negativo, el número es redondeado desde la parte entera según el
valor de "d".

select round(123.456,2) from dual;


-- al ejecutarlo devolverá 123.46, es decir, redondea desde el
segundo decimal.

select round(123.456,1) from dual;


-- al ejecutarlo devolverá 123.5, es decir, redondea desde el primer
decimal.

select round(123.456,-1) from dual;


-- al ejecutarlo devolverá 120, redondea desde el primer valor entero
(hacia la izquierda).

select round(123.456,-2) from dual;


-- al ejecutarlo devolverá 100, redondea desde el segundo valor
entero (hacia la izquierda).

select round(123.456) from dual;


-- al ejecutarlo devolverá 123.

sign(x): si el argumento es un valor positivo, retorna 1, si es negativo,


devuelve -1 y 0 si es 0.

select sign(-120) from dual;


-- al ejecutarlo devolverá -1

20
select sign(120) from dual;
al ejecutarlo devolverá 1

trunc(n,d): trunca un número a la cantidad de decimales especificada por


el segundo argumento. Si se omite el segundo argumento, se truncan todos
los decimales. Si "d" es negativo, el número es truncado desde la parte
entera.

select trunc(1234.5678,2) from dual;


-- al ejecutarlo devolverá 1234.56

select trunc(1234.5678,-2) from dual;


-- al ejecutarlo devolverá 1200

select trunc(1234.5678,-1) from dual;


-- al ejecutarlo devolverá 1230

select trunc(1234.5678) from dual;


-- al ejecutarlo devolverá 1234

sqrt(x): devuelve la raíz cuadrada del valor enviado como argumento.

select sqrt(9) from dual;


-- al ejecutarlo devolverá 3

También existen funciones trigonométricas que retornan radianes, calculan


seno, coseno, inversas, etc.: acos, asin, atan, atan2, cos, cosh, exp, ln, log,
sin, sinh, tan, tanh.

Se pueden emplear las funciones matemáticas enviando como argumento


el nombre de un campo de tipo numérico.

1.1.8- Funciones de Fechas.


add_months(f,n): agrega a una fecha, un número de meses. Si el segundo
argumento es positivo, se le suma a la fecha enviada tal cantidad de meses;
si es negativo, se le resta a la fecha enviada tal cantidad de meses.

select add_months('10/06/2007',5) from dual;


-- al ejecutarlo devolverá "10/11/07"

select add_months('10/06/2007',-5) from dual;


-- al ejecutarlo devolverá "10/01/07"

select add_months('30/01/2007',1) from dual;

21
-- al ejecutarlo devolverá "25/02/07" por ser el último día delmes.

last_day(f): retorna el último día del mes de la fecha enviada como


argumento.

select last_day('10/02/2007') from dual;


-- al ejecutarlo devolverá "28/02/07"

select last_day('10/08/2007') from dual;


-- al ejecutarlo devolverá "31/08/07"

months_between(f1,f2): retorna el número de meses entre las fechas


enviadas como argumento.

select months_between ('19/05/2003','21/06/05') from dual;


-- al ejecutarlo devolverá 25

next_day(fecha,dia): retorna una fecha correspondiente al primer día


especificado en "dia" luego de la fecha especificada. En el siguiente
ejemplo se busca el lunes siguiente a la fecha especificada:

select next_day ('06/11/2013','LUNES') from dual;


-- al ejecutarlo devolverá 11/11/2013

current_date: retorna la fecha actual.

select current_date from dual;

current_timestamp: retorna la fecha actual

select current_timestamp from dual;


-- al ejecutarlo devolverá: 10/08/07 09:59:44,109000000
AMERICA/BUENOS_AIRES

sysdate: retorna la fecha y hora actuales en el servidor de Oracle.

systimestamp: retorna fecha y hora actuales.

select systimestamp from dual;


-- al ejecutarlo devolverá 10/08/07 10:33:48,984000000 -03:00
extract (parte,fecha): retorna la parte (especificada por el primer
argumento) de una fecha. Puede extraer el año (year), mes (month), día
(day), hora (hour), minuto (minute), segundo (second), etc.

select extract(month from sysdate) from dual;


-- al ejecutarlo devolverá el número mes de la fecha actual.

22
Los operadores aritméticos "+" (más) y "-" (menos) pueden emplearse con
fechas.

select sysdate-3;
-- al ejecutarlo devolverá 3 días antes de la fecha actual.

select to_date('15/12/2007')-5 from dual;


-- al ejecutarlo devolverá 10/12/07

Se pueden emplear estas funciones enviando como argumento el nombre


de un campo de tipo date.

23
1.2- Sentencia INSERT
La sentencia INSERT, es otra de la sentencias del DML, y en este caso nos
da la posibilidad de agregar nuevos registros a una tabla de la base de
datos, brindando conjuntamente la posibilidad de definir valores a todos a
cada uno de los campos de la misma.

Para describir la simple estructura que posee, suponemos un diagrama de


entidad – relación como el siguiente:

SOCIOS SOCIOS_DOMICILIOS DOMICILIOS LOCALIDADDES

PK ID PK ID_CLI PK ID PK ID
PK ID_DOM
APELLIDOS PK ID_TIP CALLE DESCRIPCION
NOMBRES NUMERO CODIGO_POSTAL
DNI_TIPO PISO ID_PRO
DNI DEPARTAMENTO
FECHA_NACIMIENTO ID_LOC
ESTADO_CIVIL
PROVINCIAS
TIPOS_DNI
DOMICILIOS_TIPOS
PK ID
PK ID
SOCIOS_PROFESIONES PK ID DESCRIPCION
DESCRIPCION ID_PAI
PK ID_SOC DESCRIPCION
PK ID_PRO

SOCIOS_PELICULAS PELICULAS PAISES

PK ID_SOC PK ID PK ID
PK ID_PEL
PROFESIONES NOMBRE DESCRIPCION
FECHAHORA
PK ID

DESCRIPCION

TIPOS_SALAS SALAS FUNCIONES

PK ID PK ID PK ID_SAL
PK ID_PEL
DESCRIPCION DESCRIPCION PK FECHAHORA
ID_TIP_SAL
ESTADO

sobre la tabla socios podríamos realizar diversas variaciones de INSERT:

- introducción de un registro completo en la tabla SOCIOS indicando los


campos en donde se incluirán valores, sin la utilización de un campo
incremental en la clave primaria.

insert into socios (id, apellidos, nombres, dni_tipo, dni, fecha_nacimiento,


estado_civil) values (234, ’LOPEZ’, ’JUAN’, 1, 23925838, ’26/09/1974’,
’SOLTERO’);

- introducción de un registro completo en la tabla SOCIOS indicando los


campos en donde se incluirán valores, con la utilización de una secuencia
en la clave primaria.

24
insert into socios (id, apellidos, nombres, dni_tipo, dni, fecha_nacimiento,
estado_civil) values (secuencia_socios.nextval, ’LOPEZ’, ’JUAN’, 1,
23925838, ’26/09/1974’, ’SOLTERO’);

- introducción de un registro completo en la tabla SOCIOS indicando los


campos en donde se incluirán valores, con la utilización de un campo
incremental como clave primaria.

insert into socios (apellidos, nombres, dni_tipo, dni, fecha_nacimiento,


estado_civil) values (’LOPEZ’, ’JUAN’, 1, 23925838, ’26/09/1974’,
’SOLTERO’);

- introducción de un registro completo en la tabla SOCIOS sin indicar los


campos en donde se incluirán valores, sin la utilización de un campo
incremental en la clave primaria.

insert into socios values (234, ’LOPEZ’, ’JUAN’, 1, 23925838, ’26/09/1974’,


’SOLTERO’);

- introducción de un registro completo en la tabla SOCIOS sin indicar los


campos en donde se incluirán valores, con la utilización de una secuencia
en la clave primaria.

insert into socios values (secuencia_socios.nextval, ’LOPEZ’, ’JUAN’, 1,


23925838, ’26/09/1974’, ’SOLTERO’);

- introducción de un registro completo en la tabla SOCIOS sin indicar los


campos en donde se incluirán valores, con la utilización de un campo
incremental como clave primaria.

insert into socios values (’LOPEZ’, ’JUAN’, 1, 23925838, ’26/09/1974’,


’SOLTERO’);

- introducción de un registro incompleto en la tabla SOCIOS indicando los


campos en donde se incluirán valores, sin la utilización de un campo
incremental en la clave primaria.

insert into socios (id, apellidos, nombres, estado_civil) values (234, ’LOPEZ’,
’JUAN’, ’SOLTERO’);

- introducción de un registro incompleto en la tabla SOCIOS indicando los


campos en donde se incluirán valores, con la utilización de una secuencia
en la clave primaria.

insert into socios (id, apellidos, nombres, estado_civil) values


(secuencia_socios.nextval, ’LOPEZ’, ’JUAN’, 1, ’SOLTERO’);

- introducción de un registro incompleto en la tabla SOCIOS indicando los


campos en donde se incluirán valores, con la utilización de un campo
incremental como clave primaria.

25
insert into socios (apellidos, nombres, estado_civil) values (’LOPEZ’, ’JUAN’,
’SOLTERO’);

- introducción de un registro incompleto en la tabla SOCIOS sin indicar los


campos en donde se incluirán valores, sin la utilización de un campo
incremental en la clave primaria.

insert into socios values (234, ’LOPEZ’, ’JUAN’, null, null, null, ’SOLTERO’);

- introducción de un registro incompleto en la tabla SOCIOS sin indicar los


campos en donde se incluirán valores, con la utilización de una secuencia
en la clave primaria.

insert into socios values (secuencia_socios.nextval, ’LOPEZ’, ’JUAN MARIA’,


null, null, null, ’SOLTERO’);

- introducción de un registro incompleto en la tabla SOCIOS sin indicar los


campos en donde se incluirán valores, con la utilización de un campo
incremental como clave primaria.

insert into socios values (’LOPEZ’, ’JUAN MARIA’, null, null, null, ’SOLTERO’);

- introducción de varios registros en la tabla SOCIOS a partir de los datos de


otra tabla.

insert into socios (apellidos, nombres, estado_civil) values (select apellidos,


nombres, estado_civil);

SOCIOS CLIENTES

PK ID PK ID

APELLIDOS APELLIDOS
NOMBRES NOMBRES
DNI_TIPO FECHA_NACIMIENTO
DNI ESTADO_CIVIL
FECHA_NACIMIENTO USUARIO
ESTADO_CIVIL

- introducción de varios registros en la tabla SOCIOS a partir de los datos de


otra tabla utilizando filtro.

insert into socios (apellidos, nombres, estado_civil) values (select apellidos,


nombres, estado_civil where apellido like ‘LOP%’);

En RESUMEN la sentencia INSERT…


Anexa un registro al final de una tabla que contiene los valores de campo
especificados.

26
insert into socios values (‘LOPEZ’, ’JUAN’, ’DNI’, 23925838, 26/09/1974,
’SOLTERO’)
o
insert into socios (apellidos,nombres,dni) VALUES (‘LOPEZ’, ’JUAN’,
23925838)

INTO: especifica el nombre de la tabla a la que se anexará un registro.

VALUES: especifica los valores de campo que se insertan en el nuevo


registro.

1.3- Sentencia UPDATE


La sentencia Update, también forma parte del conjunto de sentencias del
DML, y en este caso nos permite modificar el contenido o valor de un
campo de uno o varios registros de una tabla.

La modificación puede hacerse con varios campos a la vez, y la cantidad de


registros puede controlarse con la cláusula WHERE con las mismas
características de utilización que en la cláusula SELECT, en aquel caso
controla la obtención de datos, en este caso control la modificación de los
mismos.

Para describir la simple estructura que posee, suponemos un diagrama de


entidad – relación como el siguiente:

SOCIOS SOCIOS_DOMICILIOS DOMICILIOS LOCALIDADDES

PK ID PK ID_CLI PK ID PK ID
PK ID_DOM
APELLIDOS PK ID_TIP CALLE DESCRIPCION
NOMBRES NUMERO CODIGO_POSTAL
DNI_TIPO PISO ID_PRO
DNI DEPARTAMENTO
FECHA_NACIMIENTO ID_LOC
ESTADO_CIVIL
PROVINCIAS
TIPOS_DNI
DOMICILIOS_TIPOS
PK ID
PK ID
SOCIOS_PROFESIONES PK ID DESCRIPCION
DESCRIPCION ID_PAI
PK ID_SOC DESCRIPCION
PK ID_PRO

SOCIOS_PELICULAS PELICULAS PAISES

PK ID_SOC PK ID PK ID
PK ID_PEL
PROFESIONES NOMBRE DESCRIPCION
FECHAHORA
PK ID

DESCRIPCION

TIPOS_SALAS SALAS FUNCIONES

PK ID PK ID PK ID_SAL
PK ID_PEL
DESCRIPCION DESCRIPCION PK FECHAHORA
ID_TIP_SAL
ESTADO

27
- modificación de un campo de todos los registros en la tabla SOCIOS.

update socios set estado_civil = ’SOLTERO’;

- modificación de un campo de algunos registros en la tabla SOCIOS según


algún criterio.

update socios set estado_civil = ’SOLTERO’ where id = 1050;

update socios set estado_civil = ’SOLTERO’ where id in (1050,1051,1052);

- modificación de varios campos de todos los registros en la tabla SOCIOS.

update socios set apellidos = ’GOMEZ’, nombres = ’IVAN’;

- modificación de varios campos de algunos registros en la tabla SOCIOS


según algún criterio.

update socios set apellidos = ’GOMEZ’, nombres = ’IVAN’ where id = 1050;

update socios set apellidos = ’GOMEZ’, nombres = ’IVAN’ where id in


(1050,1051,1052);

- modificación del contenido de un campo con valores del mismo campo


actualizados.

update socios set sueldo = sueldo * 100 where id = 1050;

update socios set sueldo = sueldo * 100 where id in (1050,1051,1052);

- modificación de varios campos de algunos registros en la tabla SOCIOS


según algún criterio obtenido a partir de una subconsulta.

update socios set apellidos = ’GOMEZ’, nombres = ’IVAN’

where id in (select id from clientes);

En RESUMEN la sentencia UPDATE…


Actualiza registros de una tabla con nuevos valores.

update socios SET apellido = ‘GIMENEZ’, nombres = ‘GUILLERMO’ WHERE


dni = 23925838

28
UPDATE: especifica la tabla en la que se modifican los registros.

WHERE: especifica los criterios que deben satisfacer los registros para
marcarlos para su modificación. Puede incluir tantas condiciones como
desee, si las conecta con el operador AND u OR. También puede utilizar el
operador NOT para invertir el valor de una expresión lógica.

1.4- Sentencia DELETE


Para borrar filas de una tabla, la sentencia DELETE es muy simple; alcanza con
completar el nombre de la tabla y, opcionalmente, se puede incorporar la clausula
WHERE, con el funcionamiento que se vio en la sentencia SELECT.

SOCIOS SOCIOS_DOMICILIOS DOMICILIOS LOCALIDADDES

PK ID PK ID_CLI PK ID PK ID
PK ID_DOM
APELLIDOS PK ID_TIP CALLE DESCRIPCION
NOMBRES NUMERO CODIGO_POSTAL
DNI_TIPO PISO ID_PRO
DNI DEPARTAMENTO
FECHA_NACIMIENTO ID_LOC
ESTADO_CIVIL
PROVINCIAS
TIPOS_DNI
DOMICILIOS_TIPOS
PK ID
PK ID
SOCIOS_PROFESIONES PK ID DESCRIPCION
DESCRIPCION ID_PAI
PK ID_SOC DESCRIPCION
PK ID_PRO

SOCIOS_PELICULAS PELICULAS PAISES

PK ID_SOC PK ID PK ID
PK ID_PEL
PROFESIONES NOMBRE DESCRIPCION
FECHAHORA
PK ID

DESCRIPCION

TIPOS_SALAS SALAS FUNCIONES

PK ID PK ID PK ID_SAL
PK ID_PEL
DESCRIPCION DESCRIPCION PK FECHAHORA
ID_TIP_SAL
ESTADO

- eliminación de todos los registros en la tabla SOCIOS.

delete from socios;

- eliminación de de algunos registros en la tabla SOCIOS según algún criterio.

delete socios where id = 1050;


o
delete socios where id where id in (1050,1051,1052);

29
- eliminación de varios registros en la tabla SOCIOS según algún criterio obtenido a
partir de una subconsulta.

delete socios where id where id in (select id from clientes);

Siempre se debe tener en cuenta de la imposibilidad de borrar registros que


hagan referencia a algún registro de alguna tabla secundaria. en caso de
intentarlo, se puede eliminar los registros referenciados en cascada. A la inversa,
si se desea eliminar un registro en una tabla secundaria que posee valores
tomados desde una tabla primaria, directamente la base de datos nos devolverá
error de constraint.

En RESUMEN la sentencia DELETE…


Elimina los registros especificados.

delete from socios where dni = 23925838

FROM: especifica la tabla en la que se eliminan los registros.

WHERE: especifica los criterios que deben satisfacer los registros para marcarlos
para su eliminación. Puede incluir tantas condiciones como desee, si las conecta
con el operador AND u OR. También puede utilizar el operador NOT para invertir
el valor de una expresión lógica.

30
Bibliografía Lectura 1
Reinosa, E; Maldonado, C; Muñoz, E; Damiano, L; Abrutsky, M; (2012), “Base de
Datos”, Capítulo 3 – SQL (p. 112 a p. 127), Argentina, Alfaomega Grupo Editor
Argentino S.A.

31

También podría gustarte