2️⃣

【SQL】データベースの基礎② - AND / OR, ORDERBY, LIMIT等 -

2023/09/24に公開

前回の続きから。以下も参照ください。
https://zenn.dev/ganmo3/articles/029c7f6b13b193

AND演算子とOR演算子

  • AND演算子
    「WHERE 条件1 AND 条件2」とすることで、条件1と条件2を共に満たすデータを検索できる。

  • OR演算子
    「WHERE 条件1 OR 条件2」とすることで、条件1または条件2のどちらかを満たすデータを検索することができる。

以下は例。

テーブルの例(Menus Table):

id name price category date_added
1 ハンバーガー 500 ファースト 2023-09-20
2 ピザ 800 イタリアン 2023-09-21
3 寿司 1200 和食 2023-09-22
4 カレー 600 インド料理 2023-09-23
5 ラーメン 700 和食 2023-09-24
条件演算子 説明 クエリ例
AND演算子 price > 600 AND price < 1000 2つの条件が両方成立する場合 SELECT * FROM Menus WHERE price > 600 AND price < 1000;
OR演算子 category = "イタリアン" OR category = "和食" いずれかの条件が成立する場合 SELECT * FROM Menus WHERE category = "イタリアン" OR category = "和食";
(category = "ピザ" OR category = "カレー") AND price < 700 グループ化して複数の条件を組み合わせる SELECT * FROM Menus WHERE (category = "ピザ" OR category = "カレー") AND price < 700;

ORDER BY

「ORDER BY」を使い、データを「昇順」「降順」に並び替えることができる。

ORDER BY句の例 説明 クエリ例
price ASC priceカラムを昇順にソート SELECT * FROM Menus ORDER BY price ASC;
price DESC priceカラムを降順にソート SELECT * FROM Menus ORDER BY price DESC;
date_added ASC date_addedカラムを昇順にソート SELECT * FROM Menus ORDER BY date_added ASC;
date_added DESC date_addedカラムを降順にソート SELECT * FROM Menus ORDER BY date_added DESC;
category ASC, price DESC categoryカラムを昇順、priceカラムを降順にソート SELECT * FROM Menus ORDER BY category ASC, price DESC;

LIMIT

「LIMIT データの件数;」を使うことで、「最大で何件取得するか」を指定できる。

sql
SELECT * FROM menus LIMIT 10;

ORDER BY & LIMIT

組み合わせることももちろん可能。

sql
SELECT * FROM menus ORDER BY price DESC LIMIT 10;

DISTINCT

「DISTINCT カラム名」とすることで、検索結果から指定したカラムの重複するデータを除くことができる。

テーブルの例(Menus Table):

id name price category date_added
1 ハンバーガー 500 ファースト 2023-09-20
2 ピザ 800 イタリアン 2023-09-21
3 寿司 1200 和食 2023-09-22
4 カレー 600 インド料理 2023-09-23
5 ラーメン 700 和食 2023-09-24
6 ピザ 800 イタリアン 2023-09-25
7 寿司 1200 和食 2023-09-26
DISTINCT句の例 説明 クエリ例
SELECT DISTINCT category FROM Menus categoryカラムの重複を削除し、一意の値を取得 SELECT DISTINCT category FROM Menus;
SELECT DISTINCT price FROM Menus priceカラムの重複を削除し、一意の値を取得 SELECT DISTINCT price FROM Menus;
SELECT DISTINCT name, price FROM Menus nameとpriceカラムの組み合わせで重複を削除 SELECT DISTINCT name, price FROM Menus;
SELECT DISTINCT category, price FROM Menus categoryとpriceカラムの組み合わせで重複を削除 SELECT DISTINCT category, price FROM Menus;
SELECT DISTINCT category, price FROM Menus WHERE price > 700 条件を組み合わせて重複を削除 SELECT DISTINCT category, price FROM Menus WHERE price > 700;

四則演算

「+, -, *, /」を使用し計算したデータの取得ができる
以下のような消費税を含んだ値を取得する。

sql
SELECT name, price * 1.1 FROM menus;

テーブルの例(Menus Table):

id name price price * 1.1
1 ハンバーガー 500 550.0
2 ピザ 800 880.0
3 寿司 1200 1320.0
4 カレー 600 660.0
5 ラーメン 700 770.0
6 ピザ 800 880.0
7 寿司 1200 1320.0

SUM関数とAVG関数

SUM関数

SUM関数は、データベースのテーブル内の数値列の合計を計算する。

sql
SELECT SUM(column_name) FROM table_name;

もちろん、SUM関数の使い方を具体例とともに解説します。

SUM関数は、データベースのテーブル内の数値列の合計を計算するのに使用されます。以下は、SUM関数の基本的な使い方です。

基本構文:

sql
SELECT SUM(column_name) FROM table_name;

以下は「Orders」テーブルの例。

OrderID ProductName Quantity Price
1 ラップトップ 2 1200
2 スマートフォン 3 800
3 タブレット 1 500
4 ラップトップ 1 1200
5 スマートフォン 2 800

このテーブルから、Price列の合計を計算するSQLクエリは次のようになる。

