ねぎとろ放浪記

ねぎとろ放浪記

個人的備忘録です。勉強したことをまとめていきます。

基本情報で使うSQL①

SQLは午前にも午後にも関係していて確実な得点源になる!らしいです。

基本的な構文だけ理解していれば解けるのではと思ったのでまとめました。

近日中に続編を書きます。

目次(この記事で扱う文法)


この記事では以下の表を操作します。
member表

 id | name | age | gender 
----+------+-----+--------
  1 | 佐藤 |  22 |      1
  2 | 鈴木 |  23 |      2
  3 | 高橋 |  25 |      2
  4 | 後藤 |  30 |      1
  5 | 村井 |  35 |      2
  6 | 佐藤 |  55 |       
  7 | 鈴木 |  45 |      2
  8 | 加藤 |  65 |      2
  9 | 佐藤 |  46 |      1
 10 | 藤井 |  38 |      2


基本から (SELECT, FROM)

SELECT "カラム名" FROM "テーブル名"でテーブルから指定した列を取り出します。

SELECT name, age
FROM member;

実行結果

 name | age 
------+-----
 佐藤 |  22
 後藤 |  30
 佐藤 |  46
 鈴木 |  23
 高橋 |  25
 村井 |  35
 鈴木 |  45
 加藤 |  65
 藤井 |  38
 佐藤 |  55

SELECTの後に選択するカラムを記述します。
FROMの後に扱う表を記述します。

上記の例では「mamber」表から「name」と「age」のカラムを選択しています。

SELECT *とすると全てのカラムを選択します。

条件指定 (WHERE)

WHERE で条件を指定できます。

SELECT name, gender
FROM member
WHERE gender = 1;

実行結果

 name | gender 
------+--------
 佐藤 |      1
 後藤 |      1
 佐藤 |      1

WHEREの後ろに条件を記述します。
ここでは"gender"が1の行を選択しています。

他にも様々な演算子が使用できます。

演算子 意味
< 小なり
> 大なり
<= 以下
>= 以上
!= 等しくない

複数の条件を指定する(AND, OR)

AND,ORを使うことで複数の条件を指定できます。

SELECT name, age
FROM ex_table
WHERE name = '佐藤' 
AND age > 30;

実行結果

 name | age 
------+-----
 佐藤 |  46
 佐藤 |  55

nameが"佐藤"で30歳より大きい人を選択しました。

3つ以上の条件を指定することも可能です。

SELECT name, age
FROM member
WHERE age = 20
OR age = 30
OR age = 40;


範囲で指定 (BETWEEN)

BETWEEN a AND bを使うことで範囲を指定できます。

SELECT name, age
FROM member
WHERE age BETWEEN 20 AND 30;

実行結果

 name | age 
------+-----
 佐藤 |  22
 後藤 |  30
 鈴木 |  23
 高橋 |  25

20歳以上30歳以下の人を選択しました。

条件一致 (IN)

IN ()を使うことで()内の値に一致する行のみ取り出せます。

SELECT name, age
FROM member
WHERE name IN ('佐藤', '高橋', '後藤');

実行結果

 name | age 
------+-----
 佐藤 |  22
 後藤 |  30
 佐藤 |  46
 高橋 |  25
 佐藤 |  55

()内の値に一致するかを確かめます。

あいまい検索 (LIKE)

LIKE '文字列'で部分一致検索を行うことができます。

ワイルドカード文字と同時に使用します。

  • % : 0文字以上の任意の文字列
  • _ : 任意の1文字

使い方

  • LIKE '_通り' → 東通り、西通り など
  • LIKE '%山%' → 富士山、登山客 など
SELECT name, age
FROM member
WHERE name LIKE '%藤%';

実行結果

 name | age 
------+-----
 佐藤 |  22
 後藤 |  30
 佐藤 |  46
 加藤 |  65
 藤井 |  38
 佐藤 |  55

名前に”藤”が入る人を選択しました。

IS NULL

nullかどうかを判定します。

SELECT name, age, gender
FROM member
WHERE gender IS NULL;

実行結果

 id | name | age | gender 
----+------+-----+--------
  6 | 佐藤 |  55 |   

genderがnullになっています。

合計 (SUM)

SUM (カラム名) で指定したカラムの合計値を得ます。

SELECT SUM(age)
FROM member;

実行結果

 sum 
-----
 384

全員の年齢の合計値です。

平均 (AVG)

AVG (カラム名)で平均を計算できます。

SELECT AVG(age)
FROM member;

実行結果

         avg         
---------------------
 38.4000000000000000

平均年齢です。

最大・最小 (MAX, MIN)

MAXMINで最大最小を取り出せます。

SELECT MAX(age), MIN(age)
FROM member;

実行結果

 max | min 
-----+-----
  65 |  22

最大65歳で最小22歳です。

カウント (COUNT)

COUNT (カラム名)で値が存在する行を数えられます。

SELECT COUNT(gender)
FROM member;

実行結果

 count 
-------
     9

値が存在するgenderカラムは9個あることがわかりました。
nullはカウントされません。

重複を避けてカウントするならDISTINCTを使います。

SELECT COUNT(DISTINCT name)
FROM member;

実行結果

 count 
-------
     7

nameは7種類あります。

グループ化する (GROUP BY)

GROUP BY カラム名値が同じ行をまとめることができます。

複数の列をGROUP BYに指定することも可能です。

SELECT name
FROM member
GROUP BY name;

実行結果

 name 
------
 佐藤
 後藤
 藤井
 鈴木
 村井
 高橋
 加藤

佐藤と鈴木は複数いましたが、1つの行になっています。

条件指定 (HAVING)

GROUP BY した結果に対して絞り込みを行うときはHAVINGを使います。

SELECT name, COUNT(name), AVG(age)
FROM member
GROUP BY name
HAVING COUNT(*) >= 2;

実行結果

 name | count |         avg         
------+-------+---------------------
 佐藤 |     3 | 41.0000000000000000
 鈴木 |     2 | 34.0000000000000000

GROUP BYで名前ごとにまとめて、HAVINGで2つ以上あった名前のみに絞っています。

重複行をまとめる (DISTINCT)

重複した行を一つにまとめて表示します。

SELECT DISTINCT name
FROM member;

実行結果

 name 
------
 佐藤
 後藤
 藤井
 鈴木
 村井
 高橋
 加藤

佐藤と鈴木は複数ありましたが、1行にまとめられています。

並び替え (ORDER BY)

ORDER BY カラム名で指定したカラムで並び替えることができます。

SELECT name, age
FROM member
ORDER BY age;

実行結果

 name | age 
------+-----
 佐藤 |  22
 鈴木 |  23
 高橋 |  25
 後藤 |  30
 村井 |  35
 藤井 |  38
 鈴木 |  45
 佐藤 |  46
 佐藤 |  55
 加藤 |  65

年齢の小さい順に並び替えられました。

ORDER BY age DESCとすると降順になります。

以上が基本的な文法でした。

過去問では、副問合せや相関問合せも出題されていたので、近日中にまとめようと思います。