Está en la página 1de 38

CONSULTAS CON FIREBIRD SQL

DE PRINCIPIANTE A EXPERTO

Walter R. Ojeda Valiente


Asuncin, Paraguay, Septiembre de 2012

INTRODUCCIN

El Lenguaje de Consulta Estructurado (SQL = Structured Query Language) es el


lenguaje estndar para trabajar y consultar Bases de Datos y es muy completo y muy
poderoso, por ese motivo hay muchas implementaciones del mismo (Firebird SQL,
MySQL, PostgreSQL, SQL Server y un largo etctera).

El lenguaje Firebird SQL frecuentemente se divide en tres secciones:


- Lenguaje de manipulacin de datos (DML = Data Manipulation Language)
- Lenguaje de definicin de datos (DDL = Data Definition Language)
- Instrucciones PSQL (Programming SQL)

En este documento solamente veremos los dos primeros, ya que la programacin


usando el lenguaje SQL de Firebird ser tema de otro documento.

DML consiste de los cuatro grandes en SQL, las instrucciones: Select, Insert,
Update y Delete (Consultar, Insertar, Actualizar y Borrar).

DDL consiste de Create, Alter y Drop (Crear, Modificar y Eliminar)

En la gran mayora de los captulos se usarn las instrucciones DML aunque


espordicamente se usarn tambin las instrucciones DDL, las cuales son mucho ms
fciles de entender y aprender a utilizar.

REQUISITOS

Necesitars tener instaladas las herramientas administrativas del Firebird o un


programa de administracin grfica, como el Flame Robin (es gratis):

http://www.flamerobin.org/

o el EMS SQL Manager (recomendado), el cual tiene una versin Lite gratuita que
puedes descargar desde:

http://www.sqlmanager.net/en/products/ibfb/manager/download

LO QUE NO CUBRE ESTE DOCUMENTO

Las sintaxis de las distintas instrucciones no son mostradas, si deseas conocerlas


puedes descargar y leer un documento muy bueno y muy completo y adems gratuito:
Firebird 2.5 Language Reference Update

http://www.firebirdsql.org/file/documentation/reference_manuals/reference_material/Fir
ebird-2.5-LangRef-Update.pdf
BREVE INTRODUCCIN AL EMS SQL MANAGER

Para que todo sea ms claro y ms fcil de entender despus de cada instruccin
se mostrar una captura de pantalla obtenida del programa EMS SQL Manager.

1. Para escribir instrucciones:

Debes hacer click sobre el botn que muestra la flecha roja

2. Vers una ventana en la cual podrs escribir tus instrucciones

En esta ventana podrs escribir todas tus consultas

3. Para ejecutar dichas instrucciones debes hacer click sobre el botn Execute

Asegrate de escribir la palabra CLIENTESSSSSS, para que se vea el error

4. Si hay algn error, lo vers en la parte inferior de la ventana


La tabla CLIENTESSSSSS no existe, por eso te muestra el mensaje Table unknown
5. Sin embargo, sin el vez de la palabra CLIENTESSSSSS escribes la palabra
CLIENTES todo estar ok y vers el resultado en la pestaa Results

Aqu se ven los datos de los clientes. Haz click sobre la columna CLI_IDENTI para ordenarlos por esa columna

6. Para saber que tan eficiente fue lo que escribiste, debes hacer click sobre la
pestaa Performance Analysis
En este ejemplo la performance fue muy mala, luego veremos como mejorarla

Aunque el programa EMS SQL Manager es mucho ms complejo, por ahora esto
es todo lo que se necesita saber de l.
CAPITULO 1. TRABAJANDO CON UNA SOLA TABLA

En este captulo se muestra como consultar datos que se encuentran en una sola
tabla. Es fundamental para todo lo que viene despus porque las consultas posteriores se
basan en lo que se ver aqu.

Ejercicio N 1
Mostrar un mensaje

El mensaje a mostrar debe estar rodeado por apstrofos (tambin conocidos como comillas simples)

En Firebird toda instruccin SELECT debe tener la clusula FROM y el nombre


