<br/> を書かずに通常のテキストの改行で改行させる設定
ctrl+, で設定画面を開いたら、markdown preview と打ち込んで

Markdown Preview Breaks を表示する。
デフォルトは、チェックoffで false になっているので
これを true にする。

settins.jsons では以下のとおり。
"markdown.preview.breaks": false,
<br/> を書かずに通常のテキストの改行で改行させる設定
ctrl+, で設定画面を開いたら、markdown preview と打ち込んで

Markdown Preview Breaks を表示する。
デフォルトは、チェックoffで false になっているので
これを true にする。

settins.jsons では以下のとおり。
"markdown.preview.breaks": false,
PlantUML バージョン 2.9.4 を使ってた頃は、
VScode PlantUMLで作成するUML画像の出力先を設定する。 - Oboe吹きプログラマの黙示録
このとおり、plantuml.exportOutDir を "out" ⇒ "" で良かった。
しかし、バージョン 2.18.1 では、”” ではなく、カレントディレクトリを指す "." (ドット)にしないと
思いどおりカレントディレクトリに変更できない。
VScode もバージョン 1.114.0 では、VScode の設定画面、起動は ctrl+「,」キーで表示する画面も
settings.json 編集表示ではなくUI が変わってるので注意
plantuml デフォルト設定を開くと

ここの
Plantuml: Export Out Dir を out ⇒ .
Plantuml: Export Sub Dir のチェックを外す

これで、PlantUMLの図の出力先が puファイル、pumlファイルと同じフォルダになる。
SQLで よくWHERE句の先頭で、1=1 を書いて、後続条件を AND ~ を並べやすくして
メンテナンスしやすくする手法は良くある。でも、1=0 というわざわざ否定を書くことは少ない。
UNION ALLで疑似テーブルを作るケースは、
WITH sales AS ( SELECT ' ' AS SCODE, ' ' AS ITEM, 0 AS SALE_NUM FROM UNION ALL SELECT '01' AS SCODE,'みかん' AS ITEM,10 AS SALE_NUM FROM dual UNION ALL SELECT '02' AS SCODE,'バナナ' AS ITEM,12 AS SALE_NUM FROM dual UNION ALL SELECT '04' AS SCODE,'レモン' AS ITEM,16 AS SALE_NUM FROM dual ) SELECT SCODE, ITEM, SALE_NUM FROM sales
このように全部のレコードのSELECT で AS 列名を書くのはめんどうである。
WHERE句 1=0 という通常指定しないWHERE句を書いて、先頭のSELECT だけ AS 列名を書くことができる。
WITH sales AS ( SELECT ' ' AS SCODE, ' ' AS ITEM, 0 AS SALE_NUM FROM dual WHERE 1=0 UNION ALL SELECT '01' AS SCODE,'みかん' AS ITEM,10 AS SALE_NUM FROM dual UNION ALL SELECT '02' AS SCODE,'バナナ' AS ITEM,12 AS SALE_NUM FROM dual UNION ALL SELECT '04' AS SCODE,'レモン' AS ITEM,16 AS SALE_NUM FROM dual ) SELECT SCODE, ITEM, SALE_NUM FROM sales
Oracleの場合このAS句を NULL AS 列名で書くことは型が不明のエラーになってできない。
他のDBは NULL AS 列名が可能だ。
PostgreSQL 、MySQL の場合
WITH sales AS ( SELECT null AS SCODE, null AS ITEM, null AS SALE_NUM WHERE 1=0 UNION ALL SELECT '01','みかん',10 UNION ALL SELECT '01','バナナ',12 UNION ALL SELECT '01','レモン',16 ) SELECT SCODE, ITEM, SALE_NUM FROM sales
Oracleと違って NULL に対して AS句を書ける。
Oracle では疑似テーブルの生成でレコード無し(件数=0)、以下の記述は
列の型が不明でエラーになるが、
PostgreSQL 、MySQL では、エラーにならない。
WITH sales AS ( SELECT null AS SCODE, null AS ITEM, null AS SALE_NUM WHERE 1=0 ) SELECT SCODE, ITEM, SALE_NUM FROM sales
値が存在するレコードを書かないこの書き方では、
PostgreSQL は、全て TEXT型の列として認識される。
MySQL は、全て BINARY型の列として認識される。
正しい接続情報を把握しているなら、次を疑うべき。
・caching_sha2_passwordを利用してMySQLに接続しようとしている。
・通信経路がTLSで保護されていない。
以下と同様のことが起きているのだろう。
https://stackoverflow.com/questions/50379839/connection-java-mysql-public-key-retrieval-is-not-allowed
接続の設定で、ドライバのプロパティを開き、
allowPublicKeyRetrieval が、false になっているので、
これを true に変更する。

