SQL“链式”查询?

时间:2014-11-11 02:45:43

标签: mysql sql join union

我有两张桌子。

我是SQL的新手。目前使用mysql。 我有一个与学校相关的数据库的以下设置:

表A 包含学生记录。 学生的身份证,密码,姓名,姓氏等。

表B 包含课堂出勤记录。 每条记录都是这样的:日期,学生ID,成绩

我需要收集在特定日期范围内上课的学生的所有学生信息。

现在,愚蠢的方式是

  1. 首先我SELECT all classes from Table B with DATE IN BETWEEN the range

  2. 然后每节课,我都会得到学生ID SELECT * FROM students WHERE id = student id

  3. 我无法理解的是聪明的方式。 如何仅在一个查询中执行此操作。 我没有理解JOIN,UNION等的概念......

    到目前为止,我最好的猜测是

    SELECT students.id, students.name, students.lastname 
    FROM students, classes
    WHERE classes.date BETWEEN 20140101 AND 20150101 
    AND 
    classes.studentid = students.id
    

    但这是适用于这种情况的方法吗?

2 个答案:

答案 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"

将联接视为向结果追加列,联合会追加具有相同列的行。

在你的情况下,我们可以排除一个联盟,因为你不想附加更多的学生行,你想要并排的课程和学生信息。