「データベース」タグアーカイブ

SQL:任意の順序でソート(並べ替え)する方法

SQLでは特定の項目の昇順、降順ではなく任意の順序で並べ替えて取得することも出来ます。

任意の順序でソートするにはORDER BY句でCASE文を指定する事で取得することが出来ます。

任意の順でソートする例

サンプルテーブル

「BIRTHDAY」テーブル

クエリー(SQL)

出力結果

SQL:xx日後、xxヶ月後、xx年後などの日付を取得する方法

SQLでsysdateなどの日付型へ加算、減算してxx日後、xxヶ月後、xx年後を求める方法をメモしておきます。

xx秒後、xx秒前を求める方法

クエリー(SQL)例

  • システム日付の30秒後と30秒前を取得する例です。

実行結果

 

xx分後、xx分前を求める方法

クエリー(SQL)例

  • システム日付の5分後と5分前を取得する例です。

実行結果

 

xx時間後、xx時間前を求める方法

クエリー(SQL)例

  • システム日付の2時間後と2時間前を取得する例です。

実行結果

 

xx日後、xx日前を求める方法

クエリー(SQL)例

  • システム日付の1日後と1日前を取得する例です。

実行結果

 

xxヶ月後、xxヶ月前を求める方法

クエリー(SQL)例

  • システム日付の1ヶ月後と1ヶ月前を取得する例です。ADD_MONTHS関数は1/31の1ヶ月後は2/28となるように上手く月末日を調整してくれます。

実行結果

 

xx年後、xx年前を求める方法

クエリー(SQL)例

  • システム日付の1年後と1年前を取得する例です。ADD_MONTHS関数に12の倍数を指定することで年単位での加減算が可能となります。

実行結果

 

補足:他データベースでの日付加算と実務での注意点

本記事では Oracle を前提に日付演算を紹介しましたが、他の主要データベースでも「xx日後/xxヶ月後/xx年後」を取得する方法が存在します。移植性や比較の参考として以下に整理します。

DBMS日数加算の例月・年加算の例
OracleSYSDATE + 3ADD_MONTHS(SYSDATE, 1)(1ヶ月後) / ADD_MONTHS(SYSDATE, 12)(1年後)
MySQLDATE_ADD(NOW(), INTERVAL 3 DAY)DATE_ADD(NOW(), INTERVAL 1 MONTH) / INTERVAL 1 YEAR
SQL ServerDATEADD(day, 3, GETDATE())DATEADD(month, 1, GETDATE())
PostgreSQLCURRENT_DATE + INTERVAL '3 day'+ INTERVAL '1 month' / '1 year'

月末日の扱いについて注意

  • Oracle の ADD_MONTHS('2024-01-31', 1)2024-02-29(存在しない日付は月末に補正)

  • MySQLやPostgreSQL でも同様に月末補正される場合があります

  • 契約更新日などで「きっちり同日を基準にしたい」場合は仕様確認が必要です

実務でよくある活用例

  • 支払期限:請求日+30日

  • 契約更新:契約開始日から6ヶ月後/1年後

  • リマインダー:イベント前7日/前1時間

  • 登録日を基準としたステップメール通知

減算にも応用可能

  • ADD_MONTHS(SYSDATE, -1) → 1ヶ月前

  • SYSDATE - 7 → 7日前


📌 上記を踏まえると、「日付加算はDBごとに関数が異なる」「月末や閏年の補正挙動を理解しておく」という点を意識しておくと、より安全なSQL設計につながります。

Oracle:最大プロセス数や最大セッション数を変更する方法

Oracleでのセッションやプロセス数には上限があり、それを超えてしまうとデータベースにアクセス出来ずに予期せぬエラー(ORA-12519)が発生するなどの不具合が発生してしまいます。

Oracleで最大プロセス数や最大セッション数は初期化パラメータを管理しているSPFILEに定義されています。変更前にSPFILEのバックアップを取得しておくのをオススメします。

SPFILEの配置場所

Oracle DB 18cの場合の例です。

  • 配置位置:[ORACLE_HOME]/database/SPFILE[ORACLE_SID].ORA
    (例)C:\ORACLE\WINDOWS.X64_180000_db_home\database\SPFILEORCL.ORA

最大プロセス数、最大セッション数の変更方法

  1. 最初に「V$SYSTEM_PARAMETER」から現在の最大プロセス数と最大セッション数の設定値を確認します。「V$SYSTEM_PARAMETER」はインスタンスに現在有効になっている初期化パラメータ情報を示します。

  2. 次にALETER文でプロセス数の上限を変更します。
  3. SPFILEの変更はOracleを再起動しないと適用されないため、Oracle DBを再起動します。
    詳細は「Oracle Database(Oracleサーバ)の再起動(停止・起動)手順」参照
  4. 再度プロセス数とセッション数を確認すると上限が変更されているのが確認出来ます。セッション数は明示的に変更しなくてもプロセス数の変更に比例して上限が増えます。

