【Mariadbチュートリアル】SQLで複数値フィールドからデータを抽出する方法
SQL - 複数値フィールドからの選択
このチュートリアルでは、Mariadb を使用して、複数値フィールド からデータを抽出する方法について説明します。 複数値フィールドは、1 つのレコードに複数の値を格納できる特殊なデータ型です。 これは、顧客の興味、製品のカテゴリ、タグなど、さまざまなユースケースに役立ちます。
前提知識
このチュートリアルを理解するには、次の基本的な SQL 概念に関する知識が必要です。
- SELECT ステートメント
- FROM 句
- WHERE 句
例
次の例では、customers
テーブルがあると仮定します。 このテーブルには、customer_id
、name
、interests
という 3 つの列があります。 interests
列は複数値フィールドであり、顧客の興味をカンマ区切りのリストとして格納します。
CREATE TABLE customers (
customer_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
interests VARCHAR(255) NOT NULL
);
このテーブルに、次のデータがあるとします。
INSERT INTO customers (name, interests)
VALUES
('John Doe', 'programming,music,gaming'),
('Jane Doe', 'cooking,reading,travel');
すべての顧客の興味を選択するには、次のクエリを使用します。
SELECT customer_id, name, interests
FROM customers;
このクエリは次の結果を返します。
customer_id | name | interests
-----------+------------+------------
1 | John Doe | programming,music,gaming
2 | Jane Doe | cooking,reading,travel
特定の興味を持つ顧客を選択するには、WHERE
句を使用します。 次のクエリは、「programming」に興味を持つすべての顧客を選択します。
SELECT customer_id, name, interests
FROM customers
WHERE interests LIKE '%programming%';
customer_id | name | interests
-----------+------------+------------
1 | John Doe | programming,music,gaming
SELECT customer_id, name, interests
FROM customers
WHERE interests IN ('programming', 'music');
customer_id | name | interests
-----------+------------+------------
1 | John Doe | programming,music,gaming
関数を使用して複数値フィールドを操作する
Mariadb には、複数値フィールドを操作するために使用できるいくつかの関数があります。 次の例では、FIND_IN_SET()
関数を使用して、「music」が顧客の興味リストにあるかどうかを確認する方法を示します。
SELECT customer_id, name, interests, FIND_IN_SET('music', interests) AS has_music
FROM customers;
customer_id | name | interests | has_music
-----------+------------+--------------------------+---------
1 | John Doe | programming,music,gaming | 2
2 | Jane Doe | cooking,reading,travel | NULL
このチュートリアルでは、Mariadb で複数値フィールドからデータを抽出する方法について説明しました。 さまざまな条件を使用して、特定の顧客または興味のセットを選択できます。 関数を使用して、複数値フィールドを操作することもできます。
すべての顧客の興味と、各興味がリストの中で何番目に現れるかを選択する
このクエリは、すべての顧客の興味と、各興味がリストの中で何番目に現れるかを選択します。 これにより、顧客が複数の興味を持っている場合、興味の優先順位を把握することができます。
SELECT customer_id, name, interests,
FIND_IN_SET(interest, interests) AS interest_position
FROM customers
CROSS JOIN
UNNEST(SPLIT(interests, ',')) AS interest;
customer_id | name | interests | interest_position
-----------+------------+--------------------------+------------------
1 | John Doe | programming,music,gaming | 1
1 | John Doe | programming,music,gaming | 2
1 | John Doe | programming,music,gaming | 3
2 | Jane Doe | cooking,reading,travel | 1
2 | Jane Doe | cooking,reading,travel | 2
2 | Jane Doe | cooking,reading,travel | 3
顧客の名前と、顧客が持つ興味の中で最も長い興味を選択する
このクエリは、顧客の名前と、顧客が持つ興味の中で最も長い興味を選択します。 これにより、各顧客が最も興味を持っているトピックを特定できます。
SELECT name,
SUBSTRING_INDEX(interests, ',', 1) AS longest_interest
FROM customers;
name | longest_interest
-----------+------------------
John Doe | programming
Jane Doe | cooking
SELECT name,
SUBSTRING_INDEX(interests, ',', -1) AS shortest_interest
FROM customers;
name | shortest_interest
-----------+------------------
John Doe | gaming
Jane Doe | travel
これらのサンプルコードは、Mariadb で複数値フィールドを使用してさまざまな操作を実行する方法を示すほんの一例です。 創造性を発揮し、ニーズに合った独自のクエリを作成してください。
ヒント
- 複雑なクエリを作成する場合は、一時テーブルを使用して結果を中間的に保存すると便利です。
- 複数のクエリを結合して、より複雑な分析を実行できます。
- Mariadb のマニュアルには、複数値フィールドを操作するために使用できるその他の関数と演算子が記載されています。
複数値フィールドからデータを選択するその他の方法
JSON 型の使用
Mariadb 10.2 以降では、JSON データ型を使用して複数値フィールドを格納できます。 これにより、データの構造と柔軟性を向上させることができます。 次の例では、customers
テーブルを interests
列を JSON 型として更新する方法を示します。
ALTER TABLE customers
MODIFY interests JSON;
次に、次のクエリを使用して、JSON データとして格納された興味を持つすべての顧客を選択します。
SELECT customer_id, name, interests
FROM customers
WHERE interests->'interests' LIKE '%programming%';
customer_id | name | interests
-----------+------------+------------------
1 | John Doe | {"interests": ["programming","music","gaming"]}
COMMON TABLE EXPRESSIONS (CTE) の使用
CTE を使用すると、複雑なクエリをより小さな、より管理しやすい部分に分割できます。 これにより、クエリをより読みやすく、理解しやすくすることができます。 次の例では、CTE を使用して、「programming」または「music」に興味を持つすべての顧客を選択する方法を示します。
WITH interested_customers AS (
SELECT customer_id, name, interests
FROM customers
WHERE interests LIKE '%programming%' OR interests LIKE '%music%'
)
SELECT * FROM interested_customers;
customer_id | name | interests
-----------+------------+------------------
1 | John Doe | programming,music,gaming
ウィンドウ関数は、特定の行のグループに対して集計計算を実行するために使用できます。 次の例では、ROW_NUMBER()
ウィンドウ関数を使用して、各顧客の興味を 1 から番号付けする方法を示します。
SELECT customer_id, name, interests,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY interests) AS interest_number
FROM customers;
customer_id | name | interests | interest_number
-----------+------------+--------------------------+----------------
1 | John Doe | programming,music,gaming | 1
1 | John Doe | programming,music,gaming | 2
1 | John Doe | programming,music,gaming | 3
2 | Jane Doe | cooking,reading,travel | 1
2 | Jane Doe | cooking,reading,travel | 2
2 | Jane Doe | cooking,reading,travel | 3
これらの方法は、それぞれ長所と短所があります。 最適な方法は、特定のニーズと要件によって異なります。
その他の考慮事項
- 複数値フィールドが非常に大きい場合、パフォーマンスを向上させるためにクエリを最適化する必要がある場合があります。
- 複数の抽出条件がある場合は、WHERE 句に複数の条件を追加できます。
- 結果を特定の順序でソートするには、ORDER BY 句を使用できます。
sql mariadb