La encuesta de la quincena (03/16) ¿Qué opinas de que salga SQL-Server para Linux?

La semana pasada tocó Bandcamp, esta semana toca otra vez encuesta. La anterior era sobre rock and roll, esta toca sobre informática y sobre una de las noticias de la semana que acaba de terminar: En 2017 Microsoft se plantea sacar una versión de SQL-Server para sistemas Linux. Así que ¿qué os parece esto?

Limitar el número de filas en la salida de un consulta en Oracle

En fin, hoy primer contacto con el SGBD de Oracle (sí, ese privativo tan caro y a la vez tan extendido en la administración), del cual no puedo decir mucho porque con una clase, sobre fundamentos de SQL además (que no es por ir de sobrado, pero la primera semana me da que me voy a aburrir repasando lo más básico de siempre), pues no da para haber testado mucho. Lo que sí comprobé, tonteando un poco, es que la forma de forma de limitar el número de filas en la salida de una consulta no tiene nada que ver ni con SQL-Server, PostgreSQL o MySQL.

Porque claro, tú quieres por ejemplo sacar los 10 que más cobran y en MySQL o en PostgreSQL lo haces tal que así

SELECT nombre FROM empleados ORDER BY salario LIMIT 10

Y si eres de los de tito Bill te apañarías con:

SELECT TOP 10 nombre FROM empleados ORDER BY salario 

Total, que andaba trasteando un rato después de hacer los ejercicios, tipo “me ha sobrado un huevo de tiempo, vamos a probar si otras cosas van igual que en algunos de los sistemas gestore que he usado” y ahí me encuentro que esto cambia, que ni es como en Microsoft ni como en los otros dos SGBD libres. Aunque curiosamente la palabra limit aparezca como reservada (todavía no se para qué, una de las cosas que espero aprender en el susodicho curso). Tras un poco de investigación entre la (vasta) documentación de Oracle me ecuentro con que la cosa va así:

SELECT nombre FROM empleados ORDER BY salario WERE rownum<=10

Conclusión/explicación: Oracle nos ofrece una pseudocolumna (iba a llamarlo variable, pero acabo de leer que este es el término más correcto) llamada rownum (número de fila) que nos servirá, mediante una condición where, para limitar la salida de resultados de la consulta (también puede valer para realizar consultas paginadas en una web, pero igual te chupas demasiadas conexiones al motor si lo haces así en vez de bajar todo de vez y manejarlo en el cliente… ahí ya depende del proyecto). Si quieres 10 filas le dices “que el número de fila sea menor o igual que diez”, que quieres 20… lo mismo.

La función IF de MySQL

En el SGBD MySQL existe una función bastante útil llamada IF. Obviamente no estoy hablando de una sentencia condicional if para el control de flujo como las que que tenemos en cualquier lenguaje de programación (Visual Basic, C, Java, PHP… y que en MySQL también existe), sino de una función que recibe tres argumentos: una condición a evaluar, un valor a devolver si se cumple y un valor a devolver si no.

Veámoslo ilustrado con el siguiente ejemplo. Tenemos una lista de productos con sus respectivos precios, y nos interesa saber simplemente si el precio es mayor de 60 euros, para separarlos así entre “caros” y “baratos”. Aunque podríamos hacerlo con una par de consultas unidas imprimiendo una cadena, ahorraremos código haciéndolo de la siguiente forma:

Select IdProducto, NompreProducto, if(Precio>=60, 'caro','barato')
from tbArtículos

Incluso podemos usar la función IF con funciones de agregado, combinando. En el siguiente ejemplo supongamos que, con la misma tabla de productos, queremos saber si los proveedores nos sirven sólo un producto o si nos sirven más de uno, no nos importa la cantidad, sólo discriminaremos entre uno y más de uno.

Select Proveedor, if(count(*)>1, 'Más de uno','Sólo uno')
from Productos group by Proveedor

La idea es que la función evalúa si el primer parámetro recibido es verdadero y distinto de nulo, y en base a eso devuelve uno de los dos valores, el primero para TRUE y el segundo para FALSE.

Por cierto, la función IF también existe en el fork libre de MySQL MaríaDB, como otras muchas funciones del popular gestor de bases de datos. No está mal recordarlo, por si algún día Oracle se encabrona y nos deja tirados, ya que puede que algún día MaríaDB sea la mejor opción.