1

次のテーブルがあります。

モール:

+-----------+----------------------+------+-----+---------+----------------+
| Field     | Type                 | Null | Key | Default | Extra          |
+-----------+----------------------+------+-----+---------+----------------+
| MallID    | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
| Name      | varchar(45)          | NO   |     | NULL    |                |
+-----------+----------------------+------+-----+---------+----------------+

店:

+------------+----------------------+------+-----+---------+----------------+
| Field      | Type                 | Null | Key | Default | Extra          |
+------------+----------------------+------+-----+---------+----------------+
| StoreID    | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
| MallID     | smallint(5) unsigned | NO   | MUL | NULL    |                |
| Name       | varchar(45)          | NO   |     | NULL    |                |
| Revenue    | int(10)              | NO   |     | NULL    |                |
+------------+----------------------+------+-----+---------+----------------+

お客様:

+------------+----------------------+------+-----+---------+----------------+
| Field      | Type                 | Null | Key | Default | Extra          |
+------------+----------------------+------+-----+---------+----------------+
| CustomerID | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
| StoreID    | smallint(5) unsigned | NO   | MUL | NULL    |                |
| Name       | varchar(45)          | NO   |     | NULL    |                |
| Age        | smallint(3)          | NO   |     | NULL    |                |
+------------+----------------------+------+-----+---------+----------------+

Store.MallIDはの外部キーでMall.MallIDCustomer.StoreIDはの外部キーですStore.StoreID

1 - 総店舗収益が 100000 を超えるすべてのモールを選択したいと考えています。

select * from Mall where 100000 < ( select sum(Revenue) from Store where Mall.MallID = Store.MallID);

2 - 顧客がいないモールの名前を選択したい。

select Name from Mall where 0 = ( select count(*) from Customer, Store where Mall.MallID = Store.MallID and Store.StoreID = Customer.StoreID);

これらのクエリは正しいですか?

4

4 に答える 4

2

彼らは正しいです、私はあなたのためにそれらをチェックしました:

http://sqlfiddle.com/#!2/6a496/12

提案された sql コマンドのいくつかを使用することも、独自のものをそのまま使用することもできます (クエリを記述する方法はたくさんあります!)

1.

SELECT * 
FROM Mall 
where MallID in (
      SELECT MallID
      FROM Store
      GROUP BY MallID
      HAVING SUM(Revenue) > 100000)

2.

SELECT Name
FROM Mall
WHERE (SELECT count(*) 
       FROM Customer, Store 
       WHERE Mall.MallID = Store.MallID and Store.StoreID = Customer.StoreID
      )=0;
于 2013-09-18T11:33:27.360 に答える
2

クエリは期待どおりに機能します。2 番目は ANSI 標準join構文を使用して記述し、省略形をテーブル エイリアスとして使用することをお勧めします。

select Name
from Mall m
where 0 = (select count(*)
           from Customer c join
                Store s 
                on Mall.MallID = Store.MallID 
           where Store.StoreID = Customer.StoreID
          );

別の定式化は、すべてを単一の結合と集計として行うことです。

select m.Name
from Mall m left outer join
     Store s
     on s.MallID = m.MallID left outer join
     Customer c
     on s.StoredId = c.StoreId
group by m.Name
having count(c.CustomerId) = 0;

MySQL では、サブクエリで集計を行ってから結合することはお勧めしません。非常に優れた SQL ソリューションですが、MySQL は実際にはそのようなサブクエリの派生テーブルを作成するため、パフォーマンスに悪影響を与えることがあります。

于 2013-09-18T11:30:56.993 に答える
2

それらは正しいですが、それらを書くためのより良い(IMHO)方法があります:

SELECT m.*
FROM Mall m
JOIN (SELECT MallID, SUM(Revenue) totalRev
      FROM Store
      GROUP BY MallID
      HAVING totalRev > 100000) s
ON s.MallID = m.MallID

SELECT m.Name
FROM Mall m
LEFT JOIN (SELECT DISTINCT s.MallID
           FROM Customer c
           JOIN Store s
           ON c.StoreID = s.StoreID) s
ON m.MallID = s.MallID
WHERE s.MallID IS NULL
于 2013-09-18T11:18:26.997 に答える
0

クエリ 2 で外部結合を使用することをお勧めします。これは、店舗がなく、顧客がいない空のモールが存在する可能性があるためです。

select Name from Mall where 0 = ( select count(*) from Customer, Store where Mall.MallID(+) = Store.MallID and Store.StoreID = Customer.StoreID);

ありがとうニラジ・ラティ

于 2013-09-18T11:17:09.870 に答える