MySQL取得行数

5166 ワード

このチュートリアルでは、データベースでMySQLローのカウントを取得する方法を学習します.
単一テーブルのMySQLロー数の取得
単一テーブルのローカウントを取得するには、次のようにSELECT文でCOUNT(*)を使用します.
SELECT 
    COUNT(*)
FROM
    table_name;

たとえば、サンプル・データベースのcustomersテーブルのロー数を取得するには、次の文を使用します.
SELECT 
    COUNT(*)
FROM
    customers;

上記のクエリ文を実行すると、次の結果が得られます.
+----------+
| COUNT(*) |
+----------+
|      122 |
+----------+
1 row in set (0.01 sec)

MySQLの2つ以上のテーブルのロー数を取得
複数のテーブルの行数を取得するには、UNION演算子を使用して、SELECT文ごとに返される結果セットを組み合わせます.
たとえば、customersordersのテーブルの行数を単一のクエリで取得するには、次の文を使用します.
SELECT 
    'customers' tablename, 
     COUNT(*) rows
FROM
    customers 
UNION 
SELECT 
    'orders' tablename, 
     COUNT(*) rows
FROM
    orders;

特定のデータベース内のすべてのテーブルのMySQLロー数を取得yiibaidbなどのロー・カウント固有のデータベース内のすべてのテーブルのデータを取得するには、次の手順に従います.
  • まず、データベース内のすべてのテーブル名
  • を取得します.
  • ステップ2では、UNIONで区切られたすべてのテーブルのSELECT COUNT(*)FROM table_name文を含むSQL文を構築します.
  • 手順3では、準備文を使用してSQL文を実行します.

  • 最初に、データベースのすべてのテーブル名を取得するには、information_schemaデータベースから次のようにクエリーします.
    SELECT 
        table_name
    FROM
        information_schema.tables
    WHERE
        table_schema = 'yiibaidb'
            AND table_type = 'BASE TABLE';
    

    上記のクエリを実行すると、次の結果が得られます.
    +--------------+
    | TABLE_NAME   |
    +--------------+
    | customers    |
    | employees    |
    | offices      |
    | orderdetails |
    | orders       |
    | payments     |
    | productlines |
    | products     |
    +--------------+
    8 rows in set (0.02 sec)
    

    ステップ2では、SQL文を構築し、GROUP_を使用します.CONCATとCONCATの関数は次のとおりです.
    SELECT 
        CONCAT(GROUP_CONCAT(CONCAT('SELECT \'',
                            table_name,
                            '\' table_name,COUNT(*) rows FROM ',
                            table_name)
                    SEPARATOR ' UNION '),
                ' ORDER BY table_name')
    INTO @sql 
    FROM
        table_list;
    

    このクエリでは、table_listは、最初のステップのクエリ結果のテーブル名のリストです.
    次のクエリは、派生テーブルとして最初のクエリを使用し、SQL文を文字列で返します.
    SELECT 
        CONCAT(GROUP_CONCAT(CONCAT('SELECT \'',
                            table_name,
                            '\' table_name,COUNT(*) rows FROM ',
                            table_name)
                    SEPARATOR ' UNION '),
                ' ORDER BY table_name')
    INTO @sql 
    FROM
        (SELECT 
            table_name
        FROM
            information_schema.tables
        WHERE
            table_schema = 'yiibaidb'
                AND table_type = 'BASE TABLE') table_list;
    

    MySQL 8.0+を使用する場合は、派生テーブルではなくMySQL CTE(汎用テーブル式)を使用できます.
    WITH table_list AS (
    SELECT
        table_name
      FROM information_schema.tables 
      WHERE table_schema = 'yiibaidb' AND
            table_type = 'BASE TABLE'
    ) 
    SELECT CONCAT(
                GROUP_CONCAT(CONCAT("SELECT '",table_name,"' table_name,COUNT(*) rows FROM ",table_name) SEPARATOR " UNION "),
                ' ORDER BY table_name'
            )
    INTO @sql
    FROM table_list; 
    

    ステップ3では、prepare文を使用して@sql文を実行します.以下に示します.
    USE yiibaidb;
    PREPARE s FROM  @sql;
    EXECUTE s;
    DEALLOCATE PREPARE s;
    

    上記のクエリ統計文を実行すると、次の結果が得られます.
    +--------------+------+
    | table_name   | rows |
    +--------------+------+
    | customers    |  122 |
    | departments  |    0 |
    | employees    |   23 |
    | items        |    9 |
    | offices      |    7 |
    | orderdetails | 2998 |
    | orders       |  327 |
    | payments     |  273 |
    | productlines |    7 |
    | products     |  110 |
    | tasks        |    0 |
    | tokens       |    1 |
    +--------------+------+
    12 rows in set
    

    クエリーを使用して、データベース内のすべてのテーブルのMySQLロー数を取得します.
    データベース内のすべてのテーブルのロー数を取得するには、information_schemaデータベースから直接データを問合せます.
    SELECT 
        table_name, 
        table_rows
    FROM
        information_schema.tables
    WHERE
        table_schema = 'yiibaidb'
    ORDER BY table_rows desc;
    

    上記のクエリを実行すると、次の結果が得られます.
    mysql> SELECT 
        table_name, 
        table_rows
    FROM
        information_schema.tables
    WHERE
        table_schema = 'yiibaidb'
    ORDER BY table_rows desc;
    +--------------+------------+
    | table_name   | table_rows |
    +--------------+------------+
    | orderdetails |       2731 |
    | orders       |        326 |
    | payments     |        256 |
    | customers    |        122 |
    | products     |        110 |
    | employees    |         23 |
    | items        |          9 |
    | productlines |          7 |
    | offices      |          7 |
    | tokens       |          0 |
    | tasks        |          0 |
    | departments  |          0 |
    +--------------+------------+
    12 rows in set
    

    この方法は、テーブルのinformation_schemaのローカウントと実際のローカウントが同期していないため、正確ではない場合があります.これを回避するには、information_schemaデータベースからローカウントを問い合わせる前にANALYZE TABLE文を実行する必要があります.
    ANALYZE TABLE table_name, ...;
    

    このチュートリアルでは、MySQLデータベースの1つ以上のテーブルの行数を取得する方法について学習しました.