我有两张桌子。
我是SQL的新手。目前使用mysql。 我有一个与学校相关的数据库的以下设置:
表A 包含学生记录。 学生的身份证,密码,姓名,姓氏等。
表B 包含课堂出勤记录。 每条记录都是这样的:日期,学生ID,成绩
我需要收集在特定日期范围内上课的学生的所有学生信息。
现在,愚蠢的方式是
首先我SELECT all classes from Table B with DATE IN BETWEEN the range
然后每节课,我都会得到学生ID SELECT * FROM students WHERE id = student id
我无法理解的是聪明的方式。 如何仅在一个查询中执行此操作。 我没有理解JOIN,UNION等的概念......
到目前为止,我最好的猜测是
SELECT students.id, students.name, students.lastname
FROM students, classes
WHERE classes.date BETWEEN 20140101 AND 20150101
AND
classes.studentid = students.id
但这是适用于这种情况的方法吗?
答案 0 :(得分:0)
不要在where子句中添加join语句。这样做:
SELECT s.id, s.name, s.lastname,c.date,c.grade
FROM classes c
inner join students s
on c.studentid=s.id
WHERE c.date BETWEEN '01/01/2014' AND '01/01/2015'
答案 1 :(得分:0)
这听起来像是一项任务,所以我将尝试描述问题并给出解决方案的提示。
SELECT students.name, students.lastname
FROM students
WHERE students.lastname IS NOT NULL
UNION
SELECT students.name, 'N/A'
FROM students
WHERE students.lastname IS NULL;
+--------------+--------------+
| name | lastname |
+--------------+--------------+
| John | Doe | <- First two rows came from first query
| Jill | Smith |
| Bill | N/A | <- This came from the second query
+--------------+--------------+
union的通常用例是显示相同的列,但以不同的方式处理数据 - 否则通常可以通过WHERE
子句获得类似的结果。
SELECT authors.id, authors.name, books.title
FROM authors LEFT JOIN books ON authors.id = books.authors_id
+--------------+--------------+------------------+
| id | name | title |
+--------------+--------------+------------------+
| 1 | Mark Twain | Huckleberry Fin. |
| 2 | Terry Prat.. | Good Omens |
+--------------+--------------+------------------+
^ First two columns from ^ Third column appended
from authors table from books table linked
by "author id"
将联接视为向结果追加列,联合会追加具有相同列的行。
在你的情况下,我们可以排除一个联盟,因为你不想附加更多的学生行,你想要并排的课程和学生信息。