キムラデービーブログ

オープンソースデータベースを加速する「キムラデービー」のブログです。カレー日記を兼ねてます。なお著者は2010-06-01より日本オラクルに在籍していますが、本サイト(ブログ、またはウェブサイト)において示されている見解は、私自身の見解であって、オラクルの見解を必ずしも反映したものではありません。
NULLと重複行に対するINTERSECT ALL
0
    NULLと重複行に対するINTERSECT ALL

    エントリはFirebird Advent Calendar 2018の15日目です。

    前日のエントリでNULLや重複行が「ある」場合にも対応したINTERSECTを紹介しました。

    では、INTERSECT ALLはどうでしょう?

    やはり「プログラマのためのSQL 第4版 34.2.2 NULLと重複行に対するINTERSECTとEXCEPT」という部分に以下の回答があります。

    -- S1 INTERSECT ALL S2
    SELECT D2.a
    FROM (SELECT D1.a, MIN(cnt) AS mincnt
    FROM (SELECT a1, COUNT(*)
    FROM S1
    GROUP BY a1
    UNION ALL
    SELECT a2, COUNT(*)
    FROM S2
    GROUP BY a2) AS D1(a, cnt)
    GROUP BY D1.a
    HAVING COUNT(*) > 1) AS D2
    INNER JOIN
    Series
    ON seq <= mincnt;

    これで答えは求まるのですが、あらかじめSeriesというテーブルを内容{1,2,3,4,....n}で、それぞれのテーブルの行数最大値nで用意しておく必要があります。

    まぁ、このような内容のテーブルはCTE(Common Table Expression)の再帰で気軽に作成できるので、今回のようにそれぞれ7行とわかっている場合には以下のように頭に6行(WITH RECURSIVE...())つけて、CTEの再帰クエリでSeries(cnt)をつくれば、あらかじめSeriesというテーブルを追加せずに求めることができます。

    WITH RECURSIVE Series AS
    (
    SELECT 1 AS seq from rdb$database
    UNION ALL
    SELECT 1+seq FROM Series WHERE seq < 8
    )
    SELECT D2.a
    FROM (SELECT D1.a, MIN(cnt) AS mincnt
    FROM (SELECT a1, COUNT(*)
    FROM S1
    GROUP BY a1
    UNION ALL
    SELECT a2, COUNT(*)
    FROM S2
    GROUP BY a2) AS D1(a, cnt)
    GROUP BY D1.a
    HAVING COUNT(*) > 1) AS D2
    INNER JOIN
    Series
    ON seq <= mincnt;

    A
    ======

    a
    b
    b
    c

    ご参考まで。なおNULLが頭にくるのはFirebirdの仕様です。詳細は以下のマニュアルをご参照ください。

    使い慣れたSQLに潜む実装依存: Firebirdの場合(10) ORDER BY でのNULLの扱い

    まぁ今回の場合は明示的にORDER BYがないので、単純にGROUP BYで暗黙のソートがされた結果というわけです。

    JUGEMテーマ:コンピュータ



    | meijik | Firebird/InterBase | 00:34 | comments(0) | trackbacks(0) | - | - |
    NULLと重複行に対するINTERSECT
    0
      NULLと重複行に対するINTERSECT

      エントリはFirebird Advent Calendar 2018の14日目です。

      前日のエントリでFirebird(とMySQLも)INTERSECTとEXCEPTは対応していないことと、NULLや重複行がない場合はググればでてくるようなクエリでだいたい大丈夫ということを述べました。

      では、NULLや重複行が「ある」場合はどうでしょう?

      一つの解は「プログラマのためのSQL 第四版 日本語版」の「34.2.2 NULLと重複行に対するINTERSECTとEXCEPT」に掲載されているイツァック・ベンガン(itzik ben-gan)によるものがあります。

      -- 利用するテーブル
      CREATE TABLE S1(a1 CHAR(1));
      INSERT INTO S1 VALUES('a');
      INSERT INTO S1 VALUES('a');
      INSERT INTO S1 VALUES('b');
      INSERT INTO S1 VALUES('b');
      INSERT INTO S1 VALUES('c');
      INSERT INTO S1 VALUES(NULL);
      INSERT INTO S1 VALUES(NULL);

      CREATE TABLE S2 (a2 CHAR(1));
      INSERT INTO S2 VALUES('a');
      INSERT INTO S2 VALUES('b');
      INSERT INTO S2 VALUES('b');
      INSERT INTO S2 VALUES('b');
      INSERT INTO S2 VALUES('c');
      INSERT INTO S2 VALUES('d');
      INSERT INTO S2 VALUES(NULL);
      COMMIT;

      上記のように重複やNULLが入ったテーブルS1とS2のINTERSECTを取るときには、重複やNULLの考慮がないクエリだと正しい結果がかえりません。

      S1 INTERSECT S2の場合、望ましい結果は以下になります。

      a
      b
      c
      NULL

      例えば"firebird intersect"で検索すると上位にでる以下のエントリの場合、

      Emulate INTERSECT and EXCEPT where they aren't natively supported #3581

      select distinct
      S1.*
      from
      S1
      inner join S2 on S1.a1 = S2.a2;

      結果はNULLのないものとなってしまいます。

      a
      b
      c

      # INTERSECTなので、S1 INTERSECT S2, S2 INTERSECT S1はどちらも同じ結果になる
      Firebirdは本にのっている以下のクエリで結果がでます。

      -- S1 INTERSECT S2(オリジナル)
      SELECT D.a
      FROM (SELECT DISTINCT a1 FROM S1
      UNION ALL
      SELECT DISTINCT a2 FROM S2) AS D(a)
      GROUP BY D.a
      HAVING COUNT(*) > 1;

      A1
      ======

      a
      b
      c

      ちなみにオリジナルのままではMySQLエラーになるので、エラーにならないバージョンは以下。

      -- S1 INTERSECT S2 (MySQLでエラーにならないバージョン)
      SELECT D.a1
      FROM (SELECT DISTINCT a1 FROM S1
      UNION ALL
      SELECT DISTINCT a2 FROM S2) AS D
      GROUP BY D.a1
      HAVING COUNT(*) > 1;



      | meijik | - | 22:19 | comments(0) | trackbacks(0) | - | - |
      あなたのDBはINTERSECTとEXCEPTをサポートしているかどうか。Firebird(とMySQL)はしてねえっす。
      0
        あなたのDBはINTERSECTとEXCEPTをサポートしているかどうか。Firebirdはしてねえっす。

        本エントリは(遅れていますが)Firebird Advent Calendar 2018の13日目のエントリです。

        本来は「Firebirdの分析関数の衝撃(12) 2つのテーブルが相等であるかどうか」というエントリを書こうとおもったのですが、その前提(?) にINTERSECTとEXCEPTが必要だったので、それについて先にまとめておきたくて、このエントリになりました。

        各データベースの集合演算(UNION, INTERSECTION, EXCEPT)の実装度合いはデータベースによって違う(UNION, UNION ALLは全てのデータベースでサポートされている) 割り算(DIVIDE BY的なもの)は、全てのデータベースでサポートされていません。

        なぜALLがあるのか、とか、割り算がないのか、というところは以下のミックさんのブログ記事を御参照ください。

        SQLで集合演算

        各データベースの集合演算のサポート具合で、三つのグループに分けられます。

        (1) INSERSECTとEXCEPTのどちらもサポートしていない: Firebird, MySQL
        (2) INSERSECTとEXCEPT(MINUS)のどちらもサポートしているが、ALLをサポートしていない: Oracle, SQLite, SQL Server (2005以降), MariaDB (10.3以降)
        (3) INSERSECTとEXCEPTもサポートし、それぞれALLもサポートしている: IBM Db2, PostgreSQL

        # Firebird以外は以下のエントリが参考になります。

        What’s New in MariaDB 10.3, 5.Intersect and Except

        FirebirdへのFR(Feature Request)は以下。

        [#CORE-808] Add support for INTERSECT and EXCEPT data set operators

        PostgreSQL, IBM Db2以外のRDBMで、
        (2) でINTERSECT ALL, EXCEPT ALLをシミュレート、
        (1) で上記に加えてINTERSETC, EXCEPTをシミュレートするには、
        プログラマのためのSQL 第四版 第34章集合演算(Set Operation)の34.2 INTERSECTとEXCEPTを読むといいです。(最新のSQL for Smarties 5th EditionではCHAPTER 16 SET Operationの16.2 INTERSECT and EXCEPT にあたります)

        注意すべき点はNULLと値の重複の有無です。これらがなければネットで検索してでてくるようなクエリはほとんど動く(はず)です。例えば対象とする列が主キーであれば、問題なく動くはずです。

        JUGEMテーマ:コンピュータ



        | meijik | クロスデータベース | 01:23 | comments(0) | trackbacks(0) | - | - |
        LibreOffice 6.2 の Firebird
        0
          本エントリはFirebird Advent Calendar 2018 の 12日目のエントリです。

          四年前くらいからなんやかんやいっていたBase (MS OfficeでいうところのAccess的な立ち位置)で
          Firebirdが使えるようになりました。再度「実験的な機能」からの脱却。

          DB選択画面

          バージョンは6.2 Beta このままGAを向かうことを期待しています。そして、そのときにはデフォルトがFirebirdになっていてくれるとありがたいですが。。。。

          JUGEMテーマ:コンピュータ



          | meijik | Firebird/InterBase | 23:27 | comments(0) | trackbacks(0) | - | - |
          [勝手に対応]MySQL8.0の分析関数の2(Lag関数と累計と移動累計)
          0
            [勝手に対応]MySQL8.0の分析関数の2(Lag関数と累計と移動累計)

            本エントリはMySQL Casual Advent Calendar 2018の11日目です。

            MySQLでは8.0からウインドウ関数に対応しました。これにより商用RDBMS御三家+PostgreSQLが対応していた
            多くの分析関数・ウインドウ関数が利用できるようになりました。

            本エントリは以下のエントリの続きです。

            [勝手に対応]MySQL8.0の分析関数の1(モードとメジアン)


            1. 部分的に不一致なキーの検索

            PostgreSQL 8.4でエラーになるクエリはMySQL 8.0でもエラーになります。(PostgreSQL 11 でも同じ)

            ERROR 1235 (42000): This version of MySQL doesn't yet support '(DISTINCT ..)'

            これはWindow関数内でDISTINCT を扱えない、実装上の問題です。

            window関数で書き換えたSQL1,2は動作しますが、
            window関数で書き換えたSQL3,4はPostgreSQL特有の配列を使ったものですので、PostgreSQL以外は動作しません。

            [To be contined]


            JUGEMテーマ:コンピュータ



            | meijik | MySQL | 23:58 | comments(0) | trackbacks(0) | - | - |
            Firebirdの分析関数の衝撃(11) 「2日前の値」
            0
              本エントリはFirebird Advent Calendar 2018 の10日目です。

              Firebirdの分析関数の衝撃(11) 「2日前の値」


              5. 「2日前の値」

              テーブル定義とデータはそのまま使えます。

              クエリは前回と同様に「prc_date-interval '2 day'」の部分を「dateadd(-2 day to prc_date)」に変更すればよいだけです。

              -- window関数で書いたSQL(dateaddを使ったFirebird版)
              select prc_date,prc_amt,
              case when Lag(prc_date,2) over(order by prc_date) = dateadd(-2 day to prc_date)
              then Lag(prc_amt,2) over(order by prc_date)
              when Lag(prc_date) over(order by prc_date) = dateadd(-2 day to prc_date)
              then Lag(prc_amt) over(order by prc_date)
              else 0 end as before_prc_amt
              from Accounts;

              -- 相関サブクエリで書いたSQL(dateaddを使ったFirebird版)
              select prc_date,prc_amt,
              coalesce((select b.prc_amt
              from Accounts b
              where b.prc_date = dateadd(-2 day to a.prc_date))
              ,0) as before_prc_amt
              from Accounts a;

              -- 外部結合で書いたSQL(dateaddを使ったFirebird版)
              select a.prc_date,a.prc_amt,
              coalesce(b.prc_amt,0) as before_prc_amt
              from Accounts a Left Join Accounts b
              on dateadd(-2 day to a.prc_date) = b.prc_date;

              [それぞれのクエリ結果]
              PRC_DATE PRC_AMT BEFORE_PRC_AMT
              =========== ============ ==============
              2006-10-26 100 0
              2006-10-28 200 100
              2006-10-31 400 0
              2006-11-03 800 0
              2006-11-04 1600 0
              2006-11-06 3200 1600
              2006-11-11 6400 0

              ここまで書いて「あれ、window関数版はorder byあるけど、相関サブクエリ版や外部結合版はorder byないのでAccountsテーブルがprc_dateでソートされている保障ないじゃん!」と思ったのですが、よくよくそれぞれのクエリをみると、相関サブクエリも外部結合も=で比較しているだけですし、prc_dateは主キーの日付なので問題ないですね。

              またひとつ前「4. 「2日前からの累計」」のクエリも相関サブクエリ版はbetweenで日付を指定しているだけで、そのbetween内の行順序は保障する必要はないので、これもまた大丈夫でした。

              JUGEMテーマ:コンピュータ

              | meijik | Firebird/InterBase | 00:10 | comments(0) | trackbacks(0) | - | - |
              Firebirdの分析関数の衝撃(10) 「2日前からの累計」
              0
                本エントリはFirebird Advent Calendar 2018 の9日目です。

                Firebirdの分析関数の衝撃(10) 「2日前からの累計」

                4. 「2日前からの累計」

                テーブル定義とデータはそのまま使えます。
                PostgreSQL 8.4で利用できないクエリは、Firebird 3.0でも利用できません。これはrangeが未実装のためです。

                Window Functions

                それ以外のwindow関数利用のクエリ、未使用のクエリは動作します。
                ただし、一部Firebird独自の関数のdateadd()に変更する必要があります。
                datesub()はなく、第一引数をマイナスにすると引き算相当になります。

                -- window関数で書いたSQL。-interval '2 day'がないのでdateadd()関数に変更。
                select prc_date,prc_amt,
                prc_amt+
                case when Lag(prc_date,2) over(order by prc_date) >= dateadd(-2 day to prc_date)
                then Lag(prc_amt,2) over(order by prc_date) else 0 end +
                case when Lag(prc_date) over(order by prc_date) >= dateadd(-2 day to prc_date)
                then Lag(prc_amt) over(order by prc_date) else 0 end as mvg_sum
                from Accounts;

                -- 相関サブクエリで書いたSQL。-interval '2 day'がないのでdateadd()関数に変更
                select prc_date,prc_amt,
                (select sum(b.prc_amt)
                from Accounts b
                where b.prc_date between dateadd(-2 day to a.prc_date)
                and a.prc_date) as mvg_sum
                from Accounts a;

                PRC_DATE PRC_AMT MVG_SUM
                =========== ============ =====================
                2006-10-26 100 100
                2006-10-28 200 300
                2006-10-31 400 400
                2006-11-03 800 800
                2006-11-04 1600 2400
                2006-11-06 3200 4800
                2006-11-11 6400 6400

                JUGEMテーマ:コンピュータ



                | meijik | Firebird/InterBase | 00:09 | comments(0) | trackbacks(0) | - | - |
                Firebirdの分析関数の衝撃(9) 「最大何人まで座れますか?」
                0
                  本エントリはFirebird Advent Calendar 2018 の八日目です。

                  Firebirdの分析関数の衝撃(9) 「最大何人まで座れますか?」

                  3. 「最大何人まで座れますか?」

                  以下のDDL, DMLでSeats3テーブルを作成します。text型をドメインでVARCHARに定義済みの人はダウンロードできるソースそのまま(status text)でも大丈夫です。

                  create table Seats3(
                  seat integer primary key,
                  status char(2));

                  insert into Seats3 values( 1,'占');
                  insert into Seats3 values( 2,'空');
                  insert into Seats3 values( 3,'空');
                  insert into Seats3 values( 4,'空');
                  insert into Seats3 values( 5,'空');
                  insert into Seats3 values( 6,'占');
                  insert into Seats3 values( 7,'空');
                  insert into Seats3 values( 8,'占');
                  insert into Seats3 values( 9,'空');
                  insert into Seats3 values(10,'空');

                  commit;

                  これをいったん定義すれば、ミックさんのビュー定義、クエリ。
                  山岸さんのWindow関数版すべて動作します。

                  START_SEAT END_SEAT SEAT_CNT
                  ============ ============ =====================
                  2 5 4

                  JUGEMテーマ:コンピュータ



                  | meijik | Firebird/InterBase | 00:06 | comments(0) | trackbacks(0) | - | - |
                  Firebirdの分析関数の衝撃(8) 「3人なんですけど座れますか?」(行の折り返しを考慮する)
                  0
                    本エントリはFirebird Advent Calendar 2018 の七日目です。今年も参加者募集!

                    Firebirdの分析関数の衝撃(8) 「3人なんですけど座れますか?」(行の折り返しを考慮する)

                    2. 「3人なんですけど座れますか?」その2:行の折り返しも考慮する

                    ミックさんの『SQLで数列を扱う』では、最初折り返しを考慮しない、つまり1席から15席までを連続した席として
                    扱っていましたが、映画館やコンサートホールでは、一定の幅で折り返ししています。この場合数値としては連続していても列で分断される場合があり「折り返しを考慮する」とは、それを考慮したものになります。たとえば今回の場合は以下のようになり、結果として前回の結果から(9, 10, 11)を省いたものになります。

                    A列: 1 2 3 4 5
                    B列: 6 7 8 9 10
                    C列:11 12 13 14 15

                    クエリとしては:haed_cntに3を入れるのは前回と同じで、そのクエリに条件「OR S3.row_id <> S1.row_id」を追加したものになります。
                    実行前にSeatsからSeats2を作っておきましょう。列名をいれるRow_ID列を追加作成し、その値'A','B','C'をseat番号を割り算してそれぞれのアスキーキャラクタを生成するascii_char関数で生成しています。

                    create table Seats2(seat int,Row_ID char(2), status char(2));
                    insert into Seats2 select seat,ascii_char(65+(seat-1)/5),status from Seats;
                    commit;

                    SELECT S1.seat AS start_seat, '〜' , S2.seat AS end_seat
                    FROM Seats2 S1, Seats2 S2
                    WHERE S2.seat = S1.seat + (3 -1) --始点と終点を決める
                    AND NOT EXISTS
                    (SELECT *
                    FROM Seats2 S3
                    WHERE S3.seat BETWEEN S1.seat AND S2.seat
                    AND ( S3.status <> '空'
                    OR S3.row_id <> S1.row_id));

                    START_SEAT CONSTANT END_SEAT
                    ============ ======== ============
                    3 〜 5
                    7 〜 9
                    8 〜 10

                    さて残念ながら、このページのwindow関数で書き換えたSQL1,2ともにFirebirdでは動作しません。これは「名前つきウインドウ(named windows)」がFirebird 3.0は未サポートのためです。(4.0にて実装予定)そのため「 window W1 as (partition by row_id order by seat)」のようにW1を扱うことができません。

                    Window Functions

                    window関数を使わないSQL1,2は動作します。

                    ROW_ID START_SEAT END_SEAT
                    ====== ============ =====================
                    A 3 5
                    B 7 9
                    B 8 10

                    JUGEMテーマ:コンピュータ



                    | meijik | Firebird/InterBase | 08:47 | comments(0) | trackbacks(0) | - | - |
                    Firebirdの分析関数の衝撃(7) 「3人なんですけど座れますか?」(行の折り返しを考慮しない)
                    0
                      本エントリはFirebird Advent Calendar 2018 の六日目です。今年も参加者募集!

                      Firebirdの分析関数の衝撃(7) 「3人なんですけど座れますか?」(行の折り返しを考慮しない)

                      1. 「3人なんですけど座れますか?」その1:行の折り返しを考慮しない


                      まずミックさんの『SQLで数列を扱う』で提示されているSQL「人数分の空席を探す その1:行の折り返しを考慮しない」では、バインド変数(プレースホルダ) :head_cntが利用されています。Firebirdでも2.1以降でユーザコンテキスト変数があるので、それを使えばエミュレートできますが、ここは素直に即値の3を使います。(3以外の値を汎用的に利用したい場合はユーザコンテキスト変数を使ってください)

                      SELECT S1.seat AS start_seat, '〜' , S2.seat AS end_seat
                      FROM Seats S1, Seats S2
                      WHERE S2.seat = S1.seat + (3 -1) --始点と終点を決める
                      AND NOT EXISTS
                      (SELECT *
                      FROM Seats S3
                      WHERE S3.seat BETWEEN S1.seat AND S2.seat
                      AND S3.status <> '空' );

                      次に言及だけされている「PostgreSQL8.4では文法エラー」のものは動きません。
                      これは先に説明したフレーム句が未サポートのためです。

                      テーブルとデータはダウンロードできる形式のものは使えないし、FirebirdではCREATE TABLE ... AS SELECT....
                      が使えない
                      ので、普通に作成します。

                      create table Seats(seat int,status char(2));
                      insert into Seats values(1,'占');
                      insert into Seats values(2,'占');
                      insert into Seats values(3,'空');
                      insert into Seats values(4,'空');
                      insert into Seats values(5,'空');
                      insert into Seats values(6,'占');
                      insert into Seats values(7,'空');
                      insert into Seats values(8,'空');
                      insert into Seats values(9,'空');
                      insert into Seats values(10,'空');
                      insert into Seats values(11,'空');
                      insert into Seats values(12,'占');
                      insert into Seats values(13,'占');
                      insert into Seats values(14,'空');
                      insert into Seats values(15,'空');

                      これで確認すると、掲載されているWindow関数版、非Window関数版のクエリとも
                      PostgreSQL 8.4レベルのものは全部実行できます。結果はこんな感じです。

                      SEATSTART SEATEND
                      ============ ============
                      3 5
                      7 9
                      8 10
                      9 11

                      JUGEMテーマ:コンピュータ



                      | meijik | Firebird/InterBase | 22:24 | comments(0) | trackbacks(0) | - | - |
                            1
                      2345678
                      9101112131415
                      16171819202122
                      23242526272829
                      3031     
                      << December 2018 >>
                      + 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