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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

898閲覧

条件を満たすタプルを選択したい

_kei

総合スコア26

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/07/07 08:17

編集2021/07/10 08:41

前提・実現したいこと

以下のようなテーブルがあるとき、『会社名「BBB」が出版している本のジャンルをすべて出版している会社名を選択する』ということをSQLで実現したいです。

どのようなSQLを発行すればよいか教えていただきたいです。

テーブル「本」

会社名 | ジャンル | 値段 | ---------------------------- AAA | ア | 500 | AAA | イ | 400 | AAA | ウ | 300 | BBB | ア | 500 | BBB | イ | 400 | CCC | ウ | 300 | DDD | ア | 500 | DDD | イ | 400 | EEE | ア | 500 |

答えは、AAA、BBB、DDD を取り出したいと考えていますが、CCC、EEE を取り出してしまいます。問題文中の「すべて」をどう実現するのかが分かりません。

よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/07/07 08:19

で、どういうクエリーを書いたのかな?
_kei

2021/07/07 08:48

SELECT 会社名 FROM 本 WHERE ジャンル     IN ( SELECT ジャンル FROM 本 WHERE 会社名 = "BBB" ); これだと、問題文記載のような結果となってしまい、「すべて」を表現することができません。 どのように書けばよいかご指導いただきたいです。よろしくお願いいたします。
guest

回答2

0

ベストアンサー

書き方はいろいろあると思いますが、個人的にはJOINを使うクエリが好みです。

SQL

1SELECT H1.会社名 2FROM 本 H1 3JOIN 本 H2 ON H2.会社名 = 'BBB' AND H1.ジャンル = H2.ジャンル 4GROUP BY H1.会社名 5HAVING COUNT(*) = (SELECT COUNT(*) FROMWHERE 会社名 = 'BBB')

2021/07/07 19:23追記

JOINを利用しない方法だと、例えば以下のようになります。

SQL

1SELECT 会社名 2FROM 本 H1 3WHERE EXISTS ( 4 SELECT * 5 FROM 本 H2 6 WHERE H2.会社名= 'BBB' 7 AND H1.ジャンル = H2.ジャンル 8) 9GROUP BY 会社名 10HAVING COUNT(*) = (SELECT COUNT(*) FROMWHERE 会社名 = 'BBB');

ところで、タグにはMySQLとありますが、実際にはMS Accessを利用されているということはないでしょうか? であれば先に示したJOINを利用したクエリは以下のようにする必要があります。

SQL

1SELECT H1.会社名 2FROM 本 H1 3INNER JOIN 本 H2 ON (H2.会社名 = 'BBB' AND H1.ジャンル = H2.ジャンル) 4GROUP BY H1.会社名 5HAVING COUNT(*) = (SELECT COUNT(*) FROMWHERE 会社名 = 'BBB')

投稿2021/07/07 09:18

編集2021/07/07 10:26
neko_the_shadow

総合スコア2225

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

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

_kei

2021/07/07 09:43

この問題文の編集と入れ違いになっている可能性があるのですが、いかがでしょうか? joinを使う方法を教えてくださりありがとうございます。joinを使わない方法を教えていただけますと幸いです。 勉強不足で申し訳ございません。
_kei

2021/07/07 14:10

ご回答ありがとうございます。期待する結果を得ることができました。このSQL文理解に努めたいと思います。 「ところで、タグにはMySQLとありますが、実際にはMS Accessを利用されているということはないでしょうか? 」MySQLとMS Accessでは構文の動作が違うようですね。そのあたりの知識がなく、同じだと思っていたので誤ったタグをつけてしまいました。 恐縮ですが、「H1」「H2」などはどのような意味なのかヒントをいただけると幸いです。参考書などで見かけない表現であり、ネットで検索してもヒットせず理解することに苦労しています。 お時間がありましたら、教えていただけると幸いです。
neko_the_shadow

2021/07/08 17:05

> 恐縮ですが、「H1」「H2」などはどのような意味なのかヒントをいただけると幸いです。 これはエイリアスとか表別名とか呼ばれる機能です。参考: https://oss-db.jp/dojo/dojo_13
_kei

2021/07/08 20:05

ご返信ありがとうございます。 詳細なご回答までいただいた上に、参考記事までいただきありがとうございます。ご教授いただいた内容を踏まえ、今後も学習を継続していきたいと思います。
guest

0

前回とほぼ同じでは?

SQL

1select 会社名 from2group by 会社名 3having sum(ジャンル in (select ジャンル fromwhere 会社名='BBB')) =(select count(*) fromwhere 会社名='BBB')

投稿2021/07/07 09:16

yambejp

総合スコア114583

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

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

_kei

2021/07/07 09:40

「集計関数の一部としてのSUM()=が含まれていません」というエラーが出力されます。 この問題文の編集と入れ違いになっている可能性があるのですが、いかがでしょうか? 勉強不足で申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問