見出し画像

SQLでデータを加工する

重複するデータを除く


 「DISTINCT」を用いることで、「SELECT」でテーブルから取得したデータの内重複するデータを除くことができる。

SELECT DISTINCT(カラム名)
FROM テーブル名;
SELECT DISTINCT(name)
FROM purchases;
  1. purchasesテーブルの

  2. nameカラムを重複せず(一つにまとめて)に取得する

 同一人物のレコードが複数ある場合、重複を除かないと同一人物のデータがいくつも取得される。「DISTINCT」を使うと「太郎」さんのレコードが複数あっても「太郎」さんと言うnameカラムのデータは一つだけ取得してくれる。

四則演算を活用する


 「SELECT」で取得するカラムに四則演算を使用すると、計算した結果を取得することができる。例えば、購入金額がpriceカラムでデータが保存されている場合、消費税10%を加味した価格を取得することができる。

SELECT name, price * 1.1
FROM purchases;

 nameカラムに商品名、priceカラムに金額が保存されている場合、取得結果では「商品名」「price * 1.1」のデータを取得できる。

関数を利用する


合計を求める


 「SUM」を使用することで、指定したカラムに保存されているデータの合計値を求めることができる。

SELECT SUM(カラム名)
FROM テーブル名;
SELECT SUM(price)
FROM purchases;

 また、「WHERE」と併用することができ、条件を指定することができる。

SELECT SUM(price)
FROM purchases
WHERE user_name = "太郎"
  1. purchasesテーブルから

  2. user_nameカラムの値が「太郎」のデータを検索し

  3. priceカラムの値の合計値を計算し取得する

平均を求める


 「AVG」を使用することで、指定したカラムに保存されているデータの平均値を求めることができる。

SELECT AVG(カラム名)
FROM テーブル名;
SELECT AVG(price)
FROM purchases;

 また、「WHERE」と併用することができ、条件を指定することができる。

SELECT AVG(price)
FROM purchases
WHERE user_name = "太郎"
  1. purchasesテーブルから

  2. user_nameカラムの値が「太郎」のデータを検索し

  3.  priceカラムの値の平均値を計算し取得する

データの数を求める


 「count」を使用すると、指定したカラムに保存されているデータの合計数(いくつ保存されているか)を計算できる。データがnull(空)の場合は計算に含まれない。

SELECT COUNT(カラム名)
FROM テーブル名;
SELECT COUNT(price)
FROM purchases;

  nullのデータも含めて数を求める場合は、カラム名の代わりに「*」を指定し、保存されているレコードの数を計算する。

SELECT COUNT(*)
FROM purchases;

 また、「WHERE」と併用することができ、条件を指定することができる。

SELECT COUNT(*)
FROM purchases
WHERE user_name = "太郎"
  1. purchasesテーブルから

  2. user_nameが「太郎」のレコードを検索し

  3. レコードの数を計算し取得する

最大・最小を求める


 「MAX」を使用すると、指定したカラムのデータから最大のデータを求めることができる。「MIN」を使用すると、指定したカラムのデータから最小のデータを求めることができる。どちらもSELECTで取得したカラムに指定する。

SELECT MAX(カラム名)
FROM テーブル名;

SELECT MIN(カラム名)
FROM テーブル名;
SELECT MAX(price)
FROM purchases;

SELECT MIN(price)
FROM purchases;

 また、「WHERE」と併用することができ、条件を指定することができる。

SELECT MAX(price)
FROM purchases;
WHERE user_name = "太郎";
  1. purchasesテーブルから

  2. user_nameカラムが「太郎」のデータを検索し

  3. 最大値を取得する

データをグループ化する


 「GROUP BY」を用いることで、指定したカラム名の中で完全に一致するデータを持つレコード同士をグループ化することができる。

SELECT カラム名
FROM テーブル名
GROUP BY カラム名;

 例えば、保存されいるデータから購入日ごとの金額の合計を取得したい場合は以下のようにする。

SELECT SUM(price), purchased_at
FROM purchases
GROUP BY purchased_at;
  1. purchased_atカラムでレコードをグループ化し

  2. purchasesテーブルから

  3. priceカラム(金額)の合計とpurchased_at(購入日)の値をグループごとに取得する

 なお、「GROUP BY」を使用する場合に「SELECT」で指定できるのは、集計関数と「GROUP BY」で指定しているカラム名のみである。

複数のカラムを使ってグループ化する


 複数のカラムを指定してグループ化する場合、カラム同士を「,」で繋げる。各ユーザーの購入日ごとの金額の合計を求める場合は以下のようになる。

SELECT SUM(price), purchased_at, user_name
FROM purchases
GROUP BY purchased_at, user_name;

条件を指定してデータをグループ化する


 「GROUP BY」は「WHERE」と併用できる。その場合は、「WHERE」の後に「GROUP BY」でグループ化するカラムを指定する。

SELECT SUM(price), purchased_at, user_name
FROM purchases
WHERE category = "食費"
GROUP BY purchased_at, user_name;
  1. categoryカラムのデータが「食費」であるレコードを検索し

  2. purchased_atとuser_nameのカラムでグループ化し

  3. purchasesテーブルからSUM(price)(金額の合計を計算)とpurchased_at(日付)とuser_name(ユーザー名)を取得する

グループしたデータから特定の条件のデータを求める


 「HAVING」を用いると、「GROUP BY」からさらに条件を絞ることができる。「GROUP BY」の後に「HAVING」を記述する。

SELECT SUM(price), purchased_at
FROM purchases
GROUP BY purchased_at
HAVING SUM(price) > 1000;
  1. purchased_atカラムの値によってレコードをグループ化し

  2. purchasesテーブルから

  3. SUM(price)とpurchased_atのデータを取得し

  4. さらにSUM(price)の値が1000より大きいデータを取得する

以上、SQLでデータを加工する方法をまとめました。