PostgreSQL 12.4文書のまとめノート　4章

#### [PostgreSQL 12.4文書](https://www.postgresql.jp/document/12/html/)ノート
※まとめノートです。自分の視点で書いたコードがたまに混ざっております。ライセンスは下部に記載しております。

#### パート II. SQL言語

#### 第4章 SQLの構文
##### 4.1. 字句の構造
> SQLの入力は、ひと続きのコマンドからなります。 コマンドはトークンが繋がったもので構成され
> トークンはキーワード、識別子、引用符で囲まれた識別子、リテラル（もしくは定数）、特別な文字シンボルです。 トークンは通常空白（スペース、タブ、改行）で区切られますが、曖昧さがなければ（一般的には特別な文字が他のトークン型と隣接している場合のみ）必要ありません。
> コメントはトークンではなく、その効果は空白と同じです。

> 例えばUPDATEコマンドでは、SETトークンが特定の位置に常に記述されなければなりませんし、この例で使われているINSERTコマンドを完結するためにはVALUESトークンが必要です。
- トークンとかあまり意識してなかったのでためになる。

##### 4.1.1. 識別子とキーワード
> 上記の例に出てくるSELECT、UPDATE、もしくはVALUESのようなトークンは、キーワードの一例です。
> **キーワードとは、SQL言語で決まった意味を持っている単語**です。 
> **MY_TABLEトークンやAトークンは識別子の一例**です。 これらは、使われるコマンドによって、テーブル、列、他のデータベースオブジェクトの名前を識別します。 したがって、単に「名前」と呼ばれることもあります。 キーワードと識別子は同じ字句の構造を持つため、言語を知らなくてはトークンが識別子なのかキーワードなのかわからないということになります。

- 繰り返しだが、列名やテーブル名は識別子でselect文やfrom句などSQL言語で決められた意味がある単語がキーワード。

> 標準SQLでは、数字を含む、あるいはアンダースコアで始まったり終わったりするキーワードは定義されていません。 したがって、この形式の識別子は標準の今後の拡張と競合する可能性がないという意味で安全と言えます。

- 機会があるか知らないが、以下のように列名に数字やアンスコを入れておけば列名やアンスコだと一発でわかるわけか、設計の思想的なものを感じる。

> 
```
DROP TABLE SAMPLE3_;
CREATE TABLE SAMPLE3_(
    _ID INTEGER,
    ID3 INTEGER,
    _ID4 INTEGER
);
INSERT INTO SAMPLE3_(_ID,ID3,_ID4)VALUES(1,2,3);
INSERT INTO SAMPLE3_(_ID,ID3,_ID4)VALUES(1,2,3);
INSERT INTO SAMPLE3_(_ID,ID3,_ID4)VALUES(1,2,3);
SELECT *
FROM SAMPLE3_;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/b68b9fe8-ccf3-5f5e-5b02-0f757d38c4c7.png)

> 引用符が付かない名前は常に小文字に解釈されますが、識別子を引用符で囲むことによって大文字と小文字が区別されるようになります。 例えば、識別子FOO、foo、"foo"はPostgreSQLによれば同じものとして解釈されますが、"Foo"と"FOO"は、これら3つとも、またお互いに違ったものとして解釈されます （PostgreSQLが引用符の付かない名前を小文字として解釈することは標準SQLと互換性がありません。標準SQLでは引用符の付かない名前は大文字に解釈されるべきだとされています。 したがって標準SQLによれば、fooは"FOO"と同じであるべきで、"foo"とは異なるはずなのです。 もし移植可能なアプリケーションを書きたいならば、特定の名前は常に引用符で囲むか、あるいはまったく囲まないかのいずれかに統一することをお勧めします）。

##### 4.1.2. 定数
> PostgreSQLには、3つの暗黙に型付けされる定数があります。 文字列、ビット文字列、そして数字です。 定数は明示的な型で指定することもでき、その場合はシステムによる、より正確な表現と効率の良い操作が可能になります。
###### 4.1.2.1. 文字列定数
> SQLにおける文字列定数は、単一引用符（'）で括られた任意の文字の並びです。
    - 'This is a string'
- 文字列定数内に単一引用符を含めるには、2つ続けて単一引用符を記述します。
    - 'I''m ben.'
    
```SELECT 'foo'
'bar';
は、

SELECT 'foobar';
と同じです。しかし、

