X



トップページDB@2ch掲示板
1002コメント330KB
SQL質疑応答スレ 17問目 [無断転載禁止]©2ch.net
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001NAME IS NULL
垢版 |
2016/07/10(日) 22:29:01.40ID:???
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

SQLという言語はISOによって標準化されていますが
この標準を100%実装したDBMSは存在せず、
また、DBMSによっては標準でない独自の構文が
追加されていることもあります。

質問するときはDBMS名を必ず付記してください。

【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明

前スレ:
SQL質疑応答スレ 16問目
http://echo.2ch.net/test/read.cgi/db/1447160858/
0843NAME IS NULL
垢版 |
2017/10/30(月) 21:20:22.79ID:bh4tIMwn
SQL Serverの管理ビューは1で
Oracleのデータディクショナリは2だな
他のDBMSはどうだろう
0844NAME IS NULL
垢版 |
2017/10/30(月) 22:29:55.78ID:???
>>842
なにそのオレオレ本来の考え方って?
0845NAME IS NULL
垢版 |
2017/10/30(月) 22:34:48.02ID:???
論理レベルで複合キーやナチュラルキーのテーブルを
物理レベルでどう扱いたいかが重要な分岐点
0846NAME IS NULL
垢版 |
2017/10/31(火) 02:45:10.98ID:???
>>844
同じものには同じ名前をつける
違うものには違う名前をつける
これが原則

たとえば標準単価と販売単価を、同じ単価と言う項目名で定義するのはよろしくないだろ

ここ設計スレじゃないしこれ以上はどっか別のスレでよろしく
0847NAME IS NULL
垢版 |
2017/10/31(火) 06:28:26.89ID:???
>>846
何で列名だけで判断してるんだ?
標準価格.単価 と 販売価格.単価 が同じものに見えるなら病院に行った方がいい
0848NAME IS NULL
垢版 |
2017/10/31(火) 07:03:48.58ID:1FOujQPV
先入観に汚染されてるなw
0850NAME IS NULL
垢版 |
2017/10/31(火) 11:39:03.51ID:IzoEenp0
>>847
それはRDBの考え方ではない。
0851NAME IS NULL
垢版 |
2017/10/31(火) 13:26:32.03ID:???
そんな紛らわしいこと実務でやる奴いたら、とっちめられるぞ
0852NAME IS NULL
垢版 |
2017/10/31(火) 13:46:14.10ID:???
>>846
何をもって同じとするのか
何をもって違うとするのかの基準が違うから
id派とuser_id派に分かれるんだよね

例えば各テーブルに内部的な管理用としてレコードの更新日時を記録する場合
最終更新日時とかの名前でどのテーブルも同じカラム名でも別におかしくない
レコードの更新日時という意味で同じだから
id派の考えはその延長
0853NAME IS NULL
垢版 |
2017/10/31(火) 14:13:44.10ID:???
create table T (
nk1 int PK, -- nk = Natural Key
nk2 int PK,
nk3 int PK,
nk4 int PK,
a int not null,
b int null,
c int null
)

create table TA (
nk1 int PK,
nk2 int PK,
nk3 int PK,
nk4 int PK,
a int not null
)

create table TB (
nk1 int PK,
nk2 int PK,
nk3 int PK,
nk4 int PK,
b int not null
)

create table TC (
nk1 int PK,
nk2 int PK,
nk3 int PK,
nk4 int PK,
c int not null
)
0854NAME IS NULL
垢版 |
2017/10/31(火) 14:48:11.62ID:IzoEenp0
>>852
無理矢理すぎる理屈だな。

