- 投稿日:2019-06-25T23:05:03+09:00
【SQL】関数[todate]の実行結果が正規表現の指定通りにならない
事象:関数[todate]の実行結果が正規表現の指定通りにならない
次のクエリを投げた時、実行結果が同じになるのは何故か??
test.sqlSELECT to_date('2000-01-01 23:59:59', 'yyyy-mm-dd hh24:mi:ss') , to_date('2000-01-01', 'yyyy-mm-dd') FROM dual;実行環境:OSQLEdit
DB:Oracle
▼想定結果
to_date('2000-01-01 23:59:59', 'yyyy-mm-dd hh24:mi:ss') to_date('2000-01-01', 'yyyy-mm-dd') 2000-01-01 23:59:59 2000-01-01 ▼実行結果
to_date('2000-01-01 23:59:59', 'yyyy-mm-dd hh24:mi:ss') to_date('2000-01-01', 'yyyy-mm-dd') 2000-01-01 2000-01-01
結論:OSQLEditの設定の問題だった。
DATE型の値を表示する際に、'yyyy-mm-dd'で表示する設定になっていたため、
年月日時分秒ミリセカンドを指定した場合と、年月日のみを指定した場合で
クエリの結果が同じであった。ツール>オプション>設定(2)>DATE型の書式
から設定可能。
補足
DATE型の値を表示を、'yyyy-mm-dd hh24:mi:ss'で表示する設定にした場合、
下記のような実行結果になった。test.sqlSELECT to_date('2000-01-01 23:59:59', 'yyyy-mm-dd hh24:mi:ss') , to_date('2000-01-01', 'yyyy-mm-dd') FROM dual;実行結果
to_date('2000-01-01 23:59:59', 'yyyy-mm-dd hh24:mi:ss') to_date('2000-01-01', 'yyyy-mm-dd') 2000-01-01 23:59:59 2000-01-01 00:00:00
- 投稿日:2019-06-25T02:07:35+09:00
PostgreSQLのSQLテンプレ
間違い等ががあれば、指摘お願いします。
データベースの操作
作成
CREATE DATABASE データベース名;消去
DROP DATABASE データベース名;テーブルの操作
作成
CREATE TABLE テーブル名( 列名1 列の型 列の制約, 列名2 列の型 列の制約, ... テーブルの制約1, テーブルの制約2, ... );消去
DROP TABLE テーブル名;名前の変更
ALTER TABLE テーブル名 RENAME TO 変更後のテーブル名;列の操作
追加
ALTER TABLE テーブル名 ADD COLUMN 列の名前 列の型 列の制約;消去
ALTER TABLE テーブル名 DROP COLUMN 列の名前;行の操作
追加
INSERT INTO テーブル名 (列1, 列2, ...) VALUES (値1, 値2, ...);消去
DELETE FROM テーブル名 WHERE 条件;すべてを消去
DELETE FROM テーブル名;または、
TRUNCATE テーブル名;
TRUNCATE
コマンドは、必ずすべての行を消去する。また、DELETE
コマンドと違い、細かい制御はできない。が、その分、DELETE
コマンドより早い。
DELETE
文というのは、DML文の中でもかなり実行に時間がかかる処理であるため、すべての行を消去していい場合はTRUNCATE
コマンドを使いましょう。更新
UPDATE テーブル名 SET 列名 = 式; WHERE 条件;取り出す
取り出す
SELECT 列名1, 列名2, ... FROM テーブル名;すべてを取り出す
SELECT * FROM テーブル名;別名をつけて、取り出す
SELECT 列名1 AS 別名, 列名2 AS 別名, ... FROM テーブル名;重複行を除いて、取り出す(DISTINCT)
SELECT DISTINCT 列名1, 列名2, ... FROM テーブル名;条件を指定して、取り出す(WHERE)
SELECT 列名1, 列名2, ... FROM テーブル名 WHERE 条件式;集約関数を使って、取り出す
テーブルの行数を数える(COUNT)
SELECT COUNT(*) FROM テーブル名:NULLを除外して、テーブルの行数を数える(COUNT)
SELECT COUNT(列名) FROM テーブル名:値の重複業を除外して、テーブルの行数を数える(COUNT)
SELECT COUNT(DISTINCT 列名) FROM テーブル名:合計を求める(SUM)
SELECT SUM(列名) FROM テーブル名:平均を求める(AVG)
SELECT AVG(列名) FROM テーブル名:最大値を求める(MAX)
SELECT MAX(列名) FROM テーブル名:最小値を求める(MIN)
SELECT MIN(列名) FROM テーブル名:グループに分けて、取り出す
SELECT COUNT(列名) FROM テーブル名 GROUP BY 列名1, 列名2, ...;グループに対して条件を指定して、取り出す
SELECT 列名1, 列名2, ... FROM テーブル名 GROUP BY 列名1, 列名2, ... HAVING グループの値に対する条件検索結果を並び替えて、取り出す
SELECT 列名1, 列名2, ... FROM テーブル名 ORDER BY 並び替えの基準となる列1, 並び替えの基準となる列2, ... [ASC/DESC]
名前 機能 ASK 昇順 DESC 降順 コメント
1行コメント
-- コメント文複数コメント
/* コメント文 コメント文 */蛇足
SQLの命令の種類
DDL(Data Definition Language)
DDL(データ定義言語)は、データを格納する入れ物であるデータベースやテーブルなどを作成したり消去したりします。DDLに分類される命令は次のとおりです。
CREATE:データベースやテーブルなどを作成する。
DELETE:データベースやテーブルなどを消去する。
ALATER:データベースやテーブルなどの構成を変更する。DML(Data Manipulation Language)
DML(データ操作言語)は、テーブルの行を検索したり変更したりします。DMLに分類される命令は次のとおりです。
SELECT:テーブルから行を検索する
INSERT:テーブルに新規行を登録する
UPDATE:テーブルの行を更新する
DELETE:テーブルの行を消去するDCL(Data Control Language)
DCL(データ制御言語)は、データベースに対して行った変更を確定したり取り消したりします。そのほか、RDBMSのユーザーがデータベースにあるもの(テーブルなど)を操作する権限の設定も行います。DCLに分類される命令は次のとおりです。
COMMIT:テーブルに対して行った変更を確定する
ROLLBACK:テーブルに対して行った変更を取り消す
GRANT:ユーザーに操作の権限を与える
REVOKE:テーブルに対して行った変更を確定する命名規則
SQLでは、大文字・小文字は区別されません。
SELECT
お書いてもselect
と書いても同じように解釈されます。テーブル名や列名などについても同様です。
ただし、テーブルに登録されているデータについては、大文字・小文字が区別されます。例えば、「Computer」と登録したデータを「COMPUTER」や「computer」と同じように扱かったりはしません。NULLの扱い
演算におけるNULLの扱い
「NULLを含む演算」には注意してください。次の演算の結果はどうなると思いますか?
① 5 + NULL
② 210 * NULL
③ NULL / 3
④ NULL / 0
正解は「全部NULL」です。NULLを含んだ計算は、問答無用でNULLになるのです。このルールは④のNULLを0で割る演算にも適用されます。通常、「5 / 0」のように0で割ろうとするとエラーになりますが、NULLを0で割る場合だけはエラーにならずNULLになります。とはいえ、NULLを0と同じとみなして、 5 + NULL = 5という結果がほしいケースはあります。そういうときはCOALESCE関数を使いましょう。COALESCE関数の使い方はこちら。
比較演算子におけるNULL
name | age ------+----- alis | NULL bob | 32 zeke | 40 mark | 22上のテーブルに、次のような条件で行を取り出します。
①age >= 30
↓結果name | age ------+----- bob | 32 zeke | 40②
age <> 22
name | age ------+----- bob | 32 zeke | 40いずれの結果には、ageがNULLである「alis」の行は含まれていませんでした。この行は年齢(age)が不明(NULL)なので、「
age >= 20
」や「age <> 22」などの判定ができないのです。また、苦しまぎれにage = NULL
という条件式を書いても、「alis」の行は取り出せません。SQLにはNULLかどうか判別するための専用の演算子
IS NULL
が用意されてます。NULLの行を選択したいときは、age IS NULL
という条件式を書きましょう。NULLでない行を取り出したいときはIS NOT NULL
という演算子を使います。論理演算子におけるNULL
NULLの論理値は「UNKNOWN」になります。なぜそうなるのか気になる方は、こちらを読んでください。
参考文献
・SQL 第2版 ゼロからはじめるデータベース操作