SQLなら俺に訊け [無断転載禁止]©2ch.net

2デフォルトの名無しさん
垢版 |
2017/07/18(火) 22:00:59.52ID:siPNnjTj
count(*)の*と、select * fromの*は同じでしょうか
2017/07/20(木) 17:02:54.84ID:q+vyIcRX
>>2
同じだろ。何でそんな事が気になる?
2017/07/20(木) 17:41:19.81ID:3fjdXCU7
>>3
違うよ

select * from fooは、「fooテーブルの全カラム」という意味

count()の方は、
count(column_name)とカラム名を指定したときは、column_nameがnullではない行数が取得される
count(*)だとnullとか関係なしに全行数
52
垢版 |
2017/07/20(木) 20:03:27.83ID:fM45JSSS
>>3 >>4
ありがとう。なんとなく違う感じでうまく説明できなかったけど、>>4の通りだわ
2017/07/21(金) 05:29:05.88ID:5O09iCBm
>>4
>column_nameがnullではない行数
column_nameがnullになる事が有るの?
2017/07/21(金) 06:56:59.69ID:xjFWQMIy
スルー検定(初級)
2017/08/26(土) 19:24:02.61ID:DSilAr/A
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デフォルトの名無しさん
垢版 |
2017/08/30(水) 07:14:19.33ID:FYBJnXXr
>>8
お前は秘密の合言葉を言ってない。
「お願いします。どうか教えて下さい」
108
垢版 |
2017/08/30(水) 08:02:42.85ID:ItMe6Tvy
再帰クエリでできました

SQLは業務で使うことも多いのにSQLスレに人がいないのは寂しいですね
2017/11/03(金) 19:41:06.46ID:N8t7Jq3a
てす
12デフォルトの名無しさん
垢版 |
2017/11/03(金) 20:07:37.65ID:N8t7Jq3a
SQL初心者です。
複数のrowを一度に取りたいのですがどう書けばいいのでしょうか。
後述の(C)より効率のよい記述を探しています。
(なおRock54回避の為シングルクオートを全角に、またselectをカタカナに変更しています)

用途は掲示板で、以下のような「先頭と最近の5投稿」の取得が目的です。
https://mevius.5ch.net/tech/
環境は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)だと場合によっては中途半端なデータが返る時があり、これは避けたいのです。
なお初心者の為上記前提がいろいろ間違っているかもしれませんが、その辺はご指摘下さい。
2017/11/03(金) 22:59:45.82ID:ATL1IZSq
SQLiteがreadでトランザクション使えないって、そうだっけ?
デフォルトがrepeatable readじゃないから勘違いしてるとかじゃなくて?
2017/11/03(金) 23:25:25.83ID:N8t7Jq3a
>>13
そうなのかもしれませんが、それを変える方法が分かりません。
SQL自体はSQL92準拠らしいです。
http://www.sqlite.org/fullsql.html

ちなみにトランザクションのページはこちら。
http://www.sqlite.org/lang_transaction.html

なお、select自体は一つのトランザクションらしく、例えば上記(A)(B)を繋いで begin; commit;で囲むと、
「トランザクション中でトランザクションを開始出来ません」というエラーになります。
// Error: cannot start a transaction within a transaction
2017/11/03(金) 23:38:29.19ID:N8t7Jq3a
ああすいません、これですかね?
PRAGMA read_uncommitted;
http://www.sqlite.org/pragma.html#pragma_read_uncommitted

ここの書き方だとよく分からないのですが、
デフォは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.
> http://www.sqlite.org/lang_transaction.html
2017/11/03(金) 23:58:59.47ID:N8t7Jq3a
あ、いや、違いましたね。
read_uncomitted は制限を緩和する方向でした。
まだ全貌を把握しておらず、ここら辺はすみません。

SQLiteはseriarizableを実装しているとは書いてありますが、デフォが何かはよく分かりません。
> SQLite implements serializable transactions
> http://www.sqlite.org/transactional.html

ただまあ、今のところ複数selectをトランザクションに指定する方法が分かりません。
多分単発のselectなら自動的にトランザクション化してます。
2017/11/04(土) 01:14:38.64ID:tY9TOSMT
ちなみに記事は古いんですが、複数のselectをbegin/endで囲むことも出来るっぽいんですよね、、、
https://stackoverflow.com/questions/7349189/optimizing-select-with-transaction-under-sqlite-3

私が出来ないのは、こちらの環境の問題でしょうか?
PHP経由でのsqlite3.15.1と、コマンドラインの3.21.0の両方で駄目です。
2017/11/04(土) 01:32:35.14ID:tY9TOSMT
>>12を取り下げます。

どうやら私の書き方が悪かったようで、別々に打たないといけないらしく、
そうすればあっさり出来ました。
どうもすいません。
参考にしたページは以下です。
http://d.hatena.ne.jp/hide-K/20090623/1245752394
19デフォルトの名無しさん
垢版 |
2017/11/13(月) 20:26:57.15ID:612lbeAQ
このスレはデータベース板にいるやつのネタスレだな。

count(*)は慣習上、このように書いているだけ。
2017/12/15(金) 21:10:52.36ID:Tb0OcKpN
SQLは重いというイメージが頭から離れない
またとってくればいいだけなんだが
どうしても一度取得してきたデータを使いまわしたくてプログラムがぐしゃぐしゃになる
2017/12/16(土) 20:45:23.46ID:VEeoy7XK
ん?普通そうだが、何でぐしゃぐしゃになるのかが分からん
2017/12/16(土) 21:34:31.55ID:Bt/T1sYp
スコープの長い変数をずっと持ってないといけないから
メソッドの引数がふえて
だから作ったメソッドが使いづらい
2017/12/17(日) 11:36:00.81ID:5FGxeo64
何の言語か知らんけど、構造体とかクラスで使えば良いのでは?
取り敢えず一度取得してきたデータは使いまわすのが基本
その都度発行とか有り得んから、使いまわせるように工夫すべき
2017/12/17(日) 13:31:30.67ID:qopiqGcR
えー
せっかくDB側でSQLキャッシュしてくれる機能もってんのに
プログラムでもまたキャッシュの仕組みつくるん?
2017/12/20(水) 09:30:16.27ID:CxRyWMoc
SQLってサーバー立てるのがデフォなんですか?
2017/12/21(木) 21:57:46.42ID:URpfxR/O
そんなの使い方に依るでしょ
SQLiteのが遥かに適してるのにネットワーク型拵えてるアンチパターンはかなり見るが
この逆は滅多に見ない、SQLiteは玩具過ぎて使えないと言ってる使えない人間はかなり居る
2017/12/21(木) 22:06:03.87ID:Mqu0aN7Q
そりゃそうだろ逆にしたら作れないじゃんw
2018/01/28(日) 14:32:23.14ID:Erw8GBm0
AccessでのVBAの開発の話なんだが、他言語含めて飽きるほどコード書いてきたという人がSQLで書くようなことはしないと言うんだ。
デザインビューでクエリー作るんだって。
俺とは余りに文化が違うんだが、これって俺がおかしいのかな。
それとも彼がビックマウスなのかどっちだと思う?
2018/01/28(日) 15:54:33.89ID:BfkgINY1
Accessは知らんが。

これ見る限り、そのやり方もありだろう。
https://www.microsoft.com/japan/office/previous/xp/suminaka/access/sousa/1/sousa1_15_2_honbun.htm
http://www.microsoft-access.net/start/query-2.html

> 俺とは余りに文化が違うんだが、これって俺がおかしいのかな。
> それとも彼がビックマウスなのかどっちだと思う?
お前がおかしいことは確定だが、(ただしお前が言っている意味ではない)
彼がビッグマウスかというのは意味が分からない。(だからお前はおかしい)

そもそも、やり方は一つじゃない。どっちが正しいという考え方がおかしい。
そいつにとって効率がいい方法を使えばいいだけ。
この画面通りに動くのなら、クエリ結果画面を見ながらGUIでプログラミングできる。
手打ちでSQL書いて動かしてデバッグするより早いのは確かだよ。

同様な物に、VSのフォームデザイナがある。
さすがにあれを全部手打ちする奴はいないと思うが、技術的には出来る。
あれは毎回Form1.hをパースして表示しているだけだから。
ただしパーサは自動出力の結果を読み込む前提で全くロバストではないから、
少しでもエラーがあったら止まってしまい、それ以降デザイナが使えなくなる。
だから手打ちは推奨されていない。とはいえ、出来る。
2018/01/28(日) 15:55:43.16ID:BfkgINY1
以下は推測になるが、、、
おそらくAccessも同様に、自動作成クエリを読み込んで表示するようになっていると思われる。
その場合、手打ちでクエリを作成されると、そこでエラーが発生した場合、クエリデザイナが使えなくなってしまう。
だから、プロジェクトとして、「クエリデザイナしか使うな」みたいな縛りはあり得る。
局所的に手打ちでクエリ書いたとして、そこがデザイナ側に読み込まれないのならエラーにはなりようもないが、
後の人が手打ちでクエリを書けない人ならメンテナンスが出来なくなってしまう。

ただし、デザイナに頼りすぎると後々色々大変になるので、
中にはデザイナは最低限しか使うな、という人もいる。
フォームの場合は「イベントをデザイナで書くな」みたいになるわけだが、
Accessの場合は「クエリをデザイナで書くな」になるんじゃないかな?

だから、そこはやり方の問題だ。
どっちが正しいかではなく、どちらを選ぶかだ。当然、チームの他の人員のスキルも考慮しないといけない。
Accessの場合にどちらが主流派なのかは俺は知らない。

ただな、SQLってのはDB用アセンブラみたいなもので、
実際、そんな物をいちいち手打ちしてたら効率は上がらないだろ。
SQLは未来永劫手で書くものだ、と思っているのならお前がおかしい。
(俺は使ったこと無いが)ORMはそこを完全に隠蔽していて、SQLなんて当然自動生成で、
プログラマがいちいち書くはずもないだろ。(現実にはそうでもないらしいが、少なくともそこを目指しているだろ)
ただし、スキルとしては当然読めた方がいいし、手でも書ける人が手抜きする為にデザイナを使うのが本来は正しい。
だから君の立ち位置は間違ってはいない。
君はデザイナを覚えて、君のプロジェクトではどちらを使うか判断すればいいだけ。
既にあるプロジェクトに参加するなら、そのプロジェクトの流儀に従うしかない。

繰り返すが、俺はAccess知らないから、Accessの文化については他の人を待て。
2018/05/21(月) 19:04:06.55ID:aAfPm2kk
SQLでJOIN等の結果に別名を付けるエイリアスってありますか?
32デフォルトの名無しさん
垢版 |
2018/05/22(火) 02:42:52.45ID:BxsxaQQf
>>21
サブクエリにして別名つければ
2018/05/23(水) 11:08:43.69ID:+HKSXK/9
>>32
解決しました。ありがとうございました。
ところでミックさんの本は名著だと思いますが、セルコを読んでみたら、むちゃくちゃわかりやすくて驚きました。
プログラミングの本は洋書に限るという主張はかなり当たっていますね。
34デフォルトの名無しさん
垢版 |
2018/05/24(木) 01:57:22.85ID:UTbVU3sw
日本語でもあれだけの容量を割ければわかりやすく書けるのでは。
日本語の技術書って2000部出ればヒットの部類だって言うし
国産で6000円の本がどれだけ売れるやら(=コストがかけられるか)
楽器の教則とかも似た感じだが
勢い初心者向けの入門書が多くなり、レベルの高い本はページ数が足らなくて
分かる人だけ分かってとか分かってる人が知識の確認に使う本が多い気がする

個人的には洋書(の翻訳)は
「もうxxでxxする必要はないのです!」
みたいな無駄な例えとかジョークが多くてちょっとイラっとする時がある
2018/05/24(木) 21:00:50.73ID:tj3fGZUH
SQLで超高速スクロールシューティングゲームを作りたいのですがどこから勉強したらいいのかわかりません
2018/05/26(土) 08:25:51.19ID:ww7rlXCh
何のネタ?
2018/05/30(水) 21:07:58.36ID:mJRov030
SQLが出来なさ過ぎて今日解雇されました・・・
2018/05/31(木) 05:05:26.67ID:iPLFO8dU
SQLの勉強をした後に普通の手続き型言語の勉強をすると楽ちんさに驚く。SQLは難しいわ。
39デフォルトの名無しさん
垢版 |
2018/06/05(火) 09:59:14.61ID:tY+4OZF+
ミック氏の著書にある「WHERE句で分岐させるのは素人、
プロはSELECT句で分岐させる」を職場で実践したら異常
者扱いされて追放されたよ
2018/06/05(火) 19:17:49.83ID:EhA+zJu2
>>39
その職場は日大アメフト部か?
41デフォルトの名無しさん
垢版 |
2018/06/06(水) 22:27:26.69ID:R4gO35f9
[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文で並べ替えができるのはなぜでしょうか?
2018/06/07(木) 08:40:18.91ID:Jg+r/SZw
>>41
クイズ?
2018/06/07(木) 10:09:37.01ID:2+Xi7sa/
ミックさんの本に同じ例題があったな
2018/06/19(火) 19:15:35.13ID:67yeiw0t
n+1問題ってなんやねん

パフォーマンス低下したら何がいけないの?
45デフォルトの名無しさん
垢版 |
2018/07/04(水) 22:30:30.92ID:gFgZc5FG
KOC
2018/07/27(金) 09:24:44.45ID:kjOumEVE
文字列を追記するにはどうすると良いのでしょう?
これだと上書きされてしまいます。
どうすると良いのでしょう?

$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>');
}
2018/08/05(日) 16:50:26.11ID:ja6KHJcY
>>46
できました。
2018/08/10(金) 14:51:46.21ID:Y0WYl7hO
サマータイムが導入されたとしてUTCで時刻が記録されてテーブルで
今日の分の売り上げを集計する場合どうするのが正しいですか?
2018/08/10(金) 21:30:06.76ID:gtqPLADd
「今日」を定義しろ。
2018/08/24(金) 09:10:24.90ID:AhUX2VuR
SQLの構文ってなんであんなクソだらけなものが採用され続けているの?

insertのintoとかupdateのsetとかいらないし
updateでwhereを指定し忘れたら全レコードが更新されるのとか超危険だし
updateはID指定→値指定で更新っていうのが直感的にやりやすいのに
whereを最後に持ってこないといけない仕様のせいでid指定が最後になるし
カラムと値の指定の仕方も一貫性がないし

後方互換性としてあれらのコマンド"も"使えるならまだわかるけど
あれらのコマンド"しか"使えないとかこの業界頭おかしいんじゃないの
2018/08/24(金) 10:46:30.87ID:h+5y0En0
言いたい事は分かるし別に否定はしないのだが、糞でも広まって使われてる以上それに従わざるを得ないのさ
JSと一緒だよ
2018/08/24(金) 11:18:46.54ID:Gecec4UJ
フェールセーフの仕組みはインターフェースの実装レベルでなんとかしてねってことなんじゃないの
53デフォルトの名無しさん
垢版 |
2018/09/15(土) 19:10:17.26ID:crViL/AR
データの持たせ方を誤ってしまって、
カラム定義
時間,val1,val2,val3・・・
ってなってるんですが、val1からvalnで最大値を取りたい場合、どのようにアプローチするのがスマートですか?
54デフォルトの名無しさん
垢版 |
2018/09/15(土) 20:19:51.77ID:KIanXBkQ
時間がユニークじゃないどうしようもない状態なら
とりあえずコレでいけるハズ

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デフォルトの名無しさん
垢版 |
2018/09/15(土) 20:37:41.73ID:KIanXBkQ
運用方法のアプローチとしては
とりあえず一回全抽出してテーブルを作り直したほうがいい
こんな感じのワークテーブルをマニュアル作業で一旦作る

 id, eventno, 時刻, 項目名, 値