これで接続可能となった。
PIVOT または UNPIVOT を使わなくてはならない状況は、
データ設計に問題があると思う。
よってどうしても不慣れであった。
Oracle のPIVOTは、以下の書式で書くことになっていて
PIVOT(集約関数 FOR 集約条件列 IN(集約条件値1 as 集約後列名1,
集約条件値2 as 集約後列名2,
集約条件値3 as 集約後列名3))
しかも対象テーブル集約は、暗黙のGROUP BY であって、
PIVOT( MAX(列名) OVER( PARTITION BY ~) のように、任意 GROUP BY にしたくても、
OVER句の使用がここでは許されていない。
PIVOT による集約はかなり限定されてしまう。
以下、サンプル
WITH sales AS ( SELECT ' ' AS SCODE, ' ' AS ITEM, 0 AS SALE_NUM FROM dual WHERE 1=0 UNION ALL SELECT '01','みかん',10 FROM dual UNION ALL SELECT '01','バナナ',12 FROM dual UNION ALL SELECT '01','レモン',16 FROM dual UNION ALL SELECT '02','みかん',18 FROM dual UNION ALL SELECT '02','バナナ',25 FROM dual UNION ALL SELECT '02','レモン',11 FROM dual UNION ALL SELECT '03','みかん',5 FROM dual UNION ALL SELECT '03','バナナ',2 FROM dual UNION ALL SELECT '03','レモン',7 FROM dual UNION ALL SELECT '02','バナナ',10 FROM dual UNION ALL SELECT '02','レモン',23 FROM dual ) SELECT SCODE, ORANGE_NUM, BANANA_NUM, LEMON_NUM FROM sales PIVOT ( MAX(SALE_NUM) FOR ITEM IN ('みかん' AS ORANGE_NUM ,'バナナ' AS BANANA_NUM ,'レモン' AS LEMON_NUM ) )
結果は、
| SCODE | ORANGE_NUM | BANANA_NUM | LEMON_NUM |
| 03 | 5 | 2 | 7 |
| 01 | 10 | 12 | 16 |
| 02 | 18 | 25 | 23 |
Oracle
DBMS_RANDOM.VALUE は、0から1の数を生成し、精度は38桁
SELECT DBMS_RANDOM.VALUE FROM dual
は、0.73988067528604570993642928024798559837 を生成したりする。
整数 1~1000 の範囲で欲しい時は
SELECT TRUNC(DBMS_RANDOM.VALUE(1,1000)) FROM dual
整数 -1000~0 の範囲で欲しい時は
SELECT TRUNC(DBMS_RANDOM.VALUE(-1000,0)) FROM dual
PostgreSQL
random() 関数を使う。
SELECT random()
random() も、0から1の数を生成し、PostgreSQL version 15 では、
0.17280202311237436 の様になる。小数点桁数=17
整数範囲指定して整数で欲しい時は、
TRUNC((random() * (最小値 - 最大値)) + 最大値
という書式に従って、
整数 1~1000 の範囲で欲しい時は、
SELECT TRUNC(random() * (1 - 1000)) + 1000
整数 -1000~0 の範囲で欲しい時は
SELECT TRUNC(random() * (-1000 - 0))
MySQL 8.0
RAND() 関数を使う。
RAND() も、0から1の数を生成し、
SELECT RAND()
結果は、0.1396465479765521 のように、小数点桁数=16
整数 1~1000 の範囲で欲しい時は、
SELECT TRUNCATE(RAND()*1000,0) + 1
整数 -1000~0 の範囲で欲しい時は
SELECT (TRUNCATE(RAND()*1000,0) + 1) * -1
SQLの INTERSECT の使い道って何だろう?と。。。
よくあるテーブルの抽出結果を任意のテーブルに insert するのは、
INSERT INTO tableA( column1 ,column2 ) SELECT column1 ,column2 FROM tableB
登録で重複が起きる時、UPSERT文や以下のようなMERGE文、
DBの種類によって書き方に多少の違いがあるにせよだいたい以下のようにして実行しているが、
MERGE INTO tableA USING tableB ON 結合条件 WHEN MATCHED THEN update文 WHEN NOT MATCHED THEN insert文
を使うであろう。
これを実行する前に、重複だけを抽出して欲しいという要求がきたらどうするか?
INTERSECT を使う。そもそもINTERSECT:積集合は、2つの検索結果で結果として
同じであるものを求めることであり、集合の重なり部分を求めること。
だから、
SELECT column1 ,column2 FROM tableA INTERSECT SELECT column1 ,column2 FROM tableB
のように、UNION や UNION ALL を書いた時のように使用する。
UNION のように列名も同じである必要がある。
意外と大量に重複だけを求めて欲しいという要件があまりないので実践でも少ないのかもしれない。