SQLなら俺に訊けat TECH
SQLなら俺に訊け - 暇つぶし2ch1:デフォルトの名無しさん
17/07/14 07:40:53.63 HFjsarQi.net
さあ

2:デフォルトの名無しさん
17/07/18 22:00:59.52 siPNnjTj.net
count(*)の*と、select * fromの*は同じでしょうか

3:デフォルトの名無しさん
17/07/20 17:02:54.84.net
>>2
同じだろ。何でそんな事が気になる?

4:デフォルトの名無しさん
17/07/20 17:41:19.81.net
>>3
違うよ
select * from fooは、「fooテーブルの全カラム」という意味
count()の方は、
count(column_name)とカラム名を指定したときは、column_nameがnullではない行数が取得される
count(*)だとnullとか関係なしに全行数

5:2
17/07/20 20:03:27.83.net
>>3 >>4
ありがとう。なんとなく違う感じでうまく説明できなかったけど、>>4の通りだわ

6:デフォルトの名無しさん
17/07/21 05:29:05.88.net
>>4
>column_nameがnullではない行数
column_nameがnullになる事が有るの?

7:デフォルトの名無しさん
17/07/21 06:56:59.69.net
スルー検定(初級)

8:デフォルトの名無しさん
17/08/26 19:24:02.61 DSilAr/A.net
foo_id, bar_id_list
"1", "1,2,3"
"2", "4,5"
"3", "6,7,8"
これを
foo_id, bar_id
"1", "1"
"1", "2"
"1", "3"
"2", "4"
"2", "5"
"3", "6"
"3", "7"
"3", "8"
こう変換するクエリって書ける?
なるべく標準がいいけどポスグレ依存でも可

9:デフォルトの名無しさん
17/08/30 07:14:19.33 FYBJnXXr.net
>>8
お前は秘密の合言葉を言ってない。
「お願いします。どうか教えて下さい」

10:8
17/08/30 08:02:42.85 ItMe6Tvy.net
再帰クエリでできました
SQLは業務で使うことも多いのにSQLスレに人がいないのは寂しいですね

11:デフォルトの名無しさん
17/11/03 19:41:06.46 N8t7Jq3a.net
てす

12:デフォルトの名無しさん
17/11/03 20:07:37.65 N8t7Jq3a.net
SQL初心者です。
複数のrowを一度に取りたいのですがどう書けばいいのでしょうか。
後述の(C)より効率のよい記述を探しています。
(なおRock54回避の為シングルクオートを全角に、またselectをカタカナに変更しています)
用途は掲示板で、以下のような「先頭と最近の5投稿」の取得が目的です。
URLリンク(mevius.5ch.net)
環境はSQLiteです。SQLite依存で構いません。
単純には以下2クエリになりますが、
select * from thread order by no limit 1; // (A)
select * from thread order by no desc limit 5; // (B)
A-B間で更新されたときに過渡状態のデータが返ることを避けるため、一つに纏めたいのです。
SQLiteでは読み込みにはトランザクションが使えず、BEGIN/COMMITで囲んでブロック出来ません。
試行錯誤して一応以下のクエリは通るようですが、サブクエリが効率が悪く見えるのでもっと良い書き方を探しています。
セレクト from ’1234’ where no in (values(’1234’) union セレクト no from ’1234’ order by rowid desc limit 6); // (C)
ここで1234はスレッド名=スレッド最初の投稿Noです。
4chanのように板毎にNoが打たれており、スレ内のNoは飛び飛びになっています。
なお前側values部分もサブクエリにして先頭番号を取得する limit 1のサブクエリも書き方があれば教えてください。
(デバッグ時に使う)
これも出来ません。例えば、以下は通りません。
セレクト * from ’1234’ where no in ((セレクト no from ’1234’ limit 1) union セレクト no from ’1234’ order by rowid desc limit 6); // (D)
// limitはunionの後に、とエラーが出る
(A)+(B)は同時にデータも取得する為、(C)より効率がいいと考えています。
(データの順序が異なるが、簡単にカバー出来る範囲なので問題ない)
ただし(A)+(B)だと場合によっては中途半端なデータが返る時があり、これは避けたいのです。
なお初心者の為上記前提がいろいろ間違っているかもしれませんが、その辺はご指摘下さい。

13:デフォルトの名無しさん
17/11/03 22:59:45.82 ATL1IZSq.net
SQLiteがreadでトランザクション使えないって、そうだっけ?
デフォルトがrepeatable readじゃないから勘違いしてるとかじゃなくて?

14:デフォルトの名無しさん
17/11/03 23:25:25.83 N8t7Jq3a.net
>>13
そうなのかもしれませんが、それを変える方法が分かりません。
SQL自体はSQL92準拠らしいです。
URLリンク(www.sqlite.org)
ちなみにトランザクションのページはこちら。
URLリンク(www.sqlite.org)
なお、select自体は一つのトランザクションらしく、例えば上記(A)(B)を繋いで begin; commit;で囲むと、
「トランザクション中でトランザクションを開始出来ません」というエラーになります。
// Error: cannot start a transaction within a transaction

15:デフォルトの名無しさん
17/11/03 23:38:29.19 N8t7Jq3a.net
ああすいません、これですかね?
PRAGMA read_uncommitted;
URLリンク(www.sqlite.org)
ここの書き方だとよく分からないのですが、
デフォはSERIALIZABLEで、これをREAD UNCOMMITTED(true)にして、
さらに書き込み側をBEGIN EXCLUSIVEにしろってことですかね?
> After a BEGIN IMMEDIATE,
> no other database connection will be able to write to the database or do a BEGIN IMMEDIATE or BEGIN EXCLUSIVE.
> Other processes can continue to read from the database, however.
> An exclusive transaction causes EXCLUSIVE locks to be acquired on all databases.
> After a BEGIN EXCLUSIVE,
> no other database connection except for read_uncommitted connections will be able to read the database
> and no other connection without exception will be able to write the database until the transaction is complete.
> URLリンク(www.sqlite.org)

16:デフォルトの名無しさん
17/11/03 23:58:59.47 N8t7Jq3a.net
あ、いや、違いましたね。
read_uncomitted は制限を緩和する方向でした。
まだ全貌を把握しておらず、ここら辺はすみません。
SQLiteはseriarizableを実装しているとは書いてありますが、デフォが何かはよく分かりません。
> SQLite implements serializable transactions
> URLリンク(www.sqlite.org)
ただまあ、今のところ複数selectをトランザクションに指定する方法が分かりません。
多分単発のselectなら自動的にトランザクション化してます。

17:デフォルトの名無しさん
17/11/04 01:14:38.64 tY9TOSMT.net
ちなみに記事は古いんですが、複数のselectをbegin/endで囲むことも出来るっぽいんですよね、、、
URLリンク(stackoverflow.com)
私が出来ないのは、こちらの環境の問題でしょうか?
PHP経由でのsqlite3.15.1と、コマンドラインの3.21.0の両方で駄目です。

18:デフォルトの名無しさん
17/11/04 01:32:35.14 tY9TOSMT.net
>>12を取り下げます。
どうやら私の書き方が悪かったようで、別々に打たないといけないらしく、
そうすればあっさり出来ました。
どうもすいません。
参考にしたページは以下です。
URLリンク(d.hatena.ne.jp)

19:デフォルトの名無しさん
17/11/13 20:26:57.15 612lbeAQ.net
このスレはデータベース板にいるやつのネタスレだな。
count(*)は慣習上、このように書いているだけ。

20:デフォルトの名無しさん
17/12/15 21:10:52.36 Tb0OcKpN.net
SQLは重いというイメージが頭から離れない
またとってくればいいだけなんだが
どうしても一度取得してきたデータを使いまわしたくてプログラムがぐしゃぐしゃになる

21:デフォルトの名無しさん
17/12/16 20:45:23.46 VEeoy7XK.net
ん?普通そうだが、何でぐしゃぐしゃになるのかが分からん

22:デフォルトの名無しさん
17/12/16 21:34:31.55 Bt/T1sYp.net
スコープの長い変数をずっと持ってないといけないから
メソッドの引数がふえて
だから作ったメソッドが使いづらい

23:デフォルトの名無しさん
17/12/17 11:36:00.81 5FGxeo64.net
何の言語か知らんけど、構造体とかクラスで使えば良いのでは?
取り敢えず一度取得してきたデータは使いまわすのが基本
その都度発行とか有り得んから、使いまわせるように工夫すべき

24:デフォルトの名無しさん
17/12/17 13:31:30.67 qopiqGcR.net
えー
せっかくDB側でSQLキャッシュしてくれる機能もってんのに
プログラムでもまたキャッシュの仕組みつくるん?

25:デフォルトの名無しさん
17/12/20 09:30:16.27 CxRyWMoc.net
SQLってサーバー立てるのがデフォなんですか?

26:デフォルトの名無しさん
17/12/21 21:57:46.42 URpfxR/O.net
そんなの使い方に依るでしょ
SQLiteのが遥かに適してるのにネットワーク型拵えてるアンチパターンはかなり見るが
この逆は滅多に見ない、SQLiteは玩具過ぎて使えないと言ってる使えない人間はかなり居る

27:デフォルトの名無しさん
17/12/21 22:06:03.87 Mqu0aN7Q.net
そりゃそうだろ逆にしたら作れないじゃんw

28:デフォルトの名無しさん
18/01/28 14:32:23.14 Erw8GBm0.net
AccessでのVBAの開発の話なんだが、他言語含めて飽きるほどコード書いてきたという人がSQLで書くようなことはしないと言うんだ。
デザインビューでクエリー作るんだって。
俺とは余りに文化が違うんだが、これって俺がおかしいのかな。
それとも彼がビックマウスなのかどっちだと思う?

29:デフォルトの名無しさん
18/01/28 15:54:33.89 BfkgINY1.net
Accessは知らんが。
これ見る限り、そのやり方もありだろう。
URLリンク(www.microsoft.com)
URLリンク(www.microsoft-access.net)
> 俺とは余りに文化が違うんだが、これって俺がおかしいのかな。
> それとも彼がビックマウスなのかどっちだと思う?
お前がおかしいことは確定だが、(ただしお前が言っている意味ではない)
彼がビッグマウスかというのは意味が分からない。(だからお前はおかしい)
そもそも、やり方は一つじゃない。どっちが正しいという考え方がおかしい。
そいつにとって効率がいい方法を使えばいいだけ。
この画面通りに動くのなら、クエリ結果画面を見ながらGUIでプログラミングできる。
手打ちでSQL書いて動かしてデバッグするより早いのは確かだよ。
同様な物に、VSのフォームデザイナがある。
さすがにあれを全部手打ちする奴はいないと思うが、技術的には出来る。
あれは毎回Form1.hをパースして表示しているだけだから。
ただしパーサは自動出力の結果を読み込む前提で全くロバストではないから、
少しでもエラーがあったら止まってしまい、それ以降デザイナが使えなくなる。
だから手打ちは推奨されていない。とはいえ、出来る。

30:デフォルトの名無しさん
18/01/28 15:55:43.16 BfkgINY1.net
以下は推測になるが、、、
おそらくAccessも同様に、自動作成クエリを読み込んで表示するようになっていると思われる。
その場合、手打ちでクエリを作成されると、そこでエラーが発生した場合、クエリデザイナが使えなくなってしまう。
だから、プロジェクトとして、「クエリデザイナしか使うな」みたいな縛りはあり得る。
局所的に手打ちでクエリ書いたとして、そこがデザイナ側に読み込まれないのならエラーにはなりようもないが、
後の人が手打ちでクエリを書けない人ならメンテナンスが出来なくなってしまう。
ただし、デザイナに頼りすぎると後々色々大変になるので、
中にはデザイナは最低限しか使うな、という人もいる。
フォームの場合は「イベントをデザイナで書くな」みたいになるわけだが、
Accessの場合は「クエリをデザイナで書くな」になるんじゃないかな?
だから、そこはやり方の問題だ。
どっちが正しいかではなく、どちらを選ぶかだ。当然、チームの他の人員のスキルも考慮しないといけない。
Accessの場合にどちらが主流派なのかは俺は知らない。
ただな、SQLってのはDB用アセンブラみたいなもので、
実際、そんな物をいちいち手打ちしてたら効率は上がらないだろ。
SQLは未来永劫手で書くものだ、と思っているのならお前がおかしい。
(俺は使ったこと無いが)ORMはそこを完全に隠蔽していて、SQLなんて当然自動生成で、
プログラマがいちいち書くはずもないだろ。(現実にはそうでもないらしいが、少なくともそこを目指しているだろ)
ただし、スキルとしては当然読めた方がいいし、手でも書ける人が手抜きする為にデザイナを使うのが本来は正しい。
だから君の立ち位置は間違ってはいない。
君はデザイナを覚えて、君のプロジェクトではどちらを使うか判断すればいいだけ。
既にあるプロジェクトに参加するなら、そのプロジェクトの流儀に従うしかない。
繰り返すが、俺はAccess知らないから、Accessの文化については他の人を待て。

