SQL For Dummies

8,041 views

Published on

Ayudantía de Bases de Datos, introducción a SQL.

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,041
On SlideShare
0
From Embeds
0
Number of Embeds
53
Actions
Shares
0
Downloads
290
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

SQL For Dummies

  1. 1. SQL for Dummies Bases de Datos 2012-1 18 de Abril del 2012Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  2. 2. Antes de Comenzar…• Presentación Personal.• Conocimientos previos?• Expectativas sobre el curso?• Algunos detalles del curso.Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  3. 3. Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  4. 4. ¿Qué es SQL?• Structured Query Language que no es más que un lenguaje estándar de comunicación con bases de datos.• OJO: ’’’’’’’’’’’Estándar’’’’’’’’’’’, varía Levemente de un DBMS a otro.• Aparte de esta pseudo-universalidad SQL posee otras características interesantes: – Explota la potencia y flexibilidad de las BDs relacionales. – Relativamente fácil de aprender. – Orientación a “registros” (filas).Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  5. 5. Tipos de Datos I• Pregunta: Qué es una Base de Datos Relacional?• Un aspecto previo a considerar es la naturaleza de los valores que introducimos en esos campos. – Capturar la esencia del dato a guardar. – Facilitar búsquedas posteriores. – Optimizar los recursos de memoria.• Cada base de datos introduce sus tipos de datos que no necesariamente están presentes en otras. Sin embargo, existe un conjunto de tipos (de datos) que están representados en la totalidad de estas bases.Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  6. 6. Tipos de Datos IIOsvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  7. 7. Creación de Tablas I• En general, para la mayoría de los DBMS existen potentes editores de modelos de datos que permiten la rápida creación y modificación de tablas. Existen razones para crear nuevas tablas en un modelo existente: – De carácter temporal (generalmente para procedimientos almacenados). – De carácter permanente (por necesidades concretas de nuestra aplicación).Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  8. 8. Creación de Tablas IIOsvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  9. 9. Creación de Tablas III• La sintaxis de creación puede variar ligeramente de una base de datos a otra ya que los tipos de campo aceptados no están completamente estandarizados. La sintaxis para realizar la creación de una tabla, suele ser algo como lo siguiente. CREATE TABLE nombre_tabla ( nombre_campo_1 tipo_1 propiedades_1, nombre_campo_2 tipo_2 propiedades_2, nombre_campo_n tipo_n propiedades_n, PRIMARY KEY( nombre_campo_x , ... ) )Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  10. 10. Creación de Tablas IV• Ejemplo: Crear una tabla de clientes: CREATE TABLE cliente ( cli_id INT(4) NOT NULL AUTO_INCREMENT, cli_nombre VARCHAR(50), cli_apellidos VARCHAR(100), cli_direccion VARCHAR(500), cli_email VARCHAR(255), cli_codigo_postal VARCHAR(50), cli_poblacion VARCHAR(255), cli_pedidos INT PRIMARY KEY( cli_id ))Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  11. 11. Creación de Tablas V• Del mismo modo podríamos crear la tabla de artículos con una sentencia como ésta: CREATE TABLE articulo ( art_id INT(4) NOT NULL AUTO_INCREMENT, art_titulo VARCHAR(50), art_autor VARCHAR(25), art_editorial VARCHAR(25), art_recio REAL, PRIMARY KEY( art_id ) )Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  12. 12. Creación de Tablas VI• Finalmente para una tabla de pedidos: CREATE TABLE pedido ( ped_id INT(4) NOT NULL AUTO_INCREMENT, cli_id INT(4) NOT NULL, art_id INT(4) NOT NULL, ped_fecha DATE, ped_cantidad INT(4), ped_total INT(4), FOREIGN KEY (cli_id) REFERENCES cliente(cli_id), FOREIGN KEY (art_id) REFERENCES articulo(art_id), PRIMARY KEY(ped_id) )Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  13. 13. Insertar un Registro• Los registros pueden ser introducidos en una tabla a partir de sentencias que emplean la instrucción INSERT. La sintaxis utilizada es la siguiente: INSERT INTO nombre_tabla (nombre_campo1, nombre_campo2,...) VALUES (valor_campo1, valor_campo2...) Un ejemplo sencillo a partir de nuestras tablas es la introducción de un nuevo cliente, lo cual se haría con una instrucción de este tipo: INSERT INTO cliente (cli_nombre, cli_apellidos, cli_direccion, cli_codigo_postal, cli_email) VALUES (Perico, Palotes, Percebe n°13, 123456, perico@usm.cl)Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  14. 14. Analizando un poco lo anterior• Algunas cosas que podemos notar: – Mayúsculas: ¿Necesarias? – La correspondencia entre campo y valor es 1:1. – ¿Es necesario que se inserten todos los campos? – Como puede verse, los campos numéricos no van delimitados por apostrofes: . – Pregunta Extra: El código postal lo hemos guardado como un campo no numérico ¿Por qué?.• Para pensar: ¿Por qué es útil el agregar en la creación de nuestra tabla un campo “auto-incremental” que nos permita asignar un único número a cada uno de los registros?Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  15. 15. Borrar un registro I• Para borrar un registro nos servimos de la instrucción DELETE. – Debemos especificar cuál o cuáles son los registros que queremos borrar. – Lo anterior se puede lograr mediante condiciones al utilizar la cláusula WHERE. La forma de seleccionar se verá detalladamente en capítulos posteriores. Por ahora nos contentaremos de mostrar cuál es el tipo de sintaxis utilizado para efectuar estas supresiones: DELETE FROM tabla WHERE condicionesOsvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  16. 16. Borrar un registro II• Si queremos borrar todos los registros de los clientes que se llamen Perico: DELETE FROM cliente WHERE cli_nombre = Perico‘; WARNING: Si no especificamos una condición, lo que estamos haciendo es borrar toda la tabla: DELETE FROM clientes;Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  17. 17. Actualizar un registro I• UPDATE es la instrucción que nos sirve para modificar nuestros registros.• Con WHERE especificamos que filas actualizaremos, y con SET especificamos que campos se actualizan y con que valor. La sintaxis es de este tipo: UPDATE nombre_tabla SET nombre_campo1 = valor_campo1, nombre_campo2 = valor_campo2, ... WHERE condiciones_de_selecciónOsvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  18. 18. Actualizar un registro II• Un ejemplo: UPDATE cliente SET cli_nombre = ‘José’ WHERE cli_nombre = ‘Pepe’ ¿Qué hicimos? Mediante esta sentencia cambiamos el nombre Pepe por el de José en todos los registros cuyo nombre sea Pepe. WARNING: UPDATE cliente SET cli_nombre = ‘test’; *le fuckOsvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  19. 19. Selección de Tablas I• La selección total o parcial de una tabla se lleva a cabo mediante la instrucción SELECT. En dicha selección hay que especificar: - Los campos que queremos seleccionar - La tabla en la que hacemos la selección En nuestra tabla modelo de clientes podríamos hacer por ejemplo una selección del nombre y dirección de los clientes con una instrucción de este tipo: SELECT cli_nombre, cli_direccion FROM cliente;Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  20. 20. Selección de Tablas II• Si quisiésemos seleccionar todos los campos, podríamos utilizar el comodín * del siguiente modo: SELECT * FROM cliente; Resulta también muy útil el filtrar los registros mediante condiciones que vienen expresadas después de la cláusula WHERE. Si quisiésemos mostrar los clientes de una determinada ciudad usaríamos una expresión como esta: SELECT * FROM cliente WHERE cli_poblacion LIKE MadridOsvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  21. 21. Selección de tablas III (Order by)• Podemos ordenar los resultados: SELECT * FROM cliente WHERE cli_poblacion LIKE Madrid ORDER BY nombre Se pueden utilizar varios criterios de ordenamiento. SELECT * FROM cliente WHERE cli_poblacion LIKE Madrid ORDER BY cli_nombre , cli_apellido Es posible especificar orden ascendente (ASC) o descendente (DESC). SELECT * FROM cliente WHERE ORDER BY cli_nombre descOsvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  22. 22. Selección de Tablas IV (Distinct)• Una opción interesante es la de efectuar selecciones sin coincidencia. Si por ejemplo buscásemos el saber en qué ciudades se encuentran nuestros clientes sin necesidad de que para ello aparezca varias veces la misma ciudad usaríamos una sentencia de esta clase: SELECT DISTINCT cli_poblacion FROM cliente ORDER BY cli_poblacion asc Así evitaríamos ver repetido Madrid tantas veces como clientes tengamos en esa población.Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  23. 23. Selección de Tablas V (Operadores)• Los siguientes operadores serán utilizados después de la cláusula WHERE y pueden ser combinados hábilmente para optimizar nuestra selección a muy altos niveles.Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  24. 24. Selección de Tablas VI (Operadores)Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  25. 25. Selección de Tablas VII (Ejemplos)• Búsqueda de clientes cuya población sea parecida a “madrid” y cuyo nombre no se parezca a “Pepe” SELECT * FROM cliente WHERE cli_poblacion LIKE ‘madrid’ AND NOT (cli_nombre LIKE ‘Pepe‘)• Si quisiéramos recoger en una selección a los clientes de nuestra tabla cuyo apellido comienza por A y cuyo número de pedidos esta comprendido entre 20 y 40: SELECT * FROM cliente WHERE cli_apellidos LIKE ‘A%’ AND cli_pedidos BETWEEN 20 AND 40• El operador In, lo veremos más adelante, es muy práctico para consultas en varias tablas. Para casos de una tabla es empleado del siguiente modo: SELECT * FROM cliente WHERE cli_poblacion IN (‘Madrid’,‘Barcelona’, ‘Valencia’)Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  26. 26. Selección de Varias Tablas I ¿Alguien sabe qué significan las líneas (relaciones)?Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  27. 27. Selección de Varias Tablas II• Estas tablas pueden ser utilizadas simultáneamente para extraer información de todo tipo.• Supongamos que queremos enviar un correo masivo a todos aquellos que hayan realizado un pedido ese mismo día. Podríamos escribir algo así: SELECT DISTINCT cliente.cli_apellidos, cliente.cli_email FROM cliente , pedido WHERE pedido.ped_fecha like ‘17/04/2012’ AND pedido.cli_id = cliente.cli_idOsvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  28. 28. Selección de Varias Tablas III• Veamos otro ejemplo más para consolidar estos nuevos conceptos. Esta vez queremos ver el título del libro correspondiente a cada uno de los pedidos realizados: SELECT pedido.ped_id, articulo.art_titulo FROM pedido, articulo WHERE pedido.art_id = articulo.art_id En realidad la filosofía continua siendo la misma que para la consulta de una única tabla.Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  29. 29. Stats de “Producción”• 21 sitios con baja concurrencia (5.72 [requests/s] en total).• 24,092,504 consultas en una semana (35.2 [consultas/s]).• Tráfico entre DBMS y aplicaciones: ~50Gb (en una semana).Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  30. 30. Funciones• El empleo de funciones es útil para la explotación de los campos numéricos y otras utilidades.• Además de los criterios hasta ahora explicados para realizar las consultas en tablas, SQL permite también aplicar un conjunto de funciones predefinidas.• Estas funciones, aunque básicas, pueden ayudarnos en algunos momentos a expresar nuestra selección de una manera más simple.Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  31. 31. Funciones Se recomienda utilizar un alias para recuperar los valores de las funciones. Esto se puede lograr especificando en la sentencia SQL un alias utilizando la instrucción AS. La cosa podría quedar así: SELECT Sum(ped_total) AS suma_pedidos FROM pedidoOsvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  32. 32. Funciones• Por supuesto, todo lo visto hasta ahora puede ser aplicado en este tipo de funciones de modo que, por ejemplo, podemos establecer condiciones con la cláusula WHERE construyendo sentencias como esta: SELECT Sum(ped_cantidad) AS suma FROM pedido WHERE art_id = 6 Esto nos proporcionaría la cantidad de ejemplares de un determinado libro que han sido vendidos. Otra propiedad interesante de estas funciones es que permiten realizar operaciones con varios campos dentro de un mismo paréntesis: SELECT Avg(ped_total/ped_cantidad) FROM pedido Esta sentencia da como resultado el precio medio al que se están vendiendo los libros. Este resultado no tiene por qué coincidir con el del precio medio de los libros presentes en el inventario, ya que, puede ser que la gente tenga tendencia a comprar los libros caros o los baratos: SELECT Avg(art_precio) AS precio_venta FROM articuloOsvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  33. 33. Funciones• Una cláusula interesante en el uso de funciones es Group By. Esta cláusula nos permite agrupar registros a los cuales vamos a aplicar la función. Podemos por ejemplo calcular el dinero gastado por cada cliente: SELECT cli_id, Sum(ped_total) AS suma_pedidos FROM pedidos group by cli_id O saber el numero de pedidos que han realizado: SELECT cli_id, Count(*) AS numero_pedidos FROM pedido group by cli_id Como podemos apreciar, las posibilidades son prácticamente infinitas, y son realmente útiles para la obtención de información. Ahora, sólo falta aplicar nuestra imaginación.Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  34. 34. Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  35. 35. SQL Injectionusuario := “Alicia’; DROP TABLE usuarios;--”consulta := "SELECT * FROM usuarios WHERE nombre = ‘” + usuario + “’;”consulta := "SELECT * FROM usuarios WHERE nombre = ‘Alicia’; DROP TABLE usuarios;--’;”Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
  36. 36. FinOsvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena

×