SQLなら俺に訊け [無断転載禁止]©2ch.net
1デフォルトの名無しさん
2017/07/14(金) 07:40:53.63ID:HFjsarQi さあ
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とか関係なしに全行数
違うよ
select * from fooは、「fooテーブルの全カラム」という意味
count()の方は、
count(column_name)とカラム名を指定したときは、column_nameがnullではない行数が取得される
count(*)だとnullとか関係なしに全行数
2017/07/21(金) 05:29:05.88ID:5O09iCBm
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"
こう変換するクエリって書ける?
なるべく標準がいいけどポスグレ依存でも可
"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:FYBJnXXr108
2017/08/30(水) 08:02:42.85ID:ItMe6Tvy 再帰クエリでできました
SQLは業務で使うことも多いのにSQLスレに人がいないのは寂しいですね
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)だと場合によっては中途半端なデータが返る時があり、これは避けたいのです。
なお初心者の為上記前提がいろいろ間違っているかもしれませんが、その辺はご指摘下さい。
複数の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じゃないから勘違いしてるとかじゃなくて?
デフォルトが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
そうなのかもしれませんが、それを変える方法が分かりません。
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
レスを投稿する
ニュース
- テレビ朝日 本社から男性が転落し死亡。関連会社社員か 当たった通行人が左肩軽傷 [阿弥陀ヶ峰★]
- 「これいいじゃん!!!」 セブン-イレブンの1620円で買える“1人用クリスマスケーキ”🎂に注目殺到「天才すぎる」 [パンナ・コッタ★]
- テレビ朝日本社から20~30代の関連会社社員とみられる男性が転落し死亡 六本木けやき坂通りの通行人にはけが人なし [少考さん★]
- 高市早苗首相が天理教系企業に“巨額発注” 総額5000万円 本人は「政治団体の活動に必要な支出」と回答 ★2 [Hitzeschleier★]
- 小島瑠璃子さん、代表取締役を務める会社を破産申請 [牛丼★]
- 「残クレ」でマイホーム、国が銀行向け保険 新型住宅ローン普及促す -日経 ★3 [少考さん★]
- 【悲報】ジャップ、日中戦争に賛成が5割弱...軍歌の音が聞こえる... [856698234]
- お前らの「バロメーター」って何?
- 【悲報】小泉防衛大臣、中国のレーダー照射事件をNATO事務総長に報告 [834922174]
- 【乞食速報】プロクオリティ ビーフカレー 96食 4262円 [268244553]
- 【高市悲報】石破さん、有能だった模様.. [308389511]
- ひまだねー