de una tabla. Como en este caso se desea mostrar un mensaje entonces la tabla
correspondiente debe tener una fila y solamente una fila. Cualquier tabla que tenga una
sola fila servir perfectamente. Los programadores de Firebird suelen usar
RDB$DATABASE porque es una tabla que se encuentra en todas las Bases de Datos (es
una tabla interna o sea creada automticamente por el Firebird) y adems se garantiza
que siempre tendr una fila y nada ms que una, pero cualquier otra tabla que tenga una
sola fila servira, por ejemplo:
SELECT Puedes si piensas que puedes FROM EMPRESA

Tambin funcionara perfectamente siempre y cuando la tabla EMPRESA


tenga una sola fila.

Para evitarte complicaciones y tener una vida sencilla, lo mejor es que siempre
utilices la tabla RDB$DATABASE la cual tendrs siempre disponible en cualquier
instalacin del Firebird.

Ejercicio N 2
Mostrar una operacin aritmtica

Por legibilidad es aconsejable separar con espacios los operandos y los operadores

Despus de ejecutar la consulta anterior se obtendr:

El nombre de la columna es SUBSTRACT (resta) y el resultado de la operacin aritmtica es 21


Ejercicio N 3
Mostrar un mensaje y una operacin aritmtica

Las columnas se separan con comas

Despus de ejecutar la consulta anterior se obtendr:

El texto y el resultado aparecen en columnas diferentes

Donde aparecen dos columnas, una que muestra la constante de tipo texto (el
mensaje que est rodeado por apstrofos) y otra que muestra el resultado de la
operacin aritmtica.
Un concepto importante a recordar es que los SELECT no solamente pueden
retornar filas de una tabla, tambin pueden retornar constantes numricas, constantes
alfanumricas, frmulas y el resultado de funciones.

Ejercicio N 4
Mostrar todas las filas y todas las columnas de una tabla

Para esto se utiliza el asterisco, al cual en SQL se lo suele llamar star o estrella

SELECT * FROM CLIENTES

El ancho de las columnas puede cambiarse usando el mouse


Lo recomendable es no utilizar el asterisco sino escribir los nombres de las
columnas separadas por comas, as:

SELECT CLI_CODSUC, CLI_IDENTI, CLI_NOMBRE FROM CLIENTES

Por qu? porque es ms claro y ms entendible de la segunda forma. Adems,


generalmente es ms rpido. Si la tabla tiene 20 columnas, de las cuales se necesitan
solamente 3, al escribir el asterisco se estarn descargando las 20 columnas y eso tarda
ms que descargar solamente 3.

Por lo tanto, aunque se escribe muchsimo menos, se aconseja no usar el


asterisco. Se considera muy mala prctica emplearlo en los programas para los usuarios
finales.

Ejercicio N 5
Escribiendo en maysculas y en minsculas

Para el Firebird no tiene importancia como se escriben los nombres de los


comandos, de las columnas, de las tablas y de las clusulas. Todas las siguientes
instrucciones son equivalentes.

SELECT CLI_CODSUC, cli_identi, CLI_Nombre From CLIENTES


SELECT cli_codsuc, CLI_identi, cli_nombre FROM clientes
SELECT ClI_CoDsUc, CLI_IDENTI, cli_Nombre from CLIENTES

Ejercicio N 6
Alias de las columnas
Por defecto, cuando se muestra el resultado de una consulta el nombre de las
columnas es el que tienen en su respectiva tabla, sin embargo si se desea o si se necesita
se pueden cambiar esos nombres.

SELECT
CLI_CODSUC AS CodigoSucursal,
CLI_IDENTI AS Identificador ,
CLI_NOMBRE AS Nombre del Cliente
FROM
CLIENTES

Observa que Nombre del Cliente se escribe con comillas dobles.


Normalmente el alias se muestra en maysculas, sin importar como se lo haya
escrito en el SELECT pero cuando se lo rodea por comillas se lo muestra exactamente
como se lo escribi. El Nombre del Cliente tiene espacios y est en una mezcla de
maysculas y minsculas.

Ejercicio N 7
Concatenando columnas

Agregndole una columna a otra se llama concatenacin y con esto se consigue


que dos o ms columnas se comporten como si fueran una sola.

SELECT
DEP_CODIGO || '***' || DEP_NOMBRE AS CODIGONOMBRE
FROM
DEPARTAMENTOS

El smbolo utilizado para la concatenacin es el | | (dos barras verticales juntas)


Cdigos, tres asteriscos, y nombres de los departamentos paraguayos

En este caso a la columna DEP_CODIGO se le adicionaron tres asteriscos y a


