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

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

ただいまの
回答率

87.35%

DBを使わず、sqlで複数行の結果を得たい

解決済

回答 6

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,679

score 32

やりたい事

mysqlで、DBを使わず、sqlで複数行の結果を得たいです。
目的は3000行程度のサンプルをsqlのみで作る事です。
(なお業務等ではなく、"このような事は出来るのか?"という勉強用です。なのでDBを使う代替案はご遠慮下さい)

環境

mysql 8.0.17

例えば、これで1行の結果が得れます。

mysql> select "A" as c1;
+----+
| c1 |
+----+
| A  |
+----+

3行程度ならこれでいけます。

mysql> (select "A" as c1,"B" as c2) union (select "C", "D") union (select "D","E");
+----+----+
| c1 | c2 |
+----+----+
| A  | B  |
| C  | D  |
| D  | E  |
+----+----+

流石にこれ以上はやってられないので、できれば自動生成したいです。

条件

下記は不可の条件です。下記は避けて実施したいです。

  • 既に存在するテーブルをselectして、そこから表示を生成する
  • ストアドプロシージャを利用する
  • テンポラリテーブルを利用する
  • シェル等で長文のsqlを自動生成する

妙な条件があるのは、力技っぽくて後学の為にならなそう、と判断したからです。
また今後仕事に使う事があるのなら、システムに変更が必要だったりするものも除きたいです。

一応joinで倍々に増やした後、limitで減らす、というのも考えたのですが、
もっとスマートな方法があるのでは、と期待しています。

よろしくおねがいします。

追記

なんか相当ズレた質問だったようで、すみません。

自分がやりたいのは、

mysql> select MD5(RAND());
+----------------------------------+
| MD5(RAND())                      |
+----------------------------------+
| 6fc47216844543da2c587b4465781e29 |
+----------------------------------+


これを色々SQLを弄ると

+----------------------------------+
| MD5(RAND())                      |
+----------------------------------+
| 6fc47216844543da2c587b4465781e29 |
| 14d745e539e89ba748d3c63293a5e686 |
| 8b0c4ee93625d523850e79be293c796e |
| a5c1f346e7c20e35fb10a6d54789fba4 |
+----------------------------------+


こんな感じの出力が得れるのでは、と思ってた次第です。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2019/09/10 21:43 編集

    「"このような事は出来るのか?"という勉強用」というのは
    SQLの勉強を、DB環境を構築せずに行いたいということでしょうか?
    それともSQLの勉強の1つとして、テーブルを介さずにデータを生成したいということでしょうか?

    キャンセル

  • katosei

    2019/09/10 21:56

    SQLの勉強の1つとして、です。

    DBを作成出来る環境はあるのですが、そうそう弄れない環境も多いので
    出来る選択肢を増やしておきたい意図です。

    具体的に”これ”というものはないですが、この質問を思い立った理由が
    「10行ぐらいのデータ適当に欲しいけど、テーブル作るの面倒臭い」だったので
    ワンライナーのように即興で出来る何かがあれば、学んでおきたいと思った次第です。

    キャンセル

  • 退会済みユーザー

    2019/09/11 00:32

    複数のユーザーから「問題・課題が含まれていない質問」という意見がありました
    teratailでは、漠然とした興味から票を募るような質問や、意見の主張をすることを目的とした投稿は推奨していません。
    「編集」ボタンから編集を行い、質問の意図や解決したい課題を明確に記述していただくと回答が得られやすくなります。

回答 6

checkベストアンサー

+3

「sql チューリング完全」でググるとSQLはチューリング完全のようです。
with recursiveがポイントとなるようで、どうやらMySQLでも使えるようです。
なのでたぶんできます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/12 10:20 編集

    レスポンスが遅くなり申し訳有りません。
    おかげさまで、無事できました。

    ```
    mysql> WITH RECURSIVE r(i, md5) AS ( SELECT 1,md5(rand()) UNION ALL SELECT i+1,md5(md5) FROM r WHERE i < 10 ) SELECT * FROM r;
    +------+----------------------------------+
    | i | md5 |
    +------+----------------------------------+
    | 1 | 7acf9df571e086269e8d3264eb62e117 |
    | 2 | b6622c29760160d1e1a542cfbea6f3e0 |
    | 3 | d0772606e37d1e87b391b464dfbd1838 |
    | 4 | ff5b0ade766ac498ce45f33e4046fdfa |
    | 5 | a26ce08a67240648f8e079553a96cd71 |
    | 6 | 493be49766df70ac777d4eae05f639ff |
    | 7 | 4db386c106da819b2d9094281a41a19b |
    | 8 | 1a494b7a24e058285f4fec386d490927 |
    | 9 | 8332ad2e256416cf851d61c6e7fdf069 |
    | 10 | a7d9c10d6052881424eb69b3ece64b42 |
    +------+----------------------------------+
    10 rows in set (0.00 sec)
    ```

    これぐらいなら即興で書けそうです。ありがとうございます。

    キャンセル

+1

