Oracle の JOIN の書き方 — 旧記法 (+) と ANSI 構文の対応表

古い Oracle のコードを読んでいると、FROM にテーブルをカンマで並べて WHERE で結合したり、WHERE a.id = b.id(+) のように (+) が付いていたりする SQL に出会います。これは Oracle が ANSI の JOIN 構文に対応する前から使われてきた旧記法で、(+) は Oracle 独自の外部結合演算子です。

結論から言うと、カンマ結合+WHERE は INNER JOIN、(+) は LEFT JOIN / RIGHT JOIN に対応します。この記事では実際の Oracle Database で両者の結果が一致することを確認しながら、書き換えの対応表と、書き換え時に踏みやすい Oracle 固有の癖をまとめます。なお、Oracle 公式マニュアルも新しく書くなら ANSI 構文を推奨しています(後述)。

実測環境は Docker の gvenzl/oracle-free:23-slim-faststart(バナー表記は Oracle AI Database 26ai Free Release 23.26.2.0.0)です。比較用の PostgreSQL 17.10 / MySQL 8.4.10 も Docker で動かしています。サンプルは次の2表です。

続きを読む Oracle の JOIN の書き方 — 旧記法 (+) と ANSI 構文の対応表

INNER JOIN と LEFT JOIN の違い — 結果がどう変わるか実例で確認

INNER JOIN と LEFT JOIN の違いは一言でいうと、相手のいない行を結果に残すかどうかです。INNER JOIN(内部結合)は両方のテーブルに対応する行があるものだけを返し、LEFT JOIN(左外部結合)は左のテーブルの行を全部残して、相手がいない行は右側の列を NULL で埋めます(これを NULL パディングと呼びます)。

この記事では同じデータに両方を実行して結果を見比べたあと、条件を ON に書くか WHERE に書くかで LEFT JOIN の結果が変わる罠と、「LEFT JOIN は遅いのか」という疑問を扱います。実行結果はすべて PostgreSQL 17.10 で実際に確認したもので、ON と WHERE の罠については MySQL 8.4.10 でも同じ結果になることを確認しています。JOIN 全種類のまとめは SQL の JOIN の種類と違いまとめ — INNER/LEFT/RIGHT/FULL/CROSS【2026年更新】 にあります。

サンプルデータ

社員表 emp と部署表 dept を使います。

続きを読む INNER JOIN と LEFT JOIN の違い — 結果がどう変わるか実例で確認

SQL の JOIN は省略できる — INNER/OUTER キーワードとカンマ結合の整理


JOIN とだけ書いたら INNER JOIN になるのか」「LEFT JOINLEFT OUTER JOIN は違うのか」という疑問への答えを先に書くと、どちらもまったく同じものです。INNEROUTER は書いても書かなくても意味の変わらないキーワードで、省略しても結果は 1 行も変わりません。

この記事では、省略形の対応表と「では実際どこまで省いて書くか」の指針、そして JOIN の省略とよく混同される「カンマ結合(FROM a, b)」がなぜ別物なのかを、実際に動かした結果つきで整理します。動作確認は 2026年7月に PostgreSQL 17.10 / MySQL 8.4.10 / SQLite 3.51.0 と Oracle Database Free(23ai系, 23.26.2.0.0)で行いました。JOIN そのものの種類と結果の違いは SQL の JOIN の種類と違いまとめ — INNER/LEFT/RIGHT/FULL/CROSS【2026年更新】 にまとめているので、そちらもどうぞ。

省略形の対応表

続きを読む SQL の JOIN は省略できる — INNER/OUTER キーワードとカンマ結合の整理

PEM ⇄ DER / CRT / KEY / PFX(p12) 変換 opensslワンライナー集

サーバや機器によって、欲しい証明書ファイルの形式はバラバラです。 「Windows(IIS)は pfx、nginx は pem、Java は DER」と、同じ証明書を形式だけ変えたい場面がよくあります。

この記事は、形式変換の openssl ワンライナーを「変換元 → 変換先」で逆引きできるようにまとめたものです。 形式そのものの違いがあやしい人は、先に 証明書ファイルの形式まとめ を読んでおくと迷いません。

動作確認は OpenSSL 3.x(手元 3.6.2)。秘密鍵の出力は 3.x 既定で PKCS#8(-----BEGIN PRIVATE KEY-----) になります。

続きを読む PEM ⇄ DER / CRT / KEY / PFX(p12) 変換 opensslワンライナー集

opensslで証明書・鍵・CSR・接続を確認するコマンド総まとめ

