16bit!

エンジニアじゃなくなっちゃった人が何かを書くブログ

SQL

【Oracle】【SQL】テーブルのエイリアスを指定している場合にはヒントにもその情報を書かないとヒントが効かない

備忘メモを兼ねて。■基本 oracleで実行するSQLに、使用するインデックスを指定するためのヒント句を足す際の書き方は、 "select"の直後に"/*+ INDEX(TABLE名 INDEX名) */"を入れるだけ*1。 SELECT /*+ INDEX(SAMPLE_TABLE SAMPLE_TABLE_IDX01) */ * FROM SAM…

【SQL】【Oracle】親子テーブルを結合して抽出する際に、1行目だけに親の情報を表示させる方法

要するにブレーク処理みたいなことをSQL1本でやりたいって話です。 サンプルテーブル 親テーブル:item_category PK:category_id category_id category_name 1 食料品 2 衣料品 3 日用品 4 嗜好品 子テーブル:item PK:category_id, item_id category_id item_…

【SQL】UNIONした結果を非表示項目でソートする

"UNION"や"UNION ALL"を使って2つ以上のビューをまとめて1つの結果として抽出する場合に、 結果には表示しない項目でソートをかけたいとする。文章だと何言ってるかわからないので、例としては以下みたいな感じ。 例題 ・kudamonoテーブル 名前 値段 美味し…

【SQL】ALL, ANYの使い方

ちょっと前に書いた以下の記事について、CodeIQからフィードバックが来ました。【SQL】COUNTが最大のものだけを抽出する - 16bit!で、そのフィードバックでは"ALL"というキーワードを使っていたのですが、 正直そのキーワード知らなかったのでメモを兼ねてち…

【SQL】COUNTが最大のものだけを抽出する

CodeIQに珍しくSQLの問題があったので、休憩がてらちゃちゃっとやってみました。挑戦者求む!10分で挑戦!最頻値をSQL出力! by CodeIQ運営事務局要するに、特定のカラムでgroup byして、その中でCOUNTが最大のものだけを抽出しろという話。 select v.score,…

【SQL】月初め、末日を取得する関数などまとめ

暇なので簡単にまとめておきます。 select to_char(trunc(sysdate),'YYYY/MM/DD') TODAY, //今日 to_char(trunc(sysdate,'MM'),'YYYY/MM/DD') FIRST_DATE,//当月初日 to_char(trunc(sysdate,'YYYY'),'YYYY/MM/DD') YEAR_FIRST_DATE,//当年度初日 to_char(las…

【SQL】substrbでマイナス指定したらどうなるのかという話

この前、substrを使ったSQLでの文字列の切り出し方法を書きましたが、 今回はそれのおまけというか備考というか。 基本構文 select substrb('あいうえお', 2, 2) from dualまずおさらいですが、substrbは"substrb(カラム名, 開始位置, バイト数)"という書き…

【SQL】文字列の切り出し抽出方法

SQLで文字列型のカラムから指定した文字数だけを切り出して抽出する方法です。 使う場面としては以下のような場面が有り得るかなと思います。<使用場面例> ・抽出結果を外部システムにインポートするが、その桁数制御のために長すぎる文字列は途中までで切…

【SQL】EXISTS句の中は"SELECT *" か"SELECT 1"か

備忘を兼ねて。 「SQLを実行する際、"IN"を使うよりも"EXISTS"を使う方が速い」 というのは割と周知の事実ですが、 じゃあ、EXISTSを使う場合、 「その中身は"SELECT *"を使うべきなのか"SELECT 1(定数)"を使うべきなのか」 というと、こっちは少々微妙な…

【SQL】マッピングテーブル上の自己結合

SQLには自己結合という、同じテーブル同士を結合するというテクニック(?)がありますが、 その用例を見てみると、 テーブル.従業員表 従業員番号 従業員名 上司 135 INAGAKI 240 240 KIMURA NULL 184 KUSANAGI 135 235 KATORI 240 こんな感じのテーブルか…

【SQL】【Oracle】SELECT FOR UPDATE NOWAITの注意点

OracleではSQLの発行時、select文に”for update”と付けることによって 抽出したデータを行単位でロックすることができます。 select * from TBL where col_1 = 'A' and col_2 = 'B' for update なお、ロック後に該当の行に対して別のセッションからアクセス…

【SQL】直近1年分のデータを抽出する

■SQLで直近1年分のデータを抽出したい時の書き方 //以下はinput_dateというカラムがシステム日付でここ1年以内のものを抽出するサンプル select * from table where input_date >= (sysdate - 365) ただ、これだと閏年の時に1日足りなくてずれてしまう。 そ…