補足

なお、今回ご紹介した Oracle Database における「最大プロセス数(PROCESSES)」および「最大セッション数(SESSIONS)」の変更手順については、環境や用途によって最適値が異なります。以下の点にご留意ください。

  • 本番環境では、まずテスト環境で変更を検証したうえで適用することをおすすめします。変更後の再起動により影響が出る可能性があります。

  • PROCESSES の値を単に増やせば良いわけではなく、実際の接続数・負荷・リソース使用量を定期的にモニタリングする必要があります(例:V$SESSION、V$PROCESS、V$RESOURCE_LIMIT など)。

  • セッション数(SESSIONS)は PROCESSES の設定に影響を受けており、一般に「SESSIONS ≒ PROCESSES × 1.1〜1.2」のような目安が用いられますが、具体的には接続方式やアプリケーション構成によって変動します。

  • 多数のプロセスを許容する設定にする際は、サーバーのメモリ・CPU・I/Oリソースに対する影響も併せて考慮する必要があります。負荷のピーク時にはリソース競合が起きやすくなります。

  • 万一、変更前の値に戻す必要が生じた場合は、適用後のログやパフォーマンス指標を保持しておくことで、トラブルシューティングが容易になります。

以上を踏まえ、環境に適した値の設定および運用体制を整えたうえでパラメータ変更を実施して頂ければと思います。安心して運用を続けるための一助となれば幸いです。

SQL:NULLの判定方法

SQLに慣れてない頃だとnullを判定する際は「xx = null」などと書いてしまいがちですが、SQLでNULLを判定するには「xx is null」 or 「xx is not null」と記載します。

使用例

サンプルテーブル

「GOODS」

NULLのデータを抽出する例

クエリー(SQL)

実行結果

NULL以外のデータを抽出する例

クエリー(SQL)

実行結果

SQL:SELECT時にCASE文で条件指定する方法

SQLではSELECT時などにCASE文を入れる事で「IF-THEN-ELSE式」を記載することも出来ます。

使用例

サンプルテーブル

「GOODS」

クエリー(SQL)

  • 以下の例ではCASE文でGOODS_CODEが特定の値と一致した場合、NAME列に文字列を付与してTEST列として出力しています。

出力結果

Oracle:年、月、日、時、分、秒以下を切り捨てて取得する方法

OracleではTRUC関数を使用することで年、月、日、時、分、秒以下を切り捨てて取得することが可能となります。

使用例

サンプルテーブル「BIRTHDAY」

クエリー(SQL)

  • BIRTHDAYテーブルのUPDATE_DATEに対してTRUNC関数を使用した例となります。第2引数へformatを指定することで指定した単位で切り捨てた値を取得することが出来ます。
  • formatの種類 
    format説明
    YYYY年まで取得して月日時分秒を切り捨て
    MM年月まで取得して日時分秒を切り捨て
    DD年月日まで取得して時分秒を切り捨て
    HH年月日時まで取得して分秒を切り捨て
    MI年月日時分まで取得して秒を切り捨て
     

出力結果

 

Oracle:管理者ユーザー「SYS」と「SYSTEM」のデフォルトパスワード

Oracle 初期パスワードとは?

Oracle 初期パスワードを確認したい/変更したい場合、多くのバージョンで仕様が異なるため注意が必要です。この記事では Oracle の初期アカウント(SYS・SYSTEM)について、パスワードの扱いと安全な運用方法を解説します。

SYSユーザーのデフォルトパスワード:change_on_install

  • sysユーザーでのログイン例です。

SYSTEMユーザーのデフォルトパスワード:manager

  • systemユーザーのログイン例です。

Oracle:管理者ユーザー「SYS」と「SYSTEM」のデフォルトパスワード

ユーザー初期パスワード例備考
SYSchange_on_installデータディクショナリを管理する最上位アカウント
SYSTEMmanager一般的な管理作業に使用可能な補助アカウント

セキュリティ上の注意点

変更必須

デフォルトのままでは外部からの攻撃に悪用されやすいため、必ずパスワード変更を行うこと。

最近の Oracle バージョンでの違い

  • 11g 以降:インストール時にユーザーが必ずパスワードを指定。

  • 12c 以降:パスワードポリシーが強化され、英数字・記号混在の複雑なものを要求。

  • 19c/21c:初期アカウントはロック状態になっている場合も多い。

補足:運用時の留意点と実践アドバイス

本稿でご紹介したように、デフォルトユーザー「SYS」「SYSTEM」の初期パスワードが設定されたまま運用を開始することは、非常に高いセキュリティリスクを伴います。特にネットワークに接続された環境やクラウド/仮想化されたデータベースでは、外部からの侵入・横展開の入口になり得ます。

