質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2421閲覧

データベースの中身をソートしたい

Moririn_1881

総合スコア18

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/07/17 08:50

編集2019/07/17 08:55

前提・実現したいこと

学校の課題でデータベースの性能評価の課題があります。
そこで、データベースの中身をソートし、その必要時間を計測します。。

SQL

1SELECT * FROM データベース名 ORDER BY time ASC

のように表示するのではなく、中身の順序の整理をしたいと思っています。

用いるデータベースは以下のようなものです。

id time name 1 23 Ken 2 34 John 3 12 Rei 4 45 Tom

期待すること

id time name 3 12 Rei 1 23 Ken 2 34 John 4 45 Tom

上のようにtimeの順番でデータベース内がソートされることを期待します。

試したこと

python

1UPDATE テーブル名 ORDER BY time DESC

で 並び替えを試みたが、下記のエラーが出てしまう。

発生している問題・エラーメッセージ

 

File "Sort.py", line 32, in <module> for row in cur.execute(select_sql): sqlite3.OperationalError: near "ORDER": syntax error

環境

python3.6.8
sqlite3をインポート

どうぞよろしくお願いいたします!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hentaiman

2019/07/17 08:55

ソート用の列はあるのかい?まさかinsert順を直して入れ直したいわけではないだろうし
Moririn_1881

2019/07/17 08:59

閲覧ありがとうございます。 恥ずかしいことながら、「ソート用の列」ということの意味をつかめないでおります。
hentaiman

2019/07/17 09:07

コマンドラインからselec打ったらinsert順した順で結果が表示されると思うけど、それはinsertした順に表示させますよーって言うルールがあるわけじゃなくてたまたまそういう順序で表示されているんです。 なので、並び順を示す列が無ければソート前・ソート後という状態自体がありません。
Moririn_1881

2019/07/17 09:16

>>たまたまそういう順序で表示されているんです。 「たまたま」その順序で出てきた、ということなんですね。 ありがとうございます。とても参考になりました。
hentaiman

2019/07/17 09:26

もし学校にoracleの入ってるサーバーがあったらそこにselect打たせてもらうといいよ。毎回順序ランダムだし、maimasukunさんの言っているrowidも明示的に列し指定すれば見れるよ、雑な言い方だけどrowidが保証されない事もわかるよ
Moririn_1881

2019/07/17 09:30

さらに詳しくありがとうございます。 学校のパソコンにあるか調べて試してみます!
guest

回答2

0

ベストアンサー

上のようにtimeの順番でデータベース内がソートされることを期待します。

無理です。SQliteのデータベース内部の順番はrowidというキー、あるいはINTEGER型のPRIMARY KEYがあればその順に従って並ぶようになっています(公式)。手動で並べ替えることはできません。


そして、4行しかないような状況であればすべてオンメモリで処理できますので、実データがどういう順番だろうが処理にかかる時間は誤差の範囲です。

投稿2019/07/17 09:01

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/07/17 09:03

そして、SQLの概念的には、順序は「存在しません」。データベースはあくまで「集合」ですので、順序に関してはORDER BYで明示的に指定しない限り、何の保証もされません。
Moririn_1881

2019/07/17 09:15

ご回答ありがとうございます。 ベストアンサーにさせていただきたいと思います。 「SQLの概念的には、順序は「存在しません」」 この知識が不足しておりました。ありがとうございます。 今回は例を見やすくするために4行だけで書きましたが、実際に計測するデータは1.2GBほどのデータ量があります。 質問の趣旨とは少し外れますが、このように大きなデータを扱う際、処理にかかる時間が変わるとすれば 、ある処理に対して最適化するようにデータベースを組み替えることはやはり不可能なのかもお時間があれば答えていただけると嬉しく思います。
guest

0

IDが順序を表し、timeの順に振り直したいという事なら、Rank()を使うと良いかと思います。

SQL

1update テーブル名 TGT set id=src.NewID 2from (select ID, rank() over(order by time, id) as NewID from テーブル名) as src 3where TGT.ID=SRC.ID

単に順序を付けて並び替えたいだけなら、

SQL

1select *, rank() over(order by time, id) as rank 2from テーブル名 3order by time, id

投稿2019/07/17 11:16

編集2019/07/17 11:23
sazi

総合スコア25184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Moririn_1881

2019/07/17 14:15

ありがとうございます。 早速試させていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問