stos se les adicion la columna DEP_NOMBRE dando como resultado una sola
columna llamada CODIGONOMBRE.

Ejercicio N 8
Al concatenar columnas el Firebird automticamente convierte los tipos

SELECT
CLI_IDENTI || '===' || CLI_NOMBRE
FROM
CLIENTES
Cdigos, tres smbolos igual y nombres de los clientes

Aunque CLI_IDENTI es de tipo numrico y CLI_NOMBRE es de tipo carcter,


al concatenarlos el Firebird automticamente convirti a CLI_IDENTI a carcter.

Como a la columna resultante no se le asign manualmente un alias entonces se


le asign automticamente el nombre de CONCATENATION.

Ejercicio N 9
Se puede fcilmente conocer el nombre del usuario, la fecha y la hora de la
computadora

SELECT
CURRENT_USER,
CURRENT_DATE,
CURRENT_TIME
FROM
RDB$DATABASE

CURRENT_USER, CURRENT_DATE y CURRENT_TIME son algunas de las variables de contexto

Variables de contexto
Se conoce como variables de contexto a aquellas que el Servidor las tiene
siempre disponibles. Las que pueden ser utilizadas en los SELECTs son:

CURRENT_CONNECTION
Cada conexin con una Base de Datos Firebird tiene un nmero

CURRENT_DATE
Devuelve la fecha que tiene el Servidor

CURRENT_ROLE
Los usuarios pueden pertenecer a un rol o no. Si pertenecen a un rol esta
variable de contexto mostrar el nombre de ese rol. Si no pertenecen a un
rol entonces mostrar la palabra NONE

CURRENT_TIME
Devuelve la hora que tiene el Servidor

CURRENT_TIMESTAMP
Devuelve la fecha y la hora del Servidor

CURRENT_TRANSACTION
Cada transaccin tiene un nmero nico que la identifica

CURRENT_USER
Nombre del usuario actualmente conectado a la Base de Datos

En un Stored Procedure podras utilizarlas para escribir algo como:

if (CURRENT_USER = ADMINISTRADOR) THEN


DELETE FROM CLIENTES WHERE CLI_IDENTI = 17
else
EXCEPTION E_SOLO_ADMINISTRADOR_PUEDE_BORRAR

Ejercicio N 10
Para ver solamente las primeras filas de una tabla

SELECT
FIRST 6
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC
FROM
CLIENTES

Muestra solamente las primeras 6 filas. Esta es la forma antigua de obtener este resultado

Ejercicio N 11
Para ver algunas filas, despus de saltearse las primeras

SELECT
FIRST 6 SKIP 10
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC
FROM
CLIENTES

Muestra 6 filas despus de saltar las 10 primeras (o sea, las nmero: 11, 12, 13, 14, 15 y 16). Es la forma antigua

Ejemplo N 12
La forma moderna de ver las primeras filas

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC
FROM
CLIENTES
ROWS
1 TO 6

El uso de la clusula ROWS TO es la forma moderna de obtener el mismo


resultado que en el Ejercicio N 10
Ejemplo N 13
La forma moderna de ver una o varias filas, sin empezar por la primera fila

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC
FROM
CLIENTES
ROWS
11 TO 16

El uso de la clusula ROWS TO es la forma moderna de obtener el mismo


resultado que en el Ejercicio N 11

Ejercicio N 14
Usando la funcin EXTRACT() para obtener los componentes de una fecha

SELECT
CLI_IDENTI,
CLI_NOMBRE,
EXTRACT(DAY FROM CLI_FECNAC),
EXTRACT(MONTH FROM CLI_FECNAC),
EXTRACT(YEAR FROM CLI_FECNAC)
FROM
CLIENTES

Con la funcin EXTRACT() se pueden obtener el Da, el Mes y el Ao de una fecha

En lugar de los nombres de columnas EXTRACT, EXTRACT1 y EXTRACT2 se pueden usar


alias para que sea ms entendible, algo como:

SELECT
CLI_IDENTI,
CLI_NOMBRE,
EXTRACT(DAY FROM CLI_FECNAC) AS DIA,
EXTRACT(MONTH FROM CLI_FECNAC) AS MES,
EXTRACT(YEAR FROM CLI_FECNAC) AS ANO
FROM
CLIENTES
Ejemplo N 15
Se muestra el uso del CASE simple
SELECT
CLI_IDENTI,
CLI_NOMBRE,
CASE CLI_ESTCIV
WHEN 'S' THEN 'Soltera/o'
WHEN 'C' THEN 'Casada/o'
WHEN 'E' THEN 'Separada/o'
WHEN 'D' THEN 'Divorciada/o'
WHEN 'V' THEN 'Viuda/o'
END
FROM
CLIENTES