eventnoの部分にはとりあえずrowidつっこんどく
で、idはただのシリアル値

システムがこの形式のテーブルに落とせる運用にすれば
それからはすぐに最大値がとれるようになる
そうなるまで毎回ワークテーブル作って最大値とるようにすればいい

それまではマニュアル作業で自分でテーブルをつくりなおす
失敗したヤツがちゃんと責任もってやるようにな
2018/09/15(土) 22:24:53.50ID:VdLZkjGs
エクセルの行列を、そのまま表定義にする、馬鹿が多い

列に製品番号があれば、列1・列2・列3 と定義しよる。
それで製品番号が増えるたびに、列を増やしていくw

頭おかしいw
57デフォルトの名無しさん
垢版 |
2018/09/15(土) 22:31:40.71ID:crViL/AR
>>54
>>55
お二人共、ありがとうございます。
テーブル再定義も含め、まずは54さんの手法でこの場は凌いでみます。
58デフォルトの名無しさん
垢版 |
2018/09/15(土) 22:37:05.98ID:crViL/AR
>>57
同一IDだた。いずれにしてもサンキューです。
2018/09/16(日) 00:44:59.12ID:LDoJnfCQ
>>56
それな、まずは糞なテーブルを捨てろ
2018/09/22(土) 16:25:45.44ID:/Du2bEHB
DBの検索速度ってPC上ではかなり遅いみたいですけど
大手Webサービスはどこも一瞬で結果を返してくれますよね
あれは単にサーバーのスペックが凄いから早いんですか?
61デフォルトの名無しさん
垢版 |
2018/09/22(土) 20:22:55.42ID:U3p59MUv
>>60
「DBの検索速度ってPC上ではかなり遅いみたい」
この前提がまずよくわからんが
オンメモリやらキャッシュやら高速ネットワークやら
みんな色々工夫してるから
2018/10/23(火) 15:14:05.50ID:IWYLnZUh
初心者です。もしよろしかったら質問させてください。
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デフォルトの名無しさん
垢版 |
2018/10/23(火) 23:04:42.87ID:+Sb0MP+K
TAB1の値がほしいから
いらないなら書く必要すらない
2018/10/23(火) 23:05:20.44ID:QS1DBBVT
欲しかったからだろ。
2018/10/24(水) 13:40:18.23ID:AfSv/oYJ
ありがとうございました。
すっきりしました。
SELECT文は新しテーブルを作るのではなくて
見やすいように表型に情報を表示してるだけなのですね
66デフォルトの名無しさん
垢版 |
2018/10/24(水) 22:54:40.93ID:WtQFT3Lb
いや概念的には表を作ってる
表から表を作ってる

そういった理解がないとSQLは理解できない

その表からまた別の表を作るのにも利用できる
2018/10/25(木) 09:40:40.88ID:jGXKkZ/C
ありがとうございます!
68デフォルトの名無しさん
垢版 |
2018/11/03(土) 11:37:09.06ID:3nMVWrto
テーブル名: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になるんだと思うのですが…。
2018/11/03(土) 11:52:19.27ID:3nMVWrto
調べたところ、

where DEF_TIME >= DATE_ADD(DATE(DEF_TIME),INTERVAL 538 MINUTE) and
DEF_TIME <= DATE_ADD(DATE(DEF_TIME),INTERVAL 542 MINUTE);

で行けたのですが、これって一般的なやり方でしょうか?
70デフォルトの名無しさん
垢版 |
2018/11/03(土) 15:38:32.68ID:rSl2Ac3O
オレなら普通に DEF_TIME を時分秒の文字列に変換してから比較する
時分固定でその日に該当する年月日時分をいちいち組み立てようとは思わない
2018/11/04(日) 13:01:05.98ID:mRQV89co
日付まわりはDBによって違いがあるからなんとも言えんが、こんな可読性も実行効率も悪いSQL書いてたら説教ものだな
72デフォルトの名無しさん
垢版 |
2018/11/11(日) 14:35:31.84ID:vUUak6BF
http://r2.upup.be/wV2qsULdHm
73デフォルトの名無しさん
垢版 |
2018/11/27(火) 18:25:45.02ID:2K5MWtLk
他人が書いた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が散見してるんだけどこれって全く外部結合する意味ないよな
意味不明すぎてイラッとしてきた
2018/11/27(火) 18:43:21.08ID:DSo9/Qg/
T1.aaa = T2.aaa

これは、両方の表にあるものだけを取り出す。
片方の表だけにあるものは取り出さない
2018/11/27(火) 18:47:04.05ID:2K5MWtLk
言いたいこともわからんのかw
過疎だしここもレベル低すぎてダメだな
2018/11/27(火) 19:41:43.98ID:dtVd+WAB
意味無いことはないけど、多分意図してることじゃないよ
2018/11/27(火) 19:47:50.54ID:PufIRrup
ID:2K5MWtLk
小さいことにイライラしてるわいきなりキレだすわ気持ち悪っw
2018/11/27(火) 20:13:38.58ID:2K5MWtLk
0.01_もキレてないけどね
このスレは初めて見て初めて書き込んだけど
こっちの言いたいことも理解できないパープリンしかいないうえに
二言目が人格攻撃とかレベル低すぎて俺にはもう無理だわw
低能
2018/11/27(火) 20:41:37.76ID:JHhXTC3j
joinしてるテーブルとか書いてないし、ちゃんとSQL全部見て言ってるのかあやしいな

抽出してなくてもwhereとかで使ってれば意味はあるぞ
2018/11/27(火) 20:44:19.89ID:ysmS7zNS
左外部結合だからT1のレコードは全部取り出される。
で、T1にあるフィールドしか取り出さないからT1そのものと一緒だな。

単に間違いか、以前はT2のフィールドも取り出してたけど編集を繰り返してる内にT2のフィールドが要らなくなってしかもT1そのもので良いことに気付いて無いとかかな。
2018/11/27(火) 21:08:12.03ID:dtVd+WAB
一緒にはならないよ。T2のaaaが複数あるならそれだけ同じものが出てくるよ。
2018/11/27(火) 21:30:18.04ID:ysmS7zNS
>>81
???
T1のフィールドしか取り出さないでしょ。
2018/11/27(火) 21:31:25.10ID:ysmS7zNS
ああ、レコードのことね。
でもそんなことする意味有る?
84デフォルトの名無しさん
垢版 |
2018/11/27(火) 21:44:13.52ID:7ygBETe/
データパターンでわざと増幅させたい場合はありだな

意味がないならきちんとテストして取り除けばいいだけじゃん
2018/11/27(火) 21:50:57.15ID:dtVd+WAB
>>83だから、>>73に挙げられた情報だけじゃ判断できないよ
例えばT2がT1を色々加工した結果で、既にT2の値を外部に持ってて、それと突き合わせて比較したいためのSQLとか、かもしれない
想像するだけ無駄なので、仕事なら知ってる人を探しに行く方が良い

けど、特に何の効果も無いと結論づけるのだけは間違ってるよ。T2.aaaにunique制約があるかも分からないのだから
2018/12/11(火) 22:34:22.95ID:0Fe3pinh
抽象化の機能が殆どなくて、クエリのいたるところににコピペが必要な部分が出てきて、アセンブリのような扱いになっているSQLに、未来はあるのでしょうか?
仕事で他人の書いたSQLが読み解けなくて、達人に学ぶ SQL徹底指南書を読んでいるんだけど、
「豪快に GROUP BY句にも SELECT句の CASE式をコピーしてやるのがポイントです」とか身の毛もよだつ文章で既に萎えつつあります
2018/12/11(火) 23:14:47.15ID:j8P28cRB
>>86
SQL専門家ではなく、プログラマだが。

SQL自体は残ると思うよ。DB弄るのにはあれくらいがいい。
そもそもSQLを「手で打つ」事はあり得ないでしょ。普通はプログラミング言語経由だ。
だから抽象化したければプログラミング言語で出来るし、それで十分だ。

SQL自体に抽象化を持ち込むのは、俺は反対だね。
それはSQLでプログラミングすることに繋がっていくが、
現時点ですでにDB側にロジックを持ち込むのはろくな事にならない、ってことになってるだろ。
ある意味、プログラミング言語はロジックを記述する為に出来ているわけで、当然の話だが。
(ロジックを記述するならSQLよりプログラミング言語の方が断然いい)

それ以前に、そもそも、SQLを手で書く事がなくなりつつあるだろ。
物によってはクエリデザイナもあるし、フレームワーク等を導入した場合、隠蔽されたりする。
この意味で、SQL自体を学ぶ必要があるかは、微妙になりつつあるが。
とはいえ、
> 仕事で他人の書いたSQLが読み解けなくて
なら、リファクタするにしても読み解けるようになるまでは学ぶしかないが。

SQL自体が原始的なのは文句を言ってもしょうがないだろ。
事実として規格は古いし、DB向けのアセンブラなんだし。
2019/01/04(金) 14:11:21.43ID:HolJeFBP
ORM求める輩って何なんだろうなSQL書けよ
2019/01/04(金) 16:56:58.28ID:t+y7QrAc
ミクロサービスだとSQL要らんのよね
なのでormで楽したい
2019/01/04(金) 19:23:43.78ID:aVQoc2JA
>>88
インピーダンスミスマッチでググれ
2019/01/22(火) 06:30:06.30ID:PjxX9ixQ
CASE文のみで2番目に高い値を取得する方法はありますか?
groupbyなどは使えない制約下とさせてください。
2019/01/22(火) 08:19:37.13ID:QMgfUI4D
group by使わないならnot exists
2019/01/22(火) 16:01:09.95ID:vFYQiqmx
Order by 〇〇 Limit 2で1番目捨てる
2019/02/16(土) 23:27:10.19ID:CD9VXZwW
SOQLってどうですか?
自由にJOIN出来ないってどうなのよって思うんですが。
2019/04/14(日) 21:36:53.40ID:KKPn+v5/
SQLとMySQLの違いというか、関係ってどういう関係ですか?
MySQLがSQLの拡張?
96デフォルトの名無しさん
垢版 |
2019/04/14(日) 21:53:01.78ID:IovzG98E
C言語とgccの関係
2019/04/14(日) 21:59:03.38ID:KKPn+v5/
文法とそれを実行する処理系統?みたいなことですか
98デフォルトの名無しさん
垢版 |
2019/04/14(日) 23:36:59.84ID:NCCiDrpj
SQLは言語
MySQLは製品名、SQLでデータ操作ができる
2019/05/17(金) 10:15:36.61ID:nnDIZl0o
PythonでSQLiteのデータを更新中にコミットしないままプログラムが強制終了してしまった事があって
DBファイルが開けなくなったことがあったんですけど(それはバックアップを使って復帰させたんですけど)
もしバックアップを取ってなかった場合、どうやって復帰させればいいんでしょうか
-journalというファイルが残っているのでこれを使うのは予想できるのですが…
2019/07/11(木) 08:12:00.70ID:4eXCjsM2
Webの情報をSQLiteに書き込む処理は概ね慣れてきたんですけど
書き込んだ情報を見やすく表示したり、表示中の情報をクリックして関連項目を検索したり、
データを手動で書き換えたりするには
phpとhtmlを勉強して1からDB表示・操作システムを作るしかないんでしょうか?
2019/09/06(金) 01:19:58.95ID:vAzRz7Qo
VScodeでMYSQL使いたいのですが、サーバ名がわかりません。
どなたか教えてください。
102デフォルトの名無しさん
垢版 |
2019/12/03(火) 08:25:14.69ID:OVxjKMFy
SQL初心者向けの書籍は何をまず読めばいいでしょうか?
103デフォルトの名無しさん
垢版 |
2019/12/04(水) 02:33:43.32ID:qrz+g/1U
>>102
朝井淳さん
谷尻かおりさん
ミックさん

この辺の入門書を読んでおけばおk
2019/12/04(水) 05:09:58.36ID:yxtCj8pw
>>103
イラストで理解 SQLはじめて入門
朝井淳さん
スッキリわかるSQL入門第2版
中山清喬さん、飯田理恵子さん、フレアリンク監修

の2冊買ってきました。

谷尻さんとミックさんの本、後ほど確認してみたいと思います。
2019/12/04(水) 19:50:18.74ID:teYzVY+x
SQLは大学で習ったが、その時はどんな用途で使うのかさっぱりわからんかったわ。
106デフォルトの名無しさん
垢版 |
2019/12/07(土) 16:20:20.48ID:y8T8hHHg
SQL徹底指南第2版誰かmercariで安くで出品してよー
107デフォルトの名無しさん
垢版 |
2020/12/17(木) 13:35:51.43ID:rhbff53i
MySQLで時間を管理し、一定時間過ぎたら、
レコードをの情報を更新したいのですが、
どの様にすればできるか教えてください。

1. このようなことがMySQL単体で可能なことなのかな?
2. 可能な場合どのようにすれば実現できるの?

イメージとしてはこんな感じです。

開始時のレコード001
ID, 開始 , 終了
001, 13:00 , 13:30 ← 13:00に開始

↓ 30分経過後(同一レコードの動き(自動更新))

終了時のレコード001
ID, 開始 , 終了
001, 0 , 0 ← 13:30になったからクリア
2020/12/17(木) 15:15:58.94ID:hWtMYtoG
>>107
定期的にスケジュールテーブルをチェックするイベント作ればできるよ
あと開始/終了時刻をクリアするよりもステータスを別のカラムに持たせたほうがいい
https://dev.mysql.com/doc/refman/8.0/en/create-event.html

リファレンス読んで分からないことがあればここじゃなくMySQLスレへどうぞ
https://mevius.5ch.net/test/read.cgi/db/1499949595/
109デフォルトの名無しさん
垢版 |
2020/12/17(木) 15:26:22.80ID:rhbff53i
>>108
ありがとうございます。
定期的にチェックするイベントですね。
試してみます。

今後はMySQLで聞きます。
https://mevius.5ch.net/test/read.cgi/db/1499949595/

(^人^)ありがとうございます。
110デフォルトの名無しさん
垢版 |
2021/01/18(月) 10:34:21.91ID:+C2vxlND
XreaやSAKURAなどのMySQLは、ネットからデータを閲覧したりダウンロード
できるようになっているんだけど、あのコントロールはどのCGIでやってる?
WindowsマシンにMySQLをインストールした場合、同様にデータベースの
中身を見るのはどうしたらいい?
2021/01/18(月) 11:57:48.25ID:JT9EgKXH
たいていのアプリ・サービスは、サーバー/クライアント方式

Linux のシステム内で動いているものは、サーバーで、
それに、Windows などのパソコンからアクセスするものは、クライアント

例えば、AWS なら、AWS Command Line Interface(AWS CLI)みたいなものを、
Windows パソコンに入れて、それでサーバーにアクセスする

MySQL 用のクライアントも探してみれば?
2021/01/18(月) 13:17:29.49ID:+C2vxlND
>>111
うーんと、Xreaなどのレンタルサーバーを借りると予めMySQLがインストール
されていて、確か、管理画面などからMySQLのデータベースの中に入っている
データを、普通のパソコンのブラウザからリモートで見られるようになっている。
それは、なんという名前のCGIを使っているか教えて欲しい。
113111
垢版 |
2021/01/18(月) 13:48:11.67ID:JT9EgKXH
例えば、AWS なら、AWS Command Line Interface(AWS CLI)みたいなものを、
自分のWindows パソコンに入れて、それでサーバーにアクセスする

たぶん、Xrea, SAKURA でも、
Xrea CLI, SAKURA CLI みたいな同様のツールがあるのじゃないの?

