Sunteți pe pagina 1din 41

Capitulo 3: Consultas Para Una Tabla 1

Consultas Para Una Tabla


Capitulo 3: Consultas Para Una Tabla 2

Introducción

Este capítulo presenta una serie de comandos e instrucciones usadas para


seleccionar data de las tablas donde reside. Muchos de estas instrucciones de SQL se
pueden utilizar tambien para multiples tablas; su uso varía de acuerdo a la necesidad del
usuario.

Entre los objetivos de este capítulo se incluyen:

 Recuperar data de una base de datos utilizando el lenguaje de consultas de


SQL*Plus y sus respectivos comandos.

 Repasar el uso de los comandos de SELECT, FROM y WHERE.

 Usar condiciones sencillas y compuestas para recuperar data específica y/o


condicionada (uso de operadores lógicos)

 Hacer computos entre columnas

 Uso de ALTER TABLE, ADD, MODIFY, UPDATE y SET para crear


columnas nuevas en una tabla y añadir data

 Uso del operador LIKE para buscar similitudes en los valores de una columna

 Uso de IN para sustituir operador lógico OR.

 Sortear la data seleccionada utilizando el comando de ORDER BY. Pueden


usarse multiples sorteos y orden descendente o ascendente (DESC ó ASC).

 Utilizar funciones para contar filas y hacer operaciones matemáticas entre


columnas. (Uso de SUM, AVG, MIN, MAX, COUNT)

 Crear sub-consultas (sub-queries) donde un segundo conjunto de instrucciones


SELECT queden dentro del primero conjunto de instrucciones.

 Utilizar el GROUP BY y HAVING para agrupar filas y columnas con valores


comunes.

 Como buscar valores nulos (NULL) y no nulos (NOT NULL) en una tabla.

“Queries” o consultas simples


Repaso de conceptos
Capitulo 3: Consultas Para Una Tabla 3

Una consulta contesta una o mas preguntas sobre la data que reside en una base de datos.
Para que el DBMS pueda interpretar una pregunta, es necesario utilizar un lenguaje
estructurado como SQL (en el caso de este tutor usamos SQL*Plus de Oracle).
Debemos conocer la naturaleza de la data; el nombre de las tablas y columnas que
se encuentran almacenadas en la Base de Datos. Esto es necesario para poder solicitar
datos específicos sobre la data que reside en la B.D.

Con las clausulas de SELECT (nombre(s) de la columna(s)) FROM (nombre de la


tabla) podemos recuperar la data de todas o algunas columnas de una tabla. Recuerde que
la clausula SELECT seguido de un asterisco en vez del nombre de la/s columnas
(SELECT*) incluye todas las columnas de la tabla. Este ejemplo lista solo algunas de las
columnas de la tabla de Project. Puede especificar las columnas en el orden en que desee
que se despleguen en la salida.

El orden de las columnas en el


SELECT determinan el orden de
las columnas en la salida de la data

Figura 3.1 Como Usar SELECT para Columnas Específicas

Nota
Fíjese en el orden que aparecen las columnas en la salida. Es el mismo orden en que se
nombraron las columnas en las instrucciones entradas despues del SELECT.
Capitulo 3: Consultas Para Una Tabla 4

Condiciónes Simples:
(Operadores Comparativos)

Luego de usar el SELECT y el FROM para definir las columnas dentro de una
tabla, puede usar la clausula WHERE para condicionar la consulta y la selección de data.
Esto tambien se conoce como restringir la salida a cierta condición específica. En la
Figura 3.2 podemos ver un ejemplo de como la claúsula WHERE restringe la salida a
unos datos específicos. Solo se verán en la salida los datos que estan relacionados al
Departamento numero 108 (Deptno = '108').

Nota
Fíjese en la condición que se propone despues del WHERE y el nombre de la columna
donde desea que se inicie la consulta. El valor que selecciona debe estar entre comillas
sencillas para que SQL*Plus pueda interpretar que usted quiere recuperar exclusivamente
las filas donde se encuentre ese número en la columna de Deptno de la tabla. (el número
108 en la columna de Deptno). Luego la consulta mostrará las columnas de esas filas que
usted especificó despues del SELECT.

En caso que deseemos recuperar un campo que sea texto, debe estar escrito
idénticamente como aparece en la columna y entre comillas sencillas:

El operador comparativo
restringe la salida al
cumplirse la condición
Capitulo 3: Consultas Para Una Tabla 5

El signo de “=” se conoce como un operador comparativo. La siguiente tabla lista


otros operadores comparativos y sus descripciones:

