19 - SQL Sous SqlServer
19 - SQL Sous SqlServer
19 - SQL Sous SqlServer
Signaltique
Nota, astuce :
Contient une partie serveur web qui traite les rponses statiques.
Important, retenir :
Ceci est une chose importante
Commande MS-DOS
C:\> c:\tomcat5.5\bin\startup.bat
Commande SQL
SQL> SELECT * FROM livre;
Commande UNIX
# /tomcat5.5/bin/startup.sh
"8080"
1.1
1.2
Donnes permanentes : Dure de vie trs longue, commun, bouge peu (ex. : personnels
salaris)
Donnes de mouvement : Dure de vie courte, bouge beaucoup (ex. : rservation dun
billet de train)
Donnes de travail : Extraites par calcul des donnes permanentes et de mouvement,
dure de vie trs courte
Donnes historiques : Archives. Stockes sur bandes dans une salle obscure
1.3
La taille des champs est variable. Chaque champ est spar par un dlimiteur.
La taille des champs est variable. Chaque champ est spar par un dlimiteur. Une table
dindex permet dacclrer laccs aux donnes.
1.4
Avantages : pas de problme de taille des champs, recherches un peu plus rapides
Inconvnient : rindexer lors de chaque modification
Tables et relations
Base de donnes peut tre abrge par BD (Base de Donnes), BDD (Base De Donnes), DB
(DataBase). Vous verrez peut-tre les trois
Les donnes sont organises dans des tables : LIVRE, CLIENT, DVD
Les attributs dun livre sont : son code_isbn, son titre, son auteur, date de parution, le nombre de
pages, etc. Ce sont les champs de la table.
Les lignes dune table correspondent aux enregistrements. Par exemple :
Code_isbn : 9788866189422
Titre : la thorie Gaa
Auteur : Maxime Chattam
Date : 2008
Editeur : Albin Michel
Catgorie : 9
Pages : 505
Genre : Thriller
Etc.
Le systme utilis pour les BD est le systme relationnel. Explications dans le cas de DVD :
Dans une base de donnes, Comdie est diffrent de Comedie qui est diffrent de COMEDIE
qui est diffrent de comdie , etc. Si on recherche les films qui correspondent au genre Comdie
et quon na pas t trs rigoureux, il manquera les films du genre comdie , COMEDIE , etc.
De plus, vis--vis de lenregistrement des donnes, enregistrer 7 caractres la place dun ou deux
est une perte de place.
Il est donc important de crer une table GENRE et dy mettre un code abrg qui permettra de
retrouver les genres. a vite de se tromper et de prendre de la place pour rien.
La table GENRE sera donc lie la table DVD. Il y a donc une relation qui lie la table GENRE et la table
DVD
DEHECQ Olivier http://www.entraide-info.fr
La cl primaire dtermine les autres attributs : le numro dtermine le titre, lanne, le code genre. Si
on connait la cl primaire, on est capable de retrouver tous les autres champs de lenregistrement.
Exemple : quel est le titre du livre dont le code ISBN est '9788866189422' ? va toujours renvoyer
la thorie Gaa . Essayez donc avec Quel est le titre du livre crit par 'Maxime Chattam' ? a ne
fonctionnera pas. En effet, plusieurs rponses sont possibles.
DEHECQ Olivier http://www.entraide-info.fr
SQL server
Services :
SQLServerExpress : version gratuite
SQLServer : version payante
Application SQL : SQL Management Studio
Pour les utilisateurs, les ajouter au groupe Administrateur avant
2.1
2.1.1
crer
modifier
supprimer
2.1.2
indexe,
permet les relations entre les tables,
Cl primaire :
Cl trangre :
Vrifications :
CHECK(conditions)
Cl secondaire :
UNIQUE(champ)
NOT NULL,
NOT NULL,
NOT NULL
CHECK(mois BETWEEN 1 AND 12),
DEFAULT 0,
PRIMARY KEY(codeEmp, annee, mois),
FOREIGN KEY(codeEmp, annee)
DEFAUT GETDATE()
Suppression de tables :
Mthode 1 : supprimer les tables en suivant les flches des relations afin de ne pas causer
dincohrence dans les CONSTRAINT FOREIGN KEY
DROP TABLE congesMens ;
DROP TABLE conges ;
DROP TABLE employes ;
DROP TABLE services;
Mthode 2 : supprimer les contraintes de cls trangres puis supprimer les tables (dans nimporte
quel ordre)
ALTER TABLE congesMens DROP CONSTRAINT fk_congesMens_conges ;
ALTER TABLE conges DROP CONSTRAINT fk_conges_employes ;
ALTER TABLE employes DROP CONSTRAINT fk_employes_services ;
2.1.3
CHAR(5)
VARCHAR(80)
NOT NULL,
CONSTRAINT un_categories_libelle
UNIQUE(libelle));
CHAR(5)
VARCHAR(80)
NOT NULL,
CONSTRAINT un_familles_libelle
UNIQUE(libelle));
CHAR(5)
VARCHAR(80)
codeDevise
CHAR(2),
NOT NULL,
prixJour NUMERIC(10,2),
FOREIGN KEY(codeCate,codeFami)
10
2.2
2.2.1
INSERT :
ajout de donnes
UPDATE :
modification de donnes
DELETE :
suppression de donnes
SELECT :
Ajout de donnes
INSERT [INTO] table[(ordre des champs)] VALUES(valeurs) ;
Exemple :
DECLARE @myid UNIQUEIDENTIFIER;
SET @myid = NEWID();
INSERT INTO employes(codeEmp,nom,prenom,dateEmbauche,salaire,codeService)
VALUES(@myid,Raimbaud,Arthur,25/01/2008,3500.20,RESHU);
INSERT INTO Conges VALUES (@myid,2008,DEFAULT);
INSERT congesMens VALUES (@myid,2008,3,5);
INSERT congesMens VALUES (@myid,2008,5,5);
INSERT congesMens VALUES (@myid,2008,7,15);
INSERT congesMens VALUES (@myid,2008,12,5);
La variable doit tre dclare chaque fois quon lutilise. On rentre les valeurs codeEmp tant que
@myid a la valeur du codeEmp de Arthur Raimbaud.
DECLARE @myid UNIQUEIDENTIFIER;
SET @myid = (SELECT codeEmp
FROM Employes
WHERE nom=Raimbaud AND prenom =Arthur);
INSERT INTO conges VALUES(@myid,2011,35);
INSERT INTO congesMens VALUES(@myid,2011,1,2);
INSERT INTO congesMens VALUES(@myid,2011,4,5);
INSERT INTO congesMens VALUES(@myid,2011,6,10);
On rcupre la valeur de codeEmp correspondant Arthur Raimbaud pour linjecter dans la variable
@myid et ainsi lui ajouter de nouveaux congs.
Pour sentrainer : cration en masse denregistrements dans les tables (30 minutes)
5 employs, 14 congs, 31 congesMens, 6 services
11
2.2.2
NEWID()
(SELECT )
DEFAULT
'chaine','date',123
@variable
NULL
2.2.3
2.3
2.4
Exemples :
DELETE Employes WHERE nom = 'REGIS';
DELETE Employes;
Attention aux contraintes de cl trangres ! Attention aux suppressions en cascade !
D. Olivier http://www.entraide-info.fr
12
D. Olivier http://www.entraide-info.fr
13
Pour sentrainer : criture des TRAN avec ROLLBACK, COMMIT, SAVE, tout ou rien au travers de
la base GestionEmployes (15 minutes)
Exemples :
SELECT NEWID();
SELECT GETDATE() AS 'Date du jour';
/* Cf. RI page 91 */
SELECT DATEPART(DW, GETDATE()) AS 'Jour de la semaine';
SELECT DATEPART(MONTH, GETDATE()) AS 'Mois Actuel';
SELECT DATEPART(WEEK, GETDATE()) AS 'Semaine dans lannee';
/* date dans 10 jours */
SELECT GETDATE()+10 AS 'Date dans 10 jours';
/* date dans 5 semaines */
SELECT DATEADD(WW,5,GETDATE()) AS 'Date dans 5 semaines';
/* Pour aller plus loin */
SELECT codeService FROM Employes;
SELECT DISTINCT codeService FROM Employes;
SELECT UPPER(nom) AS 'Nom de l''employ',
COALESCE(prenom, '<pas de prnom>') AS 'Prnom',
CONVERT(CHAR, dateEmbauche, 103) AS 'Date d''embauche',
Salaire=CONVERT(NUMERIC(6),ROUND(salaire,0))
FROM Employes;
D. Olivier http://www.entraide-info.fr
cf RI p. 97
14
D. Olivier http://www.entraide-info.fr
15
Quand on utilise un alias (ici e pour Employes et s pour Services) il faut lutiliser dans toute la requte
SELECT.
Exemple : Calcul dagrgat aprs jointure :
/* Jointure (voir schma AAAA) */
SELECT nom,
nbJoursAcquis,
SUM(nbJoursPris) 'Nombre de jours pris'
FROM Employes e
INNER JOIN Conges c ON e.codeEmp = c.codeEmp
INNER JOIN congesMens m ON c.codeEmp=m.codeEmp AND c.annee=m.annee
WHERE c.annee = YEAR(GETDATE())
GROUP BY e.codeEmp, nom, nbJoursAcquis, c.annee;
Il est ncessaire de grouper par cl primaire (car unique) ainsi que par lensemble des valeurs
affiches qui sont agrges.
Pour exploiter un peu plus :
/* liste des personnes qui il reste + de 10 jours de congs */
SELECT nom,
nbJoursAcquis,
SUM(nbJoursPris) 'Nombre de jours pris'
FROM Employes e
INNER JOIN Conges c ON e.codeEmp = c.codeEmp
INNER JOIN congesMens m ON c.codeEmp=m.codeEmp AND c.annee=m.annee
WHERE c.annee = YEAR(GETDATE())
GROUP BY e.codeEmp, nom,nbJoursAcquis, c.annee
HAVING nbJoursAcquis-SUM(nbJoursPris)>10;
D. Olivier http://www.entraide-info.fr
16
SELECT * FROM (
<1ere requte select>
) nom1
CROSS JOIN (
<2eme requte select>
) nom2;
(*) On slectionne les clauses de filtre aprs la jointure, par exemple nom1.codeEmp=nom2.codeEmp
D. Olivier http://www.entraide-info.fr
17
soit lintgralit des personnels + les services tant affects des employs
soit les personnels tant affects des services + lintgralit des services
soit lintgralit des personnels + lintgralit des services
Dans ce cas prsent, il faut COUNT(l.refart) qui dira que B se retrouve 0 fois dans la table LignesFic ! Si
on met COUNT(a.refart), il indique quil y a 1 ligne pour B.
[LEFT|RIGHT] OUTER JOIN :
SELECT FROM employes LEFT OUTER JOIN service ON ;
D. Olivier http://www.entraide-info.fr
18
Bouba napparait pas dans le rsultat car la valeur de codeChef est NULL. Si on veut lafficher, il faut
faire un LEFT OUTER JOIN :
/* nom du chef direct : affiche les sans chef*/
SELECT e.nom AS 'Employ', COALESCE(c.nom,'-') AS 'Chef'
FROM Employes e
LEFT OUTER JOIN Employes c ON e.codeChef=c.codeEmp
ORDER BY c.nom,e.nom;
Dans le mme ordre dides, la requte suivante permet dafficher le nombre de subordonns quun
chef a sous son commandement direct :
/* Compter le nombre de subordonns */
SELECT c.nom AS 'Nom du chef',COUNT(e.codeEmp) AS 'NbreSubordonns'
FROM Employes e
RIGHT JOIN Employes c ON e.codeChef=c.codeEmp
GROUP BY c.nom,c.codeEmp
ORDER BY NbreSubordonns DESC;
Pour sentrainer : TP 2 Partie IV Les requtes complexes ( 30 minutes environ pour les deux
premiers exercices)
D. Olivier http://www.entraide-info.fr
19
Colonne2
Colonne3
Colonne4
Colonne5
Colonne6
Colonne7
Albert
Dupontel
12/4
zert
123
Az2
Bernard
bianca
8/10
abcd
456
Ed4
ici
Charles
ingals
29/5
dfgh
789
Tf8
Dominique
Lodon
10/7
efgh
963
Hj4
ici
Evrard
Vard
2/1
ijkl
258
Cx6
ici
Florence
Acre
4/8
mnop
147
Ki9
ici
Exemple ci-dessus :
create view MaVue as select colonne1, colonne2, colonne4, colonne5, colonne7
from TblExempl
where colonne6='ici';
WITCH CHECK OPTIONS empche lajout de donnes (avec INSERT INTO nomVue) qui sortent du cadre de
la vue.
Trs utile pour donner les droits une personne de modifier un seul service.
LIKE
SELECT TOP 3 nom, salaire FROM Employes ORDER BY salaire DESC;
Les donnes de la table sont figes, cest lquivalent dune photo un instant donn.
Les tables instantanes (tables CTE)
WITH ChefCTE AS (
SELECT codeEmp, nom, prenom FROM Employes e)
SELECT e.nom,e.prenom,c.nom AS 'son chef' FROM chefCTE c
RIGHT OUTER JOIN Employes e ON e.codeChef=c.codeEmp;
D. Olivier http://www.entraide-info.fr
20
Un nouvel enregistrement est cr puisquon NE DOIT PAS entrer la valeur de IDENTITY (elle est
gnre toute seule).
SELECT * FROM Tests ;
numTest
nomTest
100
Polio
nomTest
100
Polio
102
BCG
Page du document
D. Olivier http://www.entraide-info.fr
Page 13
Page 14
Page 17
21