Usando el CASE podemos leer mejor el Estado Civil de cada cliente

En el CASE simple se evala una condicin, siempre la misma. En este ejemplo


se trata de la columna CLI_ESTCIV la cual puede contener S, C, E, D, V. De
acuerdo a su contenido se muestra el Estado Civil correspondiente.

Desde luego que a la columna CASE se le puede dar un alias, para que sea ms
entendible, algo como:

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CASE CLI_ESTCIV
WHEN 'S' THEN 'Soltera/o'
WHEN 'C' THEN 'Casada/o'
WHEN 'E' THEN 'Separada/o'
WHEN 'D' THEN 'Divorciada/o'
WHEN 'V' THEN 'Viuda/o'
END AS ESTADOCIVIL
FROM
CLIENTES

Ejercicio N 16
Se muestra el uso del CASE de bsqueda

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CASE
WHEN CLI_SEXOXX = 'F' THEN 'Femenino'
WHEN CLI_SEXOXX = 'M' THEN 'Masculino'
ELSE 'Desconocido'
END
FROM
CLIENTES

En el caso del CASE de bsqueda las condiciones pueden variar, o sea que
podra haberse evaluado otra columna, no solamente la columna CLI_SEXOXX

Aqu todos los clientes son de sexo femenino

El CASE de bsqueda es equivalente a usar varios IF ELSE IF y es similar


a la construccin CASE ENDCASE del lenguaje Visual FoxPro.

Ejercicio N 17
Uso de la clusula WHERE para imponer condiciones

Solamente las filas que cumplan con la condicin impuesta en el WHERE se


mostrarn. Siempre debe escribirse a continuacin de la clusula FROM.
SELECT
CLI_IDENTI,
CLI_NOMBRE
FROM
CLIENTES
WHERE
CLI_IDENTI <= 5

Solamente se muestran los clientes cuyo identificador CLI_IDENTI es menor o igual que 5

Ejercicio N 18
Usando la clusula WHERE con el operador AND

El operador AND se utiliza cuando se requiere que se cumplan dos o ms


condiciones.

SELECT
CLI_IDENTI,
CLI_NOMBRE
FROM
CLIENTES
WHERE
CLI_IDENTI <= 20 AND
CLI_ESTCIV = 'C'

Muestra los clientes cuyo Identificador es menor o igual que 20 y su Estado Civil es C (o sea: casado)

Ejercicio N 19
Usando la clusula WHERE con el operador OR

El operador OR se utiliza cuando se requiere que se cumpla al menos una de las


dos condiciones

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_ESTCIV
FROM
CLIENTES
WHERE
CLI_IDENTI <= 5 OR
CLI_ESTCIV = 'C'

Estos clientes tienen el Identificador CLI_IDENTI menor o igual que 5 o el Estado Civil = C (casada/o)

Ejercicio N 20
Usando la clusula WHERE con la palabra clave IN

En lugar de estar usando el operador OR varias veces suele ser preferible usar la
palabra clave IN

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_ESTCIV
FROM
CLIENTES
WHERE
CLI_ESTCIV IN (C, D, V)

Es equivalente a escribir:

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_ESTCIV
FROM
CLIENTES
WHERE
CLI_ESTCIV = C OR
CLI_ESTCIV = D OR
CLI_ESTCIV = V
Pero la segunda forma es ms larga y por lo tanto ms propensa a errores. Por
ese motivo, en lugar de usar varios OR es preferible usar un solo IN.
Todos los clientes cuyo Estado Civil es C, D o V

Ejercicio N 21
Usando la clusula WHERE con el operador NOT y la palabra clave IN

El operador NOT sirve para negar una condicin.

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_ESTCIV
FROM
CLIENTES
WHERE
CLI_ESTCIV NOT IN ('S', 'V')

Todos los clientes cuyo Estado Civil no es ni S ni V

