SQL sous SqlServer OLIVIER D. DEHECQ Olivier http://www.entraide-info.fr 0



Documents pareils
SQL Historique

Bases de Données relationnelles et leurs systèmes de Gestion

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Le Langage De Description De Données(LDD)

Langage SQL : créer et interroger une base

Création et Gestion des tables

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

PHP 5. La base de données MySql. A. Belaïd 1

Bases de données relationnelles

Le langage SQL Rappels

Historisation des données

Notes de cours : bases de données distribuées et repliquées

Olivier Mondet

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

TP Contraintes - Triggers

1/ Présentation de SQL Server :

Plan Général Prévisionnel (1/2) (non contractuel) Internet et Outils L1/IO S2-IO2 Bases de données: Jointures, Transactions

1 Introduction et installation

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

FileMaker 13. Guide de référence SQL

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Les bases de données

CREATION WEB DYNAMIQUE

Plan. Bases de Données. Sources des transparents. Bases de SQL. L3 Info. Chapitre 4 : SQL LDD Le langage de manipulation de données : LMD

Le Langage SQL version Oracle

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

TP base de données SQLite. 1 Différents choix possibles et choix de SQLite : 2 Définir une base de donnée avec SQLite Manager

Compétences Business Objects

Les BASES de DONNEES dans WampServer

Le langage SQL (première partie) c Olivier Caron

14/04/2014. un ensemble d'informations sur un sujet : exhaustif, non redondant, structuré, persistant. Gaëlle PERRIN SID2 Grenoble.

Cours Bases de données 2ème année IUT

SQL Server 2000, Analysis Services et DTS

TD : Requêtes SQL (BDR.TD2-1) INSA 3IF

Bases de données et sites WEB

Intégrité des données

TP3 : Creation de tables 1 seance

Introduction aux Bases de Données 2004/2005

SQL. Oracle. pour. 4 e édition. Christian Soutou Avec la participation d Olivier Teste

Partie 0 : Gestion des tablespace et des utilisateurs... 3

1. LA GESTION DES BASES DE DONNEES RELATIONNELLES

A QUOI SERVENT LES BASES DE DONNÉES?

Gestion de base de données

Introduction au Système de Gestion de Base de Données et aux Base de Données

MySQL / SQL EXEMPLES

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

1. Base de données SQLite

Information utiles. webpage : Google+ : digiusto/

SQL Server Cyril Gruau. 11 février 2003

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

16H Cours / 18H TD / 20H TP

Chapitre 3 LE MODELE RELATIONNEL ET SQL (DDL)

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

INSTITUT NATIONAL DES TELECOMMUNICATIONS CONTROLE DES CONNAISSANCES. 2. Les questions sont indépendantes les unes des autres.

Modélisation et Gestion des bases de données avec mysql workbench

Cours SQL. Base du langage SQL et des bases de données

Faculté des sciences de gestion et sciences économiques BASE DE DONNEES

Structure fonctionnelle d un SGBD

Encryptions, compression et partitionnement des données

Présentation du module Base de données spatio-temporelles

TP Bases de données réparties

OpenPaaS Le réseau social d'entreprise

Support de Cours REQUÊTES TRANSACT-SQL DANS MICROSOFT SQL SERVER Stéphane N GUESSAN Groupe Pigier Abidjan Version 1.

A QUOI SERVENT LES BASES DE DONNÉES?

Auto-évaluation Oracle: cours de base

Devoir Data WareHouse

Cours Bases de données 2ème année IUT

I4 : Bases de Données

Bases de données et sites WEB Licence d informatique LI345

Partie II Cours 3 (suite) : Sécurité de bases de données

Intégrité sémantique dans les bases de données relationnelles

SQL Server administration SERVEUR DE BASES DE DONNEES OLIVIER D.

Les déclencheurs. Version 1.0. Grégory CASANOVA

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Pour les débutants. langage de définition des données

clef primaire ; clef étrangère ; projection ; restriction ; jointure ; SQL ; SELECT ; FROM ; WHERE

FORMATION A L UTILISATION DE PMB QUELQUES NOTIONS DE SQL

Exemple accessible via une interface Web. Bases de données et systèmes de gestion de bases de données. Généralités. Définitions

Bases de données élémentaires Maude Manouvrier

Gestion des transactions et accès concurrents dans les bases de données relationnelles

Systèmes de Gestion de Bases de Données

PHP. Bertrand Estellon. 26 avril Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril / 214

