Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Las funciones de agrupación son utilizadas por sistemas gestores de bases de datos de manera
que operen sobre conjuntos de filas para dar un resultado por grupo.
Existen dos tipos de funciones:
La diferencia fundamental es que mientras las primeras realizan la acción sobre una única fila cada
vez, las de agrupación obtienen un resultado a partir de un conjunto de elementos. Se trata de
seleccionar un conjunto de elementos, filtrarlos por las condiciones que creamos oportunas y
obtener un resultado a partir de él.
Las funciones son habilidades poderosas de SQL. Pueden ser usadas para lo siguiente:
Las funciones SQL algunas veces reciben argumentos pero siempre retornan un valor.
Estas funciones operan solo en una única fila y retorna un valor por cada una. Hay diferentes tipos
de funciones de fila única:
• Carácter
• Numérica
• Fecha
• Conversión
• General
Las funciones de fila única son usadas para manipular elementos de datos. Ellas aceptan uno o más
argumentos y retorna un valor por cada fila que es retornada por la consulta. Un argumento puede
ser alguno de los siguientes:
• Constantes.
• Valores variables.
• Nombres de columnas.
• Expresiones.
En el caso de las funciones de fila única, cada sistema gestor de base de datos proporciona sus
propias funciones. Por ello, se recomienda buscar en la documentación técnica de cada gestor de
base de datos, las funciones existentes para el tratamiento de cadenas, fechas, etc.
Veamos a continuación algunas de estas funciones:
De cadenas:
De fechas:
FROM employees
A diferencia de las funciones de fila única, las de agrupamiento son estándar en todos los gestores
de bases de datos, el SQL nos ofrece las siguientes funciones de agregación para efectuar varias
operaciones sobre los datos de una base de datos:
En general, las funciones de agregación se aplican a una columna, excepto la función de agregación
COUNT, que normalmente se aplica a todas las columnas de la tabla o tablas seleccionadas. Por lo
tanto, COUNT (*) contará todas las filas de la tabla o las tablas que cumplan las condiciones. Si se
utilizara COUNT (distinct columna), sólo contaría los valores que no fuesen nulos ni repetidos, y si
se utilizara COUNT (columna), sólo contaría los valores que no fuesen nulos.
Veamos un ejemplo de uso de la función COUNT, que aparece en la cláusula SELECT, para hacer
la consulta “¿Cuántos departamentos están ubicados en la ciudad de Santa Ana?”:
FROM departamentos
El uso de OR REPLACE permite sobrescribir una función existente. Si se omite, y la función existe,
se producirá, un error.
La sintaxis de los parámetros es la misma que en los procedimientos almacenados, exceptuando
que solo pueden ser de entrada.
La orden RETURN dentro de una función devuelve el valor que la función debe devolver, el cual se
convierte al tipo especificado en la cabecera de la función. Puede haber más de una instrucción
RETURN, pero solo se ejecutará la primera que se encuentre dentro de la lógica del programa.
Una sub consulta es una consulta incluida dentro de una cláusula WHERE o HAVING de otra
consulta. En ocasiones, para expresar ciertas condiciones no hay más remedio que obtener el
valor que buscamos como resultado de una consulta.
Una sub consulta es una sentencia SELECT que aparece dentro de otra sentencia SELECT.
Normalmente se utilizan para filtrar una cláusula WHERE o HAVING con el conjunto de resultados
de la sub consulta, aunque también pueden utilizarse en la lista de selección.
Referencias externas
A menudo, es necesario, dentro del cuerpo de una sub consulta, hacer referencia al valor de una
columna de la fila actual en la consulta principal, ese nombre de columna se denomina referencia
externa. Una referencia externa es un campo que aparece en la sub consulta pero se refiere a una
de las tablas designadas en la consulta principal. Cuando se ejecuta una consulta que contiene
una sub consulta con referencias externas, la sub consulta se ejecuta por cada fila de la consulta
principal.
En este ejemplo la sub consulta aparece en la lista de selección, ejecutándose una vez por cada
fila que devuelve la consulta principal.
Los resultados que se obtienen con sub consultas normalmente pueden conseguirse a través de
consultas combinadas (JOIN):
Normalmente es más rápido utilizar un JOIN en lugar de una sub consulta, aunque esto depende
sobre todo del diseño de la base de datos y del volumen de datos que tenga.
La función EXISTS
EXISTS es una función SQL que devuelve verdadero cuando una sub-consulta retorna al menos
una fila:
La función EXISTS puede ser utilizada en cualquier sentencia SQL válida, SELECT, UPDATE,
INSERT o DELETE.
4. OTROS PREDICADOS
Para expresar una condición que quiere encontrar un valor entre unos límites concretos, podemos
utilizar BETWEEN:
SELECT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
Un ejemplo en el que se pide “Los códigos de los empleados que ganan entre 20.000 y 50.000
euros anuales” sería:
SELECT codigo_empl
FROM empleados
La respuesta sería:
4.2 Predicado IN
Para comprobar si un valor coincide con los elementos de una lista utilizaremos IN, y para ver si no
coincide, NOT IN:
SELECT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
“Queremos saber el nombre de todos los departamentos que se encuentran en las ciudades de
Lleida o Tarragona”:
FROM departamentos
La respuesta sería:
4.3 Predicado LIKE
Para comprobar si una columna de tipo carácter cumple alguna propiedad determinada, podemos
usar LIKE:
SELECT nombre_columnas_a_seleccionar FROM tabla_a_consultar WHERE columna LIKE
característica;
Los patrones del SQL92 para expresar características son los siguientes:
a. Pondremos un carácter “_” para cada carácter individual que queramos considerar.
b. Pondremos un carácter “%” para expresar una secuencia de caracteres, que puede no
estar formada por ninguno.
A continuación, presentamos un ejemplo en el que buscaremos los nombres de los empleados que
empiezan por J, y otro ejemplo en el que obtendremos los proyectos que comienzan por S y tienen
cinco letras:
Nombres de empleados que empiezan por la letra J:
FROM empleados
SELECT codigo_proyec
FROM proyectos
Para comprobar si un valor es nulo utilizaremos IS NULL, y para averiguar si no lo es, IS NOT
NULL. El formato es:
SELECT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
Un ejemplo de uso de este predicado sería “Queremos saber el código y el nombre de todos los
empleados que no están asignados a ningún proyecto”:
FROM empleados
Obtendríamos la respuesta:
Para ver si una columna cumple que todas sus filas (ALL) o algunas de sus filas (ANY/SOME)
satisfagan una condición, podemos hacer:
FROM tabla_a_consultar
Veamos un ejemplo de aplicación de ALL para encontrar los códigos y los nombres de los
proyectos en los que los sueldos de todos los empleados asignados son menores que el precio del
proyecto:
FROM empleados
Fijémonos en la condición de WHERE de la sub consulta, que nos asegura que los sueldos que
observamos son los de los empleados asignados al proyecto de la consulta.
A continuación, presentamos un ejemplo de ANY/SOME para buscar los códigos y los nombres de
los proyectos que tiene algún empleado que gana un sueldo más elevado que el precio del
proyecto en el que trabaja:
FROM proyectos
FROM empleados
CONTROL DE LECTURA
Lea, analice y responda las siguientes preguntas:
3. De los predicados que son utilizados en las instrucciones SQL, la que permite
hacer búsqueda en cadenas de caracteres que cumplan la posesión de algún
carácter en particular es:
LIKE.
De este modo si tuviéramos una tabla de ventas con un campo cliente, dicho campo contendría el
código del cliente de la tabla de cliente.
Sin embargo, esta forma de almacenar la información no resulta muy útil a la hora de consultar los
datos. SQL nos proporciona una forma fácil de mostrar la información repartida en varias tablas, las
consultas combinadas o JOINS.
• Combinación interna.
• Combinación externa.
• Uniones.
Consideremos una tabla de coches, en la que tenemos referenciada la marca a través del código
de marca. Para realizar la consulta combinada entre estas dos tablas debemos escribir una
consulta SELECT en cuya cláusula FROM escribiremos el nombre de las dos tablas, separados
por comas, y una condición WHERE que obligue a que el código de marca de la tabla de coches
sea igual al código de la tabla de marcas.
Démonos cuenta que hemos antepuesto el nombre de cada tabla al nombre del campo, esto no es
obligatorio si los nombres de campos no se repiten en las tablas, pero es aconsejable para evitar
conflictos de nombres entre campos. Por ejemplo, si para referirnos al campo marca no
anteponemos el nombre del campo la base de datos no sabe si queremos el campo marca de la
tabla tCoches, que contiene el código de la marca, o el campo marca de la tabla tMarcas, que
contiene el nombre de la marca.
Otra opción es utilizar la cláusula INNER JOIN. Su sintaxis es idéntica a la de una consulta
SELECT habitual, con la particularidad de que en la cláusula FROM sólo aparece una tabla o vista,
añadiéndose el resto de tablas a través de cláusulas INNER JOIN.
La cláusula INNER JOIN permite separar completamente las condiciones de combinación con otros
criterios, cuando tenemos consultas que combinan nueve o diez tablas esto realmente se
agradece. Sin embargo, muchos programadores no son amigos de la cláusula INNER JOIN, la
razón es que uno de los principales gestores de bases de datos, ORACLE, no la soportaba. Si
nuestro programa debía trabajar sobre bases de datos ORACLE no podíamos utilizar INNER JOIN.
A partir de la versión ORACLE 9i oracle soporta la cláusula INNER JOIN.
Según la naturaleza de nuestra consulta esto puede ser una ventaja, pero en otros casos significa
un serio problema. Para modificar este comportamiento SQL pone a nuestra disposición la
combinación externa. La combinación externa no es excluyente.
Esta consulta devolverá todos los registros de la tabla tCoches, independientemente de que tengan
marca o no. En el caso de que el coche no tenga marca se devolverá el valor null para los campos
de la tabla tMarcas.
El resultado mostrará el título y nombre de la editorial; las editoriales de las cuales no hay libros, es
decir, cuyo código de editorial no está presente en "libros" aparece en el resultado, pero con el
valor "null" en el campo "titulo".
Es importante la posición en que se colocan las tablas en un "left join", la tabla de la izquierda es la
que se usa para localizar registros en la tabla de la derecha.
Entonces, un "left join" se usa para hacer coincidir registros en una tabla (izquierda) con otra tabla
(derecha); si un valor de la tabla de la izquierda no encuentra coincidencia en la tabla de la
derecha, se genera una fila extra (una por cada valor no encontrado) con todos los campos
correspondientes a la tabla derecha seteados a "null". La sintaxis básica es la siguiente:
En el siguiente ejemplo solicitamos el título y el nombre a la editorial, la sentencia es similar a la
anterior, la diferencia está en el orden de las tablas
El resultado mostrará el título del libro y el nombre de la editorial; los títulos cuyo código de editorial
no está presente en "editoriales" aparecen en el resultado, pero con el valor "null" en el campo
"nombre".
Un "left join" puede tener cláusula "where" que restrinja el resultado de la consulta considerando
solamente los registros que encuentran coincidencia en la tabla de la derecha, es decir, cuyo valor
de código está presente en "libros":
También podemos mostrar las editoriales que NO están presentes en "libros", es decir, que NO
encuentran coincidencia en la tabla de la derecha:
La sintaxis corresponde a la de varias SELECT unidas a través de UNION.
Para utilizar la cláusula UNION debemos cumplir una serie de normas:
• Las consultas a unir deben tener el mismo número campos, y además los campos
deben ser del mismo tipo.
• Sólo puede haber una única cláusula ORDER BY al final de la sentencia SELECT.
Cada día se necesita procesar mayor cantidad de datos y obtener de manera más rápida y precisa
la información. Muchos de los problemas de rendimiento se deben entre otras cosas al hardware,
al software, al motor de base de datos y por sobre todo al diseño, índices y mala formulación de
consultas SQL.
En este apartado nos centraremos en estos últimos en donde siguiendo algunas recomendaciones
veremos que se puede mejorar el tiempo de respuesta de nuestro motor de BD significativamente.
• Las tablas normalizadas permiten reducir al mínimo el espacio ocupado por nuestra
base y permiten asegurar la consistencia de la información al mismo tiempo que son
muy rápidas para la realización de transacciones, pero generan un mayor tiempo de
demora a la hora de consultarlas, ya que se deben realizar generalmente la unión de
varias tablas, por lo que en caso de necesidad de altas velocidades de respuesta con
grandes volúmenes de datos, un modelo desnormalizado es más que conveniente
teniendo en cuenta todas las implicancias del caso.
• Ajustar al máximo el tamaño de los campos ayuda a no desperdiciar espacio.
• Eliminar todo campo que no sea de utilidad, ya que por más que no contenga datos
genera retrasos.
Los índices son campos que permiten la búsqueda a partir de dicho campo a una velocidad
notablemente superior. Sin embargo, cuentan con la desventaja que hace más lenta la actualización,
carga y eliminación de los registros, ya que por cada modificación en la tabla se deberá modificar
también el índice, además se debe tener en cuenta el hecho de que los índices también ocupan
espacio en disco. Es por esto que no es factible indexar todos los campos de la base y se hace
necesario seleccionarlos cuidadosamente. Cabe destacar que por defecto las tablas no contienen
índices por lo que la introducción de estos puede llegar a producir mejoras de más del 100% en
algunos casos. Los campos que se recomiendan indexar son:
• Claves Primarias.
• Claves Foráneas.
• Campos por los cuales se realizarán búsquedas.
• Campos por los cuales se va a ordenar.
Siempre conviene indexar tablas con gran cantidad de registros y que van a ser consultadas
intensamente.
A la hora de ejecutar una consulta SQL la forma en que esta es expresada afecta directamente al
motor de BD, pequeños cambios pueden significar la ganancia de muchos segundos o minutos que
el usuario debe esperar al momento de ejecutar la consulta. Algunas recomendaciones son:
• No utilizar SELECT * porque el motor debe leer primero la estructura de la tabla antes
de ejecutar la sentencia.
• Seleccionar solo aquellos campos que se necesiten. Cada campo extra genera tiempo
extra.
• Utilizar Inner Join , left join , right join, para unir las tablas en lugar del where, esto
permite que a medida que se declaran las tablas se vayan uniendo mientras que si
utilizamos el where el motor genera primero el producto cartesiano de todos los
registros de las tablas para luego filtrar las correctas, un trabajo definitivamente lento.
• Especificar el alias de la tabla delante de cada campo definido en el select, esto le
ahorra tiempo al motor de tener que buscar a cuál tabla pertenece el campo
especificado.
• Evitar el uso de Cast y fórmulas dentro de las consultas, cada fórmula y casteo
retrasan el motor considerablemente.
El orden de ubicación de las tablas en el from debería ir en lo preferible de menor a mayor según el
número de registros, de esta manera reducimos la cantidad de revisiones de registros que realiza el
motor al unir las tablas a medida que se agregan.
Filtre tanto como pueda, la cláusula WHERE es la más importante a la hora de la optimización;
NUNCA use “SELECT *;” debe especificar los campos que necesita, esto hará su consulta más
rápida y llevará a ahorrar ancho de banda (recuerde que Ud. está enviando paquetes por una red,
¿por qué habrá de enviar lo que no necesita?).
Sea cuidadoso con el JOIN, las expresiones JOIN son caras en términos de tiempo, asegúrese de
que está usando todas las claves relativas a las tablas que refiere y no aplique JOIN en tablas que
no necesita, siempre trate de unir campos indexados.
El tipo de JOIN usado es muy importante también; familiarícese con los tipos (INNER, OUTER, LEFT,
RIGHT….)
Las consultas son rápidas, generalmente podrá recuperar cantidad de información en menos de un
segundo, incluso usando los joins, ordenando y calculando. Una regla de oro es que si su consulta
toma más de un segundo, deberá optimizarla.
El trabajo comenzará con las consultas más necesarias o más usadas, y luego proceder con las que
más tiempo toman.
Si las consultas realizan búsquedas de tablas completas, deberá pensar en el uso de índices para
sus tablas, el uso de ellos y de un filtrado adecuado que pueden resolver la mayor parte de las
consultas que toman demasiado tiempo.
Todas las claves primarias precisan de índices para realizar los joins más rápidamente, esto también
significa que todas las tablas precisan de clave primaria. Se pueden agregar índices en campos que
usa seguido para el filtrado con cláusulas de tipo WHERE.
Especialmente usted precisa usar índices en campos de tipo entero, booleano y numérico; en cambio
no le será de mucha ayuda en campos de tipo Blob, VarChar y Long String.
El lado negativo de los índices es que se debe tener mucho cuidado con su uso en tablas que se
actualizan muy seguido, en estos casos el mantenimiento de los índices puede consumir más tiempo
del que realmente ahorran.
Otra herramienta excelente en el mundo de Internet son las tablas de tipo read-only allí los índices
funcionan en su mayor potencial, ya que raramente necesitará realizar mantenimiento.
Los procedimientos almacenados son una alternativa rápida y mejor a las consultas por las
siguientes razones:
Se puede afinar una BD de varias formas, usando estadísticas de optimización, corriendo opciones
de optimización, realizando tablas de sólo lectura, etc. Usualmente este trabajo lo realiza un
administrador de BD. En la mayoría de los sistemas gestores de bases de datos existen
herramientas de optimización. MySQL tiene la herramienta “MySQL query analyzer”, que le
permitirá ejecutar consultas y observar su incidencia, para determinar lo que el SGBD hace con sus
consultas.
4. La optimización en la práctica
Ejemplo 1
Consulta original:
Corregido:
From Empleados
Where Dept='Ventas';
En la versión corregida, se filtra la información en la BD lo que resulta más rápido, además sólo se
solicita la información necesaria, lo que enviará sensiblemente menos información y, por lo tanto,
mejorará la performance.
Ejemplo 2
Consulta original:
From Empleados
Where Dept='Ventas'
Order By Salario;
¿Realmente necesita la cláusula Order by? A menudo se utiliza esta opción para revisar si los
datos retornados son correctos, remuévala si no la necesita, ahora si es necesaria úsela en la
consulta no en la página.
Ejemplo 3
Original:
For i=1 to 2000 call query : Select Salario From Empleados Where EMpID= Parametro(i)
Corregido:
Select Salario From Empleados Where EmpID >=1 and EmpID <= 2000;
La primera opción involucra gran transmisión de datos lo que hará más lento el sistema completo,
siempre debe realizar el trabajo en la consulta o el procedimiento almacenado, si obliga al sistema
a llevar y traer información pierde valioso tiempo. No importa si se piensa que el proceso es tan
complicado que es mejor manejarlo en el código de su aplicación, pero rara vez lo es.
Ejemplo 4
Se tienen 2 tablas Ordenes y Clientes. Los Clientes pueden tener varias órdenes.
Original:
Corregido:
Conclusión
CONTROL DE LECTURA
3. El join que se usa para hacer coincidir registros en una tabla (izquierda) con
otra tabla (derecha) es:
Le
ft
joi
n.
1. ¿QUÉ SON LOS PROCEDIMIENTOS ALMACENADOS?
• Parámetros de entrada.
• Parámetros de salida.
• Declaración de variables.
¿Dónde utilizarlos?
Donde:
Segmento de código
• Esta instrucción puede usarse dentro de las etiquetas begin y end las
cuales engloban el cuerpo de instrucciones del procedimiento, también
es posible asignar un tipo de variable y un valor default.
Esta sentencia es especialmente útil, ya que inserta en las variables que se le indican
los resultados del SELECT. Es importante tener en cuenta que no almacena una
estructura bidimensional, sino solamente una o varias variables, es por ello que es
necesario que las consultas tengan un solo registro como el ejemplo siguiente:
Ejemplo:
SENTENCIA CASE
• El comando CASE para procedimientos almacenados implementa un
constructor condicional complejo.
Ejemplo:
SENTENCIA WHILE
• Los DBMS soportan varios tipos de bucles y con ellos muchos tipos de
control sobre ellos.
Ejemplo:
OTROS EJEMPLOS:
Instrucción REPEAT
En este caso, la instrucción INSERT se hace por lo menos una vez.
5. EL COMANDO CALL
Ejemplo 1
Asumamos que se ha creado un procedimiento llamado p_libros_aumentar, no se
requiere parámetro alguno, por lo que la invocación sería:
• execute pa_libros_aumentar;
• exec pa_libros_aumentar;
• Call pa_libros_aumentar;
Ejemplo 2
En este caso, si el procedimiento llamado p_libros_aumentar, requiere parámetros,
entonces la forma de invocarlos podría ser:
• exec pa_libros_aumentar(miVariable);
• Call pa_libros_aumentar(miVariable);
Debemos aclarar, que “miVariable” podría ser una constante o una variable provista
por el lenguaje de programación que se esté utilizando.
CONTROL DE LECTURA
Administración.
2. TIPOS DE TRIGGERS
TIPOS DE DISPARADORES
EJEMPLOS
• Al insertar un registro.
• Al modificar un registro.
• Al eliminar un registro.
• BEFORE
Este tipo de trigger se debe ejecutar cuando:
La acción del trigger debe determinar si le permite
finalizar a la sentencia de disparo.
Si se deben verificar valores específicos de columnas
antes de completar una sentencia de disparo INSERT o
UPDATE.
• AFTER
Se debe emplear este tipo de trigger cuando:
Se quiere completar la sentencia de disparo antes de
ejecutar la acción del trigger.
Si ya existe un trigger BEFORE un AFTER puede
realizar diferentes acciones con la misma sentencia de
disparo.
4. CREACIÓN DE TRIGGERS
Elementos de un trigger
• before / after: elemento que dispara el trigger
• for each: nivel del disparo del trigger que por defecto
es statement que significa que se dispara una sola vez
por cada operación independientemente del número de
filas afectadas.
Disparadores de sistema
CONTROL DE LECTURA
b) Sum.
8. ¿En cuál de las siguientes cláusulas no puede colocarse una sub consulta?
c) Order by.
10. ¿En cuál tipo de JOIN pueden colocarse las tablas separadas por una
coma?
a) En un INNER JOIN.
11. El join que se usa para hacer coincidir registros en una tabla (derecha) con
otra tabla (izquierda) es:
b) Right join.
15. Existen algunas variables en los disparadores de bases de datos que son
utilizados para el manejo de los valores con los que deberá trabajar los eventos.
¿En cuál de las instrucciones que se muestra a continuación, se utiliza la variable
:OLD?
b) DELETE, UPDATE.