31:デフォルトの名無しさん
18/05/21 19:04:06.55 aAfPm2kk.net
SQLでJOIN等の結果に別名を付けるエイリアスってありますか?

32:デフォルトの名無しさん
18/05/22 02:42:52.45 BxsxaQQf.net
>>21
サブクエリにして別名つければ

33:デフォルトの名無しさん
18/05/23 11:08:43.69 +HKSXK/9.net
>>32
解決しました。ありがとうございました。
ところでミックさんの本は名著だと思いますが、セルコを読んでみたら、むちゃくちゃわかりやすくて驚きました。
プログラミングの本は洋書に限るという主張はかなり当たっていますね。

34:デフォルトの名無しさん
18/05/24 01:57:22.85 UTbVU3sw.net
日本語でもあれだけの容量を割ければわかりやすく書けるのでは。
日本語の技術書って2000部出ればヒットの部類だって言うし
国産で6000円の本がどれだけ売れるやら(=コストがかけられるか)
楽器の教則とかも似た感じだが
勢い初心者向けの入門書が多くなり、レベルの高い本はページ数が足らなくて
分かる人だけ分かってとか分かってる人が知識の確認に使う本が多い気がする
個人的には洋書(の翻訳)は
「もうxxでxxする必要はないのです!」
みたいな無駄な例えとかジョークが多くてちょっとイラっとする時がある

35:デフォルトの名無しさん
18/05/24 21:00:50.73 tj3fGZUH.net
SQLで超高速スクロールシューティングゲームを作りたいのですがどこから勉強したらいいのかわかりません

36:デフォルトの名無しさん
18/05/26 08:25:51.19 ww7rlXCh.net
何のネタ?

37:デフォルトの名無しさん
18/05/30 21:07:58.36 mJRov030.net
SQLが出来なさ過ぎて今日解雇されました・・・

38:デフォルトの名無しさん
18/05/31 05:05:26.67 iPLFO8dU.net
SQLの勉強をした後に普通の手続き型言語の勉強をすると楽ちんさに驚く。SQLは難しいわ。

39:デフォルトの名無しさん
18/06/05 09:59:14.61 tY+4OZF+.net
ミック氏の著書にある「WHERE句で分岐させるのは素人、
プロはSELECT句で分岐させる」を職場で実践したら異常
者扱いされて追放されたよ

40:デフォルトの名無しさん
18/06/05 19:17:49.83 EhA+zJu2.net
>>39
その職場は日大アメフト部か?

41:デフォルトの名無しさん
18/06/06 22:27:26.69 R4gO35f9.net
[tbl]
key
-----
A
B
C
D
こんなテーブルがあって、
SELECT key
FROM tbl
ORDER BY CASE WHEN key = 'B' THEN 1
WHEN key = 'A' THEN 2
WHEN key = 'D' THEN 3
WHEN key = 'C' THEN 4
END;
このSQL文で並べ替えができるのはなぜでしょうか?

42:デフォルトの名無しさん
18/06/07 08:40:18.91 Jg+r/SZw.net
>>41
クイズ?

43:デフォルトの名無しさん
18/06/07 10:09:37.01 2+Xi7sa/.net
ミックさんの本に同じ例題があったな

44:デフォルトの名無しさん
18/06/19 19:15:35.13 67yeiw0t.net
n+1問題ってなんやねん
パフォーマンス低下したら何がいけないの?

45:デフォルトの名無しさん
18/07/04 22:30:30.92 gFgZc5FG.net
KOC

46:デフォルトの名無しさん
18/07/27 09:24:44.45 kjOumEVE.net
文字列を追記するにはどうすると良いのでしょう?
これだと上書きされてしまいます。
どうすると良いのでしょう?
$sql = 'update imglistdb set mcategory = ? where id = ?';
$stmt = $dbh->prepare($sql);
$flag = $stmt->execute(array($w, $id));
if ($flag){
print('データの更新に成功しました<br>');
}else{
print($id.'のデータの更新に失敗しました<br>');
}

47:デフォルトの名無しさん
18/08/05 16:50:26.11 ja6KHJcY.net
>>46
できました。

48:デフォルトの名無しさん
18/08/10 14:51:46.21 Y0WYl7hO.net
サマータイムが導入されたとしてUTCで時刻が記録されてテーブルで
今日の分の売り上げを集計する場合どうするのが正しいですか?

49:デフォルトの名無しさん
18/08/10 21:30:06.76 gtqPLADd.net
「今日」を定義しろ。

50:デフォルトの名無しさん
18/08/24 09:10:24.90 AhUX2VuR.net
SQLの構文ってなんであんなクソだらけなものが採用され続けているの?
insertのintoとかupdateのsetとかいらないし
updateでwhereを指定し忘れたら全レコードが更新されるのとか超危険だし
updateはID指定→値指定で更新っていうのが直感的にやりやすいのに
whereを最後に持ってこないといけない仕様のせいでid指定が最後になるし
カラムと値の指定の仕方も一貫性がないし
後方互換性としてあれらのコマンド"も"使えるならまだわかるけど
あれらのコマンド"しか"使えないとかこの業界頭おかしいんじゃないの

51:デフォルトの名無しさん
18/08/24 10:46:30.87 h+5y0En0.net
言いたい事は分かるし別に否定はしないのだが、糞でも広まって使われてる以上それに従わざるを得ないのさ
JSと一緒だよ

52:デフォルトの名無しさん
18/08/24 11:18:46.54 Gecec4UJ.net
フェールセーフの仕組みはインターフェースの実装レベルでなんとかしてねってことなんじゃないの

53:デフォルトの名無しさん
18/09/15 19:10:17.26 crViL/AR.net
データの持たせ方を誤ってしまって、
カラム定義
時間,val1,val2,val3・・・
ってなってるんですが、val1からvalnで最大値を取りたい場合、どのようにアプローチするのがスマートですか?

54:デフォルトの名無しさん
18/09/15 20:19:51.77 KIanXBkQ.net
時間がユニークじゃないどうしようもない状態なら
とりあえずコレでいけるハズ
select
 max(ahox.time_),
 max(ahox.max_val)
from
 (
  select rowid, time_, val1 as max_val from aho
  union all
  select rowid, time_, val2 as max_val from aho
  union all
  select rowid, time_, val3 as max_val from aho
  ...
 ) ahox
group by
 rowid
時間がユニークならrowid(DBMSが内部的にテーブルにもたせてる行の識別値)みたいなもんは使う必要ない
使う必要があるならrowidはDBMSごとに違うからあとは調べなさい

55:デフォルトの名無しさん
18/09/15 20:37:41.73 KIanXBkQ.net
運用方法のアプローチとしては
とりあえず一回全抽出してテーブルを作り直したほうがいい
こんな感じのワークテーブルをマニュアル作業で一旦作る
 id, eventno, 時刻, 項目名, 値
eventnoの部分にはとりあえずrowidつっこんどく
で、idはただのシリアル値
システムがこの形式のテーブルに落とせる運用にすれば
それからはすぐに最大値がとれるようになる
そうなるまで毎回ワークテーブル作って最大値とるようにすればいい
それまではマニュアル作業で自分でテーブルをつくりなおす
失敗したヤツがちゃんと責任もってやるようにな

56:デフォルトの名無しさん
18/09/15 22:24:53.50 VdLZkjGs.net
エクセルの行列を、そのまま表定義にする、馬鹿が多い
列に製品番号があれば、列1・列2・列3 と定義しよる。
それで製品番号が増えるたびに、列を増やしていくw
頭おかしいw

57:デフォルトの名無しさん
18/09/15 22:31:40.71 crViL/AR.net
>>54
>>55
お二人共、ありがとうございます。
テーブル再定義も含め、まずは54さんの手法でこの場は凌いでみます。

58:デフォルトの名無しさん
18/09/15 22:37:05.98 crViL/AR.net
>>57
同一IDだた。いずれにしてもサンキューです。

59:デフォルトの名無しさん
18/09/16 00:44:59.12 LDoJnfCQ.net
>>56
それな、まずは糞なテーブルを捨てろ

60:デフォルトの名無しさん
18/09/22 16:25:45.44 /Du2bEHB.net
DBの検索速度ってPC上ではかなり遅いみたいですけど
大手Webサービスはどこも一瞬で結果を返してくれますよね
あれは単にサーバーのスペックが凄いから早いんですか?

61:デフォルトの名無しさん
18/09/22 20:22:55.42 U3p59MUv.net
>>60
「DBの検索速度ってPC上ではかなり遅いみたい」
この前提がまずよくわからんが
オンメモリやらキャッシュやら高速ネットワークやら
みんな色々工夫してるから

62:デフォルトの名無しさん
18/10/23 15:14:05.50 IWYLnZUh.net
初心者です。もしよろしかったら質問させてください。
CASE文
SELECT TAB1,TAB2,
 CASE
  WHEN TAB2<1000 THEN 'SMALL'
  WHEN TAB2>1000 THEN 'BIG'
  ELSE 'ERR'
 END AS SIZE
 FROM TABLE
WHERE TAB2>0
というコードなのですが、TAB1のように、CASE文で使用しないカラムをSELECTするのは何故なのでしょう?

63:デフォルトの名無しさん
18/10/23 23:04:42.87 +Sb0MP+K.net
TAB1の値がほしいから
いらないなら書く必要すらない

64:デフォルトの名無しさん
18/10/23 23:05:20.44 QS1DBBVT.net
欲しかったからだろ。

65:デフォルトの名無しさん
18/10/24 13:40:18.23 AfSv/oYJ.net
ありがとうございました。
すっきりしました。
SELECT文は新しテーブルを作るのではなくて
見やすいように表型に情報を表示してるだけなのですね

66:デフォルトの名無しさん
18/10/24 22:54:40.93 WtQFT3Lb.net
いや概念的には表を作ってる
表から表を作ってる
そういった理解がないとSQLは理解できない
その表からまた別の表を作るのにも利用できる

67:デフォルトの名無しさん
18/10/25 09:40:40.88 jGXKkZ/C.net
ありがとうございます!

68:デフォルトの名無しさん
18/11/03 11:37:09.06 3nMVWrto.net
テーブル名:RUN_TIME
KEY | COL | DEF_TIME | UPD_FLG
AAA | BBB | 2017-01-01 08:54:21 | NULL
AAA | CCC | 2017-01-01 08:58:31 | NULL
AAA | DDD | 2017-01-01 09:04:25 | NULL
CCC | XXX | 2017-01-02 08:57:46 | NULL
CCC | ZZZ | 2017-01-02 08:59:26 | NULL
CCC | BBB | 2017-01-02 09:05:03 | NULL

というデータが毎日朝9時付近何件かあって、
その日の08:58:00~09:02:00の間に含まれるレコードのUPD_FLGに'Y'を入れたいのですが
どういうUpdate文を書けば良いんでしょうか
update RUN_TIME set UPD_FLG='Y'
where DEF_TIME >= ??? and DEF_TIME <= ????
というようなSQLになるんだと思うのですが…。

69:デフォルトの名無しさん
18/11/03 11:52:19.27 3nMVWrto.net
調べたところ、
where DEF_TIME >= DATE_ADD(DATE(DEF_TIME),INTERVAL 538 MINUTE) and
DEF_TIME <= DATE_ADD(DATE(DEF_TIME),INTERVAL 542 MINUTE);
で行けたのですが、これって一般的なやり方でしょうか?

70:デフォルトの名無しさん
18/11/03 15:38:32.68 rSl2Ac3O.net
オレなら普通に DEF_TIME を時分秒の文字列に変換してから比較する
時分固定でその日に該当する年月日時分をいちいち組み立てようとは思わない

71:デフォルトの名無しさん
18/11/04 13:01:05.98 mRQV89co.net
日付まわりはDBによって違いがあるからなんとも言えんが、こんな可読性も実行効率も悪いSQL書いてたら説教ものだな

72:デフォルトの名無しさん
18/11/11 14:35:31.84 vUUak6BF.net
URLリンク(r2.upup.be)

73:デフォルトの名無しさん
18/11/27 18:25:45.02 2K5MWtLk.net
他人が書いたSQLでこんなのや
select T1.*
from T1 left outer join ON T1.aaa = T2.aaa
こんなのがあるんだけど
select X2.*
from X1 left outer join ON X1.aaa = X2.aaa

