0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

検索したデータの形成 SQL

Posted at

 データの結合

  • CONCAT関数
ターミナル
SELECT CONCATfamily_name,first_name FROM users;
# こうするとfamily_nameとfirst_nameが結合する。
# このようにいくつかのデータを用いて1つのデータを作りたいときにCONCAT関数を使う。
# ただ検索結果のカラム名はSQL文そのままとなっているので少し見にくくなる。

 検索結果のカラム名の変更

  • AS句

SELECT句でデータを取得するとき、AS句を併用するとそのカラムに別名をつけられる。

ターミナル
SELECT CONCAT(family_name,first_name) AS "氏名" FROM users;
# こうすることでfamily_nameとfirst_nameが連結し、連結したカラム名が"氏名"になる。
# またAS句は省略することができる。

SELECT CONCAT(family_name,first_name) "氏名" FROM users;
# AS句を省略した記述。

 重複する行の除外

  • DISTINCTキーワード
ターミナル
SELECT DISTINCT カラム名; #重複していれば一つしか表示しない。

 レコードのグループ化

  • GROUP BY句
    指定したカラムが同じ値を持つデータを一つのグループとしてまとめることができる。
ターミナル
GROUP BY カラム名;
# 実行するとDISTINCTと同じような結果が返ってくるが、表示されていないだけで内部ではグループ化されたデータが存在する。

 レコードの数を数える

  • COUNT関数

COUNT関数はグループ化されたデータに対して使用することができる集計関数の一つ。
グループ化されたデータに使用できる集計関数は他に、AVG(平均を求める),MAX(最大値を求める),MIN(最小値を求める)がある。
COUNT関数はカラムを指定して使用することで、そのカラムの値がNULLでないデータの行数を取得することができる。
GROUP BY句を併用している場合は、各グループがレコードを何個持っているかというデータを取得することができる。

ターミナル
SELECT COUNT(カラム名); #グループ化されているカラムを記述する。

SELECT COUNT(*); #ワイルドカードも使用できる。

テーブルの結合

  • JOIN

JOINを使用すると、指定したそれぞれのテーブルのカラムの値が一致するデータを結合することができる。
JOINはFROM句の後に記述し、結合の対象となるテーブルを指定する。

ターミナル
FROM テーブル名1 JOIN テーブル名2 ON テーブル名1.カラム名1 = テーブル名2カラム名2;

# 例えば
FROM shifts JOIN users ON shifts.user_id = users.id

# ONの後が冗長になるのでシンプルに書くなら
FROM shifts s JOIN users u ON s.user_id = u.id
# shiftsをs、usersをuと別名をつける。
# 別名をつけることができるAS句は省略することができる。

例文
(わかりやすく短文で区切ります)

ターミナル
SELECT
    CONCAT(family_name, first_name) "名前", #shiftsテーブルのfamily_nameと、first_nameを結合させ、名前という別名をつけ、表示させる。
    COUNT(*) "コマ数" #グループ化したデータの行数を表示する。(この場合user_idがグループ化されているので同じuser_idが何行あるのかが表示される。)ワイルドカード(*)を使用することでNULLであるレコードも含めて表示する。
FROM shifts s #shiftsテーブルから検索する。(shiftsテーブルにsという別名をつける。)
JOIN users u ON s.user_id = u.id #JOINで連結させたいusersテーブルを選択、ONで一致するカラムを選択し、連結させる。(usersテーブルにもuという別名をつけ、ONで別名を使用しカラム同士を連結させる。)
WHERE date = "2015-07-01" #dateカラムが2015-07-01のものを検索している。
GROUP BY user_id; #複数あるuser_idがグループ化される。

検索した結果からさらに検索

  • サブクエリ

例えば

ターミナル
SELECT DISTINCT user_id FROM shifts WHERE date = "2015-07-01";

のような検索結果があったとする。
まず上記のコードの説明。
FROM shiftsでshiftsテーブルを検索対象とし、WHEREでshiftsテーブルのdateカラムが2015-07-01のものを探し、SELECT DISTINCT user_idで重複しているuser_idを一つだけ表示させている。
つまり、dateカラムが2015-07-01に当てはまるuser_idを表示する。
この検索結果を踏まえて逆に2015-07-01に当てはまらないuser_idを調べたい。

その時の検索の仕方がこうだ。

ターミナル
SELECT * #カラムを全て取得
FROM users #usersテーブルの検索
WHERE id NOT IN ( #NOT IN()を使用し、()内の検索結果に当てはまらないレコードを取得する
  SELECT DISTINCT user_id
  FROM shifts
  WHERE date = "2015-07-01"
);

こうすることで()内に記述された検索結果に含まれないusersテーブルのレコードを取得できる。

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?