SQL

プログラミング言語の構文って大事だよね、という話

Twitterでこんなつぶやきをしました。 プログラミング言語としてのSQL(select)とか、プログラミング言語としてのXSLTとかやると、構文大事って実感持ててオススメ。オススメはしない。— ぐるぐる系SQL (@bleis) 2021年4月24日 が、ちょっと違う感じに受け取…

SQLアンチパターン

献本いただきました。ありがとうございます。 当たり前を当たり前にできる可能性を秘めた本 この本の素晴らしいところは、よく見る「悪い」方法を、「悪いこと」としてまとめてくれたことです。 今までは、筋のよくない設計やSQLを考え直してもらうためにあ…

生島さんが考える最強の言語 SQL

SQL

生島さんが誰と闘っているのか知らないけど、ちょっと気になることをつらつらと。SQLは最も高級言語 - SQLer 生島勘富 の日記 SQLは最も高級言語2 - SQLer 生島勘富 の日記 SQLとはなんぞや? - SQLer 生島勘富 の日記 高級*言語* どうも生島さんは、「SQL …

SQL (再帰 CTE) 基礎文法 (?) 最速マスター

SQL

なんか流行ってるらしいので。 他の言語をある程度知っている人はこれを読めば SQL (再帰 CTE) の基礎をマスターして SQL (再帰 CTE) を書くことができるようになります。 ・・・嘘ですごめんなさい。 ぜんてい いつもの通り、SQL Server 2005/2008 でしか試…

再帰の上限設定

SQL