外部結合してるのに片方のテーブルのフィールドしか抽出してない
SQLが散見してるんだけどこれって全く外部結合する意味ないよな
意味不明すぎてイラッとしてきた

74:デフォルトの名無しさん
18/11/27 18:43:21.08 DSo9/Qg/.net
T1.aaa = T2.aaa
これは、両方の表にあるものだけを取り出す。
片方の表だけにあるものは取り出さない

75:デフォルトの名無しさん
18/11/27 18:47:04.05 2K5MWtLk.net
言いたいこともわからんのかw
過疎だしここもレベル低すぎてダメだな

76:デフォルトの名無しさん
18/11/27 19:41:43.98 dtVd+WAB.net
意味無いことはないけど、多分意図してることじゃないよ

77:デフォルトの名無しさん
18/11/27 19:47:50.54 PufIRrup.net
ID:2K5MWtLk
小さいことにイライラしてるわいきなりキレだすわ気持ち悪っw

78:デフォルトの名無しさん
18/11/27 20:13:38.58 2K5MWtLk.net
0.01㍉もキレてないけどね
このスレは初めて見て初めて書き込んだけど
こっちの言いたいことも理解できないパープリンしかいないうえに
二言目が人格攻撃とかレベル低すぎて俺にはもう無理だわw
低能

79:デフォルトの名無しさん
18/11/27 20:41:37.76 JHhXTC3j.net
joinしてるテーブルとか書いてないし、ちゃんとSQL全部見て言ってるのかあやしいな
抽出してなくてもwhereとかで使ってれば意味はあるぞ

80:デフォルトの名無しさん
18/11/27 20:44:19.89 ysmS7zNS.net
左外部結合だからT1のレコードは全部取り出される。
で、T1にあるフィールドしか取り出さないからT1そのものと一緒だな。
単に間違いか、以前はT2のフィールドも取り出してたけど編集を繰り返してる内にT2のフィールドが要らなくなってしかもT1そのもので良いことに気付いて無いとかかな。

81:デフォルトの名無しさん
18/11/27 21:08:12.03 dtVd+WAB.net
一緒にはならないよ。T2のaaaが複数あるならそれだけ同じものが出てくるよ。

82:デフォルトの名無しさん
18/11/27 21:30:18.04 ysmS7zNS.net
>>81
???
T1のフィールドしか取り出さないでしょ。

83:デフォルトの名無しさん
18/11/27 21:31:25.10 ysmS7zNS.net
ああ、レコードのことね。
でもそんなことする意味有る?

84:デフォルトの名無しさん
18/11/27 21:44:13.52 7ygBETe/.net
データパターンでわざと増幅させたい場合はありだな
意味がないならきちんとテストして取り除けばいいだけじゃん

85:デフォルトの名無しさん
18/11/27 21:50:57.15 dtVd+WAB.net
>>83だから、>>73に挙げられた情報だけじゃ判断できないよ
例えばT2がT1を色々加工した結果で、既にT2の値を外部に持ってて、それと突き合わせて比較したいためのSQLとか、かもしれない
想像するだけ無駄なので、仕事なら知ってる人を探しに行く方が良い
けど、特に何の効果も無いと結論づけるのだけは間違ってるよ。T2.aaaにunique制約があるかも分からないのだから

86:デフォルトの名無しさん
18/12/11 22:34:22.95 0Fe3pinh.net
抽象化の機能が殆どなくて、クエリのいたるところににコピペが必要な部分が出てきて、アセンブリのような扱いになっているSQLに、未来はあるのでしょうか?
仕事で他人の書いたSQLが読み解けなくて、達人に学ぶ SQL徹底指南書を読んでいるんだけど、
「豪快に GROUP BY句にも SELECT句の CASE式をコピーしてやるのがポイントです」とか身の毛もよだつ文章で既に萎えつつあります

87:デフォルトの名無しさん
18/12/11 23:14:47.15 j8P28cRB.net
>>86
SQL専門家ではなく、プログラマだが。
SQL自体は残ると思うよ。DB弄るのにはあれくらいがいい。
そもそもSQLを「手で打つ」事はあり得ないでしょ。普通はプログラミング言語経由だ。
だから抽象化したければプログラミング言語で出来るし、それで十分だ。
SQL自体に抽象化を持ち込むのは、俺は反対だね。
それはSQLでプログラミングすることに繋がっていくが、
現時点ですでにDB側にロジックを持ち込むのはろくな事にならない、ってことになってるだろ。
ある意味、プログラミング言語はロジックを記述する為に出来ているわけで、当然の話だが。
(ロジックを記述するならSQLよりプログラミング言語の方が断然いい)
それ以前に、そもそも、SQLを手で書く事がなくなりつつあるだろ。
物によってはクエリデザイナもあるし、フレームワーク等を導入した場合、隠蔽されたりする。
この意味で、SQL自体を学ぶ必要があるかは、微妙になりつつあるが。
とはいえ、
> 仕事で他人の書いたSQLが読み解けなくて
なら、リファクタするにしても読み解けるようになるまでは学ぶしかないが。
SQL自体が原始的なのは文句を言ってもしょうがないだろ。
事実として規格は古いし、DB向けのアセンブラなんだし。

88:デフォルトの名無しさん
19/01/04 14:11:21.43 HolJeFBP.net
ORM求める輩って何なんだろうなSQL書けよ

89:デフォルトの名無しさん
19/01/04 16:56:58.28 t+y7QrAc.net
ミクロサービスだとSQL要らんのよね
なのでormで楽したい

90:デフォルトの名無しさん
19/01/04 19:23:43.78 aVQoc2JA.net
>>88
インピーダンスミスマッチでググれ

91:デフォルトの名無しさん
19/01/22 06:30:06.30 PjxX9ixQ.net
CASE文のみで2番目に高い値を取得する方法はありますか?
groupbyなどは使えない制約下とさせてください。

92:デフォルトの名無しさん
19/01/22 08:19:37.13 QMgfUI4D.net
group by使わないならnot exists

93:デフォルトの名無しさん
19/01/22 16:01:09.95 vFYQiqmx.net
Order by 〇〇 Limit 2で1番目捨てる

94:デフォルトの名無しさん
19/02/16 23:27:10.19 CD9VXZwW.net
SOQLってどうですか?
自由にJOIN出来ないってどうなのよって思うんですが。

95:デフォルトの名無しさん
19/04/14 21:36:53.40 KKPn+v5/.net
SQLとMySQLの違いというか、関係ってどういう関係ですか?
MySQLがSQLの拡張?

96:デフォルトの名無しさん
19/04/14 21:53:01.78 IovzG98E.net
C言語とgccの関係

97:デフォルトの名無しさん
19/04/14 21:59:03.38 KKPn+v5/.net
文法とそれを実行する処理系統?みたいなことですか

98:デフォルトの名無しさん
19/04/14 23:36:59.84 NCCiDrpj.net
SQLは言語
MySQLは製品名、SQLでデータ操作ができる

99:デフォルトの名無しさん
19/05/17 10:15:36.61 nnDIZl0o.net
PythonでSQLiteのデータを更新中にコミットしないままプログラムが強制終了してしまった事があって
DBファイルが開けなくなったことがあったんですけど(それはバックアップを使って復帰させたんですけど)
もしバックアップを取ってなかった場合、どうやって復帰させればいいんでしょうか
-journalというファイルが残っているのでこれを使うのは予想できるのですが…

100:デフォルトの名無しさん
19/07/11 08:12:00.70 4eXCjsM2.net
Webの情報をSQLiteに書き込む処理は概ね慣れてきたんですけど
書き込んだ情報を見やすく表示したり、表示中の情報をクリックして関連項目を検索したり、
データを手動で書き換えたりするには
phpとhtmlを勉強して1からDB表示・操作システムを作るしかないんでしょうか?

101:デフォルトの名無しさん
19/09/06 01:19:58.95 vAzRz7Qo.net
VScodeでMYSQL使いたいのですが、サーバ名がわかりません。
どなたか教えてください。

102:デフォルトの名無しさん
19/12/03 08:25:14.69 OVxjKMFy.net
SQL初心者向けの書籍は何をまず読めばいいでしょうか?

103:デフォルトの名無しさん
19/12/04 02:33:43 qrz+g/1U.net
>>102
朝井淳さん
谷尻かおりさん
ミックさん

この辺の入門書を読んでおけばおk

104:デフォルトの名無しさん
19/12/04 05:09:58 yxtCj8pw.net
>>103
イラストで理解 SQLはじめて入門
朝井淳さん
スッキリわかるSQL入門第2版
中山清喬さん、飯田理恵子さん、フレアリンク監修

の2冊買ってきました。

谷尻さんとミックさんの本、後ほど確認してみたいと思います。

105:デフォルトの名無しさん
19/12/04 19:50:18.74 teYzVY+x.net
SQLは大学で習ったが、その時はどんな用途で使うのかさっぱりわからんかったわ。

106:デフォルトの名無しさん
19/12/07 16:20:20 y8T8hHHg.net
SQL徹底指南第2版誰かmercariで安くで出品してよー

107:デフォルトの名無しさん
20/12/17 13:35:51.43 rhbff53i.net
MySQLで時間を管理し、一定時間過ぎたら、
レコードをの情報を更新したいのですが、
どの様にすればできるか教えてください。
1. このようなことがMySQL単体で可能なことなのかな?
2. 可能な場合どのようにすれば実現できるの?
イメージとしてはこんな感じです。
開始時のレコード001
ID, 開始 , 終了
001, 13:00 , 13:30 ← 13:00に開始
↓ 30分経過後(同一レコードの動き(自動更新))
終了時のレコード001
ID, 開始 , 終了
001, 0 , 0 ← 13:30になったからクリア

108:デフォルトの名無しさん
20/12/17 15:15:58.94 hWtMYtoG.net
>>107
定期的にスケジュールテーブルをチェックするイベント作ればできるよ
あと開始/終了時刻をクリアするよりもステータスを別のカラムに持たせたほうがいい
URLリンク(dev.mysql.com)
リファレンス読んで分からないことがあればここじゃなくMySQLスレへどうぞ
スレリンク(db板)

109:デフォルトの名無しさん
20/12/17 15:26:22.80 rhbff53i.net
>>108
ありがとうございます。
定期的にチェックするイベントですね。
試してみます。
今後はMySQLで聞きます。
スレリンク(db板)
(^人^)ありがとうございます。

110:デフォルトの名無しさん
21/01/18 10:34:21.91 +C2vxlND.net
XreaやSAKURAなどのMySQLは、ネットからデータを閲覧したりダウンロード
できるようになっているんだけど、あのコントロールはどのCGIでやってる?
WindowsマシンにMySQLをインストールした場合、同様にデータベースの
中身を見るのはどうしたらいい?

111:デフォルトの名無しさん
21/01/18 11:57:48.25 JT9EgKXH.net
たいていのアプリ・サービスは、サーバー/クライアント方式
Linux のシステム内で動いているものは、サーバーで、
それに、Windows などのパソコンからアクセスするものは、クライアント
例えば、AWS なら、AWS Command Line Interface(AWS CLI)みたいなものを、
Windows パソコンに入れて、それでサーバーにアクセスする
MySQL 用のクライアントも探してみれば?

112:デフォルトの名無しさん
21/01/18 13:17:29.49 +C2vxlND.net
>>111
うーんと、Xreaなどのレンタルサーバーを借りると予めMySQLがインストール
されていて、確か、管理画面などからMySQLのデータベースの中に入っている
データを、普通のパソコンのブラウザからリモートで見られるようになっている。
それは、なんという名前のCGIを使っているか教えて欲しい。

113:111
21/01/18 13:48:11.67 JT9EgKXH.net
例えば、AWS なら、AWS Command Line Interface(AWS CLI)みたいなものを、
自分のWindows パソコンに入れて、それでサーバーにアクセスする
たぶん、Xrea, SAKURA でも、
Xrea CLI, SAKURA CLI みたいな同様のツールがあるのじゃないの?
そのサービス事業者に聞いてみれば?

114:デフォルトの名無しさん
21/01/18 19:38:01.83 OUq490Pl.net
>>112
phpMyAdminとかそういう話?

115:デフォルトの名無しさん
21/01/19 00:28:07.43 hiZmhE+d.net
>>114
なるほど。さんくす。
ついでに、Rubyでユーザー登録や認証をした結果をMySQLの中に
データとして貯めるようなサーバーサイドのCGIのライブラリ
みたいなものは有る?

