SQLに慣れてない頃だとnullを判定する際は「xx = null」などと書いてしまいがちですが、SQLでNULLを判定するには「xx is null」 or 「xx is not null」と記載します。
使用例
サンプルテーブル
「GOODS」
NULLのデータを抽出する例
クエリー(SQL)
|
SELECT * FROM GOODS g WHERE GOODS_CODE IS NULL; |
実行結果
NULL以外のデータを抽出する例
クエリー(SQL)
|
SELECT * FROM GOODS g WHERE GOODS_CODE IS NOT NULL; |
実行結果
SQLではSELECT時などにCASE文を入れる事で「IF-THEN-ELSE式」を記載することも出来ます。
使用例
サンプルテーブル
「GOODS」
クエリー(SQL)
- 以下の例ではCASE文でGOODS_CODEが特定の値と一致した場合、NAME列に文字列を付与してTEST列として出力しています。
|
SELECT NAME, GOODS_CODE, (CASE GOODS_CODE WHEN 101 THEN '【PC】' || NAME WHEN 201 THEN '【DESK】' || NAME ELSE '【OTHER】' || NAME END) test FROM GOODS g; |
出力結果
OracleではTRUC関数を使用することで年、月、日、時、分、秒以下を切り捨てて取得することが可能となります。
使用例
サンプルテーブル「BIRTHDAY」
クエリー(SQL)
- BIRTHDAYテーブルのUPDATE_DATEに対してTRUNC関数を使用した例となります。第2引数へformatを指定することで指定した単位で切り捨てた値を取得することが出来ます。
|
SELECT TRUNC(b.UPDATE_DATE, 'YYYY'), TRUNC(b.UPDATE_DATE, 'MM'), TRUNC(b.UPDATE_DATE, 'DD'), TRUNC(b.UPDATE_DATE, 'HH'), TRUNC(b.UPDATE_DATE, 'MI') FROM BIRTHDAY b; |
- formatの種類
format | 説明 |
YYYY | 年まで取得して月日時分秒を切り捨て |
MM | 年月まで取得して日時分秒を切り捨て |
DD | 年月日まで取得して時分秒を切り捨て |
HH | 年月日時まで取得して分秒を切り捨て |
MI | 年月日時分まで取得して秒を切り捨て |
出力結果
SQLでシステム日付、誕生日を使用して年齢、システム日付~誕生日までの月数、日数を取得するSQLをメモしておきます。
以下はOracleでの実行例となっています。
サンプルテーブル
「BIRTHDAY」テーブル
【Oracle】システム日付と誕生日から年齢、誕生日までの月数、日数を表示する例
クエリー(SQL)例
|
SELECT TO_CHAR(sysdate,'YYYY-MM-DD') "本日の日付", TO_CHAR(b.BIRTHDAY,'YYYY-MM-DD') "誕生日", EXTRACT(YEAR FROM sysdate) - EXTRACT(YEAR FROM b.BIRTHDAY) "年齢", TRUNC(MONTHS_BETWEEN(sysdate,b.BIRTHDAY)) "誕生日までの月数", TRUNC(sysdate - b.BIRTHDAY) "誕生日までの日数" FROM dual, BIRTHDAY b; |
実行結果
UPDATEで他のテーブルと結合(JOIN)した結果に対してのみ更新を実施したい場合、SQL ServerやMySQL、PostgreSQLではUPDATE文内に直接JOIN句を記載可能ですが、Oracleでは副問合せで結合することでJOINした結果に対して更新することが可能となります。
サンプルテーブル
「GOODS」テーブル
「GOODS_TYPE」テーブル
【Oracle】UPDATE文でJOINを使用して更新する例
クエリー(SQL)例
- 以下の例ではGOODS_TYPEテーブルに存在するGOODS_CODEと一致するレコードのみGOODSテーブルのPRICE項目を更新しています。
|
UPDATE GOODS SET PRICE = 5000 WHERE GOODS_CODE = ANY (SELECT g.GOODS_CODE FROM GOODS g INNER JOIN GOODS_TYPE gt ON gt.GOODS_CODE = g.GOODS_CODE) |
実行結果
- 以下の様にGOODS_CODEが一致しているレコードのみ更新されていることが確認できます。
【SQL Server、MySQL、PostgreSQL】UPDATE文でJOINを使用して更新する例
クエリー(SQL)例
- SQL Serverなどでは直接UPDATE文内にJOINを指定可能なので以下のような記載でもエラーにはならず更新されます。
|
UPDATE g SET r.PRICE = 5000; FROM GOODS g INNER JOIN GOODS_TYPE gt ON gt.GOODS_CODE = g.GOODS_CODE |
SQLで合計を求めるにはSUM関数、平均を求めるにはAVG関数を使用します。
DBMS毎の使用可否
関数\DBMS | MySQL | PostgreSQL | SQL Server | Oracle |
SUM | ○ | ○ | ○ | ○ |
AVG | ○ | ○ | ○ | ○ |
サンプルテーブル
「GOODS」テーブル
合計を求める実行例
SUM関数を使用したクエリー(SQL)例
- 以下の例ではGOODSテーブルのPRICE項目の合計値を求めています。
|
SELECT SUM(PRICE) FROM GOODS; |
実行結果
平均を求める例
AVG関数を使用したクエリー(SQL)例
実行結果
ALL句を使用することでWHERE句内に指定した副問合せの結果を比較してデータを抽出する事が可能となります。
サンプルテーブル
- 「GOODS」テーブル
- 「GOODS_TYPE」テーブル
ALL句を利用したクエリー(SQL)例
- 以下の例ではまず副問合せでGOODS_CODEテーブルからGOODS_CODEが101と301のデータを取得し、ALL句でGOODSテーブルのGOODS_CODEが101と301以外のデータを取得しています。
|
SELECT * FROM GOODS WHERE GOODS_CODE <> ALL ( SELECT GOODS_CODE FROM GOODS_TYPE WHERE GOODS_CODE in('101','301') ); |
実行結果
SQLでゼロ埋めスペース埋めして桁数を揃えたい場合にはLPAD関数やRPAD関数を使用することで取得可能となります。DBMSによっては使用出来ないものもあります。
関数\DBMS | MySQL | PostgreSQL | SQL Server | Oracle |
LPAD | ○ | ○ | ✕ | ○ |
RPAD | ○ | ○ | ✕ | ○ |
書式は「LPAD(列名,バイト数,’埋め込み文字’)」、「RPAD(列名,バイト数,’埋め込み文字’)」で指定します。第三引数の埋め込み文字を省略すると半角スペースが埋め込まれます。
サンプルではOracleでの使用例となります。
サンプルテーブル
- 「GOODS」テーブル
LPAD関数の使用例1
- 項目「GOODS_CODE」を10桁でゼロ埋めするSQL(クエリー)
|
SELECT LPAD(g.GOODS_CODE , 10, '0') FROM USER1.GOODS g; |
- 実行結果
LPAD関数の使用例2
- 項目「GOODS_CODE」を10桁で全角「*」埋めするSQL(クエリー)
|
SELECT LPAD(g.NAME , 10, '*') FROM USER1.GOODS g; |
- 実行結果
以下のように埋め込み文字へ全角文字を指定すると1文字=2バイト扱いで埋め込まれます。
RPAD関数の使用例1
- 項目「GOODS_CODE」を10桁でゼロ埋めするSQL(クエリー)
|
SELECT RPAD(g.GOODS_CODE , 10, '0') FROM USER1.GOODS g; |
- 実行結果
RPAD関数の使用例2
- 項目「GOODS_CODE」を10桁で全角「*」埋めするSQL(クエリー)
|
SELECT RPAD(g.NAME , 10, '*') FROM USER1.GOODS g; |
- 実行結果
RPADでも以下のように埋め込み文字へ全角文字を指定すると1文字=2バイト扱いで埋め込まれます。
SQLを見てるとたまにWHERE句内で「(+)」と記載されているのを見かけることがあります。
この「(+)」はOracle独自で記載が可能となる外部結合演算子といって、「g.GOODS_CODE = gt.GOODS_CODE(+)」のように指定するとLEFT OUTER JOINと同じ結果を取得することが出来ます。
サンプルテーブル
- 「GOODS」テーブル
- 「GOODS_TYPE」テーブル
外部結合演算子を利用したクエリー(SQL)例
|
SELECT g.name, gt.type_name FROM USER1.GOODS g, USER1.GOODS_TYPE gt WHERE g.GOODS_CODE = gt.GOODS_CODE(+); |
通常の左外部結合でのクエリー(SQL)例
|
SELECT g.name, gt.type_name FROM USER1.GOODS g LEFT OUTER JOIN USER1.GOODS_TYPE gt ON g.GOODS_CODE = gt.GOODS_CODE; |
実行結果
外部結合演算子、左外部結合どちらも同じ結果となります。
「駑馬十駕」 IT系情報を中心に調べた事をコツコツ綴っています。