LOG

SQL書式メモ(読み)

ここではSQLでデータベース上のデータを閲覧する操作に限って書く。
事前知識に関しては、SQL操作をするための事前知識
MySQLに関しては、MySQL覚書


SELECT句

結果を表示するカラムを指定する。複数ある場合はカンマで区切る。
「*」で全フィールド表示が可能。

算術演算子(+,-,*,/,etc..)も使える

SELECT age * 10 FROM ...

別名を付けれる

「AS」を付けることでカラムに別名を付けることが出来る。
(テーブルを結合した場合などに発生するカラム名の衝突を防ぐことが出来る。)

SELECT master_table.name AS name1

スペースで区切ることで「AS」と同様の動作をする。(ASの省略)


FROM句

テーブルを指定する。複数ある場合はカンマで区切る。

別名を付けれる

SELECT句同様「AS」をつけることでテーブルに別名をつけることができる。

SELECT master.name FROM master_table AS master

複数のテーブルを結合する(複数のテーブルを紐付ける)

複数のテーブルを結合するには「JOIN節」を利用する。
詳細はJOIN節を参照


JOIN節

テーブルを結合する。
結合条件は「WHERE句」で指定する。
「JOIN」には種類がある。

種類説明補足
カンマ内部結合
JOIN内部結合
INNER JOIN内部結合
STRAIGHT JOIN左優先内部結合
OUTER JOIN外部結合
LEFT OUTER JOIN左優先外部結合OUTERは省略可能
RIGHT OUTER JOIN右優先外部結合OUTERは省略可能
NATURAL LEFT OUTER JOIN自然結合OUTERは省略可能
NATURAL RIGHT OUTER JOIN自然結合OUTERは省略可能

INNER (内部結合)

各テーブルで指定したカラムが一致するもののみ表示

...FROM a_table AS a INNER JOIN b_table AS b ON a.id = b.id 
  1. a_tableを取得
  2. b_tableを取得し、ONで指定した条件にマッチするレコードを探しマージする
  3. マッチするレコードが複数ある場合、マージしたものをそれぞれ別のレコードにする。

例えば

user_idname
1yokota
dog_idowner_idname
11pochi
21taro

の2つのテーブルがあり INNER JOIN した場合

user_idnamedog_idowner_idname
1yokota11pochi
1yokota21taro

となる。

参考&引用
INNER JOINとOUTER JOIN – 紳士なブログ
SELECT構文:JOINを使ってテーブルを結合する | Smart

OUTER JOIN (外部結合)

  • 各テーブルで指定したカラムが一致するもの
  • 「LEFT」「RIGHT」で指定したテーブルのレコード

の2点を表示

NATURAL (自然結合)

WHERE句で条件を指定しなくてもテーブル間で同じ名前のカラム名を使って結合が行われる。

「ON」の代わりに「USING」

結合する条件が同じカラム名であれば「ON」の代わりに「USING」が使える

... FROM a_table JOIN b_table ON a_table.name = b_table.name
↓
... FROM a_table JOIN b_table USING(name)

WHERE句

演算子を与えて検索条件を付ける。
結果はBoolean型にならないといけない。

...WHERE ( a = b ) AND ( ( c > d ) OR ( e != f ) )
演算子一覧
=等しい
>,<より大きい、より小さい
>=,<=以上、以下
!=,<>否定
ANDA かつ B
ORA または B
NOT否定
BETWEENpopulation BETWEEN 1000 AND 2000
IN複数指定した値のうちのどれか
IN(‘yokota’,’kenji’)
IS NULL
LIKE文字列のパターンマッチング

LIKE演算子

ワイルドカードによる検索
他に比べて遅い。

ワイルドカード
_任意の1文字にマッチ
%0個以上のの連続した文字にマッチ

ワイルドカードの文字列を検索したい場合は「\」でエスケープさせる。

参考&引用
SELECT構文:WHEREで検索条件を設定する | Smart

GROUP BY句

抽出したデータを指定したカラムでまとめたい場合にGROUP BYを利用する。
カラムで複数指定することができる。

また、グルーピングしたテーブルの並び順を「ASC(昇順)」「DESC(降順)」で指定できる。

...GROUP BY name,age desc ASC

上記内容はnameとageカラムが同じレコードをまとめる。


HAVING句

GROUP BY句でグルーピングした結果に対して
絞り込み検索を行う。
WHERE句との違いはグループ化する前か後かの違い

WHERE → GROUP BY → HAVING


ORDER BY句

抽出したデータの並び替えを行う

...ORDER BY id ASC
...ORDER BY id DESC

複雑なソート、例えば日本語でソートなどを行いたい場合は
関数を使う


LIMIT句、OFFSET句

LIMIT句は取得するデータの最大行数を指定できる。
OFFSET句は取得するデータの最初の行を指定できる。
5行目から200件取得したい場合は以下のようにする。

...LIMIT 200 OFFSET 5

※ OFFSETを指定する場合LIMIT句を省略することはできない。