証明書や鍵まわりで困ったら、だいたい openssl コマンドで中身を確認すれば解決します。 この記事は、「確認」系の openssl コマンドを用途別に総ざらいしたチートシートです。コピペで使ってください。実際の出力例と、つまずきやすいエラー例も載せました。

この記事は OpenSSL 3.x(手元は 3.6.2)で実際に実行して確認しています。openssl version で自分の版を確認できます。古い 1.0.x 系だと一部オプションの既定が違うことがあります。出力例の証明書はこの記事用に作ったテスト用(www.example.com)なので、値はお手元のものに読み替えてください。

続きを読む opensslで証明書・鍵・CSR・接続を確認するコマンド総まとめ

公開鍵・秘密鍵・証明書の関係をやさしく図解(PKI入門)

SSL証明書や .pem を触っていると、「秘密鍵」「公開鍵」「証明書」「認証局(CA)」「中間証明書」と言葉が次々出てきて、結局それぞれどういう関係なのか分からなくなりがちです。

この記事は、コマンドの前に知っておくとラクになる「鍵と証明書の関係」を、図を使ってかみ砕いて説明します。

続きを読む 公開鍵・秘密鍵・証明書の関係をやさしく図解(PKI入門)

証明書ファイルの形式まとめ — PEM / DER / PFX(p12) / CRT / CER / KEY / CSR の違い

SSL証明書を扱っていると、.pem .crt .cer .der .key .pfx .p12 .csr と似たような拡張子がいろいろ出てきて、何が違うのか混乱しますよね。

結論から言うと、「中身のエンコード方式(PEM か DER か)」と「中に何が入っているか(証明書か・鍵か・両方か)」の2軸で整理すると分かりやすくなります。この記事ではその地図を示します。

続きを読む 証明書ファイルの形式まとめ — PEM / DER / PFX(p12) / CRT / CER / KEY / CSR の違い

[Apache] .git, .gitignore等をWebからアクセスできないようにする

gitで管理しているwebサイトでうっかり.gitや.gitignoreなどの Git 関連ファイルが漏れてしまわないようにするには、httpd.conf で以下のように設定します。

# .git から始まるファイルへのアクセスを禁止
<Files ~ "^\.git">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>
# .git/ フォルダ以下のファイル・ディレクトリへのアクセスを禁止
<Directorymatch "^/.*/\.git/">
Order deny,allow
Deny from all
</Directorymatch>

.git は外してアップしているよ、という方も、保険として入れておくと万一の時に .git や .gitignore などが
公開ディレクトリに混ざってしまってもアクセスできないようになるので安全ですね。

[PHP][Yii] モデルでタイムスタンプを自動更新する

Yii 1.1 のモデル(CModel)で自動更新する方法のメモ。

参考: Yii 1.1: How to automate timestamps in ActiveRecord models

CActiveRecord::rules()で設定する

/**
 * @return array validation rules for model attributes.
 */
public function rules()
{
    return array(
        // 略
        array('modified','default',
              'value'=>new CDbExpression('NOW()'),  // PHPのタイムスタンプを使うならdate('Y-m-d H:i:s')など
              'setOnEmpty'=>false,'on'=>'update'),
        array('created,modified','default',
              'value'=>new CDbExpression('NOW()'),
              'setOnEmpty'=>false,'on'=>'insert')
    );
}

CActiveRecord::beforeSave()で更新する

public function beforeSave() {
    if ($this-&gt;isNewRecord)
        $this->created = new CDbExpression('NOW()');

<pre><code>$this-&gt;modified = new CDbExpression('NOW()');

return parent::beforeSave();
</code></pre>

}

CTimestampBehaviorを使う

    // CActiveRecord::behaviors()
    public function behaviors(){
        return array(
            'CTimestampBehavior' =&gt; array(
                'class' =&gt; 'zii.behaviors.CTimestampBehavior',
                'createAttribute' => 'created', // 作成日時のカラム名(デフォルト: create_time)
                'updateAttribute' => 'modified', // 更新日時のカラム名(デフォルト: update_time)
                'setUpdateOnCreate' => true,    // 作成時にupdateカラムも更新するか(デフォルト: false)
            )
        );
    }

どれを使うかはお好みですね。

Google Calendar API のタイムゾーン設定方法

Google カレンダー API で時間が9時間ずれて表示されたり、取得範囲が指定したよりも9時間ずれたりしていて散々はまった。
続きを読む Google Calendar API のタイムゾーン設定方法