- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2023-12-14T17:12:18+09:00","default:irrp","irrp")
#author("2023-12-20T17:23:37+09:00","default:irrp","irrp")
→[[データベース関連]]
→SQL関連メモ(Oracle)
→T-SQL関連メモ
#contents
*一般 [#sc7d5bfb]
-[[無料で学ぶ『達人に学ぶSQL徹底指南書 第1版』 #SQL - Qiita>https://qiita.com/katayamahide/items/48f7a78dab3497adcd0c]] 2023.11
-[[エンジニアなら解けるかも?プログラミング経験ゼロでもSQLを無料で学べるpaizaのプログラミングゲーム「エンジニア騎士とクエリの魔女 DBエンジニア、魔法使いになる」で遊んでみた - GIGAZINE>https://gigazine.net/news/20220822-paiza-engineer-knight-and-query-witch/]] 2022.8
--[[高難度SQL問題の解答例公開!『エンジニア騎士とクエリの魔女』でSQLをマスターしよう - paiza開発日誌>https://paiza.hatenablog.com/entry/2022/09/12/140000]] 2022.9
-[[500ページ超えの新刊『わかりみSQL』を支える技術>https://qiita.com/kauplan/items/bbf72e711adbb46e93d0]] 2019.9
-[[SQL本三大対決>http://blog.livedoor.jp/dankogai/archives/50995918.html]]
-[[SQLクリニック@IT:http://www.atmarkit.co.jp/fdb/index/index-db.html#sqlclinic]]
*Tips [#m47a0472]
-user_idで先頭2桁に'00'がついているものからそれを除去する例
UPDATE m_user SET user_mst = SUBSTRING(user_id, 3) WHERE user_id LIKE '00%';
-[[実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial - Speaker Deck>https://speakerdeck.com/soudai/pgcon21j-tutorial]] 2023.10
-[[リーダブルSQL[より良いSQLを書くためのシンプルで実践的なテクニック] - Qiita>https://qiita.com/zackey2/items/883616dff71e51bf6563]] 2023.9
-[[【備忘録】MySQLでGROUP BYとサブクエリを使った話 - Qiita>https://qiita.com/ssc-syuinoue/items/f8ab8e1df21624d0291a]] 2023.10
--ウィンドウ関数
-[[SQLのマージ(MERGE)文を使ってみよう!INSERTまたはUPDATEを実行する | ポテパンスタイル>https://style.potepan.com/articles/25767.html]] 2020
-[[競走馬の血統をSQLで再現できる! 再帰クエリ徹底活用してみた - asoview! TECH BLOG>https://tech.asoview.co.jp/entry/2022/12/10/120000]] 2022.12
-[[【SQL Server】改行コードを取得・置換・更新する | SQLServer初心者でもスッキリわかる>https://sql-oracle.com/sqlserver/?p=1004]] 2022.10
-[[SQLでグループごとに最大のレコードを取得する ROW_NUMBER関数とRANK関数 - Qiita>https://qiita.com/katao_eng/items/62ce979108b302fc3f1e]] 2022.10
-[[SQL改善で処理時間を約98%カットできた話 - Qiita>https://qiita.com/genta-kawabata/items/e631c77a3e7969a2100f]] 2022.9
--条件内にほとんどあるものを探すより、条件を反転させて「ほぼないものの中にない」ものを探す方が速い
-[[【SQL】SELECT文の実行結果もっと見やすくならないですか? - Qiita>https://qiita.com/suzuko24/items/438349a96eb24cdf3d96]] 2022.10
--構文の違いは、;(セミコロン) を \G に変えるだけ!
-[[How to Update from Select in SQL - Database Star>https://www.databasestar.com/sql-update-from-select/]] 2022.10
-[[各社員が所属している複数の部署の部署コードをすべて取得し、カンマでつないで1項目として表示する>http://tech.aainc.co.jp/archives/8105]] 2022.10
--MySQLならGROUP_CONCAT()を使う
--SQL Server ならSTRING_AGG() が同等の機能として使える ※[[The SQL Server Equivalent to GROUP_CONCAT()>https://database.guide/the-sql-server-equivalent-to-group_concat/]]
SELECT [対象年],[対象月],[社員番号],[氏名],
STRING_AGG ( [JOBNo.], ',') as JOBNo
FROM [xxxDB].[dbo].[t0004_外注一覧] t1
left join t0001_案件_売上項目 t2 on t1.社員番号=t2.商品コード
where 対象年=2022 and 対象月=9
group by 対象年, 対象月, 社員番号, 氏名
-[[SQL基礎!! 指摘ビフォーアフター(研修、レビュー、SELECT文) - Qiita>https://qiita.com/ryamate/items/c42ade6b8f3f65358ef9]] 2022.9
-[[FastAPI SQLModel 入門 - Qiita>https://qiita.com/sand/items/f338e67e86d728f793c2]] 2022.9
-[[[SQL Server] 縦に並んだデータを横にカンマ区切りの列データで取得する方法 │ Web備忘録>https://webbibouroku.com/Blog/Article/forxmlpath]] 2022
-[[SQL Serverで取得結果行を1列に連結するSQL(FOR XML PATH) | Think Twice>https://fumokmm.github.io/it/sqlserver/for_xml_path]] 2022
-[[縦に並んだ複数行のデータをカンマ区切りで横並びに表示 | DB & SQL 技術ブログ>https://www.dbsheetclient.jp/blog/?p=229]] 2014
-[[WHERE 条件のフィールドを UPDATE するのって,明示的にロックしてなくても安全?全パターン調べてみました! - Qiita>https://qiita.com/mpyw/items/14925c499b689a0cbc59]] 2022.7
-[[EXISTSとSQLの高速化について>http://kkoudev.github.io/blog/2013/09/14/sql/]] 2013.9
--[[SQL テーブル参照先の条件句 JOIN vs EXISTS>http://totech.hateblo.jp/entry/2016/09/21/172801]] 2016.9
---こちらはEXISTSの方が速くなるケース
-[[WITH句で変換後に目的のテーブルへINSERT SELECTしてみた | DevelopersIO>https://dev.classmethod.jp/articles/insert_and_with_clause_on_redshift/]] 2023.12
-[[WITH句を使い重複するSQL文をまとめる方法>http://omachizura.com/sql/WITH%E5%8F%A5%E3%82%92%E4%BD%BF%E3%81%84%E9%87%8D%E8%A4%87%E3%81%99%E3%82%8BSQL%E6%96%87%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B%E6%96%B9%E6%B3%95.html]]
-SELECTしたレコードをUPDATE/DELETEする場合、最初に
SELECTするときにROWIDを取得しておいてキーにすると速く処理できる(ただしRowIDがつ使えるOracleの場合)
-DECODEや CASE WHEN 式でSQLを一つにまとめられるならしたほうがよい
-HAVING句による絞り込みをする前にwhere句による絞り込みをしたほうがいい
--良い例
SELECT job, AVG(uriage) from emp
where job IN ('A','B', ...) group by job;
--悪い例
SELECT job, AVG(uriage) from emp
group by job having job IN ('A','B', ...) ;
--先に絞り込んでから集計する方がパフォーマンスが良い
-レコードを毎回ランダム順に取得
select newid() nid,* from <hoge> order by nid
-抽出結果からテーブル作成
select * into <hoge> from <hage>
-抽出結果を既存テーブルにインサート
insert into <hoge> select * from <hage>
<hoge>と<hage>の項目が合っていることが前提。values()や項目指定などを使って合わせる
-[[Having句の力>http://codezine.jp/a/article/aid/652.aspx]]
-[[SQLの日付処理関数>http://www.atmarkit.co.jp/fdb/rensai/tsql03/tsql03_2.html]]
-[[SQLで数列を扱う>http://codezine.jp/a/article/aid/1076.aspx]]
-[[SQL for practitioners:http://www.geocities.jp/mickindex/database/db_TaT.html]]
--2つのテーブルのコンペア→どこが一致してないのか特定する方法
--完全外部結合(2つ以上のマスタで外部結合する FULL OUTER JOIN)
--リスト比較
-[[自己結合の使い方:http://codezine.jp/a/default.aspx?cid=134&aid=460]]
-[[CASE式のすすめ:http://codezine.jp/a/article.aspx?aid=405]]
-[[三値理論とNULL:http://codezine.jp/a/article.aspx?aid=532]]
*文字列の中に数字以外の文字があるかどうかで絞り込みたい [#ubd4744d]
-Oracleならtranslate()関数で英字を''に変換して長さが変わるか見る
-SQL Serverにはtranslate()がないので↓のようにする
len(
replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(
replace(kekka,'0', '') , '1', ''), '2', ''),'3',''), '4',''),'5',''),'6',''),'7',''),'8',''),'9',''),'.','')
) > 0
-参考:http://otn.oracle.co.jp/cgi-bin/non/msgview_r.cgi?communityid=otn-901234&bbsid=1&no=43887&view=8
*関連サイト [#g6c102a0]
-[[SQLBolt - Learn SQL - Introduction to SQL>https://sqlbolt.com/]] 2022.11
-[[Poor SQL>http://poorsql.com/]]
--SQLのフォーマットをしてくれるサイト
-[[ブラウザでRMDB別のSQLを実行できる「SQL Fiddle」 │ Web備忘録>https://webbibouroku.com/Blog/Article/sqlfiddle]] 2022.8