T-SQL新手求助:使用SQL JOIN查询学生项目关联数据
嗨,作为T-SQL新手,咱们一步步来搞定这个JOIN查询的问题~首先得明确你这三个表的关联逻辑:StudentWork 是中间关联表,通过 ProjectID 关联 StudentProject 的主键 ID,通过 StudentID 关联 StudentName 的主键 ID。
不过你提供的插入语句不完整,我先补全并添加一些示例数据,这样咱们的查询能有实际结果参考:
补全并添加示例数据
-- 补全StudentProject的插入(修正日期格式为标准YYYY-MM-DD,避免歧义) INSERT INTO StudentProject VALUES ('Omega','2005-01-02'), ('KingOmega','2000-01-03'), ('Beast','2008-01-06'); -- 插入学生姓名示例数据 INSERT INTO StudentName VALUES ('Alice'), ('Bob'), ('Charlie'); -- 插入学生作业关联数据 INSERT INTO StudentWork VALUES (1, 1), -- Alice参与Omega项目 (1, 2), -- Bob参与Omega项目 (3, 3); -- Charlie参与Beast项目
常用JOIN查询示例及结果
1. 内连接(INNER JOIN):只返回所有表都匹配的记录
这是最常用的场景,只显示有对应学生参与且存在的项目的作业记录:
SELECT sp.ProjectName, sp.DueDate, sn.StudentName, sw.ID AS WorkRecordID FROM StudentWork sw INNER JOIN StudentProject sp ON sw.ProjectID = sp.ID INNER JOIN StudentName sn ON sw.StudentID = sn.ID;
查询结果:
| ProjectName | DueDate | StudentName | WorkRecordID |
|---|---|---|---|
| Omega | 2005-01-02 | Alice | 1 |
| Omega | 2005-01-02 | Bob | 2 |
| Beast | 2008-01-06 | Charlie | 3 |
2. 左连接(LEFT JOIN):返回左表所有数据,匹配不上的字段显示NULL
如果你想查看所有项目,哪怕没有学生参与,可以用左连接(以StudentProject为左表):
SELECT sp.ProjectName, sp.DueDate, sn.StudentName, sw.ID AS WorkRecordID FROM StudentProject sp LEFT JOIN StudentWork sw ON sp.ID = sw.ProjectID LEFT JOIN StudentName sn ON sw.StudentID = sn.ID;
查询结果:
| ProjectName | DueDate | StudentName | WorkRecordID |
|---|---|---|---|
| Omega | 2005-01-02 | Alice | 1 |
| Omega | 2005-01-02 | Bob | 2 |
| KingOmega | 2000-01-03 | NULL | NULL |
| Beast | 2008-01-06 | Charlie | 3 |
3. 右连接(RIGHT JOIN):返回右表所有数据,匹配不上的字段显示NULL
如果想查看所有学生,哪怕没有参与任何项目,可以用右连接(以StudentName为右表):
SELECT sp.ProjectName, sp.DueDate, sn.StudentName, sw.ID AS WorkRecordID FROM StudentWork sw RIGHT JOIN StudentName sn ON sw.StudentID = sn.ID LEFT JOIN StudentProject sp ON sw.ProjectID = sp.ID;
查询结果:
| ProjectName | DueDate | StudentName | WorkRecordID |
|---|---|---|---|
| Omega | 2005-01-02 | Alice | 1 |
| Omega | 2005-01-02 | Bob | 2 |
| Beast | 2008-01-06 | Charlie | 3 |
(如果后续添加没有参与项目的学生,比如INSERT INTO StudentName VALUES ('Dave');,查询结果里Dave对应的ProjectName、DueDate和WorkRecordID都会是NULL)
内容的提问来源于stack exchange,提问作者Jon_McClusky
相关产品推荐
相关产品推荐

