web-dev-qa-db-fra.com

Quelle norme de codage SQL suivez-vous?

Existe-t-il une norme de codage SQL largement utilisée? SQL est un peu différent du type de langage de programmation C/C++. Vraiment, je ne sais pas comment le mieux formater pour la lisibilité.

44
thebat

Je ne l'appellerais pas norme de codage - plutôt comme style de codage

SELECT
    T1.col1,
    T1.col2,
    T2.col3
FROM
    table1 T1
    INNER JOIN ON Table2 T2 ON T1.ID = T2.ID
WHERE
    T1.col1 = 'xxx'
    AND T2.Col3 = 'yyy'
  • capitaliser les mots réservés
  • mots-clés principaux sur la nouvelle ligne
  • ne peut pas s'habituer aux virgules avant les colonnes
  • toujours utiliser de courts alias de table significatifs
  • vues préfixées avec v
  • préfixe les procs stockés avec sp (cependant, n'utilisez pas "sp_" qui est réservé aux procs intégrés)
  • ne pas préfixer les tables
  • noms de table singulier
47
DJ.

J'aime la virgule précédente

SELECT
      column1
    , column2
    , column3
    , COALESCE(column4,'foo') column4
FROM
    tablename
WHERE
    column1 = 'bar'
ORDER BY 
      column1
    , column2

à mon avis, il est plus facile à lire et à déboguer.

12
Ryan Guill

Je sais que c'est long, mais supporte-moi, c'est important. Cette question a ouvert une boîte de conserve fraîche. Et si vous n'aimez pas les blocs de base de données, lisez la suite.

Et, avant que quiconque ne songe à rejeter ma réponse, s'il vous plaît voyez l'article suivant et les articles associés sur le verrouillage et recompilez; deux des ressources les plus dommageables sur une base de données SQL.

http://support.Microsoft.com/kb/263889

Je peux taper assez rapidement et je n'aime pas plus taper que la personne suivante. Mais je suis extrêmement attentif aux points ci-dessous, même si c’est plus typé. Tellement que j'ai construit mes propres SP applications pour le faire pour moi.

Les points que je soulève sont vraiment importants! Vous pourriez même vous dire: "Vous plaisantez, ce n'est pas un problème", eh bien, alors vous n'avez pas lu les articles ci-dessus. ET, il est totalement idiot que M $ mette ces points sous forme de NOTES. Ces questions pour moi devraient être audacieuses et SCREAMING.

Je fais aussi beaucoup de codage pour construire mes scripts de base en utilisant des applications C # pour accélérer le développement et ces pratiques sont très valables (10 ans) pour rendre la rédaction de scripts plus simple et plus rapide.

Il y a plus que cela, mais c'est ce que je fais pour les 60% de tout.


Les meilleures pratiques

  • Utilisez les crochets autour des objets pour que le moteur de requête connaisse explicitement un champ lorsqu'il le voit.
  • Utilisez THE SAME CASE comme noms d'objet de table et noms de champs
  • Lorsque vous appelez des SP depuis une application, utilisez le nom complet [dbo]. [Nomproc] avec le propriétaire ET la casse correct. Sans blague! Lisez les articles ci-dessus!
  • Référencez le propriétaire de l'objet pour que la sécurité soit explicitement connue et ne doive pas être déterminée
  • NE NOUS PAS "sp_" car cela fait référence aux procs stockés dans le système et aux frais généraux
  • Utilisez SET NOCOUNT ON et SET NOCOUNT OFF pour éliminer le temps système supplémentaire nécessaire au suivi du nombre d'enregistrements mis à jour dans la procédure stockée, à moins que vous n'en ayez besoin. Normalement, vous ne pouvez pas et vous pouvez obtenir une augmentation considérable des performances.

Préférences

  • Préfixe des procs stockés avec proc
  • Suffixez chaque proc stocké avec SEL, UPD, DEL, INS (ou SELECT, UPDATE, DELETE, INSERT)
  • Capitaliser les mots réservés
  • Mots-clés principaux sur la nouvelle ligne (script)
  • Utilisez des virgules avant les colonnes (script)
  • Préfixe les vues avec vw
  • Ne préfixez pas les tables
  • Noms de table singulier
  • Ajoutez un suffixe aux noms standard tels que "_ByPK", "_OrderByLastName" ou "_Top15Orders" pour les variantes du stock SP

Sélectionner

CREATE PROC [dbo].[procTable_SEL]
AS
SET NOCOUNT ON
SELECT
    [Column1] = T1.[col1]
  , [Column2] = T1.[col2]
  , [Column3] = T2.[col3]
FROM [dbo].[Table] T1    
INNER JOIN ON [dbo].[Table2] T2 ON T1.ID = T2.ID
WHERE
      T1.[col1] = 'xxx'
  AND T2.[Col3] = 'yyy'
SET NOCOUNT OFF
GO

Mettre à jour

CREATE PROC [dbo].[procTable_UPD]
AS
SET NOCOUNT ON
UPDATE t1 SET
    [Column1] = @Value1
  , [Column2] = @Value2
  , [Column3] = @Value3
FROM [dbo].[Table1] T1
INNER JOIN ON [dbo].[Table2] T2 ON T1.[ID] = T2.[ID]
WHERE
      T1.[col1] = 'xxx'
  AND T2.[Col3] = 'yyy'
SET NOCOUNT OFF
GO

Insérer

CREATE PROC [dbo].[procTable_INS]
AS
SET NOCOUNT ON
INSERT INTO [Table1] (
[Column1]
  , [Column2]
  , [Column3]
)
VALUES (
    @Value1
  , @Value2
  , @Value3
)
SET NOCOUNT OFF
GO

OR

CREATE PROC dbo.procTable_INS
AS
SET NOCOUNT ON
INSERT INTO [table1] (
    [Column1]
  , [Column2]
  , [Column3]
)
SELECT
    [Column1] = T1.col1
  , [Column2] = T1.col2
  , [Column3] = T2.col3
FROM dbo.Table1 T1    
INNER JOIN ON Table2 T2 ON T1.ID = T2.ID
WHERE
      T1.[col1] = 'xxx'
  AND T2.[Col3] = 'yyy'
SET NOCOUNT OFF
GO

Effacer

CREATE PROC dbo.procTable_DEL
AS
SET NOCOUNT ON
DELETE
FROM [dbo].[Table1] T1
INNER JOIN ON [dbo].[Table2] T2 ON T1.[ID] = T2.[ID]
WHERE
      T1.[col1] = 'xxx'
  AND T2.[Col3] = 'yyy'
SET NOCOUNT OFF
GO
11
SnapJag
7
Rob Prouse

D'un très très beau blog sur PostgreSQL, mais ce sujet est applicable en général:

Requêtes maintenables - mon point de vue (depesz.com)

... j'ai décidé que mes priorités pour l'écriture de requêtes maintenables:

  1. Évitez de taper inutile.

  2. Utilisez des alias pour les tables/vues . Toujours. Et les rendre sensibles alias.

  3. Indentez le code d'une certaine manière.

  4. Évitez les citations (oui, c'est pourquoi je Déteste Django)

  5. Utiliser la syntaxe de jointure

Je suis d'accord avec la capitalisation des mots réservés et tout autre identifiant, sauf le mien.

4
Alex. S.

Personnellement, je n'aime pas préfixer un nom de procédure stockée avec sp_ - il est redondant, IMO. Au lieu de cela, j'aime bien les préfixer avec un identifiant "unité de fonctionnalité". par exemple. J'appellerai les sprocs pour traiter les commandes order_Save, order_GetById, order_GetByCustomer, etc. Elles sont toutes logiquement regroupées dans le studio de gestion et il est plus difficile de choisir le mauvais. (GetOrderByProduct, GetCustomerById, etc ...)

Bien sûr, il s'agit d'une préférence personnelle, d'autres personnes peuvent préférer disposer de tous les fichiers Get Get ensemble, de tous les fichiers Save, etc.

Juste mon 2c.

4
ZombieSheep

Je suis surpris que le style de codage que j'ai utilisé pendant presque 20 ans ne figure pas sur cette liste:

  SELECT column1,
         column2,
         column3,
         COALESCE(column4, 'foo') AS column4
    FROM tablename
   WHERE column1 = 'bar'
ORDER BY column1,
         column2

Je trouve cela absolument lisible, mais j’admets que c’est fastidieux de taper. Si aligner correctement les mots-clés est trop, je choisirais de les aligner à gauche:

SELECT   column1,
         column2,
         column3,
         COALESCE(column4, 'foo') AS column4
FROM     tablename
WHERE    column1 = 'bar'
ORDER BY column1,
         column2
2
mzedeler

Je garde généralement très peu par ligne, à savoir:

select
    col1,
    col2,
    col3
from
    some_table tabl1
where
    col1 = 'some'
and 
(
    col2 = 'condition'
or  col2 = 'other'
)
2
Robin

Google pour jolie imprimante ou regarder ici . Je n'ai pas essayé moi-même, mais cela vous donne un bon départ. La plupart des outils commerciaux comme Toad ont une option de "formatage" qui aide également.

2
Thorsten

Jouez avec www.sqlinform.com - Je vous recommande d’utiliser la norme ANSI-92 , puis de jolies choses avec ce site.

2
Patrick Harrington
SELECT c.id
     , c.name
     , c.folder
     , cs.num_users active_members
     , cs.num_videos

  FROM campaign c
  JOIN campaign_stats cs
    ON cs.campaign_id = c.id
  JOIN (SELECT _c.id
             , _c.name

          FROM campaign _c
         WHERE _c.type = 9) t_c 
    ON t_c.id = c.id

 WHERE c.id IN (1,2,3)
   AND cs.num_videos > 10

Cela fonctionne très bien pour nous.

Cette requête n’a pas beaucoup de sens puisque j’ai essayé de la construire rapidement à titre d’exemple ...

  • t_c signifie "sous-requête de table de catégories" ou "catégorie temporaire".
  • _underscoring de choses à l'intérieur de sous-requêtes.
  • les noms de colonnes d'alias doivent avoir un sens dans le contexte de la requête. par exemple. "membres_actifs" 
  • mettre des virgules au début des nouvelles lignes facilite la construction de requêtes dynamiques: 

    $sql .= ", c.another_column"
    
  • tout le reste est simple.

1
adamJLev

Tout en bleu est en majuscule SELECT, DELETE, GO, etc. 

Les noms de table sont singuliers comme la table qui contient nos clients serait la table de client

Les tables de liaison sont tablename_to_tablename 

utiliser _ entre les travaux dans les noms de table et les paramètres 

exemple 

BEGIN
    SELECT
        Company.ID AS Company_ID,
        Company.Client_Name,
        Company.Website,
        Office.Office_Name
    FROM
        Company_Office WITH(NOLOCK)
        INNER JOIN Company WITH(NOLOCK) ON Company_Office.Company_ID = Company.ID
    WHERE
END
1
Bob The Janitor

Types de données à utiliser: Nous ne devrions utiliser que les types de données suivants:

  • INT 
  • BIGINT
  • INTEMPLE
  • VARCHAR
  • BIT
  • DATETIME

Donne la valeur par défaut pour le type de données BIT. Les noms de table et de colonne ne doivent jamais être en minuscule. Il devrait décrire son but. Évitez d’utiliser des formes abrégées . Lors de la création d’une table FK et PK pour être bien pensé et défini . Les noms de variables doivent commencer par une/deux lettre (s) en indiquant le type de données en minuscule. La variable INT doit commencer par i. Le nom doit être descriptif et les formes abrégées doivent être évitées. Chaque mot doit commencer par une lettre majuscule suivie de toutes les lettres minuscules.

Par exemple.

Manière correcte: - iTotalCount

Manière incorrecte: - xyz

Les colonnes de table utilisées avec la clause «WHERE» dans les procédures stockées doivent être indexées/indexées. Cela augmentera la vitesse de traitement des données . La commande des paramètres dans la clause WHERE doit être effectuée correctement. La clé primaire/index doit précéder les variables de bits . E.g.:- Un index est créé sur une combinaison de colonnes (REF_ID, T_TYPE_STR, CNUMBER, TLOG_ID)

- Manière correcte d’utiliser les clés indexées en séquence dans la clause ‘WHERE’

SELECT REF_ID,T_TYPE_STR,C_NUMBER,TLOG_ID

FROM T_T_DATA_tbl

WHERE REF_ID = 1

AND LOG_ID = ‘4042654’

AND T_TYPE_STR = ‘SA’

AND CNUMBER = ‘10702’

–Incorrect way

SELECT REF_ID, T_TYPE_STR, CNUMBER, LOG_ID

FROM T_T_DATA_tbl

WHERE LOG_ID = ‘4042654’

AND T_TYPE_STR = ‘SA’

Lors de l'écriture d'une procédure stockée, nous devrions avoir au début une section de description qui contiendraAuteur:

Date de création:

La description:

Si un sp est modifié, cette section doit être ajoutée avec

Modifié par:

Modifié le:

La description:

La colonne ROW_INSERTION_DATE_TIME ET ROW_UPDATION_DATE_TIME doit avoir les valeurs par défaut GETDATE ().

Plus à: http://www.writeulearn.com/sql-database-coding-standards/

0
bhupesh