Introducción a SQL: Sentencia SELECT
Introducción a SQL: Sentencia SELECT
CAPÍTULO 1. Introducción
En una BD relacional, los datos son almacenados en tablas. Un ejemplo de tabla puede
contener el DNI, el nombre y la Dirección:
Tabla_direcciones_empleados
Ahora, vamos a ver que habría que hacer para ver las direcciones de todos los
empleados. Utiliza la sentencia SELECT de la siguiente manera:
La explicación de lo que acabas de hacer es la siguiente, has preguntado por todos los
datos de la Tabla_direcciones_empleados, y específicamente, has preguntado por la
columnas llamadas Nombre, Apellidos, Dirección, Ciudad y Provincia. Observa que los
nombre de las columnas y los nombres de las tablas no tienen espacios...éstos deben ser
escritos con una palabra; y que la sentencia acaba con un punto y coma (;). La forma
general para una sentencia SELECT, recuperando las filas de una tabla es:
Para coger todas las columnas de una tabla sin escribir todos los nombres de columna,
usa:
SELECT * FROM NombreTabla;
Selección Condicional
Para un mayor estudio de la sentencia SELECT, echa un vistazo a una nueva tabla de
ejemplo:
Tabla_estadistica_empleados
Operadores Relacionales
= Igual
< ó != No igual (ver manual para más información)
< Menor que
> Mayor que
<= Menor o igual a
>= Mayor o igual que
La cláusula WHERE es usada para especificar que sólo ciertas filas de la tabla sean
mostradas, basándose en el criterio descrito en esta cláusula WHERE. Es más fácil de
entender viendo un par de ejemplos:
SELECT Cod_empleado
FROM Tabla_estadistica_empleados
WHERE Salario >= 50000;
Observa que el signo >= (mayor o igual que) ha sido usado, ya que queremos ver
listados juntos aquellos que ganen más de 50.000 o igual a 50.000 . Esto muestra:
Cod_empleado
---------------
010
105
152
215
244
SELECT Cod_empleado
FROM Tabla_estadistica_empleados
WHERE Cargo = 'Encargado';
Esto muestra la código de todos los encargados. Generalmente, con las columnas de
texto, usa igual o no igual a, y comprueba que el texto que aparece en la condición está
dentro de comillas simples.
El operador AND junta dos o más condiciones, y muestra sólo las filas que satisfacen
TODAS las condiciones listadas. Por ejemplo:
SELECT Cod_empleado
FROM Tabla_estadistica_empleados
WHERE Salario 40000 AND Cargo = ‘Técnico’
El operador OR junta dos o más condiciones, y devuelve una fila si ALGUNA de las
condiciones listadas en verdadera. Para ver todos aquellos que ganan menos de 40.000 o
tienen menos de 10.000 en beneficios listados juntos, usa la siguiente consulta:
SELECT ID_EMPLEADO
FROM TABLA_ESTADISTICA_EMPLEADOS
WHERE SALARIO < 40000 OR BENEFICIOS < 10000;
SELECT ID_EMPLEADO
FROM TABLA_ESTADISTICA_EMPLEADOS
WHERE CARGO = 'Encargado' AND SALARIO > 60000 OR BENEFICIOS
> 12000;
Primero SQL encuentra las filas donde el salario es mayor de 60.000 y la columna del
cargo es igual a Encargado, una vez tomada esta nueva lista de filas, SQL buscará si hay
otras filas que satisfagan la condición AND previa o la condición que la columna de los
Beneficios sea mayor de 12.000. Consecuentemente, SQL solo muestra esta segunda
nueva lista de filas, recordando que nadie con beneficios sobre 12.000 será excluido ya
que el operador OR incluye una fila si el resultado de alguna de las partes es
VERDADERO.
Para generalizar este proceso, SQL realiza las operaciones AND para determinar las
filas donde las operaciones AND se mantienen VERDADERO (recordar: todas las
condiciones son verdaderas), entonces estos resultados son usados para comparar con
las condiciones OR, y solo muestra aquellas filas donde las condiciones unidas por el
operador OR se mantienen ciertas para alguna de las partes de la condición..
Para realizar OR antes de AND debes de usar paréntesis, p.e., si quisieras ver una lista
de empleados ganando un gran salario (50.000) o con un gran beneficio (10.000), y sólo
quieres que lo mire para los empleados con el cargo de Encargado:
SELECT ID_EMPLEADO
FROM TABLA_ESTADISTICA_EMPLEADOS
WHERE CARGO = 'Encargado' AND (SALARIO > 50000 OR BENEFICIO
> 10000);
IN & BETWEEN
SELECT ID_EMPLEADO
FROM TABLA_ESTADISTICA_EMPLEADOS
WHERE CARGO IN ('Encargado', 'Técnico');
O para listar aquellos que ganen más o 30.000, pero menos o igual que 50.000, usa:
SELECT ID_EMPLEADO
FROM TABLA_ESTADISTICA_EMPLEADOS
WHERE SALARIO BETWEEN 30000 AND 50000;
SELECT ID_EMPLEADO
FROM TABLA_ESTADISTICA_EMPLEADOS
WHERE SALARIO NOT BETWEEN 30000 AND 50000;
De forma similar, NOT IN lista todas las filas excluyendo aquellas de la lista IN.
Usando LIKE
SELECT ID_EMPLEADO
WHERE APELLIDOS LIKE 'L%';
FROM TABLA_ESTADISTICA_EMPLEADOS
El tanto por ciento (%) es usado para representar un posible carácter (sirve como
comodín), ya sea número, letra o puntuación, o para seleccionar todos los caracteres que
puedan aparecer después de "L". Para encontrar las personas con el apellidos terminado
en "L", usa ‘%L’, o si quieres la ‘L’ en medio de la palabra ‘%L%’. El ‘%’ puede ser
usado en lugar de cualquier carácter en la misma posición relativa a los caracteres
dados. NOT LIKE muestra filas que no cumplen la descripción dada. Otras
posibilidades de uso de LIKE, o cualquiera de las condiciones anteriores, son posibles,
aunque depende de qué DBMS estés usando; lo más usual es consultar el manual, o tu
administrador de sistema sobre la posibilidades del mismo, o sólo para estar seguro de
que lo que estás intentando hacer es posible y correcto. Éste tipo de peculiaridades serán
discutidas más adelante. Esta sección sólo pretende dar una idea de las posibilidades de
consultas que pueden ser escritas en SQL.
CAPÍTULO 2. Uniones
Uniones
En esta sección, sólo estudiaremos la unión y la intersección, que en general son las más
usadas.
Un buen diseño de una BD sugiere que cada lista de tabla de datos sea considerada
como una simple entidad, y que la información detallada puede ser obtenida, en una BD
relacional, usando tablas adicionales y uniones.
Primero considera los siguientes ejemplos de tablas:
Propietarios_Antigüedades
01 Jones Bill
02 Smith Bob
15 Lawson Patricia
21 Akins Jane
50 Fowler Sam
Pedidos
ID_Propietario ProductoPedido
02 Table
02 Armario
21 Silla
15 Espejo
Antigüedades
01 50 Cama
02 15 Mesa
15 02 Silla
21 50 Espejo
50 01 Armario
01 21 Cabinet
02 21 Cofee Table
15 50 Cahair
01 15 Jewelry Box
02 21 Pottery
21 02 Librería
50 01 Plant Stand
Claves
Primero vamos a estudiar el concepto de claves. Una clave primaria es una columna o
conjunto de columnas que identifican unívocamente el resto de datos en cualquiera fila.
Por ejemplo, en la tabla Propietarios_Antigüedades, la columna ID_Propietario
identifica unívocamente esa fila. Esto significa dos cosas: dos filas no pueden tener el
mismo ID_Propietario y, aunque dos propietarios tuvieran el mismo nombre y apellidos,
la columna ID_Propietario verifica que no serán confundidos, porque la columna
ID_Propietario podrá ser usada por el Administrador de la Base de Datos (DBMS) para
diferenciarlos, aunque los nombres sean los mismos.
Una clave ajena es una columna en una tabla que es clave primaria en otra tabla, lo que
significa que cada dato en una columna con una clave ajena debe de corresponder con
datos, en otra tabla, cuya columna es clave primaria. En el lenguaje DBMS esta
correspondencia es conocida como integridad referencial. Por ejemplo, en la tabla
Antigüedades, tanto el ID_comprador como el ID_vendedor son claves ajenas de la
clave primaria de la tabla Propietarios_Antigüedades (ID_Propietario; por supuesto,
debe haber un propietario antiguo antes de poder comprar o vender cualquier producto),
por lo tanto, en ambas tablas, las columnas ID son usadas para identificar los
propietarios o compradores y vendedores, y por lo tanto ID_Propietario es la clave
primaria de la tabla Propietarios_Antigüedades. En otras palabras, todos estos datos
"ID" son usados para referirse a los propietarios, compradores, o vendedores de
antigüedades, sin necesidad de usar sus nombres reales.
El propósito de estas claves es el poder referirse a datos de diferentes tablas, sin tener
que repetir los datos en cada una de ellas, este es el poder de las bases de datos
relacionales. Por ejemplo, se pueden encontrar los nombres de los que han comprado
una silla sin tener que listar el nombre completo del comprador en la tabla
Antigüedades...puedes conseguir el nombre relacionando aquellos que compraron una
silla con los nombres en la tabla de Propietarios_Antigüedades usando el
ID_Propietario, el cual relaciona los datos en las dos tablas. Para encontrar los nombres
de aquellos que compraron una silla, usa la siguiente consulta:
Observa que las tablas involucradas en la relación son listadas en la cláusula FROM de
la sentencia. En la cláusula WHERE, primero observa que el PRODUCTO=’Silla’
restringe el listado a aquellos que han comprado una silla. Segundo, observa como las
columnas ID son relacionadas de una tabla a otra por el uso de la cláusula
ID_COMPRADOR=ID_PROPIETARIO. Sólo cuando los ID coinciden y el objeto
comprado es una silla (por el AND), los nombres de la tabla Propietarios_Antigüedades
serán listados. Debido a que la condición de unión usada es el signo igual, esta unión se
denomina intersección. El resultado de esta consulta son dos nombres: Smith, Bob &
Fowler, Sam.
Para evitar ambigüedades se puede poner el nombre de la tabla antes del de la columna,
algo como:
SELECT PROPIETARIOS_ANTIGÜ[Link],
PROPIETARIOS_ANTIGÜ[Link]
FROM PROPIETARIOS_ANTIGÜEDADES, ANTIGÜEDADES
WHERE ANTIGÜEDADES.ID_COMPRADOR =
PROPIETARIOS_ANTIGÜEDADES.ID_PROPIETARIO AND
ANTIGÜ[Link] = 'Silla';
Sin embargo, como los nombres de las columnas en cada tabla son diferentes, esto no
es necesario.
Consideremos que quieres ver los ID y los nombres de toda aquellas persona que haya
vendido una antigüedad. Obviamente, quieres una lista donde cada vendedor sea listado
una vez, y no quieres saber cuántos artículos a vendido una persona, solamente el
nombre de las personas que han vendido alguna antigüedad . Esto significa que
necesitarás decir en SQL que quieres eliminar las filas de vendedores duplicadas, y sólo
listar cada persona una vez. Para hacer esto, uso la palabra clave DISTINCT.
Para complicarlo un poco más, además queremos la lista ordenada alfabéticamente por
el Apellido, después por el Nombre, y por último por su ID_Propietario. Para ello,
usaremos la clausula ORDER BY.
En esta sección, hablaremos sobre los Alias, IN y el uso de las subconsultas, y como
éstas pueden ser usadas en un ejemplo con tres tablas. Primero, observa esta consulta
que imprime el apellido de aquellos propietarios que han formulado un pedido y en qué
consiste éste, solamente listando aquellos cuyos pedidos pueden ser atendidos (esto es,
hay un vendedor que posee el producto pedido)
Esto devuelve:
Funciones Agregadas
Vamos a ver cinco importantes funciones agregadas: SUM, AVG, MAX , MIN
y COUNT. Son llamadas funciones agregadas porque resumen el resultado de una
consulta.
devuelve el total de todas las fila, satisfaciendo todas las condiciones de una columna dada,
SUM ()
cuando la columna dada es numérica.
AVG () devuelve la media de una columna dada.
MAX () devuelve el mayor valor de una columna dada.
MIN () devuelve el menor valor en una columna dada.
COUNT(*) devuelve el número de filas que satisfacen las condiciones.
Viendo las tablas del principio del documento, veamos tres ejemplos:
Esta consulta muestra el total de todos los salarios de la tabla, y la media salarial de
todas las entradas en la tabla.
SELECT MIN(BENEFICIOS)
FROM TABLA_ESTADISTICA_EMPLEADOS
WHERE CARGO = 'Encargado';
SELECT COUNT(*)
FROM TABLA_ESTADISTICA_EMPLEADOS
WHERE CARGO = 'Técnico';
Esta consulta nos dice cuantos empleados tienen la categoría de Técnico (3).
Vistas
En SQL puedes (comprueba tu DBA) tener acceso a crear vistas por ti mismo. Lo que
una vista hace es permitirte asignar resultados de una consulta a una tabla nueva y
personal , que puedes usar en otras consultas, pudiendo utilizar el nombre dado a la
tabla de tu vista en la cláusula FROM. Cuando accedes a una vista, la consulta que está
definida en la sentencia que crea tu lista está relacionada (generalmente), y los
resultados de esta consulta son como cualquier otra tabla en la consulta que escribiste
invocando tu vista. Por ejemplo, para crear una vista:
Ahora, escribe una consulta usando esta vista como tabla, donde la tabla es una listado
de todos los Productos Pedidos de la tabla Pedidos:
SELECT ID_VENDEDOR
FROM ANTIGÜEDADES, ANTVIEW
WHERE PRODUCTOPEDIDO = PRODUCTO;
Toda tabla de una base de datos debe de ser creada alguna vez... veamos como hemos
creado la tabla de Pedidos:
Otra nota, NOT NULL significa que la columna debe tener un valor en cada fila. Si
NULL es usado, la columna podría tener un valor vacio en una de sus filas.
Modificando Tablas
Vamos a añadir una columna a la tabla Antigüedades para permitir introducir el precio
de un producto dado:
Los datos para esta nueva columna pueden ser actualizados o insertados como se
muestra a continuación.
Añadiendo Datos
Esto inserta los datos en la tabla, como una nueva fila, columna por columna, en el
orden pre-definido. Veamos como modificar el orden y dejar el Precio en blanco:
Borrando datos
Pero si hay otra fila que contiene ‘Ottoman’, esta fila también será borrada. Para
diferenciar la fila de otra, lo que haremos será añadir datos:
DELETE FROM ANTIGÜEDADES
WHERE PRODUCTO = 'Ottoman' AND ID_COMPRADOR = 01 AND
ID_VENDEDOR = 21;
Actualizando Datos
Esto pone el precio de todas las sillas a 500.00, como en el caso anterior, añadiendo más
condicionantes en la cláusula WHERE, podemos especificar más aquellas filas que
queremos modificar.
Índices
Los índices permiten a DBMS acceder a los datos más rápidamente (esto no ocurre en
todos los sistemas). El sistema crea esta estructura de datos interna (el índice) con la
cual se puede seleccionar filas (cuando la selección se basa en columnas indexadas, esto
se hace más rápidamente). Este índice le dice a la DBMS donde esta cierta fila dando el
valor de una columna indexada, como un libro, cuyo índice te dice en que páginas
aparece una cierta palabra. Vamos a crear un índice por el ID_Propietario en la tabla
Propietarios_Antigüedades:
Así mismo, también puedes "borrar" una tabla (DROP TABLE nombretabla). En el
segundo ejemplo, el índice se mantine en las dos columnas, agregado junto.
Ahora, queremos decir que sólo queremos ver la precio máximo de la compra si éste es
sobre $1000, así que usamos la cláusula HAVING:
Más subconsultas
Otro uso común de las subconsultas involucra el uso de operadores para permitir a una
condición WHERE incluir la salida de un Select de una subconsulta. Primero, lista los
compradores que compraron un producto caro (el precio del producto es $100 mayor
que la media de precio de todos los productos):
SELECT ID_COMPRADOR
FROM ANTIGÜEDADES
WHERE PRECIO
(SELECT AVG(PRECIO) + 100
FROM ANTIGÜEDADES);
La subconsulta calcula la media del Precio más $100, y usando esta figura, los
ID_Propietario son impresos por cada producto que cuesta más. Se puede usar
DISTINCT ID_PROPIETARIO, para eliminar duplicados.
UPDATE PROPIETARIOS_ANTIGÜEDADES
SET NOMBREPROPIETARIO = 'John'
WHERE ID_PROPIETARIO =
(SELECT ID_COMPRADOR
FROM ANTIGÜEDADES
WHERE PRODUCTO = 'Librería');
Recuerda esta regla sobre las subconsultas: cuando tienes una subconsulta como parte
de una condición WHERE, la cláusula Selec en la subconsulta tiene que tener columnas
que concuerden en número y tipo con aquellas que formen parte de la condición
WHERE de la subconsulta. En otras palabras, si tienes "WHERE ColumnName =
(SELECT...);", Select debe de tener sólo una columna en ella, para coincidir con la
salida en la cláusula Where, y estas deberán de coincidir en tipo
Esto devolverá el precio de producto más alto (o más de un producto si hay un empate),
y su comprador. La subconsulta devuelve una lista de todos los precios de la tabla
Antigüedades, y la consulta de salida va fila por fila de la tabla Antigüedades y si el
precio es mayor o igual a todos (o ALL) precios en la lista, es listado, dando el precio
del producto más caro. La razón de "=" es que el mayor precio en la lista puede ser igual
al de la lista, ya que este producto está en la lista de precios.
Hay ocasiones donde puedes querer ver los resultados de múltiples consultas a la vez
combinando sus salidas; usa UNION. Por ejemplo, si queremos ver todos los
ID_COMPRADOR de la tabla de Antigüedades junto con los ID_PROPIETARIO de la
tabla de PEDIDOS, usaremos:
SELECT ID_COMPRADOR
FROM ANTIGÜEDADES
UNION
SELECT ID_PROPIETARIO
FROM PEDIDOS;
SQL requiere que la lista de Select (de columnas) coincida, columna por columna, en el
tipo de datos. En este caso ID_comprador y ID_Propietario son del mismo tipo
(integer). Además, SQL elimina automáticamente los duplicados cuando se usa UNION
(como si ellos fuera dos "conjuntos"); en las consultas simples, tienes que usar
DISTINCT.
La unión de salida es usada cuando una consulta de unión está "unida" con filas no
incluidas en la unión, y son especialmente útiles si las "flags" son incluidas. Primero
observa la consulta:
Esta consulta hace una unión para listar todos los propietarios que están en ambas
tablas, y pone una línea etiqueta después de ID repitiendo la cita. La UNION une esta
lista con al siguiente lista. La segunda lista es generada primero listando aquellos ID
que no están en la tabla Pedidos, generando una lista de ID excluidos de la consulta de
unión. Entonces, cada fila en la tabla Antigüedades es escaneada, y si el ID_comprador
no está en esta lista de exclusión, es listado con su cita etiqueta. Debe haber un modo
más sencillo de hacer esta lista, pero es difícil generar la informativa cita de texto.
Este concepto es muy útil en situaciones donde la clave primaria está relacionada con
una clave ajena, pero el valor de la clave ajena para algunas claves primarias es NULL.
Por ejemplo, en una tabla, la clave primaria es vendedor, y en otra tabla es clientes, con
el nombre de los vendedores en la misma fila. Sin embargo, si un vendedor no tiene
clientes, el nombre de esta persona no aparecerá en la tabla de clientes. La unión de
salida es usada si el listado de todos los vendedores va ha ser impreso, junto con sus
clientes, aunque el vendedor no esté en la tabla de clientes, pero está en la tabla de
vendedores. En otro caso, el vendedor será listado con cada cliente.
SQL embebido
Un feo ejemplo (no escribas un programa como este ...esto es sólo con propósitos
educativos)
/* - Para verlo, aquí tienes un programa ejemplo que usa SQL embebido. SQL
embebido permite
a los programadores conectar con una base de datos e incluir código SQL en su
programa, y poder usar,
manipular y procesar datos de la base de datos..
- Este ejemplo de programa en C (usando SQL embebido) imprimirá un informe.
- Este programa deberá ser precompilado para las sentencias SQL, antes de la
compilación normal.
- Las partes EXEC SQL son las mismas (estándar), pero el código C restante deberá ser
cambiado,
incluyendo la declaración de variables si estás usando un lenguaje diferente.
-SQL embebido cambia de sistema a sistema, así que, una vez más, comprueba la
documentación, especialmente la declaración
de variables y procedimientos, en donde las consideraciones del DBMS y el sistema
operativo son cruciales.
*/
/* ***************************************************/
/* ESTE PROGRAMA NO ES COMPILABLE O EJECUTABLE */
/* SU PROPOSITO ES SÓLO DE SEVIR DE EJEMPLO */
/****************************************************/
#include <stdio.h>
/* Esta sección declara las variables locales, estas deberán ser las variables que tu
programa use, pero también
las variables SQL podrán ser utilizadas para tomar o dar valores */
/* Esto incluye la variable SQLCA , aquí puede haber algún error si se compilase. */
/* Este código informa si estás conectado a la base de datos o si ha habido algún error
durante la conexión*/
if([Link])
{
printf(Printer, "Error conectando al servidor de la base de datos.\n");
exit();
}
printf("Conectado al servidor de la base de datos.\n");
/* Esto declara un "Cursor". Éste es usado cuando una consulta devuelve más de una
fila, y una operación va a ser realizada en cada fila resultante de la consulta. Con cada
fila establecida por esta consulta, lo usare en el informe. Después "Fetch" será usado
para sacar cada fila, una a una, pero para la consulta que está actualmente ejecutada, se
usará el estamento "Open". El "Declare" simplemente establece la consulta.*/
/* Fetch pone los valores de la "siguiente" fila de la consulta en las variables locales,
respectivamente. Sin embargo, un "priming fetch" (tecnica de programación) debe ser
hecha antes. Cuando el cursor está fuera de los datos, un código SQL debe de ser
generado para permitirnos salir del bucle. Para simplificar, el bucle será dejado cuando
ocurra cualquier código SQL, incluso si es una código de error. De otra manera, un
código de chequeo específico debería de ser preparado*/
EXEC SQL FETCH ProductoCursor INTO :Producto, :ID_comprador;
while(![Link])
{
/* Con cada fila, además hacemos un par de cosas. Primero, aumentamos el precio $5
(honorarios por tramitaciones) y extraemos el nombre del comprador para ponerlo en el
informe. Para hacer esto, usaremos Update y Select, antes de imprimir la línea en la
pantalla. La actuaclización, sin embargo, asume que un comprador dado sólo ha
comprado uno de todos los productos dados, o sino, el precio será incrementado
demasiadas veces. Por otra parte, una "FilaID" podría haber sido utilizada (ver
documentación). Además observa los dos puntos antes de los nombres de las variables
locales cuando son usada dentro de sentencias de SQL.*/
¿Por qué no puede preguntar simplemente por las tres primeras filas de la tabla?
Porque en las bases de datos relacionales, las filas son insertadas en un orden particular,
esto es, el sistema las inserta en un orden arbitrario; así, que sólo puedes pedir filas
usando un válida construcción SQL, como ORDER BY, etc.
¿Qué es eso de DDL y DML?. DDL (Data Definition Language) se refiere (en SQL) a
la sentencia de creación de tabla... DML (Data Manipulation Language) se refiere a las
sentencia Select, Update, Insert y Delete.
¿No son las tablas de las bases de datos como ficheros? Bueno, el DBMS almacena los
datos en ficheros declarados por los administrados del sistema antes de que nuevas
tablas sean creadas (en grandes sistemas), pero el sistema almacena los datos en un
formato especial, y puede diseminar los datos de una tabla sobre muchos archivos. En el
mundo de la base de datos, un conjunto de archivos creados por la base de datos es
llamado "tablespace". En general, en pequeños sistemas, todos lo relacionado con una
base de datos (definiciones y todo los datos de la tabla) son guardados en un archivo.
¿Són las tablas de datos como hojas diseminadas? No, por dos razones. Primera, las
hojas diseminadas pueden tener datos en una celda, pero una celda es más que una
simple intersección de fila-columna. Dependiendo del software de diseminación de
hojas, una celda puede contener formulas y formatos, los cuales no pueden ser tenidos
por una tabla de una base de datos. Segundo, las celdas diseminadas son usualmente
dependientes de datos en otras celdas. En las bases de datos, las celdas son
independientes, excepto que las columnas estén lógicamente relacionadas (por suerte,
una fila de columnas, describe, en conjunto, una entidad), y cada fila en una tabla es
independiente del resto de filas.
¿Cómo puedo importar un archivo texto de datos dentro de una base de datos? Bueno,
no puedes hacerlo directamente... debes usar una utilidad, como "Oracle’s
SQL*Loader", o escribir un programa para cargar los datos en la base de datos. Un
programa para hacerlo simplemente iría de registro en registro de un archivo texto,
dividiéndolo en columnas, y haciendo un Insert dentro de la base de datos.
¿Hay algún filtro en general que pueda usar para hacer mis consultas SQL y bases de
datos mejores y más rápidas (optimizadas)? Puedes intentar, si puedes, evitar
expresiones en Selects, tales como SELECT ColumnaA + Columna B, etc. La consulta
optimizada de la base de datos, la porción de la DBMS que determina el mejor camino
para conseguir los datos deseados fuera de la base de datos, tiene expresiones de tal
forma que puede requerir más tiempo recuperar los datos que si las columnas fueran
seleccionadas de forma normal, y las expresiones se manejaran programáticamente.
Si estas usando una unión, trata de tener las columnas unidas por índices (desde
ambas tablas).
Cuando tengas dudas, índice.
A no ser que tengas múltiples cuentas o consultas complejas, usa COUNT(*) (el
número de filas generadas por la consulta) mejor que
COUNT(Nombre_Columna).
Hay alguna redundancia en cada forma, y si los datos están en la 3FN , también lo
estarán en la 1FN y en la 2FN, y si lo están en la 2FN, también lo estarán en la 1FN. En
términos de diseño de datos, almacenar los datos, de tal manera, que cualquier columna
no-clave primaria esté en dependencia sólo de la entera clave primaria. Si observas el
ejemplo de base de datos, verás que la única forma de navegar através de la base de
datos es utilizando uniones usando columnas clave.
Otros dos importantes puntos en una base de datos es usar buenos, consistentes, lógicos,
y enteros nombres para las tablas y las columnas, y usar nombres completos en la base
de datos también. En el último punto, mi base de datos es falta de nombres, así que uso
códigos numéricos para la identificación. Es usualmente mejor, si es posible, tener
claves que, por si misma, sea expliquen, por ejemplo, a clave mejor puede ser las
primeras cuatro letras del apellido y la primera inicial del propietario, como JONEB por
Bill Jones (o para evitar redundancias, añadir un número, JONEB1, JONEB2 ...).
¿Cuál es la diferencia entre una simple consulta de fila y una múltiple consulta de
filas y por qué es importante conocer la diferencia? Primero, para cubrir lo obvio, una
consulta de una sólo fila es una consulta que sólo devuelve una fila como resultado, y
una consulta de múltiples filas es una consulta que devuelve más de una fila como
resultado. Si una consulta devuelve una fila o más esto depende enteramente del diseño
(o esquema) de las tablas de la base de datos. Como escritor de consultas, debes conocer
el esquema, estar seguro de incluir todas las condiciones, y estructurar tu sentencia SQL
apropiadamente, de forma que consigas el resultado deseado (aunque sea una o
múltiples filas). Por ejemplo, si quieres estar seguro que una consulta de la tabla
Propietarios_Antigüedades devuelve sólo una fila, considera una condición de igualdad
de la columna de la clave primaria, ID_Propietario. Tres razones vienen
inmediatamente a la mente de por qué esto es importante. Primero, tener múltiples filas
cuando tú sólo esperabas una, o viceversa, puede significar que la consulta es errónea,
que la base de datos está incompleta, o simplemente, has aprendido algo nuevo sobre tus
datos. Segundo, se estás usando una sentencia Update o Delete, debes de estar seguro
que la sentencia que estás escribiendo va a hacer la operación en la fila (o filas) que tú
quieres... o sino, estarás borrando o actualizando más filas de las que querías. Tercero,
cualquier consulta escrita en SQL embebido debe necesitar ser construida para
completar el programa lógico requerido. Si su consulta, por otra parte, devuelve
múltiples filas, deberás usar la sentencia Fetch, y muy probablemente, algún tipo de
estructura de bucle para el procesamiento iterativo de las filas devueltas por la consulta.
Una relación Uno-a-Uno significa que tienes una columna clave primaria que
está relacionada con una columna clave ajena, y que para cada valor de la clave
primaria, hay un valor de clave ajena. Por ejemplo, en el primer ejemplo, la tabla
de direcciones de empleados, nosotros añadimos una columna ID_EMPLEADO.
Entonces, la tabla de direcciones de empleados está relacionada con la
Tabla_estadistica_empleados (segundo ejemplo de tabla) por medio de este
ID_EMPLEADO. Específicamente, cada empleado en la tabla de direcciones de
empleados tiene estadísticas (una fila de datos) en la
Tabla_estadistica_empleados. Incluso, piensa que este es un ejemplo efectuado,
es una relación de "1-1". Además, ten en cuenta, el "tiene" en fuerte... cuando se
expresa una relación, es importante describir la relación con un verbo.
Las otras dos tipos de relaciones pueden o no puede usar claves primarias
lógicas y claves ajenas necesariamente... esto es estrictamente una llamada del
sistema. La primera de éstas es la relación Uno-a-Muchos ("1-M"). Esto
significa que para cada valor de la columna en una tabla, hay uno o más valores
relaciones en otra tabla. Habrá que añadir de forma necesaria claves en el diseño
o, posiblemente, algún tipo de columna identificador deberá ser usado para
establecer la relación. Un ejemplo podría ser que para todos ID_Propietario en la
tabla Propietarios_Antigüedades, hubierán uno o mas (cero también pude ser)
productos comprados en la tabla Antigüedades (verbo: comprar).
Finalmente, la relación de Muchos-a-Muchos ("M-M") generalmente no
involucra claves, y usualmente involucra columnas identificativas. La inusual
ocurrencia de un "M-M" significa que una columna en una tabla está relacionada
con otra columna en otra tabla, y para cada valor de uno de estas dos columnas,
hay uno o más valores relacionados en la correspondiente columna en la otra
tabla (y viceversa), o más comúnmente posible, dos tablas tienen una relación
"1-M" para cada una (dos relaciones, una 1-M para cada camino). Un (malo)
ejemplo o ésta más común situación podría ser si tuvieras una base de datos que
asignara trabajo, donde una tabla tuviera una fila por cada empleado y trabajo
asignado, y otra tabla tuviera una fila por trabajo por cada uno de los
trabajadores asignados. Aquí, podrías tener múltiples filas por cada empleado en
la primera tabla, o pro cada trabajo asignado, y múltiples filas por cada trabajo
en la segunda tabla, una por empleado asignado al proyecto. Estas tablas tienen
un M-M: cada empleado en la primera tabla puede tener tantos trabajos
asignados de la segunda tabla como trabajos haya en ella, y cada trabajo puede
tener tanto empleados como empleados haya en la primera tabla. Esto es la punta
del iceberg en este tópico... mira los links abajo para más información.
Además, algunos DBMS permiten usar más funciones en listas Select, excepto que estas
funciones (algunas funciones de carácter permite resultados de múltiples filas) vayan a
ser usadas con un valor individual (no grupos), en consultas de simples filas. Las
funciones deben ser usada sólo con tipos de datos apropiados. Aquí hay algunas
funciones Matemáticas:
Funciones numéricas:
Aquí están las formas generales de las sentencias que hemos visto en este tutorial,
además de alguno información extra de algunas. RECUERDA que todos estas
sentencias pueden o no pueden estar disponibles en tu sistema, así que comprueba la
documentación del mismo.
COMMIT;
Hace cambios hechos por algún sistema permanente de base de datos (desde el último
COMMIT; conocido por transacción)
[Link] fuerza que dos filas no puedan tener el mismo valor para esa columna.
[Link] permite que se comprueba una condición cuando un dato es esa columna es
actualizado o insertado; por ejemplo, CHECK(PRECIO 0), hace que el sistema
compruebe que el precio de la columna es mayor de cero antes de aceptar el valor...
algunas veces implementado como sentencia CONSTRAINT.
[Link] inserta el valor por defecto en la base de datos si una fila es insertada sin
insertar ningún dato en la columna; por ejemplo: BENEFICIOS INTEGER
DEFAULT=10000;
[Link] KEY hace lo mismo que la clave primaria, pero es seguida por::
REFERENCES <TABLE NAME (<COLUMN NAME), que hacen referencia a la clave
primaria relacionada.
ROLLBACK; --deshace los cambios en la base de datos que hallas hecho desde el
último Commit... cuidado! Algunos software usan automáticamente Commit’s en
sistemas que usan construcciones de transacción, así que el comando RollBack podría
no ir.
SELECT [DISTINCT|ALL] <LISTA DE COLUMNAS, FUNCTIONES,
CONSTANTES, ETC.
FROM <LISTA DE TABLAS OR VISTAS
[WHERE <CONDICION(S)]
[GROUP BY <GROUPING COLUMN(S)]
[HAVING <CONDITION]
[ORDER BY <ORDERING COLUMN(S) [ASC|DESC]]; --donde ASC|DESC
permite ordenas en orden ASCendente o
DESCendente