Ejercicio N 22
Condiciones ms complejas en la clusula WHERE
Las clusulas WHERE pueden llegar a ser muy complejas si se combinan varios
operadores AND y OR

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_ESTCIV,
CLI_NACION
FROM
CLIENTES
WHERE
CLI_ESTCIV = 'C' AND
CLI_NACION = 'PY'

Clientes cuyo Estado Civil es C (casado) y su nacionalidad es Paraguaya

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_ESTCIV,
CLI_NACION
FROM
CLIENTES
WHERE
CLI_ESTCIV = 'D' AND
(CLI_NACION = 'PY' OR
EXTRACT(MONTH FROM CLI_FECNAC) >= 9)

Clientes divorciados y que son paraguayos o nacieron en Septiembre o despus

Cuando se trata de una condicin compleja lo ms recomendable es siempre usar


parntesis para asegurarse que el orden de evaluacin sea el deseado.

Por ejemplo, en este caso:

Condicion1 AND Condicion2 OR Condicion3

cmo lo evala el Firebird, como:


(Condicion1 AND Condicion2) OR Condicion3
o como:
Condicion1 AND (Condicion2 OR Condicion3)
?
Para evitar confusiones y errores difciles de detectar es mejor usar siempre parntesis
Ejercicio N 23
Usando criterios numricos en la clusula WHERE
SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_SALINI
FROM
CLIENTES
WHERE
CLI_SALINI >= 800000

Aqu, se obtendrn datos de todos los clientes cuyo saldo inicial sea mayor o
igual que 800.000

Todos estos clientes tienen un saldo inicial que es mayor o es igual a 800.000

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_SALINI
FROM
CLIENTES
WHERE
CLI_SALINI >= 800000 AND
CLI_SALINI <= 850000

Todos estos clientes tienen un saldo inicial que est entre 800.000 y 850.000, ambos incluidos

Alternativamente, se puede usar la palabra BETWEEN para indicar que el valor


de una columna debe encontrarse entre otros dos valores, ambos incluidos:

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_SALINI
FROM
CLIENTES
WHERE
CLI_SALINI BETWEEN 800000 AND 850000

Los dos ltimos SELECTs son equivalentes, pero en el primero se usaron los operadores de comparacin y
en el segundo se us BETWEEN.

Ejercicio N 24
Usando la palabra IN en criterios numricos

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_SALINI
FROM
CLIENTES
WHERE
CLI_SALINI IN (700000, 720000, 750000)

Todos los clientes cuyo saldo inicial es 700.000 o es 720.000 o es 750.000

Ejercicio N 25
Obteniendo filas que tienen valores nulos

En el lenguaje SQL la palabra nulo significa desconocido

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC
FROM
CLIENTES
WHERE
CLI_FECNAC IS NULL

De ninguno de estos clientes se conoce la fecha de nacimiento

Ejercicio N 26
Obteniendo filas que no tienen valores nulos

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC,
CLI_SALINI
FROM
CLIENTES
WHERE
CLI_FECNAC IS NOT NULL AND
CLI_SALINI >= 800000

De todos estos clientes se conoce su fecha de nacimiento y su saldo inicial es mayor o igual que 800.000

Ejercicio N 27
Usando comodines en las cadenas alfanumricas

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC,
CLI_SALINI
FROM
CLIENTES
WHERE
CLI_NOMBRE LIKE 'MAR%'

El smbolo de porcentaje significa desde aqu puede encontrarse cualquier


carcter

Todos los clientes cuyos nombres empiezan con las letras MAR

LIKE MAR% significa: debe empezar con las letras MAR y despus
continuar con cualesquiera otros caracteres

Ejercicio N 28
Usando comodines en las cadenas alfanumricas

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC,
CLI_SALINI
FROM
CLIENTES
WHERE
CLI_NOMBRE LIKE '%K%'

Todos los clientes que tienen una letra K en sus nombres

LIKE %K% significa: debe empezar con cualesquiera caracteres, tener una
letra K y continuar con cualesquiera otros caracteres. En la prctica eso significa:
que tenga una letra K en alguna parte (al principio, en el medio, o al final)

Ejercicio N 29
Usando comodines en las cadenas alfanumricas para excluir caracteres

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC,
CLI_SALINI
FROM
CLIENTES
WHERE
CLI_NOMBRE NOT LIKE '%E%'

Solamente estos clientes no tienen la letra E en sus nombres

