Microsoft SQL Server 総合スレ 11 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
Microsoft SQL Server (Transact-SQL) の総合スレッドです。
・Microsoft 公式サイト
http://www.microsoft.com/japan/sql/
過去スレとかめんどいから誰か適当に貼って >>646
ゼロはオーと打ち間違えやすいので避けたい
テンキーなら間違えないが
ノートパソコンだとゼロとオーは隣あっていて打ち間違えやすい >>647
見間違えるのはわかるけど打ち間違えってw
それおまえだけだからwwww where 1=1はsql文の慣例句みたいなものでgoogleで検索してもいっぱいでてくる。そんな事で悩む必要はない。
http://kinocolog.com/where11/ 100文字以内のデータしか入れない場合には
nvarchar(100)
で良いですよね?
質問1
全角文字で半角文字でも100文字入るんですよね?
質問2
nvarchar(max)
にすると無駄にメモリやハードディスクを使いますか? 回答1
Yes
回答2
No
varcharは可変長だから入ってる分だけの消費 >>653
ありがとうございました。
>varcharは可変長だから入ってる分だけの消費
では、カラムが10文字でも100文字でも
とりあえずnvarchar(max) を使っておけば良いのでしょうか?
どういう場合にnvarchar(100) などを使うのでしょうか? index張らないならMAXでもいい
張るなら900バイト以下でなければならない 教えてください。
テーブルA に製品の情報がたくさん登録されています。
この中から、不特定多数の特定の文字列で始まらない名称の製品を検索したいと思います。
条件が固定であれば次のような SQL を書けます。
SELECT *
FROM [テーブルA]
WHERE NOT ( [NAME] LIKE 'A%' OR [NAME] LIKE 'B%' OR [NAME] LIKE 'C%' )
条件(先頭の文字)を動的に変更するとしたら、
上のをストアドにしてパラメータで与えるとか、
条件をテーブルに保存しておくなどがあると思うのですが、SQL の書き方がわかりません。
どうするのが一般的か、教えてください。 テーブル型を引数にして
where not Left([NAME], 1) in (select [Word] from @引数)
みたいな風かな
ASCII しないといかんかもしれん >>657,658
ありがとう。
どっちのやり方も知らなかったです。
とりあえず 658 さんの方法を発展させてやってみようと思います。
657 さんの動的 SQL は便利すぎ。 一時テーブルに検索文字列セットして
left joinでlike 演算子で連結してnull のものだけ取ればいいように思える
https://teratail.com/questions/65949 >>659
動的SQLはできるだけ使わないように。条件の組み合わせが大量になければ、静的SQLで書く。動的SQLはSQLの組み立て方によっては、可読性、保守性がさがり、さらにコーディングミスをおこし、スペースを入れわすれた等おかしなSQLを簡単に仕込んでしまう。 >>656
それ単にパラメータによって、LIKE用の文字列を作り分けておけばいいだけ。 >>660
ありがとう。
left join で like って使えるんですね。
その結果が null のモノだけって発想がありませんでした。
こちらをまず試してみます。
>>661,662
ありがとう。
うん、そう思って動的 SQL は最後の手段にしとこうかと。 こうしてまたバカのバカによるバカのためのバカノウハウが広まるのであった スマートな解決策書けてりゃ格好いいんだけどなぁ...
>>664だとバカの遠吠えにしかなってない w 結局、RDBになるとSQLが魔法になってプログラムの見た目はシンプルでも、RDBMSの処理が複雑になるようなものを作るやつが多すぎる。
RDBの処理が汚なくなり、無意味に負荷がかかるようなプログラミムを書いても、RDBMSの処理がどう処理しているのか考えないから、珍妙なことを推奨する。 >>665
そのスマートな解決策()が動的SQLなんよ
バカには難しいらしいけんどねw データベース板はレベルが低い。リレーショナルデータベースに詳しくもないのにこうだ、これが正解だと言いはる人間ばかり。 せめてどこがどう「無意味に」負荷がかかってるのか書けないのかね >>670
検索結果が同じSQLでも、RDBMSではSQLの構文解析(ソフトパース、ハードパース)が行われ、実行プランも作り直しなることもあり、RDBMS側の処理が変化する。
プログラムだと結果は同じなのに、こうすると遅い、速いや、意味のないコードを書くと文句を言うくせにSQLになると、とたんにRDBMSもプログラムだということを忘れているか、理解していない。
SQLは魔法ではない。 別にSQLでもこう書くべきとか言う議論は普通にやられてるしお前がそう言うのを見てないだけかと >>671
同じ結果の処理を同じ手間で書けるなら、負荷は軽い方がいいに決まってるけど
で、その説明でどこがどう負荷かってるの?
まさかクエリキャッシュ効かないでコンパイル時間がとか言う気?
>>672
まあしかし、理想はそのへん意識しないでRDBMSに任せる事なんだろうとは思う
オプティマイザの動作を予想して奇妙なSQL書くのは本末転倒だし 久しぶりにアツいマウント合戦開幕したなw
どっちも負けろwwww SQL SERVER2014Expressが動いているWindowsサーバーのOSをクリーンインストール
する予定なのですが、データベースを丸ごとバックアップしておいて、あとで戻すなどは
可能ですか?ヒントを教えて下さい。DBのサイズは500MB 程度です。 リンクサーバー設定とかデータベースの設定とかもバックアップする方法ってないものか
ドライブごとバックアップするしかないのかな >>673
根本的にリレーショナルデータベースを分かってないのになぜ知ったかぶりをするのか?
リレーショナルデータベースは重い処理をしてるんだぞ?
リレーショナルデータベースの内部処理が見えないから、自分のしょぼいプログラムと比較にならないことをしていることに気づかない。 >>673
そもそもあんたの用語がおかしい。データベースを知らないと思う。データベースを使うのが精一杯で、リレーショナルデータベースの構造も知らないと思われる。
クエリキャッシュなんて言葉はデータベースエンジニアは使わない。 >>673
同じ結果でもいつも速いわけではない。統計情報の取得タイミング、データの傾向の変化で実行プランが最適にならない可能性もあれば、コストが高くても速いこともある。
バッファキャッシュの有無、データファイル読み書きタイミング、速度、OSのキャッシュ、ストレージのキャッシュ、ありとあらゆる条件で性能は決まるのであって、そのなかからどう処理されているかのSQL Serverの情報を元にSQL Serverが言っている処理情報の誤りまで判断して決めることだ。 定期的にわくよね。当たり前の一般論をすごいことのように語るID付いてるおっさん。 >>677
ありがとうございました。やってみます。 >>679
知らなかった。今度からmaster もバックアップする masterリストアするのは簡単じゃないから、再生成するスクリプト作って流すほうが楽かもよ 質問です。
顧客テーブルと売上テーブルがあり、顧客IDで紐付いています。
特定の条件の売上が無い(売上テーブルにレコードが存在しない)顧客のみを抽出するには、どのような方法が考えられるでしょうか?
仮テーブルに顧客テーブルの全レコードをコピーし「特定の条件の売上が有る」顧客を削除していく、という方法は思いつきましたが、SQL文のみで実現する方法はあるでしょうか?
無いものは抽出できない、とは思うのですが… >>689
自ら吐いた言霊に呪われとるやんw
無いのは売上
抽出するのは顧客
な? SELECT * FROM 顧客テーブル
WHERE NOT 顧客ID IN (SELECT 顧客ID FROM 売上テーブル)
みたいな風かな >>692
そういうINの使い方は悪手だよ
NOT EXISTSかLEFT JOINを使おう >>689
>>690で答え出てるけどないものを抽出するんじゃなくて、「売上に紐付かない顧客」を抽出するってこと >>694
そういうJOINの使い方は悪手だよ
NOT EXISTSを使おう exists は確かにわかりやすい記述だけど遅い
大量のデータで使うとサーバーが唸る
できるならinner joinでやったほうがいい
http://kkoudev.github.io/blog/2013/09/14/sql/ >>696
NOT EXISTSをINNER JOINにするのは無理だし
MySQLはNested Loopしか使えないからね
他の一般的RDBとは事情が違うよ >>695
NOT EXISTSのほうがパフォーマンスいいことのほうが多いけど
LEFT JOINが悪手ってわけでもないと思うけどな
少なくとも質問者はLEFT JOINを理解してない風なので
そっちからはじめたほうがいい みなさまありがとうございます。
LEFT JOINでできるとは思いませんでした…頭が硬いですね。
教えていただいたNOT EXISTSも調べたところまさにやりたいことでした。
何とかなりそうです。
ありがとうございました。 >>695
環境、データ、インデックスとかによって違うからお前さんみたいに盲信してるのが一番ヤバイ 経験上LEFT JOIN でIS NULLのほうが速い場合がほとんど >>692さんみたいな書き方を良くするんですが、これは遅いのですか? あっ、ただ自分の場合は
「WHERE NOT 顧客ID IN (SELECT 顧客ID FROM 売上テーブル)」
ではなく
「WHERE 顧客ID NOT IN (SELECT 顧客ID FROM 売上テーブル)」
と書きます。 売上げテーブルに顧客IDでインデックス貼ってあればそんなに遅くない気もする 692は自分だけど、後でみなさん言われるとおり
SELECT * FROM 顧客テーブル
WHERE NOT EXISTS (SELECT TOP 1 FROM 売上テーブル WHERE 顧客ID=顧客テーブル.顧客ID)
のほうが速そうだな 速いとか遅いとか気にしたいんならDBが適切にメンテされているかを考えるべきやな
SQLの表記のゆれなど考えるだけ無意味 NOT INの場合はパフォーマンス以前に
顧客IDがNOT NULLじゃないと意図した結果が得られない可能性がある
NOT NULLなら意図した結果が得られるけど、速度はDBの最適化に依存
INの最適化レベルが高いDBならNOT EXISTSと同程度の速度に場合もある
でもそうならない場合もあるからこういうケースでは基本使わない >>700
環境、データ、インデックスとかによって違うからお前さんみたいに
テストした環境でLEFT JOINが速いからLEFT JOINにしてしまう奴が一番ヤバイ >>710
うまい返ししたつもりなんだろうけどアホ晒してるだけやぞww >>711
普通に答えただけだけどうまかったか?w
マジかwセンスあんな俺www 単純なnot inならouter joinと同じ実行計画吐いたきがする >>714
だからたまたまその時その環境でそういう実行プランが作られたという経験を
後生大事に今生の知識として胸にしまいこんでも無駄だと言っておろうが
SQLはいつだってよりシンプルにより直接的にやりたい事を表現してる様に書くべきなんや >>712
誰もうまい返しとは言ってないぞ
日本語の理解力もないとな w >>716
は?こっちこそお前がうまい返しと言ったとは言っとらんが???
異次元の理解力だなお前…
というかアスペだなwww >>717
> というかアスペだなwww
自己紹介乙w 5chはROM専みたいな筆不精は、長文が書かれていると、時間をかけて書いていると思い込む。
世の中、超速で読み書きができる人間がいるのだよ。 仕事でやってるなら仕事が異常に速いひとを知ってるはずだけどな。並の人間の20倍、30倍くらい仕事が速い人もいる。 1.5人月で見積もられた仕事を1日で片付ける人か。
さすがにそれは見たことないわw >>726
そんな思考だから仕事遅いんだよ
できる人できない人の違いすら理解できてない 仮に1.5人月のコードを5000行とすると
1日でそれ書いて、さらに仕様書とかも書いてテストもするんやで?
めちゃくちゃ打つの速いやん >>731
何で考えても書く行数は変わらんのだけどw 無能な働き者の手による大量の無駄なコードは有能な怠け者の手による洗練された短いコードに劣る >>732
724が言ってるような並の人間より仕事が20倍30倍速いやつってのは
並の人間が5000行書かないと実現出来ない処理を200行程度書くだけで実現したりできるわけ
キーボードだってできるだけ打たなくていい方法を考える
見積もり時に書く行数がほぼ固定されてるような仕事してるなら
できるだけそこから早く抜け出すことだな >>735
それコードが圧縮されとるだけやんwコードゴルフかw
コードは20倍圧縮されても作業にかかる時間は速くなっとらんでそれwww お前らはどうしてスキルないくせに突飛な主張してマウントとりたがるんや?
俺は笑えるからこうして楽しんどるけど一般的にはみっともないだけやでw どれだけ優秀な人間だろうと、1.5人月で見積もった仕事を1日で片付けたらな
そもそもの見積もりがぼったくりすぎるだけだな メタプログラミングやコードジェネレーションを考えればいいと思うよ
できるやつは無駄を省いて機械に仕事をさせる
Paul GrahamのLispの話と同じ 新進気鋭の「グラフデータベース」って用途が思いつかないな RDBはグラフと相性悪いからな
用途が思いつかないうちは使う必要ない 一昔前の技術で言えば多次元DBと同じようなもん
RDBみたいにあらゆる所で使われる技術ではない グラフデータベース=ビッグデータ()
とか言ってると恥ずかしいよ ■ このスレッドは過去ログ倉庫に格納されています