sqlの基本を学んでいる最中ですが、構文が多くてこんがらがってきたので簡単にまとめました。
ややこしいところは自分なりの和訳つき。
抽出
レコードの抽出(全フィールド)
select * from テーブル名
レコードの抽出(指定フィールド)
select 表示するフィールド名(,区切りで) from テーブル名
条件のある抽出
select *(または指定フィールド) from テーブル名 where 条件式
比較演算子
select *(または指定フィールド) from テーブル名 where 指定フィールド < 条件
比較演算子 … = , < , > , <= , >=など
論理演算子
select *(または指定フィールド) from テーブル名 where 指定フィールド and 条件
論理演算子(処理の優先順に) … not 、 and 、 or
その他の演算子
--【範囲検索】 where フィールド名 between 最小値 and 最大値 --【いずれか検索】 where フィールド名 in (値1, 値2, 値3) --【あいまい検索】 where フィールド名 like パターン(「%」・・・0文字以上の文字列、「_」・・・任意の一文字)
レコードの並び替え
order by フィールド名 並び順(※)
※...desc(降順)/ asc(昇順・デフォルト省略可)
レコード数の制限
limit 開始位置(デフォルト0・省略可), レコード数(上限数)
集約関数
select 集約関数 from テーブル名
全レコード数を抽出
select count(*) from テーブル名
演算結果のグループ化
select 集約関数 from テーブル名 group by グループ化するフィールド名
文字数を数える
-- char_length(文字数を知りたいフィールド名) ex)select char_length(content) as 文字数 from posts; -- 「posts」テーブルから、contentフィールドの文字数を「文字数」というフィールド名として抜き出してね。
文字を抜き出す
-- substring(抜き出したいフィールド名, 何文字から, 何文字目まで) ex)select substring(content, 1, 10) as 抜粋文 from posts; --「posts」テーブルから、contentフィールドの1文字目から10文字目までを「抜粋文」というフィールド名として抜き出してね。
演算結果フィールドに別名をつける
select 集約関数 as 別名 from テーブル名
集約関数の結果に条件を付ける
where は使えないので、 having を使用する。
使い方はwhereと同じ。
select 集約関数 ( as 別名 ) from テーブル名 group by フィールド名 having 条件式;
結合
和結合
select 表示するフィールド名 from テーブル名 union オプション(※、省略可能) select 表示するフィールド名 from 結合するテーブル名
※ distinct(デフォルト)・・・重複は削除 、 all・・・重複も表示
内部結合
内部結合は、テーブル名と結合するテーブル名を「 join 」で繋げ、
両テーブルのどこのフィールドが一致しているのかを「 on 」で示す。
select 表示するテーブル名.フィールド名 from テーブル名 (inner) join 結合するテーブル名 on テーブル名.関連づけるフィールド名 = 結合するテーブル名.関連づけるフィールド名 ex)select -① posts.id, posts.title, posts.content, posts.user_id, users.name from posts join users -② on posts.user_id = users.id; -③ -- ①posts テーブルの id、title、content、user_idと、users テーブルのnameを表示してね。 -- ②posts テーブルに、usersテーブルをくっつけるんだよ。(内部結合) -- ③【postsテーブルのuser_id】は、【usersテーブルのid】と一緒だよ。
外部結合
外部結合は、テーブル名と結合するテーブル名を「 left join 」で繋げ、
両テーブルのどこのフィールドが一致しているのかを「 on 」で示す。
select 表示するテーブル名.フィールド名 from 全レコード表示するテーブル名 left (outer) join 結合するテーブル名 on 全レコード表示するフィールド名.関連づけるフィールド名 = 結合するテーブル名.関連づけるフィールド名 ex)select -① new_posts.id, new_posts.title, new_posts.content, new_posts.created, users.name from new_posts left join users -② on new_posts.user_id = users.id; -③ -- ①new_posts テーブルの id、title、content、createdと、users テーブルのnameを表示してね。 -- ②new_posts テーブルに usersテーブルをくっつけるんだよ。(外部結合) -- ③【new_postsテーブルのuser_id】は、 【usersテーブルのid】と一緒だよ。
相関名をつける
ex)select p.id, p.title, p.content, p.created, u.name from new_posts as p left join users as u -① on p.user_id = u.id order by p.created desc;
① の「from テーブル名」の部分に、「as 別名」をつけることで、その別名を他の箇所でも使うことができる。
抽出条件を保存する
一連の処理は、「ビュー」として保存しておくことができる。
create view ビュー名(フィールド名1, フィールド名2, フィールド名3) as 抽出条件のselect文;
保存したビューは、手PB売ると同じ扱いができる。
-- 表示してみる select 表示するフィールド名 from ビュー名;
ビューの削除
drop view ビュー名;