X



トップページDB@2ch掲示板
1002コメント319KB
SQL質疑応答スレ 18問目
■ このスレッドは過去ログ倉庫に格納されています
0001NAME IS NULL
垢版 |
2018/01/04(木) 22:12:22.14ID:???
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

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

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

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

前スレ:
SQL質疑応答スレ 17問目
https://mevius.5ch.net/test/read.cgi/db/1468157341/
0545NAME IS NULL
垢版 |
2018/09/16(日) 08:31:26.77ID:???
お前みたいな日本語怪しいやつをあぶり出すため
0546NAME IS NULL
垢版 |
2018/09/18(火) 15:27:23.99ID:dZAMkAe5
固有名詞を改変したら駄目だろう
0547NAME IS NULL
垢版 |
2018/09/18(火) 23:19:39.80ID:EwCoq+cp
ええやろw
0548NAME IS NULL
垢版 |
2018/09/19(水) 01:25:54.61ID:???
商標権を侵害してるな
0549NAME IS NULL
垢版 |
2018/09/19(水) 11:22:26.10ID:SAO4z521
半角スペース恐怖症なんだろうな。
0550NAME IS NULL
垢版 |
2018/09/19(水) 19:30:55.56ID:???
誰でも間違いはある
気にするな
0551NAME IS NULL
垢版 |
2018/09/19(水) 21:03:38.93ID:f2yuv0SC
製品名を正しく書けないやつはたいてい危険人物。だいたいよくわかっていない。
0552NAME IS NULL
垢版 |
2018/09/19(水) 23:26:57.94ID:UE0WOPkY
なんやこの病的すぎるバカw
0553NAME IS NULL
垢版 |
2018/09/20(木) 08:02:36.86ID:???
内容に突っ込めないから製品名に突っ込むしかないんだろ
どうでもええわ
0554NAME IS NULL
垢版 |
2018/09/21(金) 14:45:01.05ID:wlRN+aGs
お客相手に間違えなくて良かったじゃないか
0555NAME IS NULL
垢版 |
2018/09/21(金) 15:39:47.79ID:???
ところで、IDが出てたり出てなかったりするのは何故?
0556NAME IS NULL
垢版 |
2018/09/21(金) 21:51:00.56ID:???
>>554
そんなもんを気にしてるお客なんてお前の脳内にしかいないけどなww
0557NAME IS NULL
垢版 |
2018/09/21(金) 21:52:53.93ID:???
>>555
sageかどうかでしょ
そもそもsageてない奴のレスは見る価値ないし
0558NAME IS NULL
垢版 |
2018/09/21(金) 22:45:10.80ID:LJZuek3J
責任をとりたくない奴は、IDを隠すってこと
0560NAME IS NULL
垢版 |
2018/09/21(金) 23:43:14.92ID:J7Fz2JlS
図星に脊髄反射しとる奴、おる?
0562NAME IS NULL
垢版 |
2018/09/22(土) 13:24:41.08ID:/G0Wh7Kz
>>557
いまどき上げ下げかw
0563NAME IS NULL
垢版 |
2018/09/22(土) 19:23:47.16ID:???
sageるのって荒らしに見つからんようにとかそんな理由だったっけ?
今だと勢い順か新しい順、あるいはスレ検索して見るからもう完全に意味ないよな、わざわざ荒らすやつも激減してるし
ましてこんな過疎版じゃ気にするだけ無駄
0564NAME IS NULL
垢版 |
2018/09/22(土) 20:12:24.86ID:???
質問スレだと、質問者は必ずageてって板もある
ID出た方が成りすましを防げるからやり取りで
混乱しなくて良いと言う側面もある
0565NAME IS NULL
垢版 |
2018/09/23(日) 10:30:22.73ID:???
質問スレはそんなルールあったね
sageるとID出ないのはDB板の仕様か
技術的な話をするんだから一律IDつけたほうが勝手がいいと思うけどなあ
専ブラがデフォルトsageになってていちいち削除すんのもめんどいし
0566NAME IS NULL
垢版 |
2018/09/29(土) 20:35:17.15ID:W8T9QA3v
質問するのでIDありで・・・
リレーショナルデータベース=JOINで複数のテーブルをまたいでクエリを投げられる

