Le cas de Beazley
En 1994, Napoleon Beazley a abattu John Luttig, un homme d’affaires de 63 ans, dans son garage alors qu’il tentait de voler la voiture de la famille de Luttig. L’affaire de Beazley a déclenché un débat féroce sur la peine de mort pour les délinquants juvéniles parce qu’il était presque âgé de 18 ans au moment des faits. 3 ans après l’exécution de Beazley, la Cour suprême a interdit l’exécution des délinquants âgés de moins de 18 ans au moment des faits (Roper v Simmons, 2005).
Cette affaire a également été marquée par le fait que la victime était le père d’un juge fédéral, John Michael Luttig. Lors des recours devant la Cour suprême, trois des neuf juges se sont récusés en raison de leurs liens personnels avec le juge Luttig, de sorte qu’il n’en restait plus que six pour examiner l’affaire.
Napoleon Beazley a fait des derniers mots passionnément dans lesquels il affirmait qu’œil pour œil ne constituait pas la justice. Notre tâche est de retrouver ces mots dans la base de données.
Une première requête SQL
De droite à gauche, les colonnes sont :
- first_name (prénom)
- last_name (nom)
- ex_number (numéro d’exécution)
- ex_age (âge à son exécution)
- ex_date (date de l’exécution)
- last_statement (les dernières paroles)
La requête SQL peut ressembler une phrase mundane mais il faut que vous voyez comme trois blocs de Lego :
SELECT *
FROM executions
LIMIT 3
.
Comme pour les Lego, chaque bloc a un format fixe et les différents blocs doivent s’emboiter d’une certaine manière.
Le bloc SELECT
Le bloc SELECT
indique les colonnes que vous souhaitez afficher. Son format est SELECT <column>, <column>, ...
. Each column must be separated by a comma, but the space following the comma is optional. Chaque colonne doit être séparée par une virgule, mais l’espace suivant la virgule est facultatif. L’étoile (c.-à-d. *) est un caractère spécial qui signifie que nous voulons toutes les colonnes sur la table.
Commentaires SQL
Notez que le fait de cliquer sur « Show Solution » affiche la solution dans l’éditeur précédé de /*
. Le contenu entre /*
et */
est pris comme commentaire et n’est pas exécuté en tant que code. C’est utile pour cacher temporairement le code que nous ne voulons pas exécuter. Pour exécuter la solution, supprimez ou commentez simplement votre code et décommentez la solution.
`--` est une autre façon d’indiquer les commentaires. Il sert à marquer le reste d’une ligne comme commentaire. Lorsque nous avons plusieurs lignes que nous voulons commenter, `*/` est plus pratique que de préfixer `--` à chaque ligne.
Le bloc FROM
Le bloc FROM
(litt. « de ») indique la table à laquelle on fait appel. Son format est FROM <table>
. Il vient toujours après le bloc SELECT
.
Dans l’exemple suivant, notez que nous n’avons pas besoin du bloc FROM
block si nous n’utilisons rien d’une table.
Ne trouvez-vous pas étrange que 51 / 2
donne 25
au lieu de 25.5
? C’est parce que SQL fait la division en nombres entiers. Pour effectuer la division décimale, au moins un des opérandes doit être une décimale, par exemple 51.0 / 2
. Une astuce courante consiste à multiplier un nombre par 1.0
pour le convertir en décimal. Cela sera utile dans les chapitres suivants.
Les majuscules
Même si nous avons mis en majuscule SELECT
, FROM
et LIMIT
, les commandes SQL ne sont pas sensibles à la casse. Ça se voit que l’éditeur de code les reconnaît et les formats comme une commande, peu importe la majuscule. Néanmoins, je recommande de les mettre en majuscule pour les différencier des noms de colonnes, des noms de table et des variables.
Les noms de colonnes, les noms de tables et les variables ne sont pas sensibles à la casse dans cette version de SQL, bien qu’elles le soient dans beaucoup d’autres versions. Pour être sûr, je recommande de toujours supposer qu’ils sont sensibles à la casse.
Des trous à compléter
Les espaces font référence aux espaces, tabulations, sauts de ligne et autres caractères qui sont rendus comme des espaces vides sur une page. Comme avec la majuscule, SQL n’est pas très sensible aux espaces tant que vous ne réduisez pas deux mots en un. Cela signifie qu’il suffit d’avoir au moins un caractère en blanc autour de chaque commande, peu importe laquelle ou combien vous utilisez. A moins que ce soit une courte requête, je préfère mettre chaque commande sur une nouvelle ligne pour améliorer la lisibilité.
Le bloc WHERE
Le bloc WHERE
(litt. « où ») nous permet de filtrer la table pour les lignes qui répondent à certaines conditions. Son format est WHERE <clause>
et il va toujours après le bloc FROM
. Ici, une clause fait référence à une instruction booléen que l’ordinateur peut évaluer comme vrai ou faux comme ex_number = 145
. Vous pouvez imaginer que l’ordinateur va passer par chaque ligne dans la table en vérifiant si la clause est vraie, et si oui, retourner la ligne.
Il est clair que nous pouvons utiliser des opérateurs arithmétiques comme <
et <=
pour construire des clauses. Il existe également une collection d’opérateurs de chaîne pour travailler avec des chaînes.
Le plus puissant est probablement LIKE
. Il nous permet d’utiliser des caractères de remplacement tels que %
et _
pour correspondre à divers caractères. Par exemple, first_name LIKE '%roy'
renvoie true
pour les lignes avec les prénoms « roy », « Troy » et « Deroy » mais pas « royman ». Le caractère générique _
correspond à un seul caractère, de sorte que first_name LIKE '_roy'
ne correspond qu’à « Troy ».
Les guillemets
En SQL, les chaînes sont indiquées par des guillemets simples. Les backticks ou les apostrophes inversées (c.-à-d. `
) peuvent être utilisées pour indiquer les noms de colonnes et de tables. Ceci est utile lorsque le nom de la colonne ou de la table est identique à un mot-clé SQL et lorsqu’ils ont un espace. Il est possible d’avoir une base de données avec une table nommée « where » et une colonne nommée « from ». (Qui serait si cruel de faire cela?!) Vous devez faire SELECT `from` FROM `where` WHERE ...
. Voici un autre exemple où la capitalisation des commandes SQL nous aide.
Comme vous l’avez vu dans l’exercice précédent, les clauses complexes peuvent être composées de clauses simples en utilisant des opérateurs booléens tels que NOT
, AND
et OR
. SQL donne la priorité à NOT
puis AND
et enfin OR
. Mais si, comme moi, vous êtes trop paresseux pour vous souvenir de l’ordre des priorités, vous pouvez utiliser les parenthèses pour préciser l’ordre que vous voulez.
Passons un quiz rapide pour renforcer votre compréhension.
Vous avez maintenant les outils nécessaires pour mener à bien notre projet.
N’est-il pas étonnant de voir à quel point Beazley est profond et éloquent? Rappelons-nous qu’il n’avait que 25 ans lorsqu’il a fait ces derniers mots et qu’il était en prison depuis l’âge de 18 ans.
Récapitulatif
Le but de ce chapitre était d’introduire le SELECT <column> FROM <table> WHERE <clause>
. Il nous permet de filtrer une table en faisant aller l’ordinateur ligne par ligne et choisir ceux pour lesquels la clause WHERE
est vraie. Nous avons aussi appris à assembler des clauses assez complexes qui peuvent fonctionner sur des colonnes de chaîne, numériques et booléennes.
Jusqu’à présent, nous avons opéré au niveau des lignes, ce qui nous a limités à l’examen de points de données individuels. Dans le prochain chapitre, nous nous concentrerons sur les agrégations qui nous permettront d’étudier les phénomènes au niveau du système.