登録・更新者、登録・更新日時の項目は、結合項目として使用するなどどいう話は、あなたの中でもないだろうに。
0855NAME IS NULL
垢版 |
2017/10/31(火) 15:56:39.69ID:HRkll2T3
そうかなあ
テーブル名もカラム名の属性を表してるわけで
テーブル名をテキトーにつけてなけりゃ
情報の一部だべ
0856NAME IS NULL
垢版 |
2017/10/31(火) 16:15:00.47ID:???
>標準価格.単価 と 販売価格.単価
テーブル名まで書くんだったら、最初から
>標準価格 と 販売価格
で良いんでは
0857NAME IS NULL
垢版 |
2017/10/31(火) 16:32:16.66ID:IzoEenp0
>>855
テーブルの論理名はエンティティ名といって、適当に名前をつけていたら、混乱するだけでよいことはない。
0858NAME IS NULL
垢版 |
2017/10/31(火) 16:33:04.70ID:IzoEenp0
>>856
彼はオブシェクト指向とごっちゃになっているのだろう。
0859NAME IS NULL
垢版 |
2017/10/31(火) 16:53:50.50ID:???
価格というテーブルがあって

商品:外部参照(商品マスタの主キーを参照)
適用開始:日付型
適用終了:日付型
区分:0:標準 1:販売
通貨記号:USD/JPY・・・
単価:通貨型

という感じに定義されていて
標準価格や販売価格が実はテーブルじゃなくて、
価格テーブルを元にしたビューだった

という風なら理解できるぞい
0860NAME IS NULL
垢版 |
2017/10/31(火) 19:43:13.45ID:mnuaDWX/
>>859
価格というテーブルには、
標準価格か販売価格のどちらかしか
入らなくなりませんか?
0861NAME IS NULL
垢版 |
2017/10/31(火) 21:27:26.45ID:???
user_id派は昔ながらのリレーショナルモデル、id派はERモデルの発想だろう。
そのへん区別できてない人も多いけどな。
0862NAME IS NULL
垢版 |
2017/10/31(火) 21:34:56.59ID:???
>>849-850
爺は早めにくたばれよ w

>>856
テーブル名書かないの?
単一テーブルしか扱わない時はいいけど複数テーブル使ってる時にテーブル名を書かないとかその方がどうかしてると思うけど

>>858
はあ?
ひょっとして
ドットで繋いでる⇒オブジェクト指向
とでも思ってるのかよ w
全然関係ないだろ
0863NAME IS NULL
垢版 |
2017/10/31(火) 21:55:51.92ID:???
>>859
そのケースで標準価格と販売価格を一つのテーブルで管理するメリットって何?
0864NAME IS NULL
垢版 |
2017/10/31(火) 23:26:42.95ID:???
>>861
リレーショナルモデルとERモデルの違いについて、簡単にで良いので説明してくれ
0865NAME IS NULL
垢版 |
2017/10/31(火) 23:35:15.40ID:???
>>862
>複数テーブル使ってる時にテーブル名を書かないとかその方がどうかしてる
複数テーブル使うときにテーブル名で「修飾」しないで済むようにしましょう、ってのが根本にあるわけで
そのためにjoinにusingとかあるんだが

まあなかなか現実的にはそうすると項目名がやたら冗長になったりするから適当なとこで妥協するんだけどね
個人的な感覚では
標準単価なんかは妥協する必要のない範疇
更新日時なんかは妥協して問題のない範疇
IDなんかが議論の分かれるとこなんでよく話題にされる

まあ、宗教論だよ
0866NAME IS NULL
垢版 |
2017/11/01(水) 00:15:01.89ID:???
>>865
>標準単価なんかは妥協する必要のない範疇
>更新日時なんかは妥協して問題のない範疇

この線引を明文化して規約にしないと
同じデータベース内でブレた命名基準が使われて
一番使いにくい物ができあがる
0867NAME IS NULL
垢版 |
2017/11/01(水) 00:34:36.48ID:???
更新日時は文字通り誰が解釈しても一意になりそう
標準単価は、何を指すのかな?
商品なら、定価だったり、希望小売価格だったり
賃金なら、時間給か日給か月給?
その現場毎に決めるんだろうな
0868NAME IS NULL
垢版 |
2017/11/01(水) 00:50:55.07ID:???
>>852に書いてるようなデータベース上のレコード最終更新日時と
ドメインで意味がある更新日時(サイト更新日時とかスレ更新日時とか)だと解釈違ってくるよね

