sql基本查询

sql基本查询,sql,Sql,我是sql新手,正在玩弄我找到的一些示例数据库。 我有一张名为student的桌子,如下所示 我试图找到那些在食物和社交上都花钱但在社交上花的钱比食物多的学生 我试过: Select name from student where item = 'social' and item = 'food' 没有一行数据包含item='social'和item='food'。由于WHERE子句一次应用于一行数据,因此不能这样做 您需要做的是将所有记录按学生分组,然后检查该组中数据的某些特征 SEL

我是sql新手,正在玩弄我找到的一些示例数据库。 我有一张名为student的桌子,如下所示

我试图找到那些在食物和社交上都花钱但在社交上花的钱比食物多的学生

我试过:

Select name
from student
where  item = 'social' and item = 'food' 

没有一行数据包含
item='social'
item='food'
。由于
WHERE
子句一次应用于一行数据,因此不能这样做

您需要做的是将所有记录按学生分组,然后检查该组中数据的某些特征

SELECT
  id,
  name
FROM
  student
GROUP BY
  id,
  name
HAVING
      SUM(CASE WHEN item = 'social' THEN 1 ELSE 0 END) > 0
  AND SUM(CASE WHEN item = 'food'   THEN 1 ELSE 0 END) > 0
这就给了所有学生一些关于社交的记录和一些关于食物的记录

AND SUM(CASE WHEN item = 'social' THEN expenditure ELSE 0 END)
    >
    SUM(CASE WHEN item = 'food'   THEN expenditure ELSE 0 END)
然后,您可以添加以下内容,以仅获取那些在
'social'
上花费比在
'food'
上花费更多的人

AND SUM(CASE WHEN item = 'social' THEN expenditure ELSE 0 END)
    >
    SUM(CASE WHEN item = 'food'   THEN expenditure ELSE 0 END)

其中item='social'和item='food'
不起作用,因为一行永远不能同时是这两行。比较同一表中的两行时,最简单的方法是进行自联接

SELECT
   s1.Name
FROM student s1
     INNER JOIN student s2
      ON s1.id = s2.id
WHERE
    s1.item = 'social' and s2.item = 'food' 
    and 
    s1.expenditure  > s2.expenditure
注:

  • 如果同一类型的支出有多行,则需要对不同类型的支出求和,然后进行比较

  • 如果你想包括那些没有在食物上花费任何金钱的人,你必须使用左键连接。您还需要将“food”的测试移到ON子句中,否则它将像一个内部连接

     LEFT JOIN student s2
      ON s1.id = s2.id
        and s2.item = 'food'   
    
  • 想想看:一个栏目怎么能同时具有“社交”和“食品”的价值?