Quelle norme de codage SQL suivez-vous? [fermé]

y a-t-il une norme de codage SQL largement utilisée? SQL est un peu différent des langages de programmation de type C/C++. Vraiment Je ne sais pas comment le formater au mieux pour la lisibilité.

42
demandé sur Bob The Janitor 2009-02-07 00:56:51

14 réponses

ne l'appellerait pas la norme de codage - plus comme le 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'
  • majuscule mots réservés
  • mots clés principaux sur la nouvelle ligne
  • ne peut pas obtenir utilisé à des virgules avant de colonnes
  • toujours utiliser de courts alias de table significatifs
  • vues préfixées avec v
  • préfixe procs stocké avec sp (cependant n'utilisez pas " sp_ " qui est réservé pour intégré procs)
  • n'a pas de préfixe des tables
  • noms de table singulier
45
répondu DJ. 2009-02-06 22:52:29

j'aime la virgule qui précède:

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

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

12
répondu Ryan Guill 2009-02-06 22:01:34

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

Et, avant que quelqu'un pense à faire tomber ma réponse, s'il vous plaît voir l'article suivant et connecté articles sur le verrouillage, et recompile; deux des plus dommageables ressources frappe sur une base de données SQL.

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

je peux taper assez rapidement, et je n'aime pas taper, pas plus que la prochaine personne. Mais les points ci-dessous que je suis de très près, même s'il est plus dactylographié. Tellement que j'ai créé mes propres applications SP 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", alors vous n'avez pas lu les articles ci-dessus. et , c'est totalement débile que m$ mette ces points en NOTEs. Pour moi, ces questions devraient être audacieuses et hurlantes.

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 bonnes (10 ans de valeur) pour rendre le script SPs plus facile et surtout plus rapide.

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


meilleures pratiques

  • utilisez les crochets autour des objets, de sorte que le moteur de requête connaît un champ quand il le voit
  • utilisez le même cas que les noms d'objet de table et les noms de champ
  • lorsque vous appelez SPs à partir de l'application, utilisez le [dbo] entièrement qualifié.[procName] avec le propriétaire correct et case. Pas De Blague! Lisez les articles ci-dessus!
  • référence au propriétaire de l'objet de sorte que la sécurité est explicitement connue et n'a pas à être compris
  • NE PAS nous sp_ "ce qui" fait référence à stockée système procs, et les frais généraux de l'1519350920"
  • utilisez SET NOCOUNT ON et SET NOCOUNT OFF pour éliminer les frais généraux supplémentaires pour garder une trace du nombre de dossiers mis à jour dans le proc stocké à moins que vous ayez besoin d'eux. Normalement, vous n'avez pas et vous pouvez gagner une énorme augmentation de la performance.

Préférences

  • Préfixe stockées procs avec proc
  • suffixe chaque proc stocké avec SEL, UPD, DEL, INS (ou SELECT, UPDATE, DELETE, INSERT)
  • majuscules mots réservés
  • mots-clés Principaux sur une nouvelle ligne (script)
  • utiliser les virgules avant les colonnes (scripting)
  • Préfixe de vues avec vw
  • N'a pas de préfixe des tables
  • noms de Table singulier
  • ajouter un suffixe aux noms standards comme "_ByPK", "_OrderByLastName", ou "_Top15Orders" pour les variations sur le 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

mise à 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

ou

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

Supprimer

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
12
répondu SnapJag 2009-02-06 23:08:54

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

demandes maintenables - mon point de vue (depesz.com)

...J'ai décidé que mes priorités pour écrire des requêtes maintenables:

  1. éviter les fautes de frappe inutiles.

  2. utiliser des alias pour les tables/vues. Toujours. Et de faire eux sensible alias.

  3. Indenter le code, d'une certaine façon.

  4. Éviter les citations (oui, c'est pourquoi je la haine de Django)

  5. utiliser la syntaxe de jointure

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

4
répondu Alex. S. 2009-02-06 22:13:01

personnellement, je n'aime pas préfixer un nom de procédure stocké avec sp_ - il est redondant, IMO. Au lieu de cela, j'aime les préfixer avec un identifiant "Unité de fonctionnalité". par exemple, je vais appeler les sproc pour traiter avec orders order_Save, order_GetById, order_GetByCustomer, etc. Il les maintient tous logiquement groupés dans le studio de gestion et rend plus difficile de choisir le mauvais. (GetOrderByProduct, GetCustomerById, etc...)

bien sûr, c'est la préférence personnelle, autre les gens préfèrent avoir tous les Obtenir sprocs ensemble, tous les Sauver, etc.

juste mon 2c.

4
répondu ZombieSheep 2009-02-06 22:19:08

je garde généralement très peu par ligne, c'est-à-dire:

select
    col1,
    col2,
    col3
from
    some_table tabl1
where
    col1 = 'some'
and 
(
    col2 = 'condition'
or  col2 = 'other'
)
2
répondu Robin 2009-02-06 22:01:10

utilisez Google pour sql pretty printer ou look ici . Je ne l'ai pas essayé moi-même, mais ça te donne un bon départ. La plupart des outils commerciaux comme Toad ont une option "Formatage" qui aide, aussi.

2
répondu Thorsten 2009-02-06 22:01:59

je suis surpris que le style de codage que j'ai utilisé pendant presque 20 ans n'est 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 le plus lisible, mais j'admets qu'il est fastidieux de taper. Si aligner à droite les mots-clés est trop, j'opterais pour l'alignement à gauche:

SELECT   column1,
         column2,
         column3,
         COALESCE(column4, 'foo') AS column4
FROM     tablename
WHERE    column1 = 'bar'
ORDER BY column1,
         column2
2
répondu mzedeler 2014-04-07 13:21:49

Play around with www.sqlinform.com -je recommande d'utiliser le norme ANSI-92 , et puis joli avec ce site.

1
répondu Patrick Harrington 2017-05-23 12:02:43
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

ça marche plutôt bien pour nous.

cette requête réelle n'a pas beaucoup de sens puisque j'ai essayé de la Construire rapidement comme un exemple... mais ce n'est pas le point.

  • t_c est l'abréviation de category table sub-query ou "temp category".
  • _underscoring de trucs à l'intérieur des sous-requêtes.
  • alias noms de colonne pour donner un sens dans le contexte de la requête. par exemple "active_members "
  • 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
répondu adamJLev 2009-02-06 23:02:34

N'importe quoi en bleu est en majuscule SELECT , DELETE , GO , etc

les noms de Table sont singuliers comme la table qui détient nos clients serait la table de client

les tables de liaison sont tablename_to_tablename

utiliser _ entre les œuvres dans les noms des tables et des 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
répondu Bob The Janitor 2017-03-25 19:20:15

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

  • INT
  • BIGINT
  • SMALLINT
  • VARCHAR
  • BIT
  • DATETIME

donne la valeur par défaut pour le type de données BIT. Il ne devrait pas être nullable Les noms de Table et de colonne ne doivent jamais être en minuscules. Il devrait décrire son objet. Éviter l'utilisation de courtes forme. Tout en créant un tableau FK et PK pour être bien pensé et défini. Les noms des Variables doivent commencer par une lettre ou deux indiquant le type de données en minuscules. Par exemple, la variable INT doit commencer par I. Le nom doit être descriptif et les formulaires courts doivent être évités. Chaque mot doit commencer par une lettre majuscule suivie de toutes les petites lettres.

E. G.

de façon Correcte: – iTotalCount

chemin Incorrect: - xyz

Les colonnes du tableau

utilisées avec la clause" où " à l'intérieur des procédures stockées devraient être indexées/saisies. Cela permettra d'accroître la vitesse de traitement des données. L'ordre des paramètres dans la clause WHERE doit être fait correctement. La clé primaire / l'index doit précéder les variables binaires. Par exemple: - Un index est créé sur une combinaison de colonnes (REF_ID, T_TYPE_STR, CNUMBER, TLOG_ID)

- manière correcte où les clés indexées sont utilisées dans l'ordre dans la clause "où

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’

En écrivant une procédure stockée, nous devrions avoir la section description Au début qui contiendra Auteur:

Date de création:

Description:

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

modifié par:

Modifié le:

Description:

ROW_INSERTION_DATE_TIME et la colonne ROW_UPDATION_DATE_TIME devrait avoir valeurs par défaut comme GETDATE ().

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

0
répondu bhupesh 2016-11-30 20:04:34
create table
    #tempTable (
        col1 int,
        col2 int,
        col3 int
    )

insert into
    #tempTable (
        col1,
        col2,
        col3
    )
    select
        col1,
        col2,
        col3
    from
        Table3
        inner join Table2
            on Table1.col1 = Table2.col2
    where col1 = 5

select
    col2,
    case when col1 = 3
        then 'something'
        else 'somethingelse'
    end
from #tempTable
where
    col1 = 5
    and (
        col2 = 5
        or col3 in (
            select field
            from Table2
            where
                somecol = 2
                and othercol = 5
        )
    )
-2
répondu jandersson 2009-02-07 00:20:35