19
13-02-07 1:12 PM Le SQL de A à Z - SGBD, SQL et types de données Page 1 of 19 http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2 Forums Tutoriels Magazine FAQs Blogs Projets Chat Newsletter Études Emploi Club Contacts SGBD 4D Access DB2 Firebird InterBase MySQL NoSQL Oracle PostgreSQL SQL-Server Sybase Forums SGBD FAQs SGBD Tutoriels SGBD SQL Outils SGBD Livres SGBD et SQL LE SQL de A à Z : 2eme partie - le simple (?) SELECT et les fonctions SQL Date de publication : 23/01/2003 Par SQLPro niveau : débutant Dans le précédent article nous avons vu l’historique de SQL et ses différentes composantes. Nous entrons maintenant dans le vif du sujet, en nous intéressant au simple S Simple ? Pas si sûr... Dans le dernier document normatif de l’ISO, la syntaxe de la commande SELECT, est décrite en plus de 300 pages… C’est pourquoi nous nous permettons de mettre en do simplicité de la commande SELECT ! Préambule 1. La commande SELECT 1.1. L'opérateur * (étoile) 1.2. L'opérateur DISTINCT (ou ALL) 1.3. L'opérateur AS 1.4. Opérateur de concaténation 1.5. Opérateurs mathématiques de base 1.6. Particularité du "FROM" 1.7. Utilisation du caractère double quote (guillemet) 2. La clause ORDER BY 3. La clause WHERE 3.1. Opérateurs de comparaison 3.2. Opérateur IN 3.3. Opérateur BETWEEN 3.4. Opérateur LIKE 3.5. Résumé des opérateurs pour les prédicats de la clause WHERE 4. Fonctions diverses 4.1. Trantypage à l'aide de la fonction CAST 4.2. Mise en majuscule / Minuscule 4.3. Supprimer les blancs (ou tout autre caractères) 4.4. Extraire une sous chaîne 4.5. Opérateur de traitement des dates 4.5.1. Extraire un paramètre temporel d'une date 4.5.2. Heure et date courante 4.6. Opérateurs statistiques 4.7. Autres fonctions normalisées 4.8. Autres opérateurs mathématiques (non normalisés) 4.9. Autres opérateurs de traitement des chaînes de caractères (non normalisés) 4.10. Autres opérateurs sur les valeurs temporelles (non normalisés) 4.11. Opérateurs d'ensemble (non normalisés) 5. Traitement des "valeurs" nulles 5.1. Le null n'est ni la chaîne vide, ni le zéro 5.2. Opérateurs de traitement des marqueurs NULL 6. Négation de valeurs 7. Les branchements dans le SQL 7.1. CASE sur expression 7.2. CASE généralisé 8. Le constructeur de lignes valuées (ROW VALUE CONSTRUCTOR) 9. Résumé 10. Conclusion Préambule NOTA : La structure de la base de données exemple, ainsi qu'une version des principales bases utilisées sont disponibles dans la page "La base de données exemple". 1. La commande SELECT Accueil ALM Java .NET Dév. Web EDI Langages SGBD Office Solutions d'entreprise Applications Mobiles Systèmes

Le SQL de a a z

Embed Size (px)

