Sie sind auf Seite 1von 7

Recuperar datos

Para recuperar datos, se utiliza la sentencia SELECT.


Bsicas
SELECT * FROM nombre_tabla
Devuelve todos los campos de la tabla.
SELECT campo1, campo2, campo3 FROM nombre_tabla
Devuelve slo los campos campo1, campo2, campo3 de la tabla..
SELECT campo1, campo2 FROM nombre_tabla ORDER BY campoFecha
Devuelve campo1 y campo2 de la tabla y los ordena for fecha ascendente (los ms an
tiguos primero).
SELECT campo1, campo2 FROM nombre_tabla ORDER BY campoFecha DESC
Devuelve campo 1 y campo2 ordenados por fecha descendente (los ms nuevos primero)
.
SELECT DISTINCT Ciudad FROM Empleados ORDER BY Ciudad
Devuelve el campo Ciudad de la tabla Empleados con todos los duplicados eliminad
os (probablemente hay ms de un empleado en la misma ciudad: esta sentencia nos de
vuelve la lista de ciudades).
Clusula WHERE
La clusula WHERE nos permite especificar un criterio para recuperar los datos.
SELECT * FROM nombre_tabla WHERE Ciudad = 'Madrid'
Devuelve todos los campos de todas las filas que tengan Madrid en el campo Ciuda
d.
SELECT * FROM nombre_tabla WHERE Ciudad = 'Madrid' AND Edad = 35
Devuelve todos los campos de la tabla de las filas en las que Ciudad valga Madri
d y Edad sea 35.
SELECT * FROM nombre_tabla WHERE campo_numerico >= 150
Devuelve los registros con campo_numerico mayor o igual que 150.
SELECT campo1, campo2 FROM nombre_tabla WHERE campo_fecha = #2001-2-22#
Devuelve campo1 y campo2 de la tabla donde el campo_fecha es del da 22 de Febrero
del 2001.
NOTA: Hay varias formas de especificar una fecha en SQL. Adems, los delimitadores

