10
votes

Comment vous assurer que mon code SQL n'est pas un gâchis effrayant

SQL semble être la langue la plus négligée lorsqu'il s'agit de formater de manière jolie et de manière lagieusement ... et comme des déclarations SQL peuvent être incroyablement détaillées et complexes, il est extrêmement difficile de travailler avec. Mais je trouve que lorsque j'essaie de formater mon code SQL de la meilleure façon possible, je suis parfois incertain de la façon de le faire. Je connais les normes pour Java, C #, Python, etc. Mais quand il s'agit de SQL, je n'ai pas vu trop de directives ni de pratiques acceptées. Quels sont les conseils / règles de formatage SQL afin qu'il soit clair, lisible et logique? Pouvez-vous donner l'exemple de code pour illustrer? Qu'avez-vous trouvé comme la méthode la plus standard et acceptée de formater SQL?


3 commentaires

Pas un nouveau sujet. Découvrez Stackoverflow.com/questions/118288/SQL-CODING-STYLE-Guide , et autres avec les balises de style de codage et de SQL.


Il existe des normes pour Java et C # Formatage? Passez le mot, cela pourrait enfin arrêter les guerres saintes sans fin sur le style de la corset et l'indençant de l'espace TAB-VS.


@Stephen P - True, mais au moins, il y a des styles connus. J'ai lu un chapitre dans Code complète récemment et il y a des controverses, mais il définit essentiellement tous les styles couramment utilisés, puis à vous de choisir. Votre lieu de travail choisit. Mais je n'ai même pas vu de discussion sur SQL, tout le monde semble juste suivre ses propres sentiments intestinaux


4 Réponses :


2
votes

Je suivez généralement ce type de syntaxe pour MSSQL Server

Sélectionnez STÉTemenets strong> P>

CREATE PROCEDURE Foo (
  Bar INT,
  Foo VARCHAR(20)
) AS
BEGIN
  //Your Code Here
END


5 commentaires

Je trouve que pour être incroyablement verbeux. La plupart des bases de données n'ont pas besoin de "intérieure" ou "extérieure" dans la syntaxe de jointure et une déclaration de ligne pour chaque critère de jointure est un gaspillage d'espace lorsqu'il y a ~ 80 caractères sur l'écran. L'utilisation de ce format est risquée pour SQL dynamique, sauf si vous concatéez chaque ligne avec des clauses d'ouverture et de terminaison - sur Oracle au moins - car l'espace peut être interprété comme des caractères intitifs.


Je suis heureux que vous ayez mentionné d'abord référencer le nom de champ de la table jointe. Sans parenthèses cependant, votre et / ou la logique est un peu ambigu.


@OMG Ponies. Oui, je sais que vous n'avez pas besoin de l'intérieur et de l'extérieur, vous pouvez simplement dire que vous pouvez rejoindre au lieu d'une jointure intérieure et de rejoindre la jointure à gauche. C'est juste un habit que j'ai formé.


@Tom H. Les Sans parenthèses est une faute de frappe. Je voulais ajouter des parenthèses. Merci d'avoir attrapé ça


J'aime beaucoup ce style. Bien qu'il gaspille de l'espace sur des lignes communes, il garantit que la structure est presque toujours cohérente même lorsque vous devez faire face à de longues clauses. Cela ne me dérange pas que le défilement vertical et la consistance facilite la lecture.



11
votes

Vous pouvez essayer de vérifier le livre de Joe Celko Style de programmation SQL . Je suis sûr qu'il y a beaucoup de gens qui sont en désaccord avec son style, mais c'est un bon départ.

Certaines de mes propres "règles" p>

  • Les mots-clés SQL sont toujours tous majuscules li>
  • Les noms de table sont des cas "appropriés", tandis que les colonnes et les variables sont toutes minuscules li>
  • Chaque clause "majeure" dans une déclaration est au début d'une ligne li>
  • Inscrit et où les critères apparaissent sous et sont en retrait et alignés li>
  • Les articles imbriqués sont indentés plus loin li>
  • J'utilise des alias pour toutes les tables et vues li> ul>

    Par exemple: P>

    SELECT
        column_1,
        column_2,
        CASE
            WHEN column_5 = 'Blah' THEN 1
            WHEN column_6 = 'Blah' THEN 2
            ELSE 3
        END AS column_alias
    FROM
        My_Table MT
    INNER JOIN My_Other_Table MOT ON
        MOT.column_1 = MT.column_1
    WHERE
        MT.column_2 = 'Some Value' AND
        (
            MT.column_3 = 'Some other value' OR
            MT.column_4 = 'Some other value'
        )
    


