キムラデービーブログ

オープンソースデータベースを加速する「キムラデービー」のブログです。カレー日記を兼ねてます。なお著者は2010-06-01より日本オラクルに在籍していますが、本サイト(ブログ、またはウェブサイト)において示されている見解は、私自身の見解であって、オラクルの見解を必ずしも反映したものではありません。
<< 「SQL実践入門」勝手に補足: Firebirdで実行計画を見る | main | [#ouchidbボツ原稿シリーズ]データベースファイルからの差分バックアップ生成 >>
[#ouchidbボツ原稿シリーズ]縦横に長い表を画面表示に収めるには?
0
    ミックさんとの共著「おうちで学べるデータベースのきほん」はおかげさまで好評です。

    ただ執筆時には原稿を盛り込みすぎてボツになったものもあり、本シリーズ(?) では、そのうちのいくつかをひろって供養したいと思います。

    ■縦に長い表編
    クエリの結果の行数が何行になるかは、クエリを実行してみないとわかりません。また事前にcount(*)を発行して行数を知って、それが画面表示に収まらないとわかったとしても、行数を指定して取得する方法は長らくSQL標準にはありませんでした。MySQLでは古くからLIMIT句を用いてクエリの結果行から指定行数を表示することができるようになっています。たとえば先ほどのクエリの最後にLIMIT 5を追加することによってクエリの結果行の先頭から5行だけ表示することができます。

    mysql> select district, count(*) from city where countrycode = 'JPN' group by district having count(*) > 4 order by count(*) desc limit 5;
    +----------+----------+
    | district | count(*) |
    +----------+----------+
    | Osaka | 22 |
    | Saitama | 21 |
    | Chiba | 19 |
    | Tokyo-to | 18 |
    | Aichi | 15 |
    +----------+----------+
    5 rows in set (0.00 sec)

    LIMIT句は先頭行から指定行数だけではなく、先頭からn行スキップしてm行表示ということもLIMIT n,mという形で指定して実行できます。

    mysql> select district, count(*) from city where countrycode = 'JPN' group by district having count(*) > 4 order by count(*) desc limit 5,5;
    +-----------+----------+
    | district | count(*) |
    +-----------+----------+
    | Kanagawa | 15 |
    | Hyogo | 11 |
    | Hokkaido | 10 |
    | Shizuoka | 9 |
    | Yamaguchi | 6 |
    +-----------+----------+
    5 rows in set (0.01 sec)

    これを繰り返すことでページング的な動作、つまり5行ずつ表示するためのデータを、同一のクエリの最後の部分を「LIMIT 0,5」「LIMIT 5,5」「LIMIT 10,5」と変えていくだけで実現できます。LIMITはクエリによる結果セットに対して適用するものですので、順番として一番最後、つまりORDER BYの後に指定することになります。

    1.SELECT
    2.FROM
    3.WHERE
    4.GROUP BY
    5.HAVING
    6.ORDER BY
    7.LIMIT

    LIMIT句はSQL標準ではありませんが、MySQLとPostgreSQL、IBMのMySQL互換モードONにて利用できます。
    SQL標準ではSQL2008にてFETCH FIRST m ROWSの構文が定められ、同構文を元々利用していたIBM DB2と、
    DB2以外の商用RDBMSの最近のバージョン(MS SQL Server 2012, Oracle 12c)でサポートされています。
    このように主要なRDBMSではかならポピュラーな実装になってきましたが、ここで言及した以外のRDBMSや
    古いバージョンの場合には独自実装により実現していたり、代替クエリにて実現している場合があります。
    次のブログエントリに主要なRDMBSでの指定方法がまとめられていますので、ご参照ください。

    「指定した範囲の行を取得するクエリ(HHeLiBeXの日記 正道編)」

    [2015-05-26 追記] 上記のブログエントリは少し古いので、最近の主要なRDBMSについては、次のエントリもご参照ください。

    部分結果(USE THE INDEX, LUKE)

    なおDB2はFETCH FIRSTはサポートしている(というかもともとDB2の方言)のですが、SQL標準のOFFSETはサポートしていません(!) これも含めてDB2でのびっくりしたことは以下のブログエントリ(英語)をご参照ください。

    Seven Surprising Findings About DB2(USE THE INDEX, LUKE)

    ■横に長い表編
     一般的なRDBMSではMySQLにmysqlコマンドクライアントが存在するように、CUIにて対話的にサーバとやりとりするためのツールが添付されています。
    ただ、そのようなクライアントは横幅が少ないため、カラム数の多い表を表示しようとすると、一行が画面内で何度も折り返されて大変読みにくく表示されてしまいます。
    たとえば、カラム数の多いcountry(国)テーブルをLIMIT句を用いて二行表示されると以下のような表示になってしまいます。

    mysql> select * from country limit 2;
    +------+-------------+---------------+---------------------------+-------------+
    -----------+------------+----------------+---------+--------+-------------------
    ----+----------------------------------------------+---------------+---------+--
    -----+
    | Code | Name | Continent | Region | SurfaceArea |
    IndepYear | Population | LifeExpectancy | GNP | GNPOld | LocalName
    | GovernmentForm | HeadOfState | Capital | C
    ode2 |
    +------+-------------+---------------+---------------------------+-------------+
    -----------+------------+----------------+---------+--------+-------------------
    ----+----------------------------------------------+---------------+---------+--
    -----+
    | ABW | Aruba | North America | Caribbean | 193.00 |
    NULL | 103000 | 78.4 | 828.00 | 793.00 | Aruba
    | Nonmetropolitan Territory of The Netherlands | Beatrix | 129 | A
    W |
    | AFG | Afghanistan | Asia | Southern and Central Asia | 652090.00 |
    1919 | 22720000 | 45.9 | 5976.00 | NULL | Afganistan/Afqanes
    tan | Islamic Emirate | Mohammad Omar | 1 | A
    F
    +------+-------------+---------------+---------------------------+-------------+
    -----------+------------+----------------+---------+--------+-------------------
    ----+----------------------------------------------+---------------+---------+--
    -----+
    2 rows in set (0.01 sec)

    一部のコマンドクライアントツールにはSELECT文で得られる結果セット表示を行ごとに縦表示にする機能があります。
    (この機能には特に定まった呼称はないですがPostgreSQLでは展開表示(Expanded display)機能と呼んでいるようです)
    なお、先ほど説明したLIMITはSQLの一部であり、DBMSからの結果が戻ってくるときにすでにデータが削減されていますが、
    本機能は単純にCUIでの表示の機能だけでり、発行されるSQLやそれによって戻ってくるデータが変わってくるわけではありません。

    MySQLでは通常デリミタとしてつかう;の代わりに¥Gを利用することにより、行ごとに縦表示にできます。先ほどと同じ
    クエリを¥Gにすると次のような見易い形で表示できます。

    mysql> select * from country limit 2¥G
    *************************** 1. row ***************************
    Code: ABW
    Name: Aruba
    Continent: North America
    Region: Caribbean
    SurfaceArea: 193.00
    IndepYear: NULL
    Population: 103000
    LifeExpectancy: 78.4
    GNP: 828.00
    GNPOld: 793.00
    LocalName: Aruba
    GovernmentForm: Nonmetropolitan Territory of The Netherlands
    HeadOfState: Beatrix
    Capital: 129
    Code2: AW
    *************************** 2. row ***************************
    Code: AFG
    Name: Afghanistan
    Continent: Asia
    Region: Southern and Central Asia
    SurfaceArea: 652090.00
    IndepYear: 1919
    Population: 22720000
    LifeExpectancy: 45.9
    GNP: 5976.00
    GNPOld: NULL
    LocalName: Afganistan/Afqanestan
    GovernmentForm: Islamic Emirate
    HeadOfState: Mohammad Omar
    Capital: 1
    Code2: AF
    2 rows in set (0.00 sec)

    MySQL以外のRDBMSではコマンドラインツールの機能としてトグルで表示を切り替えられたり(PostgreSQLの¥xやFirebirdのset list),
    スクリプトにて同様の機能をエミュレート(たとえばOracle用にTanel Poder氏が作成したTPTスクリプト内のpr.sqlなど)していたりしますので、
    コマンドラインツールを多様する方はご自分が利用されているコマンドラインツールに同様の機能がないかチェックしてみてください。Oracle用の表示については、以下のブログエントリが詳しいです。

    SQL*Plusで展開表示 - pr.sql from Tanel Poder's TPT scripts(コーソル DatabaseエンジニアのBlog)

    ★本コラムは「やってみよう! [6-3] データを更新(更新、挿入、削除)してみよう。」に配置することを想定してかかれ、ボツになったものです。。。。

    JUGEMテーマ:コンピュータ
    | meijik | データベース | 20:57 | comments(0) | trackbacks(0) | - | - |









    http://blog.kimuradb.com/trackback/877467
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
    << December 2017 >>
    + RECOMMEND
    100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊
    100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊 (JUGEMレビュー »)

    100人のうちの一人としてミックさんの本を推薦しています。
    + RECOMMEND
    MySQL 5.1 Plugin Development
    MySQL 5.1 Plugin Development (JUGEMレビュー »)
    Andrew Hutchings,Sergei Golubchik
    MySQL 5.1 のプラグインを作るならこれ!
    + RECOMMEND
    AWKを256倍使うための本 (Ascii 256倍)
    AWKを256倍使うための本 (Ascii 256倍) (JUGEMレビュー »)
    志村 拓,鷲北 賢,西村 克信
    ここにきてまさかの復刊。15〜16年前の本ですが、いまでも十分役立ちますよ!!
    + RECOMMEND
    Linux-DB システム構築/運用入門 (DB Magazine SELECTION)
    Linux-DB システム構築/運用入門 (DB Magazine SELECTION) (JUGEMレビュー »)
    松信 嘉範
    Linux-DB システム構築の新スタンダード。DB Magazine人気連載、待望の書籍化です!!
    + RECOMMEND
    + RECOMMEND
    超・極める!MySQL
    超・極める!MySQL (JUGEMレビュー »)
    坂井 恵,志村 和彦,ひろせ まさあき,松信 嘉範
    内容は少々古くなりましたが、内部説明があり、いろいろ面白いです。
    + RECOMMEND
    The Root of .NET Framework
    The Root of .NET Framework (JUGEMレビュー »)
    荒井 省三
    .NETの根っこをつかむ、か?
    + RECOMMEND
    エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド
    エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド (JUGEMレビュー »)
    奥野 幹也
    これまでにない構築、そして構築後のMySQLのための本。
    + RECOMMEND
    Database Management Systems
    Database Management Systems (JUGEMレビュー »)
    Raghu Ramakrishnan,Johannes Gehrke
    ミックさん連載の参考書籍です。
    + RECOMMEND
    Advanced Programming in the UNIX Environment: Paperback Edition (2nd Edition) (Addison-Wesley Professional Computing Series)
    Advanced Programming in the UNIX Environment: Paperback Edition (2nd Edition) (Addison-Wesley Professional Computing Series) (JUGEMレビュー »)
    W. Richard Stevens,Stephen A. Rago
    必読! といいつつ私が読んだのは初版の日本語訳です。差分はチェックしないといけませんね。
    + RECOMMEND
    + RECOMMEND
    + RECOMMEND
    Western Digital Scorpio Blue 2.5inch 5400rpm 320GB 8MB PATA WD3200BEVE
    Western Digital Scorpio Blue 2.5inch 5400rpm 320GB 8MB PATA WD3200BEVE (JUGEMレビュー »)

    DELL SX260の換装用に購入。今はコチラのほうが安いですね。
    + RECOMMEND
    情熱プログラマー ソフトウェア開発者の幸せな生き方
    情熱プログラマー ソフトウェア開発者の幸せな生き方 (JUGEMレビュー »)
    Chad Fowler
    OSC2010神戸に出展されたジュンク堂で買いました。
    + RECOMMEND
    Software Design 総集編 【2000~2009】(DVD付)
    Software Design 総集編 【2000~2009】(DVD付) (JUGEMレビュー »)

    メガトン級の過去記事。売り切れる前にお店に急げ!
    + RECOMMEND
    + RECOMMEND
    玄人志向 2.5型HDDケース SATA対応USB2.0接続 GW2.5AI-SU2
    玄人志向 2.5型HDDケース SATA対応USB2.0接続 GW2.5AI-SU2 (JUGEMレビュー »)

    Aspire 1410 HDD換装後、昔のHDDはこれにいれます。
    + RECOMMEND
    + RECOMMEND
    acer Aspire Timeline AS1410 11.6型ノートPC Windows7搭載 250GB ブラック AS1410-KK22
    acer Aspire Timeline AS1410 11.6型ノートPC Windows7搭載 250GB ブラック AS1410-KK22 (JUGEMレビュー »)

    色違い黒(他に青と白があります): メモリは最大4GBとあるが、がんばれば8GBいけるらしい。
    + RECOMMEND
    Firebird 徹底入門
    Firebird 徹底入門 (JUGEMレビュー »)
    木村 明治,はやし つとむ,坂井 恵
    Firebird日本ユーザ会のはやしさん、そしてMyNAから拝借(?) してきた坂井さんとともに書きました。まだ誰も知らないFirebird 2.5や、いままでドキュメントのなかったツール類についてもソースを確認してとりあげた本です。是非ご活用ください。
    + SELECTED ENTRIES
    + RECENT COMMENTS
    • 使い慣れたSQLに潜む実装依存: Firebirdの場合(6) 文字列との結合演算子
      noname (12/10)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      Moriaki_ (01/05)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      Moriaki_ (01/05)
    • 2015年版 InterBaseの歩み
      nakagami (12/06)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      meijik (11/22)
    • 分散DB本読書会第46回メモ「STOP AFTER 10」
      masudahidehiko (09/01)
    • Windows上でのMySQLビルド方法
      kinoyasu (03/31)
    • 気軽に新しいMySQLを試してみる: MySQL Sandboxのススメ
      MeijiK (09/19)
    • 伝わらない曲シリーズ: 川島恵「ミスター不思議」
      96 (07/05)
    • 気軽に新しいMySQLを試してみる: MySQL Sandboxのススメ
      MeijiK (02/17)
    + RECENT TRACKBACK
    + CATEGORIES
    + ARCHIVES
    + MOBILE
    qrcode
    + LINKS
    + PROFILE