そこで、実運用にあたっては以下の点もあわせてご検討ください:

  1. パスワード変更/ロックダウンの徹底
    ・前述の SQL コマンド(ALTER USER … IDENTIFIED BY …)で直ちに適用するだけでなく、変更したパスワードは社内ポリシーに基づき「使い捨て・非共有」設計としてください。
    ・可能であれば、管理者ユーザーを使用せずに特権を限定した別ユーザーを作成し、SYS/SYSTEM アカウントは緊急対応用にのみ残すと良いでしょう。

  2. アクセス制御・監査ログの有効化
    ・データベースに対するアクセスを IP・ネットワーク・時間帯別に制限することで、万一パスワードが流出しても被害を抑制できます。
    ・また、誰がいつどのユーザーでログイン/DDL/DMLを実行したかを追えるように監査ログを有効化することも推奨されます。

  3. バージョン・ポリシーの理解
    ・本記事でも触れられている通り、Oracle Database のバージョンによって初期アカウントの仕様(パスワード必須・アカウントロック等)が異なります。例えば 11g 以降、12c/19c ではより強固なパスワードポリシーと自動ロック機能が導入されています。 Write Remember
    ・そのため、運用している環境のバージョンを把握し、初期設定のまま稼働していないか定期的に確認することが重要です。

  4. 定期的なレビューと脆弱性対策
    ・初期アカウントだけでなく、標準サンプルスキーマやテスト用ユーザーも残していないかチェックしてください。攻撃者は「資料通りに」残された穴を狙う傾向があります。
    ・さらに、データベース自体だけでなく OS/ミドルウェア/接続前段のネットワーク構成も含めた総合的なセキュリティレビューを年1〜2回実施することを推奨します。

  5. 万一のインシデント対応準備
    ・万が一、アカウントの不正使用やパスワード流出が疑われた場合の初動手順をあらかじめ策定しておくと、被害の拡大を防ぐことができます。
    ・例えば、アカウントの即時ロック/パスワード強制リセット/ログの取得・分析/改ざんの有無確認などを、運用マニュアルに定義しておくと安心です。

最後に、本稿の内容をただ「変更・実施すれば終わり」とせず、定期的な「運用の振り返り」と「改善サイクル」の一部として組み込むことが、真に安全なデータベース運用の鍵になります。ぜひ、日常運用の中で今回の注意点を意識し、安心・安全な環境構築に役立ててください。

SQL:システム日付と誕生日を元に年齢、誕生日までの月数、日数を表示する方法

SQLでシステム日付、誕生日を使用して年齢、システム日付~誕生日までの月数、日数を取得するSQLをメモしておきます。

以下はOracleでの実行例となっています。

サンプルテーブル

「BIRTHDAY」テーブル

【Oracle】システム日付と誕生日から年齢、誕生日までの月数、日数を表示する例

クエリー(SQL)例

実行結果

SQL:UPDATE と JOIN を使用してレコードを更新する方法

UPDATEで他のテーブルと結合(JOIN)した結果に対してのみ更新を実施したい場合、SQL ServerやMySQL、PostgreSQLではUPDATE文内に直接JOIN句を記載可能ですが、Oracleでは副問合せで結合することでJOINした結果に対して更新することが可能となります。

サンプルテーブル

「GOODS」テーブル

「GOODS_TYPE」テーブル

【Oracle】UPDATE文でJOINを使用して更新する例

クエリー(SQL)例

  • 以下の例ではGOODS_TYPEテーブルに存在するGOODS_CODEと一致するレコードのみGOODSテーブルのPRICE項目を更新しています。

実行結果

  • 以下の様にGOODS_CODEが一致しているレコードのみ更新されていることが確認できます。

 

【SQL Server、MySQL、PostgreSQL】UPDATE文でJOINを使用して更新する例

クエリー(SQL)例

  • SQL Serverなどでは直接UPDATE文内にJOINを指定可能なので以下のような記載でもエラーにはならず更新されます。

     

SQL:合計や平均を算出する方法

SQLで合計を求めるにはSUM関数、平均を求めるにはAVG関数を使用します。

DBMS毎の使用可否

関数\DBMSMySQLPostgreSQLSQL ServerOracle
SUM
AVG
 

サンプルテーブル

「GOODS」テーブル

合計を求める実行例

SUM関数を使用したクエリー(SQL)例

  • 以下の例ではGOODSテーブルのPRICE項目の合計値を求めています。

実行結果

平均を求める例

AVG関数を使用したクエリー(SQL)例

  • 以下の例ではGOODSテーブルのPRICE項目の平均値を求めています。

実行結果