SELECT 'foo'      'bar';
は有効な構文ではありません
```
↑標準SQLの仕様。
###### 4.1.2.2. C形式エスケープでの文字列定数
###### 4.1.2.3. Unicodeエスケープがある文字列定数

> posgreではunicode文字列定数が定数として設定されており、Unicodeエスケープ文字列定数は、U&'foo'と書ける。引用符の中で、Unicode文字はバックスラッシュとそれに続く４桁１６進数の文字コード番号で、またはもう１つの方法として、バックスラッシュに続いてプラス符号、そして続いた６桁１６進数の文字コード番号によりエスケープ形式で指定されます。
- 文字列'data'は次のように書かれます。

- 「\+６桁１６進数」と「\+４桁１６進数」が混在した表記法？で表記されたunicode文字列定数data
    - U&'d\0061t\+000061';
\+４桁１６進数のみで表記されたunicode文字列定数 data
    - E'\u0064\u0061\u0074\u0061';


###### 4.1.2.4. ドル記号で引用符付けされた文字列定数

> ドル引用符付けされた文字列定数は、
ドル記号（$）、省略可能な0個以上の文字からなる「タグ」、ドル記号、文字列定数を構成する任意の文字の並び、ドル記号、この引用符付けの始めに指定したものと同じタグ、ドル記号から構成されます。 例えば、「Dianne's horse」という文字列をドル引用符付けを使用して指定する方法を、以下に2つ示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/10032161-781b-023e-9afa-6919224b4133.png)

###### 4.1.2.5. ビット文字列定数
###### 4.1.2.6. 数値定数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/3538910d-19e2-a0b9-aaed-3a34f3006ef5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/455242cd-1ce9-a981-1661-edb02040a8f9.png)

- 整数入力
~32bit integer型
~64bit bigint型
それ以外 numeric型

- 少数あるいは指数入力あるいは両方
~numeric型

###### 4.1.2.7. 他の型の定数
以下の形式で型変換、型指定できる。

```
select CAST ('1234' AS smallint);
select bigint '12345';
select '12345'::bigint
```
##### 4.1.3. 演算子
##### 4.1.4. 特殊文字
> コロン（:）は、配列から「一部分」を取り出すために使われます (8.15を参照してください)。 いくつかのSQL方言（埋め込みSQLなど）では、コロンは変数名の接頭辞として使われます。

> アスタリスク（*）は、いくつかの文脈において、テーブル行や複合型の全てのフィールドを表現するために使用されます。 また、集約関数の引数として使われる場合も特殊な、つまり、その集約が明示的なパラメータをまったく必要としないという意味を持ちます。
##### 4.1.5. コメント
> コメントは、その後の構文解析が行われる前に入力ストリームから取り去られ、事実上、空白で置き換えられます。
##### 4.1.6. 演算子の優先順位
- 二項演算子は被作用子が２つある演算子、単項演算子は久代牛が１つだけの演算子
> 二項演算子と単項演算子を組み合わせて使う場合は括弧を加える必要がある場合があります。 例えば下記のような場合です。
`SELECT 5 ! - 6;`

この例で単項演算子は!(階乗)、二項演算子は-(マイナス)である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/440ac423-76c1-c1a7-d1fb-e93eadb0de1f.png)

>パーサは!が中置ではなく接尾演算子として定義されていることに最後まで気が付かない

> 中置記法（ちゅうちきほう、infix notation）とは、数式やプログラムを記述する方法（記法）の一種。 演算子を操作対象の中間に記述することから、このように呼ばれる。

- 中置であると解釈するとは5と6が等しくないときに使用する!=の文脈として解釈してしまうということか？

##### 4.1.4. 特殊文字
##### 4.1.5. コメント
##### 4.1.6. 演算子の優先順位
##### 4.2. 評価式
##### 4.2.1. 列の参照
##### 4.2.2. 位置パラメータ
##### 4.2.3. 添字
##### 4.2.4. フィールド選択
##### 4.2.5. 演算子の呼び出し
##### 4.2.6. 関数呼び出し
##### 4.2.7. 集約式
##### 4.2.8. ウィンドウ関数呼び出し
##### 4.2.9. 型キャスト
##### 4.2.10. 照合順序式
##### 4.2.11. スカラ副問い合わせ
##### 4.2.12. 配列コンストラクタ
##### 4.2.13. 行コンストラクタ
##### 4.2.14. 式の評価規則
##### 4.3. 関数呼び出し
##### 4.3.1. 位置表記の使用
##### 4.3.2. 名前付け表記の使用
##### 4.3.3. 混在表記の利用




<details><summary>ライセンス</summary><div>

法的告知

Copyright © 1996-2020 PostgreSQLはPostgreSQLグローバル開発チームが著作権を有します。

Copyright © 1994-1995 Postgres95はカリフォルニア大学評議員が著作権を有します。

Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies. [訳注：日本語は参考程度と解釈してください。] 上記の著作権表示、および 本段落と続く2つの段落を全てのコピーに含めることを条件として、無料かつ 書面による許可なしに、このソフトウェアとドキュメントの使用、複製、改変、 頒布をどのような目的にでも許可します。

IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. カリフォルニア大学は、いかなる当事者に対しても、利益の喪失を含む、 直接的、間接的、特別、偶然あるいは必然的にかかわらず生じた 損害について、たとえカリフォルニア大学がこれらの損害の可能性について 知らされていたとしても、一切の責任を負いません。

THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN 「AS-IS」 BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. カリフォルニア大学は、商用目的における暗黙の保証と、特定目的での 適合性に関してはもとより、これらに限らず、いかなる保証もしません。 以下に用意されたソフトウェアは「そのまま」を基本原理とし、 カリフォルニア大学はそれを維持、支援、更新、改良あるいは修正する 義務を負いません。

</div></details>