116:デフォルトの名無しさん
21/01/19 00:45:19.71 sryyIgAN.net
>>115
Rubyなんぞ知らんし、何をやりたいのかもよくわからんから、Rubyスレで訊け
認証用のフレームワークに何を選ぶかって話で、SQLは直接関係ない

117:デフォルトの名無しさん
21/01/19 00:47:54.79 hiZmhE+d.net
Ruby on Rails の devise という「gem」が、パスワードを入力したり
メールを送って登録するようなよくある認証パターンをやってくれて、
MySQLも使ってるそうだけど、Ruby on Rails使ったことないし、
登録した MySQL のデータを上手く扱えるか不安。

118:デフォルトの名無しさん
21/02/08 13:32:01.05 0mrKmB9v.net
テーブル名にバインド変数使う事って出来ないの?
"CREATE TABLE IF NOT EXISTS ? (...);"
といった感じでテーブル名は後付けでバインドしたいんだけどsqlite3_prepare_v2が失敗する

119:デフォルトの名無しさん
21/02/08 14:34:00.76 0mrKmB9v.net
自己解決、
出来ないのが仕様だったか

120:デフォルトの名無しさん
21/02/08 16:39:30.22 KTkq0eI8.net
SQL ServerとOracleとDb2の3間を変換してくれるアプリとかありませんか?

121:デフォルトの名無しさん
21/02/09 22:59:40.19 62IhLHy8.net
質問スレ過疎ってたからこっちか

専ブラBB2Cでワッチョイを正規表現でNGしたいんだけどうまくいかない
第2オクテット(仮にXXとして)だけ固定でこれじゃダメだろうか
.*XX-.*

122:デフォルトの名無しさん
21/02/10 14:33:47.60 n+lQ6bEt.net
sqlite3_blob_openで得た列ハンドルをsqlite3_reopen_blobで使いまわすとクエリ投げるより5倍近く高速だと判明したが
nullセルやrowが見つからないとハンドル失効しちゃってopenし直さないといけないんだな
open自体はそれなりに重いから失効が多いとパフォーマンス上の利点はほとんど無しか

123:デフォルトの名無しさん
21/02/13 18:50:09.35 k+FkZinH.net
データベース板を忘れないでください

124:デフォルトの名無しさん
21/05/21 10:11:21.48 bGYKMPx3.net
2万レコードのテーブルの全行をそれぞれupdateで値を変更したいんだが、これってforでSELECTを2万回繰り返したりしたらまずいもんなの?
レンタルサーバー使ってるんだが

125:デフォルトの名無しさん
21/05/21 22:03:11.74 zqtp1sUR.net
べつにまずくはないよ。オーバーヘッドが大きいだけ。

126:デフォルトの名無しさん
21/05/22 21:16:11.45 GZBP0kYz.net
>>125
ありがとうございます。めっちゃ助かりました

127:デフォルトの名無しさん
21/07/10 13:35:16.95 0S1tAkGn.net
一個前のidからカラム取ってくることはできますか?

128:デフォルトの名無しさん
21/07/10 14:09:51.57 1/iYafxq.net
前とか後とかいう概念が、、、というのは置いといて
自分のidより小さいidの最大が該当のidだろ
あとはサブクエリなりwindow関数なりでとってこい

129:デフォルトの名無しさん
21/07/13 23:04:11.03 oBbbWw6W.net
出来たわ!ありがとう

130:デフォルトの名無しさん
21/07/22 23:59:45.26 zjMsrHKr.net
SQLの述語というのがよくわかりません

131:デフォルトの名無しさん
21/10/15 22:03:31.28 atwiHSUT.net
レコードのデータが
AAA  1
AAA 2
BBB 3
BBB 4
BBB 5
CCC 6
CCC 7
AAA 8
AAA 9
BBB 10
BBB 11
ってなってるデータから
AAA 1
BBB 3
CCC 6
AAA 8
BBB 10
みたいなデータに変換したいのですがやる方法ってありますか

132:デフォルトの名無しさん
21/10/15 22:50:54.11 p2U7IjWk.net
グループ化して、最小値だけを取り出せば?

133:デフォルトの名無しさん
21/10/16 08:56:30.04 vbkw9O81.net
どういうルールで変換するのか書かないで丸投げされてもな。
というかそれを自分で考えないからわかんないんだろう。

134:デフォルトの名無しさん
21/10/16 09:46:40.94 BnnoSLdm.net
>>131
因果関係が逆。
それが宿題なら問題が糞だからやらなくていいし、学校を変えるべき。

135:デフォルトの名無しさん
21/10/16 11:27:24.16 wy7RR+Lb.net
>>131
番号順に並んでる前提ならwindow関数を使えばできる
URLリンク(www.db-fiddle.com)

136:デフォルトの名無しさん
21/10/17 10:18:00.58 O7pSNP76.net
すまん 俺が悪かった。
みんなありがとう

例えば、下記の時系列データがあったときに、nameごとにまとめたものを別のテーブルに入れたいんだよね。
nameがはまとめたときに、IDがもっとも若いものを格納したい。
SQLで一発取れたりするかな?
ロジックを考える必要ある?
ID(PK)  name value
1 AAA 1
2 AAA 3
3 BBB 5
4 BBB 2
5 BBB 4
6 CCC 1
7 CCC 3
8 AAA 1
9 AAA 2
10 CCC 3
11 CCC 4

ID(PK)  name value
1 AAA 1
3 BBB 5
6 CCC 1
8 AAA 1
10 CCC 3

137:デフォルトの名無しさん
21/10/17 10:20:12.93 O7pSNP76.net
>>135
がやってくれたことがまさにやりたいことだわ
くわしくありがと

138:デフォルトの名無しさん
21/10/23 10:22:47.90 D86LbS/L.net
時刻昇順に並んでるデータでstatusが1~4を一塊として
縦横変換したテーブルが欲しいんですけどSQLだけじゃムリですかね。
欲しいテーブルにあるrep_idは元のテーブルにない(生成したい)です。
元のテーブル
time    status
10/1 0:01  1
10/1 1:34  2
10/1 2:00  4
10/1 22:00 2
10/1 23:32 3
10/2 1:02  4
欲しいテーブル
rep_id| status_1  | status_2   | status_3  | status_4
-----+----------+-----------+----------+--------
1   |10/1 0:01  | 10/1 1:34  | null     | 10/1 2:00
2   |null     | 10/1 23:00 | 10/1 23:32 | 10/2 1:02

139:デフォルトの名無しさん
21/10/23 10:32:24.95 D86LbS/L.net
時刻昇順に並んでるデータでstatusが1~4を一塊として
縦横変換したテーブルが欲しいんですけどSQLだけじゃムリですかね。
欲しいテーブルにあるrep_idは元のテーブルにない(生成したい)です。
元のテーブル
time    status
10/1 0:01  1
10/1 1:34  2
10/1 2:00  4
10/1 22:00 2
10/1 23:32 3
10/2 1:02  4
10/2 4:05  4
10/3 18:30 2
10/3 20:34 2
欲しいテーブル
rep_id| status_1  | status_2   | status_3  | status_4
-----+----------+-----------+----------+--------
1   |10/1 0:01  | 10/1 1:34  | null     | 10/1 2:00
2   |null     | 10/1 23:00 | 10/1 23:32 | 10/2 1:02
3   |null     | null     | null     | 10/2 4:05
4   |null     | 10/3 18:30 | null     | null
5   |null     | 10/3 20:34 | null     | null

140:デフォルトの名無しさん
21/10/24 00:25:59.14 4lHZz/Ub.net
SQLだけでやってみた
WITH
ブレークチェック AS (
SELECT
CASE WHEN LAG(status,1,NULL) OVER (ORDER BY [time]) < status
THEN 0
ELSE 1
END AS st,
[time]
FROM 元のテーブル),
開始終了 AS (
SELECT
[time],
(SELECT MIN([time]) FROM ブレークチェック WHERE st = 1 AND [time] > t.[time]) AS end_time
FROM ブレークチェック t
WHERE st = 1),
t1 AS (SELECT [time] FROM 元のテーブル WHERE [status] = 1),
t2 AS (SELECT [time] FROM 元のテーブル WHERE [status] = 2),
t3 AS (SELECT [time] FROM 元のテーブル WHERE [status] = 3),
t4 AS (SELECT [time] FROM 元のテーブル WHERE [status] = 4)
SELECT ROW_NUMBER() OVER (ORDER BY 開始終了.[time]) AS rep_id,
t1.[time] AS status_1,
t2.[time] AS status_2,
t3.[time] AS status_3,
t4.[time] AS status_4
FROM 開始終了
LEFT JOIN t1 ON t1.[time] >= 開始終了.[time] AND (t1.[time] < 開始終了.[end_time] OR 開始終了.end_time IS NULL)
LEFT JOIN t2 ON t2.[time] >= 開始終了.[time] AND (t2.[time] < 開始終了.[end_time] OR 開始終了.end_time IS NULL)
LEFT JOIN t3 ON t3.[time] >= 開始終了.[time] AND (t3.[time] < 開始終了.[end_time] OR 開始終了.end_time IS NULL)
LEFT JOIN t4 ON t4.[time] >= 開始終了.[time] AND (t4.[time] < 開始終了.[end_time] OR 開始終了.end_time IS NULL)
素直にループ回すほうがいいな

141:デフォルトの名無しさん
21/10/24 07:39:02.37 djVQHxKk.net
>>140
ありがとうございます。SQLだけでも書けるんですね
足りないstatusを補完できないかとか集計キーを作ってからとか当初の目的と外れたところで発狂してました

142:デフォルトの名無しさん
21/11/06 13:34:50.16 ABCltTaS.net
検索やら削除、CRUDをしたあとに得られるデータの命名に
rowsとかitems、個々はrowやitem
と考えています。
さらに個々rowにはdeleteやupdateのメソッドが使えるよう処理しています
つまり純粋なデータというよりインスタンス化されています
ここで疑問が。
rowという命名がしっくりこない気がします
row.column名やらrow.delete()とかで使う分にはrowで良いと思いますが
rowオブジェクトのクラス名をRowにするのはぴんとこないのです
何かいい命名案はないでしょうか
もうItemでいいかなとも思ってます

143:デフォルトの名無しさん
21/11/06 19:03:36.97 zfMx2fqR.net
Row/Columnは行/列だから表(Table)に対しての名前はフィットしていると思うがな。
気に入らなければRecord/Flieldではどうかな?

144:デフォルトの名無しさん
21/11/07 12:35:47.69 X+EdCY7G.net
ありがとうございます >>143
一括置換しても問題なくいつでも変えられそうなのでとりあえずはRowにしときます

145:デフォルトの名無しさん
21/11/14 11:47:27.97 wWg1lz8i.net
日本全国民テーブルから
年収960万円以下の世帯で、
かつ
18才未満の子供の数。
を抽出するSQLを書いて下さい

146:デフォルトの名無しさん
21/11/14 12:12:19.12 DPFsPWqC.net
>>145
日本人達テーブルには
マイナンバー、世帯主マイナンバー、生年月日、徴収税額
があるものとします。

147:デフォルトの名無しさん
21/11/14 13:47:45.91 E00roTgy.net
電通もしくはぱーそるの人か

148:デフォルトの名無しさん
21/11/14 15:11:57.53 FPcp9uu4.net
んなわけねーw
5ちゃん見てたら笑うしか無いw

149:デフォルトの名無しさん
21/11/14 15:16:56.72 mFG9NQD5.net
>>142
Ruby on Rails のO/R マッパーでは、
命名規約で決まっているから、row みたいな抽象的な名前にならない
テーブル名が複数形のmy_books(snake case)なら、
各行は、単数型のmy_book を使えばよい
クラス名は、MyBooks(Pascal, upper camel)
ファイル名は、my_book.rb

150:デフォルトの名無しさん
21/11/14 16:50:43.91 tkHjD9h1.net
便通はfirewallで5ch禁止してるからな
自宅から業務外で5chに質問描いてたらクビ

151:名無し
21/11/15 21:02:28.36 ci3J4d5Ju
SQL最初の$dsnでエラーがおきますどうすればいいですか?
PHP のバージョン: 7.4.25

152:デフォルトの名無しさん
21/11/25 19:15:00.80 zZUF+qfu.net
selectはそこそこ速いのに(30秒くらいで処理終わる) updateにすると遅くなる(10分以上)要因って何が怪しいかわかる?
抽出条件は全く一緒

153:デフォルトの名無しさん
21/11/25 19:15:06.69 zZUF+qfu.net
selectはそこそこ速いのに(30秒くらいで処理終わる) updateにすると遅くなる(10分以上)要因って何が怪しいかわかる?
抽出条件は全く一緒

