Select Star SQL

El caso Beazley

En 1994, Napoleon Beazley disparó al empresario de 63 años John Luttig en su garaje mientras intentaba robar el coche de su familia. Como tenía poco menos de 18 años en el momento del asesinato, el caso Beazley encendió un intenso debate sobre la pena de muerte para delincuentes juveniles. Tres años después de la ejecución de Beazley, la Corte Suprema prohibió la ejecución de delincuentes menores de 18 años en el momento del hecho (Roper v Simmons, 2005).

El caso también fue notable porque la víctima era el padre de un juez federal, John Michael Luttig. Durante las apelaciones ante la Corte Suprema, tres de los nueve jueces se recusaron debido a sus vínculos personales con el juez Luttig, dejando solo seis para revisar el caso.

Napoleon Beazley pronunció una apasionada declaración final argumentando que ojo por ojo no constituye justicia. Nuestra tarea es recuperar su declaración de la base de datos.


Una primera consulta SQL

El query SQL puede parecer una oración, pero debes verlo como tres bloques de Lego: SELECT \* FROM executions LIMIT 3. Como con Lego, cada bloque tiene un formato fijo y los diferentes bloques deben encajar entre sí de maneras particulares.


El bloque SELECT

El bloque SELECT especifica qué columnas quieres mostrar. Su formato es SELECT <column>, <column>, .... Cada columna debe separarse por una coma, aunque el espacio después de la coma es opcional. El asterisco (es decir, *) es un carácter especial que indica que queremos todas las columnas de la tabla.

Comentarios en SQL

Fíjate que al hacer clic en "Mostrar solución" se muestra la solución en el editor precedida por /*. El contenido entre /* y */ se toma como comentario y no se ejecuta como código. Esto es útil para ocultar temporalmente código que no queremos ejecutar. Para ejecutar la solución, simplemente borra o comenta tu código y descomenta la solución.

-- es otra forma de indicar comentarios. Se usa para marcar el resto de una sola línea como comentario. Cuando tenemos múltiples líneas que queremos comentar, /* ... */ es más conveniente que anteponer -- a cada línea.


El bloque FROM

El bloque FROM especifica de qué tabla estamos consultando. Su formato es FROM <table>. Siempre aparece después del bloque SELECT.

En el siguiente ejemplo, observa que no necesitamos el bloque FROM si no usamos nada de una tabla.

No es extraño que 51 / 225 en lugar de 25.5. Esto se debe a que SQL está haciendo una división entera. Para obtener división decimal, al menos uno de los operandos debe ser decimal, por ejemplo 51.0 / 2. Un truco común es multiplicar un número por 1.0 para convertirlo en decimal. Esto será útil en capítulos posteriores.

Mayúsculas

Aunque hemos puesto en mayúscula SELECT, FROM y LIMIT, los comandos SQL no distinguen mayúsculas de minúsculas. Puedes ver que el editor los reconoce y los formatea como comando sin importar la capitalización. Aun así, recomiendo capitalizarlos para diferenciarlos de nombres de columnas, tablas y variables.

Los nombres de columnas, tablas y variables tampoco distinguen mayúsculas en esta versión de SQL, aunque sí lo hacen en muchas otras variantes. Para estar seguro, recomiendo asumir que sí distinguen.

Espacios en blanco

Los espacios en blanco se refieren a espacios, tabulaciones, saltos de línea y otros caracteres que se muestran como espacio vacío. Al igual que con la capitalización, SQL no es muy sensible a los espacios siempre que no juntes dos palabras. Esto significa que basta con al menos un caracter de espacio alrededor de cada comando. A menos que la consulta sea corta, prefiero poner cada comando en una línea nueva para mejorar la legibilidad.


El bloque WHERE

El bloque WHERE nos permite filtrar la tabla para filas que cumplan ciertas condiciones. Su formato es WHERE <clause> y siempre va después del bloque FROM. Aquí, una cláusula se refiere a una expresión booleana que la computadora puede evaluar como verdadera o falsa, por ejemplo ex_number = 145. Puedes imaginar que la computadora inspecciona cada fila comprobando si la cláusula es verdadera y, si lo es, devuelve la fila.

Es claro cómo podemos usar operadores aritméticos como < y <= para construir cláusulas. También existen operadores de cadena. El más potente probablemente sea LIKE, que permite comodines como % y _ para casar patrones.

Comillas

En SQL, las cadenas se denotan con comillas simples. Las comillas invertidas (ie `) pueden usarse para indicar nombres de columnas y tablas. Esto es útil cuando el nombre es igual a una palabra reservada o contiene espacios. Por ejemplo, podrías tener una tabla llamada 'where' y una columna llamada 'from'. Entonces tendrías que usar SELECT `from` FROM `where` WHERE .... Esto es otra razón para capitalizar los comandos SQL.

Como has visto en el ejercicio anterior, las cláusulas complejas pueden construirse a partir de cláusulas simples usando operadores booleanos como NOT, AND y OR. SQL da más precedencia a NOT, luego a AND y finalmente a OR. Pero si, como yo, eres demasiado perezoso para recordar el orden de precedencia, puedes usar paréntesis para aclarar el orden que deseas.

Hagamos un breve cuestionario para afianzar lo aprendido.

Ahora tienes las herramientas necesarias para completar nuestro proyecto.

¿No es asombroso lo profundo y elocuente que es Beazley? Recuerda que tenía solo 25 años cuando hizo la declaración y había estado en prisión desde los 18.


Resumen

El objetivo de este capítulo ha sido introducir la forma básica pero poderosa SELECT <column> FROM <table> WHERE <clause>. Permite filtrar una tabla haciendo que la computadora inspeccione fila por fila y seleccione aquellas para las cuales la cláusula WHERE es verdadera. También hemos aprendido a construir cláusulas relativamente complejas que pueden operar sobre columnas de tipo cadena, numéricas y booleanas.

Hasta ahora, hemos estado operando a nivel de fila, lo que limita a observar puntos de datos individuales. En el siguiente capítulo nos centraremos en agregaciones que nos permitirán estudiar fenómenos a nivel de sistema.