Operador Descripción
Comparativo
= “Es igual a”
< “Es menor que”
> “Es mayor que”
<= “Es menor o igual a”
>= “Es mayor o igual a”
<> “no es igual a”
!= “no es igual a”

Figura 3.3 Tabla de Operadores Comparativos

Podemos utilizar cualquiera de los operadores comparativos para obtener la data


que deseamos:

Figura 3.2 Como Usar WHERE para recuperar data específica

Salida incluye todos los


número de proyecto igual o
mayor que 118

Figura 3.4 Operador Comparativo (>=) “mayor o igual que”


Capitulo 3: Consultas Para Una Tabla 6

Condiciones Compuestas
Las condiciones compuestas conectan dos ó más condiciones simples utilizando
los operadores lógicos AND, OR y NOT. La siguiente tabla describe los operadores
lógicos:

Operador Descripción
AND Todas las condiciones simples deben ser
ciertas para cumplir con esta condición
compuesta.
OR Cuando las condiciones simples estan
conectadas por un operador OR, la
condición es cierta si se cumple alguna de
las condiciones simples
NOT Cuando la condición simple es precedida
de la condicón not se invierte la veracidad
de la condición original

Figura 3.5 Tabla de Operadores Lógicos

Utilización de los Operadores Lógicos en las condiciones compuestas:


Capitulo 3: Consultas Para Una Tabla 7

En esta figuraFigura
podemos notarOperador
3.6 Uso que soloLógico
una filaAND
de la tabla de Employee cumple
con la condición AND. En este caso hay solo un empleado que gana sobre $30,000 en el
Departamento 108. Encerrar las condiciones entre parentesis facilita la comprensión de la
condición.

Veremos un ejemplo usando el operador lógico OR:

En este ejemplo el operador logico OR establece que el Empleado debe tener un


salario mayor de $60,000 o debe pertenecer al Departamento 108 para listarse en la
salida:
Capitulo 3: Consultas Para Una Tabla 8

Figura 3.7 Uso Operador Lógico OR

El ejemplo que utiliza el Operador NOT muestra como podemos selccionar data
dentro de una tabla que no cumple con una condición expuesta (Figura 3.7). En este caso
se seleccionaron todos los records dentro de la tabla Employee que no tienen un salario
menor que $38,000. Por esta razón se listaron todos los empleados que tienen un salario
mayor ó igual que $38,000, que sería lo contrario de la condición simple expuesta entre
paréntesis.

Figura 3.6 Uso Operador Lógico OR


Figura 3.7 Uso Operador Lógico NOT
Capitulo 3: Consultas Para Una Tabla 9

Figura 3.8 Uso Operador Lógico NOT

Operador BETWEEN

El operador BETWEEN sustituye una operación condicionada entre dos valores


de una misma columna. En vez de usar AND y los valores entre los cuales debe
cumplirse la condición, se usa BETWEEN.

Nota
El operador BETWEEN incluye los valores que estan especificados en la condición. Por
esta razón el ejemplo incluye todos los salarios desde $30,000 hasta $40,000.

Ver próxima página:

Figura 3.7 Uso Operador BETWEEN


Capitulo 3: Consultas Para Una Tabla 10

Se incluyen los valores


especificados con el AND
ademas de los que estan
entre (BETWEEN) los dos
valores. (Si existe alguno)

Figura 3.9 Uso Operador BETWEEN

Como Hacer Computos entre Columnas


Puede crear columnas que realizan computos utilizando operadores matemáticos
que envuelven más de una columna dentro de una tabla. La data de las columnas
existentes puede ser añadida, restada, multiplicada o dividida. Los operadores aritméticos
comunes se pueden aplicar en el SELECT.

Se le puede asignar un nombre a la columna que va a contener el resultado


(producto) del computo para que al listarse en la salida la columna tenga su
encabezamiento.

Tambien se pueden usar operadores comparativos para limitar la salida de la


columna donde reside el producto del cálculo matemático a valores específicos y/o
condicionados.
Capitulo 3: Consultas Para Una Tabla 11

Operadores Aritméticos usados en los computos de las tablas

Operador Aritmético Descripción


Suma de Columnas
+
Resta de columnas
-
Multiplicación
*
División
/
Figura 3.10 Operadores Aritméticos

Para Añadir Columnas a una Tabla

Uso de ALTER TABLE con los comandos de ADD y MODIFY para


añadir las columnas necesarias para mostrar ejemplos de operaciones
aritméticas entre columnas

Para poder mostrar un ejemplo de los operadores es necesario añadir dos columnas a la
tabla de Workon; una es RATE, que muestra el salario por hora del empleado en cada
proyecto y la otra columna es PROJ_SHARES que muestra la aportación del empleado
para obtener acciones de cada proyecto. Esto se le descuenta a cada empleado al calcular
las horas trabajadas por projecto. (Este descuento es por proyecto y es una cantidad fija).