エディタでコピペした方が早そうだけど。
SQLを覚えたくないとか、使いたくないなら、データベースとは関係ない方面の技術を身につければ良いだけでは?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/10 21:36

    いや、むしろSQLの使い方を覚えたいのです。

    shellだったらcatやechoで適当な文字列を出した後に、
    パイプでつないでawkやsedの練習が出来ると思います。
    それをsqlでやりたいだけです。
    シェル芸とかワンライナーみたいなノリだと思って下さい。

    実際に使う際には、その結果をサブクエリとして、それを弄る感じで遊びたいと思ってます。
    DB作るなら、数百万行ぐらいのランダムデータ作るぐらいは出来ている状態です。

    キャンセル

  • 2019/09/10 21:58

    ナチュラルジョインしてRAND関数を使えば簡単にできることでしょう。
    質問にSQLを追加してどうやったらもっと希望するデータが作れるか、改善方法を求めては?
    「SQL入門」でググるなり、書籍を買ってきて勉強した方が早そうですけど。

    キャンセル

+1

以下のSQLはSQLiteですがWITH句とDUAL表、CROSS JOINが使える
SQLなら似たようなものが作成できると思います。

WITH T1 AS (
  SELECT 0 UNION ALL SELECT 0
), T2 AS (
  SELECT * FROM T1 S1 CROSS JOIN T1 S2
), R AS (
  SELECT * FROM T2 S1 CROSS JOIN T2 S2 
)

SELECT ABS(RANDOM()) % 10
  FROM R AS R1
    CROSS JOIN R AS R2
    CROSS JOIN R AS R3
  LIMIT 3000;

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/12 10:22

    レスポンス遅くなりました。

    元々はunionを指定個数並べるしか無いと思ってたんですが、目からウロコでした。
    ありがとうございました。

    キャンセル

0

ここを読んでみてください。

B.5.2.10 パケットが大きすぎます

パケットは、MySQL サーバーに送信される単一の SQL ステートメント、クライアントに送信される単一の行、またはマスターレプリケーションサーバーからスレーブに送信されるバイナリログイベントです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/10 21:42

    よく読んだら

    > シェル等で長文のsqlを自動生成する

    もだめなんですね。
    どうやって自動生成するつもりなんだろう。

    キャンセル

  • 2019/09/10 21:43

    そもそもSQLに詳しくないので、なんか色々やれば出来るもんだと思ってました。
    (縛ったというか、もっとスマートな方法があると思いこんでました。)

    機能上、難しいという事がわかればそれで十分成果なので、
    別のやり方を探したいと思います。

    キャンセル

  • 2019/09/10 21:51

    仕事でどう使うかさっぱりです。保持されないデータなんか、遊びにしか使えないんじゃないでしょうか。

    キャンセル

0

行を作るのが面倒という事で良いでしょうか?
データ分析で必要な連続した値を生成する

MySQLではどうしても元になるデータが必要になってしまいますので、SQLだけでなら諦めて下さい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/12 11:23

    postgresなら現状有償の制限なくチューリング完全です。
    便利な機能が多いので、小規模なら一択でも問題ないかと思われるのでお勧めです。

    キャンセル

  • 2019/09/12 12:17

    あれ、ちなみに自分が使っているのはcomunity serverの方なので、無償版です。

    キャンセル

  • 2019/09/12 13:09

    商用だと有償部分が発生するので、利用者が多いのはmariadbの方じゃないかと思います。
    その場合はチューリング完全ではないので、使いたくても使えないという懸念はありますね。

    キャンセル

-3

シェル等で長文のsqlを自動生成する 

これがアリならエディタ使ってコピペで増やして可変にしたいところは何らかの置換ツールを使うのが一番楽だと思いますが。つか何の勉強にもなってない気がするけど、どういう意図なんだコレ…。


追記
誤読してた。
やりたくない条件って意味か。(ややこしい…)

正直意図がわかんないし、DBを使いこなそうとしてるようにも見えないんで、回答放棄します。無視してください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/10 21:29

    そのままsqlで複数行の結果を出してみたいだけです。
    実際に使うなら、サブクエリでその結果を弄る感じになるかと思います。(任意のテストデータを即興で作りたい)

    シェル芸とかワンライナーみたいなものが、sqlでも出来るのかしりたいのです。

    キャンセル

  • 2019/09/10 21:35

    > シェル芸とかワンライナーみたいなものが、sqlでも出来るのかしりたいのです。
    まぁそういう意図であれば「問題・課題が含まれていない質問」に該当すると判断されると思いますが。
    https://teratail.com/help/avoid-asking

    キャンセル

  • 2019/09/10 21:52

    「SQLを使ってこのような事は技術的に可能か?」は課題ではないのでしょうか?

    と思ってはいるのですが、ここで議論しても何も産まないですね。

    荒れたりとか、言い訳してズルズル引き伸ばすのも本位ではないので
    この件についてはそろそろ幕引きにさせて下さい。
    自分の質問がちゃんと固まっていなかったのが一番の原因なので。

    キャンセル

  • 2019/09/11 01:08 編集

    リンク先を読めば書いてある話ですが

    > teratailは困っている人の質問を解決するサービスです。そのため、漠然とした興味から票を募るような質問や、意見の主張をすることを目的とした投稿は推奨していません。
    > 何か困っている理由があり、最適解を見つける為の知見を得たい場合は、その理由や何が知りたいのかを明確に記述してください。

    これを読んだ上で、この質問の「困っている」ことと「解決するべき課題」は何で、「漠然とした興味ではない」とする材料は何だろう?と考えると、私には見つけられなかったという事です。(変な縛りをしているところを含めて)

    それを実現するべき具体的な理由があれば別に良いんですけど。

    キャンセル

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

  • ただいまの回答率 87.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る