Ejercicio N 30
Usando comodines en las cadenas alfanumricas

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC,
CLI_SALINI
FROM
CLIENTES
WHERE
CLI_NOMBRE LIKE '_O%'

Todos los clientes cuya primera letra puede ser cualquiera, la segunda una O y las dems cualesquiera

El guin bajo significa: aqu puede haber cualquier carcter, pero solamente un
carcter. Por lo tanto si se necesitan 2 se escribiran 2 guiones bajo. Y si se necesitan 3
entonces se escribiran 3 guiones bajos, y as sucesivamente.

Ejercicio N 31
Usando comodines en las cadenas alfanumricas
SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC,
CLI_SALINI
FROM
CLIENTES
WHERE
CLI_NOMBRE LIKE '__L%'

Todos los clientes cuyas dos primeras letras pueden ser cualesquiera y la tercera es una L

Se usa un guin bajo para indicar que en esa posicin puede existir cualquier
carcter y un smbolo de porcentaje para indicar que en esa posicin y en las siguientes
puede existir cualquier carcter.

Ejercicio N 32
Mostrando los datos ordenados

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC,
CLI_SALINI
FROM
CLIENTES
ORDER BY
CLI_NOMBRE

Todos estos clientes estn ordenados por sus respectivos nombres

Tambin se puede usar el nmero de la columna en la clusula ORDER BY y se


obtendr el mismo resultado

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC,
CLI_SALINI
FROM
CLIENTES
ORDER BY
2

De esta manera se escribe menos pero es menos legible, al menos al principio,


cuando te acostumbres ser lo mismo.

Ejercicio N 33
Mostrando los datos ordenados en forma descendente

A veces nos puede interesar que el orden sea de mayor a menor (o sea, en forma
descendente)

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECINI,
CLI_SALINI
FROM
CLIENTES
ORDER BY
CLI_NOMBRE DESC

Los nombres de los clientes aparecen en forma descendente porque se us la palabra DESC

Al igual que al ordenar en forma ascendente, cuando se ordena de forma


descendente tambin se puede usar el nmero de la columna, si as se desea.

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECINI,
CLI_SALINI
FROM
CLIENTES
ORDER BY
2 DESC

Se escribe menos usando los nmeros de las columnas en lugar de sus nombres,
pero es ms difcil de entender al principio.

Se puede ordenar por cualquier columna, sea sta de tipo carcter, de tipo
numrico, de tipo fecha, etc. La nica excepcin son las columnas de tipo BLOB, no se
puede ordenar por ellas.

Ejercicio N 34
Ordenando por varias columnas

Cuando se desea ordenar por varias columnas, se las separa con comas.

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC,
CLI_SALINI
FROM
CLIENTES
ORDER BY
CLI_SALINI,
CLI_NOMBRE

Estos clientes estn ordenados primero por Saldo Inicial y luego por Nombres

Al igual que antes, se pueden usar los nmeros de las columnas en lugar de sus
nombres:

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC,
CLI_SALINI
FROM
CLIENTES
ORDER BY
4,
2

Ejercicio N 35
Ordenando por varias columnas, mezclando ascendentes y descendentes

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC,
CLI_SALINI
FROM
CLIENTES
ORDER BY
CLI_SALINI ASC,
CLI_NOMBRE DESC

Los clientes estn ordenados ascendentemente por Saldo Inicial y descendentemente por Nombre

Como ya sabes, puedes usar los nmeros de las columnas en lugar de los
nombres de las columnas, si as lo deseas.

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC,
CLI_SALINI
FROM
CLIENTES
ORDER BY
4 ASC,
2 DESC

Ejercicio N 36
Combinando las clusulas WHERE y ORDER BY

Una consulta SQL no est limitada a usar solamente la clusula WHERE o la


clusula ORDER BY, puedes usar ambas en la misma instruccin si as lo deseas.

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC,
CLI_SALINI
FROM
CLIENTES
WHERE
CLI_NOMBRE LIKE 'C%'
ORDER BY
CLI_NOMBRE

Todos los clientes cuyo nombre empieza con la letra C, ordenados alfabticamente

Desde luego que no es necesario que la columna del WHERE sea la misma que
la columna del ORDER BY.

Podemos probar sustituyendo en el SELECT anterior las palabras:


ORDER BY
CLI_NOMBRE

por las palabras:


ORDER BY
CLI_IDENTI

Todos los clientes cuyo nombre empieza con la letra C, ordenados por sus identificadores

