domingo, 26 de septiembre de 2010

Practicando SQL (Parte 2)

Te encuentras en la segunda parte de la serie "Practicando SQL":
  1. Configurando ambiente de trabajo y consultas básicas
  2. Consultas con más de una tabla
  3. Consultas con agrupados
  4. Consultas anidadas
En el post anterior configuramos el ambiente en el que estaremos trabajando. Ahora veamos algunas partes del comando SELECT con la siguiente consulta que muestra los films con rating R que duren entre 90 y 120 minutos inclusive.

SELECT title, rating, length
FROM film
WHERE rating="R" AND length>=90 and length<=120 ORDER BY length DESC;

Después de la palabra clave SELECT especificamos las columnas que queremos en nuestro resultado. La palabra clave FROM nos permite especificar la tabla de donde obtendremos los resultados. WHERE es seguido de las condiciones que deben cumplir las filas o registros que formarán parte del resultado. Por último, especificamos el orden de las filas en el resultado final usando ORDER BY; después de especificar la columna por la que queremos ordenar podemos poner la dirección ASC (ascendente, que es la default) o DESC (descendente). Ahora, despleguemos todas las ciudades con el país al que pertenecen. Recuerden que el comando describe nos ayuda a ver los campos o columnas de una tabla. La tabla city tiene un id (city_id), nombre (city) y una llave foránea (country_id) que nos permite conocer el país al que pertenece. La tabla country tiene un id (country_id) y nombre(city). La siguiente imagen muestra un ejemplo del resultado final.


Como pueden observar, necesitamos información de dos tablas (city y country). Si intentamos la siguiente consulta:

SELECT city, country
FROM city, country;

Obtendremos un resultado incorrecto (65400 filas en el resultado), ya que al especificar más de una tabla en FROM lo que se calcula es el producto cartesiano de las dos tablas; es decir, el resultado combina todas las ciudades (600) con todos los países (109) (600*109=65400). Nosotros sólo estamos interesados en las combinaciones ciudad-país que comparten el id del país. Para ello podemos especificar esa condición, como en la siguiente consulta:

SELECT city, country
FROM city, country
WHERE city.country_id = country.country_id;

Cuando especificamos más de una tabla en FROM, le llamamos JOIN. En este caso como estamos relacionando tablas donde una fila de la primer tabla se relacionan con una fila de la segunda tabla, le llamamos INNER JOIN.

Un pequeño detalle de la última consulta, es que si queremos especificar más filtros en WHERE, estaremos mezclando nuestro filtros con la condición que nos ayuda a relacionar las tablas. La siguiente consulta nos retorna todas las ciudades cuyo nombre empieza con T, acompañadas del país al que pertenecen. Noten que en WHERE sólo especificamos que la ciudad empiece con T, y con la clausula INNER JOIN ... ON especificamos como se relacionan las dos tablas:

SELECT city, country
FROM city
INNER JOIN country ON (city.country_id=country.country_id) WHERE city LIKE "T%";

Ahora veamos una consulta que regresa todos los films que duran 2 horas junto con los actores que participaron en cada film. En este caso ya estamos usando tres tablas.

SELECT title, first_name, last_name
FROM film
INNER JOIN film_actor ON (film.film_id=film_actor.film_id)
INNER JOIN actor ON (film_actor.actor_id=actor.actor_id)
WHERE length=120
ORDER BY title;

Siguiente post...
Veremos consultas que involucran agrupados, por ejemplo saber cuántos films ha realizado un actor.

2 comentarios:

  1. oooooh...
    es toda una ciencia...
    exelentes posts...
    :)
    gracias por el gran a porte Toño...
    :)

    ResponderEliminar
  2. Me da gusto que te resulte interesante y útil el tutorial.

    Saludos,
    Toño.

    ResponderEliminar