Académique Documents
Professionnel Documents
Culture Documents
Langage SQL
1. Introduction
Le SQL (Structured Query Language) permet d'interroger une base de données, d'en modifier des
informations. C'est un langage universel d'interrogation des bases de données, qui permet à différents
systèmes d'échanger des données entre eux.
Il est possible de subdiviser la table en groupes, chaque groupe étant l'ensemble de lignes ayant une
valeur commune.
Elle ne s'utilise qu'avec le GROUP BY et permet de donner la ou les conditions que doivent remplir ces
groupes.
Liste des élèves regroupés par ville où habitent plus de 10 élèves.
SELECT NomElv, VilleElv
FROM Eleves
GROUP BY VilleElv
HAVING Count(NomElv) > 10;
Liste des matières où plus de 35 notes ont été données.
SELECT NomMat
FROM Notes
GROUP BY NomMat
HAVING Count(Note) > 35;
La close ORDER BY
Elle permet de spécifier l'ordre dans lequel vont être affichées les lignes.
Liste des matières dans l'ordre alphabétique.
SELECT NomMat
FROM Matieres
ORDER BY NomMat;
Liste des matières par ordre décroissant de coef., puis par ordre alphabétique de nom.
SELECT NomMat
FROM Matires
ORDER BY Coef Desc, NomMat Asc;
Récapitulatif
SELECT noms des colonnes à afficher
FROM nom de la table où se trouvent les colonnes susmentionnées
WHERE condition(s) à remplir par les lignes
GROUP BY condition(s) de regroupement des lignes
HAVING condition(s) à remplir par le groupe
ORDER BY ordre (Asc, Desc) d'affichage
Liste des élèves et nom des cours qu'ils suivent pendant plus de 3 heures.
Requêtes où les données proviennent d'une table mais où la condition de sélection est faite sur une table
différente
Liste des élèves habitant Fes et suivant des cours de Mathématique et de niveau DUT.
Les Jointures :
Commerciaux(CodeCom, NomCom).
On utilise LEFT OUTER JOIN pour créer une jointure externe gauche.
Prenons un cas simple avec deux tables : La jointure externe gauche se compose de tous les
enregistrements de la première table (celle de gauche) et de ceux la deuxième table (celle de droite)
seulement à la condition qu'il existe une valeur correspondante aux enregistrements de la première table
(celle de gauche).
CodeCom NomCom
NomCli AdrCli CPCli VilleCli CodeCom 1 Said Arabi
S. Ahmed 5 av MedV 33000 Fes 2 2 Amina Radi
J.Aziz 3 rue Ghaza 17000 Meknes 3 3 Rachid Bekri
4 Rabie Dena
On obtient le résultat suivant :
NomCli CPCli VilleCli NomCom
S.Ahmec 33000 Fes Amina Radi
J.Aziz 17000 Meknes Rachid Bekri
La jointure RIGHT OUTER JOIN
Soit 2 tables : Clients(NomCli, AdrCli, CPCli, VilleCli, #CodeCom),
Commerciaux(CodeCom, NomCom).
On utilise RIGHT OUTER JOIN pour créer une jointure externe droite.
Prenons un cas simple avec deux tables : La jointure externe droite se compose de tous les
enregistrements de la seconde table (celle de droite) et de ceux la première table (celle de gauche)
seulement à la condition qu'il existe une valeur correspondante aux enregistrements de la deuxième table
(celle de droite).
On utilise INNER JOIN pour fusionner les enregistrements de deux tables lorsqu’un champ commun
contient des valeurs identiques.
Liste des élèves avec leurs niveaux.
SELECT RefElv, NomElv, PreElv, NomCla, Niveau
FROM Eleves INNER JOIN Classes ON Eleves.ClasseElv = Classes.NomCla;
Le COUNT
La commande COUNT permet de compter les lignes.
Soit une table : Eleves(NomElv, AdrElv, VilleElv).
Le nombre d'élèves.
SELECT COUNT(NomElv)
FROM Eleves;
Le SUM
La commande SUM fait la somme d'un champ.
Soit une table Acomptes(DateAcpt, NomOvr, Montant).
La somme des acomptes de chaque ouvrier.
SELECT NomOvr, SUM(Montant)
FROM AComptes
GROUP BY NomOvr;
Le BETWEEN
Le BETWEEN s'utilise avec la close WHERE.
Soit une table Acomptes(DateAcpt, NomOvr, Montant).
La liste des acomptes versés entre le 01/02/2015 et le 28/06/2015.
SELECT * //(Affiche tout les champs de la table Acomptes)
FROM AComptes
WHERE DateAcpt BETWEEN '01/02/2015' AND '28/06/2015';
Le DISTINCT
La commande DISTINCT permet de supprimer les lignes redondantes.
Soit une table : Eleves(NomElv, AdrElv, VilleElv).
La liste des villes où habitent les élèves.
SELECT DISTINCT VilleElv
FROM Eleves;
Le LIKE
Le LIKE s'utilise avec la close WHERE.
Soit une table : Eleves(NomElv, AdrElv, VilleElv).
La liste des élèves dont le nom commence par "a" ou "A".
SELECT * (Affiche tout les champs de la table Elèves)
FROM Eleves
WHERE NomElv LIKE 'a%' OR NomElv LIKE 'A%';
Les caractères jokers sont :
"_" remplace un caractère exactement et
"%" remplace une chaîne de caractères de taille quelconque.
é
Vous pouvez stocker des informations dans des fichiers XML mais très rapidement, suivant
l'ampleur de votre projet, cette technologie atteindra ses limites que ce soit en termes de
performances ou d'utilisation au quotidien. Si plusieurs personnes souhaitent modifier un
fichier texte de données en même temps les erreurs seront inévitables. Il existe une solution
pour stocker des informations et pouvoir travailler: les bases de données.
MySQL Mysql est l'un des SGBDR les plus utilisés au monde. Il est gratuit et très puissant.
Il possède la double licence GPL et propriétaire depuis son rachat par Sun
Microsystem eux-mêmes racheté par Oracle (concurrent direct de MySQL). Le
logiciel reste cependant entièrement gratuit et libre. Il répond à une logique
client/serveur, c'est à dire que plusieurs clients (ordinateurs distants) peuvent se
connecter sur un seul serveur qui héberge les données.
PostgreSQL PostgreSQL ressemble à MySQL, moins connu mais possède des fonctionnalités en
plus.
SQLite SQLite est une bibliothèque écrite en C. SQLite est parfait pour les petits projets. Sa
particularité est d'être intégré directement à un programme et ne répond donc pas à la
logique client-serveur. Il est le moteur de base de données le plus distribué au monde
puisqu'il est intégré à de nombreux logiciels grand public comme FireFox, Skype,
python, Adobe, etc. Le logiciel pèse moins de 300 ko et peut donc être intégré à des
projets tournant sur de petits supports comme les smartphones. Souvent aucune
installation n'est nécessaire pour l'utiliser.
Oracle Oracle Database est sous licence propriétaire, c'est à dire payant. Il est souvent utilisé
pour les projets à gros budget nécessitant de réaliser des actions complexes.
Microsoft Produit Microsoft ne tourne que sur un OS Windows, payant n'apporte rien de plus que
SQL Server les logiciels concurrents libre de droit. Si vous avez trop d'argent à la limite...
Prérequis
A.Lagrioui Page 7/14
CPGE-Alcachy Niveau MP/MP*
Pour pouvoir exploiter les bases de données que nous allons étudier, il est nécessaire de maîtriser le SQL.
SQLite :
Notre premier exemple concernera SQLite.
SQLite a été conçu pour être intégré dans le programme même. Pour des projets plus ambitieux / projets
web le choix de MySQL serait plus judicieux.
import sqlite3
connexion = sqlite3.connect('ma_base.db')
Lorsque vous exécuterez votre programme vous remarquerez que si la base n'existe pas encore, un
fichier sera crée dans le dossier de votre programme. Et si celui-ci existe déjà il sera réutilisé. Vous
pouvez bien évidemment choisir l'emplacement de votre base de données en renseignant un path,
exemple: "C :/DocLagrioui/ma_base.db" . Il vous faudra cependant vérifier que le dossier existe avant
de l'utiliser.
Il est également possible de travailler avec une base de données de manière temporaire:
connexion = sqlite3.connect(':memory:')
Lorsque le travail que vous attendiez est terminé, pensez à fermer la connection vers la base:
connexion.close()
curseur = connexion.cursor()
curseur.execute("""
age INTERGER
) """)
connexion.commit()
curseur = connexion.cursor()
connexion.commit()
curseur.execute(""" INSERT INTO utilisateurs (name, age) VALUES(?, ?)""", ("Ahmed", 42))
curseur.execute(""" INSERT INTO utilisateurs (name, age) VALUES (:name, :age)""", data)
Vous pouvez récupérer l'id de la ligne que vous venez d'insérer de cette manière:
id = curseur.lastrowid
Il est également possible de faire plusieurs insert en une seule fois avec la fonction executemany:
utilisateur = []
utilisateur.append(("Ahmed", 42))
utilisateur.append(("Lagrioui", 90))
utilisateur.append(("Sellam", 48))
utilisateur1 = curseur.fetchone()
print(utilisateur1)
('Ahmed', 42)
Vous pouvez récupérer plusieurs données de la même recherche en utilisant la fonction fetchall().
lignes = curseur.fetchall()
id = 2
response = cursor.fetchone()
connexion.rollback()
import sqlite3
try:
base = sqlite3.connect('data/utilisateur.db')
curseur = base.cursor()
curseur.execute("""
base.commit()
except sqlite3.OperationalError:
except Exception as e:
print("Erreur")
base.rollback()
# raise e
finally:
base.close()
Error
DatabaseError
DataError
IntegrityError
InternalError
NotSupportedError
OperationalError
ProgrammingError
InterfaceError
Warning
Exemple :
Exemple de gestion d‟une base de données „‟Gestiondecommande.db‟‟ qui contient trois tables :
Table client ( CodeC INTEGER PRIMARY KEY, NomC TEXT, VilleC TEXT)
import sqlite3
base = sqlite3.connect('gestioncommande.db')
curseur = base.cursor()
Q3 : Définir une fonction python permettant de Créer les trois tables décrites ci-dessus
def CreateTable():
R1=”””create table if not exist Client (CodeC integer primary key unique, NomC text not
null, VilleC text); “””
R2=”””create table if not exists produit (RefP text primary key not null, NomP text, PrixP
real);”””
curseur.execute(R1)
curseur.execute(R2)
curseur.execute(R3)
base.commit()
Q4 : Définir une fonction python permettant d‟ajouter des données dans la table client
base.commit()
Q5 : Définir une fonction python permettant d‟ajouter des données dans la table produit
base.commit()
Q6 : Définir une fonction python permettant d‟ajouter des données dans la table commande
base.commit()
Q7. Ecrire une fonction principale qui appelle et teste les fonctions définies ci-haut
def menuprincipal() :
CreateTable()
LireClient(10,'Ahmed','Fes')
LireClient(12,'Oumaima','Meknes')
LireClient(14,'Aziz','Fes')
LireClient(16,'Sanae','Rabat')
LireClient(18,'Driss','Fes')
LireProduit("P1",'PC Portable',5000)
LireProduit("P2",'Souris',50)
LireProduit("P3",'Clavier',60)
LireCommande(10,"P1",12)
LireCommande(10,"P2",20)
LireCommande(10,"P3",30)
LireCommande(12,"P1",50)
LireCommande(12,"P1",40)
base.commit()
for e in curseur:
print ("\n")
for x in e :
curseur.close()
for e in curseur:
print ("\n")
for x in e:
curseur.close()
for e in curseur:
print ("\n")
for x in e:
curseur.close()