Ejercicio N 37
Respondiendo preguntas

Muchas veces necesitars responder preguntas basadas en quin, cundo,


dnde, qu, cmo?, etc.

Con lo aprendido hasta aqu ya podrs responder a muchas de ellas, por ejemplo:

Cul es el cliente con mayor Saldo Inicial?


SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC,
CLI_SALINI
FROM
CLIENTES
ORDER BY
CLI_SALINI DESC
ROWS
1

Silvia Verburg es el cliente que tiene el mayor Saldo Inicial

Fjate que se us la clusula ROWS para obtener solamente una fila, si no se la


hubiera escrito se habran obtenido los datos de todos los clientes, no solamente del
cliente con mayor Saldo Inicial.

Si deseas obtener los datos de los 3 clientes con mayor Saldo Inicial entonces
podras escribir:

ROWS
1 TO 3

Y para obtener los datos de los 5 clientes con menor Saldo Inicial:

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC,
CLI_SALINI
FROM
CLIENTES
ORDER BY
CLI_SALINI
ROWS
1 TO 5

Supongamos que ahora te interesa obtener los datos del segundo cliente con
mayor Saldo Inicial, entonces:

SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC,
CLI_SALINI
FROM
CLIENTES
ORDER BY
CLI_SALINI DESC
ROWS
2 TO 2

Este es el cliente con el segundo mayor Saldo Inicial

Ejercicio N 38
Agrupando datos

Muchas veces no quieres los datos en bruto sino que los quieres tener agrupados
por alguna condicin. Para eso sirve la clusula GROUP BY.

Por ejemplo, para conocer todas las nacionalidades de nuestros clientes:

SELECT
CLI_NACION
FROM
CLIENTES
GROUP BY
CLI_NACION

Las nacionalidades de nuestros clientes (AR = Argentina, PY = Paraguay)

Ejercicio N 39
Agrupando datos y contndolos

En el ejercicio anterior pudimos conocer las nacionalidades de nuestros clientes,


pero no sabamos cuantos hay de cada nacionalidad.

SELECT
CLI_NACION,
COUNT(*)
FROM
CLIENTES
GROUP BY
CLI_NACION
Ahora podemos saber cuantos clientes tenemos de cada nacionalidad

La funcin agregada COUNT(*) nos devuelve la cantidad de filas que hay en


cada uno de los grupos y el asterisco le dice al Servidor que cuente todo lo que est en
cada grupo.

Como en este caso las filas se agrupan segn la columna CLI_NACION


entonces obtenemos la cantidad de filas que corresponden a cada nacin. O sea que hay
5 clientes que nacieron en Argentina y 27 clientes que nacieron en Paraguay.

Ejercicio N 40
Poniendo condiciones (filtros) a los datos agrupados

Cuando usamos datos en bruto las condiciones de cuales datos queremos obtener
las colocamos a continuacin de la clusula WHERE. Sin embargo, no podemos hacer
eso mismo con los datos agrupados ya que escribir algo como esto:

SELECT
CLI_NACION,
COUNT(*)
FROM
CLIENTES
WHERE
COUNT(*) >= 10
GROUP BY
CLI_NACION

generar un error por qu? Porque la clusula GROUP BY siempre se escribe


despus que la clusula WHERE y por lo tanto el Firebird an no conoce el valor de
COUNT(*) cuando est en la clusula WHERE.

Cul es la solucin a este problema? Usar la clusula HAVING, la cual pone


condiciones a los datos agrupados. As como la clusula WHERE pone condiciones a
los datos en bruto, la clusula HAVING pone condiciones a los datos agrupados.

SELECT
CLI_NACION,
COUNT(*)
FROM
CLIENTES
GROUP BY
CLI_NACION
HAVING
COUNT(*) >= 10

Cuando el Firebird encuentra la clusula HAVING ya conoce el valor de


COUNT(*) y por lo tanto puede filtrar los datos.
Los clientes de Paraguay son 10 ms de 10

Ejercicio N 41
Sumando los valores de una columna

Es muy frecuente que debamos sumar los valores de una columna para hallar el
total de esa columna. Lo podemos conseguir rpidamente usando la funcin SUM()

SELECT
CLI_NACION,
SUM(CLI_SALACT)
FROM
CLIENTES
GROUP BY
CLI_NACION