sql
SELECT SUM(Price) FROM Orders;

このクエリを実行すると、合計価格が計算される。
結果:

| SUM(Price) |
|------------|
| 3700       |

AVG関数

基本構文:

sql
SELECT AVG(column_name) FROM table_name;

上記例で計算すると以下の通りとなる。

sql
SELECT AVG(Price) FROM Orders;

結果:

| AVG(Price) |
|------------|
| 740        |

COUNT関数

COUNT関数は、データベースのテーブル内で行の数をカウントするために使用する。

基本構文:

sql
SELECT COUNT(*) FROM table_name;

上記Ordersテーブルを例にすると、SQLクエリは次のようになる。

sql
SELECT COUNT(*) FROM Orders;

結果:

| COUNT(*) |
|----------|
| 5        |

MAX・MIN関数

MAX関数は、データベースのテーブル内の数値列の最大値、MIN関数は、最小値を取得する。

基本構文:

sql
SELECT MAX(column_name) FROM table_name;
SELECT MIN(column_name) FROM table_name;

GROUP BY

GROUP BY

GROUP BY句は、データベースのテーブル内のデータをグループ化し、グループ内で集計関数を使用できるようにする。通常、GROUP BY句は集計関数(例:SUMCOUNTAVGMAXMINなど)と一緒に使う。

基本構文:

sql
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1;
  • column1はグループ化の基準となる列。この列に基づいてデータがグループ化される。
  • aggregate_function(column2)は、グループ内で使用される集計関数です。この関数は、column2に対して実行され、各グループ内で集計される。
  • table_nameはデータを取得するテーブルの名前。

テーブル: Menus

id name price category date_added
1 ハンバーガー 500 ファースト 2023-09-20
2 ピザ 800 イタリアン 2023-09-21
3 寿司 1200 和食 2023-09-22
4 カレー 600 インド料理 2023-09-23
5 ラーメン 700 和食 2023-09-24
6 ピザ 800 イタリアン 2023-09-25
7 寿司 1200 和食 2023-09-26

このテーブルから、各カテゴリごとに平均価格を計算したいとする

SELECT category, AVG(price) as average_price
FROM Menus
GROUP BY category;

このクエリでは、category列を基準にデータをグループ化し、各カテゴリごとに平均価格を計算している。結果は以下のとおり。

| category    | average_price |
|-------------|---------------|
| ファースト | 500.0000      |
| イタリアン  | 800.0000      |
| 和食        | 950.0000      |
| インド料理  | 600.0000      |

複数カラムのGROUP BY

例として、categorynameの組み合わせごとに平均価格を計算するクエリを考えてみる

sql
SELECT category, name, AVG(price) as average_price
FROM Menus
GROUP BY category, name;

このクエリでは、categorynameの2つのカラムを指定してデータをグループ化する。結果は以下のとおり。

| category    | name       | average_price |
|-------------|------------|---------------|
| ファースト | ハンバーガー | 500.0000      |
| イタリアン  | ピザ       | 800.0000      |
| 和食        | 寿司       | 1200.0000     |
| インド料理  | カレー     | 600.0000      |
| 和食        | ラーメン   | 700.0000      |

HAVING

HAVINGとは、GROUP BYでグループ化したデータを更に絞り込みたい場合に使用する。

HAVING vs WHERE

  • HAVINGとWHEREの違い
項目 WHERE HAVING
使い方 データの行をフィルタリングするために使用。 グループ化されたデータの結果をフィルタリングするために使用。
適用タイミング データが選択される前に適用。 データがグループ化された後に適用。
使用ケース 特定の条件で行を選択するために使用。 集計関数(例: SUM、AVG)を使って、グループ化された結果に条件を適用するために使用。
GROUP BY と一緒に使う 通常は使用しないが、集計関数を使わない場合に利用。 必ず GROUP BY と一緒に使用。

使い方

集計関数(例: SUM、AVG、COUNT)を使った結果に対して条件を設定するのに役立つ。

テーブル: Menus

id name price category date_added
1 ハンバーガー 500 ファースト 2023-09-20
2 ピザ 800 イタリアン 2023-09-21
3 寿司 1200 和食 2023-09-22
4 カレー 600 インド料理 2023-09-23
5 ラーメン 700 和食 2023-09-24
6 ピザ 800 イタリアン 2023-09-25
7 寿司 1200 和食 2023-09-26

以下の例では、商品カテゴリごとに価格の平均値を計算し、平均価格が 800 以上の商品カテゴリのみを抽出する。

sql
SELECT category, AVG(price) as avg_price
FROM Products
GROUP BY category
HAVING avg_price >= 800;

このクエリは次のように動作する:

  1. GROUP BY category により、商品カテゴリごとにグループ化。
  2. AVG(price) as avg_price により、各カテゴリ内での価格の平均値が計算され、avg_price という名前の仮想列が作成。
  3. HAVING avg_price >= 800 により、平均価格が 800 以上のカテゴリのみが結果に含む。
  • 結果:
category avg_price
イタリアン 800
和食 950

久しぶりに息子とスイミングスクールに行きリフレッシュしました!

Discussion