という意味?
0567NAME IS NULL
垢版 |
2018/09/29(土) 20:51:07.76ID:???
リレーションってのは要はテーブルだ。
リレーションでできているデータベースだからリレーショナルデータベース。
0568NAME IS NULL
垢版 |
2018/09/29(土) 21:24:57.55ID:W8T9QA3v
レスありがとう。
リレーショナルではないデータベースというのは、テーブルでは無いデータベースが想像つかないな・・・。
二次元的なものではなく、テキストに羅列されているだけという感じだろうか。
昔pc-98で桐ver2とか名前だけは知っていたけど、あの頃はすでにテーブルという概念があったのかしら?
0569NAME IS NULL
垢版 |
2018/09/29(土) 21:34:54.80ID:9EBEb433
すごい会話だなw
0570NAME IS NULL
垢版 |
2018/09/29(土) 21:36:14.75ID:9EBEb433
>>568
自作自演?
0571NAME IS NULL
垢版 |
2018/09/29(土) 21:38:54.14ID:???
>>568
桐もDBASEもリレーショナルデータベースだな
テーブルであるならそうかといえば、ちょっと違う

複数のテーブルを関係性で紐付けが出来るなら
リレーショナルデータベースと呼んで良いと思う

Excelの表はテーブルだけど誰もそうは呼ばないしな
0572NAME IS NULL
垢版 |
2018/09/29(土) 22:03:17.34ID:???
情報処理試験とかデータベースの勉強をすれば初めの方で説明されているはずだけど、
リレーショナルの前には階層型やネットワーク型といったデータベースの形式があった。

ついでに言えば、リレーショナルデータベースには「複数のテーブル」などという要件はない。
複数のテーブルはその直積である1テーブルと等価なんで。
0573NAME IS NULL
垢版 |
2018/09/29(土) 23:12:42.69ID:9EBEb433
なんか変な素人が出てきたなw
0574NAME IS NULL
垢版 |
2018/09/29(土) 23:27:01.69ID:???
普通はRDBMSと言えばリレーショナルデータモデルを表現できるだけでなく
ACID特性を備えるのが必要条件とされる
最近流行りのNoSQLなんかはリレーショナルデータモデルを表現するものではない上に
ACID特性のいずれかを満たさないのが普通だったりする
0575NAME IS NULL
垢版 |
2018/09/29(土) 23:29:52.65ID:9EBEb433
NoSQLが最近ものだと?