システム的な事情で「スレ」テーブルのデータを更新した場合でも
ユーザーが目にするスレ更新日時は更新されない事も有り得る
0869NAME IS NULL
垢版 |
2017/11/01(水) 08:01:28.84ID:???
>>864
先に属性があって、それらの間に何らかの関係が存在するときにそれをリレーション(テーブル)として
表現するのがリレーショナルモデル。属性はテーブル固有ではないのでそれ自身識別できる名前に
することが多い。
問題領域からエンティティを抽出してそれに含まれる属性を記述するのがERモデル。基本的に
属性はそのエンティティ固有のものだから他のエンティティと属性の名前が重複しても気にしない。
ただしERモデルをRDBに落とし込む際は他エンティティとの関係を表す参照フィールドが必要になる
場合があるが、これはそのエンティティに属するものとは言えないため必ずしも一貫性はない。
0870NAME IS NULL
垢版 |
2017/11/01(水) 11:14:37.77ID:???
c1,c2,...,c10と言う10個のカラムがあって、その中のどこかにkeywordが有るか判定するなら
c1 like %keyword% or c2 like ...
みたいに10個並べればいいですよね。
ではkeyword1とkeyword2が有るかどうか判定するなら同じくずらずらと条件を並べるしか無いですか?
もっとスマートに簡潔に書く方法は有りますか?
0871NAME IS NULL
垢版 |
2017/11/01(水) 11:35:10.09ID:/cVJI5F/
>>870
連結してしまう
0872NAME IS NULL
垢版 |
2017/11/01(水) 11:41:59.82ID:???
>>871
なるほど。
実際の開発の現場でもそういう手法を使うんですか?
ずらずら並べる方法と連結する方法とでは、どっちが検索が速いでしょうか?
0874NAME IS NULL
垢版 |
2017/11/01(水) 17:01:39.42ID:???
>>870
クエリの見た目のキレイさだけならJOINの条件でLIKEを使う方法もある
パフォーマンスは一般的に良くない

外部結合使った例
SELECT *
FROM target t
LEFT JOIN keyword k1 ON t.c1 LIKE k1.col
LEFT JOIN keyword k2 ON t.c2 LIKE k2.col
LEFT JOIN keyword k3 ON t.c2 LIKE k3.col
WHERE k1.col IS NOT NULL
OR k2.col IS NOT NULL
OR k3.col IS NOT NULL ;

内部結合使う場合は結合条件をORでつないでカラムを並べるかUNIONするか
0875NAME IS NULL
垢版 |
2017/11/01(水) 20:23:03.03ID:33PRYza3
>>870
そんなSQLが必要なテーブルがおそろしいわ。
0876NAME IS NULL
垢版 |
2017/11/01(水) 20:41:04.71ID:???
c1...c10が等価で交換可能なのだとしたらそもそも第1正規形じゃないから実際の開発の現場で見かけるのは稀。
等価じゃないのに「その中のどこか」なんて問い合わせするのも稀。
「実際の開発の現場」じゃまず現れないレアケースなんで「スマートに」なんて期待するな。
0877NAME IS NULL
垢版 |
2017/11/01(水) 21:12:22.61ID:Rn9wp9k8
>>875,876
正しい設計のデータベースにも普通にありふれたテーブルですよ
経験不足なんですねあなた達
0878NAME IS NULL
垢版 |
2017/11/01(水) 21:19:00.00ID:???
君のスルー力が試される
0879NAME IS NULL
垢版 |
2017/11/01(水) 21:19:46.82ID:???
自分が面倒見ているサイトで
ユーザーにアイテム検索させる時に
このようなSQL書いてるな
0880NAME IS NULL
垢版 |
2017/11/01(水) 21:29:21.89ID:???
結局それは全文検索系ってことだよね
0881NAME IS NULL
垢版 |
2017/11/01(水) 21:51:43.96ID:33PRYza3
そんな面倒なのを非手続き型SQLでやろうとする発想がすごい。
0882NAME IS NULL
垢版 |
2017/11/01(水) 21:52:04.29ID:???
>>876
バカ設計はどこにでもある。稀じゃない。
0883NAME IS NULL
垢版 |
2017/11/02(木) 08:11:45.62ID:???
>>876
例えば社員情報を氏名、役職、所属、電話番号、社員番号の一部で検索するとか普通にあるけど?
0884NAME IS NULL
垢版 |
2017/11/02(木) 09:50:05.16ID:???
>>874
すみません、このコードを試してみたのですが外部結合など
初めてやるので実行するとエラーしました(SQL ServerとMySQL)。
このサンプルコードは、完全なSQL文ですか?
それとも概略を示したものですか?
0885NAME IS NULL
垢版 |
2017/11/02(木) 10:41:39.48ID:t1XvRAES
>>884
SQLがいいか悪いかを無視しても少なくともLIKEの前にANDがない。
0887NAME IS NULL
垢版 |
2017/11/02(木) 12:38:26.10ID:SmP+Tevx
シンタックスすら覚束ないのに善し悪しを語りたがるバカw
0888NAME IS NULL
垢版 |
2017/11/02(木) 15:24:23.12ID:t1XvRAES
ああ、間違ってるな。

