/
SQLコーディング規約(PostgreSQL).html
914 lines (914 loc) · 56.7 KB
/
SQLコーディング規約(PostgreSQL).html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang xml:lang>
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<meta name="author" content="Future Enterprise Coding Standards" />
<title>SQLコーディング規約(PostgreSQL)</title>
<style>
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
span.underline{text-decoration: underline;}
div.column{display: inline-block; vertical-align: top; width: 50%;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
ul.task-list{list-style: none;}
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
</style>
<style type="text/css">body {
font-family: Helvetica, arial, sans-serif;
font-size: 14px;
line-height: 1.6;
padding-top: 10px;
padding-bottom: 10px;
background-color: white;
padding: 30px;
}
body > *:first-child {
margin-top: 0 !important;
}
body > *:last-child {
margin-bottom: 0 !important;
}
body {
margin-left: 300px;
}
#TOC {
position: fixed;
left: 0;
top: 0;
bottom: 0;
overflow-y: auto;
width: 300px;
transition: width, font-size, opacity 300ms, 300ms, 300ms ease-in-out,
ease-in-out, ease-in-out;
padding-left: 1em;
box-sizing: border-box;
}
#TOC ul {
margin: 0 0 0 1em;
padding: 0;
}
@media all and (max-width: 1000px) {
body {
margin-left: 0;
}
#TOC {
overflow: hidden;
width: 0;
opacity: 0;
}
}
@media print {
body {
margin-left: 0;
}
#TOC {
display: none;
}
}
@media print {
.print-hidden {
display: none;
}
}
h1.title {
font-size: 42px;
border-bottom: 2px solid #cccccc;
}
@media print {
h1.title {
text-align: center;
margin-top: 50%;
page-break-before: auto;
}
}
h2.author {
font-size: 12px;
border: none;
color: initial;
text-align: right;
margin: 0;
page-break-after: always;
}
h1 {
page-break-before: always;
}
h1,
h2,
h3,
h4,
h5,
h6 {
margin: 20px 0 10px;
padding: 0;
font-weight: bold;
-webkit-font-smoothing: antialiased;
cursor: text;
position: relative;
page-break-after: avoid;
}
a {
color: #4183c4;
}
h1 {
font-size: 28px;
color: black;
}
h2 {
font-size: 24px;
border-bottom: 1px solid #cccccc;
color: black;
}
h3 {
font-size: 18px;
}
h4 {
font-size: 16px;
}
h5 {
font-size: 14px;
}
h6 {
color: #777777;
font-size: 14px;
}
p,
blockquote,
ul,
ol,
dl,
li,
table,
pre {
margin: 15px 0;
}
hr {
border: none;
border-bottom: 1px dashed #cccccc;
}
table {
padding: 0;
border-collapse: collapse;
}
table tr th {
font-weight: bold;
border: 1px solid #cccccc;
text-align: left;
padding: 6px 13px;
}
table tr td {
border: 1px solid #cccccc;
padding: 6px 13px;
}
table tr:nth-child(2n) {
background-color: #f8f8f8;
}
table * {
word-wrap: break-word;
word-break: break-all;
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
font-size: 13px;
line-height: 19px;
overflow: auto;
padding: 6px 10px;
border-radius: 3px;
}
pre code {
margin: 0;
padding: 0;
white-space: pre;
border: none;
background: transparent;
}
code,
tt {
margin: 0 2px;
padding: 0 5px;
white-space: nowrap;
border: 1px solid #eaeaea;
background-color: #f8f8f8;
border-radius: 3px;
}
div.sourceCode {
page-break-before: avoid;
page-break-inside: avoid;
}
li * {
margin: 0;
}
blockquote {
border-left: 4px solid #dddddd;
padding: 0 15px;
color: #777777;
}
blockquote > :first-child {
margin-top: 0;
}
blockquote > :last-child {
margin-bottom: 0;
}
code.comment-code {
display: block;
white-space: pre;
}
table {
overflow: auto;
display: block;
}
@media screen and (max-width: 1300px) and (min-width: 1001px) {
#TOC {
font-size: 80%;
width: 200px;
}
body {
margin-left: 200px;
}
}
@media screen and (max-width: 1100px) and (min-width: 1001px) {
#TOC {
font-size: 60%;
width: 150px;
}
body {
margin-left: 150px;
}
table tr td {
font-size: 80%;
padding: 3px 6px;
}
}
@media all and (max-width: 1000px) {
table tr td {
font-size: 80%;
padding: 3px 6px;
}
}
@media all and (max-width: 800px) {
table tr td {
font-size: 70%;
}
}
@media all and (max-width: 600px) {
table tr td {
font-size: 60%;
}
}
</style>
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
<![endif]-->
</head>
<body>
<header id="title-block-header">
<h1 class="title">SQLコーディング規約(PostgreSQL)</h1>
<p class="author">Future Enterprise Coding Standards</p>
</header>
<nav id="TOC" role="doc-toc">
<ul>
<li><a href="#はじめに"><span class="toc-section-number">1</span> はじめに</a>
<ul>
<li><a href="#前提条件"><span class="toc-section-number">1.1</span> 前提条件</a></li>
</ul></li>
<li><a href="#sql-コーティング規約可読性管理性"><span class="toc-section-number">2</span> SQL コーティング規約(可読性・管理性)</a>
<ul>
<li><a href="#書式全般"><span class="toc-section-number">2.1</span> 書式全般</a></li>
<li><a href="#予約語"><span class="toc-section-number">2.2</span> 予約語</a></li>
<li><a href="#予約語以外"><span class="toc-section-number">2.3</span> 予約語以外</a></li>
<li><a href="#短縮名称"><span class="toc-section-number">2.4</span> 短縮名称</a></li>
<li><a href="#文字コード"><span class="toc-section-number">2.5</span> 文字コード</a></li>
<li><a href="#不要な空白文字スペースは除去する"><span class="toc-section-number">2.6</span> 不要な空白文字(スペース)は除去する</a></li>
<li><a href="#sql-文の整形"><span class="toc-section-number">2.7</span> SQL 文の整形</a>
<ul>
<li><a href="#select-文"><span class="toc-section-number">2.7.1</span> SELECT 文</a></li>
<li><a href="#insert-文"><span class="toc-section-number">2.7.2</span> INSERT 文</a></li>
<li><a href="#update-文"><span class="toc-section-number">2.7.3</span> UPDATE 文</a></li>
<li><a href="#delete-文"><span class="toc-section-number">2.7.4</span> DELETE 文</a></li>
<li><a href="#and副問い合わせ"><span class="toc-section-number">2.7.5</span> AND(副問い合わせ)</a></li>
<li><a href="#case-式"><span class="toc-section-number">2.7.6</span> CASE 式</a></li>
<li><a href="#in-句"><span class="toc-section-number">2.7.7</span> IN 句</a></li>
<li><a href="#比較演算子"><span class="toc-section-number">2.7.8</span> 比較演算子</a></li>
<li><a href="#改行位置"><span class="toc-section-number">2.7.9</span> 改行位置</a></li>
<li><a href="#with-句"><span class="toc-section-number">2.7.10</span> WITH 句</a></li>
<li><a href="#limit-句-offset-句"><span class="toc-section-number">2.7.11</span> LIMIT 句 OFFSET 句</a></li>
<li><a href="#hint-句"><span class="toc-section-number">2.7.12</span> HINT 句</a></li>
</ul></li>
<li><a href="#コメント"><span class="toc-section-number">2.8</span> コメント</a></li>
<li><a href="#型変換"><span class="toc-section-number">2.9</span> 型変換</a></li>
<li><a href="#比較演算子-1"><span class="toc-section-number">2.10</span> 比較演算子</a></li>
<li><a href="#order-by-句"><span class="toc-section-number">2.11</span> ORDER BY 句</a></li>
<li><a href="#group-by-句"><span class="toc-section-number">2.12</span> GROUP BY 句</a></li>
<li><a href="#exists-句"><span class="toc-section-number">2.13</span> EXISTS 句</a></li>
<li><a href="#as-句"><span class="toc-section-number">2.14</span> AS 句</a></li>
<li><a href="#where-句"><span class="toc-section-number">2.15</span> WHERE 句</a></li>
<li><a href="#count-文"><span class="toc-section-number">2.16</span> COUNT 文</a></li>
<li><a href="#文字列リテラル"><span class="toc-section-number">2.17</span> 文字列リテラル</a>
<ul>
<li><a href="#エスケープシーケンス"><span class="toc-section-number">2.17.1</span> エスケープシーケンス</a></li>
</ul></li>
</ul></li>
<li><a href="#sql-コーディング規約パフォーマンス性"><span class="toc-section-number">3</span> SQL コーディング規約(パフォーマンス性)</a>
<ul>
<li><a href="#検索"><span class="toc-section-number">3.1</span> 検索</a></li>
<li><a href="#挿入"><span class="toc-section-number">3.2</span> 挿入</a></li>
<li><a href="#更新"><span class="toc-section-number">3.3</span> 更新</a></li>
<li><a href="#削除"><span class="toc-section-number">3.4</span> 削除</a></li>
<li><a href="#distinct-句"><span class="toc-section-number">3.5</span> DISTINCT 句</a></li>
<li><a href="#in-句-1"><span class="toc-section-number">3.6</span> IN 句</a></li>
<li><a href="#not-in-句"><span class="toc-section-number">3.7</span> NOT IN 句</a></li>
<li><a href="#union-句"><span class="toc-section-number">3.8</span> UNION 句</a></li>
<li><a href="#select-for-update"><span class="toc-section-number">3.9</span> SELECT FOR UPDATE</a></li>
<li><a href="#分析関数"><span class="toc-section-number">3.10</span> 分析関数</a></li>
<li><a href="#インデックス"><span class="toc-section-number">3.11</span> インデックス</a></li>
<li><a href="#外部結合"><span class="toc-section-number">3.12</span> 外部結合</a></li>
</ul></li>
<li><a href="#license"><span class="toc-section-number">4</span> License</a></li>
</ul>
</nav>
<p><page-title></page-title></p>
<p>本コーディング規約は、世の中のシステム開発プロジェクトのために無償で提供致します。<br />
ただし、掲載内容および利用に際して発生した問題、それに伴う損害については、フューチャー株式会社は一切の責務を負わないものとします。<br />
また、掲載している情報は予告なく変更することがございますので、あらかじめご了承下さい。</p>
<section id="はじめに" data-number="1">
<h1 data-number="1"><span class="header-section-number">1</span> はじめに</h1>
<section id="前提条件" data-number="1.1">
<h2 data-number="1.1"><span class="header-section-number">1.1</span> 前提条件</h2>
<p>本書は、SQL コーディング規約についてまとめたものである。<br />
今回 RDBMS として採用する PostgreSQL での SQL の使用を前提に記述している。</p>
</section>
</section>
<section id="sql-コーティング規約可読性管理性" data-number="2">
<h1 data-number="2"><span class="header-section-number">2</span> SQL コーティング規約(可読性・管理性)</h1>
<p>本章では可読性・管理性を高めることを目的としたコーディング規約について記載する。</p>
<section id="書式全般" data-number="2.1">
<h2 data-number="2.1"><span class="header-section-number">2.1</span> 書式全般</h2>
<p>書式全般についてのコーディング規約を下記に示す。</p>
<ul>
<li>1 行につき、1 文のみを記述する。</li>
<li>SQL 中のインデントは、Java コーディング規約にあわせて半角スペースではなくタブ文字とする。</li>
<li>ヘボン式ローマ字を使用する。</li>
<li>外来語に関しては、原語の綴りを使用する。</li>
<li>横は 80 文字を目安に改行する。</li>
<li>定数を条件に用いる場合やインライン・ビューで取得したいデータなど開発者の意図はコメントにて記載する。</li>
</ul>
</section>
<section id="予約語" data-number="2.2">
<h2 data-number="2.2"><span class="header-section-number">2.2</span> 予約語</h2>
<p>予約語に対しては、小文字を使用する。(例 : <code>select</code>、<code>insert</code>、<code>update</code>、<code>delete</code> 等)</p>
</section>
<section id="予約語以外" data-number="2.3">
<h2 data-number="2.3"><span class="header-section-number">2.3</span> 予約語以外</h2>
<p>予約語以外に対しても、予約語と同様に小文字を使用する。(例 : オブジェクト名、カラム名 等)</p>
</section>
<section id="短縮名称" data-number="2.4">
<h2 data-number="2.4"><span class="header-section-number">2.4</span> 短縮名称</h2>
<p>SQL 中に記述するエイリアス名など単語の短縮について示す。</p>
<ol type="1">
<li><p>外来語に関しては、原語の短縮形を使用する。短縮形が存在しない場合には、母音を抜かして表記する。<br />
例) corporation → corp / computer → cmptr</p></li>
<li><p>ローマ字の短縮は、単語の区切れの頭文字、または母音を抜かした子音字等を利用する。<br />
例) nichijo → nchj</p></li>
</ol>
<ul>
<li>カラムには必ずテーブルエイリアスを付与する</li>
<li>テーブルのエイリアスは必ず付与すること。<br />
必要ない場合(単一テーブルへの SELECT 等)も必ず付与すること<br />
また、テーブルのエイリアス名は同 SQL 文の中で重複しないように命名すること。<br />
(副問い合わせで利用したエイリアス名をメインの SQL 中のエイリアス名に利用しない。など)</li>
</ul>
</section>
<section id="文字コード" data-number="2.5">
<h2 data-number="2.5"><span class="header-section-number">2.5</span> 文字コード</h2>
<p>SQL ファイルの文字コード(エンコーディング)は Java ソースファイルと同じく『 Unicode UTF-8 』で保存する。</p>
</section>
<section id="不要な空白文字スペースは除去する" data-number="2.6">
<h2 data-number="2.6"><span class="header-section-number">2.6</span> 不要な空白文字(スペース)は除去する</h2>
<p>不要な空白文字(スペース)は除去すること。</p>
</section>
<section id="sql-文の整形" data-number="2.7">
<h2 data-number="2.7"><span class="header-section-number">2.7</span> SQL 文の整形</h2>
<p>DML 文の節に対する予約語は左揃えにする。<br />
項目ごとに改行を入れ、項目の前にはインデントを挿入する。カンマは項目の前へ記入する。<br />
Java ソースファイルのようにファイルの先頭にコメント行を入れると DB 分析作業に支障があるため禁止とする。<br />
よって SQL ファイルの先頭は必ず<code>select</code>、<code>update</code>、<code>insert</code>、<code>delete</code>の何れかになる。</p>
<p>物理カラム名、テーブル名に対応する論理名を入れる場合、その後ろに単数行コメント(<code>--</code>)にて記述する。<br />
SQL 内に挿入する単数行コメントは、<code>/*(半角スペース)コメント本文(半角スペース)*/</code> で行う。<br />
<code>,</code>(カンマ)と<code>AND</code>については各行の先頭に記述する。(以下の例を参照のこと)<br />
SQL フレームワークで実行する SQL の場合、SQL ステートメントの終わりを示す<code>;</code>(セミコロン)は記述しない。</p>
<p>良い例:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb1-1"><a href="#cb1-1"></a><span class="kw">select</span></span>
<span id="cb1-2"><a href="#cb1-2"></a><span class="co">/*</span></span>
<span id="cb1-3"><a href="#cb1-3"></a><span class="co"> 処理名</span></span>
<span id="cb1-4"><a href="#cb1-4"></a><span class="co">*/</span></span>
<span id="cb1-5"><a href="#cb1-5"></a> tbl1.column1 <span class="kw">as</span> column1 <span class="co">-- カラム1</span></span>
<span id="cb1-6"><a href="#cb1-6"></a>, tbl1.column2 <span class="kw">as</span> column2 <span class="co">-- カラム2</span></span>
<span id="cb1-7"><a href="#cb1-7"></a><span class="kw">from</span></span>
<span id="cb1-8"><a href="#cb1-8"></a> table1 tbl1 <span class="co">-- テーブル1</span></span></code></pre></div>
<p>WHERE 句の<code>=</code>、<code>!=</code>、<code>is</code>(<code>is null</code>の<code>is</code>)の縦位置は揃える。</p>
<p>良い例:</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb2-1"><a href="#cb2-1"></a><span class="kw">where</span></span>
<span id="cb2-2"><a href="#cb2-2"></a> a.ten_no <span class="op">=</span> b.ten_no</span>
<span id="cb2-3"><a href="#cb2-3"></a><span class="kw">and</span> a.kamoku_cd <span class="op">!=</span> <span class="st">'1'</span></span>
<span id="cb2-4"><a href="#cb2-4"></a><span class="kw">and</span> a.anken_no <span class="kw">is</span> <span class="kw">null</span></span></code></pre></div>
<section id="select-文" data-number="2.7.1">
<h3 data-number="2.7.1"><span class="header-section-number">2.7.1</span> SELECT 文</h3>
<p>良い例:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb3-1"><a href="#cb3-1"></a><span class="kw">select</span></span>
<span id="cb3-2"><a href="#cb3-2"></a> tbl1.column1 <span class="kw">as</span> column1 <span class="co">-- カラム1</span></span>
<span id="cb3-3"><a href="#cb3-3"></a>, tbl1.column2 <span class="kw">as</span> column2 <span class="co">-- カラム2</span></span>
<span id="cb3-4"><a href="#cb3-4"></a><span class="kw">from</span></span>
<span id="cb3-5"><a href="#cb3-5"></a> table1 tbl1 <span class="co">-- テーブル1</span></span>
<span id="cb3-6"><a href="#cb3-6"></a><span class="kw">where</span></span>
<span id="cb3-7"><a href="#cb3-7"></a> tbl1.column3 <span class="op">=</span> <span class="dv">1</span></span>
<span id="cb3-8"><a href="#cb3-8"></a><span class="kw">order</span> <span class="kw">by</span></span>
<span id="cb3-9"><a href="#cb3-9"></a> tbl1.column1</span>
<span id="cb3-10"><a href="#cb3-10"></a>, tbl1.column2</span></code></pre></div>
</section>
<section id="insert-文" data-number="2.7.2">
<h3 data-number="2.7.2"><span class="header-section-number">2.7.2</span> INSERT 文</h3>
<p>良い例:</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb4-1"><a href="#cb4-1"></a><span class="kw">insert</span></span>
<span id="cb4-2"><a href="#cb4-2"></a><span class="kw">into</span></span>
<span id="cb4-3"><a href="#cb4-3"></a> table1 <span class="co">-- テーブル1</span></span>
<span id="cb4-4"><a href="#cb4-4"></a>(</span>
<span id="cb4-5"><a href="#cb4-5"></a> column1 <span class="co">-- カラム1</span></span>
<span id="cb4-6"><a href="#cb4-6"></a>, column2 <span class="co">-- カラム2</span></span>
<span id="cb4-7"><a href="#cb4-7"></a>, column3 <span class="co">-- カラム3</span></span>
<span id="cb4-8"><a href="#cb4-8"></a>) <span class="kw">values</span> (</span>
<span id="cb4-9"><a href="#cb4-9"></a> value1</span>
<span id="cb4-10"><a href="#cb4-10"></a>, value2</span>
<span id="cb4-11"><a href="#cb4-11"></a>, value3</span>
<span id="cb4-12"><a href="#cb4-12"></a>)</span></code></pre></div>
</section>
<section id="update-文" data-number="2.7.3">
<h3 data-number="2.7.3"><span class="header-section-number">2.7.3</span> UPDATE 文</h3>
<p>良い例:</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb5-1"><a href="#cb5-1"></a><span class="kw">update</span></span>
<span id="cb5-2"><a href="#cb5-2"></a> table1 tbl1 <span class="co">-- テーブル1</span></span>
<span id="cb5-3"><a href="#cb5-3"></a><span class="kw">set</span></span>
<span id="cb5-4"><a href="#cb5-4"></a> tbl1.column2 <span class="op">=</span> <span class="dv">100</span> <span class="co">-- カラム2</span></span>
<span id="cb5-5"><a href="#cb5-5"></a>, tbl1.column3 <span class="op">=</span> <span class="dv">100</span> <span class="co">-- カラム3</span></span>
<span id="cb5-6"><a href="#cb5-6"></a><span class="kw">where</span></span>
<span id="cb5-7"><a href="#cb5-7"></a> tbl1.column1 <span class="op">=</span> <span class="dv">10</span></span></code></pre></div>
</section>
<section id="delete-文" data-number="2.7.4">
<h3 data-number="2.7.4"><span class="header-section-number">2.7.4</span> DELETE 文</h3>
<p>良い例:</p>
<div class="sourceCode" id="cb6"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb6-1"><a href="#cb6-1"></a><span class="kw">delete</span></span>
<span id="cb6-2"><a href="#cb6-2"></a><span class="kw">from</span></span>
<span id="cb6-3"><a href="#cb6-3"></a> table1 tbl1 <span class="co">-- テーブル1</span></span>
<span id="cb6-4"><a href="#cb6-4"></a><span class="kw">where</span></span>
<span id="cb6-5"><a href="#cb6-5"></a> tbl1.<span class="fu">value</span> <span class="op">=</span> <span class="dv">1</span></span></code></pre></div>
</section>
<section id="and副問い合わせ" data-number="2.7.5">
<h3 data-number="2.7.5"><span class="header-section-number">2.7.5</span> AND(副問い合わせ)</h3>
<p>良い例:</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb7-1"><a href="#cb7-1"></a><span class="kw">and</span> xxx <span class="op">=</span> (</span>
<span id="cb7-2"><a href="#cb7-2"></a> <span class="kw">select</span></span>
<span id="cb7-3"><a href="#cb7-3"></a> tbl1.column1</span>
<span id="cb7-4"><a href="#cb7-4"></a> , tbl1.column2</span>
<span id="cb7-5"><a href="#cb7-5"></a> <span class="kw">from</span></span>
<span id="cb7-6"><a href="#cb7-6"></a> table1 tbl1</span>
<span id="cb7-7"><a href="#cb7-7"></a> )</span></code></pre></div>
</section>
<section id="case-式" data-number="2.7.6">
<h3 data-number="2.7.6"><span class="header-section-number">2.7.6</span> CASE 式</h3>
<p>CASE 式は下記のように記載すること。</p>
<p>良い例:</p>
<div class="sourceCode" id="cb8"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb8-1"><a href="#cb8-1"></a><span class="cf">case</span></span>
<span id="cb8-2"><a href="#cb8-2"></a> <span class="cf">when</span></span>
<span id="cb8-3"><a href="#cb8-3"></a> xxx.hoge <span class="op">=</span> yyy.fuga</span>
<span id="cb8-4"><a href="#cb8-4"></a> <span class="kw">and</span> xxx.fuga <span class="op">=</span> yyy.fuga</span>
<span id="cb8-5"><a href="#cb8-5"></a> <span class="cf">then</span></span>
<span id="cb8-6"><a href="#cb8-6"></a> <span class="dv">1</span></span>
<span id="cb8-7"><a href="#cb8-7"></a> <span class="cf">else</span></span>
<span id="cb8-8"><a href="#cb8-8"></a> <span class="dv">0</span></span>
<span id="cb8-9"><a href="#cb8-9"></a><span class="cf">end</span></span></code></pre></div>
<p><code>case</code>、<code>when</code>、<code>then</code>、<code>else</code>の後に改行を挿入すること。<br />
<code>case</code>の後、<code>end</code>の前までは 1 インデント挿入すること。</p>
</section>
<section id="in-句" data-number="2.7.7">
<h3 data-number="2.7.7"><span class="header-section-number">2.7.7</span> IN 句</h3>
<p>カンマの後にスペースを1文字入れる。</p>
</section>
<section id="比較演算子" data-number="2.7.8">
<h3 data-number="2.7.8"><span class="header-section-number">2.7.8</span> 比較演算子</h3>
<p>比較演算子の前後にタブ(またはスペース)を1文字入れる。</p>
</section>
<section id="改行位置" data-number="2.7.9">
<h3 data-number="2.7.9"><span class="header-section-number">2.7.9</span> 改行位置</h3>
<p>select 句、order by 句、group by 句等は最初に出現するカラムとカラムの区切りのカンマ前に改行を入れること。<br />
select の from 句の最初に出現するテーブルと結合テーブルの区切りのカンマ前に改行を入れること。<br />
where 句の on 句の各条件文の(and や or の)前に改行を入れること。<br />
命令句の後は、ヒント句が挿入できるように改行すること。</p>
<p>良い例:</p>
<div class="sourceCode" id="cb9"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb9-1"><a href="#cb9-1"></a><span class="kw">select</span></span>
<span id="cb9-2"><a href="#cb9-2"></a> t1.column1 <span class="kw">as</span> column1</span>
<span id="cb9-3"><a href="#cb9-3"></a>, t2.column2 <span class="kw">as</span> column2</span>
<span id="cb9-4"><a href="#cb9-4"></a><span class="kw">from</span></span>
<span id="cb9-5"><a href="#cb9-5"></a> table1 t1</span>
<span id="cb9-6"><a href="#cb9-6"></a>, table2 t2</span>
<span id="cb9-7"><a href="#cb9-7"></a><span class="kw">where</span></span>
<span id="cb9-8"><a href="#cb9-8"></a> t1.column3 <span class="op">=</span> <span class="dv">1</span></span>
<span id="cb9-9"><a href="#cb9-9"></a><span class="kw">and</span> t1.column4 <span class="op">=</span> t2.column4</span>
<span id="cb9-10"><a href="#cb9-10"></a><span class="kw">order</span> <span class="kw">by</span></span>
<span id="cb9-11"><a href="#cb9-11"></a> t1.column1</span>
<span id="cb9-12"><a href="#cb9-12"></a>, t2.column2</span></code></pre></div>
</section>
<section id="with-句" data-number="2.7.10">
<h3 data-number="2.7.10"><span class="header-section-number">2.7.10</span> WITH 句</h3>
<p>with の前後に改行を挿入すること<br />
また、インデントは下記のように記述すること</p>
<p>良い例:</p>
<div class="sourceCode" id="cb10"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb10-1"><a href="#cb10-1"></a><span class="co">-- カラムエイリアスあり</span></span>
<span id="cb10-2"><a href="#cb10-2"></a><span class="kw">with</span></span>
<span id="cb10-3"><a href="#cb10-3"></a> name1 (</span>
<span id="cb10-4"><a href="#cb10-4"></a> col_alias1 <span class="co">-- カラム1</span></span>
<span id="cb10-5"><a href="#cb10-5"></a> , col_alias2 <span class="co">-- カラム2</span></span>
<span id="cb10-6"><a href="#cb10-6"></a> ) <span class="kw">as</span> (</span>
<span id="cb10-7"><a href="#cb10-7"></a> <span class="kw">select</span></span>
<span id="cb10-8"><a href="#cb10-8"></a> ・・・</span>
<span id="cb10-9"><a href="#cb10-9"></a> )</span>
<span id="cb10-10"><a href="#cb10-10"></a>, name2 (</span>
<span id="cb10-11"><a href="#cb10-11"></a> col_alias1 <span class="co">-- カラム1</span></span>
<span id="cb10-12"><a href="#cb10-12"></a> , col_alias2 <span class="co">-- カラム2</span></span>
<span id="cb10-13"><a href="#cb10-13"></a> ) <span class="kw">as</span> (</span>
<span id="cb10-14"><a href="#cb10-14"></a> <span class="kw">select</span></span>
<span id="cb10-15"><a href="#cb10-15"></a> ・・・</span>
<span id="cb10-16"><a href="#cb10-16"></a> )</span>
<span id="cb10-17"><a href="#cb10-17"></a></span>
<span id="cb10-18"><a href="#cb10-18"></a><span class="co">-- カラムエイリアスなし</span></span>
<span id="cb10-19"><a href="#cb10-19"></a><span class="kw">with</span></span>
<span id="cb10-20"><a href="#cb10-20"></a> name1 <span class="kw">as</span> (</span>
<span id="cb10-21"><a href="#cb10-21"></a> <span class="kw">select</span></span>
<span id="cb10-22"><a href="#cb10-22"></a> ・・・</span>
<span id="cb10-23"><a href="#cb10-23"></a> )</span>
<span id="cb10-24"><a href="#cb10-24"></a>, name2 <span class="kw">as</span> (</span>
<span id="cb10-25"><a href="#cb10-25"></a> <span class="kw">select</span></span>
<span id="cb10-26"><a href="#cb10-26"></a> ・・・</span>
<span id="cb10-27"><a href="#cb10-27"></a> )</span></code></pre></div>
</section>
<section id="limit-句-offset-句" data-number="2.7.11">
<h3 data-number="2.7.11"><span class="header-section-number">2.7.11</span> LIMIT 句 OFFSET 句</h3>
<p>LIMIT、OFFSET の前に改行を挿入すること</p>
<p>良い例:</p>
<div class="sourceCode" id="cb11"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb11-1"><a href="#cb11-1"></a><span class="kw">select</span></span>
<span id="cb11-2"><a href="#cb11-2"></a> tbl1.column1 <span class="kw">as</span> column1</span>
<span id="cb11-3"><a href="#cb11-3"></a><span class="kw">from</span></span>
<span id="cb11-4"><a href="#cb11-4"></a> table1 tbl1</span>
<span id="cb11-5"><a href="#cb11-5"></a><span class="kw">order</span> <span class="kw">by</span></span>
<span id="cb11-6"><a href="#cb11-6"></a> tbl1.column2 <span class="kw">desc</span></span>
<span id="cb11-7"><a href="#cb11-7"></a><span class="kw">limit</span> <span class="dv">5</span></span>
<span id="cb11-8"><a href="#cb11-8"></a>offset <span class="dv">5</span></span></code></pre></div>
</section>
<section id="hint-句" data-number="2.7.12">
<h3 data-number="2.7.12"><span class="header-section-number">2.7.12</span> HINT 句</h3>
<p>HINT 句は独立した行で記載すること<br />
HINT 内容にはインデントを付けること</p>
<p>良い例:</p>
<div class="sourceCode" id="cb12"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb12-1"><a href="#cb12-1"></a><span class="kw">select</span></span>
<span id="cb12-2"><a href="#cb12-2"></a><span class="co">/*+</span></span>
<span id="cb12-3"><a href="#cb12-3"></a><span class="co"> ここにhintを記載</span></span>
<span id="cb12-4"><a href="#cb12-4"></a><span class="co">*/</span></span>
<span id="cb12-5"><a href="#cb12-5"></a> tbl1.column1 <span class="kw">as</span> column1</span>
<span id="cb12-6"><a href="#cb12-6"></a><span class="kw">from</span></span>
<span id="cb12-7"><a href="#cb12-7"></a> table1 tbl1</span>
<span id="cb12-8"><a href="#cb12-8"></a><span class="kw">where</span></span>
<span id="cb12-9"><a href="#cb12-9"></a> tbl1.column2 <span class="op">=</span> <span class="dv">1</span></span></code></pre></div>
</section>
</section>
<section id="コメント" data-number="2.8">
<h2 data-number="2.8"><span class="header-section-number">2.8</span> コメント</h2>
<ul>
<li><p>修正コメント</p>
<p>(修正コメントが必要な場合、)<br />
処理追加の際、追加行の 1 行目の前と最終行の次の行にコメントを入れる。単一行の場合は、同一行の最後にコメントをつける。</p>
<p>良い例:</p>
<div class="sourceCode" id="cb13"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb13-1"><a href="#cb13-1"></a><span class="co">-- 2004/04/23 仕様変更管理番号 ADD(または、MOD、DEL) 変更者名 S ← 修正開始点コメント</span></span>
<span id="cb13-2"><a href="#cb13-2"></a>(追加処理)</span>
<span id="cb13-3"><a href="#cb13-3"></a><span class="co">-- 2004/04/23仕様変更管理番号 ADD(または、MOD、DEL) 変更者名 E ← 修正終了点コメント</span></span></code></pre></div></li>
<li><p>単数行コメント</p>
<p>SQL 内で使用する単数行コメント(カラムコメントなど)には、「 <code>--</code> 」を使用する。</p></li>
<li><p>複数行コメント</p>
<p>「 <code>/*</code> <code>*/</code> 」を使用する。下記に例を示す。<br />
なお、前述で触れたとおり、SQL ファイルの先頭にコメントを記述することは禁止とする。</p>
<p>良い例:</p>
<div class="sourceCode" id="cb14"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb14-1"><a href="#cb14-1"></a><span class="co">/**********************************************************************/</span></span>
<span id="cb14-2"><a href="#cb14-2"></a><span class="co">/*</span></span>
<span id="cb14-3"><a href="#cb14-3"></a><span class="co"> * コメントを始めるスラッシュとアスタリスクは、それだけを1行に置く。</span></span>
<span id="cb14-4"><a href="#cb14-4"></a><span class="co"> * それから、コメント・ブロック内の各行は縦にアスタリスクを置き</span></span>
<span id="cb14-5"><a href="#cb14-5"></a><span class="co"> * コメントがあることを強調する。</span></span>
<span id="cb14-6"><a href="#cb14-6"></a><span class="co"> * 最後に、アスタリスクとスラッシュは、それだけを1行に置く。</span></span>
<span id="cb14-7"><a href="#cb14-7"></a><span class="co"> */</span></span>
<span id="cb14-8"><a href="#cb14-8"></a><span class="co">/**********************************************************************/</span></span></code></pre></div></li>
<li><p>複数行コメントアウト</p>
<p>複数行をコメントアウトする場合は、各行を「<code>--</code>」でコメントアウトする。<br />
「 <code>/*</code> <code>*/</code> 」を使用すると、その中に「 <code>/*</code> <code>*/</code> 」が存在した場合、コメントアウトが途中で切れてしまう恐れがあるため、<br />
使用しない。</p></li>
<li><p>論理名の記載</p>
<p><code>select</code>・<code>insert</code>・<code>update</code>・<code>merge</code>のカラム名記述箇所には単数行コメントでカラムの論理名を記載する。<br />
<code>select</code>・<code>insert</code>・<code>update</code>・<code>delete</code>・<code>merge</code>のテーブル名記述箇所には単数行コメントでテーブルの論理名を記載する。<br />
論理名は ERD 等で定義された論理名と必ず一致させること。</p></li>
</ul>
</section>
<section id="型変換" data-number="2.9">
<h2 data-number="2.9"><span class="header-section-number">2.9</span> 型変換</h2>
<p>代入や WHERE 句の条件設定などでデータ・タイプが異なる場合、明示的にタイプ変換を行う。(暗黙の型変換は使用しない)</p>
</section>
<section id="比較演算子-1" data-number="2.10">
<h2 data-number="2.10"><span class="header-section-number">2.10</span> 比較演算子</h2>
<p>「等しくない」を示す演算子は「<code>!=</code>」を利用する。「<code><></code>」も動作するが統一の観点から利用しない。</p>
</section>
<section id="order-by-句" data-number="2.11">
<h2 data-number="2.11"><span class="header-section-number">2.11</span> ORDER BY 句</h2>
<p><code>order by</code> 数字の構文は使用せずに、カラム名を記載する。</p>
</section>
<section id="group-by-句" data-number="2.12">
<h2 data-number="2.12"><span class="header-section-number">2.12</span> GROUP BY 句</h2>
<p><code>group by</code> 数字の構文は使用せずに、カラム名を記載する。</p>
<p>集約関数を利用する場合は必ず記載すること。(省略可能であっても省略しない)</p>
</section>
<section id="exists-句" data-number="2.13">
<h2 data-number="2.13"><span class="header-section-number">2.13</span> EXISTS 句</h2>
<p>EXISTS 句を記載する際、サブクエリになる SELECT 句の指定は定数「<code>1</code>」とする。<br />
「<code>*</code>」(ワイルドカード)や「<code>'X'</code>」は統一の観点から利用しない。<br />
また「<code>*</code>」(ワイルドカード)についてはパフォーマンスの観点からも禁止とする。</p>
<p>良い例:</p>
<div class="sourceCode" id="cb15"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb15-1"><a href="#cb15-1"></a><span class="kw">where</span></span>
<span id="cb15-2"><a href="#cb15-2"></a> <span class="kw">exists</span>(</span>
<span id="cb15-3"><a href="#cb15-3"></a> <span class="kw">select</span></span>
<span id="cb15-4"><a href="#cb15-4"></a> <span class="dv">1</span></span>
<span id="cb15-5"><a href="#cb15-5"></a> <span class="kw">from</span></span>
<span id="cb15-6"><a href="#cb15-6"></a> foo f</span>
<span id="cb15-7"><a href="#cb15-7"></a> <span class="kw">where</span></span>
<span id="cb15-8"><a href="#cb15-8"></a> f.col1 <span class="op">=</span> m.<span class="kw">key</span></span>
<span id="cb15-9"><a href="#cb15-9"></a> )</span></code></pre></div>
</section>
<section id="as-句" data-number="2.14">
<h2 data-number="2.14"><span class="header-section-number">2.14</span> AS 句</h2>
<p>トップレベルの SELECT 句には必ず<code>as</code>句を記載し別名を付ける。<br />
同一の名前であっても AS 句を付与する。<br />
また、「<code>as</code>」は省略可能であるが、省略はしないこと。</p>
</section>
<section id="where-句" data-number="2.15">
<h2 data-number="2.15"><span class="header-section-number">2.15</span> WHERE 句</h2>
<ul>
<li><p>論理名の記載<br />
WHERE 句でカラムと式を比較する際は左辺がカラムになるように記載すること。</p>
<p>良い例:</p>
<div class="sourceCode" id="cb16"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb16-1"><a href="#cb16-1"></a><span class="kw">where</span></span>
<span id="cb16-2"><a href="#cb16-2"></a> tbl.column1 <span class="op">=</span> <span class="dv">1</span></span>
<span id="cb16-3"><a href="#cb16-3"></a><span class="kw">and</span> tbl.amount2 <span class="op">></span> tbl.amount3 <span class="op">+</span> tbl.amount4</span></code></pre></div></li>
<li><p>条件式の順序<br />
原則として、WHERE 句で条件式を列挙する際、下記の順序を守ること。</p>
<ol type="1">
<li>テーブル単位にまとめて順番に記述する<br />
この際、テーブルの順序は FROM 句に記述した順序に準ずること。</li>
<li>1.のテーブル単位の中で絞り込み条件をまず記述し、その後結合条件を記述する。</li>
</ol>
<p>良い例:</p>
<div class="sourceCode" id="cb17"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb17-1"><a href="#cb17-1"></a><span class="kw">from</span></span>
<span id="cb17-2"><a href="#cb17-2"></a> a_table a <span class="co">-- a_table</span></span>
<span id="cb17-3"><a href="#cb17-3"></a>, b_table b <span class="co">-- b_table</span></span>
<span id="cb17-4"><a href="#cb17-4"></a>, c_table c <span class="co">-- c_table</span></span>
<span id="cb17-5"><a href="#cb17-5"></a><span class="kw">where</span></span>
<span id="cb17-6"><a href="#cb17-6"></a><span class="co">-- a_tableの絞り込み</span></span>
<span id="cb17-7"><a href="#cb17-7"></a> a.key1 <span class="op">=</span> ?</span>
<span id="cb17-8"><a href="#cb17-8"></a><span class="kw">and</span> a.key2 <span class="op">=</span> ?</span>
<span id="cb17-9"><a href="#cb17-9"></a><span class="co">-- b_tableの絞り込み</span></span>
<span id="cb17-10"><a href="#cb17-10"></a><span class="kw">and</span> b.key1 <span class="op">=</span> ?</span>
<span id="cb17-11"><a href="#cb17-11"></a><span class="kw">and</span> b.key2 <span class="op">=</span> ?</span>
<span id="cb17-12"><a href="#cb17-12"></a><span class="co">-- b_tableの結合条件</span></span>
<span id="cb17-13"><a href="#cb17-13"></a><span class="kw">and</span> b.col1 <span class="op">=</span> a.col1</span>
<span id="cb17-14"><a href="#cb17-14"></a><span class="co">-- c_tableの絞り込み</span></span>
<span id="cb17-15"><a href="#cb17-15"></a><span class="kw">and</span> c.key1 <span class="op">=</span> ?</span>
<span id="cb17-16"><a href="#cb17-16"></a><span class="kw">and</span> c.key2 <span class="op">=</span> ?</span>
<span id="cb17-17"><a href="#cb17-17"></a><span class="co">-- c_tableの結合条件</span></span>
<span id="cb17-18"><a href="#cb17-18"></a><span class="kw">and</span> c.col1 <span class="op">=</span> a.col1</span>
<span id="cb17-19"><a href="#cb17-19"></a><span class="kw">and</span> c.col2 <span class="op">=</span> a.col2</span>
<span id="cb17-20"><a href="#cb17-20"></a><span class="kw">and</span> c.col3 <span class="op">=</span> b.col3</span></code></pre></div></li>
</ul>
</section>
<section id="count-文" data-number="2.16">
<h2 data-number="2.16"><span class="header-section-number">2.16</span> COUNT 文</h2>
<p>レコード数を数える COUNT 文の記述は<code>count(*)</code>と記述する。<br />
<code>count(1)</code>・<code>count('x')</code> ・<code>count(key1)</code>という記載は NG。</p>
</section>
<section id="文字列リテラル" data-number="2.17">
<h2 data-number="2.17"><span class="header-section-number">2.17</span> 文字列リテラル</h2>
<section id="エスケープシーケンス" data-number="2.17.1">
<h3 data-number="2.17.1"><span class="header-section-number">2.17.1</span> エスケープシーケンス</h3>
<p>文字列リテラル中のシングルクォーテーションのエスケープは「 <code>''</code> 」とシングルクォーテーションを二つつなげた記述をする。<br />
「 <code>\'</code> 」も同様の結果が得られるが円マーク(バックスラッシュ)によるエスケープは利用しない。<br />
円マークをエスケープせざるを得ないときのみ円マークによるエスケープ利用して良いが、<br />
円マークを文字列リテラルで表現する必要のある設計自体を避けること。</p>
<p>※PostgreSQL は設定によって円マーク(バックスラッシュ)によるエスケープを無効にできます。(デフォルト無効)<br />
円マークをエスケープするときは、自プロジェクトでどちらに設定されているか確認してください。</p>
<p>良い例:</p>
<div class="sourceCode" id="cb18"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb18-1"><a href="#cb18-1"></a><span class="kw">update</span></span>
<span id="cb18-2"><a href="#cb18-2"></a> table_a</span>
<span id="cb18-3"><a href="#cb18-3"></a><span class="kw">set</span></span>
<span id="cb18-4"><a href="#cb18-4"></a> text_data <span class="op">=</span> <span class="st">'that</span><span class="ch">''</span><span class="st">s right'</span></span></code></pre></div>
<p>悪い例:</p>
<div class="sourceCode" id="cb19"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb19-1"><a href="#cb19-1"></a><span class="kw">update</span></span>
<span id="cb19-2"><a href="#cb19-2"></a> table_a</span>
<span id="cb19-3"><a href="#cb19-3"></a><span class="kw">set</span></span>
<span id="cb19-4"><a href="#cb19-4"></a> text_data <span class="op">=</span> <span class="st">'that\'</span>s too bad<span class="st">'</span></span></code></pre></div>
</section>
</section>
</section>
<section id="sql-コーディング規約パフォーマンス性" data-number="3">
<h1 data-number="3"><span class="header-section-number">3</span> SQL コーディング規約(パフォーマンス性)</h1>
<p>本章ではパフォーマンス性を高めることを目的としたコーディング規約について記載する。</p>
<section id="検索" data-number="3.1">
<h2 data-number="3.1"><span class="header-section-number">3.1</span> 検索</h2>
<p>検索処理におけるコーディング規約を下記に示す。</p>
<ul>
<li><p>中間一致、後方一致検索はインデックスを利用できないため避ける</p></li>
<li><p>検索条件で<code>=</code>(等号)を使用できる場合は必ず使用する</p>
<p><code>a=1 or a=2</code>とする方が<code>a>0 and a<3</code>などと記述するのよりパフォーマンス上優位な場合が多い。<br />
これは <code>a</code> にインデックスがある場合、<code>=</code>であれば、インデックスが有効に使われるためである。</p></li>
<li><p>可能な限り検索条件にパーティションキーの値を指定する</p></li>
<li><p>全列ワイルドカード「<code>*</code>」の使用はせず、カラム名を明記する</p></li>
<li><p>インデックスによる検索を指定したい場合、下記の記載を行わない</p>
<ul>
<li><p>インデックスカラムを含む演算に対して条件指定</p>
<p>悪い例:</p>
<div class="sourceCode" id="cb20"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb20-1"><a href="#cb20-1"></a>tbl1.col1 <span class="op">+</span> <span class="dv">1</span> <span class="op">></span> <span class="dv">100</span> <span class="co">/* NGパターン 右辺で演算してください */</span></span></code></pre></div>
<p>良い例:</p>
<div class="sourceCode" id="cb21"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb21-1"><a href="#cb21-1"></a>tbl1.col1 <span class="op">></span> <span class="dv">100</span> <span class="op">-</span> <span class="dv">1</span></span></code></pre></div></li>
<li><p>インデックスカラムに関数を通した値に対して条件指定</p>
<p>悪い例:</p>
<div class="sourceCode" id="cb22"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb22-1"><a href="#cb22-1"></a><span class="co">/* NGパターン 右辺に関数を通してください */</span></span>
<span id="cb22-2"><a href="#cb22-2"></a><span class="fu">to_char</span>(tbl1.col1, <span class="st">'YYYYMMDD'</span>) <span class="op">></span> <span class="st">'20151231'</span></span></code></pre></div>
<p>良い例:</p>
<div class="sourceCode" id="cb23"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb23-1"><a href="#cb23-1"></a>tbl1.col1 <span class="op">>=</span> <span class="fu">to_date</span>(<span class="st">'20160101'</span>, <span class="st">'YYYYMMDD'</span>)</span></code></pre></div></li>
<li><p>インデックスカラムを<code>OR</code>で条件指定(禁止ではないが原則行わない)</p>
<p>悪い例:</p>
<div class="sourceCode" id="cb24"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb24-1"><a href="#cb24-1"></a>(</span>
<span id="cb24-2"><a href="#cb24-2"></a> <span class="co">/* NGパターンINDEXが利用されない場合があります。他の方法を検討してください */</span></span>
<span id="cb24-3"><a href="#cb24-3"></a> tbl1.col1 <span class="op">=</span> <span class="dv">1</span></span>
<span id="cb24-4"><a href="#cb24-4"></a> <span class="kw">or</span> tbl1.col1 <span class="op">=</span> <span class="dv">2</span></span>
<span id="cb24-5"><a href="#cb24-5"></a> )</span></code></pre></div></li>
</ul></li>
</ul>
</section>
<section id="挿入" data-number="3.2">
<h2 data-number="3.2"><span class="header-section-number">3.2</span> 挿入</h2>
<p>挿入処理におけるコーディング規約を下記に示す。</p>
<ul>
<li>全列ワイルドカード「<code>*</code>」の使用はせず、カラム名を明記する。</li>
</ul>
</section>
<section id="更新" data-number="3.3">
<h2 data-number="3.3"><span class="header-section-number">3.3</span> 更新</h2>
<p>更新処理におけるコーディング規約を下記に示す。</p>
<ul>
<li>主キーの値の UPDATE は原則行わない。外部キーがあればエラーになる。<br />
外部キーが無い場合でも、事実上、主キーの値を利用して、検索、更新する場合は、リンクが切れてしまう。</li>
<li>パーティションキーの UPDATE は原則行わない。</li>
<li>VIEW を使用するデータ更新は禁止。更新は実表に対して行う。</li>
</ul>
</section>
<section id="削除" data-number="3.4">
<h2 data-number="3.4"><span class="header-section-number">3.4</span> 削除</h2>
<p>削除処理におけるコーディング規約を下記に示す。</p>
<ul>
<li>大量件数(数百万件レベル)の delete 文発行は避ける。</li>
</ul>
</section>
<section id="distinct-句" data-number="3.5">
<h2 data-number="3.5"><span class="header-section-number">3.5</span> DISTINCT 句</h2>
<p>DISTINCT は、暗黙のソート処理が行われる可能性があるため性能劣化につながる。<br />
EXISTS 句の使用・代替を検討すること。</p>
<p>悪い例:</p>
<div class="sourceCode" id="cb25"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb25-1"><a href="#cb25-1"></a><span class="kw">select</span></span>
<span id="cb25-2"><a href="#cb25-2"></a> <span class="kw">distinct</span></span>
<span id="cb25-3"><a href="#cb25-3"></a> d.<span class="kw">no</span> <span class="kw">as</span> dept_no</span>
<span id="cb25-4"><a href="#cb25-4"></a>, d.name <span class="kw">as</span> dept_name</span>
<span id="cb25-5"><a href="#cb25-5"></a><span class="kw">from</span></span>
<span id="cb25-6"><a href="#cb25-6"></a> department d</span>
<span id="cb25-7"><a href="#cb25-7"></a>, employee e</span>
<span id="cb25-8"><a href="#cb25-8"></a><span class="kw">where</span></span>
<span id="cb25-9"><a href="#cb25-9"></a> d.<span class="kw">no</span> <span class="op">=</span> e.dept_no <span class="co">-- 社員が一人以上属している部門を取得</span></span></code></pre></div>
<p>良い例:</p>
<div class="sourceCode" id="cb26"><pre class="sourceCode sql"><code class="sourceCode sql"><span id="cb26-1"><a href="#cb26-1"></a><span class="kw">select</span></span>
<span id="cb26-2"><a href="#cb26-2"></a> d.<span class="kw">no</span> <span class="kw">as</span> dept_no</span>
<span id="cb26-3"><a href="#cb26-3"></a>, d.name <span class="kw">as</span> dept_name</span>
<span id="cb26-4"><a href="#cb26-4"></a><span class="kw">from</span></span>
<span id="cb26-5"><a href="#cb26-5"></a> department d</span>
<span id="cb26-6"><a href="#cb26-6"></a><span class="kw">where</span></span>
<span id="cb26-7"><a href="#cb26-7"></a> <span class="kw">exists</span>(</span>
<span id="cb26-8"><a href="#cb26-8"></a> <span class="kw">select</span></span>
<span id="cb26-9"><a href="#cb26-9"></a> <span class="dv">1</span></span>
<span id="cb26-10"><a href="#cb26-10"></a> <span class="kw">from</span></span>
<span id="cb26-11"><a href="#cb26-11"></a> employee e</span>
<span id="cb26-12"><a href="#cb26-12"></a> <span class="kw">where</span></span>
<span id="cb26-13"><a href="#cb26-13"></a> d.<span class="kw">no</span> <span class="op">=</span> e.dept_no <span class="co">-- 社員が一人以上属している部門を取得</span></span>
<span id="cb26-14"><a href="#cb26-14"></a> )</span></code></pre></div>
</section>
<section id="in-句-1" data-number="3.6">
<h2 data-number="3.6"><span class="header-section-number">3.6</span> IN 句</h2>
<p>IN 句は最大 1000 個まで指定できるが、200 個程度でも ORA エラーが発生するケースがある。<br />
また IN 句の少しだけ異なる SQL が大量に発行されると CPU 高騰やメモリ枯渇を招く。<br />
従って 100 を超えるような長い IN 句は使用せず、一時表を利用して <code>in (select ・・・ from 一時表)</code>のように書き換える。</p>
</section>
<section id="not-in-句" data-number="3.7">
<h2 data-number="3.7"><span class="header-section-number">3.7</span> NOT IN 句</h2>
<p>原則<code>not in(select~)</code>は使用せずに、<code>not exists (select~)</code>を使用する。<br />
<code>NOT IN</code>句は、内部的にソートマージの結合をすることでテーブルをフルスキャンする場合があるため、性能が悪化する可能性がある。</p>
</section>
<section id="union-句" data-number="3.8">
<h2 data-number="3.8"><span class="header-section-number">3.8</span> UNION 句</h2>
<p><code>union</code>は<code>distinct</code>処理が含まれパフォーマンス上問題があるため、<code>union all</code>を使用する。</p>
</section>
<section id="select-for-update" data-number="3.9">
<h2 data-number="3.9"><span class="header-section-number">3.9</span> SELECT FOR UPDATE</h2>
<ul>
<li><code>select for update</code>で複数行にロックをかける場合、同時実行されるとデットロックを起こす可能性があるため、1件のロックでない場合は<code>order by</code>を指定する。</li>
</ul>
</section>
<section id="分析関数" data-number="3.10">
<h2 data-number="3.10"><span class="header-section-number">3.10</span> 分析関数</h2>
<p>分析関数の使用は可能だが、性能悪化を招く恐れがあるため、特性を知らない方は DBA に相談する。</p>
</section>
<section id="インデックス" data-number="3.11">
<h2 data-number="3.11"><span class="header-section-number">3.11</span> インデックス</h2>
<p>インデックスの必要性については DBA で最終判断するため、必要とする場合は DBA へ相談する。</p>
</section>
<section id="外部結合" data-number="3.12">
<h2 data-number="3.12"><span class="header-section-number">3.12</span> 外部結合</h2>
<p>外部結合する際、内部表(駆動表)はなるべく想定件数の少ない表にする。</p>
<hr />
</section>
</section>
<section id="license" data-number="4">
<h1 data-number="4"><span class="header-section-number">4</span> License</h1>
<p><a href="https://creativecommons.org/licenses/by/4.0/deed.ja"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFgAAAAfCAMAAABUFvrSAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAEZ0FNQQAAsY58+1GTAAAAAXNSR0IB2cksfwAAAW5QTFRF////////////////7+/v39/f1tXV09bS0tXS0tXR0dTR0dTQ0NTQ0NPPz9PPztLOztHNzdHNzdHMz8/PzdDMzNDMzNDLzM/Ly8/Ly8/Ky87Kys3Jyc3Jyc3IyMzIyMzHx8vHxsrGxsrFxcnFxcnExMnExMjDw8jDxMfDw8fCwsfCwcXAwMXAwMW/wMS/v8S+v8O+vsO+vsK9vcK9vcK8v7+/vMG8vMG7vMC8u8C7u8C6ur+6ur+5ub65ub64uL23t7y2tru1tbq0tLqztLmzs7iysrixsrexsbewsbawsLavsLWvr7Wur7SusLOvrrStrrOtr7KvrbOsrLKrr6+vq7Gqn6OenqCdn5+flpmWk5iTkZSRkZORj4+PiYyJhIaEhIWEgoWCgICAfX98fH98eXx5cHJvcHBwYGBgXV5dUFFQUFBQQ0RDQEBAPj8+NTY1MjMxMDAwKSkpKCkoICAgGxsbEBAQDg4ODQ4NAAAAlzoSDQAAAAN0Uk5TAAoO5yEBUwAAAvhJREFUeNq1lutX2kAQxWmXFDVGYy1EIjQ2VZDiu1CsRQQURYvV+qSKj6II8rANYOT+9z0JqIASo9Y5ydkP2f2d2Ts7d2N4jRcJgwEIBwO+SbdTFGw8ZzZz1n5BdLgnfLPBcCT6fW1jY3P78QEYEA76PWMu0W5lGbrNZGrrYNg+u+ga9fgVcmxtY/NJZAOCfs+IY4Bn6eN8RdlEJX9Ed1uFIfdnfzC8uBJbv5tyqqhMLKa0wQHPiEOwMInLW4Eu9xmzfdDtmQ0uLK3cSXmvBBTS6QJQ2tMC+8YcgpnOApAzSa83mZEBZIff2odGfYFQJNqc8s4VchQhhFA5XO1pgCddAxaFKyeNpBpxGSgNmwXXxMxcWE25fkkJGUIIoExESQPsFnkmC0gUuQmjBGQZq+j2BEKR5dUGLVLIvbkGkxxSrcHO92wCkIyENJL3u+2O8Zng/FJsvR5cRF0GFIqtwaKVvoTcSxrCKOOS7hPdXwLhxUYtUFC+Z6AKQgpoDRZ6joEkaYo4cMQKril/KLLcCE4TVYmqFmkNsK0rD9lIiDdXKCSrwwEhREae6Ve0WIiuPg3M0xVlW171BBe21CGjbLbSYR0c/To3H409TQquHTggREKZ8pbjEiRqqxxXtWjjRLdvLrzUAK4Vr5qwZvEsJsCrzExWF9Tk9gIm84e74BRyRN9xeyS4vkHSmg1yK4Wxt5yUIClDayn0t3SteLWq3RQvjQrN31O87e2dEiBl0tJDJmTrykImN8dtq6AOpIw8Y3OMf2s+bvptU+hJqFrc1yCfpmZDkWYX0mv0H9WWpvS2tH6w8z27e58JJVi7c2ImuNBkQvrBOOWZc0CqsyFKtU3+97OuaQBnXGe90RuTMvCHtpziuWCcmDvPm64m+t2vlmuq/YHqqwnGCcfs1l+mCcbSmgtSe8iDGQNnPEsnrq//fZrltXS4tk3oAOPvT2tPF91uMrXTDNv340JrjQ4hbsHAxeE0z1ksHD99eKFdl0dl/P//Cl+9EPcfS+yBAoqk3eUAAAAASUVORK5CYII=" alt="CC-By-4.0" /></a></p>
</section>
</body>
</html>