20190625のSQLに関する記事は2件です。

【SQL】関数[todate]の実行結果が正規表現の指定通りにならない

事象:関数[todate]の実行結果が正規表現の指定通りにならない

次のクエリを投げた時、実行結果が同じになるのは何故か??

test.sql
SELECT 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.sql
SELECT 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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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版 ゼロからはじめるデータベース操作

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む