Tutoriales SQL – La sentencia SELECT – La clausula WHERE – Parte 1
Hoy les traigo una nueva entrega de mis tutoriales de SQL, en este caso vamos a aprender la cláusula WHERE .
Como les había comentado en artículos anteriores esta cláusula es la encargada de filtrar los datos de nuestras consultas. Como veremos, si bien esta clausula no es obligatoria en la sentencia SELECT , ya que podríamos ejecutar una sentencia SELECT sin la necesidad de incluir esta cláusula, se vuelve una herramienta fundamental para obtener resultados que realmente nos aporten datos valiosos; ya que por lo general, no nos es de mucha utilidad seleccionar todas las lineas de una tabla.
Para realizar el filtrado de las líneas, la cláusula WHERE utiliza expresiones lógicas, una o más condiciones que deben evaluar a VERDADERO o FALSO; cada una de estas condiciones van a estar separadas por los operadores lógicos AND y/o OR. Si todas las condiciones estan separadas solamente por el operador AND, entonces todas las condiciones incluídas en nuestra cláusula WHERE deben evaluar a VERDADERO para que esa línea sea seleccionada. Veamos un ejemplo así queda más claro:
Como vemos, en un primer momento consultamos la tabla “film” sin la cláusula WHERE, o sea, sin ninguna condición para filtrar las líneas, lo que hizo que la consulta nos devolviera 1000 líneas.
En un segundo paso, refinamos nuestra consulta inicial, ya que solo nos interasaba conocer aquellas películas que hayan sido estrenadas en el año 2006 (release_year = 2006) y que además sean aptas para todo público (rating = ‘G’). En esta segunda consulta, ya podemos ver que la información que nos trajo, es sólo aquella que cumplía con estas dos condiciones, un total de 178 líneas.
Por último, volvimos a refinar nuestra búsqueda una vez más, ya que además de las películas estrenadas en el año 2006 y que sean para todo público, nos interesaba solamente aquella con un id igual a 25. En este caso, la única línea que cumplía con esa condición era la de la película “ANGELS LIFE”.
La tabla de Verdad para la el operador AND sería la siguiente:
Resultados intermedios | Resultado Final |
WHERE verdadero AND verdadero | verdadero |
WHERE verdadero AND falso | falso |
WHERE falso AND verdadero | falso |
WHERE falso AND falso | falso |
Como vemos, el único caso en que la clausula WHERE con condiciones separadas por el operador lógico AND nos van a evaluar a VERDADERO , y por ende traernos datos, es si todas nuestras condiciones son evaluadas a VERDADERO.
Por otro parte, si todas nuestras condiciones estan separadas por el operador OR; bastará con que sólo una de esas condiciones evalúe a VERDADERO para que esa línea sea incluída en los resultados finales de nuestra consulta. Nuevamente recurramos a unos ejemplos para aclarar este punto:
Como vemos en el primer ejemplo, seleccionamos sólo aquellas películas que tuvieran un “film_id” igual a 25 o igual a 28; en este caso ambas condiciones evaluaron a VERDADERO, ya que en la tabla “film” existían registros que cumplieran con las dos condiciones; por lo tanto la consulta nos trajo dos líneas como resultado.
Luego, en el segundo ejemplo, la consulta nos esta trayendo una sóla línea como resultado, la de “film_id” igual a 25; ya que la segunda condición “film_id” igual a 50000 evalúa a FALSO, por no existir ningun registro en la tabla que cumpla con esa condición. Como vemos, a diferencia de lo que pasa cuando usuamos sólo el operador AND; en este caso; a pesar de que la segunda condición evaluó a FALSO, aún así la consulta nos devuelve resultados. La tabla de Verdad para el operador OR es la siguiente:
Resultados intermedios | Resultado Final |
WHERE verdadero OR verdadero | verdadero |
WHERE verdadero OR falso | verdadero |
WHERE falso OR verdadero | verdadero |
WHERE falso OR falso | falso |
Aquí, en la mayoría de los casos la clausula WHERE con condiciones separadas por el operador lógico OR nos van a evaluar a VERDADERO; el único caso en que evaluará a FALSO, y por lo tanto no nos devolverá ningún resultado, será cuando todas las condiciones evalúen a FALSO.
Ahora bien, hasta aquí utilizamos todas las condiciones separadas por el operador “AND” o todas las condiciones separadas por el operador “OR”; pero ¿Podemos utilizar ambos operadores en forma combinada en una misma clausula WHERE?.
Utilizando AND y OR juntos
Obviamente la flexibilidad del lenguje SQL nos permite filtrar nuestros datos combinando condiciones con los operadores AND y OR; solo hay que tener unas pequeñas cosas en cuenta al utilizarlos, para evitar que nuestras consultas nos arrojen resultados erróneos.
NOTA: Para los ejemplos en esta parte voy a utilizar una vista (si no se acuerdan que es una vista, puden repasar del tutorial anterior), ya que se me complicaba armar un ejemplo claro con las tablas por defecto de Sakila. Para crear la vista simplemente ejecuten en su cliente la siguiente sentencia (no se preocupen si no la entienden ahora, con el tiempo la van a poder entender mejor, de momento solo ejecutenla como esta para poder realizar los ejemplos).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
CREATE VIEW pagos AS SELECT payment.payment_id, customer.first_name, customer.last_name, customer.email, inventory.inventory_id, film.title, film.description, film.release_year, film.rental_duration, film.rental_rate, film.length, film.rating, film.special_features, rental.rental_date, rental.return_date, payment.amount, payment.payment_date FROM payment left join customer on ( payment.customer_id = customer.customer_id) left join rental on ( payment.rental_id = rental.rental_id) left join inventory on ( rental.inventory_id = inventory.inventory_id) left join film on ( inventory.film_id = film.film_id); |
Una vez que tenemos la vista “pagos” creada, podemos pasar a los ejemplos.
Supongamos que a mí me interesaría saber los pagos por un importe igual a 0.99 (amount = 0.99) de películas aptas para todo público (rating = ‘G’). Armaría una sentencia como la siguiente:
Si yo quisiera refinar esta busqueda y ademas de esas condiciones, quisiera también filtrar por los clientes cuyo nombre sea “Denise” o “Victoria”, la lógica indicaría que podría escribir una sentencia como la siguiente, haciendo uso de los separadores “AND” y “OR”.
A simple vista, parecería que la sentencia funcionó correctamente y nos trajo lo que le pedimos; pero si nos ponemos a ver más detenidamente los resultados, vamos a notar que para los registros dónde el nombre del cliente es “Victoria”, no se estan cumpliendo las restantes condiciones de que el importe del pago sea igual a 0.99 y el rating sea igual a “G”.
Esto es así porque cada vez que aparece un “OR” se vuelven a reiniciar las condiciones; todas las condiciones que estan por delante del “OR” se toman como una sola gran condicion que evalúa a VERDADERO o FALSO; y asimismo todo lo que este despúes del “OR” se toma como otra gran condición que evaluará también a VERDADERO o FALSO.
En este ejemplo, lo que pasó es que el interprete primero evaluó todos los registros dónde el nombre del cliente sea “Denise”, el importe sea igual a 0.99 y el rating sea igual a “G”, trajo todo lo que era verdadero para esas condiciones y despúes pasó a evaluar todos los registros dónde el nombre del cliente sea “Victoria”, trayendo todos los registros dónde se cumplía esa sóla condición.
Para solucionar este error, y obtener los resultados desados, podríamos reescribir la sentencia del siguiente modo:
Esta sentencia sí nos arroja los resultados deseados, pero suena muy repetitiva y es algo tedioso tener que andar repitiendo todas las condiciones cada vez que queremos usar un “OR”; es por esto que el lenguje SQL nos ofrece otra solución, el uso de parentesis. Así como en matemática utilizamos parentesis para expresar claramente como deben evaluarse nuestras expresiones; en SQL podemos usar los parentesis con el mismo sentido; así podríamos modificar nuestra consulta inicial utilizando los parentesis para indicarle al interprete como debe evaluar nuestra sentencia.
Como vemos, esta sentencia también nos arroja los resultados correctos sin necesidad de tener que andar repitiendo todas las condiciones.
Hasta aquí este tutorial, aun quedan cosas por explicar sobre la clausula WHERE que estaré tratando en un próximo artículo.
Espero que les haya gustado.
Saludos,