ただあのSQLのkeywordとはなんだろうな。
0889NAME IS NULL
垢版 |
2017/11/02(木) 16:17:17.63ID:???
>>884
何をもって完全とするかは君にしかわからないけど
SQL ServerでもMySQLでも問題なく動くよ

外部結合もやったことなくて何のエラーが出たかも分からないようなら
自分の今のレベルを素直に受け入れてLIKEでベタ書きするのがスマートだと思うよ
0890NAME IS NULL
垢版 |
2017/11/02(木) 17:18:04.94ID:???
>>874
ウンコード・マニアがSQLに対応していたらかなりいい点が貰えそう
0891NAME IS NULL
垢版 |
2017/11/02(木) 21:03:08.49ID:4yCYhJnd
なんだかよくわからないけどとりあえず煽ってみるウンコバカw
0892NAME IS NULL
垢版 |
2017/11/02(木) 21:47:39.63ID:441xfH76
このスレは想像、想定で回答する人間が多くて驚く。エスパーなのか?
0894NAME IS NULL
垢版 |
2017/11/02(木) 22:43:38.19ID:441xfH76
案外おっさんがいるんだな。

エスパー魔美を連想するとは。
0895NAME IS NULL
垢版 |
2017/11/02(木) 23:24:16.53ID:???
mongoDBってSQLよりも簡単ですか?
0896NAME IS NULL
垢版 |
2017/11/03(金) 00:00:10.06ID:???
>>895
クエリ書くのはSQLのほうが簡単
MongoDBでクエリ書くのもそんな難しいわけじゃないけど
JavaScriptやmap/reduceの基本理解は必須
0897NAME IS NULL
垢版 |
2017/11/03(金) 00:58:43.23ID:7zJOPvVT
つまり簡単じゃんw
0898NAME IS NULL
垢版 |
2017/11/03(金) 02:53:53.20ID:???
簡単か難しいかは比較対象によるからね
SQLと比較すれば難しいし手間もかかる
SQLは全くの素人でも3日程度の研修受ければ
自分が欲しい結果を取得できるレベルにはすぐなれるが
JavaScriptだとそうはいかない
0900NAME IS NULL
垢版 |
2017/11/03(金) 06:42:27.20ID:PR2/yxNu
スレ違い
0901NAME IS NULL
垢版 |
2017/11/03(金) 22:30:44.12ID:7zJOPvVT
つまり簡単じゃんw
0902NAME IS NULL
垢版 |
2017/11/03(金) 23:23:00.70ID:???
>>898
3日でSQLマスターするってスゲえな
どうやるんですか?
0903NAME IS NULL
垢版 |
2017/11/04(土) 00:50:07.98ID:???
>>902
マスターは言い過ぎ
文法を理解して自分が欲しい結果を取得するためのクエリが書けるようになるレベルな
ちゃんとした会社の研修コースを受ければいい