Utilizamos ALTER TABLE para alterar la estructura de las tablas. Esta clausula se verá
detalladamente en el capítulo que trata con la actualización de la data en el Capítulo 5.
Como se ve en el ejemplo, la clausula tiene que ir seguida del comando de ADD que se
utiliza para especificar el nombre de la columna que se le va a añadir a la tabla. Luego de
especificar el nombre de la columna, se establece el tipo de data que va a contener. En
este caso las dos columnas son numericas. Al designar el largo del campo especificamos
'NUMBER(3,2)'. Esto significa que de los tres espacios que reservamos para el campo
númerico, dos son decimales. Aprenderemos a modificar el tipo de data.. Esto debe
hacerse antes de entrar la data. Tendremos que usar el ALTER TABLE con MODIFY en
lugar de ADD para ampliar el campo a cinco espacios, que incluyen tres espacios a la
izquierda del punto y dos espacios a la derecha del punto decimal (5,2).

Los siguientes dos ejemplos muestran como podemos añadir las dos columnas y luego
modificar la estructura de ellas para acomodarlas a las necesidades o los requerimientos
del contenido de las tablas.
Capitulo 3: Consultas Para Una Tabla 12

Se especifica el tipo
de data y el tamaño
luego de nombrar la
columna con ADD

Estructura de la tabla luego de añadir


las dos columnas

Figura 311 Uso ALTER TABLE con ADD

Uso de MODIFY para


modificar el tipo y/o
tamaño de la data
dentro de columna que
creamos anteriormente

Figura 3.12 Uso ALTER TABLE con MODIFY


Capitulo 3: Consultas Para Una Tabla 13

Para Añadir Valores a las Columnas

Ahora podemos añadir data a las columnas para poder usar los operadores
aritméticos entre columnas. Para añadir datos a las columnas creadas usamos los
comandos de UPDATE y SET para insertar valores iniciales. Iniciamos las columnas a un
valor inicial para facilitar el ejercicio. La columna de RATE se iniciará a $11.00 la hora y
el de PROJ_SHARES se mantendrá en $10.00 que es la aportación fija para comprar
acciones del projecto.

Se añaden valores
iniciales a la
columna
Se de RATE.
le añaden
valores iniciales a
la columna de
RATE

Figura 3.13 Uso UPDATE y SET para iniciar valores en RATE

Ver próxima Figura.


Capitulo 3: Consultas Para Una Tabla 14

Se añaden valores
iniciales a la
columna de
PROJ_SHARES

Figura 3.14 Uso de UPDATE y SET para iniciar valores en PROJ_SHARES

Haciendo uso de notepad y los comandos de UPDATE, SET y WHERE podemos


cambiar los valores dentro de una columna especifica luego de haberlos iniciado a un
valor constante al entrar data por primera vez en la columna creada. Luego de entrar las
instrucciones en NOTEPAD utilize cut and paste para pasarlas a SQL*Plus (Ver capítulo
2 :Uso de Notepad). El resultado se verá a continuación..

update workon
set rate = '6.00'
where essn = '123-45-6789';
update workon
set rate = '8.00'
where essn = '222-33-6666';
update workon
set rate = '10.00'
where essn = '321-52-0156';
update workon
set rate = '12.00'
where essn = '333-44-5555';
Capitulo 3: Consultas Para Una Tabla 15

update workon
set rate = '9.00'
where essn = '453-45-3453';
update workon
set rate = '7.00'
where essn = '666-88-4444';

Ya se han hecho los arreglos dentro de las columnas creadas, adjudicándole a cada
columna y fila el valor que le corresponde. Hemos modificado una tabla , creando dos
columnas y llenando sus valores sin alterar los valores de las demas columnas!!

Se modifican los
valores iniciales de
la columna de RATE
usando el Seguro
Social del empleado
como la condición
impuesta para
cambiar los valores

Figura 3.15 Uso UPDATE, SET, WHERE para cambiar valores en una columna

Ver próxima Figura.


Capitulo 3: Consultas Para Una Tabla 16

Figura 3.16 Tabla de Workon con valores en columnas creadas con ALTER TABLE

Uso de Operadores Aritmeticos entre columnas :

Usaremos las columnas de RATE y HOURS para calcular el sueldo bruto del
empleado con seguro social número 123-45-6789. El resultado de las columnas se
mostrará en una columna que llamaremos SUELDO_BRUTO. Esta columna no existe en
la tabla de WORKON, solo es creada con el propósito de guardar un resultado temporero
que responde a la consulta.

