psql の便利なコマンド \h

PostgreSQL の psql にはヘルプを表示する便利なコマンド \h があります。

使い方は簡単です。
引数なしで実行すると SQL のコマンド一覧が表示されます。

db=# \h
  ABORT                            CREATE LANGUAGE       
  ALTER AGGREGATE                  CREATE OPERATOR       
  ALTER CONVERSION                 CREATE OPERATOR CLASS 
  ALTER DATABASE                   CREATE OPERATOR FAMILY
  ALTER DOMAIN                     CREATE ROLE           
  ALTER FOREIGN DATA WRAPPER       CREATE RULE           
  ALTER FUNCTION                   CREATE SCHEMA         
  ALTER GROUP                      CREATE SEQUENCE       
  ALTER INDEX                      CREATE SERVER         
  ALTER LANGUAGE                   CREATE TABLE          

引数にコマンドを付けるとコマンドの説明を表示します。

db=# \h COPY
Command:     COPY
Description: copy data between a file and a table
Syntax:
COPY tablename [ ( column [, ...] ) ]
    FROM { 'filename' | STDIN }
    [ [ WITH ]
          [ BINARY ]
          [ OIDS ]
          [ DELIMITER [ AS ] 'delimiter' ]
          [ NULL [ AS ] 'null string' ]
          [ CSV [ HEADER ]
                [ QUOTE [ AS ] 'quote' ]

SQL コマンドの使い方を忘れたときに 手元にリファレンスがなくても その場で確認できるので 便利です。

タイプヒンティング

PHP5 からタイプヒンティングを使用することができます。 これは関数の引数の型を指定することができます。

次のように引数の前に型を宣言します。

function test(array %values) {
    .....
}

これで $values は配列を指定しないとエラーになります。

ただし配列とオブジェクト型だけで int などのネイティブ型には指定することができません。

配列定義の優しさ

PHP では配列を定義するとき次のように 最後の要素の後ろにカンマがあってもエラーになりません。

$a = array(1, 3, 4,);
                 ~~

このように定義した場合、配列の要素数は 3 です。 最後のカンマは無視されるわけです。

なぜこうなってるかですが、 配列は、要素が長かったり連想配列だと次のように定義することがあります。

$b = array('a' => 3,
           'b' => 2,
           'c' => 5);

4 つめの要素を追加するときは、最後の要素の後ろにカンマを付けて・・・と やらなくてはなりません。

ところが次のように定義してある場合、全ての要素の行を同じように扱うことができます。

$b = array(
        'a' => 3,
        'b' => 2,
        'c' => 5,
);

書く人に、とても優しいですね。 ちゃんと規約にしてしまえば、こちらの方がミスも少なくて良いんじゃないでしょうか。

これは Perl や JavaScript, Java なんかでも同じです。

psql で SQL の実行時間を計測する

PostgreSQL の psql では \timing を使うと 実行時間を計測することができます。

db=# \timing
Timing is on.

これで計測が on になりました。
後は通常通り SQL を実行します。

db=# select 1;
?column?
----------
        1
(1 row)

Time: 2.422 ms

もう 1 度実行すると off になります。

db=# \timing
Timing is off.

SQL で関数作成

PostgreSQL は PL/pgSQL を使って ORACLE の PL/SQL のように 関数を作ることができますが 手続き言語を SQL でも簡単に関数を作ることができます。

次のように定義します。

CREATE FUNCTION test_func (
     i1 integer,
     i2 integer
)
RETURNS integer
AS
$$
    SELECT $1 + $2
$$
LANGUAGE sql IMMUTABLE STRICT;

呼び出すときは同じです。

db=# SELECT test_func(4, 3); 
7

Google サイト内検索

Amazonアソシエイト