154:デフォルトの名無しさん
21/11/25 20:31:30.88 662tr9PH.net
>>153
インデックスがたくさんある
Tトリガーで重い処理してる
とか?

155:デフォルトの名無しさん
21/11/25 21:42:40.77 rnpiht7q.net
selectとupdateで経過時間を比較してもあんまり意味ないよ
抽出条件は同じでもupdateは抽出後に1件1件更新処理が必要なんだから
件数が多ければそのくらいの差になっても何も不思議じゃない

156:デフォルトの名無しさん
21/12/24 16:39:20.24 unjC7EWw.net
複数のカラムのどれかに該当文字を含む行を知りたいが、
どのカラムだったかで区別したい時に、一発でやる方法ってある?
具体的には以下(2発)を一発にしたい。
SELECT 0,target FROM sometable WHERE col0 MATCH 'str' UNION SELECT 1,target FROM sometable WHERE col1 MATCH 'str' AND col0 NOT MATCH 'str';
例えば、「どのORに当たったか」を教えてくれるスカラー関数 hitplace() があったとすると、
SELECT hitplace(),target FROM sometable WHERE col0 MATCH 'str' OR col1 MATCH 'str';
に出来るのだけど。
環境はPHP+SQLite。
出力は配列の配列、 [[col0に当たった行],[col1に当たった行]] の形式で、重複はなし。
この形式にサクッと変換出来るのなら、読み出した形式は上記とは違っても可。

157:デフォルトの名無しさん
21/12/24 17:59:49.49 cMhJNtck.net
CASE式使えばできるよ
アプリかDBの設計を見直したほうがいい可能性大

158:デフォルトの名無しさん
21/12/24 19:31:42.64 unjC7EWw.net
お早い回答ありがとう。
もっと色々試すが取り急ぎ。

新案1:
SELECT CASE WHEN col0 LIKE 'str' THEN 0 WHEN col1 LIKE 'str' THEN 1 ELSE -1 END AS col,target FROM sometable WHERE col>=0;
explainでは32、他だと文法エラーらしいがSQLiteだと通る。(参考 URLリンク(rainbow-engine.com))
explain query plan では
0|0|0|SCAN TABLE tags_bulk VIRTUAL TABLE INDEX 0:
新案2:
SELECT col,target FROM (SELECT CASE WHEN col0 LIKE 'str' THEN 0 WHEN col1 LIKE 'str' THEN 1 ELSE -1 END AS col,* FROM sometable) WHERE col>=0;
他ではこう書けと言われているもの。
explainでは32で、見た目中身も同じ。explain query plan も全く同じ。

159:デフォルトの名無しさん
21/12/24 19:32:06.67 unjC7EWw.net
元:
SELECT 0,target FROM sometable WHERE col0 MATCH 'str' UNION SELECT 1,target FROM sometable WHERE col1 MATCH 'str' AND col0 NOT MATCH 'str';
explainでは同じく32だが、見た目は違う。が、読み方が分からない。
explain query planでは以下。見た目通り2周している。
1|0|0|SCAN TABLE sometable VIRTUAL TABLE INDEX 9:
2|0|0|SCAN TABLE sometable VIRTUAL TABLE INDEX 11:
0|0|0|COMPOUND SUBQUERIES 1 AND 2 USING TEMP B-TREE (UNION)

MATCHはCASEの中では使えないらしくLIKEにしている。
(Error: unable to use function MATCH in the requested contextと出る。)
MATCHだとインデックスが使える分速いはずだが2周する分遅くなるのでどうなるか。
DBやアプリ構造の改善案は今のところ思いつかない。(変更は可能)
カラムはそれぞれ別の管理なので、先に合わせる事は出来ない。

160:デフォルトの名無しさん
21/12/24 21:34:31.41 unjC7EWw.net
新案3: UNION ALL
SELECT 0,target FROM sometable WHERE col0 MATCH 'str' UNION ALL SELECT 1,target FROM sometable WHERE col1 MATCH 'str' AND col0 NOT MATCH 'str';
元はUNIONにB-TREEが必要でこの分無駄だった。
explainは23と軽くなった。explain query plan は以下。
1|0|0|SCAN TABLE sometable VIRTUAL TABLE INDEX 9:
2|0|0|SCAN TABLE sometable VIRTUAL TABLE INDEX 11:
0|0|0|COMPOUND SUBQUERIES 1 AND 2 (UNION ALL)
単発で別々にクエリすればUNION ALL 分も取れるが、単に追加してるだけなのでPHP側で結合するよりは速いはず。

今のところこの辺か。他に何かあればよろしく。
とりあえず実装して試すが、差が出るほどDBの中身が埋まるまでにはだいぶかかるとは思う。

161:デフォルトの名無しさん
21/12/24 21:37:57.02 cMhJNtck.net
>>158
その案はどちらもテーブルスキャンになってインデックス使わない
SELECT句のCASE式とは別にWHERE句に本来の条件を書く
DB構造の話はカラムとして持つべきデータじゃなくて
子テーブルの行として持つべきデータかと思ったんだけど
全文検索でいずれかのカラムに検索キーワードが含まれてる行を
どのカラムかという情報も含めて抽出する用途なんであれば
そのままでいいんじゃないかと思う

162:デフォルトの名無しさん
21/12/24 22:28:50.21 unjC7EWw.net
>>161
> その案はどちらもテーブルスキャンになってインデックス使わない
そうだが、今回はこれで仕様的にも問題ない。

俺が勘違いしてたのもあって言葉が混乱しているが、
SQLiteのFTSは全文検索仕様で、通常のインデックスは作成出来ない。
FTSで「インデックス」と言われてるのは全文検索用のキーワードインデックスで、
つまりMATCHがLIKEに比べて糞速いだけで、常に全row検索する仕様のようだ。
URLリンク(sqlite.org)
(俺がFTSの「インデックス」をここでもそのままインデックスと表記したのが不味かった。
FTS用のテーブルでは通常のインデックスでの単rowからの検索は出来ない。
《rowidだけは使えるらしいが、使っても explain query plan では scan と表示された》)

> 子テーブルの行として持つべきデータかと思ったんだけど
あーなるほど、勘がいいね。
実は元々そういう構造になっていたのだが、
下部構造のサマリを作ってしまった方が楽だからそうしようとしていて、
col0は上部から与える名前、col1は下部のそれぞれの中身の寄せ集めになってる。
だからcol0を下部構造の各行のcol1相当部分に対して混ぜ込めば、下部構造で一発クエリ出来る。
そして元々そうしていたのだが、他の都合上、管理が面倒なので変更しようとしているところ。
しかしよく分かったね。まあ妙な事をしてるからか?

まあとにかくありがとう。
今回は下部構造のサマリなので、常に全文検索で問題ない。
言葉が混乱しててごめん。

163:デフォルトの名無しさん
21/12/25 19:58:56.64 GPUeNtJx.net
NOT MATCH が使えない。(Error: unable to use function MATCH in the requested context)
ただし動的エラーで、2つ目のクエリでcol1にMATCHの後、col0にNOT MATCHのチェックで落ちるようだ。
CASEの中でも使えないし、やはりMATCHはインデックスのようだ。
ところでMATCH NOTは使える。
新案4: MATCH NOT
SELECT 0,target FROM sometable WHERE col0 MATCH 'str' UNION ALL SELECT 1,target FROM sometable WHERE col1 MATCH 'str -col0:str';
これでexplainは20、explain query plan は以下。
1|0|0|SCAN TABLE sometabke VIRTUAL TABLE INDEX 9:
2|0|0|SCAN TABLE sometable VIRTUAL TABLE INDEX 11:
0|0|0|COMPOUND SUBQUERIES 1 AND 2 (UNION ALL)
当面はこの新案4で行く予定。

164:デフォルトの名無しさん
22/05/10 17:48:54.08 .net
メモ&報告
SQLModelにてRelationshipsがうまく機能しなかったが
結論としてSQLAlchemyのバージョンを変更したらうまくいった
URLリンク(github.com)
他のバージョンは試してないが
pip install SQLAlchemy==1.4.17
でいけた
#python #SQLModel

165:デフォルトの名無しさん
22/05/28 08:36:34 2HB62XT0.net
カーソルって何のために使うの?

166:デフォルトの名無しさん
22/05/28 11:06:08.08 81XaDMLN.net
iteration

167:デフォルトの名無しさん
22/05/28 12:02:17.61 WzAPHv6Z.net
>>165
クライアント側に結果セットを全部抱えなくてもいいのと、クエリが全部終わらなくても出てきたレコードから順に
処理を進められるんで、主に対象のレコードが多いバッチ処理なんかで使う。

168:デフォルトの名無しさん
22/05/28 16:19:02.25 63kkWN4T.net
SQLでDECLARE CURSORと書くサーバーサイドのカーソルと
DBドライバーのAPIが提供するクライアントサイドのカーソルは別のもの
前者はSQLで1行単位の処理をしたい場合に使うものだけどよほど特殊な事情がない限りは使わない
後者はクライアントがクエリの結果セットを塊単位でフェッチするのに使うもので呼び名が違うこともあるが一般的に使われてる
どちらも結果セット内の次の読み込み位置を指し示す抽象オブジェクトとしての役割は同じ

169:デフォルトの名無しさん
22/06/07 20:12:44.49 SiB5OW5s.net
車テーブルがあって
車両番号 走行日 走行距離(出発) 走行距離(到着)  運転手
というカラムがあります。
各車両の現在の走行距離と、今運転手が乗っていれば運転手名が欲しいです。
乗っているという判断は
走行距離(出発)が入ってるけど到着は入ってない、という事になってます。
これってMAX関数で現在の走行距離とるクエリと、運転手データとるクエリとでJOINするしかないですよね?

170:デフォルトの名無しさん
22/06/07 22:18:49.63 vS63Cws5.net
>>169
DBMSによる
DB板で聞くといい

171:デフォルトの名無しさん
22/06/08 02:38:50.06 m+BIRTG0.net
>>169
普通にCASEで行けそうだけど
現在の走行距離とは何?
運転手が乗ってなければどうしたいの?

172:デフォルトの名無しさん
22/06/08 04:53:57.00 8AxfQ9fg.net
GROUP BYの集計項目以外のカラムの値(運転手等)をサブクエリ使わずに一発でできるかどうかという質問かと思ったが
運転手を表示する場合としない場合の分岐方法の話ならCASE式だね

173:168
22/06/08 05:07:53.00 reQXGMu0.net
>>172
そういう意図でした!
caseでもう一度試行錯誤してみます!

174:168
22/06/08 05:13:05 reQXGMu0.net
>>171
現在の運転手がいなかったらnullにしたいです。

175:168
22/06/08 19:01:35.68 o/KS6P14.net
>>169
解決しました!ありがとうございます!

176:デフォルトの名無しさん
22/06/14 14:33:53.86 eTPeyH+k.net
SQL Serverで質問です。
テーブル1
テーブル2
テーブル3
テーブル4

とテーブルはどんどん増えます。
各テーブルにはIDという数値型のフィールドがあるのですが、
テーブル名とIDの最大値の一覧表にしたいです。
INFORMATION_SCHEMAを使ってテーブル名の一覧までは出せたのですが、
それらの各IDの最大値を産出するのはどう書けばいいのでしょうか?

177:デフォルトの名無しさん
22/06/14 15:30:50.28 EXjYCut5.net
>>176
identity columnなら
SELECT IDENT_CURRENT (‘table_name’)かsys.identity_columnsのlast_value
違うなら
SELECT MAX(ID) FROM table_name

178:デフォルトの名無しさん
22/06/14 16:44:05.01 eTPeyH+k.net
>>177 ありがとうございます。
しかしながら
テーブル名 IDの最大値
テーブル1 6
テーブル2 1014
テーブル3 1990
テーブル4 74
テーブル5 1861
テーブル6 136
という感じに表示されてほしいです

179:デフォルトの名無しさん
22/06/15 20:45:45.59 W3daPLoz.net
一つのテーブルに対して、複数のクエリ(参照、更新)が同時に投げられても、テーブルロックされない限り並行して動くものなの?

180:デフォルトの名無しさん
22/06/17 01:53:08.02 qX3KJPna.net
>>179
ロックはテーブルロックだけじゃないし
同時実行できるかはハードやDBMSの機能によるんだが
まあ基本的には複数のコネクションのクエリは並列して動くと考えていいんじゃね

181:デフォルトの名無しさん
22/06/22 21:18:18.43 JRkIVgOU.net
>>178
それなら統計情報を検索すればいい話

