#author("2024-01-03T11:41:22+09:00","default:irrp","irrp")
→[[データベース関連]]

→SQL関連メモ(Oracle)

→T-SQL関連メモ

#contents


*一般 [#sc7d5bfb]
-[[実際に使う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]
-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

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS