Tutorial SQtutorial SQL

7
 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

description

DESCRIPCION SQL

Transcript of Tutorial SQtutorial SQL

Recuperar datosPara recuperar datos, se utiliza la sentencia SELECT.BsicasSELECT * FROM nombre_tablaDevuelve todos los campos de la tabla.SELECT campo1, campo2, campo3 FROM nombre_tablaDevuelve slo los campos campo1, campo2, campo3 de la tabla..SELECT campo1, campo2 FROM nombre_tabla ORDER BY campoFechaDevuelve campo1 y campo2 de la tabla y los ordena for fecha ascendente (los ms antiguos primero).SELECT campo1, campo2 FROM nombre_tabla ORDER BY campoFecha DESCDevuelve campo 1 y campo2 ordenados por fecha descendente (los ms nuevos primero).SELECT DISTINCT Ciudad FROM Empleados ORDER BY CiudadDevuelve el campo Ciudad de la tabla Empleados con todos los duplicados eliminados (probablemente hay ms de un empleado en la misma ciudad: esta sentencia nos devuelve la lista de ciudades).Clusula WHERELa 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 Ciudad.SELECT * FROM nombre_tabla WHERE Ciudad = 'Madrid' AND Edad = 35Devuelve todos los campos de la tabla de las filas en las que Ciudad valga Madrid y Edad sea 35.SELECT * FROM nombre_tabla WHERE campo_numerico >= 150Devuelve 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 funciona 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, Madagascar, Madmadmad seran devueltos).SELECT * FROM nombre_tabla WHERE campo1 LIKE '%a'Devuelve todos los campos de las filas con campo1 terminando en a (Mlaga, Barcelona, Segovia seran devueltas).SELECT * FROM nombre_tabla WHERE campo1 LIKE '%bruno%'Devuelve las filas en las que campo1 contenga bruno al principio, al final, enmedio o incluso como parte de una palabra.Condiciones compuestasPodemos 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 = 25 AND vacaciones = 25000Devuelve cuntos empleados tienen un salario mayor o igual que 25000.SELECT SUM(precio) FROM pedidosDevuelve la suma total del precio de todos los pedidos.Para utilizar estas funciones de agregado desde ASP a travs de un objeto Recordset, 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 PedidosInsertar datosPara insertar una nueva fila utilizamos la sentencia INSERT INTO, de esta forma:INSERT INTO nombre_tabla (nombre, edad, IDdepartamento, salario, fecha_alta, casado) VALUES ('Javier Prez', 28, 4, 25000, #2001-04-01#, 1)Hay que tener en cuenta los tipos de datos: nombre es de texto, edad, IDdepartamento y salario son numricos, fecha_alta es fecha (sustituir las almohadillas # por 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 tienen un valor por defecto o admiten valores nulos. En caso contrario, si tienen puesta como restriccin que sean no nulos, no indicarles un valor generara un error.Modificar datosPodemos modificar los datos que tenemos guardados mediante la sentencia UPDATE:UPDATE nombre_tabla SET nombre = 'Carlos', IDdepartamento = 5, fecha_baja = #2002-12-31# WHERE nombre = 'carlos'Esta sentencia actualiza los datos del(los) registro(s) con nombre igual a carlos, poniendo el nombre ahora a Carlos, el IDdepartamento a 5 y la fecha de baja al 31 de Diciembre del 2002.Muy importante: si omitimos la clusula WHERE, los cambios afectaran a toda la tabla!!!Borrar datosPodemos eliminar filas (registros) de una tabla con la sentencia DELETE:DELETE FROM nombre_tabla WHERE campoID = 285Al 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 estudioSupongamos 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 como el nombre del producto, su precio, etc. para poder enviar pedidos a los proveedores 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 constantemente informacin en la tabla, como los datos personales. Adems, no es una solucin muy flexible: si alguien se equivoca en el nombre del producto o se cambia, habra que actualizar toda la tabla buscando ese nombre y cambindolo.La solucinUna 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 situacin real guardara muchas ms cosas, por supuesto), la tabla Clientes guarda los datos de nuestros clientes, Pedidos almacena un resumen por as decirlo de un pedido: 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 facilitan 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 sirven para unir correctamente las tablas.Supongamos que tenemos metidos los datos de Pepito Grillo en la tabla de clientes, 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 comprarnos 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. Tenemos 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. Adems 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 IDProducto, que nos indica una forma de saber qu es esto, como se llama y cunto cuesta.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 email a todos nuestros clientes slo tenemos que hacer un SELECT de Clientes: si queremos subir todos los precios un 10% solo tenemos que actualizar la tabla de productos...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 JOIN Pedidos ON Clientes.IDCliente = Pedidos.IDCliente WHERE Clientes.Nombre='Pepito' AND Clientes.Apellido='Grillo'Aunque parezca complicado no lo es: se debe a que hay que escribir los nombres de las tablas delante de los campos, cuando empleamos varias. Esta sentencia simplemente 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.IDProducto = Detalles_Pedido.IDProducto WHERE Pedidos.FechaPedido BETWEEN #1/1/01# AND #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, mientras resuelvo el segundo dentro, que es Detalles_Pedido INNER JOIN Pedidos ON Pedidos.IDPedido = Detalles_Pedido.IDPedido. Simplemente es escribir, con un poco 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 parntesis: ) 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 que trasteis, que aadis usuarios y productos, y que desde la Vista SQL de una consulta Access practiquis este tipo de consultas.En la base de datos tenis las cuatro tablas, y un par de consultas guardadas. Podis ver los resultados que devuelven, y tambin su cdigo SQL.