Tutorial SQtutorial SQL

Recuperar datos Para recuperar datos, se utiliza la sentencia SELECT. Básicas SELECT * FROM nombre_tabla Devuelve todos

Views 44 Downloads 0 File size 19KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Recuperar datos Para recuperar datos, se utiliza la sentencia SELECT. Básicas SELECT * FROM nombre_tabla Devuelve todos los campos de la tabla. SELECT campo1, campo2, campo3 FROM nombre_tabla Devuelve sólo 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 más an tiguos primero). SELECT campo1, campo2 FROM nombre_tabla ORDER BY campoFecha DESC Devuelve campo 1 y campo2 ordenados por fecha descendente (los más 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 más de un empleado en la misma ciudad: esta sentencia nos de vuelve la lista de ciudades). Cláusula WHERE La cláusula 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 día 22 de Febrero del 2001. NOTA: Hay varias formas de especificar una fecha en SQL. Además, los delimitadores

(#) para dejar claro que la expresión 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 serían devueltos). SELECT * FROM nombre_tabla WHERE campo1 LIKE '%a' Devuelve todos los campos de las filas con campo1 terminando en a (Málaga, Barcelo na, Segovia serían 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 cláusula 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 = 25 AND vacaciones = 25000 Devuelve cuántos 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 través 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 expresión: 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 Pérez', 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 numéricos, 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 también 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 restricción que sean no nulos, no indicarles un valor generaría 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 cláusula WHERE, los cambios afectarían 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 clásula WHERE borramos toda la tabla!!!

Trabajar con múltiples tablas (JOINS) Todos los ejemplos vistos en la sección 'Recuperar datos' son bastante útiles, pero tienen la pega de que sólo pueden tratar con datos de una tabla. Para trabajar con múltiples 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 más 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 después 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 envíen los productos al cliente. Podríamos 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), añadiríamos 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, haríamos: SELECT * FROM Pedidos WHERE Nombre = 'Pepito' AND Apellido = 'Grillo' Y lo tenemos ¿verdad? Bien, esta solución es realmente pésima por varios motivos: estamos repitiendo const antemente información en la tabla, como los datos personales. Además, no es una solu ción muy flexible: si alguien se equivoca en el nombre del producto o se cambia, h

abría que actualizar toda la tabla buscando ese nombre y cambiándolo. La solución Una base de datos bien diseñada, tendría 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 (artículo, 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 ¿Véis la diferencia? Nuestra tabla Productos guarda el nombre y el precio (en una si tuación real guardaría muchas más cosas, por supuesto), la tabla Clientes guarda los d atos de nuestros clientes, Pedidos almacena un resumen por así decirlo de un pedid o: quién es el cliente y la fecha del pedido. El resto del pedido se guarda en la tabla Detalles_Pedido, que guarda cada artículo (con su cantidad) correspondiente a un único pedido. Os habréis 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 día. Además, 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 ASPFácil 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 quién es Pepito Grillo y sabemos qué es una Escoba ASPFácil DeLuxe(R), sólo tenemos que relacionar ambas entidades para indicar que Pepito se ha comprado la escoba. Ten emos que añadir 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

demás de esto, tenemos que indicar que ha comprado la megaescoba, en concreto 4 de ellas. Añadimos entonces a la tabla Detalles_Pedido lo siguinte: 2455758 24557 345 4 Fijáos bien en los números en negrita... Efectivamente, son el IDPedido que teníamos más arriba, y que nos indica una forma de saber quién ha comprado esto y cuándo, y el I DProducto, que nos indica una forma de saber qué es esto, como se llama y cuánto 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 más actividad, de cuántas escobas se han comprado en determinado intervalo de tiempo... Además, tenemos la información guardada de forma ordenada, de tal forma que si queremos enviar un ema il a todos nuestros clientes sólo 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 cómo 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. Fijáos en la sintaxis: después de FROM ponemos Clientes INNER JOIN Pedidos (base de datos, relacióname Clientes y Pedidos) ON Clientes.IDCliente = Pedidos.IDCliente ( porque el IDCliente de Pedidos es el mismo que en Clientes). Nuestra cláusula WHERE anterior sería mucho mejor si la cambiásemos para preguntar por IDCliente directamente. Lo he escrito con el nombre para que fuera más 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#; Olvidáos de los nombres de los campos y mirad después 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. Después, se resuelve el INNER JOIN que hemos dejado abierto, después de cerrar el pa réntesis: ) ON Prod.IDProducto = Detalles_Pedido.IDProducto. Por último, añadimos nuestra condición: 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 versión Access 97, que podéis descargar haciendo click aquí. Os recomiendo q ue trasteéis, que añadáis usuarios y productos, y que desde la Vista SQL de una consul ta Access practiquéis este tipo de consultas. En la base de datos tenéis las cuatro tablas, y un par de consultas guardadas. Podéi s ver los resultados que devuelven, y también su código SQL.