Nota:
El nombre nuevo de la columna se especifica en el SELECT luego de mencionar la
columna o las columnas entre parentesis, dejando uno o más espacios entre medio, sin
coma. En este caso las columnas a multiplicarse van a estar entre parentesis para poder
adjudicarle un nombre nuevo, de lo contrario no eran necesario los parentesis para
calculos aritméticos al menos que sean estrictamente necesarios en la fórmula algebraica.
Capitulo 3: Consultas Para Una Tabla 17

SQL*Plus hace el
computo entre columnas
y luego pone el
resultado en la columna
que nombró

Figura 3.17 Columna de SUELDO_BRUTO para producto de multiplicación entre columnas

De la misma forma podemos crear una columna de SUELDO_NETO para


restarle al SUELDO_BRUTO el descuento en acciones al empleado con Seguro Social
123-45-6789. Estas columnas serán creadas en el momento en que la consulta devuelve el
resultado de los cálculos aritméticos que deben hacerse para crear la columna de
SUELDO_BRUTO (multiplicación) y la columna de SUELDO_NETO (resta). No
formarán parte de la tabla que esta almacenada en la base de datos. Se le resta el
contenido de la columna de PROJ_SHARES a el resultado de (RATE * HOURS) que se
llama SUELDO_BRUTO. Este resultado se guardará en la columna de SUELDO_NETO.

Ver próxima página.


Capitulo 3: Consultas Para Una Tabla 18

Se resta el campo de PROJ_SHARES al


computo de HOURS * RATE. Note los
parentesis externos para poder nombrar la
columna donde reside el producto.

Figura 3.18 Uso del Operador Aritmético de RESTA entre columnas computadas

Operador LIKE

El operador LIKE es usado cuando queremos que las condiciones que se cumplan
incluyan ciertos valores que tienen alguna similitud. Usamos ‘wildcards’ o simbolos
representativos de ‘cualquier valor’ o ‘valores locos’ para representar una colección de
carácteres que no conocemos. Solo debemos especificar los caracteres que queremos
combinar junto con el simbolo de porciento “%”. Pueden usarse en cualquier posición. La
posición determina las filas que el “quierie” va a listar. Si se usa antes o despues de los
caracteres que conocemos, devuelve todos los datos que incluyan esos caracteres
específicos en el lugar especificado.

Tambien puede usarse el subrayado “__” (underscore) para especificar una


posición dentro de la palabra o valor que quiere extraer de la tabla. Representa un
caracter individual que no conocemos. En el ejemplo que presentamos a continuación
buscamos dentro de la tabla de Employee todas las ciudades que posean las letras
‘HA_T’. Solo debe devolver los valores de cuatro digitos donde la tercera letra pueda ser
cualquier caracter dentro de esa columna.
Capitulo 3: Consultas Para Una Tabla 19

Cualquier serie de
caracteres despues del
signo de porciento (%)
devolverá todos los
valores que terminen
con estos caracteres sin
importar el largo del
texto

Figura 3.19 Uso de Operador LIKE con ‘wildcards’

Nota
El valor que se especifica entre comillas sencillas despues del LIKE debe ser escrito en la
misma forma en que aparece en la tabla, ya sea mayúscula o minúscula. En este caso el
nombre de las ciudades esta todo en mayúscula. Por esta razón debemos especificar la
parte que conocemos del valor (los caracteres) en mayúscula.

Ver próxima página


Capitulo 3: Consultas Para Una Tabla 20

El subrayado determina
que solo ese caracter
puede tener cualquier
valor en la salida.

Figura 3.20 Uso de Operador LIKE con subrayado (“underscore”)

Operador IN

Una clausula que utiliza IN provee una forma concisa de frasear ciertas
condiciones . En vez de usar un operador lógico OR para extraer ciertas condiciones
específicas de una tabla, puede usar IN para simplificar y acortar la sintaxis utilizada.

La comparación usando IN debe ser solamente en casos donde el valor o los


valores sean iguales a los especificados con el operador IN. La Figura 3.22 muestra lo
mismo usando el OR para establecer los salarios que quiere listar. Note que es mas larga
la instrucción.

Ver Figuras 3.21 y 3.22.


Capitulo 3: Consultas Para Una Tabla 21

Se consideran solo los


valores especificados
despues del IN

Figura 3.21 Uso del Operador IN

Uso de OR requiere
que la instrucción sea
más larga

Figura 3.22 Lo mismo usando OR


Capitulo 3: Consultas Para Una Tabla 22

Sorteando la Salida de los Datos