Citation preview

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 1 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    Forums Tutoriels Magazine FAQs Blogs Projets Chat Newsletter tudes Emploi Club Contacts

    SGBD 4D Access DB2 Firebird InterBase MySQL NoSQL Oracle PostgreSQL SQL-Server Sybase

    Forums SGBD FAQs SGBD Tutoriels SGBD SQL Outils SGBD Livres SGBD et SQL

    LE SQL de A Z : 2eme partie - le simple (?) SELECT et les fonctions SQLDate de publication : 23/01/2003

    Par SQLPro

    niveau : dbutant

    Dans le prcdent article nous avons vu lhistorique de SQL et ses diffrentes composantes. Nous entrons maintenant dans le vif du sujet, en nous intressant au simple SELECT.Simple ? Pas si sr...Dans le dernier document normatif de lISO, la syntaxe de la commande SELECT, est dcrite en plus de 300 pages Cest pourquoi nous nous permettons de mettre en doute lasimplicit de la commande SELECT !

    Prambule 1. La commande SELECT 1.1. L'oprateur * (toile) 1.2. L'oprateur DISTINCT (ou ALL) 1.3. L'oprateur AS 1.4. Oprateur de concatnation 1.5. Oprateurs mathmatiques de base 1.6. Particularit du "FROM" 1.7. Utilisation du caractre double quote (guillemet) 2. La clause ORDER BY 3. La clause WHERE 3.1. Oprateurs de comparaison 3.2. Oprateur IN 3.3. Oprateur BETWEEN 3.4. Oprateur LIKE 3.5. Rsum des oprateurs pour les prdicats de la clause WHERE 4. Fonctions diverses 4.1. Trantypage l'aide de la fonction CAST 4.2. Mise en majuscule / Minuscule 4.3. Supprimer les blancs (ou tout autre caractres)

    4.4. Extraire une sous chane 4.5. Oprateur de traitement des dates 4.5.1. Extraire un paramtre temporel d'une date 4.5.2. Heure et date courante 4.6. Oprateurs statistiques 4.7. Autres fonctions normalises 4.8. Autres oprateurs mathmatiques (non normaliss) 4.9. Autres oprateurs de traitement des chanes de caractres (non normaliss) 4.10. Autres oprateurs sur les valeurs temporelles (non normaliss) 4.11. Oprateurs d'ensemble (non normaliss) 5. Traitement des "valeurs" nulles 5.1. Le null n'est ni la chane vide, ni le zro 5.2. Oprateurs de traitement des marqueurs NULL 6. Ngation de valeurs 7. Les branchements dans le SQL 7.1. CASE sur expression 7.2. CASE gnralis 8. Le constructeur de lignes values (ROW VALUE CONSTRUCTOR) 9. Rsum 10. Conclusion

    PrambuleNOTA : La structure de la base de donnes exemple, ainsi qu'une version des principales bases utilises sont disponibles dans la page "La base de donnes exemple".

    1. La commande SELECT

    Accueil ALM Java .NET Dv. Web EDI Langages SGBD Office Solutions d'entreprise Applications Mobiles Systmes

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 2 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    1. La commande SELECT

    Vous trouverez des complments d'information sur le sujet aux pages 53 127 de l'ouvrage "SQL", collection "La Rfrence", Campus Press diteur.

    Le SELECT est la commande de base du SQL destine extraire des donnes dune base ou calculer de nouvelles donnes partir dexistantes...

    Voici la syntaxe gnrale d'une commande SELECT :

    SELECT [DISTINCT ou ALL] * ou liste de colonnesFROM nom de table ou de la vue[WHERE prdicats][GROUP BY ordre des groupes][HAVING condition][ORDER BY ] liste de colonnes

    NOTA : dans cette syntaxe, les mots clef du SQL sont en gras, les paramtres en minuscule et entre crochets on trouve les parties optionnelles

    En fait l'ordre SQL SELECT est compos de 6 clauses dont 4 sont optionnelles.Clauses de l'ordre SELECT :

    SELECT Spcification des colonnes du rsultat

    FROMSpcification des tables sur lesquelles porte l'ordre

    WHERE Filtre portant sur les donnes (conditions remplir pour que les lignessoient prsentes dans le rsultat)

    GROUP BYDfinition d'un groupe (sous ensemble)

    HAVINGFiltre portant sur les rsultats (conditions de regroupement des lignes)

    ORDER BYTri des donnes du rsultat

    NOTA : La plupart du temps, la difficult rside dans la comprhension de la diffrence entre le filtre WHERE et le filtre HAVING. Disons plus pragmatiquement que le filtre WHEREpermet de filtrer les donnes des tables tandis que le filtre HAVING permet de filtrer les donnes du rsultat...

    REMARQUE : pour spcifier une valeur littrale il faut l'entourer de guillemets simples.

    Un premier exemple basique :

    Exemple 1

    SELECT CLI_NOM, CLI_PRENOMFROM T_CLIENTWHERE TIT_CODE = 'M.'

    CLI_NOM CLI_PRENOM------- ----------DUPONT AlainMARTIN MarcBOUVIER AlainDUBOIS PaulDREYFUS JeanFAURE AlainPAUL MarcelDUVAL ArsnePHILIPPE AndrCHABAUD DanielBAILLY Jean-Franois...

    Permet de trouver les noms et prnoms des clients dont le titre est M. (monsieur).

    NOTA : comme tous les paramtres prendre sous forme de littraux doivent tre exprims entours d'apostrophes (simple ctes), il faut ddoubler un tel caractre s'il s'avre prsentdans la chane utilis.

    1.1. L'oprateur * (toile)

    Le caractre * (toile) rcupre toutes les colonnes de la table prcise dans la clause FROM de la requte.Juste aprs le mot clef SELECT, on prcise les colonnes de la table qui doivent tre prsentes dans la rponse.Lutilisation du caractre toile ramne toutes les colonnes de la table dans la rponse. Dans le cas contraire il faut expressment nommer chacune des colonnes et les sparer par desvirgules.

    Exemple 2

    SELECT *FROM T_CLIENTWHERE TIT_CODE = 'M.'

    CLI_ID TIT_CODE CLI_NOM CLI_PRENOM CLI_ENSEIGNE------- -------- -------- ---------- ------------ 1 M. DUPONT Alain NULL 2 M. MARTIN Marc Transports MARTIN & fils 3 M. BOUVIER Alain NULL 4 M. DUBOIS Paul NULL 5 M. DREYFUS Jean NULL 6 M. FAURE Alain Boulangerie du march 11 M. PAUL Marcel Cie Internationale des Mach... 12 M. DUVAL Arsne NULL 13 M. PHILIPPE Andr NULL

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 3 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    13 M. PHILIPPE Andr NULL 16 M. CHABAUD Daniel NULL...

    Notons tout de suite la prsence plusieurs reprises du mot clef "NULL" dans la cologne CLI_ENSEIGNE. Non il ne s'agit pas d'une enseigne particulire, mais simplement de l'absenced'information. Nous verrons que l'absence d'information, c'est le marquer "NULL" qui diffre de la chane de caractre vierge ("") ou encore du zro.

    1.2. L'oprateur DISTINCT (ou ALL)

    Lorsque le moteur construit la rponse, il rapatrie toutes les lignes correspondantes, gnralement dans lordre ou il les trouve, mme si ces dernires sont en double, c'est dire qu'ilrcupre toutes les lignes (ALL par dfaut). Cest pourquoi il est souvent ncessaire dutiliser le mot clef DISTINCT qui permet dliminer les doublons dans la rponse.

    Exemples 3 et 4

    SELECT CLI_PRENOMFROM T_CLIENTWHERE TIT_CODE = 'M.'

    CLI_PRENOM----------AlainMarcAlainPaulJeanAlainMarcelArsneAndrDaniel...

    SELECT distinct CLI_PRENOMFROM T_CLIENTWHERE TIT_CODE = 'M.'

    CLI_PRENOM----------AlainAlexandreAndrArnaudArsneBernardChristianChristopheDanielDenis

    ...

    1.3. L'oprateur AS

    Vous pouvez rajouter autant de colonnes que vous le dsirez en utilisant le mot clef AS.En principe loprateur AS sert donner un nom de nouvelles colonnes cres par la requte.

    Exemple 5

    SELECT CLI_NOM as NOM, 'homme' as SEXEFROM T_CLIENTWHERE TIT_CODE = 'M.'

    NOM SEXE------- -----DUPONT hommeMARTIN hommeBOUVIER hommeDUBOIS hommeDREYFUS hommeFAURE hommePAUL hommeDUVAL hommePHILIPPE hommeCHABAUD homme...

    1.4. Oprateur de concatnation

    L'oprateur || (double barre verticale) permet de concatner des champs de type caractres.

    Exemple 6

    SELECT TIT_CODE || ' ' || CLI_PRENOM || ' ' || CLI_NOM as NOMFROM T_CLIENT

    NOM-----------------------M. Alain DUPONTM. Marc MARTINM. Alain BOUVIERM. Paul DUBOISM. Jean DREYFUS

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 4 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    FROM T_CLIENT M. Jean DREYFUSM. Alain FAUREM. Paul LACOMBEMelle. Evelyne DUHAMELMme. Martine BOYERM. Martin MARTIN...

    Nanmoins on trouve dans certains SGBDR le + comme oprateur de concatnation, comme la fonction CONCAT.

    1.5. Oprateurs mathmatiques de base

    On, peut utiliser les oprateurs mathmatiques de base pour combiner diffrentes colonnes(,+,-, *, /,).

    Exemple 7

    SELECT CHB_ID, TRF_CHB_PRIX * 1.206 AS TARIF_TTCFROM TJ_TRF_CHBWHERE TRF_DATE_DEBUT = '2001-01-01'

    CHB_ID TARIF_TTC------ --------- 1 424,51 2 482,40 3 617,47 4 424,51 5 463,10 6 482,40 7 424,51 8 540,29 9 482,40 10 617,47...

    1.6. Particularit du "FROM"

    Il est possible de surnommer une table dans la clause FROM, dans ce cas, la syntaxe de la partie FROM de la commande SELECT est la suivante :

    FROM nom_de_table ou nom_de_la_vue surnom

    Nous verrons dans quel cas ce renom est ncessaire ou obligatoire.NOTA : certains auteurs prfrent utiliser le mot d'alias que nous rejetons car il indique souvent un autre concept, ou de synonyme, que nous acceptons de manire timore...

    1.7. Utilisation du caractre double quote (guillemet)

    Lorsquun nom dun lment dune base de donnes (table, colonne par exemple) est identique un mot clef du SQL, il convient de lentourer de guillemets (double quote). En principe,les mots rservs du SQL sont dconseills pour nommer des objets du modle physique de donnes...

    Imaginons une table de nom JOIN, compose des champs suivants :

    NOM SELECT DATE NOT------- ------ ------- ---DURAND Oui 1999-11-12 FDUVAL Non 1998-01-17 M

    Exemple 8 : nous dsirons slectionner les colonnes SELECT et DATE lorsque la colonne NOT vaut F...

    SELECT SELECT, DATEFROM JOINWHERE NOT = 'F'

    ERREUR !

    SELECT "SELECT", "DATE"FROM "JOIN"WHERE "NOT" = 'F'

    Correct : on entoure les mots clefs du SQL par des doubles ctes

    Cela est aussi ncessaire lorsque le nom (d'une colonne ou d'une table) est compos de caractres particuliers tels que les blancs ou autres, ce qui est viter.

    REMARQUE : les noms des identifiants d'objet de base de donnes doivent tre crit dans le jeux de caractres restreint suivant :[A..Z] + [a..z] + [0..9] + [ _ ].Ils ne doivent pas commencer par un chiffre et sont insensibles la casse (indiffrence entre majuscule et minuscule).

    2. La clause ORDER BY

    Vous trouverez des complments d'information sur le sujet aux pages 66 70 de l'ouvrage "SQL", collection "La Rfrence", Campus Press diteur.

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 5 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    ORDER BY colonne1 | 1 [ASC ou DESC ] [, colonne2 | 2 [ASC ou DESC ] ...

    Cette clause permet de dfinir le tri des colonnes de la rponse, soit en prcisant le nom littral de la colonne, soit en prcisant son n d'ordre dans l'numration qui suit le mot clefSELECT.ASC spcifie lordre ascendant et DESC lordre descendant du tri. ASC ou DESC peut tre omis, dans ce cas c'est l'ordre ascendant qui est utilis par dfaut.

    Bien que la clause ORDER BY ne soit pas ncessaire, il est souvent utile de trier la rponse en fonction des colonnes. En revanche le temps de rponse s'en ressent souvent.Pour spcifier l'ordre de tri, on doit placer les noms des colonnes spares par des virgules juste aprs le mot clef "ORDER BY", dans l'ordre voulu.. On peut aussi utiliser le rang dechaque colonne dans l'ordre spcifi dans la clause SELECT.

    Attention : le tri est un tri interne, il ne faut donc placer dans cette clause que les noms des colonnes prsentes dans la clause SELECT.

    Souvent, le fait de placer DISTINCT suffit, en gnral, tablir un tri puisque le moteur doit se livrer une comparaison des lignes mais ce mcanisme n'est pas garanti car ce triseffectue dans un ordre non contrlable qui peut varier dun serveur lautre.

    Exemple 9

    SELECT CLI_NOM, CLI_PRENOMFROM T_CLIENTORDER BY CLI_NOM, CLI_PRENOM

    ou

    SELECT CLI_NOM, CLI_PRENOMFROM T_CLIENTORDER BY 1, 2

    CLI_NOM CLI_PRENOM-------- ----------AIACH AlexandreALBERT ChristianAUZENAT MichelBACQUE MichelBAILLY Jean-FranoisBAVEREL FrdricBEAUNEE PierreBENATTAR BernardBENATTAR PierreBENZAQUI Jol...

    REMARQUE : les marqueurs NULL sont situs en premier dans l'ordre ainsi tabli.

    NOTA : Un problme, qui nest pas rsolu, est de pouvoir choisir lordre des colonnes de la rponse. Sur certains serveurs cela peut tre obtenu en plaant les noms des colonnes obtenir dans lordre o lon veut les voir apparatre dans la clause SELECT, mais cette possibilit n'est jamais garantie...

    ATTENTION : la clause ORDER BY est la dernire clause de tout ordre SQL et ne doit figurer qu'une seule fois dans le SELECT, mme s'i l existe des requtes imbriques ou un jeu derequtes ensemblistes.

    3. La clause WHERE

    Vous trouverez des complments d'information sur le sujet aux pages 62 165 de l'ouvrage "SQL", collection "La Rfrence", Campus Press diteur.

    WHERE prdicats

    Le prdicat doit contenir nimporte quelle expression logique renvoyant une valeur vrai.Ainsi, une requte aussi stupide que la suivante, est suppose fonctionner :

    Exemple 10

    SELECT CLI_NOMFROM T_CLIENTWHERE 1=1

    CLI_NOM------- DUPONTMARTINBOUVIERDUBOISDREYFUSFAURELACOMBEDUHAMELBOYERMARTIN...

    Attention : la plupart des SGBDR ne comportent pas de colonne de type boolen. Une requte comme la premire risque d'chouer.

    Exemple 11

    SELECT *FROM TJ_CHB_PLN_CLIWHERE CHB_PLN_CLI_OCCUPE

    ERREUR !bien que CHB_PLN_CLI_OCCUPE puisse tre du boolen, la plupart des compilateurs SQL n'accepte pas ce test direct.

    SELECT *FROM TJ_CHB_PLN_CLIWHERE CHB_PLN_CLI_OCCUPE = True

    CORRECT ...Mais sur certains compilateur SQL il faut faire : CHB_PLN_CLI_OCCUPE = 'True' (littral).Si le type boolen n'existe pas, alors il faut faire CHB_PLN_CLI_OCCUPE = 1 si l'on a choisi de dfinir les boolens comme INTEGER(1) avec 0 et 1

    Pour palier au manque de boolen, on utilise soit un littral (True/False, Vrai/Faux, Oui/Non), soit un numrique avec les valeurs 0 (Faux) et 1 (Vrai). L'avantage des valeurs

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 6 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    Pour palier au manque de boolen, on utilise soit un littral (True/False, Vrai/Faux, Oui/Non), soit un numrique avec les valeurs 0 (Faux) et 1 (Vrai). L'avantage des valeursnumriques est que le calcul logique est comparable aux divisions et additions...

    oprateur ETFAUX VRAI

    FAUX FAUX FAUX

    VRAI FAUX VRAIsimilitude entre le ET et la multiplication

    multiplication0 1

    0 0 0

    1 0 1, 0

    oprateur OUFAUX VRAI

    FAUX FAUX VRAI

    VRAI VRAI VRAIsimilitude entre le OU et l'addition

    addition0 1

    0 0 1, 0

    1 1, 0 2, 0

    3.1. Oprateurs de comparaison

    Dans la clause WHERE, vous disposez de diffrents oprateurs de comparaisons logiques :

    WHERE valeur1 [NOT et] = ou < ou ou >= ou valeur2 [OR ou AND ...]

    Exemple 12

    SELECT CLI_NOM, CLI_PRENOMFROM T_CLIENTWHERE CLI_NOM >= 'A' AND CLI_NOM = 'A') AND (CLI_NOM

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 7 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    3.3. Oprateur BETWEEN

    L'oprateur BETWEEN permet de rechercher si une valeur se trouve dans un intervalle donn, quel que soit le type des valeurs de rfrence spcifies (alpha, numrique, date...).

    Ainsi, la requte vue dans l'exemple 12 peut s'crire :

    Exemple 14

    SELECT CLI_NOM, CLI_PRENOMFROM T_CLIENTWHERE CLI_NOM BETWEEN 'A' AND 'E'

    CLI_NOM CLI_PRENOM------- ----------DUPONT AlainBOUVIER AlainDUBOIS PaulDREYFUS JeanDUHAMEL EvelyneBOYER MartineDUVAL ArsneDAUMIER AmlieCHABAUD DanielBAILLY Jean-Franois...

    NOTA : les oprateurs IN et BETWEEN sont trs pratiques dans le cas o lon dsire effectuer des requtes o lutilisateur peut saisir une liste de choix multiples (IN) ou une plage devaleur (BETWEEN).

    3.4. Oprateur LIKE

    L'oprateur LIKE permet deffectuer une comparaison partielle. Il est surtout employ avec les colonnes contenant des donnes de type alpha. Il utilise les jokers % et _ (pour cent etblanc soulign). Le joker % remplace n'importe quelle chane de caractres, y compris la chane vide. Le blanc soulign remplace un et un seul caractre.

    Exemple 15

    SELECT CLI_NOM, CLI_PRENOMFROM T_CLIENTWHERE CLI_NOM LIKE 'B%'

    CLI_NOM CLI_PRENOM------- ----------BOUVIER AlainBOYER MartineBAILLY Jean-FranoisBOUCHET MichelBEAUNEE PierreBERGER Jean-PierreBOURA AndrBENZAQUI JolBAVEREL FrdricBERTRAND Christophe...

    On recherche les clients dont le nom commence par B.

    Mais si vos donnes sont susceptibles de contenir un des deux caractres joker, alors il faut recourir une squence dchappement, laide du mot clef ESCAPE...

    Cherchons les clients dont l'enseigne contient au moins un caractre blanc soulign :

    Exemple 16

    SELECT *FROM T_CLIENTWHERE CLI_ENSEIGNE LIKE '%_%'

    CLI_ID TIT_CODE CLI_NOM CLI_PRENOM CLI_ENSEIGNE------ -------- ---------- ------------- ------------------------------ 2 M. MARTIN Marc Transports MARTIN & fils 6 M. FAURE Alain Boulangerie du march 10 M. MARTIN Martin HERMAREX IMPORT_EXPORT 11 M. PAUL Marcel Cie Internationale des Mach... 17 M. BAILLY Jean-Franois Entreprise DUPONT CHAUFFAGE 24 M. CHTCHEPINE Dominique HOTEL *** DE LA GARE 26 M. GARREAU Paul IBM Corp. 34 Mme. GALLACIER Nolle Transports GALLACIER 42 Mme. LETERRIER Monique SA AROMAX ENTREVONT 49 M. COULOMB Renaud Cabinet COULOMN et CALEMANT

    SELECT *FROM T_CLIENTWHERE CLI_ENSEIGNE LIKE '%#_%' ESCAPE '#'

    CLI_ID TIT_CODE CLI_NOM CLI_PRENOM CLI_ENSEIGNE------ -------- ---------- ------------- ------------------------------ 10 M. MARTIN Martin HERMAREX IMPORT_EXPORT

    Pour traiter ce cas, on dfini # comme caractre dchappement. Le caractre qui suit ce caractre dchappement est donc interprt comme un caractre et non comme un joker.

    NOTA : loprateur LIKE effectue une recherche en tenant compte de la diffrence entre lettres majuscules et minuscules. Si vous voulez effectuer une recherche en ne tenantaucunement compte de la diffrence entre majuscules et minuscules, il convient dutiliser les oprateurs LOWER et UPPER (voir ci dessous). Mais la plupart du temps, l'utilisation du likedans un SGBDR donn ignore la casse.

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 8 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    3.5. Rsum des oprateurs pour les prdicats de la clause WHERE

    Voici une tableau rsumant les principaux oprateurs utiliss pour la construction des prdicats :

    oprateurs de comparaisons = < >=

    connecteurs logiques {OR | AND}

    oprateur de ngation NOT

    parenthses ( ... )

    oprateurs mathmatiques + - * /

    comparaison logique IS [NOT] {TRUE | FALSE | UNKNOWN}

    comparaison avec valeur IS [NOT] NULL

    intervalle valeur BETWEEN borne_basse AND borne_haute

    comparaison partielle de chane de caractres valeur LIKE motif [ESCAPE echappement]

    comparaison une liste de valeur valeur [NOT] IN (liste)

    4. Fonctions diversesVous trouverez des complments d'information sur le sujet aux pages 71 107 de l'ouvrage "SQL", collection "La Rfrence", Campus Press diteur.

    4.1. Trantypage l'aide de la fonction CAST

    Il permet de changer le type de donnes d'une colonne afin deffectuer une comparaison de donnes de type htrogne par exemple entre un champ contenant des donnesnumriques et un champ contenant des donnes de type chane de caractres...Sa syntaxe est CAST(colonne AS nouveau type).

    Exemple 17

    SELECT CHB_ID, CHB_NUMERO, CHB_POSTE_TELFROM T_CHAMBREWHERE CAST(CHB_POSTE_TEL AS INTEGER) / 10 > CHB_NUMERO

    CHB_ID CHB_NUMERO CHB_POSTE_TEL------ ---------- -------------

    1 1 101 2 2 102 3 3 103 4 4 104 5 5 105 6 6 106 7 7 107 8 8 108 9 9 109 10 10 110

    Loprateur CAST permet de transtyper les valeurs contenues dans une colonne. Bien entendu il faut qu'un type de donne puisse tre converti dans un autre type (compatibilit de types) afin que la rponse ne soit pas entach d'erreurs ou d'omissions.

    Exemple 18

    SELECT ADR_VILLE, CAST(ADR_CP AS INTEGER) + 1FROM T_ADRESSE

    ADR_VILLE ADR_CP ADR_CP + 1------------ ------ ----------VERSAILLES 78000 78001MONTMAIZIN 11254 11255PARIS 75015 75016VERGNOLLES CEDEX 452 84524 84525MARSEILLE 13002 13003PARIS 75012 75013BONNEUIL CEDEX 94152 94153PARIS 75012 75013PARIS 75014 75015PARIS 75017 75018...

    4.2. Mise en majuscule / Minuscule

    Les oprateurs LOWER et UPPER permettent de mettre en majuscule ou en minuscule des chanes de caractres dans les requtes.

    Exemple 19

    CLI_NOM CLI_PRENOM------- ----------ALAIN dupontMARC martinALAIN bouvier

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 9 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    SELECT upper(CLI_PRENOM), lower(CLI_NOM)FROM T_CLIENT

    PAUL duboisJEAN dreyfusALAIN faurePAUL lacombeEVELYNE duhamelMARTINE boyerMARTIN martin...

    NOTA : pour effectuer une recherche en ne tenant aucunement compte de la diffrence entre majuscules et minuscules, il faut utiliser loprateur UPPER (ou lower mais attention latransformation des accents !) :

    Exemple 20

    SELECT *FROM T_CLIENTwhere upper(CLI_PRENOM) = upper(CLI_NOM)

    CLI_ID TIT_CODE CLI_NOM CLI_PRENOM CLI_ENSEIGNE------ -------- ------- ---------- ---------------------- 10 M. MARTIN Martin HERMAREX IMPORT_EXPORT

    NOTA : certains SGBDR permettent de paramtrer l'activation de la recherche systmatique des chanes de caractres sans tenir compte de la casse. Sur d'autres, le paramtragepermet de confondre les lettres accentues ou non...

    4.3. Supprimer les blancs (ou tout autre caractres)

    La fonction TRIM permet de supprimer en tte ou en queue (ou les deux) le blanc ou tout autre caractre spcifi.

    TRIM ([LEADING ou TRAILING ou BOTH] [caractre] FROM nom de colonne)

    LEADING : suppression en tteTRAILING : suppression en queueBOTH : suppression en tte et en queue

    Dans notre table tlphone, nous voulons supprimer le zro de tte des n afin de pouvoir les communiquer aux trangers qui nont pas besoin de composer ce chiffre (ils doiventsimplement composer le 00 33 suivi du numro 9 chiffres).

    Exemple 21

    SELECT TEL_NUMERO, '00~33 ' || TRIM(LEADING '0' FROM TEL_NUMERO) AS TEL_INTERNATIONAL FROM T_TELEPHONE

    TEL_NUMERO TEL_INTERNATIONAL-------------- -----------------01-45-42-56-63 00~33 1-45-42-56-6301-44-28-52-52 00~33 1-44-28-52-5201-44-28-52-50 00~33 1-44-28-52-5006-11-86-78-89 00~33 6-11-86-78-8902-41-58-89-52 00~33 2-41-58-89-5201-51-58-52-50 00~33 1-51-58-52-5001-54-11-43-21 00~33 1-54-11-43-2106-55-41-42-95 00~33 6-55-41-42-9501-48-98-92-21 00~33 1-48-98-92-2101-44-22-56-21 00~33 1-44-22-56-21...

    NOTA : certains serveurs SQL proposent diffrentes fonctions comme LTRIM et RTRIM pour une suppression des blancs en tte ou en queue.

    4.4. Extraire une sous chane

    La fonction SUBSTRING permet dextraire une sous chane dune chane de caractre. Elle a besoin de lordre du premier caractre et du nombre de caractres sur lequel elle doitoprer.

    SUBSTRING ( nom de colonne FROM n TO m)

    Extrait la sous chane de nom de colonne en commenant n sur m caractres.

    Exemple 22

    SELECT CLI_NOM, CLI_PRENOM, SUBSTRING(CLI_PRENOM FROM 1 FOR 1) || SUBSTRING(CLI_NOM FROM 1 FOR 1) AS INITIALESFROM T_CLIENT

    CLI_NOM CLI_PRENOM INITIALES------- ---------- ---------DUPONT Alain ADMARTIN Marc MMBOUVIER Alain ABDUBOIS Paul PDDREYFUS Jean JDFAURE Alain AFLACOMBE Paul PLDUHAMEL Evelyne EDBOYER Martine MBMARTIN Martin MM...

    Cet exemple construit les initiales des clients partir des colonnes CLI_NOM et CLI_PRENOM_CLI.

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 10 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    Attention, certains SGBDR utilisent la fonction SUBSTR.

    4.5. Oprateur de traitement des dates

    4.5.1. Extraire un paramtre temporel d'une date

    Loprateur EXTRACT permet dextraire depuis une date, le jour le mois ou lanne

    EXTRACT ( YEAR ou MONTH ou DAY FROM nom de colonne )

    Dans la table des rservation on recherche l'identifiant des chambres ayant t rserves au cours du mois de mai de n'importe quelle anne et pour 3 personnes.

    Exemple 23

    SELECT distinct CHB_IDFROM TJ_CHB_PLN_CLIWHERE EXTRACT(MONTH FROM PLN_JOUR) = 5 AND CHB_PLN_CLI_RESERVE = 1 AND CHB_PLN_CLI_NB_PERS = 3

    CHB_ID------ 1 5 6 8 11 12 16 17

    18 20

    NOTA : il est dommage de constater que la fonction EXTRACT du standard SQL, souvent fort utile, est rarement prsente dans les moteurs de bases de donnes. Ni Access, ni Oracle, niSybase, ni SQL Server en sont dots. Seul le middleware BDE de Borland Inprise Corel permet d'exploiter pleinement cette fonction avec les SGBDR Paradox, dBase, FoxPro, InterBase,MSSQL, Sybase, Informix, DB2, Oracle.Cependant il est courant de trouver des fonctions s'en approchant : Exemple DATEPART dans SQL Server.

    4.5.2. Heure et date courante

    Lheure courante, la date courante et le combin date/heure courant peuvent tre obtenu laide des fonctions CURRENT_DATE, CURRENT_TIME et CURRENT_TIMESTAMP.

    Exemple 24

    SELECT distinct CHB_IDFROM TJ_CHB_PLN_CLIWHERE (CHB_PLN_CLI_RESERVE = 1) AND PLN_JOUR BETWEEN CURRENT_DATE and CURRENT_DATE + 14 AND CHB_PLN_CLI_NB_PERS = 3

    attention, le rsultat de cette requte varie en fonction de la date laquelle vous l'excutez !

    CHB_ID------ 1 5 6 8 11 12 16 17 18 20

    Cette requte renvoie les chambres rserves pour 3 personnes entre la date du jour et pour les deux semaines venir.

    Attention : la plupart des SGBDR n'acceptent pas encore cette version normalise des fonctions de recherche de temps courant. Voici les fonctions spcifiques aux diffrents serveursSQL :

    Oracle SYSDATE()

    Sybase GETDATE()

    SQL Server GETDATE()

    Access NOW()

    MySQL NOW()

    Paradox (QBE) TODAY

    4.6. Oprateurs statistiques

    Il est possible de raliser des comptages statistiques sur les colonnes, l'aide des oprateurs AVG (moyenne), MAX (maximum), MIN (minimum), SUM (total), COUNTles appelent aussi fonctions d'aggrgations.

    Exemple 25

    SELECT AVG(TRF_CHB_PRIX) as MOYENNE, MAX(TRF_CHB_PRIX) as MAXI,

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 11 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    MAX(TRF_CHB_PRIX) as MAXI, MIN(TRF_CHB_PRIX) as MINI, SUM(TRF_CHB_PRIX) as TOTAL, COUNT(TRF_CHB_PRIX) as NOMBRE FROM TJ_TRF_CHB WHERE TRF_DATE_DEBUT = '2001-01-01'

    MOYENNE MAXI MINI TOTAL NOMBRE-------- -------- -------- ---------- ------406,74 F 512,00 F 352,00 F 7 728,00 F 19

    Cette requte calcule la moyenne, le montant maximum, minimum, la totalisation et le nombre des tarifs de chambre pour la date de debut du premier janvier 2001.

    On peut s'tonner que les oprateurs statistiques VARIANCE ou STDDEV (cart type) soient rarement prsents dans les SGBDR car il s'agit de fonctions statistiques qui possdent unegrande utilit. Mais la norme SQL 92 ne les a pas retenu. Cependant, ils existent notamment dans Oracle. Cela est d'autant plus tonnant que les techniques modernes duDataWareHouse et en particulier le DataMining, utilisent ces fonctions dans le cadres de calculs statistiques d'hypercubes (techniques OLAP et ROLAP).

    ATTENTION : nous verrons que l'utilisation des fonctions statistiques ncessite la plupart du temps la mise en place d'une clause de groupage, afin de dtermin quel est le sousensemble cible d'agrgation pour les calculs.

    4.7. Autres fonctions normalises

    BIT_LENGTHTaille d'une colonne de type BIT ou BIT VARYING(nombre de bits)

    CHAR_LENGTHTaille d'une colonne de type caractre (nombre decaractres)

    OCTET_LENGTHTaille d'une colonne de type caractre (nombred'octets)

    CURRENT_DATE Date en cours

    CURRENT_TIME Heure en cours

    CURRENT_TIMESTAMP Date et heure en cours

    CONVERT Conversion paramtre d'une chane de caractres

    POSITIONPosition d'une chane de caractres dans une souschane

    TRANSLATETraduction d'une chane de caractres dans unformat spcifi

    4.8. Autres oprateurs mathmatiques (non normaliss)

    Les oprateurs ci dessous peuvent tre implments dans diffrents moteurs.

    ABS valeur absolue

    MOD modulo

    SIGN signe

    SQRT racine carre

    CEIL plus petit entier

    FLOOR plus grand entier

    ROUND arrondi

    TRUNC tronqu

    EXP exponentielle

    LN logarithme nprien

    LOG logarithme dcimal

    POWER puissance

    COS cosinus

    COSHcosinushyperbolique

    SIN sinus

    SINH sinus hyperbolique

    TAN tangente

    TANHtangentehyperbolique

    PI constante PiCertains sont rarement implments du fait que les SGBDR sont axs sur linformatique de gestion, la collecte et le traitement dinformations et non le calcul mathmatique.

    Attention : le nom de certains de ces oprateurs peut diffrer dun SGBDR lautre.

    4.9. Autres oprateurs de traitement des chanes de caractres (non normaliss)

    CONCATconcatnation : quivalent du || - Nota : utiliser de prfrence || plus standard. Le +entre colonne alphanumrique peut aussi souvent tre utilis comme oprateur deconcatnation, prfrez de toutes faons ||

    INITCAP initiales en lettres capitales

    LPAD complment ou troncature n position gauche

    LTRIM / RTRIM suppression en tte/queue dune chane

    REPLACE remplacement

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 12 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    REPLACE remplacement

    RPAD complment ou troncature n position droite

    SOUNDEXcode de consonnance Attention : phontique souvent anglaise

    INSTR Position dune chane dans une sous chane

    LENGTH longueur de la chane

    TO_CHAR numrique sous forme littrale Attention : souvent en anglais

    ASCII code ASCII d'un caractre

    CHR caractre dont le code ASCII est donn

    REVERSE Inverse l'ordre des caractres d'une chine

    FLIPPivote les parties droite et gauche d'une chane par rapport au n du caractre servant depivot.

    Attention : le nom de certains de ces oprateurs peut diffrer dun SGBDR lautre.

    4.10. Autres oprateurs sur les valeurs temporelles (non normaliss)

    ADD_MONTH, ADD_DAY, ADD_YEAR ... ajoute des mois, des jours des annes une date

    LAST_DAY renvoie le n du dernier jour dun mois dune date

    MONTH_BETWEEN nombre de mois entre deux dates

    NEXT_DAY date du prochain jour dun nom donn

    TO_CHARdate sous forme littrale Attention : souvent enanglais

    DATE_DIFF diffrence entre deux dates

    4.11. Oprateurs d'ensemble (non normaliss)

    GREATESTla plus grande des valeurs dunensemble

    LEASTla plus petite des valeurs dunensemble

    DECODErenvoi la valeur situ en n-imeposition

    5. Traitement des "valeurs" nulles

    Vous trouverez des complments d'information sur le sujet aux pages 115 120 de l'ouvrage "SQL", collection "La Rfrence", Campus Press diteur.

    NOTA : le NULL n'est pas proprement parler une valeur, mais bien l'absence de valeur, c'est pourquoi nous parlerons de marqueur NULL et non de valeur NULL.Le marqueur NULL pose une quantit de problmes et nous allons dans ce paragraphe soulever un coin du voile, que nous traiterons un peu plus tard dans le cas gnral de larecherche des occurrences dinexistence.

    5.1. Le null n'est ni la chane vide, ni le zro

    NULL n'est pas une valeur. C'est un marqueur. Par consquent le marqueur NULL ne peut jamais tre compar a une valeur.

    Recherchons les clients qui n'ont pas d'enseigne.

    Exemple 26

    SELECT CLI_ID, CLI_NOMFROM T_CLIENTWHERE CLI_ENSEIGNE = ''

    CLI_ID CLI_NOM------- --------...

    La rponse doit produire une table vide !Pour controurner ce problme il faut :soit penser enregistrer une chane de caractre vide lors de l'insertion des donnes dans la tablesoit la clause WHERE avec un oprateur spcialis dans le traitement des valeurs nulles

    Le problme des null a t bien dcrit dans le livre de Joe Celko intitul SQL avanc publi par Thomson International Publishing. Joe Celko pose la question en ces termes :labsence dinformation est-elle due son ignorance ou son impertinence ? Pourquoi donc ne pas faire de diffrence entre la couleur du toit dune voiture qui nest pas connue, et lacouleur du toit dune moto qui nest pas applicable Certains logiciens de lalgbre relationnel sont mme alls plus loin en proposant diffrentes valeurs pour grer les diffrents cas, endistinguant des cas trs diffrents : le null , le inconnu et le inapplicable ...

    Il y a donc un vritable dilemme utiliser des requtes en se basant sur des critres dabsence de valeur et il faut toujours faire trs attention aux clauses qui utilisent des rfrencesaux valeurs nulles, suivant ce que lon veut obtenir. Dautant plus que les NULL se propagent dans les calculs.

    Voici un extrait de la table T_LIGNE_FACTURE

    LIF_ID FAC_ID LIF_QTE LIF_REMISE_POURCENT LIF_REMISE_MONTANT LIF_MONTANT LIF_TAUX_TVA

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 13 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    LIF_ID FAC_ID LIF_QTE LIF_REMISE_POURCENT LIF_REMISE_MONTANT LIF_MONTANT LIF_TAUX_TVA-------- -------- --------- ------------------- ------------------ ----------- ------------ 1 1 1,00 15,00 NULL 320,00 F 18,60 2 3 1,00 NULL 50,00 F 250,00 F 18,60 3 3 1,00 NULL 50,00 F 320,00 F 18,60 4 3 1,00 NULL 50,00 F 240,00 F 18,60 5 5 1,00 NULL NULL 320,00 F 18,60 6 5 1,00 NULL NULL 220,00 F 18,60 7 7 1,00 NULL NULL 220,00 F 18,60 8 7 1,00 NULL NULL 250,00 F 18,60 9 7 1,00 NULL NULL 320,00 F 18,60 10 7 1,00 NULL NULL 270,00 F 18,60...

    Nous voulons calculer le montant total de chacune des lignes de cette table, pour une facture donne.

    La requte pour FAC_ID = 3 est la suivante :

    Exemple 27

    SELECT FAC_ID, sum (LIF_QTE * (LIF_MONTANT - LIF_REMISE_MONTANT) * (1 - LIF_REMISE_POURCENT / 100)) AS TOTAL_FAC, sum((LIF_QTE * (LIF_MONTANT - LIF_REMISE_MONTANT) * (1 - LIF_REMISE_POURCENT / 100)) * (LIF_TAUX_TVA / (100 + LIF_TAUX_TVA))) AS TOTAL_TAXESFROM T_LIGNE_FACTUREWHERE FAC_ID = 3GROUP BY FAC_ID

    FAC_ID TOTAL_FAC TOTAL_TAXES------ --------- ----------- 3 NULL NULL

    On constate que pour les lignes qui n'ont pas de valeurs renseignes dans les colonnes LIF_REMISE_POURCENT, LIF_REMISE_MONTANT, le rsultat du calcul donne la valeur null qui se traduit l'affichage par... rien !

    NOTA : en gnral, pour se sortir de ce mauvais pas, on peut, lors de la cration de la base de donnes, obliger tous les champs de type numrique (rels ou entiers) a ne pas accepterla valeur nulle et prendre par dfaut la valeur zro...

    Attention : larithmtique des nuls est assez particulire... Souvenez vous toujours que les NULL se propagent. Cela est vrai pour les numriques, les dates mais aussi pour les chanesde caractres. Ainsi SQL opre une distinction entre une chane de caractre vide et un champ non renseign. Dans le cas de la concatnation dune colonne NULL et dune colonneproprement renseign, la valeur renvoye sera NULL !!!

    5.2. Oprateurs de traitement des marqueurs NULL

    La norme SQL 2 (1992) spcifie une comparaison et diffrents oprateurs sur les marqueurs NULL :IS NULL / IS NOT NULL : teste si la colonne est vide ou non vide.COALESCE() qui recherche la premire valeur non vide dans un ensembleNULLIF NULLifie une colonne en fonction d'une valeur donne

    COALESCE ( valeur1, valeur2 [, valeur3] ... )NULLIF ( nom_de_colonne, valeur)expression IS [NOT] NULL

    NOTA : ISNULL (en un seul mot) est une autre fonction de branchement que l'on rencontre parfois (renvoi une valeur si la valeur est nulle). Dans la mme veine, NVL ou des expressions quivalentes COALESCE que l'on rencontre sur certains SGBDR.

    La requte prcdente s'exprime, l'aide de l'oprateur ISNULL :

    Exemple 28

    SELECT FAC_ID, sum (LIF_QTE * (LIF_MONTANT - ISNULL(LIF_REMISE_MONTANT, 0)) * (1 - ISNULL(LIF_REMISE_POURCENT, 0) / 100)) AS TOTAL_FAC, sum((LIF_QTE * (LIF_MONTANT - ISNULL(LIF_REMISE_MONTANT, 0)) * (1 - ISNULL(LIF_REMISE_POURCENT, 0) / 100)) * (LIF_TAUX_TVA / (100 + LIF_TAUX_TVA))) AS TOTAL_TAXESFROM T_LIGNE_FACTUREWHERE FAC_ID = 3GROUP BY FAC_ID

    FAC_ID TOTAL_FAC TOTAL_TAXES------ --------- ----------- 3 810.0 127.03

    NOTA : En rgle gnrale, ds que l'on traite des colonnes contenant des valeurs montaires ou numriques, il est bon de faire en sorte que la colonne soit obligatoire et que par dfautelle soit renseigne zro.Sinon, il faudra faire un usage systmatique des fonctions NULLIF ou COALESCE dans tous les calculs et cela grvera les performances d'excution !

    6. Ngation de valeurs

    C'est l'oprateur NOT qui ralise la ngation de valeurs et inverse la valeur logique d'un prdicat.L'oprateur NOT peut tre combin avec la plupart des oprateurs de comparaison. Mais il devient trs intressant lorqu'il est combin aux oprateurs IN, BETWEEN, LIKE et NULL

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 14 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    Recherchons par exemple toutes les chambres permettant de recevoir au moins 3 personnes, ne comportant pas le chiffre 4 (chiffre de la mort au japon) ni les chambres portant les n7 et 13 pour un client particulirement superstitieux...

    Exemple 29

    SELECT CHB_ID, CHB_NUMERO, CHB_COUCHAGEFROM T_CHAMBREWHERE NOT (CAST(CHB_NUMERO AS VARCHAR(10)) LIKE '%4%') AND CHB_NUMERO NOT IN ('7', '13') AND CHB_COUCHAGE >= 3

    CHB_ID CHB_NUMERO CHB_COUCHAGE ----------- ---------- ------------ 1 1 35 5 3

    6 6 58 8 311 11 312 12 315 16 316 17 517 18 319 20 3

    Nous verrons que le NOT IN est particulirement prcieux dans les requtes imbriques, c'est dire les reques multitables.

    Nous voulons maintenant le nom des clients qui ne commence pas par 'DU' :

    Exemple 30

    SELECT CLI_NOM FROM T_CLIENTWHERE CLI_NOM NOT LIKE 'DU%'

    -------------------------------- MARTIN BOUVIER DREYFUS FAURE LACOMBE BOYER MARTIN PAUL PHILIPPE PIERRELAYE ...

    7. Les branchements dans le SQL

    Vous trouverez des complments d'information sur le sujet aux pages 120 123 de l'ouvrage "SQL", collection "La Rfrence", Campus Press diteur.

    SQL possde un branchement la manire des IF et autres structures de test des langages procduraux.Mais il convient de ne l'utiliser qu'a bon escient, c'est dire aussi peu souvent que possible, beaucoup de cas ouvant tre traits soit par le COALESCE soit par des requtes avec desoprations ensemblistes de type UNION. En effet les performances se dgradent trs vite lors de l'usage du CASE cause de l'impossibilit d'effcetuer des traitements par "paquets".

    La structure CASE du SQL comprend deux syntaxes diffrentes. Le CASE pour branchement sur les valeurs d'une expression et le CASE gnralis.

    7.1. CASE sur expression

    Dans ce cas, la syntaxe est la suivante :

    CASE expression WHEN valeur1 THEN expression1 [WHEN valeur2 THEN expression2] ... [ELSE expression_dfaut]ENDExemple 31

    SELECT CHB_NUMERO, CASE CHB_ETAGE WHEN 'RDC' THEN 0 WHEN '1er' THEN 1 WHEN '2e' THEN 2 END AS ETAGE, CHB_COUCHAGEFROM T_CHAMBREORDER BY ETAGE, CHB_COUCHAGE

    CHB_NUMERO ETAGE CHB_COUCHAGE ---------- ----------- ------------ 2 0 23 0 24 0 21 0 37 1 29 1 210 1 25 1 38 1 311 1 312 1 36 1 514 2 215 2 219 2 221 2 216 2 318 2 320 2 317 2 5

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 15 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    17 2 5

    7.2. CASE gnralis

    L'expression disparait au profit de diffrents prdicats.

    CASE WHEN condition1 THEN expression1 [WHEN condition2 THEN expression2] ... [ELSE expression_dfaut]END

    Exemple 32

    SELECT CHB_NUMERO, CASE WHEN CHB_ETAGE = 'RDC' THEN 0 WHEN CHB_ETAGE = '1er' THEN 1 WHEN CHB_ETAGE = '2e' THEN 2 END AS ETAGE, CHB_COUCHAGEFROM T_CHAMBREORDER BY ETAGE, CHB_COUCHAGE

    CHB_NUMERO ETAGE CHB_COUCHAGE ---------- ----------- ------------ 2 0 23 0 24 0 21 0 37 1 29 1 210 1 25 1 38 1 311 1 312 1 36 1 514 2 215 2 219 2 221 2 216 2 318 2 320 2 317 2 5

    Qui donne le mme rsultat !

    ATTENTION : tous les SGBDR ne supportent pas ces deux syntaxes.

    NOTA : dans les deux cas il est possible de remplacer le IF d'un langage procdural :

    CASE WHEN condition1 THEN expression1 [ELSE expression_dfaut]END

    CASE expression WHEN valeur1 THEN expression1 [ELSE expression_dfaut]END

    8. Le constructeur de lignes values (ROW VALUE CONSTRUCTOR)

    Nous voici devant un lment peu connu du SQL car rarement implant. Rendons hommage Oracle car il est l'un des rares SGBDR l'implmenter. Cette construction peut vous tirerd'embarras pour bien des cas en simplifiant drastiquement vos requtes.

    L'ide consiste dire que diffrentes colonnes devant correspondre diffrents critres compares l'aide d'un mme oprateur de comparaison peuvent tre valuessimultanment.

    Il est plus facile de comprendre ce concept l'aide d'un exemple.

    Un utilisateur cr une table T_EVENEMENT dans laquelle il a quatre colonnes indiquant l'heure, la minute, la seconde de survenance de l'vnement et la nature de l'vnement

    CREATE table T_EVENEMENT(EVT_HEURE int NOT NULL, EVT_MINUTE smallint NULL, EVT_SECONDE smallint NULL, EVT_EVENEMENT varchar(64) NOT NULL, CONSTRAINT CKC_EVT_HEURE CHECK (EVT_HEURE >= 0), CONSTRAINT CKC_EVT_MINUTE CHECK (EVT_MINUTE BETWEEN 0 AND 59), CONSTRAINT CKC_EVT_SECONDE CHECK (EVT_SECONDE BETWEEN 0 AND 59))

    INSERT INTO T_EVENEMENT VALUES (3, 12, 25, 'Surtension')INSERT INTO T_EVENEMENT VALUES (3, 2, 48, 'Surchauffe')INSERT INTO T_EVENEMENT VALUES (3, 15, 0, 'Arrt')INSERT INTO T_EVENEMENT VALUES (4, 0, 0, 'Incendie')INSERT INTO T_EVENEMENT VALUES (2, 58, 59, 'Dmarrage')INSERT INTO T_EVENEMENT VALUES (4, 22, 33, 'Explosion')

    EVT_HEURE EVT_MINUTE EVT_SECONDE EVT_EVENEMENT ----------- ---------- ----------- --------------2 58 59 Dmarrage3 2 48 Surchauffe3 12 25 Surtension

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 16 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    3 12 25 Surtension3 15 0 Arrt4 0 0 Incendie4 22 33 Explosion

    La question est : quel sont les vnements survenus aprs 3h 10 ?

    Exemple 33 : intuitivement, nous sommes amens crire la requte suivante :

    SELECT *FROM T_EVENEMENTWHERE EVT_HEURE >3 AND EVT_MINUTE >10

    EVT_HEURE EVT_MINUTE EVT_SECONDE EVT_EVENEMENT----------- ---------- ----------- --------------4 22 33 Explosion

    Mais elle oublie sciement trois vnements survenus avant 3h10 ! Comment est-ce possible ?

    En fait l'vnement qui s'est produit 4h 0 n'est pas pris en compte du fait de la premire ligne de la clause WHERE !EVT_HEURE > 3 AND EVT_MINUTE > 10tout simplement parce que 0 minute est bien infrieur 10 minutes ...Or 4h 0 est bien suprieur 3h 10... il faut donc supprimer la partie AND EVT_MINUTE > 10 de la clause WHERELa bonne construction est donc :

    Exemple 34

    SELECT *FROM T_EVENEMENTWHERE EVT_HEURE > 3 OR EVT_HEURE = 3 AND EVT_MINUTE > 10

    EVT_HEURE EVT_MINUTE EVT_SECONDE EVT_EVENEMENT----------- ---------- ----------- -------------3 12 25 Surtension3 15 0 Arrt4 0 0 Incendie4 22 33 Explosion

    D'o l'ide d'implmenter une construction capable d'valuer globalement une telle opration. Cette construction est le ROW VALUE CONSTRUCTOR que j'ai traduit parconstructeur de lignes values...

    Avec un tel outil, la requte prcdente s'exprime plus simplement :

    Exemple 35

    SELECT *FROM T_EVENEMENTWHERE (EVT_HEURE, EVT_MINUTE) > (3, 10)

    EVT_HEURE EVT_MINUTE EVT_SECONDE EVT_EVENEMENT----------- ---------- ----------- -------------3 12 25 Surtension3 15 0 Arrt4 0 0 Incendie4 22 33 Explosion

    La syntaxe d'une telle expression utilisant un ROW VALUE CONSTRUCTOR est :

    ( ) ( )

    Le constructeur de lignes values pouvant tre : une liste de colonnes, une liste de valeurs, une liste combinant colonnes et valeurs ou encore une sous requte :

    (colonne1, colonne2, colonne3)(colonne1, valeur1, valeur2, colonne2)(valeur1, valeur2)SELECT * FROM Matable condition de ne retourner qu'une seule ligne

    etc...

    L'quivalent entre cette construction et celle n'utilisant pas le ROW VALUE CONSTRUCTOR, peut tre dveloppe comme suit.Supposons que le premier constructeur de lignes values comporte des colonnes de tables de 1 n et que le second constructeur de ligne values comporte des valeurs de 1 n, c'est dire :

    (colonne1, colonne2, ... colonneN) (valeur1, valeur2, ... valeurN)

    alors cette comparaison est quivalente :

    colonne1 valeur1OR colonne1 = valeur1 AND colonne2 valeur2OR colonne1 = valeur1 AND colonne2 = valeur2 AND colonne3 valeur3...OR colonne1 = valeur1 AND colonne2 = valeur2 AND ... AND colonneN valeurN

    Toujours bas sur notre jeu d'essais, voici un exemple plus complet :: cherchons tous les vnements survenus aprs 3h12'30" :

    Exemple 36

    SELECT *FROM T_EVENEMENTWHERE (EVT_HEURE, EVT_MINUTE, EVT_SECONDE) > (3, 12, 30)

    EVT_HEURE EVT_MINUTE EVT_SECONDE EVT_EVENEMENT----------- ---------- ----------- -------------3 15 0 Arrt4 0 0 Incendie4 22 33 Explosion

    Exemple 37 : et sa construction logiquement quivalente :

    SELECT * EVT_HEURE EVT_MINUTE EVT_SECONDE EVT_EVENEMENT

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 17 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    SELECT *FROM T_EVENEMENTWHERE EVT_HEURE > 3 OR EVT_HEURE = 3 AND EVT_MINUTE > 12 OR EVT_HEURE = 3 AND EVT_MINUTE = 12 AND EVT_SECONDE > 30

    EVT_HEURE EVT_MINUTE EVT_SECONDE EVT_EVENEMENT----------- ---------- ----------- -------------3 15 0 Arrt4 0 0 Incendie4 22 33 Explosion

    En fait le ROW VALUE CONSTRUCTOR agit, dans les recherches, un peu comme si l'on visualisait les donnes de manire fractaleLe plus grossier est trait, puis on s'interrese quelques donnes plus fine une fois le grossier fix, et ainsi de suite en fonction du niveau fractal que l'on s'est fix.

    NOTA : l'utilisation du ROW VALUE CONSTRUCTOR avec un critre de comparaison d'galit donne parfois des rsultats surprenants, qui peuvent dfier la logique. Il faut se mfier d'unrecours systmatique une telle construction.

    Exemple 38 : quels sont les vnement survenus 3h 12 (en utilisant le ROW VALUE CONSTRUCTOR)

    SELECT *FROM T_EVENEMENTWHERE (EVT_HEURE, EVT_MINUTE, EVT_SECONDE) = (3, 12)

    EVT_HEURE EVT_MINUTE EVT_SECONDE EVT_EVENEMENT----------- ---------- ----------- ---------------3 12 25 Surtension3 2 48 Surchauffe3 15 0 Arrt

    Ce qui offre peut d'intrt il faut bien le dire !

    La construction logique quivalente tant :

    Exemple 39

    SELECT *FROM T_EVENEMENTWHERE EVT_HEURE = 3 OR EVT_HEURE = 3 AND EVT_MINUTE = 12

    EVT_HEURE EVT_MINUTE EVT_SECONDE EVT_EVENEMENT----------- ---------- ----------- ---------------3 12 25 Surtension3 2 48 Surchauffe3 15 0 Arrt

    ENFIN, notez que le ROW VALUE CONSTRUCTOR possde un intrt immense, celui de permettre l'insertion multiple (plusieurs lignes de donnes) au sein du mme ordre INSERT !

    Exemple 40 : insertion multiple avec le ROW VALUE CONSTRUCTOR

    INSERT INTO T_EVENEMENT (EVT_HEURE, EVT_MINUTE, EVT_SECONDE, EVT_EVENEMENTVALUES ((4, 37, 21, 'Catastrophe'), (4, 44, 18, 'Cataclisme') , (5, 21, 1, 'Destruction finale plante terre'))

    ATTENTION : seul ORACLE et quelques SGBDR plus exprimentaux que professionnels (OCELOT par exemple) utilisent une telle technique !

    9. RsumVoici les diffrences entre les moteurs des bases de donnes :

    Fonctions \ SGBDR Paradox 9 Access 2000 Sybase Adaptive SQL Server 7 Oracle 8

    || (concatnation)Oui Non (&) Non (+) Non (+) Oui

    CASTOui Non Non (CONVERT) Oui

    Non (TO_CHAR / TO_NUM /TO_DATE)

    LIKE / ESCAPE / % / _Oui/Oui/Oui/Oui Oui/Non/Non/Non [1] Oui/Oui/Oui/Oui Oui/Oui/Oui/Oui Oui/Oui/Oui/Oui

    TRIMOui Non (LTRIM, RTRIM) Non (LTRIM, RTRIM) Non (LTRIM, RTRIM) Non (LTRIM, RTRIM)

    SUBSTRINGOui Non (MID) Non (ODBC SUBSTRING) Non (ODBC SUBSTRING) Non (SUBSTR)

    LOWER / UPPEROui/Oui

    Non (UCASE) / Non(LCASE)

    Oui/Oui Oui/Oui Oui/Oui

    EXTRACTOui Non Non (DATEPART) Non (DATEPART) Non

    CURRENT_DATE /

    CURRENT_TIME /CURRENT_TIMESTAMP

    Non/Non/Non (TODAY, NOWen QBE) Non (NOW) Non (GETDATE)

    Non (GETDATE() /CURRENT_TIMESTAMP) Non (SYSDATE)

    AVG / MAX / MIN / SUM /COUNT

    Oui/Oui/Oui/Oui Oui/Oui/Oui/Oui Oui/Oui/Oui/Oui Oui/Oui/Oui/Oui Oui/Oui/Oui/Oui

    VARIANCE / STDEV Non/Non Non/Non Non/Non Non/Non Oui/Oui

    ABS / MOD / SIGN / SQRT / PI Non/Non/Non/Non/NonOui /Non/ Non (SGN) /

    Non (SQR) / NonOui/Non (%)/Oui/Oui/Oui Oui/Non (%)/Oui/Oui/Oui Oui/Oui/Oui/Oui/Non

    CEIL / FLOOR / ROUND /TRUNC

    Non/Non/Non/Non Non/Non (INT)/Non/Non Non/Oui/Oui/Non Non/Oui/Oui/Non Oui/Oui/Oui/Oui

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 18 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    EXP / LN / LOG / POWER Non/Non/Non/Non Oui/Non/Oui/Non Oui/Non/Oui/Oui Oui/Non/Oui/OuiOui/Oui/Non (LOG (M,

    n))/Oui

    COS / SIN / TAN Non/Non/Non Oui/Oui/Oui Oui/Oui/Oui Oui/Oui/Oui Oui/Oui/Oui

    COSH / SINH / TANH Non/Non/Non Non/Non/Non Non/Non/Non Non/Non/NonOui/Oui/Oui [2]

    INITCAP / LPAD / RPAD /REPLACE

    Non/Non/Non/Non Non/Non/Non/Non Non/Non/Non/Non Non/Non/Non/Oui Oui/Oui/Oui/Oui

    SOUNDEX / TRANSLATE /INSTR / LENGTH

    Non (COMME dans QBE) / Non/ Non / Non

    Non / Non / Non (LOCATE)/ Non

    Oui / Non (REPLACE) / Non(PATINDEX) / Non (LEN)

    Oui / Non (REPLACE) / Non(PATINDEX) / Non (LEN)

    Oui / Oui / Non (LOCATE) /Non

    TO_CHAR pour numrique /pour date

    Non/Non Non/NonNon (CONVERT) / Non

    (CONVERT)Non (CONVERT) / Non

    (CONVERT)Non (auto [3])/ Non

    ASCII / CHR Non/Non Non/Non Oui / Non (CHAR) Oui / Non (CHAR) Oui/Oui

    ADD_MONTH /MONTH_BETWEEN

    Non/NonNon (DATEADD) / Non

    (DATEDIFF)Non (DATEADD) / Non

    (DATEDIFF)Non (DATEADD) / Non

    (DATEDIFF)Oui/Oui

    LAST_DAY / NEXT_DAY Non/Non Non/Non Non/Non Non/Non Oui/Oui

    GREATEST / LEAST / DECODE Non/Non/Non Non/Non/Non Non/Non/Non Non/Non/Non Oui/Oui/Non

    IS NULL / COALESCE / NULLIFOui/Non/Non Oui / Non / Non (ISNULL) Oui / Non / Non (ISNULL) Oui/Oui/Oui Oui / Non / Non (NVL)

    ROW VALUE CONSTRUCTORNon Non Non Non Oui

    10. ConclusionCurieusement Paradox na pas implment les oprateurs de rcupration des valeurs temporelles courantes alors quils existent en QBE ! Il est facile de sen passer en passant la dateou lheure courante en paramtre de la requte, mais tout de mme...

    En ce qui concerne MS Access, on ne peut qutre frapp par le fait que la plupart des fonctions de base des requtes sont incompatible avec la norme. Par exemple le LIKE utilise desjokers diffrent : * remplace le % et ? remplace le _. Cela oblige utiliser une syntaxe propritaire qui rend la portabilit des requtes trs difficile dun SGBDR lautre. Mais neserait-ce pas l une tactique voulue ??? Autre inconvnient il ne sait pas traiter le NOT BETWEEN !!!

    Plus curieux la plupart des SGBDR n'accepte pas l'oprateur de concatnation ||!

    Dans Sybase comme SQL Server la fonction modulo s'exprime sous la forme d'un caractre '%' d'ou d'normes possibilit de confusions entre les caractres joker du like, comme lecalcul de pourcentage... A quand une release sur ce sujet ???

    Le SGBDR le plus proche de la norme est celui de Sybase, suivi de SQL Server. Le plus complet par son jeu de fonction est sans doute Oracle.

    Livres

    SQL - dveloppement

    SQL - le cours de rfrence sur le langage SQL

    Avant d'aborder le SQL

    Dfinitions

    SGBDR fichier ou client/serveur ?

    La base de donnes exemple (gestion d'un htel)

    Modlisation MERISE

    Mots rservs du SQL

    Le SQL de A Z

    Les fondements

    Le simple (?) SELECT

    Les jointures, ou comment interroger plusieurs tables

    Groupages, ensembles et sous-ensembles

    Les sous-requtes

    Insrer, modifier, supprimer

    Cration des bases

    Grer les privilges ("droits")

    Toutes les fonctions de SQL

    Les techniques des SGBDR

    Les erreur les plus frquentes en SQL

    Les petits papiers de SQLPro

    Confrence Borland 2003

    L'hritage des donnes

    Donnes et normes

    Modlisation par mta donnes

    Optimisez votre SGBDR et vos requtes SQL

    Le temps, sa mesure, ses calculs

    QBE, le langage de ZLOOF

    Des images dans ma base

    La jointure manquante

    Clefs auto incrmentes

  • 13-02-07 1:12 PMLe SQL de A Z - SGBD, SQL et types de donnes

    Page 19 of 19http://sqlpro.developpez.com/cours/sqlaz/select/#L4.2

    Developpez.comNous contacterParticipezInformations lgales

    ServicesForum SGBD & SQLBlogsHbergement

    PartenairesHbergement Web

    L'indexation textuelle

    L'art des "Soundex"

    Une seule colonne, plusieurs donnes

    La division relationnelle, mythe ou ralit ?

    Gestion d'arborescence en SQL

    L'avenir de SQL

    Mthodes et standards

    Les doublons

    SQL Server

    Eviter les curseurs

    Un aperu de TRANSACT SQL V 2000

    SQL Server 2000 et les collations

    Scurisation des accs aux bases de donnes SQL Server

    Des UDF pour SQL Server

    SQL Server et le fichier de log...

    Paradox

    De vieux articles publis entre 1995 et 1999 dans la dfunte revue Point DBF

    (1)

    Contrairement la norme, loprateur like dAccess comme celui de SQL Server, ne faitaucune diffrence entre les majuscules et les minuscules (sauf paramtrage spcifique duserveur). Quand loprateur escape il nest tout simplement pas implment dansAccess, mais il semble possible de le contourner en utilisant une syntaxe base de jokersspcifique Access. Les jokers dAccess ne sont pas standards : * remplace le % et ?remplace le _.

    (2)La tangente hyperbolique est bien implmente mais elle ne donne apparement pas lesbons rsultats... !

    (3) La conversion est automatique dans Oracle

    Copyright 2003 Frdric Brouard. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vousencourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 ! de dommages et intrts. Cette page est dpose.

    Responsable bnvole de la rubrique SGBD & SQL : le Rdacteur en Chef - Contacter par email

    Copyright 2000-2013 - www.developpez.com