SlideShare una empresa de Scribd logo
4
Lo más leído
11
Lo más leído
16
Lo más leído
SQL for Dummies

                            Bases de Datos
                                2012-1
                          18 de Abril del 2012

Osvaldo Mena R.   osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
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
Osvaldo Mena R.   osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
¿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
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
Tipos de Datos II




Osvaldo Mena R.   osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
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
Creación de Tablas II




Osvaldo Mena R.   osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Selección de Tablas VI (Operadores)




Osvaldo Mena R.   osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
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
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
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
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
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
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
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
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
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
Osvaldo Mena R.   osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena
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
Fin




Osvaldo Mena R.   osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena

Más contenido relacionado

PPTX
SQL: DDL, DML y SQL
DOC
Sql comamdo
PPT
SQL-DDL
PPTX
Equipo 5
PPTX
Exposicion 5
PPTX
Sql básico - compendio
PPT
Tm13 introduccion al_sql
SQL: DDL, DML y SQL
Sql comamdo
SQL-DDL
Equipo 5
Exposicion 5
Sql básico - compendio
Tm13 introduccion al_sql

La actualidad más candente (12)

DOCX
Ejercicio de access 2
PPTX
Aparicio marco cuba -trabajo as-400
PDF
Excel 2010 noveno y decimo primer periodo
DOC
Colegio
PPTX
Formularios en HTML5
DOC
Buscar v
PDF
EJERCICIO DE BUSQUEDA Y REFERENCIA
DOCX
Documento de word
PDF
01 introduccion a java script
PPTX
Consultas sql
PDF
Instrumento access sistemas
Ejercicio de access 2
Aparicio marco cuba -trabajo as-400
Excel 2010 noveno y decimo primer periodo
Colegio
Formularios en HTML5
Buscar v
EJERCICIO DE BUSQUEDA Y REFERENCIA
Documento de word
01 introduccion a java script
Consultas sql
Instrumento access sistemas
Publicidad

Destacado (20)

PDF
php y mysql para dummies 2da edicion
PPTX
Tablets for dummies
PPTX
Blackberry for dummies
PPTX
Apertura del evento "Business Intelligence for dummies"
PPTX
Unity3D para dummies (BcnDevCon 2012)
PPT
Organización 10 de abril
PDF
Aprovechando la tecnología para un desarrollo ágil
PPT
Timer powerpoint break
PDF
Testing para dummies
PPTX
Administrando SQL Server, mejores practicas para un DBA
PDF
Finanzas para todos · Corporate finance for dummies
PDF
Sql y programacion en access 2010
PDF
Análisis y Diseño OO 1
PDF
De los árboles a la cama de un hospital
PPT
Introduccion Orientada a Objetos
PPTX
Introduccion a las bases de datos 1 parte
PPTX
Lenguajes programacion
PPTX
Proyecto poo
PDF
Guía rápida de MySQL Server 5.5 y Workbench 5.2
php y mysql para dummies 2da edicion
Tablets for dummies
Blackberry for dummies
Apertura del evento "Business Intelligence for dummies"
Unity3D para dummies (BcnDevCon 2012)
Organización 10 de abril
Aprovechando la tecnología para un desarrollo ágil
Timer powerpoint break
Testing para dummies
Administrando SQL Server, mejores practicas para un DBA
Finanzas para todos · Corporate finance for dummies
Sql y programacion en access 2010
Análisis y Diseño OO 1
De los árboles a la cama de un hospital
Introduccion Orientada a Objetos
Introduccion a las bases de datos 1 parte
Lenguajes programacion
Proyecto poo
Guía rápida de MySQL Server 5.5 y Workbench 5.2
Publicidad

Similar a SQL For Dummies (20)

PDF
Manual completo-sql
PDF
Manual completo-sql5
PPTX
Fundamentos de BD - Unidad 6 lenguaje sql
PDF
MYSQL DDL DML.pdf
PPTX
PPTX
95795044 unidad-4
PPTX
95795044 unidad-4
PPTX
95795044 unidad-4
PPTX
95795044 unidad-4
PPTX
Precentacion
PPTX
Precentacion
PPTX
Precentacion
PPTX
Precentacion
PPTX
95795044 unidad-4
PPTX
Precentacion
PPTX
Precentacion
PPTX
OVA DISEÑO ORACLE Introducción Bases de Datos .pptx
PDF
Modificaciones De Ansi Sql
PDF
Modificaciones De Ansi Sql
PDF
DDL oracle - base de datos
Manual completo-sql
Manual completo-sql5
Fundamentos de BD - Unidad 6 lenguaje sql
MYSQL DDL DML.pdf
95795044 unidad-4
95795044 unidad-4
95795044 unidad-4
95795044 unidad-4
Precentacion
Precentacion
Precentacion
Precentacion
95795044 unidad-4
Precentacion
Precentacion
OVA DISEÑO ORACLE Introducción Bases de Datos .pptx
Modificaciones De Ansi Sql
Modificaciones De Ansi Sql
DDL oracle - base de datos

SQL For Dummies

  • 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
  • 36. Fin Osvaldo Mena R. osvaldo.mena@usm.cl , @omenar , osvaldo.mena.requena