Outils pour utilisateurs

Outils du site


tic:sql

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.

  1. 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)
  2. 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
  3. 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’
  1. 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.

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 <table> SET <champ> = TO_DATE(sysdate)

ou

UPDATE <table> SET <champ> = 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 : 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

tic/sql.txt · Dernière modification : 2023/03/29 09:43 de bloop