(#) para dejar claro que la expresin es una fecha son la almohadilla del ejemplo
para Access y las comillas simples (') para SQL Server. El formato aaaa-mm-dd f
unciona igual de bien en ambos sistemas, por eso lo utilizo.
SELECT * FROM nombre_tabla WHERE campo1 LIKE 'Mad%'
Devuelve todos los campos de las filas con campo1 comenzando por Mad (Madrid, Ma
dagascar, Madmadmad seran devueltos).
SELECT * FROM nombre_tabla WHERE campo1 LIKE '%a'
Devuelve todos los campos de las filas con campo1 terminando en a (Mlaga, Barcelo
na, Segovia seran devueltas).
SELECT * FROM nombre_tabla WHERE campo1 LIKE '%bruno%'
Devuelve las filas en las que campo1 contenga bruno al principio, al final, enme
dio o incluso como parte de una palabra.
Condiciones compuestas
Podemos especificar varios criterios en la clusula WHERE.
SELECT * FROM nombre_tabla WHERE campo1 = 4500 AND campo_fecha >= # 2000-12-31#
Devuelve las filas con campo1 = 4500 y campo_fecha mayor que el 31 de Diciembre
de 2000.
SELECT * FROM nombre_tabla WHERE campo1 = 'Javier' OR campo1 = 'Carlos'
Devuelve las filas con campo1 igual a Javier o Carlos.
SELECT * FROM nombre_tabla WHERE salario >= 25000 AND ( vacaciones <= 100 OR jef
e = 'Hugo')
Devuelve las filas en las que el salario es mayor o igual que 25.000, y o bien t
iene 100 das de vacaciones o bien su jefe es Hugo. :-)
SELECT * FROM nombre_tabla WHERE vacaciones BETWEEN 25 AND 50
Devuelve las filas en las que tengamos entre 25 y 50 das de vacaciones. Es equiva
lente a WHERE vacaciones >= 25 AND vacaciones <= 50
SELECT * FROM nombre_tabla WHERE nombre IN ('Carlos, Efra, Alejo, Erika, Irene,
Javier')
Devuelve las filas cuyo nombre sea uno de entre Carlos, Efra, Alejo, Erika, Iren
e o Javier, es decir, cuyo nombre est en la lista de nombres.
SELECT tabla1.nombre, tabla1.departamento FROM tabla1 WHERE tabla1.nombre = tabl
a2.nombre

Devuelve el nombre y departamento de la tabla1 de aquellas filas en las que el n


ombre coincida con el nombre de la tabla2.
Funciones de agregado
Las funciones de agregado permiten hacer operaciones sobre los campos y devolver
el resultado de stas.
SELECT MAX(vacaciones) FROM empleados
Devuelve el valor ms alto del campo vacaciones.
SELECT MIN(edad) FROM empleados
Devuelve la edad del empleado ms joven.
SELECT AVG(vacaciones) FROM empleados
Devuelve la media (average) del campo vacaciones.
SELECT Count(salario) FROM empleados WHERE salario >= 25000
Devuelve cuntos empleados tienen un salario mayor o igual que 25000.
SELECT SUM(precio) FROM pedidos
Devuelve la suma total del precio de todos los pedidos.
Para utilizar estas funciones de agregado desde ASP a travs de un objeto Recordse
t, tendremos que utilizar el ndice para acceder al campo as: rs.Fields(0), o bien
dar un alias a la expresin:
SELECT SUM(precio) AS Suma FROM Pedidos

Insertar datos
Para insertar una nueva fila utilizamos la sentencia INSERT INTO, de esta forma:
INSERT INTO nombre_tabla (nombre, edad, IDdepartamento, salario, fecha_alta, cas
ado) VALUES ('Javier Prez', 28, 4, 25000, #2001-04-01#, 1)
Hay que tener en cuenta los tipos de datos: nombre es de texto, edad, IDdepartam
ento y salario son numricos, fecha_alta es fecha (sustituir las almohadillas # po
r comillas simples en SQL Server) y casado es Verdadero/Falso (bit), siendo un 1
Verdadero.
Hay que hacer notar tambin que podemos omitir algunos campos de la fila, si tiene
n un valor por defecto o admiten valores nulos. En caso contrario, si tienen pue
sta como restriccin que sean no nulos, no indicarles un valor generara un error.
Modificar datos
Podemos modificar los datos que tenemos guardados mediante la sentencia UPDATE:

UPDATE nombre_tabla SET nombre = 'Carlos', IDdepartamento = 5, fecha_baja = #200


2-12-31# WHERE nombre = 'carlos'
Esta sentencia actualiza los datos del(los) registro(s) con nombre igual a carlo
s, poniendo el nombre ahora a Carlos, el IDdepartamento a 5 y la fecha de baja a
l 31 de Diciembre del 2002.
Muy importante: si omitimos la clusula WHERE, los cambios afectaran a toda la tabl
a!!!

Borrar datos
Podemos eliminar filas (registros) de una tabla con la sentencia DELETE:
DELETE FROM nombre_tabla WHERE campoID = 285
Al igual que ocurre con UPDATE, si no especificamos la clsula WHERE borramos toda
la tabla!!!

Trabajar con mltiples tablas (JOINS)


Todos los ejemplos vistos en la seccin 'Recuperar datos' son bastante tiles, pero
tienen la pega de que slo pueden tratar con datos de una tabla. Para trabajar con
mltiples tablas hay que hacer uso de los JOINS, que hace que las bases de datos
sean relacionales, para hablar en cristiano...
Utilizar Joins permite enlazar datos de dos o ms tablas juntos en el resultado de
una nica consulta, desde una nica sentencia SELECT.
Este tipo de consultas pueden ser reconocidas cuando hay varias tablas despus de
FROM.
Un caso de estudio
Supongamos que queremos llevar cuenta en base de datos de los pedidos de nuestra
empresa. Queremos guardar el nombre del cliente, sus datos personales, etc, as c
omo el nombre del producto, su precio, etc. para poder enviar pedidos a los prov
eedores y que le enven los productos al cliente.
Podramos pensar en una tabla con estos campos:
IDPedido Nombre Apellidos Tlf Producto Precio
As, cada vez que Pepito Grillo compre algo en nuestra tienda (virtual o real, por
supuesto), aadiramos una fila con una sentencia INSERT como sta:
2830022 Pepito Grillo 555-33-22 Escoba 45
De esta forma, si queremos recuperar todos los pedidos de Pepito Grillo, haramos:
SELECT * FROM Pedidos WHERE Nombre = 'Pepito' AND Apellido = 'Grillo'
Y lo tenemos verdad?
Bien, esta solucin es realmente psima por varios motivos: estamos repitiendo const
antemente informacin en la tabla, como los datos personales. Adems, no es una solu
cin muy flexible: si alguien se equivoca en el nombre del producto o se cambia, h

abra que actualizar toda la tabla buscando ese nombre y cambindolo.


La solucin
Una base de datos bien diseada, tendra varias tablas:
Una tabla para registrar clientes.
Una tabla con los datos de nuestros productos.
Otra para registrar los pedidos que nos haga.
Y una ltima para registrar los detalles de esos pedidos (artculo, cantidad, etc).
Imaginemos las siguientes tablas:
Productos
IDProducto
Nombre
Precio
Clientes
IDCliente
Nombre
Apellido
Direccion
Telefono
Email
Pedidos
IDPedido
IDCliente
FechaPedido
Detalles_Pedido
ID_DetPedido
IDPedido
IDProducto
Cantidad
Vis la diferencia? Nuestra tabla Productos guarda el nombre y el precio (en una si
tuacin real guardara muchas ms cosas, por supuesto), la tabla Clientes guarda los d
atos de nuestros clientes, Pedidos almacena un resumen por as decirlo de un pedid
o: quin es el cliente y la fecha del pedido. El resto del pedido se guarda en la
tabla Detalles_Pedido, que guarda cada artculo (con su cantidad) correspondiente
a un nico pedido.
Os habris fijado que las 4 tablas tiene campos ID_loquesea. Estos campos facilita
n mucho las cosas, puesto que identifican cada registro de la tabla de forma nica
, aunque tengamos 5 clientes que se llamen Pepito Grillo y 25 pedidos del mismo
cliente en el mismo da. Adems, estos campos, definidos como clave principal, nos s
irven para unir correctamente las tablas.
Supongamos que tenemos metidos los datos de Pepito Grillo en la tabla de cliente
s, y que tenemos el producto escoba con este registro en Productos:
345 Escoba ASPFcil DeLuxe(R) 250
Bien, es un poco cara... En cualquier caso, ahora Pepito Grillo decide comprarno
s cuatro escobas. Qu hacemos con nuestra base de datos? Pues muy poco. Si sabemos
quin es Pepito Grillo y sabemos qu es una Escoba ASPFcil DeLuxe(R), slo tenemos que
relacionar ambas entidades para indicar que Pepito se ha comprado la escoba. Ten
emos que aadir algo como esto a Pedidos:
24557 234 26/3/2001
Qu es esto? Aqu no veo nada... Bien, 234 es el IDCliente que tiene Pepito Grillo. A

dems de esto, tenemos que indicar que ha comprado la megaescoba, en concreto 4 de


ellas. Aadimos entonces a la tabla Detalles_Pedido lo siguinte:
2455758 24557 345 4
Fijos bien en los nmeros en negrita... Efectivamente, son el IDPedido que tenamos ms
arriba, y que nos indica una forma de saber quin ha comprado esto y cundo, y el I
DProducto, que nos indica una forma de saber qu es esto, como se llama y cunto cue
sta.
Fijaos todas las ventajas que hemos adquirido de repente: ahora podemos obtener
informes de los pedidos, de los clientes, de las fechas de ms actividad, de cuntas
escobas se han comprado en determinado intervalo de tiempo... Adems, tenemos la
informacin guardada de forma ordenada, de tal forma que si queremos enviar un ema
il a todos nuestros clientes slo tenemos que hacer un SELECT de Clientes: si quer
emos subir todos los precios un 10% solo tenemos que actualizar la tabla de prod
uctos...
Y con SQL?
Vamos haber cmo obtener datos de estas tablas.
Para obtener todas las compras que ha hecho Pepito Grillo en nuestra tienda:
SELECT Clientes.Nombre, Clientes.Apellido, Pedidos.Fecha FROM Clientes INNER JOI
N Pedidos ON Clientes.IDCliente = Pedidos.IDCliente WHERE Clientes.Nombre='Pepit
o' AND Clientes.Apellido='Grillo'
Aunque parezca complicado no lo es: se debe a que hay que escribir los nombres d
e las tablas delante de los campos, cuando empleamos varias. Esta sentencia simp
lemente devuelve el nombre, apellido y fecha. Devuelve una fila para cada pedido
que tengamos guardado de Pepito Grillo.
Fijos en la sintaxis: despus de FROM ponemos Clientes INNER JOIN Pedidos (base de
datos, relaciname Clientes y Pedidos) ON Clientes.IDCliente = Pedidos.IDCliente (
porque el IDCliente de Pedidos es el mismo que en Clientes).
Nuestra clusula WHERE anterior sera mucho mejor si la cambisemos para preguntar por
IDCliente directamente. Lo he escrito con el nombre para que fuera ms claro.
Vamos a obtener los productos vendidos en los meses de Enero y Febrero, uniendo
3 tablas:
SELECT Prod.Nombre, Prod.Precio FROM Productos Prod INNER JOIN ( Detalles_Pedido
INNER JOIN Pedidos ON Pedidos.IDPedido = Detalles_Pedido.IDPedido) ON Prod.IDPr
oducto = Detalles_Pedido.IDProducto WHERE Pedidos.FechaPedido BETWEEN #1/1/01# A
ND #1/3/01#;
Olvidos de los nombres de los campos y mirad despus de FROM:
FROM Productos Prod simplemente hace un alias para la tabla para poder llamar a
los campos con Prod.campo en lugar de Productos.campo.
INNER JOIN (...: Como voy a unir 3 tablas, el primer INNER JOIN queda abierto, m
ientras resuelvo el segundo dentro, que es Detalles_Pedido INNER JOIN Pedidos ON
Pedidos.IDPedido = Detalles_Pedido.IDPedido. Simplemente es escribir, con un po
co de paciencia, que el IDPedido es el mismo en Pedidos y Detalles_Pedido.
Despus, se resuelve el INNER JOIN que hemos dejado abierto, despus de cerrar el pa
rntesis: ) ON Prod.IDProducto = Detalles_Pedido.IDProducto.
Por ltimo, aadimos nuestra condicin: WHERE Pedidos.FechaPedido BETWEEN #1/1/01# AND
#1/3/01#;.

Para descargar...
Como estas cosas se ven mejor en vivo, os he preparado una copia de esta base de
datos en versin Access 97, que podis descargar haciendo click aqu. Os recomiendo q
ue trasteis, que aadis usuarios y productos, y que desde la Vista SQL de una consul
ta Access practiquis este tipo de consultas.
En la base de datos tenis las cuatro tablas, y un par de consultas guardadas. Podi
s ver los resultados que devuelven, y tambin su cdigo SQL.

Das könnte Ihnen auch gefallen