===== SQL ===== Structured Query Language ==== Commandes SQL ==== Lancer en une seule commande la vérification de l’intégrité de l’ensemble des bases de données d’une instance SQL Server : EXEC sp_msforeachdb 'DBCC CHECKDB(''?'')' ==== Journaux de transactions ==== Comment diminuer la taille des fichiers de log SQL : Les journaux de transactions se stockent dans les fichiers de journalisation, communément appelés fichiers de LOG (extension ldf). Ces fichiers prennent parfois une taille démesurée liée à l’activité du serveur SQL. Nous allons voir comment diminuer la taille de ces fichiers. - Afficher les statistiques sur le taux d’utilisation de l’espace du journal des transactions pour toutes les bases de données :DBCC SQLPERF(LOGSPACE) - Afficher le nom logique du log de la base sur laquelle on pointe :\\ //(le nom logique est celui qui s’affiche dans la colonne “name” sans extension .ldf)//EXEC sp_helpfile - Effectue une sauvegarde du journal de la base vers laquelle on pointe :BACKUP LOG NOM_BASE TO DISK = ’D :\DOSSIER\DE\BACKUP\NOM_BASE.trn’ - Réduit la taille du fichier journal de la base sur laquelle on pointe (ici 10Mo au mieux) :DBCC SHRINKFILE(NOM_LOGIQUE_LOG, 10) ==== Commit ou rollback ? ==== ''rollback'' transaction : exécute un script qui commence par "begin transaction" mais ne l’applique pas. ''commit'' transaction : exécute et applique un script qui commence par "begin transaction" (modification en base). ==== WHERE ou HAVING ? ==== Différence entre les clauses WHERE et HAVING Ce sont 2 clauses de filtrage : WHERE => filtre sur les données des tables HAVING => filtre sur les résultats des calculs de la requête. * WHERE est une clause de restriction qui s’applique sur tous type de commande SELECT, UPDATE... :/* Liste des personnes de prénom "Pierre" dans ma table */ SELECT NOM, PRENOM FROM PERSONNE WHERE PRENOM = "Pierre" * HAVING est plutôt utilisé lorsque l’on a une clause GROUP BY sur des fonctions d’aggrégation (MAX, SUM, ...) :/* Liste des prénoms dont le nombre d’occurrences dans ma table > 10 */ SELECT PRENOM, COUNT(*) AS NOMBRE FROM PERSONNE GROUP BY PRENOM HAVING COUNT(*) > 10 * Combiner les 2 clauses permet de donner une restriction sur le SELECT suivi d’une autre restriction sur le regroupement :/* Liste des prénoms dont le nombre d’occurrences dans ma table > 3 */ /* pour les personnes dont le nom commence par A */ SELECT PRENOM, COUNT(*) AS NOMBRE FROM PERSONNE WHERE NOM LIKE ’A%’ --Restriction sur le SELECT GROUP BY PRENOM HAVING COUNT(*) > 3 --Restriction sur le regroupement * Si l’on a pas de clause GROUP BY, WHERE et HAVING ont le même comportement, donc dans ces conditions, préférer la clause WHERE plus généralement utilisée. * Pour bien comprendre :\\ http://sqlpro.developpez.com/cours/sqlaz/ensembles/#L2 ==== Format de date SQL ==== TO_DATE('2016/02/12 00:00:00', 'yyyy/mm/dd hh24:mi:ss') TO_DATE('01/01/2017', 'dd/mm/yyyy') ==== Exemples de requêtes SQL ==== === Mettre à jour un champ avec la valeur NULL === update table set champ = NULL === Mettre à jour un champ DATE à la date du jour === UPDATE SET = TO_DATE(sysdate) ou UPDATE
SET = TO_DATE(current_date) === Trier une liste de nombres de type VARCHAR === //(testé sur SQL server)// SELECT liste_nombre FROM table ORDER BY liste_nombre + 0 **NOT IN** permet à la requête suivante de retourner tous les enregistrements de la //table1// pour lesquels la valeur de //champ1// n’apparait nul part dans le //champ1// de la //table 2//. En supprimant le **NOT**, on obtient l’inverse, c’est à dire l’intersection des deux tables. SELECT table1.champ1, table1.champ2 (, .....) FROM table1 WHERE table1.champ1 NOT IN (SELECT table2.champ1 FROM table2) **Exemple de requêtes SQL à partir du modèle relationnel ci-dessous :** {{ :tic:modelerelationnel.gif?nolink&650 |Modèle relationnel}} Extraire le catalogue des oeuvres par auteur et le nombre d’exemplaires achetés pour chaque oeuvre : SELECT "Livre"."ISBN", COUNT("Livre"."ISBN") AS NB_LIVRES, "Oeuvre"."Auteur", "Oeuvre"."Titre" FROM "Livre" AS "Livre", "Oeuvre" AS "Oeuvre" WHERE "Livre"."ISBN" = "Oeuvre"."IDISBN" GROUP BY "Livre"."ISBN", "Oeuvre"."Auteur", "Oeuvre"."Titre" ORDER BY "Oeuvre"."Auteur" Extraire le décompte, par oeuvre, des prêts et la date du dernier prêt. Pour chaque œuvre, nous voulons le total des emprunts et la date du dernier emprunt (quelque soit le livre de cette œuvre) : SELECT "Titre", COUNT(*)AS "Nb prêts", MAX( "DateSortie" ) AS "Date" FROM "Oeuvre" INNER JOIN "Livre" ON "Livre"."ISBN" = "Oeuvre"."IDISBN" INNER JOIN "Emprunt" ON "Livre"."IDNumeroOrdre" = "Emprunt"."NumeroOrdre" GROUP BY "Titre" ORDER BY "Titre" //PS : ces requêtes ont été "syntaxées" pour le SGBD Open Office/Libre Office//