最近のトラックバック

  • event (夢茶爺&苦茶爺のPC奮戦備忘録)

カウンタ

おすすめ本

AccRanking

カテゴリ「MySQL」の3件の記事 Feed

2018年10月19日 (金)

【MySQL】UNION MINUS が無いので、代わりに NOT EXISTS を使う方法について

MySQLUNION MINUS が出来ないので、代わりに NOT EXISTS を使って実現します。
前回の記事の ユーザ変数を使って連番や、連続日付を取得する方法について のSQL文を参考にします。

8個の連続日付から、途中の4件を差し引く例を以下に示します。
最初の方のFROM句の中は、10日分の連続日付を生成するテーブル定義になります。
また、 NOT EXISTS 句のFROM句の中は、途中の日付から4日分の連続日付を生成するテーブルとなります。
それぞれのテーブルを日付カラムでリンクを行うと、出力として4日分の日付が中抜けした結果になります。
実行結果は以下の様になります。


【MySQL】ユーザ変数を使って連番や、連続日付を取得する方法について

仕事の中で連番のみの仮想的なテーブルがほしい場合があったので、調べてみたところ、その解決方法としてユーザ変数を使って SQL文1個でできる様なので、その件を記します。

SQL文は以下の様に、2個のSELECT文をUNIONで連結しています。 最初のSELECT文でユーザ変数 @num を初期化し、2個目のSELECT文で @num を順次1加算し、表示することになります。 さらに LIMIT句 で何個までを生成するのかを指定します。
ただ、FROM句には実際のテーブルが必要ですので、あらかじめ TEST と命名したテーブルを作成しておきました。 TEST の中身はなんでもいいのですが、とにかく欲しい連番までのレコード(行)が必要です。
なるべくレコード数が多い方がいいのですが、特別に TEST などというテーブルを作成しなくても MySQLインストール時に生成されるシステムDBのテーブルを使ってもできます。

いろんな方のサイトを見ると、`information_schema`.COLUMNS を使っているのを多く見かけます。 実際このテーブルのレコード数は10万件以上ありますので、これを使うのがいいのではと思います。
実行結果は以下の様になります。
また、この方法を応用して、連続日付の生成を行います。以下のSQLを見て下さい。 @num の部分を @dat として日付発生させるように変更しています。
実行結果は以下の様になります。


2011年4月27日 (水)

MySQLのdualダミーテーブル

Oraleに存在するダミーテーブルDUALですが、MySQLにも存在します。
でもMySQLのマニュアルを見ますと以下の様な記述があります。

「バージョン 4.1.0 以降では、どのテーブルも参照されない状況において、 ダミーテーブル名として DUAL を指定することができる。 これはもっぱら互換性を考慮した機能である。 一部の他のサーバではこの構文が必要となる。」

以下のSQLはどちらを使っても同じ結果が得られます。

Oracleを使ってきた私が、MySQLを使うとDUALを使いたくなってしまいます。
FROM句が無いのがどうも気持ち悪いからで、特に意味はありませんが、みなさんはどうなのでしょうか。

尚、上のSQLの実行はWindowsXPでXAMPPをインストールしてコマンドラインからMySQLを実行しています。
コマンドラインからの実行は以下のコマンドにより実行します。

c:\xampp\mysql\bin\mysql -u root -p


楽天市場