そのサービス事業者に聞いてみれば?
2021/01/18(月) 19:38:01.83ID:OUq490Pl
>>112
phpMyAdminとかそういう話?
2021/01/19(火) 00:28:07.43ID:hiZmhE+d
>>114
なるほど。さんくす。
ついでに、Rubyでユーザー登録や認証をした結果をMySQLの中に
データとして貯めるようなサーバーサイドのCGIのライブラリ
みたいなものは有る?
2021/01/19(火) 00:45:19.71ID:sryyIgAN
>>115
Rubyなんぞ知らんし、何をやりたいのかもよくわからんから、Rubyスレで訊け
認証用のフレームワークに何を選ぶかって話で、SQLは直接関係ない
2021/01/19(火) 00:47:54.79ID:hiZmhE+d
Ruby on Rails の devise という「gem」が、パスワードを入力したり
メールを送って登録するようなよくある認証パターンをやってくれて、
MySQLも使ってるそうだけど、Ruby on Rails使ったことないし、
登録した MySQL のデータを上手く扱えるか不安。
2021/02/08(月) 13:32:01.05ID:0mrKmB9v
テーブル名にバインド変数使う事って出来ないの?
"CREATE TABLE IF NOT EXISTS ? (...);"
といった感じでテーブル名は後付けでバインドしたいんだけどsqlite3_prepare_v2が失敗する
2021/02/08(月) 14:34:00.76ID:0mrKmB9v
自己解決、
出来ないのが仕様だったか
2021/02/08(月) 16:39:30.22ID:KTkq0eI8
SQL ServerとOracleとDb2の3間を変換してくれるアプリとかありませんか?
121デフォルトの名無しさん
垢版 |
2021/02/09(火) 22:59:40.19ID:62IhLHy8
質問スレ過疎ってたからこっちか


専ブラBB2Cでワッチョイを正規表現でNGしたいんだけどうまくいかない
第2オクテット(仮にXXとして)だけ固定でこれじゃダメだろうか
.*XX-.*
2021/02/10(水) 14:33:47.60ID:n+lQ6bEt
sqlite3_blob_openで得た列ハンドルをsqlite3_reopen_blobで使いまわすとクエリ投げるより5倍近く高速だと判明したが
nullセルやrowが見つからないとハンドル失効しちゃってopenし直さないといけないんだな
open自体はそれなりに重いから失効が多いとパフォーマンス上の利点はほとんど無しか
123デフォルトの名無しさん
垢版 |
2021/02/13(土) 18:50:09.35ID:k+FkZinH
データベース板を忘れないでください
2021/05/21(金) 10:11:21.48ID:bGYKMPx3
2万レコードのテーブルの全行をそれぞれupdateで値を変更したいんだが、これってforでSELECTを2万回繰り返したりしたらまずいもんなの?

レンタルサーバー使ってるんだが
2021/05/21(金) 22:03:11.74ID:zqtp1sUR
べつにまずくはないよ。オーバーヘッドが大きいだけ。
2021/05/22(土) 21:16:11.45ID:GZBP0kYz
>>125
ありがとうございます。めっちゃ助かりました
127デフォルトの名無しさん
垢版 |
2021/07/10(土) 13:35:16.95ID:0S1tAkGn
一個前のidからカラム取ってくることはできますか?
2021/07/10(土) 14:09:51.57ID:1/iYafxq
前とか後とかいう概念が、、、というのは置いといて
自分のidより小さいidの最大が該当のidだろ
あとはサブクエリなりwindow関数なりでとってこい
129デフォルトの名無しさん
垢版 |
2021/07/13(火) 23:04:11.03ID:oBbbWw6W
出来たわ!ありがとう
2021/07/22(木) 23:59:45.26ID:zjMsrHKr
SQLの述語というのがよくわかりません
131デフォルトの名無しさん
垢版 |
2021/10/15(金) 22:03:31.28ID:atwiHSUT
レコードのデータが
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
みたいなデータに変換したいのですがやる方法ってありますか
2021/10/15(金) 22:50:54.11ID:p2U7IjWk
グループ化して、最小値だけを取り出せば?
2021/10/16(土) 08:56:30.04ID:vbkw9O81
どういうルールで変換するのか書かないで丸投げされてもな。
というかそれを自分で考えないからわかんないんだろう。
2021/10/16(土) 09:46:40.94ID:BnnoSLdm
>>131
因果関係が逆。
それが宿題なら問題が糞だからやらなくていいし、学校を変えるべき。
2021/10/16(土) 11:27:24.16ID:wy7RR+Lb
>>131
番号順に並んでる前提ならwindow関数を使えばできる
https://www.db-fiddle.com/f/qcBr41a9A6nguLARwbY1Yk/0
136デフォルトの名無しさん
垢版 |
2021/10/17(日) 10:18:00.58ID:O7pSNP76
すまん 俺が悪かった。
みんなありがとう


例えば、下記の時系列データがあったときに、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デフォルトの名無しさん
垢版 |
2021/10/17(日) 10:20:12.93ID:O7pSNP76
>>135
がやってくれたことがまさにやりたいことだわ
くわしくありがと
138デフォルトの名無しさん
垢版 |
2021/10/23(土) 10:22:47.90ID:D86LbS/L
時刻昇順に並んでるデータで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
2021/10/23(土) 10:32:24.95ID:D86LbS/L
時刻昇順に並んでるデータで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
2021/10/24(日) 00:25:59.14ID:4lHZz/Ub
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)
素直にループ回すほうがいいな
2021/10/24(日) 07:39:02.37ID:djVQHxKk
>>140
ありがとうございます。SQLだけでも書けるんですね
足りないstatusを補完できないかとか集計キーを作ってからとか当初の目的と外れたところで発狂してました
2021/11/06(土) 13:34:50.16ID:ABCltTaS
検索やら削除、CRUDをしたあとに得られるデータの命名に
rowsとかitems、個々はrowやitem
と考えています。
さらに個々rowにはdeleteやupdateのメソッドが使えるよう処理しています
つまり純粋なデータというよりインスタンス化されています
ここで疑問が。
rowという命名がしっくりこない気がします
row.column名やらrow.delete()とかで使う分にはrowで良いと思いますが
rowオブジェクトのクラス名をRowにするのはぴんとこないのです
何かいい命名案はないでしょうか
もうItemでいいかなとも思ってます
2021/11/06(土) 19:03:36.97ID:zfMx2fqR
Row/Columnは行/列だから表(Table)に対しての名前はフィットしていると思うがな。
気に入らなければRecord/Flieldではどうかな?
2021/11/07(日) 12:35:47.69ID:X+EdCY7G
ありがとうございます >>143
一括置換しても問題なくいつでも変えられそうなのでとりあえずはRowにしときます
145デフォルトの名無しさん
垢版 |
2021/11/14(日) 11:47:27.97ID:wWg1lz8i
日本全国民テーブルから
年収960万円以下の世帯で、
かつ
18才未満の子供の数。

を抽出するSQLを書いて下さい
2021/11/14(日) 12:12:19.12ID:DPFsPWqC
>>145
日本人達テーブルには

マイナンバー、世帯主マイナンバー、生年月日、徴収税額

があるものとします。
147デフォルトの名無しさん
垢版 |
2021/11/14(日) 13:47:45.91ID:E00roTgy
電通もしくはぱーそるの人か
2021/11/14(日) 15:11:57.53ID:FPcp9uu4
んなわけねーw
5ちゃん見てたら笑うしか無いw
2021/11/14(日) 15:16:56.72ID:mFG9NQD5
>>142
Ruby on Rails のO/R マッパーでは、
命名規約で決まっているから、row みたいな抽象的な名前にならない

テーブル名が複数形のmy_books(snake case)なら、
各行は、単数型のmy_book を使えばよい

クラス名は、MyBooks(Pascal, upper camel)
ファイル名は、my_book.rb
2021/11/14(日) 16:50:43.91ID:tkHjD9h1
便通はfirewallで5ch禁止してるからな
自宅から業務外で5chに質問描いてたらクビ
151デフォルトの名無しさん
垢版 |
2021/11/25(木) 19:15:00.80ID:zZUF+qfu
selectはそこそこ速いのに(30秒くらいで処理終わる) updateにすると遅くなる(10分以上)要因って何が怪しいかわかる?
抽出条件は全く一緒
152デフォルトの名無しさん
垢版 |
2021/11/25(木) 19:15:06.69ID:zZUF+qfu
selectはそこそこ速いのに(30秒くらいで処理終わる) updateにすると遅くなる(10分以上)要因って何が怪しいかわかる?
抽出条件は全く一緒
2021/11/25(木) 20:31:30.88ID:662tr9PH
>>152
インデックスがたくさんある
Tトリガーで重い処理してる
とか?
2021/11/25(木) 21:42:40.77ID:rnpiht7q
selectとupdateで経過時間を比較してもあんまり意味ないよ
抽出条件は同じでもupdateは抽出後に1件1件更新処理が必要なんだから
件数が多ければそのくらいの差になっても何も不思議じゃない
2021/12/24(金) 16:39:20.24ID:unjC7EWw
複数のカラムのどれかに該当文字を含む行を知りたいが、
どのカラムだったかで区別したい時に、一発でやる方法ってある?
具体的には以下(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に当たった行]] の形式で、重複はなし。
この形式にサクッと変換出来るのなら、読み出した形式は上記とは違っても可。
2021/12/24(金) 17:59:49.49ID:cMhJNtck
CASE式使えばできるよ

アプリかDBの設計を見直したほうがいい可能性大
2021/12/24(金) 19:31:42.64ID:unjC7EWw
お早い回答ありがとう。
もっと色々試すが取り急ぎ。