182:デフォルトの名無しさん
22/06/29 17:50:51.99 EbiKHqB9.net
全く同じクエリの処理してるのに、時間帯によって波があるのって何が原因かな?
夜中は10秒、朝9時くらいは1時間とかザラにある
しかも、毎日波がある
こんなに気まぐれなの?

183:デフォルトの名無しさん
22/06/29 18:45:17.79 GkfgkD+E.net
>>182
そんな情報だと時間帯によって何かが変化してるとしか言えない
頑張って

184:デフォルトの名無しさん
22/06/29 18:51:34.33 IbvhvF4u.net
>>183
情報が欲しいなら、お願いしてみれば?

185:デフォルトの名無しさん
22/06/29 18:59:48.80 fypNMUMK.net
情報はタダじゃねえんだよ

186:デフォルトの名無しさん
22/06/29 21:10:29.16 RWZIP4V9.net
10秒と1時間越えで何が原因かあたりもつけられないってかなりヤバない?

187:デフォルトの名無しさん
22/06/29 21:18:34.19 zCehF1Jn.net
マシンのメモリなどの、何かのリソースが少ないのかも
例えばメモリが少ないと、1クリックしてから処理されるまで、1分掛かる。
遅すぎて何もできない

188:デフォルトの名無しさん
22/06/30 16:46:00.43 4XQ6AH+7.net
バラバラな日付が入っているテーブルから、
特定日以前3日間のレコードを取るSQL教えてください
hogeテーブル
id,date
5,2022-06-30
4,2022-06-19
3,2021-12-24
2,2021-06-03
1,2021-01-02
ここから2022-06-19以前の3日間のレコード
2022-06-19
2021-12-24
2021-06-03
を取りたいです

189:デフォルトの名無しさん
22/06/30 17:49:50.05 1+oYjPxt.net
その日付より小さくて、その日付ー3日より大きいっていうwhere条件書くだけだと思うが
日付の扱いはDBMSによって差が大きいからこれ以上はちゃんと環境書け

190:デフォルトの名無しさん
22/06/30 17:56:20.31 eK6suSY8.net
>>188
where date <= ‘2022-06-19’
order by date desc
limit 3;
上から3行取る方法はDBMSによって違うのでマニュアルを読んで

191:デフォルトの名無しさん
22/06/30 18:54:13.55 6sehYChL.net
>>190
ソートしろとは言ってないぞ

192:デフォルトの名無しさん
22/06/30 19:51:26.35 4XQ6AH+7.net
>>189
その日付ー3日は、
日付がバラバラなのでできません
>>190
これでできそうです
ありがとうございます

193:デフォルトの名無しさん
22/06/30 20:18:37.20 1+oYjPxt.net
ああ、三日じゃなくて3件分のデータが欲しいのか
日付にダブりがないなら>>190さんの方法で
ダブりがあるならdistinctなりgroup byなりしてからだな
>>191
ソートしないでできるならぜひその方法を教えてくれ

194:デフォルトの名無しさん
22/06/30 20:29:12.21 6sehYChL.net
>>193
ソートする必要がどこにあるのか?

195:デフォルトの名無しさん
22/06/30 20:31:30.23 6sehYChL.net
3日が3レコードという意味なのかどうかからわからない。

196:デフォルトの名無しさん
22/06/30 21:19:29.49 y+cu0wpZ.net
>>193
自分より大きくて指定日付以下であるレコードが3件未満となるものを選ぶ。

197:デフォルトの名無しさん
22/06/30 22:57:01.80 1+oYjPxt.net
>>196
なるほど。件数がゼロ件になるやつの考慮がいるけど、いけるのはいけそうだな
SELECT * FROM hoge T WHERE
 (SELECT count(*) FROM hoge
  WHERE hoge.[date] >t.date AND hoge.[date]<='2022-06-19'
 ) < 3 AND t.[date]<='2022-06-19'
こんな感じか
これならオフセット取れないとかwindow関数使えないDBとかでも動くな

198:デフォルトの名無しさん
22/06/30 23:12:15.50 y+cu0wpZ.net
>>191
ソートしろと言われているのにソートしないのは問題だが逆に
ソートしろと言われてないのにソートするのは構わんだろ

199:デフォルトの名無しさん
22/07/01 00:36:44.48 oYJ8x66X.net
>>198
無駄なソートはRDBMSによっては致命的な性能問題を引き起こす。

200:デフォルトの名無しさん
22/07/01 03:40:55 42pyAc9U.net
>>199
「無駄な」ソートはな
order by 書けば絶対ソートするとでも思ってるんだろうか
つかおまえソートしない方法提示できてないだろ

テーブルスキャン何回もやるぐらいならソート1回のほうがましなことも多いぞ
まあなんにせよインデックス構成とオプティマイザ次第だけどな

201:デフォルトの名無しさん
22/07/01 09:55:27.56 g3tdjjPX.net
TOP/LIMIT/FETCH FIRST + ORDER BY使ったtop-Nクエリが
相関サブクエリ使ったtop-Nクエリより遅くなるようなメジャーなDBMSがあるの?

202:デフォルトの名無しさん
22/07/02 00:59:29.77 1zpQKBp2.net
構文の話をし始めるやつはヤバい

203:デフォルトの名無しさん
22/07/02 09:03:05 Px5GXeoa.net
構文の話は誰もしてない・・・よね?

204:デフォルトの名無しさん
22/07/02 19:31:42.58 1zpQKBp2.net
内部の処理の説明をSQLの構文で説明するのは、知識がなさすぎると思うぞ。
少なくとも業務システムでは嫌われる。

205:デフォルトの名無しさん
22/07/02 20:23:17 MgQFVCuv.net
構文の話してるヤバい奴ってどれ?

というか、こういうどこに向かって話してるのかわからないようなのもなんかヤバい。

206:デフォルトの名無しさん
22/07/02 21:48:05.38 /9h4i5Tx.net
これDB板によく湧くヤバいやつだわ
そっ閉じ推奨

207:デフォルトの名無しさん
22/07/03 12:56:59.34 UY7Pdi/e.net
つかDB板の連中って何でそれが重い処理なのかまるで理解してないよね
しかも呼び出し側含めた全体最適化なんてする気もないようだし、
あいつらはSQLを手打ちでもしてるのだろうか?

208:デフォルトの名無しさん
22/07/03 21:52:19.27 3LHO0qyv.net
まるですでに重いと決まっているかのような物言い。これはヤヴァイ。

209:デフォルトの名無しさん
22/07/03 22:24:10.66 UY7Pdi/e.net
インデックスを張ってる状態での189は間違いなく軽い
DB屋はDBで済ませる傾向があるとは聞くし、
クエリプランナで最高に最適化されてリングバッファ的に動くのなら196も確かに軽いが、
そうならない場合は糞重い
俺はそこまでDBのことは知らないので、
189が第一選択肢で、速度の問題があればインデックスを張る
これで問題がある場合は、自前でカーソルをとってリングバッファを実装する
DB屋なら196がそれぞれのDBで軽いか重いか把握した状態で使うのだとは思う
ただそれは俺らプログラマとはだいぶ視点が違うと感じた

210:デフォルトの名無しさん
22/07/03 23:34:25.47 fr0a/itN.net
ソートの話は相関サブクエリを使えという話じゃなく
指定日以前の任意の3レコードなのか(ソート無し)
指定日以前の直近の3レコードなのか(ソート有り)
という違いを指摘したかったんでしょ

211:デフォルトの名無しさん
22/07/04 01:22:49.55 7pHsiooe.net
それもあるとは思ったが、187だとほぼid通りの順なのだろうし、
191で文句も言ってないので、おそらくログ的な物のラスト3行を取りたいのだろうよ
なら俺は208で言ったとおりにする
(なお俺は189ではない)
それを(実際どうなるのかは知らんが)糞遅くなりそうなSQLを出すのもいかがなものかと
質問者が悪いと言えばそうだが、
質問者のレベル推定も含めての回答にしないと、ここでは成り立たない
「ソートして良い」と勝手に決めるのが問題なら、
「ソートしてはいけない」と勝手に決めるのもまた問題でしかない
なら聞けばいいのに、それもしない
(なお、しても意味は通じず、余計に面倒になるのは見えているので、
今回のようにいきなり189で問題ないとも思うが)
なんというか、この辺の空回り具合は、文化の違いを俺は感じたよ
ただまあ俺らが特殊なのかもしれないけどな
この板では基本的にエスパー出来ないと回答は無理だし

212:デフォルトの名無しさん
22/07/12 22:08:19.53 PV1bWVal.net
SQLで4桁文字列'hhmm'とDatetime型を結合する方法って分かる?
例:
’1234’  char型
’2022/07/12 00:00:000’ datetime型 があったときに、
  ↓
2022/07/12 12:34:000  datetime型 みたいに結合したいんだけど。。

213:デフォルトの名無しさん
22/07/12 23:46:03.19 xDQ7ywi9.net
とりあえず'1234'を12と34の数字にして、元の日付に12時間と34分を足せばいいんじゃねふ
日付まわりはDBMSによって違うから
日付時刻をサポートしてるDBMSなら指定の時間、分を足す関数かなんかがあるだろうからそれ調べて使え

214:デフォルトの名無しさん
22/07/13 13:38:16.35 HJBy50ka.net
URLリンク(wandbox.org)
front-page.phpのPHPとarchive.phpのSQLをつなげたいのですが、コンテンツが何も表示されません。
どうすればよいのでしょうか…
※参考サイト
URLリンク(cosybench.com)

215:デフォルトの名無しさん
22/07/13 16:51:17.49 mLEjbAz1.net
変数設定が抜けておりました

216:デフォルトの名無しさん
22/07/13 20:55:05.36 d4+uION0.net
>>212
関数

217:デフォルトの名無しさん
22/07/15 12:26:52.71 GqllWW3Z.net
>>212
普段、日時の計算をどうやっているのか、むしろ疑問ですね。
古い本でいいから古本を買えよ!

218:デフォルトの名無しさん
22/07/25 21:13:25 FznTbXtw.net
複数のselect count(※)を1つのファイルに出力する方法教えてください。。

219:デフォルトの名無しさん
22/07/25 22:10:59.17 bIl9FMxT.net
SQLで急にファイル出力とか言われても何のこっちゃ分からんわ
シェルスクリプトで普通にappendでもしろや

220:デフォルトの名無しさん
22/07/28 20:47:41.93 oYIQQ6EM.net
ネタに反応すんな

221:デフォルトの名無しさん
22/11/10 10:38:00.26 5Ugvs3e+.net
explain analyzeを付けると1秒、付けないと30秒かかるクエリがあるのですが一般的には何が原因なのでしょうか

222:デフォルトの名無しさん
22/11/10 12:15:12.96 8Ccihq77.net
>>221
両方同じようにクエリが実行されてるのなら
結果セットの転送コストがめちゃくちゃ大きいんじゃないの?

223:デフォルトの名無しさん
22/11/17 10:16:58.88 gy0rtS5S.net
SQL Server 2022 正式リリース(米国11/16日)
MSDNダウンロードサイトでDeveloper EditionのISOリリースを確認

224:デフォルトの名無しさん
23/02/12 18:13:43.26 fJXtAG7P.net
phpMyAdmin使ってます。
型が合わないデータの入力があったとき、
拒否するか、無理やりデフォルトの値を登録するか。
それを設定するコンパネとかありますか?

225:デフォルトの名無しさん
23/08/25 10:09:06.20 AK+z9ndV.net
ストアドプロシージャって初心者用解説サイトとかで戻り値のない関数って言われてるけど普通にRETURNできるやん
歴史的な背景でもあるんか
それとも解説者か俺があほなんか

226:デフォルトの名無しさん
23/08/25 14:00:50.18 5+gJach+.net
論理演算が弱すぎる

227:デフォルトの名無しさん
23/08/25 18:18:42.69 DhQDvuMa.net
>>225
一部のDBMSの古いバージョンではOUT/INOUT引数を使わないと値を返せなかったんだよ

228:デフォルトの名無しさん
23/08/30 22:18:57.94 +4EyrP3p.net
>>4
全列nullでも?

229:デフォルトの名無しさん
23/08/31 14:07:47.09 nrSGXsFq.net
>>225
それはファンクション(関数)とストアドプロシージャの違いがあまりないDBMSの場合

230:デフォルトの名無しさん
23/08/31 14:16:19.77 nrSGXsFq.net
ファンクションは戻り値があるプロシージャという意味

231:デフォルトの名無しさん
23/08/31 14:31:41.51 6hJq0gPI.net
違う
それは特定ベンダーの勝手な解釈

232:デフォルトの名無しさん
23/08/31 15:20:59.08 nrSGXsFq.net
元はユーザー定義関数

