1. SQL for Dummies
Bases de Datos
2012-1
18 de Abril del 2012
Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
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. Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
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. 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. Tipos de Datos II
Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
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. Creación de Tablas II
Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
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. 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. 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. 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. 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. 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. 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 condiciones
Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
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. 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ón
Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
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 fuck
Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
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. 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 'Madrid'
Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
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 desc
Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
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. 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. Selección de Tablas VI (Operadores)
Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
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. 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. 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_id
Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
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. 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. 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. 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 pedido
Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
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 articulo
Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
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. Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
35. SQL Injection
usuario := “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