タイムマシンで過去から来た人間の書き込み?
0576574
垢版 |
2018/09/30(日) 00:54:24.60ID:???
しまった
自ら正解を出すことはできず文句しか言わない人に絡まれてしまった
0578NAME IS NULL
垢版 |
2018/09/30(日) 09:28:56.36ID:???
おまえらが知る前から俺は使ってるんだ( ・`ー・´) +
0579NAME IS NULL
垢版 |
2018/09/30(日) 14:41:59.34ID:???
>>574
RDBとDBMSの区別がつかないなら、ややこしくなるだけだから黙っとけな
0580NAME IS NULL
垢版 |
2018/09/30(日) 22:46:54.70ID:???
プライマリキーをフォーリンキーにすることはできますか?
0581NAME IS NULL
垢版 |
2018/10/01(月) 00:24:20.26ID:???
できるが変な設計だなとは思う
0582NAME IS NULL
垢版 |
2018/10/01(月) 12:38:28.99ID:???
>>581
時系列データのテーブルが2つあって
時間をフォーリンキーにしたいんですけどおかしいですか?
0583NAME IS NULL
垢版 |
2018/10/01(月) 12:51:24.62ID:Q6K7qC3N
>>580
単に1対1のテーブルだからおかしくはない。
0584NAME IS NULL
垢版 |
2018/10/10(水) 11:28:56.03ID:???
インデックスが使われるSQL文の書き方というのは、例えば出庫データに
商品コード順+出荷日順+伝票番号順というインデックスを作っておいて
SELECT * FROM 出庫データ WHERE 商品コード='A01' ORDER BY 商品コード, 出荷日, 伝票番号
みたいにするとレスポンスが速くなるということでしょうか?
0585NAME IS NULL
垢版 |
2018/10/10(水) 21:59:19.97ID:G1VCUlYl
>>584
プラス記号の意味がよくわからんが
CREATE INDEX(商品コード,出荷日,伝票番号)
という複合主キーを作成すると
例示のSQLは速くなるだろうが
ただしインデックスの順序と異なる
ORDER BY 出荷日,商品コード
などと場合は効かない
0587NAME IS NULL
垢版 |
2018/10/11(木) 23:22:18.86ID:LDSiJwGe
>>584
忠告しておくが、インデックスが使われるSQLを書くのではなくて、問い合わせの内容とインデックスが必要かどうかを考えてSQLを書く。

SQLがこうだから、このSQLはこのインデックスが使われるとSQLだけでは言いきれない。
0588NAME IS NULL
垢版 |
2018/10/11(木) 23:32:44.06ID:ppvirY+z
>>586
複合主キーじゃないわ複合インデックスね

>>587の言うように
実際に効くかどうかは実行計画で決まるので
インデックスを使ったかどうかは
実際の実行計画を取得しないとわからない
オプティマイザが意図したインデックスを使ってくれない場合
ヒントで特定インデックス使用を強制することもDBMSによっては可能
0591NAME IS NULL
垢版 |
2018/10/14(日) 20:22:51.35ID:???
 私たち日本人の、日本国憲法を改正しましょう。
『憲法改正國民投票法』、でググってみてください。
(へいわ)は、勝ち取るものです。拡散も含め、お願い致します。
0592NAME IS NULL
垢版 |
2018/11/01(木) 06:26:01.46ID:imTVWlJr
質問です。
以下のようなテーブルがあったとします。
id|name
------
0|aaa
1|bbb
2|ccc

aaa,bbb,ddd,eeeを呼び出し側から与えて、nameにない項目(dddとeee)を取得したいです。
こういう場合どのように書けばよいでしょうか。
擬似的にaaa,bbb,ddd,eeeの項目をテーブルのように扱えればできそうですが、やり方がわかりません。
SQLiteを使っていますが、汎用的な書き方でできればしたいです。
よろしくおねがいします。
0594NAME IS NULL
垢版 |
2018/11/01(木) 11:56:15.87ID:???
汎用的には、テーブルを作ってしまうのが良いと思う
0595NAME IS NULL
垢版 |
2018/11/01(木) 12:45:48.88ID:pgw6fBBH
SELECT
a.empno<br />
,a.ename
,a.job
,b.ename AS 'mname'
FROM
emp a
,emp b
WHERE
a.mgr = b.empno;
このようなSQLを書いたのですが、SELECTのAS句が機能しません。どうすれば機能しますか?
0596NAME IS NULL
垢版 |
2018/11/01(木) 13:00:22.93ID:???
'mname' の囲みいらない
0597NAME IS NULL
垢版 |
2018/11/01(木) 14:17:52.92ID:imTVWlJr
意見ありがとうございました。
汎用的なのは諦めて、SQLiteでは以下で疑似的なテーブルができるようなので、これをもとにSQLを考えていこうと思います。
WITH t(name) AS (SELECT * FROM (VALUES ("aaa"), ("bbb"), ("ddd"))) SELECT * FROM "t";
0598NAME IS NULL
垢版 |
2018/11/01(木) 19:59:14.73ID:vMwdzdp/
>>595
行頭に,を書く悪習はいいかげんヤメロ
0599NAME IS NULL
垢版 |
2018/11/01(木) 21:02:02.93ID:???
行頭に,を書くとどういう問題があるんだ?
0600NAME IS NULL
垢版 |
2018/11/01(木) 21:32:48.31ID:vMwdzdp/
>>599
ヴィジュアル的に認識しにくい
0601NAME IS NULL
垢版 |
2018/11/01(木) 21:50:22.90ID:???
まさかそれだけ?
0602NAME IS NULL
垢版 |
2018/11/02(金) 09:06:50.55ID:???
>>599
見た目にブサイク
(個人の感想です)
0603NAME IS NULL
垢版 |
2018/11/02(金) 09:48:07.02ID:???
膨大なカラム数があって、スクリプトで処理しているときには都合が良いかもしれないが、
手作業で編集する分にはどっちでもいい気がする
0604NAME IS NULL
垢版 |
2018/11/02(金) 12:32:46.28ID:c/Fx/3hC
コードは読むもんだと教わらんかったんかおまえら?
ヴィジュアル問題の大切さがいまいちわかっとらんな
0605NAME IS NULL
垢版 |
2018/11/02(金) 13:13:36.22ID:DS+sU5kd
前カンマの方が打ち忘れが減るので
自分はこちらのヴィジュアルが合っているらしい
0606NAME IS NULL
垢版 |
2018/11/02(金) 19:10:39.71ID:ckbyV4Q5
それヴィジュアルちゃうやんw
0607NAME IS NULL
垢版 |
2018/11/02(金) 19:39:46.15ID:???
前にカンマの方がコメントアウトする時に楽
0608NAME IS NULL
垢版 |
2018/11/02(金) 22:38:08.71ID:ckbyV4Q5
だからヴィジュアルちゃうやんそれ
しかもどっちゃでも変わらんしw
0609NAME IS NULL
垢版 |
2018/11/02(金) 22:53:44.45ID:???
カンマの忘れとか、余分なカンマとか、割とよくやるw
0610NAME IS NULL
垢版 |
2018/11/03(土) 03:58:33.81ID:Pv5mB3Rz
最近JSONとか末尾カンマ無視するのあるよね
あれ導入されれば後ろでもいいんだけどな
前の方が行カット&ペーストで入れ替えやすい
0611NAME IS NULL
垢版 |
2018/11/03(土) 09:51:12.69ID:JBJEgXB4
前カンマの方が綺麗だと思うけどなあ
カンマと列名の間にタブなりスペースなり入れてカンマの位置を揃えるの
テキストエディタで矩形選択を使ってごりごり編集するのに便利なのだ
0612NAME IS NULL
垢版 |
2018/11/03(土) 10:58:19.38ID:???
人の好きずきの問題をここで語られても
0614NAME IS NULL
垢版 |
2018/11/04(日) 12:09:42.60ID:???
書式整形ソフト使って好きな形で読め。
--のコメントさえなければSQLは改行なし
で書けるんだから読むやつが好きに整形しろ。
ここで個人の好みの書式の話しされると
うざい!!
0615NAME IS NULL
垢版 |
2018/11/04(日) 12:23:08.21ID:???
ちょっと難しい問題を出してみて
そうしたら、多分静かになるから
0616NAME IS NULL
垢版 |
2018/11/11(日) 17:44:06.06ID:DVzqXgBV
そもそもカンマがいらなかったんだよな。

英文っぽくしたためにカンマ区切りにしてしまった。

列名の区切りは半角スペースか改行でよかった。
0617NAME IS NULL
垢版 |
2018/11/23(金) 19:38:48.29ID:NImj8hV3
質問させてください。
使っているのはSQLite(Python)です。

あるテーブルに、たとえば性別、血液型、職業というカラムがあって、
それぞれ、男、A、会社員、などと、データが入っているとします。
これら3つのカラムの中身について、テーブル内にある組み合わせの
パターンをすべて抽出したいのですが、sqlでどのように書けば効率がよいでしょうか?

抽出後、(男、A、会社員)は何名、(女、A、会社員)は何名、、、と
集計することが目的です。テーブルにより起こる組み合わせが様々なので、
都度調べる必要があります。

単純にFor文で1行ずつ調べて、過去にない組み合わせであれば外部のリストに
追加する形だと、非効率な気がしています。
良い方法があればお教えください。
0619NAME IS NULL
垢版 |
2018/11/23(金) 20:05:35.29ID:???
>>617
こうじゃないか

select `性別`,`血液型`,`職業`, count(*) as `人数`
from `テーブル`
group by`性別`,`血液型`,`職業`;
0620NAME IS NULL
垢版 |
2018/11/24(土) 03:57:01.05ID:???
効率悪いし、何名か?が取れないと思う
0622617
垢版 |
2018/11/24(土) 12:35:17.12ID:???
>>619

ありがとうございます。
助かりました。
0623NAME IS NULL
垢版 |
2018/11/24(土) 16:31:58.75ID:Pyo9iAE3
再び質問です。
教えてもらった

select `性別`,`血液型`,`職業`, count(*) as `人数`
from `テーブル`
group by`性別`,`血液型`,`職業`;

で得られる'人数’を同じテーブル内の別カラムに保存したいと思い、
カラムは事前に作成しておいて、

update 'テーブル' set '人数のカラム' =
(select `性別`,`血液型`,`職業`, count(*) as `人数`
from `テーブル`
group by`性別`,`血液型`,`職業`)

としてみたのですが、group byの最後のグループのcountの結果が
全部の行に上書きされてしまいます。

各行毎に所属するグループの人数を記録するにはどう書けばよいでしょうか。

(目的は、その人(各行)の所属するグループの人数を個別に保存することです。)

よろしくお願いします
0624NAME IS NULL
垢版 |
2018/11/24(土) 17:14:07.61ID:???
>>623
> 各行毎に所属するグループの人数を記録するにはどう書けばよいでしょうか。
> (目的は、その人(各行)の所属するグループの人数を個別に保存することです。)
そんな設計やめなよ…
レコードに追加/削除/更新する度にその人数も更新しないとだめだし
毎回求めてもよほどでかい表でない限りは問題にならないだろ
0625NAME IS NULL
垢版 |
2018/11/24(土) 17:28:12.86ID:???
>>623
使用意図はわからんが、どうしても一時的にテーブルに保存したきゃUPDATEじゃなくて、DELETE→INSERTでよくね?
オイラならテーブル変数使うけど
0626NAME IS NULL
垢版 |
2018/11/24(土) 17:32:36.45ID:???
>>624

コメントありがとうございます。
実はモデルをすり替えて質問していまして、
データを書き換えての繰り返し計算に使いたいのです。

その後、order by でなく、select以下のテーブルをtable as Tなどとしてwhere句で’テーブル’とTの要素が等しい時に限定したら一応できました

何故かブロックされたのでスマホから
0627NAME IS NULL
垢版 |
2018/11/24(土) 17:49:44.47ID:Pyo9iAE3
>>625
使用意図は、エクセルの表計算のように、
左のカラムにデータがあって、それを元に
右の方のカラムに途中計算を書いていって、
最後に得られた結果の誤差が減るように
また最初の方から計算を繰り返すような感じです。

1巡の計算が大きすぎて記録を残したいのですが、ご指摘の通り、記録が不要なところはテーブル変数がよさそうです
勉強してみます
0628NAME IS NULL
垢版 |
2018/11/24(土) 17:50:56.49ID:???
オレ多分頭悪いんだろう
>>626 で何を言っているのかよく分からない

愚直に>>623の要求通りのものを書くとすれば
`テーブル`に`人数`カラムを追加したとして
update `テーブル` t1 set
`人数` = (
select `人数` from (
select `性別`,`血液型`,`職業`, count(*) as `人数` from `テーブル`
group by`性別`,`血液型`,`職業`
) t2
where
t1.`性別` = t2.`性別` and
t1.`血液型`= t2.`血液型` and
t1.`職業` = t2.`職業`
);

でも、こんなこと実際にはしないし、
もっと良い方法が必ずあるはずだし
見直した方がいい
0629NAME IS NULL
垢版 |
2018/11/24(土) 18:02:53.98ID:Pyo9iAE3
>>628

626が意味不明で申し訳ないです。
書かれておられるように自分もwhereで
比較しました。

計算は各行に対してするのですが、
それが所属するグループの平均等の計算値も
途中計算で何度もつかうのです
それで、各行にそれを入れておきたいのです

なんだか変な事をやってるみたいで恐れ入ります
0630NAME IS NULL
垢版 |
2018/11/24(土) 18:07:07.78ID:???
結局何をしたいのかさっぱり理解できないけどわざわざ違うモデルで答えさせるとか失礼な事するやつだからスルーしとくわ
0631NAME IS NULL
垢版 |
2018/11/24(土) 18:18:02.74ID:???
質問をシンプルにしたくてモデルを
変えましたが、失礼と思われたようで
済みません
0632NAME IS NULL
垢版 |
2018/11/24(土) 18:26:04.19ID:???
わざわざスルーするって宣言してる奴なんだからスルーでいいよ
0633NAME IS NULL
垢版 |
2018/11/24(土) 21:20:38.92ID:???
合計値も平均値も割と簡単に計算出来ますし
それをテーブルに入れた方が良いのか
それともDBを見ているミドルの方で計算させた方が良いのか
全体の仕組みと性能で総合的に考えた方が良いかもしれません
0635NAME IS NULL
垢版 |
2018/11/26(月) 21:45:52.63ID:???
mysql,mariadbでmyisamが非推奨になったのはなぜですか?
innodbではbeginやcommitが使えるそうですが、メモ的なデータをinsertするぐらいなのですが、
それでもinnodbを使った方がいいのでしょうか?
0636NAME IS NULL
垢版 |
2018/11/26(月) 22:42:16.59ID:???
そういうのは各RDBのスレがあるんだから、そこで聞けよ
0638NAME IS NULL
垢版 |
2018/11/27(火) 03:05:52.60ID:???
専用スレがあったのですね、誘導ありがとうございます。
0640NAME IS NULL
垢版 |
2018/11/29(木) 10:10:36.91ID:???
以下のようなデータがあった場合、
name date rate
AAA 11/1 2000
BBB 11/1 900
CCC 11/1 500
DDD 11/1 700
AAA 11/2 2000
BBB 11/2 1200
CCC 11/2 500
DDD 11/2 700
AAA 11/3 2000
BBB 11/3 500
CCC 11/3 1500
DDD 11/3 700

最新のrateが1000未満だけを抽出するにはどうすればよいでしょうか?
DDD 11/3 700
BBB 11/3 500
0641NAME IS NULL
垢版 |
2018/11/29(木) 11:07:44.82ID:???
>>640 こうかな?
select name, MIN(date), rate
from hoge
where rate < 1000
group by name, date, rate
0642641
垢版 |
2018/11/29(木) 11:26:02.69ID:???
違った、こうか?
select a.name, a.date, a.rate
from hoge as a,
(select name, MAX(date) from hoge where rate < 1000 group by name, date) as b
where a.name = b.name and a.date=b.date;
0643NAME IS NULL
垢版 |
2018/11/29(木) 13:04:58.18ID:???
SELECT * FROM a WHERE (name,date) IN (SELECT name,MAX(date) FROM a GROUP BY name) AND rate<1000
0644NAME IS NULL
垢版 |
2018/11/29(木) 13:09:17.80ID:???
>>642
レスありがとうございます。
試したのですが、fromのselectでMAX(date)以外のも全て列挙されてしまいます。
DDD 2018/11/01 00:00:00
BBB 2018/11/01 00:00:00
CCC 2018/11/01 00:00:00
DDD 2018/11/02 00:00:00
CCC 2018/11/02 00:00:00
DDD 2018/11/03 00:00:00
BBB 2018/11/03 00:00:00
ちなみに使用DBはpostgresqlです。
0645NAME IS NULL
垢版 |
2018/11/29(木) 13:14:19.05ID:???
>>643
おお!できました!!
ありがとうございます!
整理して理解します。
■ このスレッドは過去ログ倉庫に格納されています

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