Site:  Cours VB.net  
6.3 SQL.

Comment adresser une requête vers une Base de données de ADO.NET? Avec SQL

Généralités:

SQL veut dire Structured Query Language  : Langage d'interrogation structurée

SQL grâce au couplage avec un SGBD relationnelle permet un traitement interactif des requêtes.
 

SQL est le langage unique qui permet de décrire, manipuler, contrôler l'accès et interroger les bases de données relationnelles.
C'est un langage déclaratif, qui est régi par une norme (ANSI/ISO) qui assure la portabilité du langage sur différentes plates-formes aussi bien matérielles que logicielles. Une commande SQL écrite dans un environnement Windows sous ACCESS peut, souvent sans modification, être utilisée directement dans un environnement ORACLE sous Unix...

SQL est utilisé dans ADO.NET pour manipuler toutes les bases de données.

Les commandes SQL 

Catégorie Commandes SQL
Manipulation des tables
CREATE Création de tables
ALTER Modification de tables
DROP Suppression de tables
     
Manipulation des données
INSERT Insertion de lignes dans une table
UPDATE Mise à jour de lignes dans une table
DELETE Suppression de lignes dans une table
     
Contrôle des données
GRANT Attribution de droits d'accès
REVOKE Suppression de droits d'accès
COMMIT Prise en compte des mises à jour
ROLLBACK Suppression des mises à jour
     
Interrogation des données
SELECT Interrogations diverses

 

A - SELECT: interrogation.

Permet d'extraire ,de sélectionner des données.

 

Syntaxe simplifiée:

SELECT champ FROM table WHERE condition

Dans la table 'table' sélectionner les enregistrements vérifiant la condition 'condition' et en afficher les champs 'champs'

Exemple

 

SELECT Précise les colonnes qui vont apparaître dans la réponse
FROM Précise la (ou les) table intervenant dans l'interrogation
WHERE Précise les conditions à appliquer sur les enregistrements. On peut utiliser :
- Des comparateurs : =, >, <, >=, <=,<>
- Des opérateurs logiques : AND, OR, NOT
- Les prédicats : IN, LIKE, NULL, ALL, SOME, ANY, EXISTS...
GROUP BY Précise la (ou les) colonne de regroupement
HAVING Précise la (ou les) conditions associées à un regroupement
ORDER BY Précise l'ordre dans lequel vont apparaître les lignes de la réponse :
- ASC  : En ordre ascendant (par défaut)
- DESC: En ordre descendant

 

Exemple:

 

Soit la table patient:

 

Champs 'Civilité' Champ 'Nom' Champ 'Prénom' Champ Num Int Datenais Sexe

 

M. Durand Luc 1 12/02/1952 M
Mme Dupont Josette 2 06/04/1936 F
M. Thomas Guy 3 08/02/1980 M

 

SELECT  Nom FROM Patient

Cela signifie: dans la table Patient extraire les champs 'nom'

On obtient:

Durand
Dupont
Thomas

 

SELECT  Nom FROM Patient WHERE  Prenom='Luc'

WHERE ajoute un critère de sélection.

Cela signifie: dans la table Patient extraire le champ Nom de tous les enregistrements dont le prénom est "Luc" .

Dans l'exemple on obtient :

Durand

 

SELECT  Nom, Prenom  FROM Patient WHERE  Sexe='F'

Cela signifie: dans la table Patient extraire le champ Nom et prénom de tous les enregistrements dont le champ sexe est "F"( F comme féminin)  .

Dans l'exemple on obtient :

Dupont Josette

 

SELECT  *  FROM Patient WHERE  Datenais>=#01/01/1950#

Cela signifie: dans la table Patient extraire tous les champs de tous les enregistrements dont le champ date de naissance est supérieur ou égal à 01/01/1950  .

Dans l'exemple on obtient

M. Durand Luc 1 12/02/1952 M
M. Thomas Guy 3 08/02/1980 M

 

 On remarque que

* signifie : extraire tous les champs.

Pour utiliser les dates , il faut les entourer de "#".

Les dates sont au format mm/jj/aaaa

 

SELECT  *  FROM Patient WHERE  Datenais>= #01/01/1950# AND  Datenais<= #01/01/1980#

Cela signifie: dans la table Patient extraire tous les champs de tous les enregistrements dont le champ date de naissance est supérieur ou égal à 01/01/1950 et inférieur ou égal à 01/01/1980 .

On remarque que on peut utiliser avec Where, les opérandes

AND  OR NOT.

Il est bien sur possible de combiner des conditions sur des champs différents:

 Sexe='M' AND Prenom='Luc"

 

SELECT  *  FROM Patient WHERE  BETWEEN #01/01/1950# AND  #01/01/1980#

Même signification que le précèdent mais en utilisant BETWEN AND qui est plus performant.

 

 

SELECT  Nom FROM Patient WHERE  Prenom IN ('Luc' , 'Pierre', 'Paul')

Cela signifie qu'il faut extraire les enregistrements dont le prénom est Luc, Pierre ou Paul .

 

SELECT  Nom FROM Patient WHERE  Prenom LIKE  'D%'

Cela signifie qu'il faut extraire les enregistrements dont le prénom commence par un 'D'.

LIKE recherche des chaînes de caractères avec l'aide de caractères génériques:

% représente  une chaîne de caractères même vide.

_ représente  un caractère.

On peut spécifier une série de caractères en les mettant entre ""

Exemple :

LIKE 'D%'    commence par D

LIKE '%D%'    contient  D