El total que nos adeudan nuestros clientes, agrupados por nacionalidad

Ejercicio N 42
Hallando el promedio de una columna

Si queremos obtener el promedio (o sea, la suma dividida por la cantidad)


entonces empleamos la funcin AVG().

SELECT
CLI_NACION,
COUNT(*) AS CANTIDAD,
SUM(CLI_SALACT) AS TOTALVENTA,
AVG(CLI_SALACT) AS PROMEDIOPORCLIENTE
FROM
CLIENTES
GROUP BY
CLI_NACION

La cantidad de clientes en cada grupo, el total que nos adeudan y el promedio por cliente

Algo importante a recordar sobre la funcin agregada AVG() es que no considera


los valores nulos, o sea para ella es como si no existieran.

Ejercicio N 43
Obtener todos los valores que tiene una columna

SELECT
LIST (CLI_FECNAC)
FROM
CLIENTES
WHERE
EXTRACT(YEAR FROM CLI_FECNAC) >= 1970

Una lista con las fechas de nacimiento de todos los clientes que nacieron en el ao 1970 o despus

Ejercicio N 44
Obtener el mximo valor de una columna

Para conocer cual es el mximo valor que tiene una columna empleamos la
funcin MAX().

LISTA DE USUARIOS Y SUS RESPECTIVOS ROLES

SELECT
RDB$USER AS NombreUsuario,
RDB$RELATION_NAME AS NombreRol
FROM
RDB$USER_PRIVILEGES
WHERE
RDB$PRIVILEGE = 'M'
ORDER BY
RDB$RELATION_NAME,
RDB$USER
SIMPLIFICANDO EL WHERE

Where=case, ou seja, o 'case' para lidar com as colunas e o 'where' para


lidar com o filtro sobre a tabela. Imagina se ambos se chamassem 'case',
como iria ficar confuso.
Se voc tiver que operar com condies que envolvam calulos, poder criar
na tabela campos do tipo COMPUTE e fazer o where relacionando os campos
compute, por exemplo :

CREATE TABLE CLIENTES(


nome varchar(255),
cnpj varchar(14),
contato varchar(255),
pesquisa compute by (nome||cnpj||contato))

select * from clientes where pesquisa like "%1234%"

O select acima vai procurar a ocorrencia "1234" seja no nome, cnpj ou contato.

Neste exemplo o compute usado apenas como um atalho simplificador para a


clausula where, mas pode-se usar o compute de formas mais complexas
envolvendo calculos, iff, ... simplificando voc usar o where depois.

VENTAS DETALLADAS A LOS CLIENTES, CLIENTES SIN VENTAS


APARECEN CON CERO

onde aparece cada registro de venda individualmente, se o usurio tiver 2 vendas, aparecem 2
registros; e para quem no tem vendas, aparece somente o nome e o valor zerado ?
Ana 100,00
Ana 50,00
Carlos 0,00
Pedro 30,00

select usu.nome, Ven.valor


from usuarios USU
left join vendas ven on usu.id_usuario=ven.ie_usuario and ven.data =
current_date
order by nome

VENTAS AGRUPADAS A LOS CLIENTES, CLIENTES SIN VENTAS


APARECEN CON CERO

aparece a SOMA das vendas de cada usurio e, se no houver vendas, aparece zerado?
Ana 150,00
Carlos 0,00
Pedro 30,00

Select usu.nome, sum(ven.valor)


From usuarios usu
Left join vendas ven on usu.id_usuario = ven.ie_usuario and ven.data =
current_date
Group by usu.nome

Observar a diferena em usar AND e WHERE -- quando uso WHERE ele retorna
APENAS os que satisfaam a condio, ou seja, os que TEM ven.data EXISTENTE
na data de hoje; assim, no listaria os que NO TEM vendas.

USO DE LA CLUSULA LIKE EN LAS CONSULTAS

La clusula LIKE se puede usar tanto para columnas de tipo carcter como
columnas de tipo numrico.

SELECT * FROM PRODUCTOS WHERE PRD_NOMBRE LIKE CO%

SELECT * FROM PRODUCTOS WHERE PRD_PREVTA LIKE 57%

En este ltimo caso mostrar todos los productos cuyo precio de venta empiece
con 57.

CAPITULO 2. TRABAJANDO CON MLTIPLES TABLAS


APNDICE. ERRORES QUE PUEDES ENCONTRAR