233:デフォルトの名無しさん
23/08/31 15:26:10.21 nrSGXsFq.net
VBもAda言語もそうだけど、ファンクションプロシージャとサブプロシージャをわけているのは、プログラミング言語ではめずらしくない。
C言語、C言語に影響を受けた言語だと、わざわざ戻り値なしをvoidと書いて明確にする。
ファンクションは戻り値を利用するもの。戻り値を呼び出し側が無視できる仕様かどうかの問題。

234:デフォルトの名無しさん
23/08/31 16:29:25.54 JttiXEFt.net
SQL標準的にはプロシージャに戻り値があるかどうかはimplementation defined
戻り値があったほうが便利なので多くのDBMSベンダーはscalar valueとresult setのどちらも返せるようにしてる
一方(ストアド)ファンクションはSQL標準で戻り値が必須でscalar valueのみと定められている
プログラミング言語でファンクションとプロシージャを区別してたのは太古の昔の話
今ではもうそんな区別に価値はなくなってる
SQL標準で区別されてるのは利用方法や利用する場所が基本的に違うため

235:デフォルトの名無しさん
23/08/31 16:31:16.87 nbJL0Jax.net
MySQL系はファンクションだと、COMMITなどのトランザクション制御ができないので、あまり考えずにファンクションで統一などしてはならない。

236:デフォルトの名無しさん
23/08/31 16:41:03.73 nbJL0Jax.net
>>234
前半と後半で違う説明をしているね。
ファンクションは「関数」だ。
OUTパラメータを参照するのは「手続き」という処理だ。
プロシージャで戻り値とOUTパラメータを返す場合は、ちゃんと仕様書がないとわけのわからないものになる。

237:デフォルトの名無しさん
23/08/31 18:27:10.59 ZhVoPqIG.net
なんだこの中身のないアホなレスはw

238:デフォルトの名無しさん
23/08/31 23:06:43.05 smxtGdye.net
そもそも、DBMSの指定や前提もなく
>ストアドプロシージャって初心者用解説サイトとかで戻り値のない関数
とか書いてあるなら、そのサイトに問題があるだけの話
まあ、ちゃんと前提を読んでないか理解してない読み手の問題の可能性もあるが

239:デフォルトの名無しさん
23/09/01 20:37:48.72 5C0TsKNS.net
関数やプロシージャのことを「メソッド」と書いている書籍もあるくらいだからな。勝手な名前をつけるやつはたくさんいる。

240:デフォルトの名無しさん
23/09/01 23:32:50.20 OZcoXz6r.net
ざっくり言うと
ファンクションは1つのSQL文の中でSELECT句やWHERE句などの一部として繰り返し利用する機能を定義したもの
プロシージャはSQL文を使ったひとまとめの処理をSQL文の一部としてではなく外部から繰り返し呼び出せるように定義したもの
これが最も根本的な違い
ファンクションでトランザクション制御しようと考えてしまったりデータベースを更新しようと考えてしまう人はこの根本的違いを理解してない

241:デフォルトの名無しさん
23/09/02 22:12:45.21 9Zs5bzSj.net
そもそもプロシージャは手続きという処理という意味で、ファンクション(関数)は機能という結果を返す処理の意味。

242:デフォルトの名無しさん
23/09/02 23:45:29.35 xVr9+q3l.net
全然違う
またいい加減なことを言って振り出しに戻すのやめろ

243:デフォルトの名無しさん
23/09/16 22:45:43.61 S29731mD.net
数学がわからないんだろ

244:デフォルトの名無しさん
23/09/16 22:48:52.44 S29731mD.net
ファンクションプロシージャは結果を戻り値で返す
サブプロシージャはOUTパラメータ(引数)で返す
SQLの関数は関数(ファンクションプロシージャ)で実装しないとSQLの構文が破綻する

245:デフォルトの名無しさん
23/09/16 22:55:55.12 S29731mD.net
>>242
だから、オラクル社はAda言語をそのまま流用しただけだよ。
ANSIはファンクションの方を先に標準SQLに組み込んだだけ。
ファンクションとサブを区別しているかどうかは、Ada言語を踏襲しているかどうかの違い。
C言語のように戻り値を無視する構文がいいのか悪いのかという話だよ。

246:デフォルトの名無しさん
23/09/17 13:55:16.79 I/olJ+Ch.net
perl の戻り値の仕組みは面白いと思ったのは古い思い出

247:デフォルトの名無しさん
23/09/17 23:44:17.06 70jB6wMR.net
noSQLのスレはないの
オブジェクト指向データベースとかはsql使うのかな

248:デフォルトの名無しさん
23/09/18 11:28:48.80 +ud3D/1q.net
noSQLスレは以前はあった

249:デフォルトの名無しさん
23/10/06 19:29:28.75 Oy8bZUfG.net
>>247
データベース板を忘れないでください

250:デフォルトの名無しさん
24/02/29 15:04:09.68 YOT99MGOL
地球破壞テ□リスト自閉隊か゛ADS-Bも出さずにCH-47やら都心付近までクソ爆音航空機飛ばしまくって低周波騷音被害を引き起こしてるな
内心民間人に中指立ててる自閉隊とは國民の生命と財産を守る存在ではなく税金泥棒しなか゛ら莫大な温室効果カ゛スまき散らして
物価暴騰させて住民の権利を強奪して氣侯変動させて災害連發させて國土まで破壞して私腹を肥やすテロリストの典型た゛からな
戦爭前のウクラヰナの軍事予算はGDP比4%以上あったわけた゛し軍のク‐デターによって政権掌握されたミャンマ‐はGDP比2%台
徴兵して拒否すれば犬コ□公務員に制圧させて殺害可能な社会にしようとしてるのが岸田異次元増税憲法ガン無視地球破壞霸権主義文雄
真の防衛として利権を貪って税金泥棒して地球破壊して私権侵害して私腹を肥やすだけの人類に湧いた害虫クソ公務員を全滅させて
-刻も早く拳銃、スティンカ゛一,手榴弾を新≡種の神器にしないとお前らウクラヰナやロシアの逃亡民みたいな目に合うそ゛
ちなみにと゛ちらも逃亡民は国境警備兵に逮捕されて最前線に送られとるわ
(ref.) URLリンク(www.call4.jp)
URLリンク(haneda-project.jimdofree.com) , URLリンク(flight-route.com)
URLリンク(n-souonhigaisosyoudan.amebaownd.com)

251:デフォルトの名無しさん
24/04/15 01:05:12.02 3rGFgNqt.net
入門レベルです
環境はsqliteをsqlite3 CLIを通して使ってます
expr(式)を評価して簡易に値を確かめる方法はあったりしませんかね?
目的は学習目的の挙動把握実験と切り分けデバッグです、例えば'foo' LIKE 'f_%'とかそんなやつを試したい
sqlで実行できるのはstmt(文)のみなので、今のところexprを受け付ける何らかのstmt(文)に組み込み、その結果から値を間接的に類推してます
類推するにせよ、そもそもstmt毎に固有の意味論があるゆえ、一貫した振る舞いも得られず
なかなかしんどいです…
それっぽいCLIコマンドの.printも、シグネチャが.print STRING+なのでexpr評価がされませんし

252:デフォルトの名無しさん
24/04/15 11:17:52.57 fSSptXgn.net
>>251
> %  0文字以上の任意の文字列
> _ 任意の1文字
> [^] 除外
> URLリンク(techmania.jp)
正規表現と違い、これだけしかないのに要らないだろ。
お前は 1+1 と打って 2 と出る環境がないと死ぬ人か?

(昨今の文系馬鹿が流入してきてる)プログラミングでは、意味のないところに拘って時間を浪費する奴は多々居る。
お前もこれで、この程度なら読んだ瞬間分かるし、
(勘違いや見落としとかではなく)ガチで 'f_%' が 'foo' に一致するか分からないようならプログラミングを止めた方がいい。
普通なら、というか、自分で作りたい物があってSQLを使おうとしてる奴なら、こんなの読んだ瞬間に「はい分かった、次」でしかない。

初学者向けに環境を整備したいのであれば、インタラクティブ環境を整備する意味は大きいが、お前はそうではないのだろ。
それでも試したければ、所詮は正規表現の下位互換、どころかゴミ程度でしかないので、ブラウザでF12押してコンソールに
'foo'.search(new RegExp('f_%'.replace(/_/g,'.').replace(/%/g,'.*')))!==-1
とでも打てばいいだろうよ。でもこれもお前にとっては余計な回り道でしかないから、とっとと進むべきだと思うがな。

253:デフォルトの名無しさん
24/04/15 12:03:59.29 YG3lrvG/.net
>>252
やはり標準環境には無さそうな感じですか
LIKEはexprの一番簡単な例としてです
実際のところC系等の一般用途のプログラミング言語と比べてsqlのexpr文法って異常に複雑じゃありません?
URLリンク(sqlite.org)
ASTも印字して欲しいくらいだけど、自分でパーサ書いてみるのも勉強になりそうですね

254:デフォルトの名無しさん
24/04/15 12:45:09.95 cLz3iDP/.net
普通の言語はstmtの構成要素としてexprが設けられるが、sqlでは逆にexprの中にstmtも入り得る異色の設計だから、exprサブセットのみの評価機は作れないね
まあstmtの評価は単にモックとして構文木を組んでみれば目的には適うし良い勉強になる
区切り文字をあまり使わないSQLは初学者には目に滑る構文だから特にそう

255:デフォルトの名無しさん
24/04/15 12:57:20.78 cLz3iDP/.net
>>253
評価の確認はおとなしくSQLiteに投げて、構文解析慣れてるようだし見本はこれ参考で十分だろう
URLリンク(sqlite.org)
lemonって変わったパーサジェネレータ使ってるのけど、見た感じただのyacc変種なので出会ったトークン種別を単に印字させればよいだけ

256:デフォルトの名無しさん
24/04/15 13:34:40.60 fSSptXgn.net
>>253
> やはり標準環境には無さそうな感じですか
実際要らんしね。SQLがCLIから打てるのだから普通はそれで十分。(普通は=使う人にとっては)
PHPer連中はphpLiteAdminという、SQLがWebから打てる奴を使ってるようだが、動作レベルはCLIと同じでSQLだね。

> sqlのexpr文法って異常に複雑じゃありません?
さあ知らん.。というか俺は使う人であって、環境を構築する人ではないので、
ASTとか使ったこと無いし、yacc/lex/bisonあたりは触ったことが無い。
SQLも基本俺がコードに直接書く程度で、コード上でSQLを自動生成しようとはしたことは無いので分からん。
ただ、目がすべる=SQLの区切りがよく分からん、という感じにはならなかった気がする。カッコ使えで終わるし。

方針として「あらゆる道草を食い、遠回りしてるうちに、全体的な力が養える」という考えの奴もいるが、
今やることがあるなら変なところに拘らず先に進んで実装して行ったほうがいいと思うぜ。
その先にもどのみちハードルはあるのだから、同様に学んではいけ、目標実現に直接近づける。

> ASTも印字して欲しいくらいだけど、自分でパーサ書いてみるのも勉強になりそうですね
ちなみにASTに関心があるのなら、Goの方がいい。あれは標準でAST木を吐ける。
あと、パーサも作るのは自由だが、SQLについては公開された仕様書がなかったはず。
SQL92なら特許は切れてるはずなのだけど。
それから、もうやってるだろうがexplainコマンドでクエリプランを出せる。ASTでは無いが、まあ似たようなものではあるだろう。