LIKE '[DF]%'    commence par D ou F

LIKE '___'    contient 3 caractères

 

SELECT  Nom FROM Patient WHERE  SEXE IS NULL

Cela signifie qu'il faut extraire les enregistrements dont le sexe n'a pas été enregistré.

 

SELECT DISTINCT Nom FROM Patient WHERE  SEXE IS NULL

DISTINCT permet d'éviter les doublons

Si dans les Noms extraits il y a 2 fois le même (2 membres d'une même famille) , il n'en est gardé qu'un.

 

TRI des enregistrements:

ORDER BY sert à trier les enregistrements.

Il est placé à la fin.

DESC sert à trier par ordre décroissant.

 

SELECT  Nom, Prenom , Sexe, DateNais  FROM Patient WHERE  Sexe='F' ORDER BY DateNais

Trie les enregistrements de sexe 'F' par date de naissance

 

SELECT  Nom, Prenom, DatNais, NumInt  FROM Patient WHERE  Sexe='F' ORDER BY DateNais DESC, NumInt

Trie les enregistrements de sexe 'F' par date de naissance mais décroissante et pour une même date de naissance par numéro interne croissant.

 

Statistiques:

 

SELECT  COUNT(*) AS  NombrePatient  FROM Patient

Compte le nombre total d'enregistrement dans la table Patient et met le résultat dans le champ NombrePatient

On peut aussi utiliser:

MIN  retourner la plus petite valeur.

MAX  retourner la plus grande valeur.

SUM retourner la somme.

AVG retourner la moyenne.

VAR retourner la variance

STDEV retourner l'écart type.

 

SELECT  Prenom ,COUNT(*) AS  NombrePrenom  FROM Patient GROUP BY Prenom

Extrait la liste des prénom avec le nombre de fois que le prénom est utilisé.

GROUP BY regroupe les enregistrements par valeur.

 

SELECT  Prenom ,COUNT(*) AS  NombrePrenom  FROM Patient GROUP BY Prenom HAVING CONT(*)>3

Extrait la liste des prénoms avec le nombre de fois que le prénom est utilisé. S'il est utilisé plus de 3 fois..

HAVING rajoute un critère au regroupement.

 

 

Extraction de données sur plusieurs tables:

Parfois on a besoin d'extraire des champs de plusieurs tables différentes, mais ayant une relation (un champ commun); pour cela on utilise  une jointure.

Pour chaque enregistrement de la première table, on affiche en regard les enregistrements de la 2eme table qui ont la même valeur de jointure.

Exemple:

Soit la table patient:

Champs 'Civilité' Champ 'Nom' Champ 'Prénom' Numéro Ville Datenais Sexe

 

M. Durand Luc 1 12/02/1952 M
Mme Dupont Josette 2 06/04/1936 F
M. Thomas Guy 3 08/02/1980 M

Soit la table Ville:

Nom ville Numéro ville

 

Paris 1
Lyon 2
Marseille 3

 

Comment récupérer nom et ville (en clair, pas son numéro)

SELECT Patient.Nom, Ville.NomVille From Patient INNER JOIN Ville ON Patient.NuméroVille= Ville.NuméroVille

On obtient:

Durand Paris
Dupont Lyon
Thomas Paris

 

En ADO.Net, on verra qu'on passe la chaîne SQL à un objet Command.

Ces données extraites à partir d'une base de données grâce à l'instruction SQL vont se retrouver dans un DataSet (sorte de Bd en local, en mémoire).

 

B - Ajout, suppression, modification d'enregistrement:

Il est impossible d'insérer, de modifier ou de supprimer dans plusieurs tables simultanément

Une requête de mise à jour (INSERT, UPDATE ou SELECT) est une transaction ,tout doit être réalisé, sinon rien ne se passe (en particulier si une seule donnée viole une contrainte, toutes les opérations sont annulées )

Insertion d'enregistrement:

Syntaxe:
 
INSERT [INTO] nomdelatable [(listedescolonnes)] 
{VALUES (listedesvaleurs) | requêteselect | DEFAULT VALUES }
Exemple:
INSERT INTO TablePatient (Civilité, Nom, Prenom, NumeroVille, Datenais, Sex)
       VALUES               ('M', 'Dupont', 'Pierre', '2',' 02/12/51/, 'M')
 
Effacement d'enregistrement:

Syntaxe:

 
DELETE [FROM] nomtable 
[WHERE condition]
Exemple:
DELETE FROM Patient
WHERE  Nom LIK'%d'
Mise à jour d'enregistrement:
Syntaxe:
UPDATE nomtable
SET colonne1 = valeur1 , colonne2 = valeur2 ...
WHERE condition
WHERE condition est facultatif et permet de sélectionner  les enregistrements correspondant 
à un critère et de modifier ceux là.
En Ado.Net on verra  qu'il y a 2 méthodes pour modifier ajouter, supprimer un enregistrement:

 

C - Ajout de table: 

On utilise CREATE TABLE puis le nom de la table, on ajoute les différents champs (entre parenthèses et séparés par des virgules)avec pour chaque champ les conditions (NOT NULL..) et le type.

CREATE TABLE PARENT (CLI_ID INTEGER NOT NULL PRIMARY KEY, CLI_NOM CHAR(32) NOT NULL, CLI_PRENOM VARCHAR(32))

En Ado.Net on verra qu'on exécute ces commandes par la méthode ExecuteNoQuery d'un objet Command.

 

Pour aller plus loin:

Série d'articles sur SQL chez developpez.com:

http://sql.developpez.com/