Beruflich Dokumente
Kultur Dokumente
DE PRINCIPIANTE A EXPERTO
INTRODUCCIN
DML consiste de los cuatro grandes en SQL, las instrucciones: Select, Insert,
Update y Delete (Consultar, Insertar, Actualizar y Borrar).
REQUISITOS
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
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.
3. Para ejecutar dichas instrucciones debes hacer click sobre el botn Execute
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)
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
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
Ejercicio N 5
Escribiendo en maysculas y en minsculas
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
Ejercicio N 7
Concatenando columnas
SELECT
DEP_CODIGO || '***' || DEP_NOMBRE AS CODIGONOMBRE
FROM
DEPARTAMENTOS
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
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
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
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
SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC
FROM
CLIENTES
ROWS
11 TO 16
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
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
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
Ejercicio N 17
Uso de la clusula WHERE para imponer condiciones
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
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
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
SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_ESTCIV
FROM
CLIENTES
WHERE
CLI_ESTCIV NOT IN ('S', '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'
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)
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
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)
Ejercicio N 25
Obteniendo filas que tienen valores nulos
SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC
FROM
CLIENTES
WHERE
CLI_FECNAC IS NULL
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%'
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%'
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%'
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
SELECT
CLI_IDENTI,
CLI_NOMBRE,
CLI_FECNAC,
CLI_SALINI
FROM
CLIENTES
ORDER BY
2
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
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
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.
Todos los clientes cuyo nombre empieza con la letra C, ordenados por sus identificadores
Ejercicio N 37
Respondiendo preguntas
Con lo aprendido hasta aqu ya podrs responder a muchas de ellas, por ejemplo:
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
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.
SELECT
CLI_NACION
FROM
CLIENTES
GROUP BY
CLI_NACION
Ejercicio N 39
Agrupando datos y contndolos
SELECT
CLI_NACION,
COUNT(*)
FROM
CLIENTES
GROUP BY
CLI_NACION
Ahora podemos saber cuantos clientes tenemos de cada nacionalidad
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
SELECT
CLI_NACION,
COUNT(*)
FROM
CLIENTES
GROUP BY
CLI_NACION
HAVING
COUNT(*) >= 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
Ejercicio N 42
Hallando el promedio de una columna
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
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().
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
O select acima vai procurar a ocorrencia "1234" seja no nome, cnpj ou contato.
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
aparece a SOMA das vendas de cada usurio e, se no houver vendas, aparece zerado?
Ana 150,00
Carlos 0,00
Pedro 30,00
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.
La clusula LIKE se puede usar tanto para columnas de tipo carcter como
columnas de tipo numrico.
En este ltimo caso mostrar todos los productos cuyo precio de venta empiece
con 57.