新案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だと通る。(参考 https://rainbow-engine.com/sql-howto-caseresult-where/)
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 も全く同じ。
2021/12/24(金) 19:32:06.67ID:unjC7EWw
元:
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やアプリ構造の改善案は今のところ思いつかない。(変更は可能)
カラムはそれぞれ別の管理なので、先に合わせる事は出来ない。
2021/12/24(金) 21:34:31.41ID:unjC7EWw
新案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の中身が埋まるまでにはだいぶかかるとは思う。
2021/12/24(金) 21:37:57.02ID:cMhJNtck
>>157
その案はどちらもテーブルスキャンになってインデックス使わない
SELECT句のCASE式とは別にWHERE句に本来の条件を書く

DB構造の話はカラムとして持つべきデータじゃなくて
子テーブルの行として持つべきデータかと思ったんだけど
全文検索でいずれかのカラムに検索キーワードが含まれてる行を
どのカラムかという情報も含めて抽出する用途なんであれば
そのままでいいんじゃないかと思う
2021/12/24(金) 22:28:50.21ID:unjC7EWw
>>160
> その案はどちらもテーブルスキャンになってインデックス使わない
そうだが、今回はこれで仕様的にも問題ない。


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


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


まあとにかくありがとう。
今回は下部構造のサマリなので、常に全文検索で問題ない。
言葉が混乱しててごめん。
2021/12/25(土) 19:58:56.64ID:GPUeNtJx
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で行く予定。
2022/05/10(火) 17:48:54.08
メモ&報告
SQLModelにてRelationshipsがうまく機能しなかったが
結論としてSQLAlchemyのバージョンを変更したらうまくいった
https://github.com/tiangolo/sqlmodel/issues/327#issuecomment-1116983382
他のバージョンは試してないが
pip install SQLAlchemy==1.4.17
でいけた
#python #SQLModel
164デフォルトの名無しさん
垢版 |
2022/05/28(土) 08:36:34.97ID:2HB62XT0
カーソルって何のために使うの?
165デフォルトの名無しさん
垢版 |
2022/05/28(土) 11:06:08.08ID:81XaDMLN
iteration
2022/05/28(土) 12:02:17.61ID:WzAPHv6Z
>>164
クライアント側に結果セットを全部抱えなくてもいいのと、クエリが全部終わらなくても出てきたレコードから順に
処理を進められるんで、主に対象のレコードが多いバッチ処理なんかで使う。
2022/05/28(土) 16:19:02.25ID:63kkWN4T
SQLでDECLARE CURSORと書くサーバーサイドのカーソルと
DBドライバーのAPIが提供するクライアントサイドのカーソルは別のもの

前者はSQLで1行単位の処理をしたい場合に使うものだけどよほど特殊な事情がない限りは使わない

後者はクライアントがクエリの結果セットを塊単位でフェッチするのに使うもので呼び名が違うこともあるが一般的に使われてる

どちらも結果セット内の次の読み込み位置を指し示す抽象オブジェクトとしての役割は同じ
2022/06/07(火) 20:12:44.49ID:SiB5OW5s
車テーブルがあって
車両番号 走行日 走行距離(出発) 走行距離(到着)  運転手
というカラムがあります。

各車両の現在の走行距離と、今運転手が乗っていれば運転手名が欲しいです。
乗っているという判断は
走行距離(出発)が入ってるけど到着は入ってない、という事になってます。

これってMAX関数で現在の走行距離とるクエリと、運転手データとるクエリとでJOINするしかないですよね?
2022/06/07(火) 22:18:49.63ID:vS63Cws5
>>168
DBMSによる
DB板で聞くといい
2022/06/08(水) 02:38:50.06ID:m+BIRTG0
>>168
普通にCASEで行けそうだけど

現在の走行距離とは何?
運転手が乗ってなければどうしたいの?
2022/06/08(水) 04:53:57.00ID:8AxfQ9fg
GROUP BYの集計項目以外のカラムの値(運転手等)をサブクエリ使わずに一発でできるかどうかという質問かと思ったが
運転手を表示する場合としない場合の分岐方法の話ならCASE式だね
172168
垢版 |
2022/06/08(水) 05:07:53.00ID:reQXGMu0
>>171
そういう意図でした!
caseでもう一度試行錯誤してみます!
173168
垢版 |
2022/06/08(水) 05:13:05.52ID:reQXGMu0
>>170
現在の運転手がいなかったらnullにしたいです。
174168
垢版 |
2022/06/08(水) 19:01:35.68ID:o/KS6P14
>>168
解決しました!ありがとうございます!
2022/06/14(火) 14:33:53.86ID:eTPeyH+k
SQL Serverで質問です。

テーブル1
テーブル2
テーブル3
テーブル4

とテーブルはどんどん増えます。

各テーブルにはIDという数値型のフィールドがあるのですが、
テーブル名とIDの最大値の一覧表にしたいです。

INFORMATION_SCHEMAを使ってテーブル名の一覧までは出せたのですが、
それらの各IDの最大値を産出するのはどう書けばいいのでしょうか?
2022/06/14(火) 15:30:50.28ID:EXjYCut5
>>175
identity columnなら
SELECT IDENT_CURRENT (‘table_name’)かsys.identity_columnsのlast_value
違うなら
SELECT MAX(ID) FROM table_name
2022/06/14(火) 16:44:05.01ID:eTPeyH+k
>>176 ありがとうございます。

しかしながら

テーブル名 IDの最大値
テーブル1 6
テーブル2 1014
テーブル3 1990
テーブル4 74
テーブル5 1861
テーブル6 136

という感じに表示されてほしいです
178デフォルトの名無しさん
垢版 |
2022/06/15(水) 20:45:45.59ID:W3daPLoz
一つのテーブルに対して、複数のクエリ(参照、更新)が同時に投げられても、テーブルロックされない限り並行して動くものなの?
2022/06/17(金) 01:53:08.02ID:qX3KJPna
>>178
ロックはテーブルロックだけじゃないし
同時実行できるかはハードやDBMSの機能によるんだが
まあ基本的には複数のコネクションのクエリは並列して動くと考えていいんじゃね
180デフォルトの名無しさん
垢版 |
2022/06/22(水) 21:18:18.43ID:JRkIVgOU
>>177
それなら統計情報を検索すればいい話
181デフォルトの名無しさん
垢版 |
2022/06/29(水) 17:50:51.99ID:EbiKHqB9
全く同じクエリの処理してるのに、時間帯によって波があるのって何が原因かな?
夜中は10秒、朝9時くらいは1時間とかザラにある
しかも、毎日波がある
こんなに気まぐれなの?
2022/06/29(水) 18:45:17.79ID:GkfgkD+E
>>181
そんな情報だと時間帯によって何かが変化してるとしか言えない
頑張って
2022/06/29(水) 18:51:34.33ID:IbvhvF4u
>>182
情報が欲しいなら、お願いしてみれば?
2022/06/29(水) 18:59:48.80ID:fypNMUMK
情報はタダじゃねえんだよ
2022/06/29(水) 21:10:29.16ID:RWZIP4V9
10秒と1時間越えで何が原因かあたりもつけられないってかなりヤバない?
2022/06/29(水) 21:18:34.19ID:zCehF1Jn
マシンのメモリなどの、何かのリソースが少ないのかも

例えばメモリが少ないと、1クリックしてから処理されるまで、1分掛かる。
遅すぎて何もできない
2022/06/30(木) 16:46:00.43ID:4XQ6AH+7
バラバラな日付が入っているテーブルから、
特定日以前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
を取りたいです
2022/06/30(木) 17:49:50.05ID:1+oYjPxt
その日付より小さくて、その日付ー3日より大きいっていうwhere条件書くだけだと思うが

日付の扱いはDBMSによって差が大きいからこれ以上はちゃんと環境書け
2022/06/30(木) 17:56:20.31ID:eK6suSY8
>>187
where date <= ‘2022-06-19’
order by date desc
limit 3;

上から3行取る方法はDBMSによって違うのでマニュアルを読んで
190デフォルトの名無しさん
垢版 |
2022/06/30(木) 18:54:13.55ID:6sehYChL
>>189
ソートしろとは言ってないぞ
2022/06/30(木) 19:51:26.35ID:4XQ6AH+7
>>188
その日付ー3日は、
日付がバラバラなのでできません

>>189
これでできそうです
ありがとうございます
2022/06/30(木) 20:18:37.20ID:1+oYjPxt
ああ、三日じゃなくて3件分のデータが欲しいのか
日付にダブりがないなら>>189さんの方法で
ダブりがあるならdistinctなりgroup byなりしてからだな

>>190
ソートしないでできるならぜひその方法を教えてくれ
193デフォルトの名無しさん
垢版 |
2022/06/30(木) 20:29:12.21ID:6sehYChL
>>192
ソートする必要がどこにあるのか?
194デフォルトの名無しさん
垢版 |
2022/06/30(木) 20:31:30.23ID:6sehYChL
3日が3レコードという意味なのかどうかからわからない。
2022/06/30(木) 21:19:29.49ID:y+cu0wpZ
>>192
自分より大きくて指定日付以下であるレコードが3件未満となるものを選ぶ。
2022/06/30(木) 22:57:01.80ID:1+oYjPxt
>>195
なるほど。件数がゼロ件になるやつの考慮がいるけど、いけるのはいけそうだな
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とかでも動くな
2022/06/30(木) 23:12:15.50ID:y+cu0wpZ
>>190
ソートしろと言われているのにソートしないのは問題だが逆に
ソートしろと言われてないのにソートするのは構わんだろ
198デフォルトの名無しさん
垢版 |
2022/07/01(金) 00:36:44.48ID:oYJ8x66X
>>197
無駄なソートはRDBMSによっては致命的な性能問題を引き起こす。
2022/07/01(金) 03:40:55.11ID:42pyAc9U
>>198
「無駄な」ソートはな
order by 書けば絶対ソートするとでも思ってるんだろうか
つかおまえソートしない方法提示できてないだろ

テーブルスキャン何回もやるぐらいならソート1回のほうがましなことも多いぞ
まあなんにせよインデックス構成とオプティマイザ次第だけどな
2022/07/01(金) 09:55:27.56ID:g3tdjjPX
TOP/LIMIT/FETCH FIRST + ORDER BY使ったtop-Nクエリが
相関サブクエリ使ったtop-Nクエリより遅くなるようなメジャーなDBMSがあるの?
201デフォルトの名無しさん
垢版 |
2022/07/02(土) 00:59:29.77ID:1zpQKBp2
構文の話をし始めるやつはヤバい
2022/07/02(土) 09:03:05.11ID:Px5GXeoa
構文の話は誰もしてない・・・よね?
203デフォルトの名無しさん
垢版 |
2022/07/02(土) 19:31:42.58ID:1zpQKBp2
内部の処理の説明をSQLの構文で説明するのは、知識がなさすぎると思うぞ。

少なくとも業務システムでは嫌われる。
2022/07/02(土) 20:23:17.28ID:MgQFVCuv
構文の話してるヤバい奴ってどれ?

というか、こういうどこに向かって話してるのかわからないようなのもなんかヤバい。
2022/07/02(土) 21:48:05.38ID:/9h4i5Tx
これDB板によく湧くヤバいやつだわ
そっ閉じ推奨
2022/07/03(日) 12:56:59.34ID:UY7Pdi/e
つかDB板の連中って何でそれが重い処理なのかまるで理解してないよね
しかも呼び出し側含めた全体最適化なんてする気もないようだし、
あいつらはSQLを手打ちでもしてるのだろうか?
2022/07/03(日) 21:52:19.27ID:3LHO0qyv
まるですでに重いと決まっているかのような物言い。これはヤヴァイ。
2022/07/03(日) 22:24:10.66ID:UY7Pdi/e
インデックスを張ってる状態での189は間違いなく軽い
DB屋はDBで済ませる傾向があるとは聞くし、
クエリプランナで最高に最適化されてリングバッファ的に動くのなら196も確かに軽いが、
そうならない場合は糞重い

俺はそこまでDBのことは知らないので、
189が第一選択肢で、速度の問題があればインデックスを張る
これで問題がある場合は、自前でカーソルをとってリングバッファを実装する

DB屋なら196がそれぞれのDBで軽いか重いか把握した状態で使うのだとは思う
ただそれは俺らプログラマとはだいぶ視点が違うと感じた
2022/07/03(日) 23:34:25.47ID:fr0a/itN
ソートの話は相関サブクエリを使えという話じゃなく
指定日以前の任意の3レコードなのか(ソート無し)
指定日以前の直近の3レコードなのか(ソート有り)
という違いを指摘したかったんでしょ
2022/07/04(月) 01:22:49.55ID:7pHsiooe
それもあるとは思ったが、187だとほぼid通りの順なのだろうし、
191で文句も言ってないので、おそらくログ的な物のラスト3行を取りたいのだろうよ

なら俺は208で言ったとおりにする
(なお俺は189ではない)
それを(実際どうなるのかは知らんが)糞遅くなりそうなSQLを出すのもいかがなものかと

質問者が悪いと言えばそうだが、
質問者のレベル推定も含めての回答にしないと、ここでは成り立たない

「ソートして良い」と勝手に決めるのが問題なら、
「ソートしてはいけない」と勝手に決めるのもまた問題でしかない
なら聞けばいいのに、それもしない
(なお、しても意味は通じず、余計に面倒になるのは見えているので、
今回のようにいきなり189で問題ないとも思うが)
なんというか、この辺の空回り具合は、文化の違いを俺は感じたよ

ただまあ俺らが特殊なのかもしれないけどな
この板では基本的にエスパー出来ないと回答は無理だし
211デフォルトの名無しさん
垢版 |
2022/07/12(火) 22:08:19.53ID:PV1bWVal
SQLで4桁文字列'hhmm'とDatetime型を結合する方法って分かる?

例:
’1234’  char型
’2022/07/12 00:00:000’ datetime型 があったときに、
  ↓
2022/07/12 12:34:000  datetime型 みたいに結合したいんだけど。。
2022/07/12(火) 23:46:03.19ID:xDQ7ywi9
とりあえず'1234'を12と34の数字にして、元の日付に12時間と34分を足せばいいんじゃねふ

日付まわりはDBMSによって違うから
日付時刻をサポートしてるDBMSなら指定の時間、分を足す関数かなんかがあるだろうからそれ調べて使え
213デフォルトの名無しさん
垢版 |
2022/07/13(水) 13:38:16.35ID:HJBy50ka
https://wandbox.org/permlink/TWt0aMILwOZlhQwu
front-page.phpのPHPとarchive.phpのSQLをつなげたいのですが、コンテンツが何も表示されません。
どうすればよいのでしょうか…

※参考サイト
https://cosybench.com/customize-wp-archives-look/
214デフォルトの名無しさん
垢版 |
2022/07/13(水) 16:51:17.49ID:mLEjbAz1
変数設定が抜けておりました
215デフォルトの名無しさん
垢版 |
2022/07/13(水) 20:55:05.36ID:d4+uION0
>>211
関数
216デフォルトの名無しさん
垢版 |
2022/07/15(金) 12:26:52.71ID:GqllWW3Z
>>211
普段、日時の計算をどうやっているのか、むしろ疑問ですね。

古い本でいいから古本を買えよ!
2022/07/25(月) 21:13:25.51ID:FznTbXtw
複数のselect count(※)を1つのファイルに出力する方法教えてください。。
2022/07/25(月) 22:10:59.17ID:bIl9FMxT
SQLで急にファイル出力とか言われても何のこっちゃ分からんわ
シェルスクリプトで普通にappendでもしろや
219デフォルトの名無しさん
垢版 |
2022/07/28(木) 20:47:41.93ID:oYIQQ6EM
ネタに反応すんな
2022/11/10(木) 10:38:00.26ID:5Ugvs3e+
explain analyzeを付けると1秒、付けないと30秒かかるクエリがあるのですが一般的には何が原因なのでしょうか
221デフォルトの名無しさん
垢版 |
2022/11/10(木) 12:15:12.96ID:8Ccihq77
>>220
両方同じようにクエリが実行されてるのなら
結果セットの転送コストがめちゃくちゃ大きいんじゃないの?
2022/11/17(木) 10:16:58.88ID:gy0rtS5S
SQL Server 2022 正式リリース(米国11/16日)
MSDNダウンロードサイトでDeveloper EditionのISOリリースを確認
2023/02/12(日) 18:13:43.26ID:fJXtAG7P
phpMyAdmin使ってます。
型が合わないデータの入力があったとき、
拒否するか、無理やりデフォルトの値を登録するか。
それを設定するコンパネとかありますか?
224デフォルトの名無しさん
垢版 |
2023/08/25(金) 10:09:06.20ID:AK+z9ndV
ストアドプロシージャって初心者用解説サイトとかで戻り値のない関数って言われてるけど普通にRETURNできるやん
歴史的な背景でもあるんか
それとも解説者か俺があほなんか
225デフォルトの名無しさん
垢版 |
2023/08/25(金) 14:00:50.18ID:5+gJach+
論理演算が弱すぎる
2023/08/25(金) 18:18:42.69ID:DhQDvuMa
>>224
一部のDBMSの古いバージョンではOUT/INOUT引数を使わないと値を返せなかったんだよ
227デフォルトの名無しさん
垢版 |
2023/08/30(水) 22:18:57.94ID:+4EyrP3p
>>4
全列nullでも?
228デフォルトの名無しさん
垢版 |
2023/08/31(木) 14:07:47.09ID:nrSGXsFq
>>224
それはファンクション(関数)とストアドプロシージャの違いがあまりないDBMSの場合
229デフォルトの名無しさん
垢版 |
2023/08/31(木) 14:16:19.77ID:nrSGXsFq
ファンクションは戻り値があるプロシージャという意味
2023/08/31(木) 14:31:41.51ID:6hJq0gPI
違う
それは特定ベンダーの勝手な解釈
231デフォルトの名無しさん
垢版 |
2023/08/31(木) 15:20:59.08ID:nrSGXsFq
元はユーザー定義関数
232デフォルトの名無しさん
垢版 |
2023/08/31(木) 15:26:10.21ID:nrSGXsFq
VBもAda言語もそうだけど、ファンクションプロシージャとサブプロシージャをわけているのは、プログラミング言語ではめずらしくない。

C言語、C言語に影響を受けた言語だと、わざわざ戻り値なしをvoidと書いて明確にする。

ファンクションは戻り値を利用するもの。戻り値を呼び出し側が無視できる仕様かどうかの問題。
2023/08/31(木) 16:29:25.54ID:JttiXEFt
SQL標準的にはプロシージャに戻り値があるかどうかはimplementation defined
戻り値があったほうが便利なので多くのDBMSベンダーはscalar valueとresult setのどちらも返せるようにしてる
一方(ストアド)ファンクションはSQL標準で戻り値が必須でscalar valueのみと定められている

プログラミング言語でファンクションとプロシージャを区別してたのは太古の昔の話
今ではもうそんな区別に価値はなくなってる
SQL標準で区別されてるのは利用方法や利用する場所が基本的に違うため
234デフォルトの名無しさん
垢版 |
2023/08/31(木) 16:31:16.87ID:nbJL0Jax
MySQL系はファンクションだと、COMMITなどのトランザクション制御ができないので、あまり考えずにファンクションで統一などしてはならない。
235デフォルトの名無しさん
垢版 |
2023/08/31(木) 16:41:03.73ID:nbJL0Jax
>>233
前半と後半で違う説明をしているね。

ファンクションは「関数」だ。

OUTパラメータを参照するのは「手続き」という処理だ。

プロシージャで戻り値とOUTパラメータを返す場合は、ちゃんと仕様書がないとわけのわからないものになる。
2023/08/31(木) 18:27:10.59ID:ZhVoPqIG
なんだこの中身のないアホなレスはw
2023/08/31(木) 23:06:43.05ID:smxtGdye
そもそも、DBMSの指定や前提もなく
>ストアドプロシージャって初心者用解説サイトとかで戻り値のない関数
とか書いてあるなら、そのサイトに問題があるだけの話

まあ、ちゃんと前提を読んでないか理解してない読み手の問題の可能性もあるが
238デフォルトの名無しさん
垢版 |
2023/09/01(金) 20:37:48.72ID:5C0TsKNS
関数やプロシージャのことを「メソッド」と書いている書籍もあるくらいだからな。勝手な名前をつけるやつはたくさんいる。
2023/09/01(金) 23:32:50.20ID:OZcoXz6r
ざっくり言うと
ファンクションは1つのSQL文の中でSELECT句やWHERE句などの一部として繰り返し利用する機能を定義したもの
プロシージャはSQL文を使ったひとまとめの処理をSQL文の一部としてではなく外部から繰り返し呼び出せるように定義したもの
これが最も根本的な違い

ファンクションでトランザクション制御しようと考えてしまったりデータベースを更新しようと考えてしまう人はこの根本的違いを理解してない
240デフォルトの名無しさん
垢版 |
2023/09/02(土) 22:12:45.21ID:9Zs5bzSj
そもそもプロシージャは手続きという処理という意味で、ファンクション(関数)は機能という結果を返す処理の意味。
2023/09/02(土) 23:45:29.35ID:xVr9+q3l
全然違う
またいい加減なことを言って振り出しに戻すのやめろ
242デフォルトの名無しさん
垢版 |
2023/09/16(土) 22:45:43.61ID:S29731mD
数学がわからないんだろ
243デフォルトの名無しさん
垢版 |
2023/09/16(土) 22:48:52.44ID:S29731mD
ファンクションプロシージャは結果を戻り値で返す

サブプロシージャはOUTパラメータ(引数)で返す

SQLの関数は関数(ファンクションプロシージャ)で実装しないとSQLの構文が破綻する
244デフォルトの名無しさん
垢版 |
2023/09/16(土) 22:55:55.12ID:S29731mD
>>241
だから、オラクル社はAda言語をそのまま流用しただけだよ。

ANSIはファンクションの方を先に標準SQLに組み込んだだけ。

ファンクションとサブを区別しているかどうかは、Ada言語を踏襲しているかどうかの違い。

C言語のように戻り値を無視する構文がいいのか悪いのかという話だよ。
245デフォルトの名無しさん
垢版 |
2023/09/17(日) 13:55:16.79ID:I/olJ+Ch
perl の戻り値の仕組みは面白いと思ったのは古い思い出
2023/09/17(日) 23:44:17.06ID:70jB6wMR
noSQLのスレはないの
オブジェクト指向データベースとかはsql使うのかな
247デフォルトの名無しさん
垢版 |
2023/09/18(月) 11:28:48.80ID:+ud3D/1q
noSQLスレは以前はあった
248デフォルトの名無しさん
垢版 |
2023/10/06(金) 19:29:28.75ID:Oy8bZUfG
>>246
データベース板を忘れないでください
2024/04/15(月) 01:05:12.02ID:3rGFgNqt
入門レベルです
環境はsqliteをsqlite3 CLIを通して使ってます

expr(式)を評価して簡易に値を確かめる方法はあったりしませんかね?
目的は学習目的の挙動把握実験と切り分けデバッグです、例えば'foo' LIKE 'f_%'とかそんなやつを試したい

sqlで実行できるのはstmt(文)のみなので、今のところexprを受け付ける何らかのstmt(文)に組み込み、その結果から値を間接的に類推してます
類推するにせよ、そもそもstmt毎に固有の意味論があるゆえ、一貫した振る舞いも得られず
なかなかしんどいです…

それっぽいCLIコマンドの.printも、シグネチャが.print STRING+なのでexpr評価がされませんし
2024/04/15(月) 11:17:52.57ID:fSSptXgn
>>249
> %  0文字以上の任意の文字列
> _ 任意の1文字
> [^] 除外
> https://techmania.jp/blog/sql-like/
正規表現と違い、これだけしかないのに要らないだろ。
お前は 1+1 と打って 2 と出る環境がないと死ぬ人か?

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

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

LIKEはexprの一番簡単な例としてです
実際のところC系等の一般用途のプログラミング言語と比べてsqlのexpr文法って異常に複雑じゃありません?
https://sqlite.org/lang_expr.html

ASTも印字して欲しいくらいだけど、自分でパーサ書いてみるのも勉強になりそうですね
2024/04/15(月) 12:45:09.95ID:cLz3iDP/
普通の言語はstmtの構成要素としてexprが設けられるが、sqlでは逆にexprの中にstmtも入り得る異色の設計だから、exprサブセットのみの評価機は作れないね
まあstmtの評価は単にモックとして構文木を組んでみれば目的には適うし良い勉強になる

区切り文字をあまり使わないSQLは初学者には目に滑る構文だから特にそう
2024/04/15(月) 12:57:20.78ID:cLz3iDP/
>>251
評価の確認はおとなしくSQLiteに投げて、構文解析慣れてるようだし見本はこれ参考で十分だろう
https://sqlite.org/src/artifact/741a270b7f2f85bc

lemonって変わったパーサジェネレータ使ってるのけど、見た感じただのyacc変種なので出会ったトークン種別を単に印字させればよいだけ
2024/04/15(月) 13:34:40.60ID:fSSptXgn
>>251
> やはり標準環境には無さそうな感じですか
実際要らんしね。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では無いが、まあ似たようなものではあるだろう。
2024/04/15(月) 14:00:04.64ID:YG3lrvG/
>>252
sqliteの構文図見直したらしっかりselect-stmtってありますねえ…

>>253
まさに求めてたやつです、どうも
各処理系のパーサも見較べるとBison向けでルール/アクションの羅列のpsqlの奴が一番わかり易かった
https://github.com/postgres/postgres/blob/master/src/backend/parser/gram.y

psql用だけど拡張や高度な機能を気にする段階に無いので、ここから必要そうなのを拾い始めました
sqliteのパーサは中でゴチャゴチャ処理してるけど、psqlのパーサはparser/*.cへアクション内で呼ぶ関数がキレイに分離されていて、記述的命名から意味論まで分かるお手本のようなデザインですね
座右の文法リファレンスとして印刷してそのまま使えそうな出来栄え
2024/04/15(月) 14:07:24.63ID:YG3lrvG/
>>254
忠告どうも
たまたまSQLという'言語'が面白そうで規格までしっかりある良さそうなもので意欲を得ました
もしこのSQL'言語'が肌に合わなかったならば、プログラミング言語同梱のリレーショナルデータベースAPIへロールバックするでしょう
私の主眼はスレタイ通りSQLにあります
2024/04/15(月) 14:23:22.62ID:f5jIOgeT
既にRDBバリバリ管理やってる人こそ学ぶべき
むしろ初学が厳しい見た目のSQLだと挫折率高そう
母語に流暢でも英語をサボる理由にはならない

API通ってる環境なら必然的に埋め込みSQLも使える
2024/04/15(月) 14:34:25.57ID:fSSptXgn
>>256
そりゃ規格はあるよ。
ただ無料では仕様書が手に入らないらしい。勿論買えば済むらしいが。

> プログラミング言語同梱のリレーショナルデータベースAPI
てかこれ何ぞ?Oracleのことか?
そもそもDB使ってきててSQL知ラネ、ってのがかなり意味不明なのだが。
ORMの事なら、ぶっちゃけORMで済むのならORMでやるべきだと思うよ。
むしろ今時SQL手打ちか?とも言われてるはずだし。
(AccessとかでもクエリビルダーでSQLを作成してて、SQL自体をプログラマが打ち込む必要はなかったはず)
2024/04/15(月) 14:57:46.75ID:2Ew9RCgX
>>258
標準ライブラリ備えてるような言語には大抵RDB接続機能があって、ホストの文法に沿ってクエリ送れるやろ
例えば.NET共通のLINQとか
.NET言語毎にもあったりしてそれこそ無数
2024/04/15(月) 15:02:39.91ID:2Ew9RCgX
LINQはRDB以外の色々なデータベースモデルも想定してるからSQLとはかなり違う
LINQでRDB管理に習熟してもSQL知識はあまり付かないと思われ
2024/04/15(月) 16:16:36.38ID:Xey1DMe3
>>249
'foo' LIKE 'f_%'とかを試したいならSELECT 'foo' LIKE ‘f_%’;とすればいい
ただSQLを学ぶ目的なら実際に使うSQLでデータのほうを弄りながらいろいろ試したほうが断然効率いいよ
一つ一つ式の評価結果を実際に使うSQLとは別で確認するのは時間の無駄
https://www.db-fiddle.com/f/oUzwVLEEeWgxdxbQN36kvJ/0

あとプログラマー歴が長い人にありがちだけど
SQLをループと条件節のように命令型のパラダイムで捉えるのはお勧めしない
関係演算の感覚を身につける妨げになるから
2024/04/15(月) 16:47:19.47ID:fSSptXgn
むう?なんか書き込み失敗して内容も失ったが、覚えてる範囲でもう一度書く。
復活して同様の物が連投されてたらご容赦を。

>>259-260
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等に移行するほうが妥当だと思うぜ。
2024/04/15(月) 18:29:06.40ID:x2iyd0ju
>>262
めっちゃくちゃ基本的なこともわかってないからまずは公式チュートリアル的なのを読んだほうがいい
LINQ to ObjectとLINQ to SQL/DataSet/Entitiesの区別くらいは最低限つくようにしてくれ
2024/04/15(月) 19:25:10.27ID:fSSptXgn
>>263
なるほど俺が糞だと思ってたのはLINQ to Objectなのは分かった。
そして俺の思惑とは違い、MSはSQL対象のほうをラップしてるわけか。
俺的希望仕様ならLINQはリテラルか引数で無ければならず、ハードコードベタ書きとか意味不明だったが、
まあこれなら分からんでも無い。

が、そもそもこれはSQLが無駄に方言が増えすぎてたからMSもLINQというSQLモドキを実装しただけの気がするが。
それでもDOMだXPATHだとやるよりはLINQだけで済む方がいいのは確かだが、
ある意味新たなMSSQL方言を生み出しただけの気も。
そしてOracleもSQL方言だとは聞いてるし、やっぱRDB弄っててSQL知ラネ、ってのはよく分からない。
KVSならSQL関係ないが、そういう感じではなさそうだし。まあいいけどね。
2024/04/16(火) 08:55:41.54ID:Fr3sHPgG
LINQはSQLに寄せようとしてる雰囲気があるので中途半端感
普通は言語のインメモリオブジェクト操作の方へ寄せるのだが
C#, VB.NET etc.の多言語前提のデザインだからかな

まあWhereとかSelectとかキーワードを借りて文面ぱっと見だけの話
2024/04/16(火) 10:35:29.23ID:len5k1k5
>>265
MSなりの折衷策なんだろ。

> 言語のインメモリオブジェクト操作の方へ寄せる
これならORMが最上で、それ以上は無いからね。

PHPにはPDOという、無いよりはましだが実質的に意味が無いラッパがあるが、
あれよりはましなDBラッパを用意して、共通文法を考えました、ってところだろ。
実際、forでウダウダやるより宣言型の方が読みやすいのは確かだから、宣言型文法も取り入れたかったのだろうし。
2024/09/22(日) 19:26:44.50ID:kkG3ckzv
初歩的なことで申し訳ありませんがご教授ください。
idカラムに例として 5, 7, 11, 41 があります。
41, 11, 7, 5とソートしたいのですが
order by id DESC では、7, 5, 41, 11とソートされます。
なにか良い方法はございますでしょうか。
よろしくお願いします。
2024/09/22(日) 20:32:30.58ID:UdTQ7EcR
ORDER BY INT(id) DESC
ではどうでしょう
カラムid が文字列となっていないでしょうか

INTは DBによってことなるかも
上手くいかなかったらごめんなさい
2024/09/23(月) 07:02:58.03ID:dfCQ5A4R
いや「初歩的な」と言ってるんだし、
SQLではなく、テーブル作成時の間違いで、

crete table mytable (id INTEGER

とかやれと言った方がいいのでは
2024/09/23(月) 08:28:16.45ID:fL+Xy+IA
>>268さん
ありがとうございます!記述は異なりますが、キャストというヒントから実現できました!
助かります!

>>269さん
ありがとうございます。都合上文字列のカラムなので困っていました。
ありがとうございます!
2024/09/23(月) 09:03:31.51ID:dfCQ5A4R
>>270
> 都合上文字列のカラムなので
嘘だね
でもそのidをTEXTにするのは設計が間違ってるから、早い段階で直しておかないと頓挫する
でなければ壮絶クソコードの山になり、何とか動かせるだけのゴミにしかならないよ

設計的に正しい場合は、そのidが7,5,41,11とソートされて何も問題ないはず
他者の担当部分等の理由で変更出来ないのなら、つまり仕事としてやってるんだろうから、そいつや上司に聞け、ここで聞くのは悪手
(Zは同僚や上司に聞いたら恥とでも思ってるようだが、そうではなく、
部下がどの程度の技術レベルでどこまで仕事振れるかも管理範囲なのだから、分からない事は聞くべきだし、
逆にこの程度の初歩的部分すら分からないのに聞く事も許さないというのは、仕事場/上司に見切り付けるべき
そしてどうしても変更出来ないならCREATE VIEWで誤魔化した方がまだましな気もするが、まあ先に相談だろうね)

だから実際は自分でやってるんだろ、ならさっさとtable定義を直すべき
272デフォルトの名無しさん
垢版 |
2024/09/25(水) 13:39:54.41ID:UPZugvt8
バカは放っとこうよ
273デフォルトの名無しさん
垢版 |
2024/10/14(月) 03:33:42.65ID:iqlRL8W8
>>267
それは文字の照合順序の問題
自分でそうしたのか、他人がそうしたのか書いてないが、一文字目だけで並び替えているだけ。
274デフォルトの名無しさん
垢版 |
2024/10/14(月) 03:34:54.50ID:iqlRL8W8
>>270
少なくとも製品名くらいは書こうぜ
2024/10/14(月) 12:40:53.49ID:mb36WxU5
>>273
新手のバカが現れたw
276デフォルトの名無しさん
垢版 |
2024/10/14(月) 12:49:16.73ID:iqlRL8W8
>>275
文字列は文字コード順になるのが普通

桁数の違う数字列を比較したから、どういう結果になるかは照合順序による

数字列と数値は別物
277デフォルトの名無しさん
垢版 |
2024/10/14(月) 12:50:50.99ID:iqlRL8W8
>>275
彼は7、5、4、1の順になってしまうと書いているが、アスキー文字の数字は1が先で9が後に配置されている。
2024/10/14(月) 14:18:28.43ID:/mng7eSx
日本語が読めないのかSQLを全く知らないのかわからんが救いようのないバカなのは間違いない
279デフォルトの名無しさん
垢版 |
2024/10/14(月) 16:02:24.13ID:iqlRL8W8
11を11、41を41、5を05、7を07という風にしないと結果は不明。
2024/10/27(日) 09:13:31.20ID:Vdu9Rrcz
良い感じのSQLのGUIクライアントある?
たとえばカラムに連番と画像(画像元のパスなど)があって、
全てのがぞうを表示するようなものを求めてる
殆どのGUIクライアントはそういうDBだ画像は表示されなくてその画像部分のフィールドをクリックしたときに1枚だけ表示されるけど、
そうじゃなくてずらっと並んでる画像パスの入ったフィールド全ての画像を表示したいのだが
2024/10/27(日) 09:41:04.89ID:ThFiCQpU
自分で作るか人が作ったアプリのDB構造に合わせるかしないと無理だろ
いずれにしろSQL関係ない
282デフォルトの名無しさん
垢版 |
2024/10/27(日) 15:56:39.28ID:Vdu9Rrcz
>>281
ふーん、やっぱそうなるんだ
それを知りたかったんでね
あと何かむかつくからここから俺がこのスレ乗っ取ることにするわ
日記帳がわりにする
2024/10/28(月) 15:33:24.71ID:ehQdeP61
>>280
MS-Access
2024/10/28(月) 16:27:15.25ID:xaz6ouOz
>>283
63bitで最大4Gまでしか扱えないものはノーサンキュ
285sage
垢版 |
2024/10/28(月) 17:18:52.43ID:ehQdeP61
これが条件後出しカッコ悪いというやつか
2024/10/28(月) 17:25:09.25ID:Hp6dJGZ5
63bit 63bit 63bit 63bit
最大4G 最大4G 最大4G 最大4G
2024/10/30(水) 02:07:11.28ID:p9nsrTZ/
evo tech ωωω
2024/10/30(水) 02:37:36.07ID:BzmMNap8
>>283,285
accessは他の追随を一切赦さぬDBMS覇権(性能、機能的な意味で)だろ
事実上普及してる全てのDBMSにコネクトできる万能クライアントだし
つまり表向きの売りであるGUIガン無視したとてしても最強
GUIでポチポチした履歴と生成されるクエリ突き合わせて解読をつづけれりゃあSQL資料すら見ずともSQL書きの中の上には成れる

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

他のAccessフォロワRDBMS環境はOpen/Libre(とその派生)のBaseだけれども、正
直言って...α版の域すら出てないレベルでCLI叩いててSQL直打ちの方がマシ
289デフォルトの名無しさん
垢版 |
2024/10/30(水) 10:40:48.68ID:x/mNM3SS
DBのGUIでつまいこういうことをやりたい
(ただ表示する画像はもっと多い)

https://i.imgur.com/e5UznLk.png
2024/10/30(水) 19:37:59.35ID:MyBSxte7
>289
自分で作っちゃえばええやん
sqlでselectしてアプリケーション経由して(phpでもjavaでもTypeScriptでも何でもおけ)適当にhtmlブラウザで表示させればええやん
複雑なjoinとか無くて一つのテーブルで済むなら30分も掛からず出来るっしょ
291デフォルトの名無しさん
垢版 |
2024/10/30(水) 19:51:27.08ID:x/mNM3SS
>>290
結局最終的にはhtmlで出力しかないのか
DBのGUIでずらっと画像だしてくれるものだとおもってた
2024/10/30(水) 19:57:39.75ID:MyBSxte7
>291
マルチやめなさい。そしてhtml表示は一つの手段でしか無い。他にも方法なんぞ幾らでもあるわ。ただし、開発環境を一切書いてないから助言が出来るわけもなく
あくまで一般的な方法で手っ取り早いのを伝えただけ。
Excelのマクロ組んでもいいだろうし、cuiでコマンド叩いてDBからローカルの画像パス取ってきてホストPCに表示するバッチ組んでも良いだろうし…
「結局最終的にはhtmlで表示するしかない」なんて一言も書いてないぞ
繰り返すが「開発環境を一切書いてないから助言が出来るわけもなくあくまで一般的な方法で手っ取り早いのを伝えただけ。」だぞ
2024/10/30(水) 20:01:18.39ID:x/mNM3SS
>>292
そもそもphpでもjavaでもまたひと手間かよと思ったら泣きたくなってよー
とらいえずExcelでのデータベースはできたんだ
ただ数万の画像表示でクッソ重いからファイルパスに変えたけど
でも画像べらーって表示したいじゃん
これを試しに画像だけでもHTMLでやったらどうなるかと思ったら数万枚数十万のサムネ画像べらーっとはったら重いわ
そうなんだよな、htmlしばりするわけじゃねーもんな
とりあえず、EXCELでデータベース作って、SQliteにぶち込んでそれで様子みてる
そっから先は何でどうするか選択肢がおおすぎてわけわからなくなってんだわ
マツリポストは後生やからさぁ、いまのところかんべんしてつかーさい
2024/10/30(水) 20:04:46.88ID:2JaEjh5Z
マルチポストとかこんなところにそんなのが存在するのか?
2024/10/30(水) 20:07:31.52ID:x/mNM3SS
良く考えたら風俗嬢とかのサイトでも女の子すべてずらーっと見せるの無いよな
数十毎にくぎってページ1とか2にしてるわけだし
2024/10/30(水) 21:20:15.49ID:J5/QLmGD
ガイジ大暴れ
297デフォルトの名無しさん
垢版 |
2024/10/31(木) 13:02:50.98ID:POJr+rF8
馬鹿には無理
298デフォルトの名無しさん
垢版 |
2024/11/01(金) 00:10:42.00ID:EQMsSXTB
>>291
そんな付加をかけまくるツール、人間が少しだけ見るためのツールに需要はない。
2024/11/01(金) 09:10:10.59ID:xFfDlU+j
>>298
色々なサイトでサムネを1ページの中に限定して表示してるのは数を無限や数万数十万にすると負荷がかかるからか
なるほどなあ
2024/11/01(金) 19:58:15.69ID:p+e2Ja+9
つ<img loading="lazy">

てか結局何がしたいの?
explorer+特大アイコンで駄目な理由は?
2024/11/01(金) 19:58:32.10ID:TgBKHsuN
twitterのフォロワー整理ツールとか参考になるわ
2024/11/03(日) 17:55:14.49ID:sFUWrMLA
>>300
画像がDBに入っていると、エクスプローラーでは見れないんだよね
2024/11/03(日) 18:18:24.25ID:gYhGbZOp
>>302
それはそうだが、そもそも画像をDBに入れる意味がない
ただ初心者あるあるらしく、「(画像掲示板では)そうじゃなくてファイル名だけDBに入れてapacheに直接配信させるんだ」と
説明してたサイトがあったがすぐには出てこない

なおSQLiteはBLOBにもインデックス張れるらしいが、そんな使い方しないだろ
2024/11/03(日) 18:54:12.64ID:sFUWrMLA
>>303
上級者でもあるあるだけどね
デメリット大きいけどDBに入れたら入れたで便利なことも多いんだよね
もっと良かったこと探しをしろ
2024/11/03(日) 20:08:56.01ID:gYhGbZOp
ないと思うが、まあ上級者なら自分で何とかしろ
なお293なら画像をDBに入れてなければ解決してる
2024/11/03(日) 22:39:10.72ID:EvIOUlko
何も解決してないだろww
2024/11/04(月) 14:37:07.62ID:odwm0TPR
ずっとBAD GATEWAY
2024/11/04(月) 14:37:49.34ID:odwm0TPR
っつーのは書けるのか なんてこった

解決しなきゃいけない案件じゃねーだろ 画面いっぱいに数万もの大量な画像をずらーっと表示したいなんて要望は
そも、それをしてからその先どうしたいんだ? それを一向に書こうとしない相談者に難がある
表示したらそれで満足なんか?
ランダムに表示するようにでもしなきゃ、毎回その数万の画像のうち特定の一部だけを目撃することに成る それに意味は?
小アイコンサイズで画面いっぱいに貼ったとしてFHDモニタで250枚程度だ もっとちっさくした画像でも貼ろうってのか
いろんな画像が次々湧いてくるようなエフェクト掛けて、とかならDBだのSQLだのほぼほぼ関係ねーわ
2024/11/04(月) 14:52:26.31ID:1xi3Twsq
>>308
何も解決していないのに「なお293なら画像をDBに入れてなければ解決してる(キリッ)」みたいな痛いレスが面白かっただけだよ
310デフォルトの名無しさん
垢版 |
2024/11/06(水) 08:23:55.64ID:spMsN6R2
>>299
RDBでデータ型が画像データというデータ型は聞いたことがない。

RDBは画像データのバイナリデータか、画像データファイル形式に近いラージオブジェクト型。
単に画像データファイルへのリンクが入っているだけという設計もある。
2024/11/06(水) 08:54:43.24ID:L0rogwPJ
INNER JOINとEXISTSどっちがいいんだ?
2024/11/06(水) 10:46:12.80ID:2mRFCI0/
使い途がちがう EXISTSはture/falseを返すだけ
2024/11/06(水) 11:02:31.90ID:L0rogwPJ
INNER JOINでもWHERE EXISTSでも、テーブルBのデータを使ってテーブルAのデータを絞り込んでSELECTするができるじゃん
性能的にどっちがいいんだっていう
314デフォルトの名無しさん
垢版 |
2024/11/06(水) 12:00:06.03ID:spMsN6R2
>>313
そもそも実行計画・実行プランくらいは見ろよ
書き方がどうとかいい加減にしろ!
315デフォルトの名無しさん
垢版 |
2024/11/06(水) 12:02:25.42ID:spMsN6R2
>>313
対象レコードの存在有無を判定するのに内部結合をするのは意図がわからないのでやめなさい。

しかも処理コストが高くなるのが普通だ。
316313
垢版 |
2024/11/07(木) 08:53:30.88ID:Qi1p5GFP
>>314-315
はい、ごめんなさい……
317デフォルトの名無しさん
垢版 |
2024/11/12(火) 08:43:58.73ID:ZCUDlG+O
PostgreSQL 17 を使ってるんですが

SELECT shohin_bunrui AS aaa
FROM shohin
where aaa = '衣服';

↑実行順序を考えると当然エラーになります。
エラー: 列"aaa"は存在しません

SELECT shohin_bunrui AS aaa
FROM shohin
GROUP BY aaa;

↑エラーになりません。SELECTよりGROUP BYの方が実行順が先なのになぜですか?
2024/11/12(火) 09:07:16.39ID:+Q7wUFQ5
抽出条件で行の絞り込みをするのは、SELECTでなく WHEREかと
行を絞ってからグループ化するのはそうかもしれないけど、
統一感はあった方がいいとは思いますね
2024/11/12(火) 11:00:57.73ID:jB7P5Kru
>>317
GROUP BYでもcolumn aliasが使えるようPostgresが拡張してるから
集約関数とかを両方に書かないといけないの面倒でしょ?
320317
垢版 |
2024/11/12(火) 12:30:43.18ID:ZCUDlG+O
>> 319
Postgresさんが気を利かせてくれてるわけですね?
ありがとうございます。
321317
垢版 |
2024/11/12(火) 12:30:43.35ID:ZCUDlG+O
>> 319
Postgresさんが気を利かせてくれてるわけですね?
ありがとうございます。
322317
垢版 |
2024/11/12(火) 12:30:44.59ID:ZCUDlG+O
>> 319
Postgresさんが気を利かせてくれてるわけですね?
ありがとうございます。
323デフォルトの名無しさん
垢版 |
2024/11/12(火) 12:31:48.29ID:ZCUDlG+O
すみません。ブラウザの反応がなかったので何回も書込み押してしまいました
2024/11/12(火) 15:44:40.37ID:3FuqnzdR
view造って先にaaaのみにするんじゃね
2024/11/12(火) 16:45:36.43ID:+Q7wUFQ5
WHEREによるフィルタが先で、SELECTによるマップがあとなのかな
326デフォルトの名無しさん
垢版 |
2024/11/12(火) 17:29:22.04ID:v7TGFNyn
>>322
そんなに列別名を使いたい理由がわからない。

集合演算のSELECTでテーブルによって列名が異なるならやらないといけないが、そういうSELECTでないのにテーブル別名メリットが大きいが、列別名を使うメリットなんてほとんどないよ。
327デフォルトの名無しさん
垢版 |
2024/11/12(火) 17:31:02.65ID:v7TGFNyn
>>325
SQLの構文解析エンジンの仕様によるような書き方をするのがそもそもの間違いだよね。
2024/11/12(火) 18:00:22.86ID:+Q7wUFQ5
>>327
ですね
2024/11/12(火) 18:13:14.69ID:+Q7wUFQ5
LINQを最初に見たとき、なんでこんな順序なんだ? と思ったけど、自然な順序なのかもね
FROM→WHERE→SELECT

しばらくLINQやってないから、うろ覚えで見当違いだったらごめんなさい
330デフォルトの名無しさん
垢版 |
2024/11/12(火) 19:58:46.82ID:v7TGFNyn
>>329
SQLは自然言語に近い表現で作られた
英語の語順になっているから、日本人には変な順番に見えるだけ
2024/12/20(金) 16:41:43.73ID:cA4MHukG
テーブルごと全てのカラムにまとめて別名付けるとかできないのかな
以下のような場合に別名付けるとき
テーブルA
id
name
description

テーブルB
id
name
description

select
A.id as A_id,
A.name as A_name,
A.description as A_description,
B.id as B_id,
B.name as B_name,
B.description as B_description
from
みたいに書かないといけないのを
A.* as A_*
みたいに書けたら便利なのに
2024/12/21(土) 11:36:41.92ID:KZIgeCwE
うちはそのまま A.name のまま扱ってるよ
333デフォルトの名無しさん
垢版 |
2024/12/21(土) 19:55:23.41ID:IOryZJAZ
>>331
またそのネタかよw
334デフォルトの名無しさん
垢版 |
2024/12/21(土) 20:43:39.23ID:SDOaO/8s
SQLを出力するプログラム位かけるやろ
335313
垢版 |
2024/12/23(月) 08:20:37.09ID:hrYrd+aN
>>330
クエリ式であってSQLじゃねぇだろ
SQLの語順ならSELECTが最初だ
2024/12/23(月) 10:17:08.30ID:xh1kOIEb
>>333
また、って言うくらいには結構求められている機能だと思う
2024/12/23(月) 18:35:45.31ID:GjEN+y4a
>>329
LINQはそもそも.NETのコードの物だから
メソッドチェーンで書く時の順番がそのままになってるだけよ

HogeList.Where().Select()って書き方になるからクエリ式もそうなる。
2024/12/24(火) 09:46:38.33ID:MemH7BuO
>>331
すべてのカラムに最初からそういう名前をつけているよ
テーブルA
A_id
A_name
A_description

テーブルB
B_id
B_name
B_description

select
A_id,
A_name,
A_description,
B_id,
B_name,
B_description
from
とシンプルに書けて良いよ
2024/12/24(火) 12:30:30.62ID:V4/fVU02
>338
>331を読むに、別名(エイリアス)でテーブル名付けたいって事でしょ
確かに長ったらしいテーブル名は一括で一文字のエイリアス名を付けたいな…の思う事もあるから>338の言わんとしてることも分かる
340デフォルトの名無しさん
垢版 |
2024/12/24(火) 22:39:03.73ID:S4CkJ4V1
>>335
標示SQLではSELECTよりもWITHが先
341デフォルトの名無しさん
垢版 |
2024/12/24(火) 22:40:09.34ID:S4CkJ4V1
>>338
同じカラム名なのに意味が異なるという狂った設計なのが間違い
2024/12/25(水) 01:30:11.46ID:YXgPFPfq
SQLというよりSQL clientの機能の話じゃね?

SELECT a.id, a.name, b.id, b.name FROM foo a INNER JOIN bar b ON …
↑みたいなクエリを書いた時に結果のカラム名が単にid, name, id, nameと表示されるのではなくa.id, a.name, b.id, b.nameと表示されればいいわけでしょ?

プログラムから結果セットにアクセスする時は”a.id”や”b.id”でアクセスするんだから表示調整くらい簡単にできそうだけどな
2024/12/25(水) 08:15:20.48ID:63Wcp4qk
誰もWITHの話なんかしとらんのに突然の主張w
344デフォルトの名無しさん
垢版 |
2024/12/25(水) 12:26:11.92ID:wfmvBy7R
日本語SQLスズラン
345デフォルトの名無しさん
垢版 |
2024/12/25(水) 15:26:23.80ID:PDJSnv/I
be with you
346デフォルトの名無しさん
垢版 |
2024/12/25(水) 17:53:18.64ID:YmcCoB80
>>343
SELECT句よりも先にWITH句を書くので、SELECT句が先ではない。
347デフォルトの名無しさん
垢版 |
2024/12/25(水) 17:56:53.42ID:YmcCoB80
>>342
根本的に同じカラム名なのに別のカラムという設計がおかしい

どちらかのテーブルにしかないカラムなら、修飾そのものがいらない

それはあんたはSQLの話ではなくて、別の製品の仕様の話をしている

それに同じ名前のカラム名なら別名を定義するべきだ
348デフォルトの名無しさん
垢版 |
2024/12/25(水) 17:58:44.64ID:YmcCoB80
 
SQLを適当に書く人間が増えて、めちゃくちゃなシステムだらけになった。

同じカラムが、同じカラムがというなら、結合したビューでも用意しとけよw
2024/12/25(水) 18:33:32.24ID:WXVFxdaX
元の話も読めないようなヤツはWITHがどうのと主張しとらんと黙っといた方がいいよw
2024/12/25(水) 18:36:08.08ID:63Wcp4qk
>>346
誰もWITHの話なんかしとらんのに突然の主張w
351デフォルトの名無しさん
垢版 |
2024/12/25(水) 19:42:44.67ID:r1WXKMXg
>>350
335 313 sage 2024/12/23(月) 08:20:37.09 ID:hrYrd+aN
>>330
クエリ式であってSQLじゃねぇだろ
SQLの語順ならSELECTが最初だ
352デフォルトの名無しさん
垢版 |
2024/12/25(水) 19:44:16.65ID:r1WXKMXg
>>349
SQLの構文仕様を調べたことがあるのか?

SQLそのものは自然言語の英語の語順になっているだけ
353デフォルトの名無しさん
垢版 |
2024/12/25(水) 19:47:55.88ID:r1WXKMXg
「クエリ式」はSQLの世界の話ではなく、SQLを組み立てる側のライブラリの世界の話。

使われる方が使う方を意識するという発想で設計書を書かせようとする人間がいるが、それだと延々とドキュメントを修正することになる。

世界中の人間に聞いて回ってドキュメントを修正するなど無理だし、無意味。
2024/12/25(水) 21:03:35.85ID:WXVFxdaX
ダメだわこの頭でっかちw
2024/12/26(木) 13:44:41.34ID:KwPCWpVD
>>341
うれしい副産物として、違うカラム名にできるというメリットもある
356デフォルトの名無しさん
垢版 |
2024/12/30(月) 02:42:59.39ID:SuC1UiOz
>>354
SQLを書きたくないという理由を聞きたい
他人にぶん投げられれば気が済むのか?
357デフォルトの名無しさん
垢版 |
2024/12/30(月) 02:44:55.46ID:SuC1UiOz
なぜ「データベース」板を無視して「プログラム」板に書いているのも謎
358デフォルトの名無しさん
垢版 |
2024/12/30(月) 14:22:49.66ID:y1s4zo7f
SQLなんて一回描いたら何度も描き治すもんでもないからな
面倒臭がるのは怠慢
2024/12/30(月) 19:29:38.65ID:V3PHz5v0
>>358
なおすでーー
2025/01/01(水) 21:42:25.49ID:sxxQrAOo
>>359
そう何度も直すことは無いよ
2025/01/01(水) 23:12:26.15ID:21eIb2Fa
へぼかったら治すでーー
362デフォルトの名無しさん
垢版 |
2025/01/05(日) 10:38:54.01ID:c9RkuEF2
単にテキストエディタの機能を使いこなせずに毎度、すべてキー入力している初心者は案外、多い。
363デフォルトの名無しさん
垢版 |
2025/01/05(日) 10:48:34.28ID:8kdOFrcZ
ORMなんていらん
2025/01/05(日) 19:51:54.27ID:ToFXQ1cV
サブクエリ難しい
2025/01/05(日) 19:52:23.20ID:ToFXQ1cV
息をするようにSQLを書きたい
2025/01/05(日) 20:49:47.84ID:ktpqqLIO
>>364
当該処理がクエリを2回以上発行することを許されてる仕様や環境なら、無理にサブクエリ1発で処理しようとせず2回以上に分けて処理するのも手だよ
サブクエリって見づらいしメンテナンスしづらいし
2025/01/05(日) 22:36:32.88ID:Gf5gTRAY
CTEのおかげてサブクエリの出番はめっきり少なくなったよね
2025/01/06(月) 12:33:31.51ID:HkxXvSmh
>>367
CTEってなに?
2025/01/06(月) 18:37:10.53ID:xyyiC8Hr
>>366

ありがとう
やってみる
逆にそれでサブクエリの感覚が掴めるかもしれないと勝手な期待をしている
accessとExcelVBAでやっているけど、IT素人のPC好きなおじさんがやる
やってるから何分感覚がつかめない
ミックさんのデータベース入門は読んでいるけど読み切れていない
2025/01/06(月) 20:05:07.43ID:PWtKQBnB
>>369
そうそう、その視点や観点が本当に大事
プログラム全般そうだけど一気に書こうとするとスパゲティ化して自分でも訳わからなくなるから
必ず最小から始めて、それらをくっ付けて大きくしていくみたいな感覚が大事
2025/01/09(木) 00:01:55.02ID:8WDo/TAk
サブクエリは普通に使うだろ
2025/01/11(土) 10:22:19.58ID:ouBpeDRU
サブクエリを使うクエリを分解したらたいていN+1になるしな
2025/01/19(日) 01:50:01.24ID:IALgBqxE
サブクエリ使う理由ってめんどくさがったり一時領域をケチる以外に理由ないよ
サブクエリを使わずに結果を出すようにした方がメンテもパフォーマンスも上がる
2025/01/19(日) 02:17:21.82ID:9/Z57kyd
サブクエリの有無ごときで議論になるの笑ってしまうなw
どんなちっこいアプリなんだ?電卓とか?
2025/01/19(日) 06:33:56.88ID:ugzsMDEi
1週間も経って突然貶し始める方が笑ってしまうわ
376デフォルトの名無しさん
垢版 |
2025/01/19(日) 09:51:50.41ID:pfUoPKo5
どこの句のどういう使い方をするサブクエリなのか書いてくれないと、サブクエリを使うべきなのか、そうでないか答えようがない。
2025/01/19(日) 13:34:54.51ID:bMoMF2/G
SQLを複数回に分割して発行すると、その間DBに更新がないことを担保する必要がありますか?
2025/01/19(日) 16:06:56.18ID:vo12PcwL
トランザクションを指定すれば?
2025/01/19(日) 16:20:11.02ID:MoFiVYUu
そこはSQLを複数回に分割して発行するかどうかよりも上位のレベルで
トランザクションや同時実行制御の観点から設計しておくべき事項
担保する必要性の有無は分割しようがしまいが変わらない
2025/01/19(日) 18:28:02.90ID:T6GaQrgY
やはりトランザクションですね
ありがとうございます!!
2025/01/19(日) 18:29:15.30ID:T6GaQrgY
ちなみに、サブクエリとするか分割するかのレスに乗っかって、でした
2025/01/20(月) 11:39:20.74ID:7SyPOdKK
サブクエリを使わないで、一旦チンポテーブルに書き出す方式があったよね
あれなんだっけか
2025/01/20(月) 18:23:14.14ID:O4abJDGp
次の3つのフィールドで構成される複合主キーがあり
(PK1, PK2, PK3)
検索キーとしてPK2とPK3だけをよく用いるとき、主キー以外にもインデックス(PK2, PK3)を作成すべきですか?
2025/01/20(月) 18:55:00.26ID:kikzz/Vc
キーのバラつき具合やオプティマイザの機能にもよるから一概に不要とも作成すべきとも言えない
2025/01/20(月) 18:55:26.16ID:kikzz/Vc
実際のクエリプランを見て判断
2025/01/20(月) 19:12:32.30ID:O4abJDGp
ありがとうございます>>383です
ちなみにaccessです
2025/01/20(月) 19:14:05.86ID:O4abJDGp
>>3々3です
accessで複合主キーを設定したとき、インデックスは自動で付与されるでしょうか
2025/01/21(火) 08:53:02.94ID:9Kz0tqcV
インデックスじゃない主キーってなんだ……。
2025/01/21(火) 09:13:36.90ID:X3sBvw4I
>>388
調べてみるとそうみたいなんだけど(主キーにはインデックスが張られる)、単一主キーだと、該当キーにRequired、Uniqueなインデックスが作成されるけど、複合主キーでは個々のフィールドに個別にはインデックスが作成されてなくて
それがどういうことか(インデックスが張られているか)分からなくて
分かりにくくてごめんね
2025/01/21(火) 11:15:04.33ID:+xYYoS0+
>>389
DBの構成上、主キーであれば最低限1つのインデックスは張られる
それはPK1,PK2,PK3全部揃ったときにB木を辿れればいいだけなので、6(=3P3)通りのどれかだが、
何もなければ PK1->PK2->PK3 の1つのインデックスになる
この場合、PK1,PK2 のセットならインデックスが使えるが、今回のように PK2, Pk3 のセットだと使えない
これはクエリプランを見れば判断出来る

SQLiteだとこのケースでは上記の通り
というかCREATE INDEX時(CREATE TABLE時)に使われ方を予測する事は不可能なので、
DBとしては、記述通りPK1->PK2->PK3で一つ作るか、全組み合わせを作っておくかしか出来ない
よく使われる検索に対して自動的にインデックスを作成して高速化してくれるDBがあるのかもしれんが俺は知らん
2025/01/21(火) 11:23:25.76ID:+xYYoS0+
>>389
> 単一主キーだと、該当キーにRequired、Uniqueなインデックスが作成されるけど、複合主キーでは個々のフィールドに個別にはインデックスが作成されてなくて
これは少し勘違いしてる
インデックスはあくまでB木であって、個々のフィールドやカラムとは全く別物
インデックスが当たってるかは、クエリプランで確認すべき事
2025/01/21(火) 13:20:25.85ID:j6Q/IyUA
>>389です
ありがとうございます

(以下Accessです)
新たにテーブルに、主キー(PK1,PK2,PK3)を作成した段階で数万件のレコードを入れ、仮に(PK1,PK3)をキーとしてSELECTで抽出をするとめちゃくちゃ遅い…(1)
上のテーブルの主キーの個々のフィールド(3つ)にインデックスを設定して(1)と同じ条件の抽出をするとかなり速い…(2)
(2)のインデックスを削除して主キーと同じフィールドに複合インデックスを設定するともっと速い…(3)

(1):(2):(3)=65:1.5:1
くらいの比率でした

主キーを設定しただけではとても遅かったです(65倍)

なにか設定・前提に誤りがあるかもしれません
2025/01/21(火) 13:21:48.40ID:j6Q/IyUA
実行計画の出し方は調べてみます
多分見方が分かりませんがw
2025/01/21(火) 16:54:19.10ID:c07BxmkO
>>392
(1)で設定した複合主キーと
(3)で設定した複合インデックスとで
インデックスを構成するカラムの順番は本当に同じ?
2025/01/21(火) 17:55:49.71ID:j6Q/IyUA
>>394
すみません、ちょっと投稿内容に誤りがありました

(1)の複合主キーと、(3)の複合インデックスをまったく同じフィールド、個数、順序とすると、(1)と同じように、複合主キーのみでインデックスを設定しないときの同じように65倍の時間が掛かりました
デフォルトで設定されたインデックスと一致しているので当然なのかもしれません

先ほどの(3)の結果としてを得たのは、試行錯誤して複合インデックスから検索キーとしないフィールドを削除したもので、複合主キーのフィールド数より2つ少ないです
後出しになりすみません

データの内容によっても結果は変わるでしょうし、オレ環なので諦めるしかないかなと
2025/01/21(火) 18:09:31.85ID:j6Q/IyUA
簡単のため、当初複合主キーのフィールド数を3としました
2025/01/22(水) 00:08:11.72ID:l3OLrM1a
{PK1,PK2,PK3}で複合キーが定義されてる場合
検索条件が{PK1}か{PK1, PK2}か{PK1, PK2, PK3}であればどのDBMSでも大半のケースでインデックスが使われる
検索条件が{PK1, PK3}の場合はPK1のselectivity次第でインデックスが使われるものがある
検索条件が{PK2, PK3}のように一番左のカラムが含まれない場合はindex skip scanという機能が実装されてなければインデックスは使われない(Accessにはたぶん実装されてない)

他のクエリとの兼ね合いで複合主キーを構成するカラムの順序を変更できないということであれば該当クエリ用に複合インデックスを追加するのは妥当
2025/01/22(水) 00:28:31.31ID:VcBzYOin
>>396
というか何がやりたいのか不明な事になってるが、

> 検索キーとしてPK2とPK3だけをよく用いるとき、主キー以外にもインデックス(PK2, PK3)を作成すべきですか?
であれば遅い(=インデックスがない)と分かったのだからインデックス作ればいいだけでは

>>393
> 多分見方が分かりませんがw
見方なんて分かる必要なくて、
1. インデックスがある検索に対してクエリプランを出させる(=インデックス検索)
2. インデックスがない検索に対してクエリプランを出させる(=リニア探索)
3. 実際に自分がやりたい検索が、1,2のどちらに似てるか見る、特に先頭付近
ただインデックスが何で、どうやってDBがレコードを抽出してくるのか分かってなさそうなので、1,2が出来ない気もするが

結果で確認したければ、正しくインデックスが作成された後は、
α. SELECT * FROM mytable WHERE PK1=a AND PK2=b AND PK3=c;
β. SELECT * FROM mytable WHERE PK2=b AND PK3=c;
でαとβはほぼ同速になるはずだよ
2025/01/22(水) 01:45:12.43ID:x9n06qn/
>>390
>>397
ありがとうございます
最左のカラムを検索キーとするかがポイントなんですね

当初は>>390での指摘がピンときていませんでした
合間のレスで「仮に(PK1,PK3)で検索し」は迂闊でした
いまは手元に試験用のコードがありませんが、最左のカラムを含んでいなかったと思います

SQLをずいぶん自由に書けるようになったと思っていましたが、テーブル、インデックスの作成がこんなに大切だったと知りました…
2025/01/22(水) 01:53:19.83ID:IIgBVdb4
そもそもACCESSのクエリプラントとか、取得大変だがな
2025/01/22(水) 05:04:07.48ID:xghKhcgN
ACCESSにクエリプランなんてあるん?w

ファイルで配布できる必要があるとかじゃなければ、MS SQL Expressなり使った方がやりやすくない?
昔と違ってGUIツールも今は無料配布になってるし。
2025/01/22(水) 07:08:36.05ID:VcBzYOin
>>399
> 最左のカラムを検索キーとするかがポイントなんですね
違う。というか理由を理解ではなく結果を暗記しようとする辺り、文系馬鹿の匂いがするが、
とにかく、「B木」でググって記事を読め
現在のプログラミングでは基本で、そこそこ初心者が記事を書くネタになってるから、いくらでも出てくる
そしてVBAにもハッシュはあるだろ。ググるとScripting.Dictionaryと出てくるが、中身は同様にB木のはずだから、
何か知らんが速いという事で済まさず、この機会にちゃんと理解しろ

そしてその言い方なら、
左側が全部揃ってるかがポイント
が正解になる

ただ、遅くて困るのならインデックス張ればいいだけではあるが
2025/01/22(水) 09:37:01.44ID:x9n06qn/
>>402
ありがとうございます
B木の「B」はBinaryでなくBalanceだったのですね
B木の深さは複合キーの個数で一定となるツリーなんですね
二分木をイメージして「??」でしたが、B木の構造がイメージできればインデックスの効果が得られるか否かが分かりやすいと思いました
2025/01/22(水) 10:44:07.12ID:VcBzYOin
>>403
> 二分木をイメージして「??」でしたが
いやそういう問題じゃない
というか相変わらずインデックスが何かさっぱり分かってないようだが、単なるリーフへの探索手段だぞ

実際はこんなキーの分け方はあり得ないが、馬鹿でも分かるように敢えて例とすると、
お前が名詞を1,000枚持ってて、あいうえお順に格納して保管してるとする
これは主キーが複合キーの{PK1:苗字1文字目, PK2:苗字2文字目以降, PK3:名前}として、
石破茂を{'石','破','茂'},
岸田文雄を{'岸','田','文雄'}
と格納されてる状態と見なせる
これに対して、{PK2,PK3}の検索、例えば{'田',’茂'}では全く使い物にならないのは分かるだろ。これがインデックスが機能してない状況
同様に、{PK1,PK3}の{'吉','茂'}も無理ゲーと分かるだろ。これもインデックスが機能してない状況
逆に、{PK1,PK2}の検索、{'鈴','木'}なら範囲を確定させられるだろ。これがインデックスが機能してる状況

というか言っちゃ悪いがVBA+accessってプログラマではなくExcel職人上がりも多いのでこの空回りなのだと思うが、
実際、Excel職人ならこの辺理解せずすっ飛ばして「遅いからインデックス張る」で済ませていい
プログラマなら、ちゃんと理解しろ。「赤黒木」とかもお前には有用だろうよ
2025/01/22(水) 10:58:55.44ID:ZVwqoD6m
B木については知らなかったが、今回の複合インデックスの件について二分木は論外だとは分かっています

ちなみに、>>402ハッシュの中身がB木というのは自分の認識と異なります

字面でうまく伝わらない部分はあったと思いますが、B木を知ることができ(あえて理解とは言わない)よかったです
ありがとうございました
2025/01/22(水) 11:07:43.80ID:s+SsM2Gu
中途半端な知識で間違ったことばっかり書いてるのに
人を馬鹿する自称バカではない理系おじさんは少し自重したほうがいい
2025/01/22(水) 11:27:02.25ID:ZVwqoD6m
>>405
x ハッシュの中身が
o Scripting.Dictionaryの中身が
文脈から分かったかもしれませんが
2025/01/22(水) 11:27:27.98ID:VcBzYOin
>>405
> 今回の複合インデックスの件について二分木は論外だとは分かっています
いやそうじゃねえ
そもそも論外でもないし、インデックスが二分木でも問題ないし、この場合には二分木もB木の一種だよ
B木とは深さ方向が一定になるように調節されてるものの呼称であり、実際は二分木が多数だろうし

まあ君に理解する気がないのは分かったし、実際に理解しなくても済む人達も大勢居るのも事実
ただプログラマならどのみちいつか引っかかるから、この機会にちゃんと理解しといた方が得だぞという話
君がどうするかは君が決める事
2025/01/22(水) 11:42:36.84ID:a9tNcWhf
>B木とは深さ方向が一定になるように調節されてるものの呼称であり、実際は二分木が多数だろうし
君が論外
2025/01/22(水) 12:42:33.57ID:VcBzYOin
>>407,409
そうじゃない、というかそこは問題ではない

というのが分からないのが問題なのだろうが、君は全てを「具象」で捉えて「暗記」してるだけだろ、これは典型的な文系のやり方
本来は「抽象」で捉えて「理解」しないといけない項目
「B木」も「二分木」も(昔ながらのハッシュ関数を使った)「ハッシュ」も別物ではなくて、
同一の物を分類してるだけ、しかも直交もしてない

話を戻すと、問題は、
・DBのインデックス動作が分からない
・どうインデックスが作成されるかも分からないし、
・どういうクエリならインデックスが使われるのかも分からない
なんだろ

正攻法:(=プログラマ向け)
・インデックスの実装の仕方(の一つ)を理解する
 これにより、インデックスに何が必要か、インデックスで何が出来、何が出来ないかを直感的に判断出来るようになる
 (実際の実装では高速化の為にあれこれやってるだろうが、これは今回の目的に対しては全くどうでもいい事)

迂回策:
・クエリプランで毎回確認する
 とはいえ読めるのかあれ?
 あれを読む努力をするくらいなら、上記のインデックスを理解する努力の方が実になるはず
 その上で、このDBではどうなのか?の判断の為に使うものだろあれは

迂回策次善案:(=Excel職人向け)
・クエリが遅い場合はインデックスを作るようにする

だと思うよ
まあ実際Excel職人っぽいしどうぞお好きにだが、
でも今回理解しておかないと次回以降も同じ所で引っかかり続けるだけだから、
それが嫌なら数時間~数日かけてでもこの機会に理解するしかないでしょ
2025/01/22(水) 12:49:28.79ID:VcBzYOin
>>410訂正
× 同一の物
○ 同種の物
無駄に絡まれそうなので念のため

まあ俺がどう論外である事を証明したところで、
君がインデックスを理解する事には繋がらないよ
君は努力の方向を間違ってる
(ネットにはこのタイプも多いけども)
2025/01/22(水) 13:23:48.02ID:0peR6PAs
どんなにアスペな言い訳しようが君がバカだという事実に変わりはないよ
2025/01/22(水) 13:46:46.67ID:ZVwqoD6m
>>405です

途中、どうも複合主キーの検索が遅く、複合主キーかフィールドを2つ削除して
と書きましたが、少し理解するうちに、フィールドを削除せずとも順序を入れ替えることで高速化したこと
また、複合主キーの最左から順に一連の(部分)フィールドで検索できない場合は、別途インデックスを設定することで効果が得られることを確認しました

理解不足は否めませんが、実用上問題がないレベルとなったので、これでよしとします
ありがとうございました
2025/01/22(水) 18:46:15.47ID:VcBzYOin
>>413
> 複合主キーの最左から順に一連の(部分)フィールドで検索できない場合は、別途インデックスを設定することで効果が得られることを確認しました
当たり前、というかDBの使い方の初段階で説明/理解すべき事柄

> 途中、どうも複合主キーの検索が遅く、複合主キーかフィールドを2つ削除して
> と書きましたが、少し理解するうちに、フィールドを削除せずとも順序を入れ替えることで高速化したこと
そうじゃない
ひととおり設計を理解した上で弄くり回して理解を深めるのなら身に付くが、
今の君のように、何も理解してない状態で試行錯誤したところで時間の無駄でしかないよ
(それよりは記事を漁って理解するまで何度も読み込む努力をした方が何倍もいい)

とはいえ、現実問題としてaccessの実アプリの方が優先なのは分かる
半年に一度くらいしかSQLも書かないのなら今の状態もありだ
ただ、毎日SQLを書いてる状況なら、どのみちいつか理解しなければ不便で仕方ないだけなので、
出来るだけ早いうちに理解を深めておくべき

例えばさ、>>383に戻ると、(この事を言ってるのかもしれんが)
複合主キーを(PK1, PK2, PK3)ではなく、
(PK2, PK3, PK1)としてテーブルを作成しておけば、今回のインデックスを別に作成する必要はなかったろ
だからテーブル作成時の時点で、将来どういうクエリが発行され、インデックスがどう適用されるかも設計されてるし、
逆に今の君のような状態では、適切なテーブル設計は出来ないんだよ
というか、
> 検索キーとしてPK2とPK3だけをよく用いるとき
の場合はむしろ(PK2, PK3, PK1)とするのが普通で、
つまり今回はテーブル設計を間違えてて、それは君がインデックスが何たるかを理解してないから
勿論追加でインデックス張ればクエリは高速にはなるけども、修正の仕方が正しいわけではないよ
2025/01/22(水) 21:30:12.00ID:o3lkJXbH
おっさん、文章が長いな。もっと簡潔に書きなさい。あなたの文章にインデックス貼ってクエリもチューニングした方が良いぞ
2025/01/22(水) 23:15:16.32ID:J/9pPL5e
絵に書いたような老害だなw
2025/01/22(水) 23:17:45.52ID:J/9pPL5e
ありゃ「描いた」だぞと老害に指摘されそうだなw
2025/01/22(水) 23:29:43.66ID:I1bb5L41
老害でも技術力があれば匿名掲示板では役立つけどどう見てもないから救いようがない

絶対干されてるタイプ
2025/01/23(木) 19:03:57.14ID:0iiPrNry
どうでもいいけど、制約とインデックスを同一として扱ってるのがモヤるわ
ユニーク制約と主キー制約をインデックスで処理しないDBMSはみたことないとしても
2025/01/23(木) 19:56:56.31ID:hJ60cV1T
お前の方が色々混同してそうだが
2025/01/23(木) 23:23:26.10ID:5wOSbPSv
さ…さすが〜!
し…知らなかった〜!
す…すごーい!
せ…センスい〜ぃ!
そ…そうなんだ〜!
(「合コンさしすせそ」より)
2025/01/23(木) 23:29:29.44ID:rNgwBkvb
制約の話で思い出したがAccessの場合は
foreign key制約を設定すればインデックスが自動で出来たはず

(PK1, PK2, PK3)で構成される複合主キーがあって
検索キーとして(PK2, PK3)を利用したいということなら
PK1と(PK2, PK3)は違う親テーブルから主キーを引き継いでるんだろうから
そこにインデックスを張らないという選択はほぼ無いな
2025/01/24(金) 04:28:21.32ID:agkokgy5
383以降を見る限り、そんな高級な話ではなく、まるっきり分かってなかっただけだろ
そして(PK2,PK3,PK1)と出来なかった理由の推定なら、そこは(PK1,PK2)とPK3とくくるべき
2025/01/24(金) 11:19:27.52ID:SzuokRLj
分かってないのになぜ無理して絡もうとするのが
2025/02/03(月) 18:36:54.12ID:hEyRnoXc
PostgreSQLを使っているのですが、

更新前のデータも参照したいので、
更新処理を、元のデータに変更を加えたデータを追記し、更新元のデータに最新ではないフラグを付ける形でやっています。

新しくカラムを追加したのですが、更新処理の変更を忘れて、更新すると新しいカラムがデフォルト値に戻されてしまうバグを作ってしまいました。

既存の行をコピーして、primary keyと変更したいカラムだけ変更する方法ってありませんか?
2025/02/03(月) 23:14:40.68ID:k1KW9LUA
>>425
>既存の行をコピーして、primary keyと変更したいカラムだけ変更する方法ってありませんか?
この質問はバグにより作成されたデータの復旧作業方法として質問してる?
それとも一般的にそういう方法ないかということ?
あるいはカラム追加やカラム名の変更があっても更新処理のSQLを修正しなくてもいいようにする方法を聞いてる?

>更新前のデータも参照したいので、
ここで言いってる”参照”は外部キーとして他のテーブルから参照するという意味?
それとも単に更新履歴が閲覧できればいいという意味?
2025/02/06(木) 00:29:05.51ID:4njYbkok
>>425
あるよ
selectしたものを使ってupdateすればいい
428デフォルトの名無しさん
垢版 |
2025/02/07(金) 21:07:33.75ID:lNWVt+S0
>>425
トリガーというものがあります
429デフォルトの名無しさん
垢版 |
2025/02/07(金) 21:08:11.88ID:lNWVt+S0
>>425
https://www.postgresql.jp/docs/9.4/sql-createtrigger.html
2025/02/07(金) 22:21:05.36ID:mS2jfvem
むしろトリガーの変更を忘れてバグったんじゃないの?
2025/02/07(金) 23:13:03.59ID:El81lTJA
> PostgreSQLでは、トリガ動作として、ユーザ定義関数の実行しか認めていません。
> 標準では、多数の他のSQLコマンドを実行させることができます。
> 例えば、トリガ動作としてCREATE TABLEを実行させることも可能です。
> この制限を回避する方法は簡単です。必要なコマンドを実行するユーザ定義関数を作成すればよいのです。
糞仕様杉ワロタ
432デフォルトの名無しさん
垢版 |
2025/02/08(土) 11:50:00.86ID:+3qBIV3v
> この制限を回避する方法は簡単です。必要なコマンドを実行するユーザ定義関数を作成すればよいのです。

この方針は正しいと思うけどな
こういうセキュリティに敏感な場所は出入口を一ヶ所に絞るのは基本だよ
2025/02/08(土) 12:46:18.46ID:3VVdck+P
いや色々おかしいよお前、多分DB板出身だろうから帰れ
逆に質問者もDB屋ならDB板の方が合ってるとも思うが
2025/02/08(土) 13:11:35.92ID:fsW85FYF
正しいわけないだろw

Postgresの仕組み的に関数化が必要なら内部的にラップしとけばいいだけ
実行権限をトリガに対して設定できないとか非標準を維持し続けるほど大した意味はない
2025/02/09(日) 03:19:16.45ID:BAiRqfzU
ここの人らはNoSQLはどういう扱いなの
2025/02/09(日) 12:18:58.85ID:kD9FDD3o
俺個人としては同じDB枠の扱い
プライマリキーやインデックス等、DBとしての使い方は同じで、
それを設定する言語が、SQLか、或いは一般プログラミング言語か、という程度だから

だからこのスレも俺には「DBなら俺に訊け」でもいいんだが、このスレはテンプレないんだな
俺が主流派かどうかは分からない
SQLじゃないとヤダ、って奴が多ければスレを分けるべきだろうが、
正直分けるほど人いないし、NoSQLもここで聞いていいのでは?答える奴が居るかは知らんが

ただ、383も425も、SQLではなく、DBを分かってないから話がおかしくなってるので、
実質SQLではなくDBの質問になってるし、NoSQLでも結果的に同じだと思うよ

個別DBに特化した話等なら、DB板に行った方がいい
ただ、DB板の連中はプログラミングをしない/出来ないようなので、
432のように、プログラマから見たら明らかにトンチンカンな回答が返ってくる
それでもDB固有の問題には詳しいだろうよ
437デフォルトの名無しさん
垢版 |
2025/02/09(日) 18:18:30.19ID:qhqoX22r
>>431
トリガーそのものにロジックは必要ないとしてトリガーを仕様に取り込んだせいでそうなっただけ
438デフォルトの名無しさん
垢版 |
2025/02/09(日) 18:19:47.93ID:qhqoX22r
>>434
Oracle以外はあとからOracleDBに追従したから、元のクソ仕様のせいで制限がたくさんある。
2025/02/09(日) 18:31:02.14ID:mMq7ancL
出た!
DB板の荒らし
通称ボラクル君w
2025/02/09(日) 22:11:42.79ID:uTje1YE2
>>436
おまえ>>383のやり取りで嘘ばっか書いてたやつじゃん
反省したのか?
2025/02/09(日) 22:42:05.59ID:JhqniwEL
ならお前が正しいと思うことを書けばよいだけでは?
2025/02/10(月) 00:33:14.69ID:VZ2XQokR
nosqlは独自に覚えなきゃいけないことが多すぎるうえに制約も多い
awsとazureで同じ設計が通じるわけでもないし
443デフォルトの名無しさん
垢版 |
2025/02/10(月) 11:53:19.06ID:Z13/KCo3
KVSですね判ります
2025/02/10(月) 12:41:14.64ID:y2n5AJNm
ベンダー違っても中身は全部Redisという場合もあるし単純なセッション管理にKVSを使うとかならベンダー違っても基本的に同じ設計になるしユースケース次第でいろいろ

NoSQLって言うだけだとリレーショナルじゃないくらいの意味しかなくて広すぎるから細かい話は一括りにはできない
2025/05/11(日) 23:41:50.22ID:SmeYoeAy
ミックさんの達人SQLは名著だと思うんだけど、関係が体であるとしている点については、群ですらないというamazonレビューの指摘の方が正しいように思うんだよね。ただ自分は文系で群とかちゃんと勉強したことないのであまり自信はない。数学できる人教えて。
446デフォルトの名無しさん
垢版 |
2025/05/12(月) 19:12:28.13ID:RxQ7/dSc
>>445
集合は数学とは違うよ
2025/05/13(火) 14:41:24.56ID:C/NhftFY
SQLで無限集合出来んかな
448デフォルトの名無しさん
垢版 |
2025/05/14(水) 00:52:49.17ID:qxlPxgMn
なんで havingとwhereは使い分ける必要があるの?
全部whereで済むように仕様を直してほしい
2025/05/14(水) 01:47:48.71ID:tUJULNxS
意味違うと思うぞ。whereだけじゃ足りないんじゃね
2025/05/14(水) 01:55:11.10ID:tUJULNxS
評価対象が行とグループ
評価タイミングも違うとchatGPTが教えてくれた
2025/05/14(水) 06:22:22.00ID:qNLCsgAG
そんなこともAIに訊かなきゃわからないんかよw
2025/05/14(水) 08:46:47.35ID:e7a03hqN
スレ主じゃないので
LLM勉強になるぞ
453デフォルトの名無しさん
垢版 |
2025/05/14(水) 11:40:16.61ID:Ran/8XYC
グループ化と関係なくHAVINGを使っているんだろうなw
454デフォルトの名無しさん
垢版 |
2025/05/14(水) 11:41:17.83ID:Ran/8XYC
>>452
AIチャットは間違いを指摘してくれない
2025/05/14(水) 12:56:57.46ID:1iop83U8
LLMの勉強する前に対人会話の勉強しよう?
2025/05/14(水) 13:29:13.49ID:e7a03hqN
お前らもネラーだからLLMと大差ないぞ
教科書レベルの話はLLMさんが正確さ
2025/05/15(木) 09:52:35.44ID:3t3KbsMR
結局、>>445ってどう? 素人考えでは、群の条件のうち、「任意の元に対する逆元が存在する(逆元も関係の元である必要がある)」を、関係および関係上の演算は満たさないようにも思うんだけど。
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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