257:デフォルトの名無しさん
24/04/15 14:00:04.64 YG3lrvG/.net
>>254
sqliteの構文図見直したらしっかりselect-stmtってありますねえ…
>>255
まさに求めてたやつです、どうも
各処理系のパーサも見較べるとBison向けでルール/アクションの羅列のpsqlの奴が一番わかり易かった
URLリンク(github.com)
psql用だけど拡張や高度な機能を気にする段階に無いので、ここから必要そうなのを拾い始めました
sqliteのパーサは中でゴチャゴチャ処理してるけど、psqlのパーサはparser/*.cへアクション内で呼ぶ関数がキレイに分離されていて、記述的命名から意味論まで分かるお手本のようなデザインですね
座右の文法リファレンスとして印刷してそのまま使えそうな出来栄え

258:デフォルトの名無しさん
24/04/15 14:07:24.63 YG3lrvG/.net
>>256
忠告どうも
たまたまSQLという'言語'が面白そうで規格までしっかりある良さそうなもので意欲を得ました
もしこのSQL'言語'が肌に合わなかったならば、プログラミング言語同梱のリレーショナルデータベースAPIへロールバックするでしょう
私の主眼はスレタイ通りSQLにあります

259:デフォルトの名無しさん
24/04/15 14:23:22.62 f5jIOgeT.net
既にRDBバリバリ管理やってる人こそ学ぶべき
むしろ初学が厳しい見た目のSQLだと挫折率高そう
母語に流暢でも英語をサボる理由にはならない

API通ってる環境なら必然的に埋め込みSQLも使える

260:デフォルトの名無しさん
24/04/15 14:34:25.57 fSSptXgn.net
>>258
そりゃ規格はあるよ。
ただ無料では仕様書が手に入らないらしい。勿論買えば済むらしいが。

> プログラミング言語同梱のリレーショナルデータベースAPI
てかこれ何ぞ?Oracleのことか?
そもそもDB使ってきててSQL知ラネ、ってのがかなり意味不明なのだが。
ORMの事なら、ぶっちゃけORMで済むのならORMでやるべきだと思うよ。
むしろ今時SQL手打ちか?とも言われてるはずだし。
(AccessとかでもクエリビルダーでSQLを作成してて、SQL自体をプログラマが打ち込む必要はなかったはず)

261:デフォルトの名無しさん
24/04/15 14:57:46.75 2Ew9RCgX.net
>>260
標準ライブラリ備えてるような言語には大抵RDB接続機能があって、ホストの文法に沿ってクエリ送れるやろ
例えば.NET共通のLINQとか
.NET言語毎にもあったりしてそれこそ無数

262:デフォルトの名無しさん
24/04/15 15:02:39.91 2Ew9RCgX.net
LINQはRDB以外の色々なデータベースモデルも想定してるからSQLとはかなり違う
LINQでRDB管理に習熟してもSQL知識はあまり付かないと思われ

263:デフォルトの名無しさん
24/04/15 16:16:36.38 Xey1DMe3.net
>>251
'foo' LIKE 'f_%'とかを試したいならSELECT 'foo' LIKE ‘f_%’;とすればいい
ただSQLを学ぶ目的なら実際に使うSQLでデータのほうを弄りながらいろいろ試したほうが断然効率いいよ
一つ一つ式の評価結果を実際に使うSQLとは別で確認するのは時間の無駄
URLリンク(www.db-fiddle.com)
あとプログラマー歴が長い人にありがちだけど
SQLをループと条件節のように命令型のパラダイムで捉えるのはお勧めしない
関係演算の感覚を身につける妨げになるから

264:デフォルトの名無しさん
24/04/15 16:47:19.47 fSSptXgn.net
むう?なんか書き込み失敗して内容も失ったが、覚えてる範囲でもう一度書く。
復活して同様の物が連投されてたらご容赦を。
>>261-262
LINQはSQL風にC#を書ける物で、C#のArrayに対してSQLを発行できるものではなかったと思ったが違ったか?
俺は後者だと思ってたが前者だったので絶望した。あれが有用になる局面がよく分からん。
俺が希望してたLINQ:
.NETのStreamクラスが匿名パイプ/ネットワークストリーム/ファイルの抽象クラスのように、
.NETのArrayや各種DBに対してSQLを発行できるもの
(つまり、接続先がDBなら通常通り、接続先をArrayにすればオンメモリDBとして、同一コードで一文字も変更なく動く物)
実際のLINQ:
for文を書きたくないでござる、だけのクソったれ
俺はあくまでSQLでDB管理する前提で、LINQが何らかのラッパを提供するものだと思ってた。
だから実際のLINQ見て使えねえと判断したが、全く違う方法でDB管理するのかあれは?
俺は勝手に、SQL書けるがC#書けない奴をC#側の戦力として取り込む文法かと思ってたが。

が、まあ、
> プログラミング言語同梱のリレーショナルデータベースAPI
がLINQ等を指すのはわかった。そして ID:YG3lrvG/ の書き込みを読み直すと、
もしかして自前でSQLインタフェース提供しようとしてる?
ならそれは諦めて、DBをPostgreSQL等に移行するほうが妥当だと思うぜ。

265:デフォルトの名無しさん
24/04/15 18:29:06.40 x2iyd0ju.net
>>264
めっちゃくちゃ基本的なこともわかってないからまずは公式チュートリアル的なのを読んだほうがいい
LINQ to ObjectとLINQ to SQL/DataSet/Entitiesの区別くらいは最低限つくようにしてくれ

266:デフォルトの名無しさん
24/04/15 19:25:10.27 fSSptXgn.net
>>265
なるほど俺が糞だと思ってたのはLINQ to Objectなのは分かった。
そして俺の思惑とは違い、MSはSQL対象のほうをラップしてるわけか。
俺的希望仕様ならLINQはリテラルか引数で無ければならず、ハードコードベタ書きとか意味不明だったが、
まあこれなら分からんでも無い。

が、そもそもこれはSQLが無駄に方言が増えすぎてたからMSもLINQというSQLモドキを実装しただけの気がするが。
それでもDOMだXPATHだとやるよりはLINQだけで済む方がいいのは確かだが、
ある意味新たなMSSQL方言を生み出しただけの気も。
そしてOracleもSQL方言だとは聞いてるし、やっぱRDB弄っててSQL知ラネ、ってのはよく分からない。
KVSならSQL関係ないが、そういう感じではなさそうだし。まあいいけどね。

267:デフォルトの名無しさん
24/04/16 08:55:41.54 Fr3sHPgG.net
LINQはSQLに寄せようとしてる雰囲気があるので中途半端感
普通は言語のインメモリオブジェクト操作の方へ寄せるのだが
C#, VB.NET etc.の多言語前提のデザインだからかな

まあWhereとかSelectとかキーワードを借りて文面ぱっと見だけの話

268:デフォルトの名無しさん
24/04/16 10:35:29.23 len5k1k5.net
>>267
MSなりの折衷策なんだろ。
> 言語のインメモリオブジェクト操作の方へ寄せる
これならORMが最上で、それ以上は無いからね。
PHPにはPDOという、無いよりはましだが実質的に意味が無いラッパがあるが、
あれよりはましなDBラッパを用意して、共通文法を考えました、ってところだろ。
実際、forでウダウダやるより宣言型の方が読みやすいのは確かだから、宣言型文法も取り入れたかったのだろうし。

269:デフォルトの名無しさん
24/09/22 19:26:44.50 kkG3ckzv.net
初歩的なことで申し訳ありませんがご教授ください。
idカラムに例として 5, 7, 11, 41 があります。
41, 11, 7, 5とソートしたいのですが
order by id DESC では、7, 5, 41, 11とソートされます。
なにか良い方法はございますでしょうか。
よろしくお願いします。

270: 警備員[Lv.1][新芽]
24/09/22 20:32:30.58 UdTQ7EcR.net
ORDER BY INT(id) DESC
ではどうでしょう
カラムid が文字列となっていないでしょうか

INTは DBによってことなるかも
上手くいかなかったらごめんなさい

271:デフォルトの名無しさん
24/09/23 07:02:58.03 dfCQ5A4R.net
いや「初歩的な」と言ってるんだし、
SQLではなく、テーブル作成時の間違いで、
crete table mytable (id INTEGER
とかやれと言った方がいいのでは

272:デフォルトの名無しさん
24/09/23 08:28:16.45 fL+Xy+IA.net
>>270さん
ありがとうございます!記述は異なりますが、キャストというヒントから実現できました!
助かります!
>>271さん
ありがとうございます。都合上文字列のカラムなので困っていました。
ありがとうございます!

273:デフォルトの名無しさん
24/09/23 09:03:31.51 dfCQ5A4R.net
>>272
> 都合上文字列のカラムなので
嘘だね
でもそのidをTEXTにするのは設計が間違ってるから、早い段階で直しておかないと頓挫する
でなければ壮絶クソコードの山になり、何とか動かせるだけのゴミにしかならないよ
設計的に正しい場合は、そのidが7,5,41,11とソートされて何も問題ないはず
他者の担当部分等の理由で変更出来ないのなら、つまり仕事としてやってるんだろうから、そいつや上司に聞け、ここで聞くのは悪手
(Zは同僚や上司に聞いたら恥とでも思ってるようだが、そうではなく、
部下がどの程度の技術レベルでどこまで仕事振れるかも管理範囲なのだから、分からない事は聞くべきだし、
逆にこの程度の初歩的部分すら分からないのに聞く事も許さないというのは、仕事場/上司に見切り付けるべき
そしてどうしても変更出来ないならCREATE VIEWで誤魔化した方がまだましな気もするが、まあ先に相談だろうね)
だから実際は自分でやってるんだろ、ならさっさとtable定義を直すべき

274:デフォルトの名無しさん
24/09/25 13:39:54.41 UPZugvt8.net
バカは放っとこうよ

275:デフォルトの名無しさん
24/10/14 03:33:42.65 iqlRL8W8.net
>>269
それは文字の照合順序の問題
自分でそうしたのか、他人がそうしたのか書いてないが、一文字目だけで並び替えているだけ。

276:デフォルトの名無しさん
24/10/14 03:34:54.50 iqlRL8W8.net
>>272
少なくとも製品名くらいは書こうぜ

277:デフォルトの名無しさん
24/10/14 12:40:53.49 mb36WxU5.net
>>275
新手のバカが現れたw

278:デフォルトの名無しさん
24/10/14 12:49:16.73 iqlRL8W8.net
>>277
文字列は文字コード順になるのが普通
桁数の違う数字列を比較したから、どういう結果になるかは照合順序による
数字列と数値は別物

279:デフォルトの名無しさん
24/10/14 12:50:50.99 iqlRL8W8.net
>>277
彼は7、5、4、1の順になってしまうと書いているが、アスキー文字の数字は1が先で9が後に配置されている。

280:デフォルトの名無しさん
24/10/14 14:18:28.43 /mng7eSx.net
日本語が読めないのかSQLを全く知らないのかわからんが救いようのないバカなのは間違いない

281:デフォルトの名無しさん
24/10/14 16:02:24.13 iqlRL8W8.net
11を11、41を41、5を05、7を07という風にしないと結果は不明。

282:デフォルトの名無しさん
24/10/27 09:13:31.20 Vdu9Rrcz.net
良い感じのSQLのGUIクライアントある?
たとえばカラムに連番と画像(画像元のパスなど)があって、
全てのがぞうを表示するようなものを求めてる
殆どのGUIクライアントはそういうDBだ画像は表示されなくてその画像部分のフィールドをクリックしたときに1枚だけ表示されるけど、
そうじゃなくてずらっと並んでる画像パスの入ったフィールド全ての画像を表示したいのだが

283:デフォルトの名無しさん
24/10/27 09:41:04.89 ThFiCQpU.net
自分で作るか人が作ったアプリのDB構造に合わせるかしないと無理だろ
いずれにしろSQL関係ない

284:デフォルトの名無しさん
24/10/27 15:56:39.28 Vdu9Rrcz.net
>>283
ふーん、やっぱそうなるんだ
それを知りたかったんでね
あと何かむかつくからここから俺がこのスレ乗っ取ることにするわ
日記帳がわりにする

285:デフォルトの名無しさん
24/10/28 15:33:24.71 ehQdeP61.net
>>282
MS-Access

286:デフォルトの名無しさん
24/10/28 16:27:15.25 xaz6ouOz.net
>>285
63bitで最大4Gまでしか扱えないものはノーサンキュ

287:sage
24/10/28 17:18:52.43 ehQdeP61.net
これが条件後出しカッコ悪いというやつか

288:デフォルトの名無しさん
24/10/28 17:25:09.25 Hp6dJGZ5.net
63bit 63bit 63bit 63bit
最大4G 最大4G 最大4G 最大4G

289:デフォルトの名無しさん
24/10/30 02:07:11.28 p9nsrTZ/.net
evo tech ωωω

290:デフォルトの名無しさん
24/10/30 02:37:36.07 BzmMNap8.net
>>285,287
accessは他の追随を一切赦さぬDBMS覇権(性能、機能的な意味で)だろ
事実上普及してる全てのDBMSにコネクトできる万能クライアントだし
つまり表向きの売りであるGUIガン無視したとてしても最強
GUIでポチポチした履歴と生成されるクエリ突き合わせて解読をつづけれりゃあSQL資料すら見ずともSQL書きの中の上には成れる

惜しむらくはそれだけ優れててもMSに干されそうなとこか…
OfficeからAccess抜いて別売とか正気とは思えんよ、AccessがOfficeに同梱された時は狂喜乱舞してたなあ…

他のAccessフォロワRDBMS環境はOpen/Libre(とその派生)のBaseだけれども、正
直言って...α版の域すら出てないレベルでCLI叩いててSQL直打ちの方がマシ


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch