Le langage SQL
Le langage SQL est l’un des éléments qui ont contribué au développement et au succès de l’approche relationnelle dans le monde des bases de données. En effet, la normalisation internationale du langage garantit la pérennité et la stabilité des données ainsi que des développements qui leur sont associés, indépendamment du SGBD et du langage utilisés. Ce chapitre aborde les concepts et la syntaxe du langage SQL, et présente les trois grandes familles d’opérations que le langage permet d’exprimer : • L’interrogation et la recherche dans les tables. • La gestion de tables et de vues munies des contraintes associées. Ces instructions concernent la table et sa structure et constituent la partie LDD (Langage de Description des Données) de SQL. • La manipulation de données. Ces instructions concernent les données contenues dans la table et constituent la partie LMD (Langage de Manipulation des Données) de SQL. 96 Création de bases de données 1 Concepts du langage SQL Le langage SQL est essentiellement un « sous-produit » issu des travaux du groupe de travail System-R. Il s’agissait de la réalisation pratique des concepts de l’approche relationnelle chez IBM™. C’est une évolution du langage SEQUEL, lui-même dérivé du langage de recherche SQUARE. Le langage est normalisé par l’ISO depuis 1987. La deuxième version du langage, SQL2, a été adoptée en 1992. Les exemples de cet ouvrage sont basés, dans la mesure du possible, sur cette norme. La troisième version du langage, SQL3, normalisée en 1999, ajoute essentiellement les fonctionnalités liées à l’utilisation de l’approche objet. La quasi-totalité des SGBD disposent d’une interface SQL même si aucun ne couvre l’ensemble de la norme. La norme SQL prévoit trois niveaux de conformité : le niveau d’entrée, le niveau intermédiaire et le niveau complet. Les SGBD respectent en général le premier niveau et adoptent certains éléments des autres niveaux. La normalisation du langage garantit la portabilité générale des applications d’un SGBD à un autre, même s’il subsiste des différences entre les approches des différents éditeurs. En effet, compte tenu du temps nécessaire au processus de modification de la norme, certains éditeurs la devancent parfois et intègrent des fonctionnalités qui leur semblent essentielles… ou susceptibles de leur donner un avantage concurrentiel. Le langage SQL manipule l’objet fondamental de l’approche relationnelle : la relation représentée par une table vue au chapitre 3. SQL est un langage dit « non procédural » ou « déclaratif », c’est-à-dire que l’on ne décrit pas la manière d’effectuer les opérations pas à pas : c’est le SGBD qui choisit la méthode utilisée pour y parvenir. C’est ce qui explique que des concours de rapidité de résolution de requête soient organisés chaque année pour tester les différentes stratégies des éditeurs. Par conséquent, il ne dispose pas d’instructions de structuration, telles que des boucles. Pour effectuer ce type d’opérations, on utilise un langage de programmation « classique », comme les langages C, php, Java™ et bien d’autres. Les instructions SQL sont alors intégrées dans le langage via une interface spécifique. Les résultats de la requête SQL sont alors stockés dans des structures de données propres au langage employé (par exemple un tableau) afin de pouvoir les manipuler. C’est typiquement ce procédé qui est employé pour construire une interface d’accès à une base de données par le Web. Le langage de programmation qui intègre le langage SQL est alors appelé langage hôte (voir figure 4.1). De petites différences de syntaxe peuvent apparaître entre une requête SQL exprimée interactivement et la version « intégrée » dans un langage de programmation. Enfin, il existe une extension « procédurale » de SQL qui ajoute les fonctions, procédures et méthodes à SQL mais qui ne sera pas traitée dans le cadre de cet ouvrage.
Opérations relationnelles avec SQL
Cette section présente l’expression en SQL des opérations de l’algèbre relationnelle vues précédemment : projection, sélection, agrégats, produits cartésiens et jointures. Une description précise de ces opérations se trouve au chapitre 3. Les exemples simples qui présentent les opérations relationnelles utilisent la base de données « casse » (voir figure 4.2). Remarque Par convention, dans tous les exemples qui suivent, les instructions SQL sont indiquées en majuscules afin de les différencier des noms de tables et de champs. Les interpréteurs SQL ne différencient pas les majuscules des minuscules en ce qui concerne les instructions. En revanche, cela dépend du système d’exploitation utilisé ; le nom des champs ou des tables doit en général être écrit de manière exacte. Programme en langage hôte Bibliothèque fonctions SQL SGBD + code SQL 98 Création de bases de données Figure 4.2 Base de données ‘casse’.
PROJECTION (SELECT)
L’opération de projection consiste à sélectionner la (les) colonne(s) que l’on veut voir figurer dans la table « résultat ». On spécifie la liste des colonnes à inclure dans cette table derrière l’instruction SELECT en les séparant par des virgules. Si l’on désire afficher toutes les colonnes, on les désigne par le caractère « * ». SELECT Nom, Ville FROM personne ; Nom Ville Nestor Paris Irma Lille Henri Paris Josette Lyon Jacques Bordeaux 6 Renault Floride Bleue 5 Renault Alpine A310 Rose 4 Peugeot 403 Blanche 3 Opel GT Blanche 2 Citroen SM Noire 1 Peugeot 404 Rouge NumVoit Marque Type Type 2000-04-02 45 000 5 2 1998-06-14 30 000 4 1 1996-03-30 70 000 2 4 1985-12-03 10 000 1 1 DateVente Prix NumVoit NumAch M F M F M Sexe 5 Jacques 50 Bordeaux 4 Josette 34 Lyon 3 Henri 45 Paris 2 Irma 20 Lille 1 Nestor 96 Paris NumAch Nom Age Ville Vente Voiture Personne Projection sur les colonnes ‘Nom’ et ‘Ville’ de la table ‘Personne’. SQL 99 4 Chapitre SELECT * FROM personne ; Les colonnes de la table « résultat » peuvent être renommées par le mot clé AS. SELECT Ville AS City FROM personne ; Valeurs distinctes d’une colonne Une colonne « Salutations » ne devrait contenir que les valeurs normalisées « Madame », « Monsieur », « Mademoiselle ». L’affichage des valeurs distinctes permet de lister les différentes valeurs prises par la colonne pour repérer d’éventuelles incohérences comme la présence d’une valeur « Mr. », « M. », etc. Afin d’éliminer les doublons éventuels des valeurs d’une colonne de la table « résultat », on fait précéder le nom de la colonne par le mot clé DISTINCT. SELECT DISTINCT Marque FROM voiture ; Utilisation d’expressions pour créer une colonne On rappelle qu’un grand principe en base de données est que l’on ne stocke pas dans une table ce qui peut être calculé. On évite ainsi l’occupation de place inutile ainsi que les problèmes d’incohérence provoqués par la mise à jour des données. Par exemple, si l’on dispose d’une colonne ‘prix’ et d’une colonne ‘quantité’, on ne stocke pas la colonne ‘chiffre d’affaire’ on calcule ses valeurs à partir des colonnes précédentes (chiffre d’affaires = prix × quantité). Cette manière de procéder sera plus « coûteuse » en NumAch Nom Age Ville Sexe 1 Nestor 96 Paris M 2 Irma 20 Lille F 3 Henri 45 Paris M 4 Josette 34 Lyon F 5 Jacques 50 Bordeaux M City Paris Lille Paris Lyon Bordeaux Marque Peugeot Citroen Opel Renault Projection sur tous les champs de la table ‘Personne’. Projection sur les valeurs distinctes du champ ‘Marque’ de la table ‘voiture’. 100 Création de bases de données calcul et pourra éventuellement affecter les performances du système. Les valeurs des colonnes (colonnes) de la table « résultat » peuvent être constituées par des expressions construites avec les opérateurs suivants (voir tableau 4.1).