SQL SELECT查询语句

时间:2013-11-21 21:40:07

标签: mysql sql sql-server select join

这些是我正在使用的创建表:

create table Customer2 (
    cid char(3), cname char(10), primary key (Cid)
);
create table Employee2 (
    eid char(3), ename char(10), salary number(7,2), mid char(3),primary key (eid), foreign key (mid) references Employee2
);
create table ArtObject2 (
    aoid char(3), atitle char(12), artist varchar(10), pricea number(8,2), primary key (aoid)
);
create table MakesD2 (
    aoid char(3), eid char(3), cid char(3), prices number, dates date, primary key (aoid,CID), foreign key (aoid) references ArtObject2, foreign key (CID) references Customer2, foreign key (eid) references Employee2
);

我需要编写以下SQL语句:

  1. 列出没有以要价购买任何油画的顾客的名字 高于$ 500,000.00
  2. 查找购买数量最多的客户的姓名
  3. 为每幅画卖出展示画作的标题,由客户支付的价格 如果这幅画的售价高于平均要价,而且“低于平均水平”这幅画是出售的,那么“高于平均水平” 价格低于平均要价。对于包含“高于...的单词”的列 问“或”低于询问“制作标题备注。
  4. 我为#1尝试了这个声明,但确实返回了太多结果:

    select cname from customer2 
    where cid in (select cid from makesd2 
         where aoid in (select aoid from artobject2 
               where pricea <= '500000'));
    

    我为#2尝试了这个声明,但没有返回结果:

    select c.cname from customer2 c 
    inner join(select cid, count(*) as bought 
        from makesd2 
        group by cid m on m.cid = c.cid 
        order by m.bought;
    

    我为#3尝试了这个声明并且它有效,它只是错过了第一个应该是'Spring'的结果:

    select a.atitle, m.prices, 'Higher than average' as "Price" from artobject2 a 
      join makesd2 m on
        a.aoid = m.aoid
        and a.pricea > (select avg(pricea) from artobject2)
    union
    select a.atitle, m.prices, 'Lower than average' as "Price" from artobject2 a 
      join makesd2 m on
        a.aoid = m.aoid
        and a.pricea <= (select avg(pricea) from artobject2);
    

2 个答案:

答案 0 :(得分:0)

这里所有3个查询的

现场演示 =&gt; http://sqlfiddle.com/#!3/5b3b9/6 如果您在小提琴的左侧部分填充数据,您可以在那里看到结果!

以下是带有解释的SQL语句。

#1的SQL查询

SELECT C.* 
FROM Customer2 C
LEFT JOIN MakesD2 M ON C.cid = M.cid
INNER JOIN ArtObject2 A ON A.aoid = M.aoid
WHERE A.pricea >= 500000
AND M.cid IS NULL

#1 Sql的解释:您使用MakesD2进行LEFT JOIN,因此它返回来自Customer2的所有客户,如果他们没有销售,那么MakesD2中的cid对于条件将为NULL ArtObject2中的价格超过500,000

#2的SQL查询

SELECT c.cname AS 'Customer Name', COUNT(*) AS 'Purchases'
FROM Customer2 C
INNER JOIN MakesD2 M ON C.cid = M.cid
INNER JOIN ArtObject2 A ON A.aoid = M.aoid
GROUP BY c.cname ORDER BY 2 DESC;

#2 Sql的解释你在客户,2 MakesD2和ArtObject2以及GROUP BY Cname之间进行INNER JOIN(即EQUI JOIN)并计算COUNT(*)这将是购买数量,然后订购它的DESC,所以最多的购买将在TOP。如果您只想要前5名,请在SQL SELECT TOP 5中使用SELECT

#3的SQL查询

DECLARE @AveragePrice NUMERIC(8,2)
SELECT @AveragePrice = AVG(pricea) FROM artobject2

SELECT A.atitle AS 'Title', m.prices AS 'Price Paid',
CASE WHEN (m.Prices > @AveragePrice)
     THEN 'Higher than average' 
     WHEN (m.Prices < @AveragePrice)
     THEN 'Lower than average' 
     ELSE 'At Average'
   END AS 'Remarks'
FROM MakesD2 M
INNER JOIN ArtObject2 A ON A.aoid = M.aoid;

#3 Sql的解释将平均价格存储在变量中,然后在CASE开关语句中使用它来确定销售价格是高于还是低于平均值。

答案 1 :(得分:0)

#3(MySQL)的SQL查询:

SELECT @AVGPRICE := AVG(pricea) FROM artobject2;

SELECT a.atitle,
       m.prices,
       IF (a.pricea > @AVGPRICE, 'Higher than average', 'Lower than average') AS Remark
FROM artobject2 AS a JOIN makesd2 AS m USING (aoid);

首先,您从artobject2计算平均价格并将其保存在本地变量中。

但是,我不太确定这是你想要的。也许你最好提供一些测试数据。例如:

001 Drinker, by Teomondo Scrofalo
002 La Gioconda, by Leonardo da Vinci

001 250
001 300
001 350
002 1000000000
002 1200000000
002 1400000000

出价表中的“平均价格”约为500,000,000欧元。因此绘制001将始终低于平均值,绘画002将总是高于平均值。

不同的方法和不同的结果:

SELECT a.atitle,
       m.prices,
       IF (a.pricea > averag, 'Higher than average', 'Lower than average') AS Remark
FROM artobject2 AS a JOIN makesd2 AS m USING (aoid)
JOIN (SELECT aoid, AVG(pricea) AS averag GROUP BY aoid) AS averages USING (aoid);

现在内表会产生

001 300
002 1200000000

你会得到

001 250 Lower
001 300 Lower -- Note: this is because "equal" is considered "lower"
001 350 Higher
002 1000000000 Lower
002 1200000000 Lower
002 1400000000 Higher

你甚至可以使事情复杂化:

SELECT a.atitle,
       m.prices,
       CASE
           WHEN a.pricea < averag*0.95 THEN 'Lower than average'
           WHEN a.pricea > averag/0.95 THEN 'Higher than average'
           ELSE CONCAT('About average of ', averag)
       END AS Remark
FROM artobject2 AS a JOIN makesd2 AS m USING (aoid)
JOIN (SELECT aoid, AVG(pricea) AS averag GROUP BY aoid) AS averages USING (aoid);

001 250        Lower than average
001 300        About average of 300
001 350        Higher than average
002 1000000000 Lower than average
002 1200000000 About average of 1200000000
002 1400000000 Higher than average