本で言えばスッキリのレベルなら2日コース
ゼロからはじめるのレベルなら3日コースが標準
0904NAME IS NULL
垢版 |
2017/11/04(土) 13:20:37.18ID:isarshv7
なぜsqlもmongodbも初心者レベルなのに答えようとするのか
0905NAME IS NULL
垢版 |
2017/11/05(日) 16:51:50.70ID:???
select ...
where カラム名 like '%'
みたいなwhere条件を追加した場合、このwhere条件が無い場合に比べて
検索時間が遅くなったりしますか?
0906NAME IS NULL
垢版 |
2017/11/05(日) 17:16:14.88ID:???
そりゃDBMSのオプティマイザの賢さ次第だな。試してみればいい。
0907NAME IS NULL
垢版 |
2017/11/05(日) 17:19:00.83ID:???
>>905
やってみなはれ。
やらなわからしまへんで。

鳥井信治郎
0908NAME IS NULL
垢版 |
2017/11/05(日) 18:19:41.67ID:???
で、遅くなったとして「じゃ条件つけるのやーめた」なんて出来るのか?
0909NAME IS NULL
垢版 |
2017/11/05(日) 19:19:45.88ID:???
クエリ組み立てる側で手間かければできないことないだろ。
もともと意味のない条件をつけるのがおかしいわけで。
0910NAME IS NULL
垢版 |
2017/11/05(日) 20:02:06.93ID:Fhmg/FV8
>>905
ただSQLだけで遅いの速いいうのはナンセンス。
0911NAME IS NULL
垢版 |
2017/11/05(日) 21:59:28.93ID:TKSEwyxb
どんなSQLだけだったら遅いの速いのいうのはナンセンスじゃないんだこれ?
0912NAME IS NULL
垢版 |
2017/11/06(月) 00:52:25.60ID:???
質問させてください

番号     住所
(number)  (address)
 1      東京
 2      大阪
 3      東京

住所でGROUP BYして番号順に並べたい
さらに住所の合計を取得したい

SELECT *,SUM(address) FROM table_addr GROUP BY address ORDER BY number DESC;
これだと番号順に並びません。どうしたらいいでしょうか?よろしくお願いします。
0913NAME IS NULL
垢版 |
2017/11/06(月) 01:23:28.40ID:???
番号順って、小さい順にしたいの?それとも大きい順?
0914912
垢版 |
2017/11/06(月) 01:33:13.19ID:???
>>913
レスありがとうございます
一応DESCですがASCでも構いません
0915NAME IS NULL
垢版 |
2017/11/06(月) 02:38:07.35ID:???
>>914
SELECT MAX(number) AS number, address, COUNT(address) AS kensu
FROM table_addr GROUP BY address ORDER BY MAX(number) DESC;
0916912
垢版 |
2017/11/06(月) 10:18:12.51ID:???
>>915
ありがとうございました
0917NAME IS NULL
垢版 |
2017/11/06(月) 12:54:15.84ID:OvWu3ceL
自作自演なのか?

なんでsumがカウントの間違いだとわかるのか?
0918NAME IS NULL
垢版 |
2017/11/06(月) 12:59:52.06ID:???
まあ住所の合計って意味わからんからな
よく気づいたと思うけど
0919NAME IS NULL
垢版 |
2017/11/06(月) 13:17:23.44ID:???
GROUP BY とORDER BYって同時にできるの?
0920NAME IS NULL
垢版 |
2017/11/06(月) 13:28:19.94ID:OvWu3ceL
>>919
グループ化したものを並び替えることはできる。

並び替えたものをグループ化しても意味がない。
0921NAME IS NULL
垢版 |
2017/11/06(月) 14:14:19.44ID:???
>>920
へえー
じゃあグループ化してないカラムを並び替えすることは出来る?
0922NAME IS NULL
垢版 |
2017/11/06(月) 14:16:34.60ID:OvWu3ceL
暇人だなw
0923NAME IS NULL
垢版 |
2017/11/06(月) 21:49:11.63ID:m9a7sHg6
笑ってごまかすんじゃない最後まで答えろ
0924NAME IS NULL
垢版 |
2017/11/06(月) 22:13:08.96ID:nRwHbJxK
変なのがずっと居座っていたのか。
0925NAME IS NULL
垢版 |
2017/11/06(月) 22:36:12.91ID:fjeBNiC4
>>923
俺のスキルじゃ無理
0926NAME IS NULL
垢版 |
2017/11/06(月) 23:11:44.01ID:m9a7sHg6
>>925
いやお前なら出来るはずだ
0927NAME IS NULL
垢版 |
2017/11/12(日) 08:40:38.51ID:???
SQLってcasesensitivitieじゃないんですよね?コマンドを小文字で書いても良いですか?
いちいちcapslock雄の面倒
0928NAME IS NULL
垢版 |
2017/11/12(日) 08:58:26.16ID:???
SQLって英単語の羅列で構造がぱっと見わかりにくいから、昔は予約語だけ大文字にするとかあったけど、
最近はエディタでハイライト(色分け)できるのが普通だから全部小文字でも全然問題ないな。
0929NAME IS NULL
垢版 |
2017/11/12(日) 09:13:40.39ID:???
小文字でも普通にオッケーなんですか

sqlite のクエリを書くのにpythonのIDE使ってるんでsintax highlightは効かないので見にくいかもしれない
一長一短すね
0930NAME IS NULL
垢版 |
2017/11/12(日) 11:08:21.18ID:???
使ったことあるのは oracle, SQL-Server, PostgreSQL, sqlite3, MySQL だけだけど、全部小文字でも問題なかったな
0931NAME IS NULL
垢版 |
2017/11/12(日) 13:00:50.96ID:bx2ZtZM+
>>929
初心者?
0932NAME IS NULL
垢版 |
2017/11/12(日) 13:04:49.71ID:???
一行に詰め込もうとかしなければ小文字でも読めるやろ
0933NAME IS NULL
垢版 |
2017/11/12(日) 14:09:18.93ID:???
英文(って言うかアルファベット)の大文字の綴りなんて、まず読みにくいだろ?
0934NAME IS NULL
垢版 |
2017/11/12(日) 14:14:09.39ID:???
大昔はコンソールから大文字しか打てなかった時代があった
0935NAME IS NULL
垢版 |
2017/11/12(日) 15:15:24.45ID:???
コボラーは今でも大文字なんだっけ
0936NAME IS NULL
垢版 |
2017/11/12(日) 15:30:51.57ID:???
COBOLも小文字
というかcase insensitiveやで
0937NAME IS NULL
垢版 |
2017/11/12(日) 15:32:09.97ID:???
COBOLは今は大文字小文字混じりだよ
FORTRANもね

SQLは特定の場所以外大文字小文字関係ない
内部では処理系によって大文字か小文字に変換して処理する
0938NAME IS NULL
垢版 |
2017/11/13(月) 20:56:12.44ID:YzugWzEj
板違いかもしれませんが、hirdb詳しい方いませんか?いたらhirdbのストアドが使い易いか教えて下さい。使ってるのみたことなくて…
0939NAME IS NULL
垢版 |
2017/11/13(月) 21:07:17.01ID:???
うっわかわいそうに
0940NAME IS NULL
垢版 |
2017/11/13(月) 21:08:07.96ID:Vp0kKm4r
>>938
ネットに公表されているマニュアルを見たのか?
ストアドは標準SQLだから標準SQLとかけ離れていることはない。
0941NAME IS NULL
垢版 |
2017/11/13(月) 21:23:35.97ID:vPFZRtjc
>>940
みました。標準的にみえるけど、あまり使われてないDBMSだから落とし穴がないかこわくて。そもそも自分がそんなにストアド使ったことないから判断しかねるのもあります。
それと、過去ログにはトリガー設定して自動で動くようにはできない??との記述もあって…
0942NAME IS NULL
垢版 |
2017/11/15(水) 03:09:42.05ID:0j2E8Ny1
sForm
レス数が900を超えています。1000を超えると表示できなくなるよ。

ニューススポーツなんでも実況