Corrigés détaillés des exercices

Bases de données Cours 1 : Généralités sur les bases de données

Cours Base de données relationnelles. M. Boughanem, IUP STRI

Les bases fondamentales du langage Transact SQL

Cours: Les Jointures 1

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

Session S12 Les bases de l optimisation SQL avec DB2 for i

I. MySQL : Serveur et SGBD

Développement de base de données Microsoft SQL Server Durée : 5 jours Référence : DPSQL12. Contenu

Système de Gestion de Bases de Données Relationnelles. MySQL. Youssef CHAHIR

Pratique et administration des systèmes

Support de cours. Introduction à SQL et MySQL. 2003, Sébastien Namèche

Transcription:

2013 SQL sous SqlServer OLIVIER D. DEHECQ Olivier http://www.entraide-info.fr 0

Table des matières Signalétique... 2 1 Les bases du SQL... 3 2 SQL server... 6 2 Références des exercices...21 DEHECQ Olivier http://www.entraide-info.fr 1

Signalétique Nota, astuce : Contient une partie serveur web qui traite les réponses 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 Chemin de fichier, dossier, emplacement sur le disque Fichier web.xml Exemple de contenu de document <Host name="localhost" appbase="webapps" unpackwars="true" autodeploy="true" /> Contenu du fichier web.xml <welcome-file>index.html</welcome-file> Contenu du fichier server.xml port "8080" port d écoute du connecteur Autre contenu de fichier : <role rolename="ruserhelloworld"/> Spécifique aux documents xml : Balise Nom de propriété Valeur Commentaire DEHECQ Olivier http://www.entraide-info.fr 2

1 Les bases du SQL 1.1 Définition de SGBD (DBMS) : Un SGBD (DBMS) est un Système de Gestion de Bases de Données. SQL Server, Oracle et MySQL sont des SGBD. Le rôle est inclus dans le nom, merci de lire! Types de données : Données permanentes : Durée de vie très longue, commun, bouge peu (ex. : personnels salariés) Données de mouvement : Durée de vie courte, bouge beaucoup (ex. : réservation d un billet de train) Données de travail : Extraites par calcul des données permanentes et de mouvement, durée de vie très courte Données historiques : Archives. Stockées sur bandes dans une salle obscure 1.2 Les données qu on peut stocker Imaginer que vous vouliez répertorier des données, pour pouvoir par exemple appliquer des tris. L intérêt d avoir un annuaire téléphonique en base de données serait par exemple de pouvoir retrouver un téléphone à partir du nom de famille, du prénom, de la date de naissance (pratique pour appeler le jour même de l anniversaire), etc. Imaginez les possibilités! Par exemple, on peut stocker des données qui concernent les livres qu on possède. Ces livres ont tous : un seul code ISBN (qui est unique et peut donc servir de clé pour les départager), un seul titre, une seule date de première édition, un seul auteur On pourrait donc créer une table «LIVRE» contenant des champs «code_isbn», «titre», «date_premiere_edition», «auteur». Attention, comme un livre peut avoir plusieurs genres (exemple : policier + drame), on verra plus tard comment on gère ce cas. En tout cas, on ne peut pas faire de champ «genre» : il faudrait que le livre ne puisse avoir qu un seul genre. 1.3 Organisation des données dans un fichier de données. Les données contenues dans la base de données sont écrites physiquement sur un support (disque dur). La façon d écrire ces données offre des avantages et inconvénients. Première méthode : direct Organisation directe des données Prénom du 1 er client : du 31 e au 60 e C Prénom du 5 e client : 68 x 4 + 31 Avantage : facile à classer Inconvénient : limité aux n caractères (pas de nom > 30 C) DEHECQ Olivier http://www.entraide-info.fr 3

