Category Archives: SQL

SQLで○○以外(<>)の時のNULLには気をつけろ!

2
Filed under MySQL, SQL, 未分類

今日実際にこんな現象を見たので、メモ的に残しておきます。
SQLで何かするときに、以下のようなパターンがあると思う。

| id | val1 |
| 1 | 5 |
| 2 | 10 |
| 3 | 1 |
| 4 | 100 |
| 5 | NULL |
| 6 | 20 |

この場合に、NULLをひっぱったりするときに IS を利用するのは知ってました。

SELECT id, val1 FROM test WHERE val1 is NULL;

ここで今回のメモは、

SELECT id, val1 FROM test WHERE val1 <> 100;

このようにした場合に、NULLはHITしないということです。
型が違うためかどうかわかりませんが、そういうことです。
対策としては、NULLについても別途条件を追加することです。

SELECT id, val1 FROM test WHERE (val1 is NULL or val1 <> 100);

これで、あなたにも明るい未来が見えることでしょう。

MySQLで行番号表示

0
Filed under MySQL, SQL
Tagged as

MySQLで行番号を表示したかったんですが、どうしたものか調べていたら、
無常迅速さんのサイトで
よさげなものを見つけました。

SET @i:=0;
SELECT
(@i:=@i+1) as row_number, a_col, b_col, c_col, d_col
FROM
test_table
ORDER BY
b_col;

みたいな感じにすると、row_numberのカラムに行番号が表示できちゃいました。
これはちょっとありがたい。

レコードで何番目のデータかとか出す時には便利ですね。

MySQLのおすすめ書籍


DB Error: mismatchがでたぞ!!

2
Filed under MySQL, php, SQL
Tagged as , , ,

php経由でMysqlに接続して処理してたときに
なんでか理由がわからないけどエラーがでた。

DB Error: mismatch

試した感じからすると、where句の内容に問題があるようだ。

【エラーが出る例】

select * from table where column != ? ;

  ※「?」はプレースホルダしてるから。
   ちなみにSSH経由でmysqlコマンドで接続して実行するとエラーにならない。

【エラーが出ない例】

 select * from table where column <> ? ;

  ※これだとエラーにならないわけです。

なんでですかね?
 phpとの相性?
 プレースホルダ絡み?
 phpの書き方に問題があった?

ちょっとわからないけど、備忘録として残しておきます。
知ってる人いたら、コメントください。

MySQLで”The used SELECT statements have a different number of columns”

0
Filed under MySQL, SQL
Tagged as ,

PHP&MySQLでSQLを書いてたときに、

“The used SELECT statements have a different number of columns”

みたいなエラーがでました。
グーグル先生に聞いたところ、MySQL本家サイトにも記述がありました。

理由としては、
UNIONを利用していて、片方だけにしか特定のカラムがない場合にでるようです。
出力カラムの数を数えるのと、カラム名を確認してみたらいいんじゃないでしょうか。

僕は単純にカラム数(column)がたりませんでした。

注意力が足りなくて、スミマメーン!

MySQLでテーブルをコピー&リネーム

1
Filed under MySQL, SQL
Tagged as ,

MySQLを利用していて、テーブルをリネームしてみたくなったり、
コピーしてみたくなったりすることがありますよね。

なので、一応まとめときます。

【テーブルリネーム】

RENAME TABLE before_table_name TO after_table_name;

例:
  変更前のテーブル名が 「tec」 で
  変更後のテーブル名を 「log」 にしたい場合には、

RENAME TABLE tec to log;

次に特定のテーブルをコピーしたい場合です。

【テーブルコピー】

CREATE TABLE new_table AS SELECT * FROM old_table;

例1:
  コピー元のテーブル名が 「apple」 で
  コピー先「新規作成」のテーブル名が 「melon」の場合には、

CREATE TABLE melon AS SELECT * FROM apple;

例2:
特定の条件のもののみコピーしたい場合には WHERE句で指定して
  コピーすることもできます。

  コピー元のテーブル名が 「all」 で
  コピー先「新規作成」のテーブル名が 「now」で
  「Year」カラムが「2008」のもののみ抜き出す場合には、

  CREATE TABLE now AS SELECT * FROM all WHERE Year = ’2008′;

というような形になりますね。

ということで、久々の更新はこんな感じで。

MySQLのおすすめ書籍


MySQLの更新系SQLを省略する(autoExecute)

3
Filed under MySQL, SQL
Tagged as , ,

MySQLでinsertとかUpdateとかするときに、
SQLをかかずにサクサクやる方法があるそうな。
その名も「autoExecute」なり。

Insertしたい場合には、以下のような書き方になるようです。

$test1 = “test”;
$table = “mysql_test_table”

$Connect = DB::connect($Dsn);
if (DB::iserror($Connect)){
die($Connect->getMessage());
}

$Value = array(
‘name’ => ‘hattara’,
‘domain’ => ‘teclog.hattara.info’,
‘col1′ => $test1,
‘col2′ => ‘test2′
);

$Result = $Connect->autoExecute($table, $Value, DB_AUTOQUERY_INSERT);

if (PEAR::isError($Result)) {
die($res->getMessage());
}

$Connect->disconnect();

Updateしたい場合には、以下のような書き方になるようです。

$test1 = “test”;
$table = “mysql_test_table”
$xxxx = “xxxxx”

$Connect = DB::connect($Dsn);
if (DB::iserror($Connect)){
die($Connect->getMessage());
}

$Value = array(
‘name’ => ‘hattara’,
‘domain’ => ‘teclog.hattara.info’,
‘col1′ => $test1,
‘col2′ => ‘test2′
);

$Where = “col1 = ‘abcde’ AND col2 = ‘” . $xxxx . “‘”;

$Result = $db->autoExecute($table, $Value, DB_AUTOQUERY_UPDATE, $Where);

if (PEAR::isError($Result)) {
die($res->getMessage());
}

$Connect->disconnect();

まあ、要するに、

autoExecute(
<テーブル名>,
<変更カラム名と値の連想配列>,
<処理指定>,
< updateならwhereがあれば>
);

となりますね。<処理指定>の場所には、

  insertなら「DB_AUTOQUERY_INSERT」
  updateなら「DB_AUTOQUERY_UPDATE」

が入るわけです。

ただし、残念でならないのが、updateをする場合に、where句を指定できるのですが、
これがプレースホルダに対応していない。
なので、上記のwhereの部分で、変数部分にはエスケープ処理を入れないといけない。
なんか、あと一味足りない感じですね。

参考元:
「實松アウトプット」さん >> autoPrepareとautoExecuteのwhere句