El orden de las filas es irrelevante para el DBMS, pero para el usuario puede ser
importante la manera en que se presenta la data en la salida. Normalmente las filas se
muestran en el orden en que la data es entrada, pero pueden haber consultas que
provoquen que la salida sea al azar. Si el orden de la data es importante en la salida,
puede especificar una o más llaves o "sort keys" que sortean una o mas columnas en
orden ascendente o descendente.

ORDER BY se usa para sotear la data en forma ascendente por defacto. No es


necesario especificar ASC para orden ascendente despues de nombrar la columna
posterior a la clausula de ORDER BY. Si desea la salida de una columna en orden
descendente debe especificar DESC luego del nombre de la columna en la clausula.

Mostraremos un ejemplo utilizando una de las tablas de nuestra base de datos:

La data es ordenada por número de


proyecto de forma ascendente al
usar la clausula de ORDER BY

Figura 3.23 Uso de ORDER BY


Note que todos los números de proyecto estan sorteados en orden ascendente.
Tambien pueden sortearse en orden descendente añadiendo la clausula de DESC. Ver
Figura 3.24.
Capitulo 3: Consultas Para Una Tabla 23

Sorteo en orden descendente


por número de proyecto

Figura 3.24 Uso de ORDER BY y DESC

Podemos utilizar ORDER BY para múltiples sorteos utilizando mas de un "sort


key" al nombrar las columnas despues de la clausula de ORDER BY. En este ejemplo
ordenamos promero por numero de proyecto en orden ascendente y luego por numero de
seguro social del empleado en orden descendente.

Las llaves de sorteo deben mencionarse en orden de importancia dentro de las


instrucciones que le siguen a ORDER BY, para obtener el primer y segundo sorteo (o
más) en ese mismo orden .

Ver próxima Figura.


Capitulo 3: Consultas Para Una Tabla 24

Primeramente se ordena por


número de proyecto en orden
ascendente y luego por seguro
social en orden descendente

Figura 3.25 Uso de ORDER BY para sotear múltiples columnas

Funciones
SQL*Plus utiliza funciones para calcular promedios aritméticos, contar lineas,
sumar valores y encontrar valores mínimos y máximos en una serie de valores o datos de
una tabla.

Función Descripción
AVG Calcula el promedio aritmético de una serie
de datos en una columna
COUNT Cuenta el número de filas
MAX Determina el valor máximo dentro de una
serie de datos en una columna
MIN Determina un valor mínimo dentro de una
serie de datos en una columna
SUM Calcula el total de los valores en una
columna

Figura 3.26 Tabla de Funciones


Capitulo 3: Consultas Para Una Tabla 25

Función de COUNT

La función de COUNT se utiliza para contar el número de filas que resulta de una
condición especificada en la consulta.

La salida muestra que hay solo dos


filas o records donde el salario del
empleado es mayor de $45,000

Figura 3.27 Uso de la función de COUNT

Al usar COUNT puede especificar cualquiera de las columnas que compone la


tabla, pues solo devolverá la cantidad de lineas que cumplen con la condición de la
consulta expuesta.

Función de SUM

La función de SUM trabaja solo con columnas de tipo númerico. SUM, seguido del
nombre de una columna entre parentesis, totaliza los valores de toda la columna que se
especifica. Puede usarse en conjunto con count para saber cuántas filas devuelven el total
de la columna que hemos solicitado.

Note que en la Figura 3.28 se suma la cantidad de salarios de todos los empleados
de la tabla de Employees. En la Figura 3.29 se utiliza la función de COUNT para
determinar el número de empleados que tiene la tabla de EMPLOYEE ademas de la suma
de todos los salarios.
Capitulo 3: Consultas Para Una Tabla 26

Suma de todos los valores que


se encuentran en la columna
de SALARY dentro de la
tabla de EMPLOYEE

Figura 3.28 Uso de la función de SUM

Cuenta el número de filas que


se considerarán para sumar la
columna de SALARY

Figura 3.29 Uso de la funciónes COUNT y SUM


Capitulo 3: Consultas Para Una Tabla 27

Funciones MIN y MAX

Las funciones de MIN y MAX se usan para reconocer los valores minimos y
máximos dentro de una serie de datos de una columna en una tabla.

Valores mínimos y
máximos dentro de la
columna de SALARY

Figura 3.30 Uso de la funciónes MIN y MAX

Función de AVG.

La función de AVG devuelve el promedio aritmético de los valores que resultan


de la consulta en una columna especifica.

Nota:
Cuando usted utiliza cualquiera de las funciones excepto COUNT, los valores nulos no
cuentan para computos.

Ver próxima Figura.


Capitulo 3: Consultas Para Una Tabla 28

El promedio aritmético de
todos los salarios mayores
de $45,000 es listado en la
salida.

