【SQL】データベースの基礎② - AND / OR, ORDERBY, LIMIT等 -
前回の続きから。以下も参照ください。
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 データの件数;」を使うことで、「最大で何件取得するか」を指定できる。
SELECT * FROM menus LIMIT 10;
ORDER BY & LIMIT
組み合わせることももちろん可能。
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; |
四則演算
「+, -, *, /」を使用し計算したデータの取得ができる
以下のような消費税を含んだ値を取得する。
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関数は、データベースのテーブル内の数値列の合計を計算する。
SELECT SUM(column_name) FROM table_name;
もちろん、SUM関数の使い方を具体例とともに解説します。
SUM関数は、データベースのテーブル内の数値列の合計を計算するのに使用されます。以下は、SUM関数の基本的な使い方です。
基本構文:
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クエリは次のようになる。
SELECT SUM(Price) FROM Orders;
このクエリを実行すると、合計価格が計算される。
結果:
| SUM(Price) |
|------------|
| 3700 |
AVG関数
基本構文:
SELECT AVG(column_name) FROM table_name;
上記例で計算すると以下の通りとなる。
SELECT AVG(Price) FROM Orders;
結果:
| AVG(Price) |
|------------|
| 740 |
COUNT関数
COUNT関数は、データベースのテーブル内で行の数をカウントするために使用する。
基本構文:
SELECT COUNT(*) FROM table_name;
上記Ordersテーブルを例にすると、SQLクエリは次のようになる。
SELECT COUNT(*) FROM Orders;
結果:
| COUNT(*) |
|----------|
| 5 |
MAX・MIN関数
MAX関数は、データベースのテーブル内の数値列の最大値、MIN関数は、最小値を取得する。
基本構文:
SELECT MAX(column_name) FROM table_name;
SELECT MIN(column_name) FROM table_name;
GROUP BY
GROUP BY
GROUP BY句は、データベースのテーブル内のデータをグループ化し、グループ内で集計関数を使用できるようにする。通常、GROUP BY
句は集計関数(例:SUM
、COUNT
、AVG
、MAX
、MIN
など)と一緒に使う。
基本構文:
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
例として、category
とname
の組み合わせごとに平均価格を計算するクエリを考えてみる
SELECT category, name, AVG(price) as average_price
FROM Menus
GROUP BY category, name;
このクエリでは、category
とname
の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 以上の商品カテゴリのみを抽出する。
SELECT category, AVG(price) as avg_price
FROM Products
GROUP BY category
HAVING avg_price >= 800;
このクエリは次のように動作する:
-
GROUP BY category
により、商品カテゴリごとにグループ化。 -
AVG(price) as avg_price
により、各カテゴリ内での価格の平均値が計算され、avg_price
という名前の仮想列が作成。 -
HAVING avg_price >= 800
により、平均価格が 800 以上のカテゴリのみが結果に含む。
- 結果:
category | avg_price |
---|---|
イタリアン | 800 |
和食 | 950 |
久しぶりに息子とスイミングスクールに行きリフレッシュしました!
Discussion