OceanBase logo

OceanBase

トランザクション処理、分析、AIワークロードに最適な分散データベース

プロダクト概要
デプロイを自由に

OceanBase Cloud

OceanBaseの導入とスケーリングを最適化

エンタープライズ版

自社インフラ上での運用・管理に対応

オープンソース版を試す

コミュニティ版

開発者向けオープンソース分散データベース

OceanBase seekdb

AIネイティブなオープンソースの検索データベース

顧客事例

さまざまな業界の企業による導入事例を紹介します。

さらに見る
利用シーン別

あらゆるシナリオに対応するOLTP

ハイブリッドクラウドソリューション

大容量ストレージデータベースのコスト削減

リアルタイム分析混合ワークロード

複数インスタンスの統合

ドキュメント

会社概要

OceanBaseの企業情報、パートナーシップ、そして信頼性・セキュリティへの取り組みについて紹介します。

OceanBaseについて

トラストセンター

法的情報

お問い合わせ

日本 - 日本語
International - English
中国站 - 简体中文
クラウドで始める

OceanBase

トランザクション処理、分析、AIワークロードに最適な分散データベース

プロダクト概要
デプロイを自由に

OceanBase Cloud

OceanBaseの導入とスケーリングを最適化

エンタープライズ版

自社インフラ上での運用・管理に対応

オープンソース版を試す

コミュニティ版

開発者向けオープンソース分散データベース

OceanBase seekdb

AIネイティブなオープンソースの検索データベース

顧客事例

さまざまな業界の企業による導入事例を紹介します。

さらに見る
利用シーン別

あらゆるシナリオに対応するOLTP

ハイブリッドクラウドソリューション

大容量ストレージデータベースのコスト削減

リアルタイム分析混合ワークロード

複数インスタンスの統合

OceanBaseの企業情報、パートナーシップ、そして信頼性・セキュリティへの取り組みについて紹介します。

OceanBaseについて

トラストセンター

法的情報

お問い合わせ

クラウドで始める
编组
すべての製品
    • データベース
    • アイコンOceanBaseデータベース
    • アイコンOceanBase Cloud
アイコン

OceanBaseデータベース

SQL - V4.4.2

    OceanBase ロゴ

    AI時代を支える分散データベース

    日本 - 日本語
    International - English
    中国站 - 简体中文
    プロダクト
    OceanBase Cloudエンタープライズ版コミュニティ版OceanBase seekdb
    会社概要
    OceanBaseについてトラストセンター法的情報お問い合わせ
    公式アカウント
    ConnpassXQiitaLumaGitHub

    © OceanBase 2026. All rights reserved

    クラウドサービス契約個人情報保護ポリシーセキュリティ
    お問い合わせ
    ドキュメントフィードバック
    1. ホーム
    2. OceanBaseデータベース
    3. SQL
    4. V4.4.2
    アイコンOceanBaseデータベース
    SQL - V 4.4.2
    データベース
    • OceanBaseデータベース
    • OceanBase Cloud
    SQL
    KV
    • V 4.4.2
    • V 4.3.5

    単一テーブルのクエリ

    最終更新日:2026-06-15 02:31:30  更新
    シェア
    このページの内容
    前提条件
    構文
    SELECTキーワードの実行順序の概要
    テストテーブルの作成とテストデータの追加
    基本的なクエリ
    すべての列を照会する
    指定された列を照会する
    計算された値のクエリと列のエイリアス指定
    データのフィルタリング
    比較条件クエリ
    論理条件クエリ
    あいまいクエリ
    区間クエリ
    指定集合クエリ
    NULL値専用クエリ
    データのグループ化
    単一フィールドによるグループ化クエリ
    複数フィールドによるグループ化クエリ
    グループ化前のフィルタリング
    グループ化後のフィルタリング
    グループ化後のソート
    集計クエリ
    データのソート
    単一フィールドによるソートクエリ
    複数フィールドによるソートクエリ
    ORDER BY句での関数を用いたソート
    データフィルタリング後のソート
    LIMIT句
    結果セットの行数を制限する
    ページネーションクエリ
    関連ドキュメント

    折りたたみ

    シェア

    本記事では、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 これらのキーワードを同時に使用する場合、実行の順序には明確な制限があります。キーワードの実行順序は以下のとおりです:

    1. FROM を実行してテーブルを特定します。

    2. WHERE を実行して制約条件を指定します。

    3. GROUP BY を実行して、取得した各レコードをグループ化(集計)します。GROUP BY がない場合、全体が1つのグループとなります。

    4. HAVING を実行して、グループ化された結果をフィルタリングします。

    5. SELECT を実行します。

    6. DISTINCT を実行して、重複を除去します。

    7. ORDER BY を実行して、条件に基づいて結果を昇順または降順に並べ替えます。

    8. LIMIT を実行して、結果の件数を制限します。

    注意

    WHERE と HAVING の違いは、WHERE がグループ化前にデータをフィルタリングするのに対し、HAVING はグループ化後の結果でフィルタリングを行い、最終的にSQL全体のクエリ結果を返すことです。

    テストテーブルの作成とテストデータの追加

    1. テーブル 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)
      );
      
    2. テーブル 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');
      
    3. テーブル 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 '注文テーブル';
      
    4. テーブル 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を参照してください。

    • クエリ条件演算子の詳細については、比較演算子を参照してください。

    • サブクエリの詳細については、サブクエリを参照してください。

    • クエリステートメントの最適化の詳細については、クエリリライトの概要を参照してください。

    前のトピック

    集合演算
    最後

    次のトピック

    DBLinkを使用したクエリの実行
    次
    このページの内容
    前提条件
    構文
    SELECTキーワードの実行順序の概要
    テストテーブルの作成とテストデータの追加
    基本的なクエリ
    すべての列を照会する
    指定された列を照会する
    計算された値のクエリと列のエイリアス指定
    データのフィルタリング
    比較条件クエリ
    論理条件クエリ
    あいまいクエリ
    区間クエリ
    指定集合クエリ
    NULL値専用クエリ
    データのグループ化
    単一フィールドによるグループ化クエリ
    複数フィールドによるグループ化クエリ
    グループ化前のフィルタリング
    グループ化後のフィルタリング
    グループ化後のソート
    集計クエリ
    データのソート
    単一フィールドによるソートクエリ
    複数フィールドによるソートクエリ
    ORDER BY句での関数を用いたソート
    データフィルタリング後のソート
    LIMIT句
    結果セットの行数を制限する
    ページネーションクエリ
    関連ドキュメント