Figura 3.31 Uso de la función AVG

Uso del operador DISTINCT

El operador DISTINCT evita la redundancia de valores que no necesitan


detallarse mas de una vez. Un ejemplo de como puede usarse DISTINCT es para detallar
los diferentes titulos que puede tener un empleado en la tabla de Employee. Hay cuatro
(4) títulos, pero no nos interesa listar los mismos mas de una vez.

El operador DISTINCT puede combinarse con la función COUNT para saber


cuantos diferentes títulos hay entre los empleados, sin contar mas de una vez cada título.

El primer ejemplo utiliza solo el operador de distinct para detallar los diferentes
titulos o puestos que existen en la compañía (tabla EMPLOYEE). El segundo ejemplo
muestra como el COUNT utilizado con el DISTINICT puede contar el número de puestos
diferentes que existen.
Capitulo 3: Consultas Para Una Tabla 29

Distingue las diferentes


categorias de títulos que
existen en la columna de
TITLE, sin redundancia

Figura 3.32 Uso del operador DISTINCT

Cuenta la cantidad de títulos


diferentes que existen en la
tabla de EMPLOYEE

Figura 3.33 Uso del operador DISTINCT y la función COUNT


Capitulo 3: Consultas Para Una Tabla 30

Sub-Consultas ("Sub-Queries")
Las sub-consultas se utilizan cuando es necesario más de una consulta para
contestar la pregunta y obtener el resultado deseado. La llamada sub-consulta (sub-
querie) se evalua antes de evaluar el primer SELECT de la consulta. Debe residir en la
parte interior de la consulta principal.

Se pueden unir dos o mas queries en una consulta. Se conoce como anidar
consultas (nested queries) dentro de la consulta principal o exterior. Se utilizan parentesis
para enmarcar las consultas anidadas. La primera consulta (el primer SELECT) no
requiere parentesis.

Para mostrar la efectividad de una sub-consulta, primero creamos dos consultas y


luego las juntamos, anidando una dentro de la otra.

Este ejemplo selecciona empleados con un salario menor de $55,000 (primera


consulta) y calcula el promedio en salarios de todos los empleados; $41,375 (segunda
consulta).

Figura 3.33 Dos consultas


Capitulo 3: Consultas Para Una Tabla 31

Esta sub-consulta se crea con el propósito de conseguir el promedio en salarios de


todos los empleados de la tabla Employees. La otra parte de la consulta principal se
resuelve con operadores lógicos que especifican una condición en particular (que solo
tomemos en consideración los empleados que ganan menos de $55,000). En resumen,
buscamos los empleados que ganen menos de $55,000 pero que ganen más del salario
promedio de todos los empleados ($41,375).

El resultado de la consulta externa reune la data de ambas columnas seleccionadas


