本記事では、SQLステートメントを使用してOceanBaseデータベースで単一テーブルのクエリ操作を実行する方法について説明します。
前提条件
- OceanBaseデータベースのMySQLモードテナントに接続していること。
SELECT権限を持っていること。現在のユーザー権限を確認するその他の操作の詳細については、ユーザー権限の確認を参照してください。この権限がない場合は、管理者に連絡し権限の付与を依頼してください。ユーザー権限に関するその他の操作の詳細については、直接権限の付与を参照してください。
構文
SELECT ステートメントを使用してデータをクエリしてください。
SELECT ステートメントの単一テーブルクエリの一般的な構造は次のとおりです:
SELECT [ALL | DISTINCT | UNIQUE | SQL_CALC_FOUND_ROWS] select_list
FROM table_name
[ WHERE query_condition ]
[ GROUP BY group_by_condition ]
[ HAVING group_condition ]
[ ORDER BY column_list ][ASC | DESC]
[ LIMIT limit_clause ]
column_list:
column_name[,column_name...]
パラメータの説明:
パラメータ |
説明 |
|
|---|---|---|
| select_list | 対象となる列のリスト。列名、式、集約関数などを指定できます。複数の列はカンマで区切ります。 | |
| table_name | データを照会するテーブル名。 | |
| WHERE query_condition | オプションパラメータです。検索条件を指定するために使用します。条件に合致する行のみが返されます。 | |
| GROUP BY group_by_condition | オプションパラメータです。指定された列に基づいて結果をグループ化します。集約関数と併用するのが一般的です。 | |
| HAVING group_condition | オプションパラメータです。グループ化後の結果セットをフィルタリングし、条件を満たすグループのみを返します。 | |
| ORDER BY column_list | オプションパラメータです。結果セットをソートします。1列または複数列を指定してソートできます。 | |
| ASC | DESC | オプションパラメータです。ソート順序を指定するために使用します。ASCは昇順(デフォルト)、DESCは降順を表します。 |
| LIMIT limit_clause | オプションパラメータです。返される結果セットの行数を制限するために使用します。 | |
| column_list | 検索する列を指定するパラメータです。単一の列または複数の列をカンマで区切って指定できます。 | |
| column_name | 検索する列名。 |
SELECTキーワードの実行順序の概要
WHERE、GROUP BY、HAVING、ORDER BY、LIMIT これらのキーワードを同時に使用する場合、実行の順序には明確な制限があります。キーワードの実行順序は以下のとおりです:
FROMを実行してテーブルを特定します。WHEREを実行して制約条件を指定します。GROUP BYを実行して、取得した各レコードをグループ化(集計)します。GROUP BYがない場合、全体が1つのグループとなります。HAVINGを実行して、グループ化された結果をフィルタリングします。SELECTを実行します。DISTINCTを実行して、重複を除去します。ORDER BYを実行して、条件に基づいて結果を昇順または降順に並べ替えます。LIMITを実行して、結果の件数を制限します。
注意
WHERE と HAVING の違いは、WHERE がグループ化前にデータをフィルタリングするのに対し、HAVING はグループ化後の結果でフィルタリングを行い、最終的にSQL全体のクエリ結果を返すことです。
テストテーブルの作成とテストデータの追加
テーブル
studentを作成します。CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, gender TINYINT NOT NULL, age INT NOT NULL, score FLOAT NOT NULL, enrollment_date DATE NOT NULL, notes VARCHAR(50) );テーブル
studentに10件のデータを挿入します。INSERT INTO student (name, gender, age, score, enrollment_date, notes) VALUES ('Emma', 0, 20, 85.0, '2021-09-01',NULL), ('William', 1, 21, 90.5, '2021-09-02','B'), ('Olivia', 0, 19, 95.5, '2021-09-03','A'), ('James', 1, 20, 87.5, '2021-09-03',NULL), ('Sophia', 0, 20, 91.5, '2021-09-05','B'), ('Benjamin', 1, 21, 96.5, '2021-09-01','A'), ('Ava', 0, 22, 89.5, '2021-09-06',NULL), ('Michael', 1, 18, 93.5, '2021-09-08','B'), ('Charlotte', 1, 19, 88.0, '2021-09-06',NULL), ('Ethan', 1, 20, 92.0, '2021-09-01','B');テーブル
fruit_orderを作成します。CREATE TABLE fruit_order( order_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '注文ID', user_id BIGINT NOT NULL COMMENT '顧客ID', user_name VARCHAR(16) NOT NULL DEFAULT '' COMMENT '顧客名', fruit_price DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '注文金額', order_year SMALLINT NOT NULL COMMENT '注文年' ) COMMENT '注文テーブル';テーブル
fruit_orderに10件のデータを挿入します。INSERT INTO fruit_order(user_id, user_name,fruit_price,order_year) VALUES (1011,'A1',13.11,'2019'), (1011,'A1',22.21,'2020'), (1011,'A1',58.83,'2020'), (1022,'B2',23.34,'2019'), (1022,'B2',12.22,'2019'), (1022,'B2',14.66,'2021'), (1022,'B2',34.44,'2021'), (1033,'C3',51.55,'2020'), (1033,'C3',63.66,'2021'), (1034,'D4',53.62,'2021');
基本的なクエリ
SELECT を使用する際には、意味のある列名のエイリアスと適切な列の順序を使用することをお勧めします。これにより、結果セットの可読性が向上し、クエリ結果をより効果的に整理し理解できます。
すべての列を照会する
SELECT * FROM student;ステートメントを使用して、すべての学生情報を照会できます。すべてのフィールドを手動で列挙し、
SELECT id,name,gender,age,score,enrollment_date FROM student;ステートメントを使用して、すべての学生情報を照会することもできます。
説明
* を使用するとすべてのフィールドを簡単に列挙できますが、すべてのフィールドを手動で列挙する方が、クエリのパフォーマンス、コードの可読性、および保守性の点で優れています。
例1:以下のSQLステートメントを使用して、テーブル student のすべての行のデータを照会します。
SELECT id, name, gender, age, score, enrollment_date, notes
FROM student;
または
SELECT * FROM student;
実行結果は次のとおりです:
+----+-----------+--------+-----+-------+-----------------+-------+
| id | name | gender | age | score | enrollment_date | notes |
+----+-----------+--------+-----+-------+-----------------+-------+
| 1 | Emma | 0 | 20 | 85 | 2021-09-01 | NULL |
| 2 | William | 1 | 21 | 90.5 | 2021-09-02 | B |
| 3 | Olivia | 0 | 19 | 95.5 | 2021-09-03 | A |
| 4 | James | 1 | 20 | 87.5 | 2021-09-03 | NULL |
| 5 | Sophia | 0 | 20 | 91.5 | 2021-09-05 | B |
| 6 | Benjamin | 1 | 21 | 96.5 | 2021-09-01 | A |
| 7 | Ava | 0 | 22 | 89.5 | 2021-09-06 | NULL |
| 8 | Michael | 1 | 18 | 93.5 | 2021-09-08 | B |
| 9 | Charlotte | 1 | 19 | 88 | 2021-09-06 | NULL |
| 10 | Ethan | 1 | 20 | 92 | 2021-09-01 | B |
+----+-----------+--------+-----+-------+-----------------+-------+
10 rows in set
指定された列を照会する
列名に基づいてテーブル内の指定された列データを検索します。
例2:以下のSQLステートメントを使用して、テーブル student のすべての行のデータを照会し、各行の id 列と name 列のデータを返します。
SELECT id, name
FROM student;
実行結果は次のとおりです:
+----+-----------+
| id | name |
+----+-----------+
| 1 | Emma |
| 2 | William |
| 3 | Olivia |
| 4 | James |
| 5 | Sophia |
| 6 | Benjamin |
| 7 | Ava |
| 8 | Michael |
| 9 | Charlotte |
| 10 | Ethan |
+----+-----------+
10 rows in set
計算された値のクエリと列のエイリアス指定
クエリでは、指定した列に対してデータ計算処理を行うことができます。
例3:次のSQLステートメントを使用して、テーブル student から id、name、age、age+5 の4列のデータを選択し、計算結果の列 age+5 に age_plus_5 というエイリアスを指定します。
SELECT id, name, age, age+5 AS age_plus_5
FROM student;
実行結果は次のとおりです:
+----+-----------+-----+------------+
| id | name | age | age_plus_5 |
+----+-----------+-----+------------+
| 1 | Emma | 20 | 25 |
| 2 | William | 21 | 26 |
| 3 | Olivia | 19 | 24 |
| 4 | James | 20 | 25 |
| 5 | Sophia | 20 | 25 |
| 6 | Benjamin | 21 | 26 |
| 7 | Ava | 22 | 27 |
| 8 | Michael | 18 | 23 |
| 9 | Charlotte | 19 | 24 |
| 10 | Ethan | 20 | 25 |
+----+-----------+-----+------------+
10 rows in set
説明
クエリ内で演算子や関数を使用して指定列のデータを処理する方法の詳細については、クエリ内での演算子と関数の使用のセクションを参照してください。
データのフィルタリング
特定の条件を満たすデータを照会する場合、SELECT クエリステートメントに WHERE 句を追加してデータのフィルタリングを行うことができます。WHERE 句の後には、1つ以上の条件を含めることができ、これらの条件によってデータがフィルタリングされ、WHERE 条件を満たすデータのみが返されます。特定ニーズに応じて、柔軟にクエリ条件を活用することで、ターゲットデータをフィルタリングおよび検索できます。
WHERE 句を使用する際には、条件が正しく、適切な演算子を使用していることを確認する必要があります。
WHERE 句で一般的に使用されるクエリ条件は、次の表のとおりです。
クエリ条件タイプ |
述語 |
|---|---|
| 比較クエリ | =、>、<、>=、<=、!=、<> |
| 論理クエリ(複数条件) | AND、OR、NOT |
| あいまいクエリ(文字列マッチング) | LIKE、NOT LIKE |
| 区間クエリ(範囲指定) | BETWEEN AND、NOT BETWEEN AND |
| 指定集合クエリ | IN、NOT IN |
| NULL値クエリ | IS NULL、IS NOT NULL |
クエリ条件演算子の詳細については、比較演算子を参照してください。
比較条件クエリ
等しい
等しい(=):指定された列の値が、特定の値と等しいデータを照会します。値が文字列タイプの場合は、シングルクォートまたはダブルクォートで囲む必要があります。
例4:次のSQLステートメントを使用して、テーブル student の gender 列が 1 に等しいすべての行を照会し、これらの行の id、name、gender 列のデータを返します。
SELECT id, name, gender
FROM student
WHERE gender = 1;
結果は次のとおりです:
+----+-----------+--------+
| id | name | gender |
+----+-----------+--------+
| 2 | William | 1 |
| 4 | James | 1 |
| 6 | Benjamin | 1 |
| 8 | Michael | 1 |
| 9 | Charlotte | 1 |
| 10 | Ethan | 1 |
+----+-----------+--------+
6 rows in set
等しくない
不等号には <> と != の2種類の書き方があります。
例5:次のSQLステートメントを使用して、テーブル student の gender 列が 1 と等しくないすべての行を照会し、これらの行の id、name、gender 列のデータを返します。
SELECT id, name, gender
FROM student
WHERE gender <> 1;
結果は次のとおりです:
+----+--------+--------+
| id | name | gender |
+----+--------+--------+
| 1 | Emma | 0 |
| 3 | Olivia | 0 |
| 5 | Sophia | 0 |
| 7 | Ava | 0 |
+----+--------+--------+
4 rows in set
大于と小于
大于(>)と小于(<)は、数値を大きさで比較します。文字を比較する場合は、ASCIIコードに対応する値に基づいて比較し、文字の対応する位置から順に比較します。
説明
大于等于(\>=)と小于等于(\<=)も同様です。
例6:次のSQLステートメントを使用して、テーブル student の score 列が 90 より小さいすべての行を照会し、これらの行の id、name、score 列のデータを返します。
SELECT id, name, score
FROM student
WHERE score < 90;
結果は次のとおりです:
+----+-----------+-------+
| id | name | score |
+----+-----------+-------+
| 1 | Emma | 85 |
| 4 | James | 87.5 |
| 7 | Ava | 89.5 |
| 9 | Charlotte | 88 |
+----+-----------+-------+
4 rows in set
論理条件クエリ
論理クエリ演算子のAND(AND)とOR(OR)は、複数の条件を組み合わせたクエリをサポートします。
AND
AND キーワードは、複数の条件を組み合わせるために使用されます。すべての条件を同時に満たすデータのみが返されます。
例7:次のSQLステートメントを使用して、テーブル student 内で gender が 1 に等しく score が 90 以下のすべての行を検索し、これらの行の id、name、gender、score 列のデータを返します。
SELECT id, name, gender, score
FROM student
WHERE gender = 1 AND score <= 90;
結果は次のとおりです:
+----+-----------+--------+-------+
| id | name | gender | score |
+----+-----------+--------+-------+
| 4 | James | 1 | 87.5 |
| 9 | Charlotte | 1 | 88 |
+----+-----------+--------+-------+
2 rows in set
OR
OR キーワードは、複数の条件を結合するために使用されます。いずれか一つの条件を満たすデータは返されます。
例8:次のSQLステートメントを使用して、テーブル student 内で gender が 1 に等しいか score が 90 より小さいすべての行を検索し、これらの行の id、name、gender、score 列のデータを返します。
SELECT id, name, gender, score
FROM student
WHERE gender = 1 OR score < 90;
結果は次のとおりです:
+----+-----------+--------+-------+
| id | name | gender | score |
+----+-----------+--------+-------+
| 1 | Emma | 0 | 85 |
| 2 | William | 1 | 90.5 |
| 4 | James | 1 | 87.5 |
| 6 | Benjamin | 1 | 96.5 |
| 7 | Ava | 0 | 89.5 |
| 8 | Michael | 1 | 93.5 |
| 9 | Charlotte | 1 | 88 |
| 10 | Ethan | 1 | 92 |
+----+-----------+--------+-------+
8 rows in set
あいまいクエリ
LIKE 述語は、文字列のあいまい検索に使用できます。
構文の意味は、対応する列の値が pattern と一致するデータを検索することです。pattern は完全な文字列でも、ワイルドカード % と _ を含む文字列でもかまいません。ここで:
アンダースコア (
_) は任意の1文字に一致します。パーセント記号 (
%) は、値の中の0文字以上の任意の文字列に一致します。%はNULLと一致しません。
注意
データベースの文字セットがASCIIの場合、1つの漢字には2つの _ が必要です。文字セットがGBKの場合は、1つの _ だけが必要です。
例9:次のSQLステートメントを使用して、テーブル student 内で name に am が含まれるすべての行を検索し、これらの行の id と name 列のデータを返します。
SELECT id, name
FROM student
WHERE name LIKE '%am%';
結果は次のとおりです:
+----+----------+
| id | name |
+----+----------+
| 2 | William |
| 4 | James |
| 6 | Benjamin |
+----+----------+
3 rows in set
区間クエリ
演算子 BETWEEN ... AND は、2つの値の間にあるデータを選択します。これらの値は、数値、テキスト、または日付です。
注意
区間クエリの2つの境界値の順序を入れ替えないでください。必ず、左側の値以上、かつ右側の値以下でなければなりません。
例10:次のSQLステートメントを使用して、テーブル student 内の列 score の値が 85 ~ 90 の範囲にあるすべての行を検索し、それらの行の id、name、score 列のデータを返します。
SELECT id, name, score
FROM student
WHERE score BETWEEN 85 AND 90;
結果は次のとおりです:
+----+-----------+-------+
| id | name | score |
+----+-----------+-------+
| 1 | Emma | 85 |
| 4 | James | 87.5 |
| 7 | Ava | 89.5 |
| 9 | Charlotte | 88 |
+----+-----------+-------+
4 rows in set
指定集合クエリ
演算子 IN は、WHERE 句で指定された複数の値を集合と呼びます。IN は、指定された列のデータが集合内のいずれかの値と一致する場合にその行を返します。NOT IN は、集合内のどの値とも一致しないデータを返します。
注意
[NOT] INの集合内の値の型は、すべて一致しているか、互換性がある必要があります。[NOT] INの集合内の値では、ワイルドカードは使用できません。
例11:次のSQLステートメントを使用して、テーブル student 内の列 id の値が集合 (1, 3, 5, 7) に含まれるすべての行を検索し、それらの行の id と name 列のデータを返します。
SELECT id, name
FROM student
WHERE id IN (1,3,5,7);
結果は次のとおりです:
+----+--------+
| id | name |
+----+--------+
| 1 | Emma |
| 3 | Olivia |
| 5 | Sophia |
| 7 | Ava |
+----+--------+
4 rows in set
NULL値専用クエリ
比較演算子、LIKE、BETWEEN AND、IN、NOT IN は NULL 値に対して正確な結果を返さないため、NULL 値専用のクエリステートメントである IS NULL と IS NOT NULL の使用を推奨します。また、通常の数値と NULL 値の両方を判断できる安全な等価演算子(<=>)も使用できます。
IS NULL
IS NULL 条件は、指定された列の値が NULL であるデータを検索するために使用されます。
例12:次のSQLステートメントを使用して、テーブル student 内で列 notes が空のすべての行を検索し、それらの行の id、name、score、notes 列のデータを返します。
SELECT id, name, score, notes
FROM student
WHERE notes IS NULL;
実行結果は次のとおりです:
+----+-----------+-------+-------+
| id | name | score | notes |
+----+-----------+-------+-------+
| 1 | Emma | 85 | NULL |
| 4 | James | 87.5 | NULL |
| 7 | Ava | 89.5 | NULL |
| 9 | Charlotte | 88 | NULL |
+----+-----------+-------+-------+
4 rows in set
IS NOT NULL
IS NOT NULL 条件は、指定された列の値が NULL 以外であるデータを検索するために使用されます。
例13:次のSQLステートメントを使用して、テーブル student 内で列 notes が空ではないすべての行を検索し、それらの行の id、name、score、notes 列のデータを返します。
SELECT id, name, score, notes
FROM student
WHERE notes IS NOT NULL;
実行結果は次のとおりです:
+----+----------+-------+-------+
| id | name | score | notes |
+----+----------+-------+-------+
| 2 | William | 90.5 | B |
| 3 | Olivia | 95.5 | A |
| 5 | Sophia | 91.5 | B |
| 6 | Benjamin | 96.5 | A |
| 8 | Michael | 93.5 | B |
| 10 | Ethan | 92 | B |
+----+----------+-------+-------+
6 rows in set
データのグループ化
SQLクエリでは、GROUP BY 句を使用してクエリ結果をグループ化できます。GROUP BY は単一フィールドのグループ化と複数フィールドのグループ化をサポートします。グループ化の前には WHERE 句でデータをフィルタリングし、グループ化後には HAVING 句でデータをフィルタリングし、ORDER BY 句でデータをソートすることができます。
データのグループ化に関する注意事項:
GROUP BY句を使用する場合、SELECTステートメント内の列は、GROUP BY句内の列または集約関数でなければなりません。HAVING句を使用する場合、HAVING条件は元のデータではなく、グループ化された結果をフィルタリングします。
単一フィールドによるグループ化クエリ
例14:テーブル fruit_order の各顧客の注文数を照会し、user_id と COUNT(order_id) を出力します。
SELECT user_id, COUNT(order_id)
FROM fruit_order
GROUP BY user_id;
実行結果は次のとおりです:
+---------+-----------------+
| user_id | COUNT(order_id) |
+---------+-----------------+
| 1011 | 3 |
| 1022 | 4 |
| 1033 | 2 |
| 1034 | 1 |
+---------+-----------------+
4 rows in set
複数フィールドによるグループ化クエリ
例15:fruit_order の各顧客の年間注文数を照会し、user_id、order_year と COUNT(order_id) を出力します。
SELECT user_id, order_year, COUNT(order_id)
FROM fruit_order
GROUP BY user_id,order_year;
実行結果は次のとおりです:
+---------+------------+-----------------+
| user_id | order_year | COUNT(order_id) |
+---------+------------+-----------------+
| 1011 | 2019 | 1 |
| 1011 | 2020 | 2 |
| 1022 | 2019 | 2 |
| 1022 | 2021 | 2 |
| 1033 | 2020 | 1 |
| 1033 | 2021 | 1 |
| 1034 | 2021 | 1 |
+---------+------------+-----------------+
7 rows in set
グループ化前のフィルタリング
例16:2020年の各顧客の注文数を照会し、user_id と COUNT(order_id) を出力します。
SELECT user_id, COUNT(order_id)
FROM fruit_order t
WHERE t.order_year = 2020
GROUP BY user_id;
実行結果は次のとおりです:
+---------+-----------------+
| user_id | COUNT(order_id) |
+---------+-----------------+
| 1011 | 2 |
| 1033 | 1 |
+---------+-----------------+
2 rows in set
グループ化後のフィルタリング
説明
クエリに HAVING 句が含まれる場合、まず HAVING 句なしのSQLクエリ結果を取得し、その結果に対して HAVING 条件を適用して一致するデータをフィルタリングし、最後にそのデータを返します。したがって、HAVING 句では集約関数を使用でき、その集約関数は SELECT 句で使用されている集約関数と同じである必要はありません。
例17:2019年に注文数が1件を超える顧客を検索し、user_id と COUNT(order_id) を出力します。
SELECT user_id, COUNT(order_id)
FROM fruit_order t
WHERE t.order_year = 2019
GROUP BY user_id
HAVING COUNT(order_id) >= 2;
実行結果は次のとおりです:
+---------+-----------------+
| user_id | COUNT(order_id) |
+---------+-----------------+
| 1022 | 2 |
+---------+-----------------+
1 row in set
グループ化後のソート
例18:各顧客の注文の最大金額を照会し、最大金額の降順で user_id と MAX(fruit_price) を出力します。
SELECT user_id, MAX(fruit_price)
FROM fruit_order t
GROUP BY user_id
ORDER BY MAX(fruit_price) DESC;
実行結果は次のとおりです:
+---------+------------------+
| user_id | MAX(fruit_price) |
+---------+------------------+
| 1033 | 63.66 |
| 1011 | 58.83 |
| 1034 | 53.62 |
| 1022 | 34.44 |
+---------+------------------+
4 rows in set
集計クエリ
集計クエリは、データに集計操作を施して結果の概要を返すクエリ方式です。統計、カウント、合計、平均値、最大値、最小値などの集計操作を一連のデータに対して行うことができます。集計クエリは通常、GROUP BY 句と共に使用され、データをグループ化し、各グループに対して集計操作を行います。GROUP BY 句は指定された列に従ってデータをグループ化し、その後集約関数が各グループに適用され、結果セットが生成されます。
グループ化で一般的に使用される集約関数は以下の表のとおりです。
集計関数 |
説明 |
|---|---|
| MAX() | 指定された列の最大値を照会します。 |
| MIN() | 指定された列の最小値を照会します。 |
| COUNT() | クエリ結果の行数を集計します。 |
| SUM() | 指定された列の合計を返します。 |
| AVG() | 指定された列データの平均値を返します。 |
集約関数を使用したクエリの詳細については、クエリでの集約関数の使用を参照してください。
データのソート
データのソートとは、クエリ結果を指定された列または式に従って並べ替える操作であり、昇順(ASC)または降順(DESC)でデータを並べ替えることができます。SQLクエリでは、ORDER BY 句を使用してソート方法を指定します。ORDER BY 句は、単一フィールドのソート、複数フィールドのソート、エイリアスによるソート、関数によるソートをサポートしており、複数フィールドのソートではカンマで区切ります。ソートクエリを実行する際に ASC または DESC キーワードを指定しない場合、クエリ結果はデフォルトで昇順に並べ替えられます。
ORDER BY 句を使用して結果セットをソートする操作は、特に大規模なデータセットではリソースを消費する操作です。必要に応じて、インデックスを使用してソート操作を最適化することを推奨します。正しい列とソート順序を指定するようにしてください。
単一フィールドによるソートクエリ
例19:student テーブルの学生情報を score の昇順で表示します。
SELECT id, name, score
FROM student
ORDER BY score;
実行結果は次のとおりです:
+----+-----------+-------+
| id | name | score |
+----+-----------+-------+
| 1 | Emma | 85 |
| 4 | James | 87.5 |
| 9 | Charlotte | 88 |
| 7 | Ava | 89.5 |
| 2 | William | 90.5 |
| 5 | Sophia | 91.5 |
| 10 | Ethan | 92 |
| 8 | Michael | 93.5 |
| 3 | Olivia | 95.5 |
| 6 | Benjamin | 96.5 |
+----+-----------+-------+
10 rows in set
例20:student テーブルの学生情報を score の降順で表示します。
SELECT id, name, score
FROM student
ORDER BY score DESC;
実行結果は次のとおりです:
+----+-----------+-------+
| id | name | score |
+----+-----------+-------+
| 6 | Benjamin | 96.5 |
| 3 | Olivia | 95.5 |
| 8 | Michael | 93.5 |
| 10 | Ethan | 92 |
| 5 | Sophia | 91.5 |
| 2 | William | 90.5 |
| 7 | Ava | 89.5 |
| 9 | Charlotte | 88 |
| 4 | James | 87.5 |
| 1 | Emma | 85 |
+----+-----------+-------+
10 rows in set
複数フィールドによるソートクエリ
例21:student テーブルの学生情報を enrollment_date の降順、score の昇順で表示します。
SELECT id, name, score, enrollment_date
FROM student
ORDER BY enrollment_date DESC,score ASC;
実行結果は次のとおりです:
+----+-----------+-------+-----------------+
| id | name | score | enrollment_date |
+----+-----------+-------+-----------------+
| 8 | Michael | 93.5 | 2021-09-08 |
| 9 | Charlotte | 88 | 2021-09-06 |
| 7 | Ava | 89.5 | 2021-09-06 |
| 5 | Sophia | 91.5 | 2021-09-05 |
| 4 | James | 87.5 | 2021-09-03 |
| 3 | Olivia | 95.5 | 2021-09-03 |
| 2 | William | 90.5 | 2021-09-02 |
| 1 | Emma | 85 | 2021-09-01 |
| 10 | Ethan | 92 | 2021-09-01 |
| 6 | Benjamin | 96.5 | 2021-09-01 |
+----+-----------+-------+-----------------+
10 rows in set
ORDER BY句での関数を用いたソート
ORDER BY 句では、関数を使用してクエリ結果をソートできます。関数はソート対象の列や式に適用し、より複雑なデータソートを実現します。
例22:student テーブルの学生情報を DAY(enrollment_date) の降順、score の昇順で表示します。
SELECT id, name, score, enrollment_date
FROM student
ORDER BY DAY(enrollment_date) DESC,score ASC;
結果は次のとおりです:
+----+-----------+-------+-----------------+
| id | name | score | enrollment_date |
+----+-----------+-------+-----------------+
| 8 | Michael | 93.5 | 2021-09-08 |
| 9 | Charlotte | 88 | 2021-09-06 |
| 7 | Ava | 89.5 | 2021-09-06 |
| 5 | Sophia | 91.5 | 2021-09-05 |
| 4 | James | 87.5 | 2021-09-03 |
| 3 | Olivia | 95.5 | 2021-09-03 |
| 2 | William | 90.5 | 2021-09-02 |
| 1 | Emma | 85 | 2021-09-01 |
| 10 | Ethan | 92 | 2021-09-01 |
| 6 | Benjamin | 96.5 | 2021-09-01 |
+----+-----------+-------+-----------------+
10 rows in set
データフィルタリング後のソート
WHERE 句を使用すると、ソート前にデータをフィルタリングできます。
例23:student テーブルから score が 85 より大きい学生情報を検索し、DAY(enrollment_date) の昇順で表示します。
SELECT id, name, score, DAY(enrollment_date)
FROM student
WHERE score > 85
ORDER BY DAY(enrollment_date) ASC;
結果は次のとおりです:
+----+-----------+-------+----------------------+
| id | name | score | DAY(enrollment_date) |
+----+-----------+-------+----------------------+
| 6 | Benjamin | 96.5 | 1 |
| 10 | Ethan | 92 | 1 |
| 2 | William | 90.5 | 2 |
| 3 | Olivia | 95.5 | 3 |
| 4 | James | 87.5 | 3 |
| 5 | Sophia | 91.5 | 5 |
| 7 | Ava | 89.5 | 6 |
| 9 | Charlotte | 88 | 6 |
| 8 | Michael | 93.5 | 8 |
+----+-----------+-------+----------------------+
9 rows in set
LIMIT句
結果セットの行数を制限する
SQLクエリでは、LIMIT 句を使用して返される結果セットの行数を制限できます。
LIMIT 句による行数制限の書式1は以下のとおりです:
LIMIT [offset,] row_count
LIMIT 句による行数制限の書式2は以下のとおりです:
LIMIT row_count OFFSET offset
パラメータ説明:
offset:オフセット量、つまりスキップする行数を表します。書式1ではoffsetはオプションで、デフォルトは0(0行スキップ)です。offsetの取り得る範囲は [0,+∞) です。row_count:返す行数を表します。書式1でoffsetを指定しない場合、デフォルトで最初の行から開始されます。row_countの取り得る範囲は [0,+∞) です。
注意
offset と row_count の値には以下の制限があります:
- 式を使用できません。
- 明示的な数値のみ指定可能で、負の数は使用できません。
最初のm行のレコードを取得する
例24:student テーブルから、id 列と name 列のデータのうち、最初の5行のレコードを取得します。
SELECT id, name
FROM student
LIMIT 5;
実行結果は次のとおりです:
+----+---------+
| id | name |
+----+---------+
| 1 | Emma |
| 2 | William |
| 3 | Olivia |
| 4 | James |
| 5 | Sophia |
+----+---------+
5 rows in set
最大値を持つ1行のレコードを取得する
例25:student テーブルで score の最大値を持つ1行のレコードを取得したい場合、まず score で降順に並べ替え、その後最初の行を取得します。
SELECT id, name, score
FROM student
ORDER BY score DESC
LIMIT 1;
実行結果は次のとおりです:
+----+----------+-------+
| id | name | score |
+----+----------+-------+
| 6 | Benjamin | 96.5 |
+----+----------+-------+
1 row in set
n行のレコードをスキップした後のm行のレコードを取得する
説明
n行のレコードをスキップした後、残りのデータの行数がmより少ない場合、クエリ結果は残りのすべてのデータを取得します。
例26:student テーブルから、id 列と name 列の5行目以降の3行のデータを取得します。
SELECT id, name
FROM student
LIMIT 3 OFFSET 5;
実行結果は次のとおりです:
+----+----------+
| id | name |
+----+----------+
| 6 | Benjamin |
| 7 | Ava |
| 8 | Michael |
+----+----------+
3 rows in set
ページネーションクエリ
SQLクエリでは、LIMIT 句を使用してページネーションクエリを実現できます。
LIMIT 句によるページネーションクエリの書式は以下のとおりです:
LIMIT (page_no - 1) * page_size, page_size;
パラメータ説明:
page_no:ページ番号を表します。1から始まり、範囲は[1,+∞)です。page_size:1ページに表示するレコード数を表します。範囲は[1,+∞)です。例えば、page_no = 5、page_size = 10は、5ページ目の10件のデータを取得することを意味します。
例27:テーブル student で、1ページに2件のデータを表示し、順次1ページ目、2ページ目、3ページ目のデータを取得します。
1ページ目:
SELECT id, name
FROM student
ORDER BY id
LIMIT 0,2;
戻り結果は次のとおりです:
+----+---------+
| id | name |
+----+---------+
| 1 | Emma |
| 2 | William |
+----+---------+
2 rows in set
2ページ目:
SELECT id, name
FROM student
ORDER BY id
LIMIT 2,2;
戻り結果は次のとおりです:
+----+--------+
| id | name |
+----+--------+
| 3 | Olivia |
| 4 | James |
+----+--------+
2 rows in set
3ページ目:
SELECT id, name
FROM student
ORDER BY id
LIMIT 4,2;
戻り結果は次のとおりです:
+----+----------+
| id | name |
+----+----------+
| 5 | Sophia |
| 6 | Benjamin |
+----+----------+
2 rows in set
関連ドキュメント
SELECT構文の詳細については、SELECTを参照してください。クエリ条件演算子の詳細については、比較演算子を参照してください。
サブクエリの詳細については、サブクエリを参照してください。
クエリステートメントの最適化の詳細については、クエリリライトの概要を参照してください。