-
Notifications
You must be signed in to change notification settings - Fork 1
/
common.xml
2407 lines (2289 loc) · 150 KB
/
common.xml
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
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE chapter>
<chapter xmlns="http://docbook.org/ns/docbook" version="5.0" xml:id="common" xml:lang="ru">
<info>
<title>Общие элементы языка</title>
</info>
<para>В этой главе рассматриваются элементы, которые являются общими для всех реализаций языка
SQL — выражения, которые используются для извлечения и работают на утверждениях о данных, и
предикатов, которые проверяют истинность этих утверждений.</para>
<section xml:id="common-expr">
<info>
<title>Выражения</title>
</info>
<para>Выражения SQL представляют формальные методы для вычисления, преобразования и
сравнения значений. Выражения SQL могут включать в себя столбцы таблиц, переменные,
константы, литералы, различные операторы и предикаты, а так же другие выражения. Полный
список допустимых символов (tokens) в выражениях описан ниже.</para>
<para>
<table xml:id="common-tbl-elem" frame="all">
<?dbfo keep-together='auto'?>
<title>Описание элементов языка</title>
<tgroup cols="2">
<colspec colname="colElem" colnum="1" colwidth="2*" align="left"/>
<colspec colname="colDesc" colnum="2" colwidth="5*" align="justify"/>
<thead>
<row valign="middle">
<entry align="center">Элемент</entry>
<entry align="center">Описание</entry>
</row>
</thead>
<tbody>
<row>
<entry>Имя столбца</entry>
<entry>Идентификаторы столбцов из указанных таблиц, используемые в
вычислениях, или сравнениях, или в качестве условия поиска. Столбец
типа массив не может быть элементом выражения, если только он не
проверяется на IS [NOT] NULL.</entry>
</row>
<row>
<entry>Элементы массива</entry>
<entry>В выражении может содержаться ссылка на элемент массива, т.е.
<replaceable><array_name>[s]</replaceable>, где
<replaceable>s</replaceable> — индекс элемента в массиве
<replaceable><array_name></replaceable>.</entry>
</row>
<row>
<entry>Арифметические операторы</entry>
<entry>Символы +, -, *, / используемые для вычисления значений.</entry>
</row>
<row>
<entry>Оператор конкатенации</entry>
<entry>Оператор || используется для соединения символьных строк.
</entry>
</row>
<row>
<entry>Логические операторы</entry>
<entry>Зарезервированные слова NOT, AND и OR используются при
комбинировании простых условий поиска для создания сложных
утверждений.</entry>
</row>
<row>
<entry>Операторы сравнения</entry>
<entry>Символы =, <>, !=, ~=, ^=, <, <=, >, >=, !<,
~<, ^<, !>, ~> и ^>.</entry>
</row>
<row>
<entry>Предикаты сравнения</entry>
<entry>LIKE, STARTING WITH, CONTAINING, SIMILAR TO, BETWEEN, IS [NOT]
NULL и IS [NOT] DISTINCT FROM</entry>
</row>
<row>
<entry>Предикаты существования</entry>
<entry>Предикаты, используемые для проверки существования значений в
наборе. Предикат IN может быть использован как с наборами констант,
так и со скалярными подзапросами. Предикаты EXISTS, SINGULAR, ALL
ANY, SOME могут быть использованы только с подзапросами.</entry>
</row>
<row>
<entry>Константы</entry>
<entry>Числа, заключённые в апострофы строковые литералы, логические
значения TRUE, FALSE и UNKNOWN, псевдозначение NULL.</entry>
</row>
<row>
<entry>Литералы дат</entry>
<entry>Выражения, подобные строковым литералам, заключённые в
апострофах, которые могут быть интерпретированы как значения даты,
времени или даты-времени. Литералами дат могут быть предварительно
объявленные литералы ('TODAY', 'NOW' и т.д.) или строки из символов
и чисел, такие как '25.12.2016 15:30:35', которые могут быть
преобразованы в дату, время или дату с временем.</entry>
</row>
<row>
<entry>Контекстные переменные</entry>
<entry>Встроенные <link linkend="internalfunc-contextvar">контекстные
переменные</link>.</entry>
</row>
<row>
<entry>Локальные переменные</entry>
<entry>Локальные переменные, входные или выходные параметры PSQL модулей
(хранимых процедур, триггеров, анонимных блоков PSQL). </entry>
</row>
<row>
<entry>Позиционные параметры</entry>
<entry>В DSQL в качестве параметров запроса могут быть использованы
только позиционные параметры. Позиционные параметры представляют
собой знаки вопроса (?) внутри DSQL оператора. Доступ к таким
параметрам осуществляется по его номеру (позиции в запросе
относительно предыдущего позиционного параметра) поэтому они
называются позиционными. Обычно компоненты доступа позволяют
работать с именованными параметрами, которые они сами
преобразовывают в позиционные.</entry>
</row>
<row>
<entry>Подзапросы</entry>
<entry>Оператор SELECT заключённый в круглые скобки, который возвращает
одно единственное (скалярное) значение или множество значений (при
использовании в предикатах существования).</entry>
</row>
<row>
<entry>Идентификаторы функций</entry>
<entry>Идентификаторы встроенных или внешних функций в функциональных
выражениях.</entry>
</row>
<row>
<entry>Приведения типа</entry>
<entry>
<para>Выражение явного преобразования одного типа данных в другой
<programlisting>
CAST(<replaceable><value></replaceable> AS <replaceable><datatype></replaceable>)
</programlisting>
или сокращённое (для даты/времени) преобразование типа
<programlisting>
<replaceable><datatype></replaceable> <replaceable><value></replaceable>
</programlisting>
например <function>DATE '25.12.2016'</function>
</para>
</entry>
</row>
<row>
<entry>Условные выражения</entry>
<entry>Выражение CASE и встроенные функции COALESCE, NULLIF.</entry>
</row>
<row>
<entry>Круглые скобки</entry>
<entry>Пара скобок ( ... ) используются для группировки выражений.
Операции внутри скобок выполняются перед операциями вне скобок. При
использовании вложенных скобок, сначала вычисляются значения самых
внутренних выражений, а затем вычисления перемещаются наверх по
уровням вложенности. </entry>
</row>
<row>
<entry>Предложение COLLATE</entry>
<entry>Предложение применяется к типам CHAR и VARCHAR, чтобы в указанной
кодировке установить параметры сортировки, используемые при
сравнении.</entry>
</row>
<row>
<entry><database>NEXT VALUE FOR</database>
<replaceable>sequence</replaceable></entry>
<entry>Конструкция NEXT VALUE FOR позволяет получить следующее значение
последовательности, то же самое делает встроенная функция GEN_ID().
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<section xml:id="common-expr-constants">
<info>
<title>Константы</title>
</info>
<para>Константа это значение, подставляемое непосредственно в SQL оператор, которое не
получено из выражения, параметра, ссылки на столбец или переменной. Константой может
быть строка или число.</para>
<section xml:id="common-expr-string-constants">
<title>Строковые константы (литералы)</title>
<para>Строковая константа это последовательность символов, заключенных между парой
апострофов (<quote>одинарных кавычек</quote>). Максимальная длина строковой
константы составляет 65535 байт; максимальная количество символов будет
определяться количеством байт, используемых для кодирования каждого
символа.</para>
<note>
<para>
<itemizedlist>
<listitem>
<para>Двойные кавычки <emphasis>не должны</emphasis> (допускаются 1
диалектом) использоваться для квотирования строк. В SQL они
предусмотрены для других целей.</para>
</listitem>
<listitem>
<para>Если литерал апострофа требуется в строковой константе, то он
может быть <quote>экранирован</quote> другим предшествующим
апострофом. Например,
<programlisting>
'Mother O''Reilly's home-made hooch'
</programlisting>
</para>
</listitem>
<listitem>
<para>Необходимо быть осторожным с длиной строки, если значение
должно быть записано в столбец типа
<database>VARCHAR</database>. Максимальная длина строки для типа
<database>VARCHAR</database> составляет 32765 байт (32767
для типа CHAR). Если значение должно быть записано в столбец
типа <database>BLOB</database>, то максимальная длина строкового
литерала составляет 65535 байт.</para>
</listitem>
</itemizedlist>
</para>
<para>Предполагается, что набор символов строковой константы совпадает с набором
символов столбца предназначенного для её сохранения. </para>
</note>
<section xml:id="common-expr-string-constants-hexstrings">
<title>Строковые константы в шестнадцатеричной нотации</title>
<para>Начиная с Firebird 2.5 строковые константы могут быть записаны в
шестнадцатеричной нотации, так называемые <quote>двоичные строки</quote>.
Каждая пара шестнадцатеричных цифр определяет один байт в строке. Строки
введённые таким образом будут иметь кодировку OCTETS по умолчанию, но <link
linkend="common-expr-string-constants-introducer">вводный синтаксис
(introducer syntax)</link> может быть использован для принудительной
интерпретации строки в другом наборе символов. </para>
<formalpara>
<title>Синтаксис:</title>
<para>
<programlisting>
{x|X}'<replaceable><hexstring></replaceable>'
<replaceable><hexstring></replaceable> ::= an even number of <replaceable><hexdigit></replaceable>
<replaceable><hexdigit></replaceable> ::= 0..9 | A..F | a..f
</programlisting>
</para>
</formalpara>
<formalpara>
<title>Примеры:</title>
<para>
<informalexample>
<para><programlisting language="sql">
SELECT x'4E657276656E' FROM rdb$database
-- returns 4E657276656E, a 6-byte 'binary' string
SELECT _ascii x'4E657276656E' FROM rdb$database
-- returns 'Nerven' (same string, now interpreted as ASCII text)
SELECT _iso8859_1 x'53E46765' FROM rdb$database
-- returns 'Säge' (4 chars, 4 bytes)
SELECT _utf8 x'53C3A46765' FROM rdb$database
-- returns 'Säge' (4 chars, 5 bytes)
</programlisting></para>
</informalexample>
</para>
</formalpara>
<note>
<para> Как будут отображены двоичные строки зависит от интерфейса клиента.
Например, утилита <application>isql</application> использует заглавные
буквы A-F, в то время как <application>FlameRobin</application> буквы в
нижнем регистре. Другие могут использовать другие правила
конвертирования, например отображать пробелы между парами байт: '4E 65
72 76 65 6E'. </para>
<para> Шестнадцатеричная нотация позволяет вставить любой байт (включая 00)
в любой позиции в строке. </para>
</note>
</section>
<section xml:id="common-expr-string-constants-introducer">
<title>Вводный синтаксис для строковых литералов</title>
<para>При необходимости, строковому литералу может предшествовать имя набор
символов, который начинается с префикса подчеркивания <quote>_</quote>. Это
известно как вводный синтаксис (Introducer syntax). Его цель заключается в
информировании Firebird о том, как интерпретировать и хранить входящую
строку.</para>
<formalpara>
<title>Примеры:</title>
<para>
<informalexample>
<para><programlisting language="sql">
-- обратите внимание на префикс '_'
INSERT INTO People
VALUES (_ISO8859_1 'Hans-Jörg Schäfer');
</programlisting></para>
</informalexample>
</para>
</formalpara>
</section>
</section>
<section xml:id="common-expr-number-constants">
<title>Числовые константы</title>
<para>Числовая константа — это любое правильное число в одной из поддерживаемых
нотаций: <itemizedlist>
<listitem>
<para>В SQL, для чисел в стандартной десятичной записи, десятичная точка
всегда представлена символом точки и тысячи не разделены. Включение
запятых, пробелов, и т.д. вызовет ошибки.</para>
</listitem>
<listitem>
<para>Экспоненциальная запись, например число 0.0000234 может быть
записано как <literal>2.34e-5</literal>.</para>
</listitem>
<listitem>
<para>Шестнадцатеричная запись (см. ниже) чисел поддерживается начиная с
Firebird 2.5.</para>
</listitem>
</itemizedlist>
</para>
<section xml:id="common-expr-number-constants-hex">
<title>Шестнадцатеричная нотация чисел</title>
<para>Начиная с Firebird 2.5 целочисленные значения могут быть записаны в
шестнадцатеричной системе счисления. Числа состоящие из 1-8
шестнадцатеричных цифр будут интерпретированы как INTEGER, состоящие из 9-16
цифр — как BIGINT. </para>
<formalpara>
<title>Синтаксис:</title>
<para>
<programlisting>
{x|X}<replaceable><hexdigits></replaceable>
<replaceable><hexdigits></replaceable> ::= 1-16 of <replaceable><hexdigit></replaceable>
<replaceable><hexdigit></replaceable> ::= 0..9 | A..F | a..f
</programlisting>
</para>
</formalpara>
<formalpara>
<title>Примеры:</title>
<para>
<informalexample>
<para><programlisting language="sql">
SELECT 0x6FAA0D3 FROM rdb$database -- returns 117088467
SELECT 0x4F9 FROM rdb$database -- returns 1273
SELECT 0x6E44F9A8 FROM rdb$database -- returns 1850014120
SELECT 0x9E44F9A8 FROM rdb$database -- returns -1639646808 (an INTEGER)
SELECT 0x09E44F9A8 FROM rdb$database -- returns 2655320488 (a BIGINT)
SELECT 0x28ED678A4C987 FROM rdb$database -- returns 720001751632263
SELECT 0xFFFFFFFFFFFFFFFF FROM rdb$database -- returns -1
</programlisting></para>
</informalexample>
</para>
</formalpara>
</section>
<section xml:id="common-expr-number-constants-hex-valrange">
<title>Диапазон значений шестнадцатеричных чисел</title>
<para><itemizedlist>
<listitem>
<para>Шестнадцатеричные числа в диапазоне 0 .. 7FFF FFFF являются
положительными INTEGER числа со значениями 0 .. 2147483647. Для
того, чтобы интерпретировать константу как BIGINT число
необходимо дописать необходимо количества нулей слева. Это
изменит тип, но не значение. </para>
</listitem>
<listitem>
<para>Числа в диапазоне 8000 0000 .. FFFF FFFF требуют особого
внимания: <itemizedlist>
<listitem>
<para>При записи восемью шестнадцатеричный числами,
такие как 0x9E44F9A8, интерпретируется как 32-битное
целое. Поскольку крайний левый (знаковый) бит
установлен, то такие числа будут находится в
отрицательном диапазоне -2147483648 .. -1. </para>
</listitem>
<listitem>
<para>Числа предварённые одним или несколькими нулями,
такие как 0x09E44F9A8, будут интерпретированы как
64-разрядный BIGINT в диапазоне значений 0000 0000
8000 0000 .. 0000 0000 FFFF FFFF. В этом случае
знаковый бит не установлен, поэтому они отображаются
в положительном диапазоне 2147483648 .. 4294967295
десятичных чисел.</para>
<para>Таким образом, только в этом диапазоне числа,
предварённые совершенно незначимым нулём, имеют
кардинально разные значения. Это необходимо
знать.</para>
</listitem>
</itemizedlist></para>
</listitem>
<listitem>
<para>Шестнадцатеричные числа в диапазоне 1 0000 0000 .. 7FFF FFFF
FFFF FFFF являются положительными BIGINT числами.</para>
</listitem>
<listitem>
<para>Шестнадцатеричные числа в диапазоне 8000 0000 0000 0000 ..
FFFF FFFF FFFF FFFF являются отрицательными BIGINT
числами.</para>
</listitem>
<listitem>
<para>Числа с типом SMALLINT не могут быть записаны в
шестнадцатеричном виде, строго говоря, так как даже 0x1
оценивается как INTEGER. Тем не менее, если вы записываете
положительное целое число в пределах 16-разрядного диапазона от
0x0000 (десятичный ноль) до 0x7FFF (десятичное 32767), то оно
будет преобразовано в SMALLINT прозрачно.</para>
<para>Вы можете записать отрицательное SMALLINT число в
шестнадцатеричном виде используя 4-байтное шестнадцатеричное
число в диапазоне от 0xFFFF8000 (десятичное -32768) до
0xFFFFFFFF (десятичное -1).</para>
</listitem>
</itemizedlist></para>
</section>
</section>
</section>
<section xml:id="common-expr-operators">
<info>
<title>Операторы SQL</title>
</info>
<para>SQL операторы включают в себя операторы для сравнения, вычисления, оценки и
конкатенации значений.</para>
<section xml:id="common-expr-operators-prioritet">
<info>
<title>Приоритет операторов</title>
</info>
<para>Приоритет определяет порядок, в котором операторы и получаемые с помощью них
значения вычисляются в выражении. </para>
<para>Все операторы разбиты на 4 типа. Каждый тип оператора имеет свой приоритет.
Чем выше приоритет типа оператора, тем раньше он будет вычислен. Внутри одного
типа операторы имеют собственный приоритет, который также определяет порядок их
вычисления в выражении. Операторы с одинаковым приоритетом вычисляются слева
направо. Для изменения порядка вычислений операции могут быть сгруппированы с
помощью круглых скобок. </para>
<para>
<table xml:id="common-tbl-operpreced" frame="all">
<?dbfo keep-together='auto'?>
<title>Приоритеты типов операторов</title>
<tgroup cols="3">
<colspec colname="c1" colnum="1" colwidth="1*" align="left"/>
<colspec colname="c2" colnum="2" colwidth="1*" align="center"/>
<colspec colname="c3" colnum="3" colwidth="3*" align="justify"/>
<thead>
<row valign="middle">
<entry align="center">Тип оператора</entry>
<entry align="center">Приоритет</entry>
<entry align="center">Пояснение</entry>
</row>
</thead>
<tbody>
<row valign="middle">
<entry>Конкатенация</entry>
<entry>1</entry>
<entry>Строки объединяются до выполнения любых других операций.
</entry>
</row>
<row valign="middle">
<entry>Арифметический</entry>
<entry>2</entry>
<entry>Арифметические операции выполняются после конкатенации
строк, но перед выполнением операторов сравнения и
логических операций.</entry>
</row>
<row valign="middle">
<entry>Сравнение</entry>
<entry>3</entry>
<entry>Операции сравнения вычисляются после конкатенации строк и
выполнения арифметических операций, но до логических
операций.</entry>
</row>
<row valign="middle">
<entry>Логический</entry>
<entry>4</entry>
<entry>Логические операторы выполняются после всех других типов
операторов.</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
</section>
<section xml:id="common-expr-operators-concat">
<info>
<title>Оператор конкатенации</title>
</info>
<para>Оператор конкатенации (||) соединяет две символьные строки и создаёт одну
строку. Символьные стоки могут быть константами или значениями, полученными из
столбцов или других выражений. </para>
<formalpara>
<title>Пример:</title>
<para>
<informalexample>
<para><programlisting language="sql">
SELECT LAST_NAME || ', ' || FIRST_NAME AS FULL_NAME
FROM EMPLOYEE
</programlisting></para>
</informalexample>
</para>
</formalpara>
</section>
<section xml:id="common-expr-operators-arith">
<info>
<title>Арифметические операторы</title>
</info>
<para>
<table xml:id="common-tbl-arithpreced" frame="all">
<?dbfo keep-together='auto'?>
<title>Приоритет арифметических операторов</title>
<tgroup cols="3">
<colspec colname="c1" colnum="1" colwidth="1*" align="center"/>
<colspec colname="c2" colnum="2" colwidth="2*" align="center"/>
<colspec colname="c3" colnum="3" colwidth="1*" align="center"/>
<thead>
<row valign="middle">
<entry align="center">Оператор</entry>
<entry align="center">Назначение</entry>
<entry align="center">Приоритет</entry>
</row>
</thead>
<tbody>
<row valign="middle">
<entry><command>+</command></entry>
<entry>Унарный плюс</entry>
<entry>1</entry>
</row>
<row valign="middle">
<entry><command>-</command></entry>
<entry>Унарный минус</entry>
<entry>1</entry>
</row>
<row valign="middle">
<entry><command>*</command></entry>
<entry>Умножение</entry>
<entry>2</entry>
</row>
<row valign="middle">
<entry><command>/</command></entry>
<entry>Деление</entry>
<entry>2</entry>
</row>
<row valign="middle">
<entry><command>+</command></entry>
<entry>Сложение</entry>
<entry>3</entry>
</row>
<row valign="middle">
<entry><command>-</command></entry>
<entry>Вычитание</entry>
<entry>3</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<formalpara>
<title>Пример:</title>
<para>
<informalexample>
<para><programlisting language="sql">
UPDATE T
SET A = 4 + 1/(B-C)*D
</programlisting></para>
</informalexample>
</para>
</formalpara>
</section>
<section xml:id="common-expr-operators-comp">
<info>
<title>Операторы сравнения</title>
</info>
<para>
<table xml:id="common-tbl-compar" frame="all">
<?dbfo keep-together='auto'?>
<title>Операторы сравнения</title>
<tgroup cols="3">
<colspec colname="c1" colnum="1" colwidth="1*" align="center"/>
<colspec colname="c2" colnum="2" colwidth="2*" align="center"/>
<colspec colname="c3" colnum="3" colwidth="2*" align="center"/>
<thead>
<row valign="middle">
<entry align="center">Оператор</entry>
<entry align="center">Назначение</entry>
<entry align="center">Приоритет</entry>
</row>
</thead>
<tbody>
<row valign="middle">
<entry><command>IS</command></entry>
<entry>Проверяет, что выражение в левой части является псевдо
значением NULL или соответствует логическому значению в
правой части.</entry>
<entry>1</entry>
</row>
<row valign="middle">
<entry><command>=</command></entry>
<entry>Равно, идентично</entry>
<entry>2</entry>
</row>
<row valign="middle">
<entry><command><>, !=, ~=, ^=</command></entry>
<entry>Не равно</entry>
<entry>2</entry>
</row>
<row valign="middle">
<entry><command>></command></entry>
<entry>Больше</entry>
<entry>2</entry>
</row>
<row valign="middle">
<entry><command><</command></entry>
<entry>Меньше</entry>
<entry>2</entry>
</row>
<row valign="middle">
<entry><command>>=</command></entry>
<entry>Больше или равно</entry>
<entry>2</entry>
</row>
<row valign="middle">
<entry><command><=</command></entry>
<entry>Меньше или равно</entry>
<entry>2</entry>
</row>
<row valign="middle">
<entry><command>!>, ~>, ^></command></entry>
<entry>Не больше</entry>
<entry>2</entry>
</row>
<row valign="middle">
<entry><command>!<, ~<, ^<</command></entry>
<entry>Не меньше</entry>
<entry>2</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>В эту же группу входят предикаты сравнения <link
linkend="common-predicats-othercompare-distinct">IS DISTINCT FROM</link>,
<link linkend="common-predicats-othercompare-between">BETWEEN</link>, <link
linkend="common-predicats-existence-in">IN</link>, <link
linkend="common-predicats-othercompare-like">LIKE</link>, <link
linkend="common-predicats-othercompare-containing">CONTAINING</link>, <link
linkend="common-predicats-othercompare-starting">SIMILAR TO</link> и другие. </para>
<formalpara>
<title>Пример:</title>
<para>
<informalexample>
<para><programlisting language="sql">
IF (SALARY > 1400) THEN
...
</programlisting></para>
</informalexample>
</para>
</formalpara>
<formalpara>
<title>См. также:</title>
<para>
<link linkend="common-predicats-othercompare">Другие предикаты
сравнения</link>. </para>
</formalpara>
</section>
<section xml:id="common-expr-operators-logic">
<info>
<title>Логические операторы</title>
<keywordset>
<keyword>NOT</keyword>
<keyword>AND</keyword>
<keyword>OR</keyword>
</keywordset>
</info>
<indexterm><primary>NOT</primary></indexterm>
<indexterm><primary>AND</primary></indexterm>
<indexterm><primary>OR</primary></indexterm>
<para>
<table xml:id="common-tbl-logical" frame="all">
<?dbfo keep-together='auto'?>
<title>Приоритет логических операторов</title>
<tgroup cols="3">
<colspec colname="c1" colnum="1" colwidth="1*" align="center"/>
<colspec colname="c2" colnum="2" colwidth="2*" align="justify"/>
<colspec colname="c3" colnum="3" colwidth="1*" align="center"/>
<thead>
<row valign="middle">
<entry align="center">Оператор</entry>
<entry align="center">Назначение</entry>
<entry align="center">Приоритет</entry>
</row>
</thead>
<tbody>
<row valign="middle">
<entry><command>NOT</command></entry>
<entry>Отрицание условия поиска.</entry>
<entry>1</entry>
</row>
<row valign="middle">
<entry><command>AND</command></entry>
<entry>Объединяет два предиката и более, каждый из которых
должен быть истинным, чтобы истинным был и весь
предикат.</entry>
<entry>2</entry>
</row>
<row valign="middle">
<entry><command>OR</command></entry>
<entry>Объединяет два предиката и более, из которых должен быть
истинным хотя бы один предикат, чтобы истинным был и весь
предикат.</entry>
<entry>3</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<formalpara>
<title>Пример:</title>
<para>
<informalexample>
<para><programlisting language="sql">
IF (A > B OR (A > C AND A > D) AND NOT (C = D)) THEN
...
</programlisting></para>
</informalexample>
</para>
</formalpara>
</section>
</section>
<section xml:id="common-expr-nextvalue">
<info>
<title>NEXT VALUE FOR</title>
<keywordset>
<keyword>NEXT VALUE FOR</keyword>
</keywordset>
</info>
<indexterm><primary>NEXT VALUE FOR</primary></indexterm>
<formalpara>
<title>Доступно в:</title>
<para>DSQL, PSQL.</para>
</formalpara>
<formalpara>
<title>Синтаксис:</title>
<para><programlisting>
NEXT VALUE FOR <replaceable>sequence-name</replaceable>
</programlisting></para>
</formalpara>
<para>Возвращает следующее значение в последовательности (SEQUENCE). SEQUENCE является
SQL совместимым термином генератора в InterBase и Firebird. Оператор NEXT VALUE FOR
полностью эквивалентен функции GEN_ID (seq, n) и является рекомендуемым синтаксисом. </para>
<formalpara>
<title>Пример:</title>
<para>
<informalexample>
<para><programlisting language="sql">
NEW.CUST_ID = NEXT VALUE FOR CUSTSEQ;
</programlisting>
</para>
</informalexample>
</para>
</formalpara>
<note>
<para>NEXT VALUE FOR не поддерживает значение приращения, отличное от того, что было
указано при создании последовательности в предложении INCREMENT [BY]. Если
требуется другое значение шага, то используйте старую функцию GEN_ID.</para>
</note>
<formalpara>
<title>См. также:</title>
<para>
<link linkend="ddl-sequence">SEQUENCE (GENERATOR)</link>, <link
linkend="internalfunc-func-gen-gen_id">GEN_ID</link>. </para>
</formalpara>
</section>
<section xml:id="common-expr-cond">
<info>
<title>Условные выражения</title>
</info>
<para>Условное выражение — это выражение, которое возвращает различные значения в
зависимости от истинности некоторого условия или условий. В данном разделе описано
лишь одно условное выражение CASE. Остальные условные выражения являются
производными встроенными функциями и описаны в разделе <link
linkend="internalfunc">Скалярные функции</link>.</para>
<section xml:id="common-expr-cond-case">
<info>
<title>CASE</title>
<keywordset>
<keyword>CASE</keyword>
</keywordset>
</info>
<indexterm><primary>CASE</primary></indexterm>
<formalpara>
<title>Доступно в:</title>
<para>DSQL, ESQL.</para>
</formalpara>
<para>Оператор CASE возвращает только одно значение из нескольких возможных. Есть
два синтаксических варианта: </para>
<para>
<itemizedlist spacing="compact">
<listitem>
<para>Простой CASE, сравнимый с Pascal case или C switch;</para>
</listitem>
<listitem>
<para>Поисковый CASE, который работает как серия операторов <command>if
... else if ... else if</command>.</para>
</listitem>
</itemizedlist>
</para>
<simplesect xml:id="common-expr-cond-case-simple">
<title>Простой CASE</title>
<formalpara>
<title>Синтаксис:</title>
<para><programlisting>
CASE <replaceable><test-expr></replaceable>
WHEN <replaceable><expr></replaceable> THEN <replaceable><result></replaceable>
[WHEN <replaceable><expr></replaceable> THEN <replaceable><result></replaceable> ...]
[ELSE <replaceable><defaultresult></replaceable>]
END
</programlisting></para>
</formalpara>
<para>При использовании этого варианта
<replaceable><test-expr></replaceable> сравнивается с
<replaceable><expr></replaceable> 1,
<replaceable><expr></replaceable> 2 и т.д. до тех пор, пока не
будет найдено совпадение, и тогда возвращается соответствующий результат.
Если совпадений не найдено, то возвращается
<replaceable>defaultresult</replaceable> из ветви ELSE. Если нет
совпадений, и ветвь ELSE отсутствует, возвращается значение NULL.</para>
<para>Совпадение эквивалентно оператору <quote><command>=</command></quote>,
т.е. если <replaceable><test-expr></replaceable> имеет значение NULL,
то он не соответствует ни одному из <replaceable><expr></replaceable>,
даже тем, которые имеют значение NULL.</para>
<para>Результаты не обязательно должны быть литеральными значениями, они также
могут быть именами полей, переменными, сложными выражениями или NULL. </para>
<formalpara>
<title>Пример:</title>
<para>
<informalexample>
<para><programlisting language="sql">
SELECT
NAME,
AGE,
CASE UPPER(SEX)
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
ELSE 'Unknown'
END AS SEXNAME,
RELIGION
FROM PEOPLE
</programlisting></para>
</informalexample>
</para>
</formalpara>
<para>Сокращённый вид простого оператора CASE используется в функции <link
linkend="internalfunc-func-case-decode">DECODE</link>. </para>
</simplesect>
<simplesect xml:id="common-expr-cond-case-search">
<title>Поисковый CASE</title>
<formalpara>
<title>Синтаксис:</title>
<para><programlisting>
CASE
WHEN <replaceable><bool_expr></replaceable> THEN <replaceable><result></replaceable>
[WHEN <replaceable><bool_expr></replaceable> THEN <replaceable><result></replaceable> …]
[ELSE <replaceable><defaultresult></replaceable>]
END
</programlisting></para>
</formalpara>
<para>Здесь <replaceable><bool_expr></replaceable> выражение, которое даёт
тройной логический результат: TRUE, FALSE или NULL. Первое выражение,
возвращающее TRUE, определяет результат. Если нет выражений, возвращающих
TRUE, то в качестве результата берётся
<replaceable>defaultresult</replaceable> из ветви ELSE. Если нет
выражений, возвращающих TRUE, и ветвь ELSE отсутствует, результатом будет
NULL.</para>
<para>Как и в простом операторе CASE, результаты не обязаны быть литеральными
значениями: они могут быть полями или именами переменных, сложными
выражениями, или NULL.</para>
<formalpara>
<title>Пример:</title>
<para>
<informalexample>
<para><programlisting language="sql">
CANVOTE = CASE
WHEN AGE >= 18 THEN 'Yes'
WHEN AGE < 18 THEN 'No'
ELSE 'Unsure'
END;
</programlisting></para>
</informalexample>
</para>
</formalpara>
</simplesect>
</section>
</section>
<section xml:id="common-expr-null">
<info>
<title>NULL в выражениях</title>
<keywordset>
<keyword>NULL</keyword>
</keywordset>
</info>
<indexterm><primary>NULL</primary></indexterm>
<para>В SQL NULL не является значением — это состояние, указывающее, что значение
элемента неизвестно или не существует. Это не ноль, не пустота, не <quote>пустая
строка</quote>, и оно не ведёт себя как какое-то из этих значений. </para>
<para>При использовании NULL в числовых, строковых выражениях или в выражениях,
содержащих дату/время, в результате вы всегда получите NULL. При использовании NULL
в логических (булевых) выражениях результат будет зависеть от типа операции и других
вовлечённых значений. При сравнении значения с NULL результат будет неопределённым
(UNKNOWN). </para>
<important>
<para>Неопределённый логический результат (UNKNOWN) тоже представлен
псевдо-значением NULL. </para>
</important>
<section xml:id="common-expr-null-expr">
<info>
<title>Выражения возвращающие NULL</title>
</info>
<para>Выражения в этом списке всегда возвратят NULL:
<literallayout class="monospaced">
1 + 2 + 3 + NULL
'Home ' || 'sweet ' || NULL
MyField = NULL
MyField <> NULL
NULL = NULL
not (NULL)
</literallayout>
Если вам трудно понять, почему, вспомните, что NULL — значит
<quote>неизвестно</quote>.</para>
</section>
<section xml:id="common-expr-null-logicexpr" status="Переписать">
<info>
<title>NULL в логических выражениях</title>
</info>
<para>Мы уже рассмотрели, что not (NULL) даёт в результате NULL. Для операторов and
(логическое И) и or (логическое ИЛИ) взаимодействие несколько сложнее:
<literallayout class="monospaced">
NULL or false = NULL
NULL or true = true
NULL or NULL = NULL
NULL and false = false
NULL and true = NULL
NULL and NULL = NULL
</literallayout>
</para>
<formalpara>
<title>Примеры:</title>
<para>
<informalexample>
<para><programlisting language="sql">
(1 = NULL) OR (1 <> 1) -- возвратит NULL
(1 = NULL) OR (1 = 1) -- возвратит TRUE
(1 = NULL) OR (1 = NULL) -- возвратит NULL
(1 = NULL) AND (1 <> 1) -- возвратит FALSE
(1 = NULL) AND (1 = 1) -- возвратит NULL
(1 = NULL) AND (1 = NULL) -- возвратит NULL
</programlisting></para>
</informalexample>
</para>
</formalpara>
</section>
</section>
</section>
<section xml:id="common-subquery">
<title>Подзапросы</title>
<para> Подзапрос — это специальный вид выражения, которое фактически является запросом
SELECT к другой таблице, включённый в спецификацию основного запроса. Подзапросы пишутся
как обычные SELECT запросы, но должны быть заключены в круглые скобки. Выражения
подзапроса используется следующими способами: </para>
<itemizedlist spacing="compact">
<listitem>
<para>Для задания выходного столбца в списке выбора SELECT;</para>
</listitem>
<listitem>
<para>Для получения значений или условий для предикатов поиска (предложения WHERE,
HAVING).</para>
</listitem>
</itemizedlist>
<section xml:id="common-subquery-corr">
<title>Коррелированные подзапросы</title>
<para>Подзапрос может быть коррелированным (соотнесённым). Запрос называется
соотнесённым, когда оба, и внутренний, и внешний, запросы взаимозависимы. Это
означает, что для обработки каждой записи внутреннего запроса, должна быть получена
также запись внешнего запроса, т.е. внутренний запрос всецело зависит от внешнего. </para>
<formalpara>
<title>Пример коррелированного подзапроса:</title>
<para>
<informalexample>
<para>
<programlisting language="sql">
SELECT *
FROM Customers C
WHERE EXISTS
(SELECT *
FROM Orders O
WHERE C.cnum = O.cnum
AND O.adate = DATE '10.03.1990');
</programlisting>
</para>