3 commentaires

Similaire à moi, mais j'aurais la jointure intérieure (sans intérieur!) Alignée sur des tables (ce n'est pas une clause majeure) et la condition en ligne. Quoi qu'il en soit, cette mise en page générale est l'un des plus propres que j'ai vus.


Vrai ... Peut-être que je vais essayer d'indenter les jointures et de voir comment j'aime ça. Je n'aime pas simplement inclure les critères sur la même ligne, car cela peut souvent être assez long - et je déteste le défilement gauche / droite. Je préfère un critère sur chaque ligne.


Je commencerais à indenter les critères si c'était long, mais gardez-le sur une ligne si c'est abrégé: en particulier, "Join Table1 sur table1.table1_id = Table2.table1_id" est le cas le plus courant de loin. Certains biais PostgreSQL ici depuis que cela peut être écrit "Rejoindre Table1 en utilisant (Table1_ID)" qui serait stupide à scinder.



1
votes

J'utilise les règles suivantes:

  • Toujours des mots SQL majuscules (SELECT, de, où, ayant, et, ou, distincts, etc.) li> ul>

    p>

      moche:
      Sélectionner la hauteur, la largeur, l'âge de la personne où la largeur = 20 code>
      Tandy:
      Sélectionnez Hauteur, largeur, âge de la personne où (largeur = 20) code>
      ul>
      • minuscule tous les noms de table. N'utilisez jamais Camelcase (Donkeywrench) dans les noms de table (vous vous tirez sur la tête si vous créez les requêtes à la main). P> LI>

      • Utilisez toujours des parenthèses à l'endroit où et ayant des clauses. Utilisez l'espace entre les opérateurs. P> LI> ul>

        p>

          moche:
          ... Où la largeur = 20 et hauteur> 20 code>
          Tandy:
          où (largeur = 20) et (hauteur> 20) code>
          ul>
          • Utilisez des alias pour tableaux. LI> ul>
              `Sélectionnez * de Donkeywrench Dw ...` ul>
              • Utilisez des champs de clé primaire lisibles et des noms de table. Je démarre toujours les clés et les clés primaires avec 'id _'. Li> ul>
                  Nom: Donkeywrench, clé primaire: id_donkeywench ul>
                  • marque où la requête est originaire de. Tout en lisant des journaux, vous pouvez facilement suivre où le problème est survenu. LI> ul>
                      / * Appelé de donkeykong.php, ligne 22 * ​​/ Select * de Donkeywrench Dw ... ul>
                      • Si la requête est loooong li> ul>
                          - quittez toujours l'opérateur (et, ou ou) à la fin de la ligne
                          - Utilisez des parenthèses!
                          ul>

                          Exemple: P>

                        /*Executed from xyz.php*/
                        SELECT 
                        p.height, p.width, p.age,
                        pd.hastel, pd.hasmobile
                        
                        FROM 
                        person p
                        LEFT JOIN personaldata pd ON p.id_person = pd.id_person
                        LEFT JOIN relatives r ON pd.id_person = r.id_person
                        
                        WHERE 
                        ( p.width = 20 ) AND 
                        ( (p.height > 20) AND (p.height < 15) ) AND
                        ( pd.hastel)
                        
                        ORDER BY 
                        p.age, p.height
                        


1 commentaires

Je ne suis pas d'accord avec les parenthèses autour de l'endroit où les conditions. Lorsque la priorité de l'opérateur est claire, je le trouve distrayant. C'est comme écrire l'expression ((x * y) + (s * t)) / z au lieu de (x * y + s * t) / z. Quand il y a moins de parenthèses, il est plus facile de voir comment ils correspondent. Bien sûr, c'est une question de préférence.



4
votes

Peut-être que c'est "tricherie"; mais je viens de trouver un site incroyable qui fait cela pour vous!

http://porsql.com

et les options sont entièrement personnalisables


1 commentaires

Outil génial, et libre de démarrer!