2016-05-31 38 views
-1

我是SQL新手,刚开始在家中创建自己的SQL Management Studio 2014数据库。所以我仍然在学习基础知识。 该数据库被称为FitnessClub(我组成的一家虚构公司)。需要关于创建SQL查询的指导

该数据库中,我有表:学生,体育和PupilsSports(?我想你把它结合表),请假设我已经在所有表正确排序出来的PK和FK。

我决定添加20个学生和10个运动。我已经连续分配了10个运动项目的前10名学生,这意味着剩下的10名学生没有被分配到一项运动。

在我的PupilsSports表中,我有PupilID(PK)和SportID(PK)都与另外两张表中的相应列有关,这就是我添加了10个运动的10个学生的简单方式这样的:

+-----+-------+ 
    | P.ID | S.ID | 
    +-----+-------+ 
    | 1 | 1  | 
    | 2 | 2  | 
    | 3 | 3  | 
    | 4 | 4  | 
    | 5 | 5  | 
    | 6 | 6  | 
    | 7 | 7  | 
    | 8 | 8  | 
    | 9 | 9  | 
    | 10 | 10 | 
    +-----+-------+ 

我想创建,我可以运行,找出谁没有被分配到一个体育小学生列表中的SQL查询?这可能吗?

谢谢

+1

是的,这很容易。如果你只是在学习SQL,那么你最好不要在网上免费提供的教程,也可能是一两本书,而不是在论坛上提问你想学习的每一种新技术。这个问题是非常基本的。 –

回答

1

外连接和空值的过滤器应该做的伎俩。事情是这样的:

SELECT 
    * 
FROM 
    Pupils 
    LEFT OUTER JOIN PupilsSports 
    ON Pupils.ID = PupilsSports.PupilID 
WHERE 
    PupilsSports.SportID IS NULL 

基本上是一个外部联接会给你加入这两个表,留下的值作为NULL在没有匹配记录发现的完整的超集。因此,对WHERE子句中NULL值的筛选应该减少结果集,使其仅包含未找到匹配连接记录的那些记录。

也许一个子查询的方法代替:

SELECT 
    * 
FROM 
    Pupils 
WHERE 
    ID NOT IN (SELECT PupilID FROM PupilsSports) 

有许多不同的方式来完成任务,我想。可能有趣的学习体验是查看SQL Management Studio中针对每种方法的查询执行计划,并查看它们之间的差异以及潜在瓶颈的位置。

+0

谢谢大卫。就像我的问题听起来那么基本,我不知道如何使用子查询! –

0

的方法很多的皮肤,猫......这里有一个这是比较容易理解:

SELECT * FROM Pupils WHERE PupilID NOT IN (SELECT PupilID FROM PupilsSports) 
0

为了不试图简单地为你写这个查询,我会试着指出你需要什么。首先,你需要将这两张表一起JOIN。 A LEFT JOIN将采用左侧表中的所有行,并且仅匹配右侧表中的行。

一旦你有一个所有的学生与他们相应的运动(或NULL没有体育)的清单,那么你可以使用WHERE语句过滤。请记住,要指示NULL值,您将不得不使用类似WHERE Sports IS NULL而不是使用相等运算符=