Deuxième méthode : séquentiel Organisation séquentielle des données La taille des champs est variable. Chaque champ est séparé par un délimiteur. Avantage : plus de problème de taille des champs Inconvénient : recherches longues (lire de façon séquentielle à cause des délimiteurs) Troisième méthode : séquentiel indexé Organisation séquentielle indexée des données La taille des champs est variable. Chaque champ est séparé par un délimiteur. Une table d index permet d accélérer l accès aux données. 1.4 Tables et relations Avantages : pas de problème de taille des champs, recherches un peu plus rapides Inconvénient : réindexer lors de chaque modification Base de données peut être abrégée par BD (Base de Données), BDD (Base De Données), DB (DataBase). Vous verrez peut-être les trois Les données sont organisées dans des tables : LIVRE, CLIENT, DVD Les attributs d un 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 d une table correspondent aux enregistrements. Par exemple : Code_isbn : 9788866189422 Titre : la théorie Gaïa Auteur : Maxime Chattam Date : 2008 Editeur : Albin Michel Catégorie : 9 Pages : 505 Genre : Thriller Etc. Le système utilisé pour les BD est le système relationnel. Explications dans le cas de DVD : Dans une base de données, «Comédie» est différent de «Comedie» qui est différent de «COMEDIE» qui est différent de «comédie», etc. Si on recherche les films qui correspondent au genre «Comédie» et qu on n a pas été très rigoureux, il manquera les films du genre «comédie», «COMEDIE», etc. De plus, vis-à-vis de l enregistrement des données, enregistrer 7 caractères à la place d un ou deux est une perte de place. Il est donc important de créer une table GENRE et d y mettre un code abrégé qui permettra de retrouver les genres. Ça évite de se tromper et de prendre de la place pour rien. La table GENRE sera donc liée à 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 4

C est ce qu illustre le document suivant : Vocabulaire et relation entre la table DVD et la table GENRE Contrainte d intégrité relationnelle : le CodeGenre doit exister dans la table GENRE. Si on supprime un élément de la table GENRE, il faut s assurer qu aucun élément de la table DVD n y fasse référence! L attribut souligné est la clé unique (clé primaire de la table) 0, : un enregistrement de la table GENRE peut correspondre à de 0 à plusieurs enregistrements de la table DVD 1 : un enregistrement de la table DVD peut correspondre à 1 seul enregistrement de la table GENRE Une contrainte d intégrité référentielle va toujours de la clé étrangère vers la clé primaire La clé primaire détermine les autres attributs : le numéro détermine le titre, l année, le code genre. Si on connait la clé primaire, on est capable de retrouver tous les autres champs de l enregistrement. Exemple : «quel est le titre du livre dont le code ISBN est '9788866189422'?» va toujours renvoyer «la théorie Gaïa». Essayez donc avec «Quel est le titre du livre écrit par 'Maxime Chattam'?» ça ne fonctionnera pas. En effet, plusieurs réponses sont possibles. DEHECQ Olivier http://www.entraide-info.fr 5

2 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 Data Definition Language Le DDL (Data Definition Language) est le langage qui permet de modifier la structure des BDD CREATE ALTER DROP créer modifier supprimer 2.1.1 Créer une base et l utiliser Les instructions suivantes vont permettre la création progressive d une base de données sous Sql Server. CREATE DATABASE GestionEmployes GO Pour séparer les instructions USE GestionEmployes 2.1.2 Créer, modifier, supprimer une table et son contenu CREATE TABLE Services( codeservice CHAR(5) libelle VARCHAR(30) ) ; ALTER TABLE Services ADD telservice CHAR(3) ; CONSTRAINT pk_services PRIMARY KEY, NOT NULL ALTER TABLE Services ALTER COLUMN telservice CHAR(10) ; ALTER TABLE Services ADD CONSTRAINT un_services_libelle UNIQUE(libelle) ; DROP TABLE Services ; Clé primaire est : indexée, permet les relations entre les tables, unique (identifie de façon unique un enregistrement) DEHECQ Olivier http://www.entraide-info.fr 6

Exemple de la création des 2 e et 3e tables et de leurs relations : CREATE TABLE Employes( codeemp UNIQUEIDENTIFIER CONSTRAINT pk_employes PRIMARY KEY, nom VARCHAR(20) NOT NULL, prenom VARCHAR(20), dateembauche DATETIME NULL, datemodif DATETIME NULL, salaire NUMERIC(8,2) DEFAULT 0 CONSTRAINT ck_employes_salaire CHECK(salaire >= 0), photo IMAGE, codeservice CHAR(5) NOT NULL, codechef UNIQUEIDENTIFIER NULL, CONSTRAINT ck_employes_dates CHECK (datemodif IS NULL OR datemodif >= dateembauche) ) ; ALTER TABLE Employes ADD CONSTRAINT fk_employes_services FOREIGN KEY(codeService) REFERENCES Services(CodeService), CONSTRAIN fk_employes_employes FOREIGN KEY(codeChef) REFERENCES Employes(CodeEmp) ; Le schéma obtenu est le suivant : Les types de contraintes : CONSTRAINT <nom de la contrainte> Clé primaire : Clé étrangère : Vérifications : Clé secondaire : Utilisation des clés étrangères PRIMARY KEY(nom de la/des clés primaires) FOREIGN KEY(champ local) REFERENCES table(champ distant) CHECK(conditions) UNIQUE(champ) Ajout d une table ayant une clé primaire composite : CREATE TABLE Conges( codeemp UNIQUEIDENTIFIER NOT NULL CONSTRAINT fk_conges_employes REFERENCES employes(codeemp), annee NUMERIC(4) NOT NULL, nbjouracquis NUMERIC(2) DEFAULT 30, CONSTRAINT pk_conges PRIMARY KEY(codeEmp, annee) ); DEHECQ Olivier http://www.entraide-info.fr 7