SQL Server では、何も指定しない場合、再帰の上限は 100 が使用される。 これを変更するためにはクエリヒントとして MAXRECURSION を指定する。 WITH Seq(n) AS ( SELECT 1 UNION ALL SELECT n + 1 FROM Seq WHERE n < 150 ) SELECT * FROM Seq OPTION (MAX…

1 から 10 までの自然数の合計を出すプログラムを SELECT 文のみを使って書きなさい

SQL

ただし入力は始点と終点のみとし、他の数値は適当に生成すること。元ネタ:1から10までの自然数の合計を出すプログラムをプリプロセッサを使って書きなさい - 危ないRiSKのブログ WITH Input(from_, to_) AS (SELECT 1, 10) , Inputs(i, n) AS ( SELECT from…

FizzBuzz

SQL

まずは FizzBuzz から。 思いついたままに書いただけなので色々とアレ。 WITH Input(n) AS (SELECT 100) , FizzBuzz(n, fizz, buzz, fizzbuzz, max_n) AS ( SELECT 1 , CAST(NULL AS varchar(max)) , CAST(NULL AS varchar(max)) , CAST(NULL AS varchar(max…

今日ぽちった本

SQL/RDB オンリーJoe Celko's Trees and Hierarchies in SQL for Smarties (The Morgan Kaufmann Series in Data Management Systems)作者: Joe Celko出版社/メーカー: Morgan Kaufmann発売日: 2004/05/21メディア: ペーパーバック クリック: 14回この商品を…

NULLIF 関数の実用的な使い方 その 2

SQL

NULLIF 関数の実用的な使い方の続編。短いけど。 友人 mi とチャットしていて、NULLIF 関数の実用的な使い方を一つ思いついた。 @a にはユーザの入力がバインドされるとして (SQL Server ですね)、 SELECT ... FROM ... WHERE NULLIF(@a, a) IS NULL ; とす…

SQL Server に望むこと その 1

SQL Server は文字列の連結に「+」を使ってるんだから、文字列の繰り返しに「*」が使えて欲しい。 REPLICATE 関数とかいらない。 SQL Server は文字列の連結に「+」を使ってるんだから、SUM に文字列渡せるようになって欲しい。 再帰 CTE とかだるい。 ただ…

Excel を使って SQL をリファクタリング

結果が変わっていないことを確認しながら SQL をリファクタリングするために、EXCEL - マクロ・シート間の照合 - Office系ソフト - 教えて!gooを参考にマクロを組んでみた。 Function HasDiff_Expect_Actual() As Boolean HasDiff_Expect_Actual = False ' …

SQL/RDB っぽい本を積んでみた

内容はまた後で。 タイトルしかないものは「他にいい本があるか古い」、それ以外はそれ以外です。 RDBMS にあまり依存しない 【改訂第3版】 SQLポケットリファレンス (POCKET REFERENCE)作者: 朝井淳出版社/メーカー: 技術評論社発売日: 2009/04/29メディア:…

(普通の) 再帰 CTE を hierarchyid で

SQL

SQL Server 2008 に実装されている hierarchyid 型は、経路列挙モデルをベースにした型なので、再帰 CTE を置き換えることができる。 例えば、 SQL Server 2005で再帰クエリ - taediumの日記 の再帰 CTE を hierarchyid で実現してみる。 使用するテーブル C…

インデント

SQL

SQL の命名規約とフォーマットの続き・・・になるのかな。 SQL には終了タグはないけど SELECT 文以下はまとまりになっているから、インデントしたほうが自然に感じる。基本的には SQLプログラミング作法 に従ってるけどそこは好みかな。 ... <SELECT> <select-list> * </select-list> <FROM> emp </FROM> <WHERE> id</where></select>…

ソートしていいなら・・・

SQL

あと SQL Server の独自拡張使っていいなら・・・ SELECT MAX(T.n) FROM (SELECT TOP 10 n FROM Input ORDER BY n) T 激速。どれくらい早いかというと、上の SQL が 1 万件のデータに対してそれぞれ 36 秒、26 秒かかるのに対して、このバージョンは 1 秒未…

ソートせずに小さい方から n 番目を見つけ出す その 2

SQL

SELECT P.n FROM Input P WHERE (SELECT COUNT(*) FROM Input C WHERE C.n <= P.n) = @n SQL Server だとこっちの方が高速。

ソートせずに小さい方から n 番目を見つけ出す

SQL

stackoverflow から 「ソートをせずに、配列要素の値の小さい方から n番目を見つけ出す」 C Program to search n-th smallest element in array without sorting? - Stack Overflow Programming Pearls にこの種の話があったと思う。答えを見る前にちょっと…

どこまで知っていて欲しいか

SQL

これも線引きはとても難しいという結論しか出てこないんだけど、使うかどうかは別として、知識としてはある程度の深さまでは知っていて欲しい。 さすがに再帰 CTE までは要求しないけど、NULL に関する知識は必須と言っていい。 さらに、各種結合、ビューや…

極力 SQL だって?

SQL を使えば大抵のことは出来るけど、だからと言って極力 SQL でやる、ってのは間違ってると思う。 出来るからと言ってそれでやるのが適切かどうか、って話でもある。 ならここ最近のエントリはなんなんだ、って話だけど、あれは単なる遊びというか、頭の体…

注意を考慮したうえでの計算で求める総積

SQL

こんな感じ? WITH Input(id, n) AS ( SELECT 1, 1 UNION ALL SELECT 1, 2 UNION ALL SELECT 1, 3 UNION ALL SELECT 1, 0 UNION ALL SELECT 2, 1 UNION ALL SELECT 2, -2 UNION ALL SELECT 2, -3 UNION ALL SELECT 3, 1 UNION ALL SELECT 3, -2 UNION ALL SE…

計算で総積を求める際の注意点

SQL

項目の総積を求める。 - だらだらやるよ。あー、計算で総積を求める場合、注意しなければならない点が 2 つほどあります。 あ、ちなみに SQL Server では loge は log 関数を使います。で、log10 は log10 関数。 log 関連の関数には 0 や負の数が渡せない …

再帰 CTE に関する注意

SQL

ハンマーを手にしたら全てのものが釘に見えるってのは本当だと思う。 例えば、文字列から空白を取り除くために再帰 CTE を使うことも出来るけど、再帰 CTE を知らなかった頃なら REPLACE を真っ先に思い浮かべるはず。 再帰 CTE の使いどころとしては、テー…

10 分間コーディングで 30 分かかった SQL を読み下す

SQL

再帰 CTE の入門が済んだところで、10 分間コーディングで 30 分かかった・・・ - ぐるぐる〜を読んでみましょう! 読み方 上の CTE (Input) から下に向かって読んできます。 Input Input は簡単。 Input(id, numPlayers, deck) AS ( SELECT 1, 3, '12312312…

再帰 CTE で総積を求める (再帰 CTE の入門)

SQL

なんか「SQL かけ算」とかを検索してここに来ている人達がいるようなんだけど、総積でも求めたいのかな? 確かに、SUM はあるのに PRODUCT なんてないしなー。 てことで勝手にそういうことにして、再帰 CTE で総積を書いてみる。 RDBMS はもちろん (?) SQL S…

BrainCrash in SQL

SQL

Brainf*ck in SQL を改造して、BrainCrash in SQL を書いてみました! BrainCrash については 404 Not Found を参考にしてください。 WITH -- 入力 Input(id, bc_program, stdin) AS ( -- Hello, World!と標準出力に出力するプログラム SELECT 0, '', '' -- …

10 分間コーディングで 30 分かかった・・・

SQL

C#と諸々 10分でコーディング 10分でコーディング|プログラミングに自信があるやつこい!!乗り遅れた感はあるけど、SQL でやってみた。 WITH Input(id, numPlayers, deck) AS ( SELECT 1, 3, '123123123' UNION ALL SELECT 2, 4, '123123123' UNION ALL …

「以下について教えてあげよう♪」・・・SQL で

SQL

「以下について教えてあげよう♪」 - ...ing logging 3.0 経由、以下について教えてあげよう♪ 書いてみた。やっぱり SQL で。 WITH Input(id, str) AS ( SELECT 1, 'Abc012_59F_#012Gh' ) , Transform(id, res, input_str) AS ( SELECT id , CAST('' AS varch…

行持ち・列持ち (横持ち)

ちょっとまとめ。 行・列 行と列は漢字からイメージすると覚えやすい。例えば、以下のテーブル col_a col_b col_c col_d 1 2 3 4 5 6 7 8 なら、一行目は 1, 2, 3, 4 だし、三列目は 3, 7 となる。 列持ち (横持ち) では、列持ちとはどういうテーブルのこと…

SQL で数式を評価 (完全版 + α)

SQL

大阪で働く友人 mi との合作*1で不完全版が完全版に! やっぱり mi はすごかった!! WITH Input(id, str) AS ( -- idと数式を渡す SELECT 1, '1 + 3 / -8' UNION ALL SELECT 2, '2*3*4*5+99' UNION ALL SELECT 3, '4 * (9 - 4) / (2 * 6 - 2) + 8' UNION AL…

Brainf*ck in SQL

SQL

Brainf*ck はチューリング完全らしいですよ。 Brainf*ck 自体に興味のある方は、Brainf*ck や Brainfuck - Wikipedia へどうぞ。 WITH -- 入力 Input(id, bf_program, stdin) AS ( -- Hello, World!と標準出力に出力するプログラム SELECT 0, ' >+++++++++[<…