SQL
Notre prof de bases de données à l’EPFL nous avait dit “Bon, comme toute l’industrie utilise encore un vieux truc qui s’appelle SQL , il faut bien passer un cours ou deux là dessus, mais on va surtout parler de l’avenir : les bases de données orientée objet .” 30 ans plus tard, les bases de données objet ont dû apprendre à parler SQL, et les bases NoSQL ne sont pas près de détrôner le “vieux truc”. Et comme j’ai du me (re)mettre à SQL pour un projet pro, je me suis motivé en voulant comprendre pourquoi SQL a survécu à COBOL .
Pirates et logique
Au moment où j’écrivais mes premières requêtes SQL, Annick travaillait le problème de logique ci-dessous avec une de ses élèves :

SQL permet de le résoudre très failement. Il faut d’abord créer et remplir une table de pirates avec des “champs” contenant leurs attributs vestimentaires
\[expand title="(cliquer pour voir)"\]-- on crée une table avec les attributs des pirates
CREATE TABLE pirate (
id BIGSERIAL NOT NULL,
chemise CHAR(10) NOT NULL,
bandeau BOOLEAN NOT NULL,
pantalon CHAR(10) NOT NULL,
PRIMARY KEY(id)
);
-- on ajoute les pirates dans la table
INSERT INTO pirate (id, chemise, bandeau, pantalon) VALUES
(1, 'vert', false, 'rayure'),
(3, 'rouge', true, 'rayure'),
(2, 'bleu', false, 'pois'),
(4, 'bleu', false, 'rayure'),
(5, 'rouge', true, 'carreau'),
(6, 'rouge', false, 'carreau'),
(7, 'rouge', false, 'rayure'),
(8, 'bleu', true, 'rayure'),
(9, 'jaune', true, 'pois'),
(10, 'bleu', false, 'carreau');puis on cherche les pirates correspondant au problème posé avec une requête SELECT:
SELECT * FROM pirate WHERE pantalon !='rayure' AND NOT bandeau AND chemise !='bleu';qui donne : 6, rouge, false, carreau
Comme on le voit, SQL est un langage de programmation “déclaratif” où l’on décrit logiquement le résultat attendu, sans spécifier la séquence des opérations à effectuer pour l’obtenir comme dans les langages de programmation “impératifs ” classiques.
Plans d’exécution
Il existe de nombreuses manières de résoudre ce genre de problème, par exemple:
- entourer l’ensemble de ceux qui n’ont pas de pantalons à rayures (2,5,6,9,10), entourer le sous-ensemble de ceux qui n’ont pas de bandeau (2,6,10), puis dans ce sous-ensemble ceux qui ont une chemise qui n’est pas bleue : il n’y a que le 6.
- tracer tous ceux qui ont un pantalon à rayure (1,3,4,7,8), puis ceux qui ont un bandeau (3,5,8,9), puis ceux qui ont une chemise bleue (2,4,8,10) : reste le 6
- examiner les pirates l’un après l’autre, vérifier les 3 conditions l’une après l’autre : seul le 6 les satisfait toutes
Dans un cas aussi simple ça n’a que peu d’importance, mais si on a quelques millions de pirates dans notre base de données, avec
- si les champs chemise, bandeau et pantalon sont indexés https://fr.wikipedia.org/wiki/Jointure_(informatique)
Oui, SQL est Turing complet !
https://stackoverflow.com/questions/900055/is-sql-or-even-tsql-turing-complete
Pourquoi je hais quand même SQL
SQL est un langage verbeux, pleins de mots clés qui interfèrent volontiers avec les identificateurs, pointilleux sur la ponctuation, bref tout le contraire d’un langage de programmation moderne comme Python.
Références
- David Fetter “High Performance SQL with PostgreSQL 8.4 : Lists and Recursion and Trees, Oh My!”, 2009, OSCON (slides pdf )
