■ このスレッドは過去ログ倉庫に格納されています
SQL初心者質問スレ
- 1 :NAME IS NULL:2016/05/12(木) 05:29:07.61 ID:HmbS4CfD.net
- SQL初心者用の質問スレッドです。
- 2 :NAME IS NULL:2016/05/14(土) 12:04:11.91 ID:???.net
- 2get
teradataの識者いる?
- 3 :NAME IS NULL:2016/05/26(木) 15:09:21.05 ID:???.net
- スレなかったっけ、、、と探したら無いな、、落ちたんかな
- 4 :NAME IS NULL:2016/06/18(土) 19:48:26.11 ID:wQWiAJ0q.net
- 外部の利用者が自由にテーブルを追加できるシステムを sqlite で検討しています。
テーブルが重複しないように利用者番号をテーブル名のプレフィックスにつけようと思います。
もしも、同じようなシーンでの一般的な方法などありましたら教えてください。
よろしくお願いします。
- 5 :NAME IS NULL:2016/06/18(土) 21:48:46.05 ID:???.net
- >>4
利用者ごとに
dbはどう?
- 6 :NAME IS NULL:2016/06/18(土) 22:19:58.66 ID:???.net
- >外部の利用者が自由にテーブルを追加できるシステム
が一般的な使い方とは思えないのに一般的な方法とか...
- 7 :NAME IS NULL:2016/06/19(日) 04:42:21.27 ID:???.net
- >dbはどう?
この意味がよくわかりません。すみません。
利用者ごとにというのは、少し誤りでした。
正確にはプラグインとして db を操作するモジュールを追加できる仕組みです。
そのモジュールから db に対して create table もできるようにしたいです。
そのときにテーブルの名前の重複を避けたいので、質問させていただきました。
- 8 :NAME IS NULL:2016/06/19(日) 09:41:12.88 ID:???.net
- sql というよりはそのモジュールの運用方法の話のようだな
- 9 :NAME IS NULL:2016/06/19(日) 10:24:19.80 ID:???.net
- 無謀な気が
ユーザーごとにDB分けちゃダメなん?
- 10 :NAME IS NULL:2016/06/19(日) 11:22:35.41 ID:???.net
- 1つのファイルのほうがユーザが使いやすいかと思っています。
もしかしたら sql という枠組みで話す質問ではないのかもしれません。
sql は初心者なので、動的テーブル名などを調べたのですが何か違う気がしました。
sql は歴史もあるし、自分の考えている程度のことはすでに枠組みができているのかと思い質問しました。
sql の枠組みですんなり当てはまるものがないとわかっただけで前進です。
ありがとうございました。
- 11 :NAME IS NULL:2016/06/19(日) 11:31:36.67 ID:???.net
- DBの世界でデータをストアすると言いますが、
では読み出す場合は何て言うのでしょうか?
- 12 :NAME IS NULL:2016/06/19(日) 11:35:49.20 ID:???.net
- >>9
1つのファイルにこだわりすぎていたかもしれません。
DB を分ける案を検討しようと思います。
ありがとうございました。
- 13 :NAME IS NULL:2016/06/19(日) 11:58:16.35 ID:???.net
- >>12
5にも礼を言っとけ。
全く同じこと先に言ってる
- 14 :NAME IS NULL:2016/06/19(日) 13:52:20.11 ID:???.net
- >>13
そういう意味だったんですね
>>5
ありがとうございました。
- 15 :NAME IS NULL:2016/06/21(火) 16:53:37.04 ID:???.net
- 一旦作ったテーブルを長期間使うのではなく、一日にテーブルのcreateやdropを何十回も繰り返すような使い方は特に問題有りませんか?
- 16 :NAME IS NULL:2016/06/21(火) 18:07:42.86 ID:???.net
- 要件次第
- 17 :NAME IS NULL:2016/06/21(火) 18:32:30.12 ID:???.net
- >>15
大丈ー夫
- 18 :NAME IS NULL:2016/07/09(土) 17:51:20.85 ID:uRuLwqJe.net
- 取得した順番に数値をインクリメントして表示したいのですが、どういった文法をすればいいですか?
シーケンスとかそういうことではなく、
select
user,num
from
user
みたいなsqlで
userA 1
userB 2
userC 3
のようにnumに取得した順番に数値をインクリメントしたいです。
- 19 :NAME IS NULL:2016/07/09(土) 17:59:50.73 ID:uRuLwqJe.net
- set @i:=0;
select @i:=@i+1 as rownum,user_id from user;
こういう書き方で自己解決しました。
- 20 :NAME IS NULL:2016/07/21(木) 20:04:08.07 ID:W6OLWaxQ.net
- 質問するときはRDBの名前くらいは書きましょう。
- 21 :NAME IS NULL:2016/08/07(日) 07:38:31.22 ID:???.net
- mysql 5.6.20 です
daily_tblからcode毎の最新入力日付を得るのに
select a.code,code_name ,max(input_date) as saishin
from daily_tbl a
inner join master b
on a.code = b.code
group by code
order by code;
で出せたんですが、
今度はその日付が指定の日付でないもののみを出そうとして
select a.code,code_name ,max(input_date) as saishin
from daily_tbl a
inner join master b
on a.code = b.code
where max(inout_date) != '2016-08-05'
group by code
order by code;
とすると、Invalid use of group function ってエラーで出来ません。コード毎の最新入力日付が指定の日付でないもののみを
出すようにするにはどうすればいいのでしょうか
- 22 :NAME IS NULL:2016/08/07(日) 10:36:30.57 ID:???.net
- inputなのかinputなのか気になるが、、、
having by 使うケースかなこれ?
- 23 :NAME IS NULL:2016/08/07(日) 10:37:21.81 ID:???.net
- おっとgroup by の文字省いた時にby残しちゃったhaving ね
- 24 :21:2016/08/07(日) 16:10:17.24 ID:???.net
- あぁinoutになってるw inputです
- 25 :21:2016/08/07(日) 16:17:17.84 ID:???.net
- select a.code,code_name ,max(input_date) as saishin
from daily_tbl a
inner join master b
on a.code = b.code
group by code
having max(input_date) != '2016-08-05'
order by code;
で出てきました。実際に使う時に全然havingなんて思いつきもしなかったです^^;
- 26 :NAME IS NULL:2016/08/07(日) 16:18:21.01 ID:???.net
- >>22
ありがとうございます
- 27 :NAME IS NULL:2016/08/07(日) 16:59:37.21 ID:mqpBG9Ui.net
- >>25
テーブル修飾があったり、なかったりしているところがちょっと気持ち悪い。
- 28 :25:2016/08/07(日) 18:45:08.20 ID:???.net
- この場合、codeについては付けないと ambiguous 曖昧と言って怒られてしまうんですが、全部にどちらのテーブルのものなのか
はっきりさせておけってことですか?
- 29 :NAME IS NULL:2016/08/07(日) 19:19:26.47 ID:???.net
- >>28
はい
- 30 :25:2016/08/07(日) 20:34:00.34 ID:???.net
- 努力します^^;
- 31 :NAME IS NULL:2016/08/07(日) 20:46:40.28 ID:mqpBG9Ui.net
- この例の場合、同じカラムがあるなら、FROM句の最初にあるテーブルのテーブル別名aで修飾するのが一般的。
他人がこのSQLだけを見たとき、この書き方だとどちらのテーブルのカラムか分からない。
- 32 :NAME IS NULL:2016/08/21(日) 09:41:45.55 ID:???.net
- mysql5.7を使用しています
ユーザーのゲーム内マネーをwalletテーブルで管理していて
新たにユーザーの最大マネー記録の管理が必要になったので
recordテーブルを新たに作ることにしました
walletテーブル: id, user_id, gold
recordテーブル: id, user_id, max_gold
質問なのですが、walletテーブルのgoldから
recordテーブルのmax_goldを全ユーザー分一括で更新するにはどうしたらいいでしょうか
よろしくお願いします
- 33 :NAME IS NULL:2016/08/21(日) 14:33:49.32 ID:???.net
- recordには全idすでにある前提?
UPDATE record
SET max_gold = (SELECT MAX(gold) FROM wallet
WHERE record.user_id = wallet.user_id);
とかは?
- 34 :32:2016/08/22(月) 01:44:39.00 ID:???.net
- >>33
レスありがとうございます
説明が不足していてすみません
userテーブルとwalletテーブルは1対1になっています
userテーブルとrecordテーブルも1対1です
全user分のwalletとrecordが存在します
walletテーブルのgoldは増減します
recordテーブルのmax_goldは過去最高goldです
あるタイミングで複数walletに一斉にgoldがプラスされます
そのときにwalletのgoldがrecordのmax_goldより大きければmax_goldを更新したいです
自分なりに調べてupdateとjoinを使うのだろうということはわかりましたがSQLを書けずにいます
教えていただけると嬉しいです
よろしくお願いします
- 35 :NAME IS NULL:2016/08/22(月) 01:49:54.86 ID:nVybO4PH.net
- >>34
まずはひとつずつ考えて。
段階的に考えていかないと。
- 36 :NAME IS NULL:2016/08/22(月) 04:14:30.36 ID:???.net
- 別にその条件でも>>33でいけるだろ
- 37 :NAME IS NULL:2016/08/22(月) 04:17:24.95 ID:???.net
- あー元がmaxより小さいケースがあんのか、でもl条件一つ追加するだけだよな
- 38 :32:2016/08/22(月) 10:24:05.45 ID:???.net
- 自己解決できたみたいです
update record
left join wallet on record.user_id = wallet.user_id
set record.max_gold = if(wallet.gold > record.max_gold, wallet.gold, record.max_gold)
where record.user_id = wallet.user_id;
これでやりたいことはできたと思います
ありがとうございました
- 39 :NAME IS NULL:2016/08/22(月) 10:41:57.37 ID:???.net
- ちょっと見ただけですけど
recordテーブルを追加するのではなく、
walletテーブルに max_goldという項目を追加すれば良いのでは?
- 40 :NAME IS NULL:2016/08/22(月) 10:57:44.22 ID:???.net
- user_idごとに1件しか無いのにidが別にあることとかいろいろ気になるけど
まあなんか書いてない理由があるんだろう、、、
どうしても最新状態保つなら単にトリガ書くだけのが早そうだが
- 41 :NAME IS NULL:2016/08/22(月) 13:08:23.88 ID:nVybO4PH.net
- >>38
正直に言ってくそSQLだわ。
他人があとでみたら、こいつ殺すと思われるレベル。
- 42 :NAME IS NULL:2016/08/22(月) 13:40:23.90 ID:???.net
- 初心者スレなんだからぼろくそに言うのではなく改善案を提示しないと
- 43 :NAME IS NULL:2016/08/22(月) 13:59:03.07 ID:???.net
- これは更新が1回でも失敗したらもう最大値が出せなくなるじゃん
- 44 :NAME IS NULL:2016/08/22(月) 18:58:47.51 ID:???.net
- >>34
walletに時系列データはないのか?
ないと実現出来ないのではないか?
- 45 :32:2016/08/22(月) 20:10:31.73 ID:???.net
- だめなSQLのようですね
どこが悪いのかがわからないのでどう改善していいのかもわかりません
具体的に指摘してもらえると助かります
SQL難しいですね
>>39
recordにはユーザーの最大ゴールド以外にもいろいろな記録を持たせようと思っています
>>44
時系列データはありません
- 46 :NAME IS NULL:2016/08/22(月) 22:48:38.43 ID:???.net
- 開始の残高ファイルと更新データがあれば累計関数使って累計残高viewを作ってその最大値で更新したほうがいいと思う
mysqlでは下記リンク先参照
http://pct.unifas.net/mysql/3712
- 47 :NAME IS NULL:2016/08/22(月) 23:24:46.87 ID:nVybO4PH.net
- >>45
疑問なのは、UPDATE文ひとつでやらないと本当にいけないの?
こういう状況がわからない。
- 48 :NAME IS NULL:2016/08/23(火) 03:22:31.82 ID:???.net
- >>38のSQLでは、実行時のwalletの値が最大値だったときしか更新されないぞ
履歴保持してないのに全ユーザ一括は無理(全ユーザのwallet更新タイミングが同じでない限り)
walletが時系列や履歴を持たずに、現在値しか保持してないなら
walletの更新時にrecordを更新しないとダメ
で、普通のDBMSなら、こういうのはwalletにトリガ張ってやる
walletを更新するストアドプロシジャ作ってそれでチェックするって方法もあるけど
- 49 :32:2016/08/23(火) 12:32:35.01 ID:???.net
- >>47
どういうサイトなのかを説明すべきでしたすみません
ざっくり言うと競馬のようなサイトをやっています
レース終了後に払い戻しとして的中した全ユーザーのwalletのgoldを
ユーザーが賭けた額×オッズ分プラスします
この払い戻しのタイミングでmax_goldを更新したいと思い>>38のようなSQLを考えました
goldが増えるタイミングは払い戻し時のみです
>>48
トリガ、ストアドプロシジャを初めて知りました
調べてみようと思います。ありがとうございます
- 50 :NAME IS NULL:2016/08/23(火) 12:41:04.01 ID:???.net
- >>40 でトリガって書いてるのになw
- 51 :NAME IS NULL:2016/08/23(火) 12:42:04.90 ID:???.net
- どっちにしてもストアドもトリガも知らないくらいの初心者がDB設計して使い物になるとは思えない
SQL以前にDB設計じゃねえの
- 52 :NAME IS NULL:2016/08/23(火) 12:55:29.40 ID:???.net
- >>51
> どっちにしてもストアドもトリガも知らないくらいの初心者がDB設計して使い物になるとは思えない
と思ってるような奴の方が使い物になるとは思えんな
- 53 :32:2016/08/23(火) 13:06:07.75 ID:???.net
- データベースの勉強をおろそかにしてORMに頼ってたツケが回って来た感があります
データベースについて基本からしっかり勉強し直したいのですが
おすすめの本やサイトを教えていただけないでしょうか
- 54 :NAME IS NULL:2016/08/23(火) 14:43:56.01 ID:???.net
- >>53
amazonでデータベースで検索し、設計関連の評判の良いものを5冊買え
- 55 :NAME IS NULL:2016/08/24(水) 14:41:29.50 ID:jYRxe2VKj
- 元データ
列A 列B
A 1
A 2
B 1
C 3
↓
結果
1 2 3
A ○ ○
B ○
C ○
のような結果を得たい場合、どのようなSQLを書けばよいでしょうか?
- 56 :NAME IS NULL:2016/09/01(木) 16:46:33.47 ID:???.net
- SQLっていうか、DBそのものに関する質問になってしまうんですが。。。
データベースに同じUserID、同じパスワードで複数ログイン出来るってのは一旦資格を与えられたユーザーに
ついてはその権限の範囲なら信用するってことなんですかね。
- 57 :NAME IS NULL:2016/09/01(木) 17:48:15.50 ID:???.net
- 1ユーザ1コネクションの制限を設けたとしたら、マルチプロセスやマルチスレッドなクライアントが任意のタイミングでコネクションを生成するのに苦労するよ。
- 58 :55:2016/09/01(木) 18:40:00.10 ID:???.net
- そちらの方のプログラミングには疎いんですが、とにかくそういう制限があるとまずいってわけなんですね。^^;
例えば一般ユーザーに開放しているデータベースがあるとして、そこにアクセスするユーザーにいちいちidとパスワード、権限を
与えるのも大変だなとは思ったんですが。
- 59 :NAME IS NULL:2016/09/01(木) 19:02:23.73 ID:???.net
- 何に関しては疎くないの?
- 60 :NAME IS NULL:2016/09/01(木) 20:30:50.75 ID:???.net
- >>59
バカ発見
- 61 :NAME IS NULL:2016/09/01(木) 21:43:12.28 ID:???.net
- >>60
回答してあげなよ ^^
- 62 :NAME IS NULL:2016/09/01(木) 22:57:57.54 ID:???.net
- >>58
なんかいろいろ勘違いしてる
- 63 :NAME IS NULL:2016/09/02(金) 02:24:24.57 ID:RT8+OUHE.net
- >>58
RDBMSでもOSでも1ユーザー、1セッションというものの方が珍しい。
- 64 :NAME IS NULL:2016/09/02(金) 02:39:07.81 ID:???.net
- まあRDBMSによって「ユーザー」というものの定義は異なるけどな
- 65 :NAME IS NULL:2016/09/04(日) 21:42:59.71 ID:???.net
- トランザクションとかの話?
- 66 :NAME IS NULL:2016/09/04(日) 21:58:50.03 ID:???.net
- ユーザ用(id,パスワード)のテーブルがあった方がいいと思うけど
- 67 :NAME IS NULL:2016/09/04(日) 22:33:29.15 ID:???.net
- >>58
>例えば一般ユーザーに開放しているデータベースがあるとして、
>そこにアクセスするユーザーにいちいちidとパスワード、権限を
>与えるのも大変だなとは思ったんですが。
一般ユーザーに直接データベースを操作させることは普通しないと思う。
そうではなく、データベースを利用するシステムが、利用ユーザーに提供する
業務用アカウントの話じゃないのかな?
- 68 :NAME IS NULL:2016/09/04(日) 22:40:44.03 ID:???.net
- ユーザ用って書き方がおかしかった
ユーザを管理するテーブル
- 69 :NAME IS NULL:2016/09/05(月) 16:09:42.99 ID:???.net
- 最初にテーブルを作成したら、新しいテーブルは必要ないシステムを作っています
この場合、テーブル構造をどう保存するのが正しいやり方ですか?
とりあえずcreate文を保存しています
- 70 :NAME IS NULL:2016/09/05(月) 16:42:31.07 ID:???.net
- >>69
それでいいよ
- 71 :NAME IS NULL:2016/09/05(月) 16:46:05.98 ID:???.net
- DBのツールでスキーマ保存すると結局CREATE文だけってのもあるしな
- 72 :NAME IS NULL:2016/09/05(月) 16:53:22.93 ID:???.net
- >>70
ありがとうございます
- 73 :NAME IS NULL:2016/09/16(金) 14:02:36.57 ID:???.net
- 例えば名簿のtableがあって、
id name address
という三つのカラムがあります。
idは重複しない番号です。
この時 id で order by して、
idが1000番台の人の最初の100人取り出す。
idが2000番台の人の最初の100人取り出す。
みたいな処理を連続で行う場合、毎回 order by するのは効率悪いと思うのですが、
何か良い方法はありますか?
MySQLです。
- 74 :NAME IS NULL:2016/09/16(金) 15:12:58.45 ID:???.net
- >>73
between
- 75 :NAME IS NULL:2016/09/16(金) 15:37:16.31 ID:???.net
- >>73
> みたいな処理を連続で行う場合、毎回 order by するのは効率悪いと思うのですが、
indexが使われるなら効率は悪くない
- 76 :NAME IS NULL:2016/09/16(金) 15:46:47.88 ID:???.net
- >>74>>75
すみません、初心者なのでもう少しヒント下さい。
よく理解できません。
- 77 :NAME IS NULL:2016/09/16(金) 15:50:26.47 ID:???.net
- >>76
select * from 名簿 where id >= 1000 order by id limit 100;
とかするんだろうけど、idにindexが付けられてるなら効率は悪くない
これでわからないのならお手上げ
- 78 :NAME IS NULL:2016/09/16(金) 15:57:39.07 ID:???.net
- 処理が必ず1000番台ごとにするなら
もう一つ項目daiを追加して、indexを張っておき
id 1000〜1999 には 1 をセット
id 2000〜2999 には 2 をセット
id 3000〜3999 には 3 をセット
というのは?
select * from 名簿 where dai=1 order by id limit 100;
- 79 :NAME IS NULL:2016/09/16(金) 16:32:17.70 ID:???.net
- >>78
それだとindexは使われない
- 80 :NAME IS NULL:2016/09/16(金) 17:12:26.30 ID:???.net
- >>76
select *
from 名簿
where
id between 1 and 100 or
id between 1000 and 1100 or
id between 2000 and 2100
- 81 :NAME IS NULL:2016/09/16(金) 17:17:10.22 ID:???.net
- >>79
そんなのDBMSとオプティマイザの判断次第
カーディナリが十分高ければ、daiのインデックスは使われる可能性が高いだろ
元質問はMySQL指定か。MySQLのオプティマイザでは絶対使わんっていう話なら知らん
- 82 :NAME IS NULL:2016/09/16(金) 17:19:10.66 ID:???.net
- >>79
idに抜け番がないとはどこにも書いてないけどな
- 83 :NAME IS NULL:2016/09/16(金) 17:39:29.68 ID:???.net
- >>81
MySQLのこと知らんなら黙っとけよ
- 84 :NAME IS NULL:2016/09/16(金) 17:42:18.69 ID:???.net
- >>83
まいしーくぇる
- 85 :NAME IS NULL:2016/09/16(金) 18:05:34.85 ID:???.net
- mysqlはクソだからしかたがない。
- 86 :NAME IS NULL:2016/09/16(金) 18:10:25.81 ID:???.net
- >>85
まいしーける
- 87 :NAME IS NULL:2016/09/16(金) 18:25:35.23 ID:???.net
- そういや、mysqlではsub queryが劇遅だってのは直ったの?
- 88 :NAME IS NULL:2016/09/16(金) 21:39:39.26 ID:???.net
- >>81
daiのカーディナリティも十分に大きければそのインデックスも使われるだろうけど、
常にそれよりカーディナリティが大きいidのインデックスを使った方がいいに決まってる。
それにそもそもidでソートするわけだし。
- 89 :NAME IS NULL:2016/09/17(土) 02:16:52.23 ID:???.net
- ありがとうございました
indexを試してみます
- 90 :NAME IS NULL:2016/09/22(木) 11:38:01.04 ID:???.net
- SELECT * FROM table
WHERE ...
AND ...
AND ...
AND ...
のようにAND条件をズラズラ並べる場合、
その条件を並べる順番で処理速度は変わりますか?
- 91 :NAME IS NULL:2016/09/22(木) 12:44:02.41 ID:???.net
- 長文失礼します。
mysqlで
article_infoテーブルに title(記事タイトル),url(記事のurl)を持っています。
blog_infoテーブルには blog_title(ブログのタイトル),blog_url(ブログのtopのurl)を持っています。
やりたいこと:
article_infoで取得した記事のブログのタイトルを一緒に取得したい。
article_info.url は、,blog_urlのレコードのどれかを含んでいます。
例:
blog_title:サンプルブログ
blog_url:http://sample.com/
article_info.url:http://sample.com/article/001
のようになっているので、もし取得したurlがblog_urlに含んでいた場合、対応するblog_titleを共に表示したいと考えています。
- 92 :90:2016/09/22(木) 13:24:14.82 ID:???.net
- ちなみに
SUBSTRING(url,1,LOCATE('/',url,8)) でblog_urlのどれかとマッチするurlが作れることがわかりました。
- 93 :NAME IS NULL:2016/09/22(木) 13:32:19.51 ID:???.net
- >>90
普通は検索方法はオプティマイザが判断するから関係ない
定義順に条件書かれてないと複合インデックスが使用できないDBMSがあるとかいう噂は昔聞いたことある
その場合は複合インデックスの定義順に並べるほうが早い可能性が高い
オプティマイザが貧弱で検索順を入れ替えられないDBMSも聞いたことがある
その場合はカーディナルの高い順に検索条件並べろと教えられたことはある
単一テーブルの単純な検索なら、最悪でもそのテーブルのフルスキャン1回ですむから
まあどうでもいいと思うが
- 94 :90:2016/09/22(木) 13:33:17.23 ID:???.net
- すみません。下記のかんたんなsqlで取得できました。お騒がせしました。
select
a.title,
a.url,
b.blog_title
from
article_info a,blog_info b
- 95 :NAME IS NULL:2016/09/22(木) 20:16:59.13 ID:???.net
- >>93
詳しい説明ありがとうございました。
MySQLです。
念のために順番を考慮してAND条件を書いてみます。
- 96 :NAME IS NULL:2016/09/22(木) 23:39:21.90 ID:???.net
- >>94
fromでカンマで繋げるのは
INNER JOINの省略形な
- 97 :NAME IS NULL:2016/09/22(木) 23:45:57.18 ID:???.net
- cross joinだろ
- 98 :NAME IS NULL:2016/09/22(木) 23:53:56.92 ID:???.net
- ふつう直積(CROSS JOIN)だと思うんだが、>>94読んであれ?と思った。
MySQLってそうなのか?
- 99 :NAME IS NULL:2016/09/23(金) 00:03:00.24 ID:???.net
- whereでなんかしてなければ直積だな
- 100 :93:2016/09/23(金) 02:59:28.95 ID:???.net
- すいません、できたと思ってたけどできてませんでした。
しょうがないのでarticle_infoとblog_infoにblog_idカラムを追加して
Inner join で持ってきました。
総レス数 1002
239 KB
新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★