tablas y cumple con las condiciones expuestas (SALARY < 55,000 y AVG(SALARY). La
consulta interior (anidada) se interpretará primero, creando una tabla interna, transparente
al usuario que calcula el salario promedio de cada empleado. Esta tabla es utilizada por el
primer SELECT (consulta exterior) para cumplir con la condición final de la consulta.
Este resultado será listado en pantalla.

Las condiciónes expuestas con


operadores comparativos
determinan la consulta exterior
utilizando la consulta interior

La sub-consulta determina el
promedio de todos los salarios.

Figura 3.34 Ejemplo de Sub-consulta

La sub-consulta devuelve los salarios de los dos empleados que cumplen con las
condiciones expuestas en la consulta. Sus salarios estan entre el promedio de todos los
salarios y menos de $55000 que habiamos impuesto como limite.
Capitulo 3: Consultas Para Una Tabla 32

Nota:
Fue necesario utilizar el operador AND ya que SQL no accepta en su sintaxis la
comparación SALARY > AVG(SALARY). La consulta para buscar el promedio (AVG)
debe ser aparte ya que devuelve un solo valor y no es una expresión de grupo. Por tal
motivo creamos la sub-consulta para obtener un valor que se puede comparar y poder
utilizarlo con el operador lógico AND.

Uso de IN y los operadores lógicos en la sub-consulta

Si queremos conseguir todos los empleados que estan sobre el promedio de


salarios, se nos facilita la consulta. Aun asi, es necesario hacer una sub-consulta para
buscar el promedio de salarios de todos los empleados.

Figura 3.35 Empleados que estan sobre el promedio de salarios

Si buscamos un valor o valores que cumplan con las condiciones especificadas en


la sub-consulta, utilizamos el operador IN. Se especifica la columna donde se va a buscar
antes del IN, condicionado con WHERE al principio de la instrucción.
Capitulo 3: Consultas Para Una Tabla 33

La condición implica seleccionar


todos los salarios que sean iguales al
promedio de todos los salarios.

No hay valor que sea igual al


promedio de todos los salarios

Figura 3.36 Uso de IN en una sub-consulta

Note que no hay empleados que tengan un salario que sea idéntico al promedio de
todos los salarios. Por esta razon la consulta devuelve un mensaje de que no encontró
filas al correr las instrucciones (no rows selected).

Se puede utilizar cualquier operador lógico para entrar en una sub-consulta.

Como Agrupar Datos (Uso de GROUP y HAVING)


Al agrupar se crean grupos de filas que comparten características en comun. Si
agrupamos la tabla de Workon por número de proyecto, las filas creadas agrupan los
empleados por el campo de PROJNO. Si agrupamos por empleado, cada ESSN formará
una fila donde se puede sumar las horas trabajadas de cada empleado.

Cuando agrupamos filas o records, los calculos que se indican en el SELECT son
efectivos para todos los grupos que se especifican usando el GROUP BY. Es importante
mencionar en el SELECT solo las columnas que puedan ser incluidas al agrupar la data.
Si se incluye una columna que no es posible agrupar segun la condición expuesta,
SQL*Plus le dará un error y no procesará la consulta.
Capitulo 3: Consultas Para Una Tabla 34

Uso de GROUP BY

La utilidad del GROUP BY es agrupar la data por una columna específica, incluyendo
todos los records que pertenecen a un mismo grupo dentro de una fila específica.

Para agrupar es muy importante entender la lógica que envuelve resumir data por
filas específicas. Para poder resumir data por alguna columna es necesario utilizar la
función de SUM. De la misma forma, podemos incuir columnas calculadas para luego
agruparlas por grupos de filas.

En el ejemplo se suma primero la columna de horas (HOURS) en el SELECT. No


podemos agrupar si no específicamos lo que deseamos sumar en la columna primero para
luego romperlo por grupo. Luego con el GROUP BY especificamos la columna por la
cual deseamos agrupar los datos de la columna de horas. El resultado es romper los
totales de suma en la columna de horas por los grupos (o la fila individual) del seguro
social (ESSN) de cada empleado.

Suma las horas trabajadas


de los empleados

Agrupa la suma de las


horas por seguro social

Ordena el seguro social en


orden ascendente

Figura 3.37 Uso de GROUP BY con SUM


Capitulo 3: Consultas Para Una Tabla 35

Uso del HAVING

El comando de HAVING se aplica a grupos. Condiciona la salida de grupos de la


misma forma que WHERE restringe la salida valores. El WHERE no funciona cuando
estamos trabajando con grupos.

En resumen, el HAVING condiciona la salida de los grupos que se especifican


con el GROUP BY.

Totaliza la suma (SUM) de


horas y lo agrupa (GROUP)
por el número de seguro
social.

Con el HAVING se condiciona la


salida a empleados que totalizan
mas de 40 horas trabajadas

Figura 3.38 Uso de HAVING con GROUP BY y SUM

Note que solo dos empleados trabajaron más de 40 horas. La condicion creada por
el comando de HAVING hizo que la consulta cumpliera con unas restricciones impuestas
a los grupos creados con GROUP BY.

Uso de COUNT con el GROUP BY

Para contar el número de filas que componen los grupos especificados con
GROUP BY usamos la función de COUNT. La consulta nos devolverá el número de
projectos en que trabajó cada empleado ya que cada empleado tiene una cantidad de
horas trabajadas por proyecto.
Capitulo 3: Consultas Para Una Tabla 36

Solo tenemos que agrupar las horas trabajadas por empleado (seguro social) como
en el ejemplo anterior, y contar esas filas con COUNT.

Se determina el total de horas


(SUM) y el número de proyectos
en el cual trabajó cada empleado
contando el número de veces que
aparece el mismo seguro social en
la tabla de WORKON (COUNT)

Se agrupa y ordena por seguro


social

Figura 3.39 Uso de COUNT, SUM y GROUP BY

Uso de COUNT, GROUP BY y HAVING

Podemos utilizar el HAVING para limitar o condicionar la salida de grupos que


resulten en el COUNT. Especificamos el número o la condición de las filas que queremos
desplegar en pantalla deacuerdo a el numero de filas que resulte de cada grupo con el
COUNT. Veamos el siguiente ejemplo.

Ver Figura 3.40.


Capitulo 3: Consultas Para Una Tabla 37

Se limita la salida a los


empleados que hayan
trabajado en 2 o más
proyectos

Figura 3.40 Uso de COUNT, GROUP BY y HAVING CON OPERADOR " >= "

Note que solo los empleados que hayan trabajado en más de 2 proyectos se listan
en la salida. Recuerde que cada horario pertenece a un proyecto diferente para cada
empleado, por esto no es necesario especificar el número de proyecto en la consulta. Solo
queremos saber cuantas instancias de horas trabajadas ha realizado cada empleado dentro
de la tabla de WORKON.

Valores Nulos (NULL) y No-Nulos (NOT NULL)


Para encontrar valores nulos dentro de una tabla usamos la clausula WHERE
<nombre de la columna > IS NULL.

Por el contrario, si lo que deseamos seleccionar son los valores que no son nulos
utilizamos la clausula WHERE <nombre de la columna> IS NOT NULL.

No se utiliza el operador aritmetico '=' para la consulta relacionada con valores


nulos, aunque la sintaxis parece la adecuada.

Podemos utilizar la tabla de Employee que tiene un valor nulo para mostrar el uso
de IS NULL .
Capitulo 3: Consultas Para Una Tabla 38

El número de seguro social del


supervisor SUPERSSN es nulo
para el El nEl número
empleado de
con seguro
supervisor
social 333-44-5555 SSN es un
valor nulo

Figura 3.41 Uso de IS NULL

Como puede ver, el empleado Samir Johnson no tiene supervisor asignado en la


columna de Superssn (Seguro Social del supervisor). Es el unioco empleado que tiene
valores nulos en esta columna. (Ver tabla EMPLOYEES).
Capitulo 3: Consultas Para Una Tabla 39

Repaso Capítulo 3
En el Capítulo 3 usted aprendió a utilizar clausulas y operadores necesarios para crear
consultas para una tabla. Algunos ya se habían discutido en el capítulo 2. El siguiente
listado le servirá para repasar las clausulas y los operadores que se presentaron en este
capítulo.

Operador o Clausula Descripción

*, /, +, - Operadores aritméticos comparativos

AND, OR, NOT Operadores lógicos

BETWEEN Especifica una serie de


valores entre dos valores

ALTER TABLE Para alterar la estructura de


una tabla

ADD Añade columnas a una tabla luego de


utilizar alter table

MODIFY Modifica la estructura de una


columna

UPDATE Comando para actualizar datos de


una tabla

SET Clausula usada para modificar los


valores de una columna

LIKE Especifica un patrón de caracteres


para satisfacer una condición

IN Encuentra valores dentro de un


grupo de valores especificados
por una condición
Capitulo 3: Consultas Para Una Tabla 40

ORDER BY Ordena la salida de una consulta en


un orden específico de
columnas

ORDER BY Ordena salida de columna en orden


<nombre de columna> DESC descendiente

AVG, COUNT, MIN, MAX, SUM Funciones utilizadas para columnas

DISTINCT Elimina la redundancia y asegura la


salida de valores unicos
GROUP BY Agrupa filas basadas en una columna
especifica

HAVING Limita las filas de los grupos


especificados con GROUP BY

Ejercicios de Repaso:
Consultas para una sola tabla.

Utilizando SQL*Plus prepare consultas para resolver los siguientes ejercicios:

1- Prepare una consulta que determine el seguro social y número de proyecto de los
empleados que trabajan en los proyectos 105 y 140.

2- Liste el nombre y numero de seguro social de los empleados cuyo salario este
entre $30,000 y $50,000.

3- Añada una columna a la tabla de WORKON llamada SEGSOC que contenga el


porciento deducible del seguro social por hora trabajada (.075).

4- Calcule en una columna llamada INGRESO NETO el salario restando el seguro


social y el descuento del plan del salario bruto.

5- Calcule el salario mensual de cada empleado nombrando una columna donde


resida el producto del cálculo a la columna de SALARY. Se debe llamar
MONTHLY SALARY.(SALARY es el salario anual).

6- Subió el descuento para el Seguro Social. Modifique el contenido de la columna


de SEGSOC para que contenga .085.
Capitulo 3: Consultas Para Una Tabla 41

7- La aportación para acciones que se le descuenta a los empleados en cada proyecto


debe subir a $15.00 solo para aquellos empleados que trabajaron más de 30 horas
en cada proyecto.

8- Agrupe los empleados por el departamento en que trabajan y determine cuánto se


gasta anualmente en salarios dentro de cada departamento. Ordene por número de
proyecto.

9- Haga el mismo ejercicio ocho pero determine solo el gasto del departamento 105
y 140 en la salida.

10- Haga una consulta que determine el número de proyectos que existen en la tabla
de WORKON. Solo debe especificar la columna de PROJNO y el número de
proyectos donde hubo empleados trabajando. (Haga uso de COUNT y
DISTINCT)