読者です 読者をやめる 読者になる 読者になる

HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

識別子の大文字と小文字の違い(2)

あの頃(何時)はまだMySQLに関する知識がなかった‥ 識別子の大文字と小文字の違い - HHeLiBeXの日記 正道編 で、MySQLでは、列名などの識別子はバッククォートで括るらしい(ということを、「show create table hoge」を実行して気づいたらしい)。 ということ…

SQLExceptionから取得できるSQLSTATEとエラーコード

ふとjava.sql.SQLExceptionのJavaDocを見ていたら、SQLSTATEとベンダー固有のエラーコードを取得できることに(いまさら)気づいた。 ベンダー固有のエラーコードはログに吐き出すくらいしか用途を思いつかないが、SQLSTATEはある程度規格化されているはずなの…

指定した範囲の行を取得するクエリ

DB2 Express-C v9.7.2のWindows版で使えていたLIMIT/OFFSETが同Linux版で使えなくて、プラットフォームによって違うのかと思ってしまい、同等のことができる構文をいろいろと調べた挙句、インストール直後の設定が違っていただけという。 で、せっかくなので…

文字列型とマルチバイト文字

MySQLで、何も考えずに「VARCHAR(n)」な列に日本語n文字を格納しようとしたら格納できてしまい、DB2での記憶と違うということで一通り調べてみたらしい。作ったテーブルは次のとおり。 CREATE TABLE tbl1(str CHAR(6) NOT NULL) CREATE TABLE tbl2(str NCHAR…

唐突にSQLのGROUP BYの処理をPHPで実装してみた

SQLのGROUP BYは、とても強力な機能であるにもかかわらず、記述はとてもシンプル。 SELECT num , MAX(score) AS c_max , MIN(score) AS c_min , AVG(score) AS c_avg , SUM(score) AS c_sum FROM hoge GROUP BY num ORDER BY num なぜか唐突に、これと同じ処…

テーブル名や列名の別名の指定

はじめに - SQL標準規格では SQL標準規格によると、SQL文ではテーブル名や列名の別名を次のように指定することができることになっている。(いずれも、キーワード AS は省略可能) SELECT t.col2 [AS] c2 FROM tbl [AS] t WHERE t.col1 = 1 UPDATE tbl [AS] t …

外部結合を侮ると痛い目見るの巻

SQL

まぁ、言うほど大げさな話でもないのだけど、少なくとも、結合条件と検索条件の違いが分かっていないと痛い目見るだろう、と。条件なんてON句に書いてもWHERE句に書いても一緒でしょ、と思っている人(誰)は要注意。前提とするテーブルは次の2つ。(諸般の事情…

プロシジャの出力パラメータの値をSQLだけを使って確認する

例えば、DB2で次のようなプロシジャを作ったとする。('!'は、「db2 -td! -f hoge.sql」と実行するための区切り文字) -- 配列型はCREATE TYPEしないと使えない CREATE TYPE CHARACTER_VARYING_255_ARRAY AS CHARACTER VARYING(255) ARRAY[255] ! -- テスト対…

文字列を格納する列の定義

MySQLユーザー(何)には常識なのだろうが、ほかのDBMSに慣れてからMySQLを使い始めた人がはまりそうなポイント。(そもそも自分がこれに気づいたのは、とあるSQL文を見たから(謎))それは次の2つのCREATE TABLE文の違い。 CREATE TABLE hoge1(v VARCHAR(8)) ; C…

TIMESTAMP型の位置づけ

知っている人は知っている、というお話(だと思う)。以前に、Microsoft SQL ServerでTIMESTAMP型の列にsetTimestampできないというのをどこかで読んでからずっと引っかかっていたこと。(参照:メモ: SQL Server の timestamp 型に insert すると Disallowed i…

SQLクエリメモ - 整数型カラム中の欠番を見つけるクエリ

とあるプログラム(何)で、未処理のID(=欠番)を見つけ出して処理を実行するという必要性が生じたので、欠番を見つけ出すためのSQLクエリを作ってみた。(プログラムでループ回して1つずつチェックなんて、数万件のデータに対してはやってられないから) プログ…

キャストを使うなら覚悟を持って

どのような言語にも、機能的には便利だが使いどころを誤ると大変なことになるというものが(恐らく)存在する。 何らかの数値を表すデータを、RDBに文字列で格納して検索時にキャストして比較するという、嘘のような本当の話があるらしい。詳しい状況は分から…

文字列の連結

SQLにおける文字列連結は「縦棒2本(||)」という自分の中の常識が打ち破られたらしい。 ということで、次のテーブルを前提として調査してみた。 CREATE TABLE hoge( v1 VARCHAR(4) NOT NULL , v2 VARCHAR(4) NOT NULL , v3 VARCHAR(4) NOT NULL , v4 VARCHAR(…

情報スキーマ - 表名と列名の取得

以前、いくつかのRDBMSについて、列名を取得するためのクエリをまとめてみた。 情報スキーマ-列名の取得 - HHeLiBeXの日記 正道編 この時にはSQL Serverは未導入だったような気がするので調べてみた。 まず、列名について前回とほぼ同じことをSQL Server 200…

列名を持たない列の列名(意味不明)

なんと言えばいいのか分からなかったので意味不明なタイトルになったが、要は次のようなクエリを実行したときの結果表の列名はどうなるのか、ということ。 SELECT COUNT(*) FROM hoge ということで、一通り調べてみた。 次のテーブルを前提とする。 CREATE T…

各DBMSで日付型の値から曜日を取り出す

最初、PostgreSQLでdate_part関数を使用している処理があって、それをMySQLではどう書けばいいかというのを調べたことから始まったのだが。 手始めに次のブログを見つけた。 馬場誠Blog(東京都世田谷区経堂のWebクリエイター)» ブログアーカイブ » MySQLで…

ISBNをチェックするユーティリティ

唐突に、いつかどこかで役に立つかなぁ、と思い、持てる力(何)をいろいろ出してユーティリティを書いてみた。 アルゴリズムはWikipedia(ISBN - Wikipedia)を参考にした。 Java版 多少のブランクはあってもやはり私のプライマリ言語ということでまず最初に。 …

PostgreSQLでidentity column

以前に書いたidentity columnに関する記事(identity column - テーブルの各行にシーケンス番号を割り当てる - HHeLiBeXの日記 正道編)のPostgreSQL版。 SERIAL型やBIGSERIAL型を使用すればいいらしい。(正確には、SERIALやBIGSERIALはデータ型ではないらしい…

MySQLでidentity column

以前に書いたidentity columnに関する記事(identity column - テーブルの各行にシーケンス番号を割り当てる - HHeLiBeXの日記 正道編)のMySQL版。 AUTO_INCREMENTというのを列定義に指定すればいいらしい。 http://dev.mysql.com/doc/refman/4.1/ja/example-…

表関数 - 戻り値として表を返す

SQL2003から、表関数というものが追加された(と本には書いてある(ということにしておく(謎)))。SQL2003ハンドブック―SQL最新標準規格作者: 土田正士,小寺孝出版社/メーカー: ソフトリサーチセンター発売日: 2004/12メディア: 単行本 クリック: 1回この商品を…

SQLクエリメモ - XMLデータをリレーショナルデータに変換するクエリ

ふとしたこと(何)から、次のような構造を持つXMLデータが格納されたテーブルから、リレーショナルな構造を持つ別のテーブルへkey-valueの組をコピーするクエリを書いた。 <path> <to key="k1" val="v1"/> <to key="k2" val="v2"/> </path> いわゆる繰り返し構造になっているのが今回のポイント。 テーブルの構造は次のよ…

identity column - テーブルの各行にシーケンス番号を割り当てる

ある理由から、シーケンス番号をテーブルの各行に割り当てる必要があり、シーケンスジェネレータを明示的に生成(CREATE SEQUENCE)して、テーブルへの行挿入時にトリガーを使ってシーケンス番号を割り当てるというSQLコードを書いた。 そのコードに対する意見…

テーブルの制約の規定に使用されている列の取得

ある制約を規定するのに使用されている列を取得するには、KEY_COLUMN_USAGEというビューを使用することができる。 PostgreSQL v8.4で次のようなクエリを発行する: SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = 'public' ORDER …

テーブルの制約一覧の取得

おもむろに次のようなテーブルを作ってみる。 CREATE TABLE hoge( col1 INT NOT NULL , col2 INT NOT NULL , CONSTRAINT pkey_hoge PRIMARY KEY(col1, col2) ) ; CREATE TABLE foo( col1 INT NOT NULL , col2 INT NOT NULL , col3 INT NOT NULL , col4 INT N…

全称(普遍)量化子と存在量化子

SQL

SQLに関する記事を読み漁っていて、全称(普遍)量化子と存在量化子の話: SQLの中の述語論理 を読んでいたときに、片方が定義されていればもう片方は論理的に導出できるというのを見て、導出しようとしたら一瞬考え込んでしまったので、ちゃんと裏を取ってみ…

TIMESTAMP のリテラル

TIMESTAMP のリテラルを記述する際に、DB2 で苦労した記憶が唐突によみがえってきたので、手元にある DBMS を比べてみた。 IBM DB2 Express-C v9.1.2 IBM DB2 Express-C v9.5.2 IBM DB2 Express-C v9.7.0 Oracle Database 10g Express Edition PostgreSQL v8…

情報スキーマ-列名の取得

以下のエントリで、識別子の大文字/小文字について触れた。 識別子の大文字と小文字の違い - HHeLiBeXの日記 正道編 で、列名の情報がどう格納されているのかについてまとめてみる。 実行してみるクエリは、各DBMSについて以下のようなものになる。 表の生成…

識別子の大文字と小文字の違い

時々、CREATE TABLE文を書くときには CREATE TABLE "HOGE"("ID" INTEGER, "NAME" VARCHAR(8)) のように書くのに、INSERT文では INSERT INTO HOGE(ID, NAME) VALUES(12345678, 'hhelibex') のように書いている、というケースを見かける。 確かに、SQLでは、テ…

ユーザ定義型(構造型)の値をJDBCで扱ってみる

せっかくSQLにユーザ定義型(構造型)を定義する機能があるので(謎)、JDBC経由で参照、更新をしてみる。 使用する環境は以下のとおり。 DB2 Express-C v9.7.0 (と書いて FP1 に更新しなきゃならないことを思い出したらしいが、それはまた後で) とりあえず、ア…

SQLの比較演算子

唐突に、「プログラム言語を学んだ後でSQLを学ぶと、"not equal"を"!="と書きたくなる人が多いんじゃないか」、「SQLでは"<>"」と考えたところで、どこかの実装で"!="が使えたものがあったような記憶がよみがえってきた。 そこで、次の本を参照してみた。SQL…

型付表の定義

DB2 で型付表を作ろうとするときに必要な手順を、いつもいつも忘れるのでメモ。 まぁ、DB2のオンラインマニュアルには書いてあるんだけど‥探すといつも見つからない‥(ちなみに、キーワード「CREATE SEQUENCE」で探すと何番目かに出てくる。) CREATE TYPE "TY…

Re:XMLEXISTSを使う場合の注意点(だと思う)

XMLEXISTSを使う場合の注意点(だと思う) - HHeLiBeXの日記 正道編 一応、記録のため(何)に、実験を再現するためのクエリとかを残しておく。(普段はそうするんだけど、なぜか今回はすっかり忘れていた‥) まずはデータ。そのまんま載せるととんでもないことに…

XMLEXISTSを使う場合の注意点(だと思う)

発端 2年近く前に、次のようなクエリが原因でアプリケーションのレスポンスが悪いという状況に出くわした。 xquery count( for $doc in db2-fn:sqlquery(" select xmlquery('for $doc in $root/hoge return $doc' passing DOCUMENT.DATA as ""root"") from D…

「トランザクション内でユニークなTIMESTAMP値を取得する試み」内での誤解

SQL

だいぶ前に、トランザクション内でユニークなTIMESTAMP値を取得する試み - HHeLiBeXの日記 正道編でGlobal Temporary Tableを使ったアプローチを書いたが、SQL規格上でのGlobal Temporary Tableに関して誤った理解をしていたことが判明。*1 Global Temporary…

トランザクション内でユニークなTIMESTAMP値を取得する試みの実践

「トランザクション内でユニークなTIMESTAMP値を取得する試み」をDB2 v9.5で実践してみる。 その際の考慮点は以下のとおり。 GLOBAL TEMPORARY TABLEを作成するにはUSER TEMPORARY TABLESPACEが必要。 GLOBAL TEMPORARY TABLEは必ず"SESSION"スキーマに作成…

トランザクション内でユニークなTIMESTAMP値を取得する試み

SQL

1つのトランザクションの中で、例えば以下のようなクエリ INSERT INTO TBL(ID, TS) VALUES(1, CURRENT_TIMESTAMP) INSERT INTO TBL(ID, TS) VALUES(2, CURRENT_TIMESTAMP)を発行すると、2つの行のTIMESTAMP値(TS列)は同一になるとは限らない。 しかし時には…