#author("2024-01-30T18:33:07+09:00","default:irrp","irrp") #author("2024-03-25T17:46:35+09:00","default:irrp","irrp") →[[データベース関連]] →SQL関連メモ(Oracle) →T-SQL関連メモ #contents *一般 [#sc7d5bfb] -[[より信頼できるクエリを書くために、SQLでもテストを書く - ハヤオキスルフクロウ>https://fkubota.hatenablog.com/entry/test_driven_sql]] 2024.1 -[[実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial - Speaker Deck>https://speakerdeck.com/soudai/pgcon21j-tutorial]] 2024.1 -[[無料で学ぶ『達人に学ぶ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] -[[MySQL8.0のWindow関数を分かりやすく紹介する(1) – スマートスタイル技術ブログ>https://blog.s-style.co.jp/2024/03/11524/]] 2024.3 -[[注意!DBのインデックスが効かなくなるSQL | SIOS Tech. Lab>https://tech-lab.sios.jp/archives/38797]] 2024.1 -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