Ajout d une clé étrangère composite: CREATE TABLE congesmens( codeemp UNIQUEIDENTIFIER NOT NULL, annee NUMERIC(4) NOT NULL, mois NUMERIC(2) NOT NULL CONSTRAINT ck_congesmens_mois CHECK(mois BETWEEN 1 AND 12), nbjourspris NUMERIC(2) DEFAULT 0, CONSTRAINT pk_congesmens PRIMARY KEY(codeEmp, annee, mois), CONSTRAINT fk_congesmens_conges FOREIGN KEY(codeEmp, annee) REFERENCES Conges(codeEmp, annee) ); Suppression en cascade des enregistrements : ALTER TABLE congesmens DROP CONSTRAINT fk_congesmens_conges; ALTER TABLE conges DROP CONSTRAINT fk_conges_employes; ALTER TABLE congesmens ADD CONSTRAINT fk_congesmens_conges FOREIGN KEY(codeEmp, annee) REFERENCES conges(codeemp, annee) ON DELETE CASCADE; ALTER TABLE conges ADD CONSTRAINT fk_conges_employes FOREIGN KEY(codeEmp) REFERENCES employes(codeemp) ON DELETE CASCADE; Les expressions courantes : NOT NULL NULL (ou rien) ON DELETE CASCADE (après FOREIGN KEY) DEFAUT GETDATE() Suppression de tables : valeur nulle interdite valeur nulle autorisée supprime les données des tables affiliées valeur par défaut = date du jour Méthode 1 : supprimer les tables en «suivant» les flèches des relations afin de ne pas causer d incohérence dans les CONSTRAINT FOREIGN KEY DROP TABLE congesmens ; DROP TABLE conges ; DROP TABLE employes ; DROP TABLE services; Méthode 2 : supprimer les contraintes de clés étrangères puis supprimer les tables (dans n importe 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 ; Nota : Il n est pas utile le supprimer la contrainte interne à la table employés. DROP TABLE employes ; DROP TABLE services; DROP TABLE congesmens ; DROP TABLE conges ; DEHECQ Olivier http://www.entraide-info.fr 8

2.1.3 TD1 : DML Refaire un schéma en utilisant SQL CREATE DATABASE Location GO USE Location CREATE TABLE categories( codecate CHAR(5) CONSTRAINT pk_categories PRIMARY KEY, libelle VARCHAR(80) NOT NULL, CONSTRAINT un_categories_libelle UNIQUE(libelle)); CREATE TABLE familles( codefami CHAR(5) CONSTRAINT pk_familles PRIMARY KEY, libelle VARCHAR(80) NOT NULL, CONSTRAINT un_familles_libelle UNIQUE(libelle)); CREATE TABLE tarifs( codetarif CHAR(5) CONSTRAINT pk_tarifs PRIMARY KEY, libelle VARCHAR(80) NOT NULL, codedevise CHAR(2), prixjour NUMERIC(10,2), DEHECQ Olivier http://www.entraide-info.fr 9

CONSTRAINT ck_tarifs_prixjour CHECK(prixJour >= 0)); CREATE TABLE grilletarifs( codecate CHAR(5) NOT NULL CONSTRAINT fk_grilletarifs_categories REFERENCES categories(codecate), codefami CHAR(5) NOT NULL CONSTRAINT fk_grilletarifs_familles REFERENCES familles(codefami), codetarif CHAR(5) NOT NULL CONSTRAINT fk_grilletarifs_tarifs REFERENCES tarifs(codetarif), CONSTRAINT pk_grilletarifs PRIMARY KEY(codeCate,codeFami)); CREATE TABLE articles( refart CHAR(8) CONSTRAINT pk_articles PRIMARY KEY, designation VARCHAR(80) NOT NULL, codecate CHAR(5) NOT NULL, codefami CHAR(5) NOT NULL, CONSTRAINT fk_articles_grilletarifs REFERENCES grilletarifs(codecate,codefami)); FOREIGN KEY(codeCate,codeFami) CREATE TABLE clients( nocli NUMERIC(6) CONSTRAINT pk_clients PRIMARY KEY, nom CHAR(30) NOT NULL, prenom VARCHAR(30) NOT NULL, adresse VARCHAR(120) NOT NULL, cpo CHAR(5) NOT NULL, ville CHAR(80) DEFAULT 'Nantes', CONSTRAINT ck_clients_cpo CHECK(cpo BETWEEN 1000 AND 95999)); CREATE TABLE fiches( nofic NUMERIC(6) CONSTRAINT pk_fiches PRIMARY KEY, nocli NUMERIC(6) CONSTRAINT fk_fiches_clients REFERENCES clients(nocli), datcreation DATE DEFAULT GETDATE(), datretour DATE, etat CHAR(2) DEFAULT 'EC', CONSTRAINT ck_fiches_etat CHECK(etat = 'EC' OR etat = 'RE' OR etat = 'SO'), CONSTRAINT ck_fiches_datretour CHECK(datretour IS NULL OR datretour >= datcreation)); CREATE TABLE lignesfic( nofic NUMERIC(6) NOT NULL CONSTRAINT fk_lignesfic_fiches REFERENCES fiches(nofic), nolig NUMERIC(3) NOT NULL, refart CHAR(8) CONSTRAINT fk_lignesfic_articles REFERENCES articles(refart), depart DATE DEFAULT GETDATE(), retour DATE, CONSTRAINT pk_lignesfic PRIMARY KEY(nofic,nolig), CONSTRAINT ck_lignesfic_retour CHECK(retour IS NULL OR retour >= depart)); DEHECQ Olivier http://www.entraide-info.fr 10

2.2 Data Manipulation Language Le DML (Data Manipulation Language) est le langage qui permet de modifier le contenu de la BDD INSERT : UPDATE : DELETE : SELECT : ajout de données modification de données suppression de données extraire des informations 2.2.1 Ajout de données INSERT [INTO] table[(ordre des champs)] VALUES(valeurs) ; Déclaration et modification d une variable : DECLARE @variable TYPE; SET @variable = valeur; 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 déclarée à chaque fois qu on l utilise. 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 récupère la valeur de codeemp correspondant à Arthur Raimbaud pour l injecter dans la variable @myid et ainsi lui ajouter de nouveaux congés. Pour s entrainer : création en masse d enregistrements dans les tables (30 minutes) 5 employés, 14 congés, 31 congesmens, 6 services DEHECQ Olivier http://www.entraide-info.fr 11

2.2.2 Les variables courantes NEWID() (SELECT ) DEFAULT 'chaine','date',123 @variable NULL génère un nouvel ID valeur du résultat valeur par défaut chaine, date ou nombre valeur de la variable nom renseigné 2.2.3 Tests des contraintes Le but est de tenter d ajouter un enregistrement contenant des erreurs liées aux contraintes. Si un message d erreur s affiche avec le nom de la contrainte testée alors c est gagné. Exemple : test de la contrainte pk_employes : /* test d'ajout d'une clef primaire déjà existante */ DECLARE @idr UNIQUEIDENTIFIER; SET @idr = (SELECT codeemp FROM Employes WHERE nom='raimbaud' AND prenom='arthur'); INSERT INTO Employes VALUES(@idR,'A','B','1/1/2010',NULL,1,NULL,'INFOR',NULL); Pour s entrainer : test de toutes les contraintes de la base GestionEmployes (30 minutes) Tester les contraintes ainsi que les valeurs NULL non acceptés 2.3 Modification des données UPDATE table SET champ = valeur; UPDATE Employes SET nom=upper(nom); DECLARE @idbb UNIQUEIDENTIFIER; SET @idbb = (SELECT codeemp FROM Employes WHERE nom='big BOSS'); UPDATE employes SET codechef=@idbb WHERE nom IN ('MICHEL','RAIMBAUD'); Pour s entrainer : créer l organigramme suivant (10 minutes) / MICHEL - REGIS BIG BOSS \ RAIMBAUD PICASSO 2.4 Suppression des données DELETE table [WHERE condition]; Exemples : DELETE Employes WHERE nom = 'REGIS'; DELETE Employes; Attention aux contraintes de clé étrangères! Attention aux suppressions en cascade! D. Olivier http://www.entraide-info.fr 12

1.1 Utilisation des transactions pour tester les modifications de contenu BEGIN TRAN nom_de_la_transation MODIFICATION (INSERT / UPDATE / DELETE) SELECT * FROM table_modifiée; ROLLBACK COMMIT TRAN nom_de_la_transation SELECT * FROM table_modifiée; BEGIN TRAN sup DELETE Employes WHERE nom = 'REGIS'; SELECT * FROM Employes; ROLLBACK TRAN sup SELECT * FROM Employes; Attention aux contraintes de clé étrangères! Attention aux suppressions en cascade! 1.1.1 Gestion des points de contrôle Fonctionnement des transactions SQL Server SELECT '' AS 'Avant', * FROM clients; BEGIN TRAN TrySav INSERT INTO clients VALUES (20,'LAURENT','Amelie','rue Brassens',45100,NULL); SELECT '' AS 'Pendant1', * FROM clients; SAVE TRAN pt_ctrl INSERT INTO clients VALUES (21,'DEHECQ','Olivier','ave Beauregard',44800,NULL); SELECT '' AS 'Pendant2', * FROM clients; ROLLBACK TRAN pt_ctrl COMMIT TRAN SELECT '' AS 'Après', * FROM clients; D. Olivier http://www.entraide-info.fr 13

1.1.2 Validation tout ou rien SET XACT_ABORT ON si une instruction de la TRAN foire, annule toute la TRAN SET XACT_ABORT ON; SELECT '' AS 'Avant', * FROM categories; BEGIN TRAN TryTou INSERT INTO categories VALUES ('TOTO','Totos'); SELECT '' AS 'Pendant1', * FROM categories; INSERT INTO categories VALUES ('PORTABLE','Ordinateur Portable'); COMMIT TRAN TryTou; SELECT '' AS 'Après', * FROM categories; Pour s entrainer : écriture des TRAN avec ROLLBACK, COMMIT, SAVE, tout ou rien au travers de la base GestionEmployes (15 minutes) 1.2 L instruction SELECT 1.2.1 Construction de la commande SELECT valeur ; SELECT [DISCTINCT] * champs [valeur AS champ ] FROM table ; 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 prénom>') AS 'Prénom', CONVERT(CHAR, dateembauche, 103) AS 'Date d''embauche', cf RI p. 97 Salaire=CONVERT(NUMERIC(6),ROUND(salaire,0)) FROM Employes; D. Olivier http://www.entraide-info.fr 14

/* Affichage des données d'une table */ SELECT * FROM Employes; SELECT nom, prenom FROM Employes; SELECT * FROM Employes WHERE dateembauche > '01/01/2009'; SELECT nom,prenom,codeservice FROM Employes WHERE dateembauche > '01/01/2009'; /* Calculs */ SELECT nom, ancienneté=datediff(month, dateembauche,getdate()) FROM Employes ORDER BY ancienneté; SELECT nom, salaire * 1.3 AS 'Salaire brut mensuel' FROM Employes; 1.2.2 Calcul d agrégat C est un calcul portant sur plusieurs enregistrements (SUM somme, AVG moyenne, MAX, MIN, COUNT). SELECT COUNT(*) AS 'nombre d''employés' calcul d'agregat cf. RP p. 88 FROM Employes; SELECT SUM(salaire) AS 'Masse salariale' FROM Employes; SELECT AVG(salaire) AS 'salaire moyen' FROM Employes; SELECT MIN(Salaire) AS 'Salaire minimum' FROM Employes; SELECT MAX(Salaire) AS 'Salaire maximum' FROM Employes; SELECT COUNT(prenom) AS 'nb d''employés ayant un prenom connu dans la base' FROM Employes; --> compte les prenom!= NULL 1.2.3 Grouper par critères : GROUP BY /* masse salariale par service */ SELECT codeservice,sum(salaire) AS 'masse salariale du service' FROM Employes GROUP BY codeservice; SELECT codeservice,convert(numeric(8,2),avg(salaire)) AS 'sal moy/ service' FROM Employes GROUP BY codeservice; 1.2.4 Conditions sur des ensembles : HAVING SELECT codeservice,convert(numeric(8,2),avg(salaire)) AS 'salaire moyen par service' FROM Employes GROUP BY codeservice HAVING AVG(Salaire) > 2500; 1.2.5 Jointures : INNER JOIN Les jointures permettent de faire des select sur les champs de plusieurs tables ayant des relations d intégrités référentielles. SELECT nom, Employes.codeService, Services.codeService,libelle FROM Employes INNER JOIN Services ON Employes.codeService = Services.codeService ORDER BY libelle; /* utilisation des alias */ SELECT nom, e.codeservice, s.codeservice,libelle FROM Employes e INNER JOIN Services s ON e.codeservice = s.codeservice ORDER BY libelle; D. Olivier http://www.entraide-info.fr 15

Quand on utilise un alias (ici e pour Employes et s pour Services) il faut l utiliser dans toute la requête SELECT. Exemple : Calcul d agrégat après jointure : /* Jointure (voir schéma 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 nécessaire de grouper par clé primaire (car unique) ainsi que par l ensemble des valeurs affichées qui sont agrégées. Pour exploiter un peu plus : /* liste des personnes à qui il reste + de 10 jours de congés */ 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; Ici on joint 3 tables ensembles 1.2.6 Trier : ORDER BY DESC indique un ordre décroissant. SELECT * FROM Employes ORDER BY salaire, dateembauche DESC; Pour s entrainer : TP 1 Partie IV Les requêtes simples ( 1 heure environ) D. Olivier http://www.entraide-info.fr 16

1.2.7 Jointures de sous requêtes Le but d une jointure de sous requête et de pouvoir travailler sur plusieurs requêtes comme si les champs obtenus faisaient partie d une grande table contenant les attributs de nom1 et de nom2. SELECT * FROM ( SELECT * FROM ( <1ere requête select> <1ere requête select> ) nom1 ) nom1 INNER JOIN ( CROSS JOIN ( <2eme requête select> <2eme requête select> ) nom2 ) nom2; ON clauses(*); (*) On sélectionne les clauses de filtre après la jointure, par exemple nom1.codeemp=nom2.codeemp Pour toutes les jointures INNER JOIN, le fonctionnement est le même SELECT * FROM ( SELECT t.prixjour * (DATEDIFF(DD,l.depart,l.retour)+1) AS 'montant', nolig AS 'ligne', nom, prenom FROM clients c INNER JOIN fiches f ON c.nocli = f.nocli INNER JOIN lignesfic l ON l.nofic = f.nofic INNER JOIN articles a ON l.refart = a.refart INNER JOIN grilletarifs g ON g.codecate = a.codecate AND g.codefami = a.codefami INNER JOIN tarifs t ON t.codetarif = g.codetarif WHERE UPPER(nom)='BOUTAUD' AND UPPER(prenom)='SABINE' ) req1 INNER JOIN ( SELECT SUM(t.prixJour * (DATEDIFF(DD,l.depart,l.retour)+1)) AS 'montant total', nom, prenom FROM clients c INNER JOIN fiches f ON c.nocli = f.nocli INNER JOIN lignesfic l ON l.nofic = f.nofic INNER JOIN articles a ON l.refart = a.refart INNER JOIN grilletarifs g ON g.codecate = a.codecate AND g.codefami = a.codefami INNER JOIN tarifs t ON t.codetarif = g.codetarif WHERE UPPER(nom)='BOUTAUD' AND UPPER(prenom)='SABINE' GROUP BY nom, prenom,l.depart,l.retour ) req2 ON req1.nom=req2.nom AND req1.prenom=req2.prenom; D. Olivier http://www.entraide-info.fr 17

1.2.8 Jointures externes : [FULL LEFT RIGHT] OUTER JOIN Le but d une jointure externe est d afficher les enregistrements qui ne se retrouvent dans la table jointe (Employés sans Services par exemple). Il est possible d afficher : soit l intégralité des personnels + les services étant affectés à des employés soit les personnels étant affectés à des services + l intégralité des services soit l intégralité des personnels + l intégralité des services FULL OUTER JOIN : SELECT a.refart,a.designation, COUNT(l.refart) AS NbTotalLoc par Article FROM Articles a FULL OUTER JOIN LignesFic l ON l.refart=a.refart GROUP BY a.refart,a.designation ; Jointures internes et externes Dans ce cas présent, 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 qu il y a 1 ligne pour B. [LEFT RIGHT] OUTER JOIN : SELECT FROM employes LEFT OUTER JOIN service ON ; On retrouve tous les enregistrements de la table de gauche (employés) Et dans la table de droite (services), on ne trouve que ceux qui existent dans employés SELECT FROM employes RIGHT OUTER JOIN service ON ; On retrouve tous les enregistrements de la table de droite (services) Et dans la table de gauche (employes), on ne trouve que ceux qui existent dans employes 1.2.9 Auto-jointures : jointures dans une même table C est pour utiliser les relations d une table sur elle-même (cas des employés et de leurs chefs) D. Olivier http://www.entraide-info.fr 18

/* nom du chef direct */ SELECT e.nom AS 'Employé', c.nom AS 'Chef' FROM Employes e INNER JOIN Employes c ON e.codechef=c.codeemp ORDER BY c.nom,e.nom; Utilisation des auto-jointures Bouba n apparait pas dans le résultat car la valeur de codechef est NULL. Si on veut l afficher, 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 même ordre d idées, la requête suivante permet d afficher le nombre de subordonnés qu un chef a sous son commandement direct : /* Compter le nombre de subordonnés */ SELECT c.nom AS 'Nom du chef',count(e.codeemp) AS 'NbreSubordonnés' FROM Employes e RIGHT JOIN Employes c ON e.codechef=c.codeemp GROUP BY c.nom,c.codeemp ORDER BY NbreSubordonnés DESC; Pour s entrainer : TP 2 Partie IV Les requêtes complexes ( 30 minutes environ pour les deux premiers exercices) D. Olivier http://www.entraide-info.fr 19

1.3 Les vues Une vue est un filtre d affichage d un ou plusieurs tables selon les colonnes, selon les critères, selon les enregistrements. TblExempl Colonne1 Colonne2 Colonne3 Colonne4 Colonne5 Colonne6 Colonne7 Exemple ci-dessus : Albert Dupontel 12/4 zert 123 Az2 là Bernard ébianca 8/10 abcd 456 Ed4 ici Charles ingals 29/5 dfgh 789 Tf8 là Dominique Lodéon 10/7 efgh 963 Hj4 ici Evrard Vard 2/1 ijkl 258 Cx6 ici Florence Acre 4/8 mnop 147 Ki9 ici En vert : la partie de la table qu on intègre dans la vue «MaVue». create view MaVue as select colonne1, colonne2, colonne4, colonne5, colonne7 from TblExempl where colonne6='ici'; La vue est enregistrée définitivement dans la BD ; on y accès comme une table Si les données sont modifiées à partir des tables d origine, cela met à jour va vue (et réciproquement). CREATE VIEW nomvue AS SELECT nom_des_champs FROM table WHERE code_service= RESHU [WITH CHECK OPTION]; (CREATE VIEW est une commande du DML) WITCH CHECK OPTIONS empêche l ajout de données (avec INSERT INTO nomvue) qui sortent du cadre de la vue. Très 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 3 plus gros salaires. Les tables temporaires (dure le temps de la session) SELECT AVG(salaire) AS salaire moyen INTO #T1 FROM Employes; Les données de la table sont figées, c est l équivalent d une photo à un instant donné. Les tables instantanées (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; La table ChefCTE contient un instantané de la requête en parenthèse puis est supprimée dès son utilisation dans la requête suivante. D. Olivier http://www.entraide-info.fr 20

Les valeurs auto incrémentées CREATE TABLE Tests( numtest INT IDENTITY(100,2) CONSTRAINT pk_tests PRIMARY KEY, nomtest VARCHAR(10) ); Le type doit être INT, IDENTITY(100,2) indique (début à 100, augmente de 2 en 2) INSERT Tests VALUES('Polio'); Un nouvel enregistrement est créé puisqu on NE DOIT PAS entrer la valeur de IDENTITY (elle est générée toute seule). SELECT * FROM Tests ; numtest nomtest 100 Polio INSERT Tests VALUES('BCG'); SELECT * FROM Tests ; numtest nomtest 100 Polio 102 BCG TP Final récapitulatif : durée environ 3 heures. 2 Références des exercices Intitulé date dans 10 jours date dans 5 semaines Affichage des données d'une table Calculs Pour aller plus loin masse salariale par service utilisation des alias Jointure liste des personnes à qui il reste + de 10 jours de conges nom du chef direct nom du chef direct : affiche les «sans chef» Compter le nombre de subordonnés Page du document Page 13 Page 14 Page 17 D. Olivier http://www.entraide-info.fr 21