多表查询

查询所有学生的sname,cno 和 degree
我们要知道的是,学生的sname在students表中,cno和degree在score表中
那么我们接下来看一下这两个表:

mysql> select * from students;
+-----+--------+------+---------------------+-------+
| sno | sname  | ssex | sbirthday           | class |
+-----+--------+------+---------------------+-------+
| 101 | 曾华   | 男   | 1977-09-01 00:00:00 | 95033 |
| 102 | 匡明   | 男   | 1975-10-02 00:00:00 | 95031 |
| 103 | 王丽   | 女   | 1976-01-23 00:00:00 | 95033 |
| 104 | 李军   | 男   | 1975-02-10 00:00:00 | 95033 |
| 105 | 王芳   | 女   | 1974-06-03 00:00:00 | 95031 |
| 106 | 陆君   | 男   | 1974-06-03 00:00:00 | 95031 |
| 107 | 王尼玛 | 男   | 1976-02-20 00:00:00 | 95033 |
| 108 | 张全蛋 | 男   | 1975-02-10 00:00:00 | 95031 |
| 109 | 赵铁柱 | 男   | 1974-06-03 00:00:00 | 95031 |
+-----+--------+------+---------------------+-------+

mysql> select * from score;
+-----+-------+--------+
| sno | cno   | degree |
+-----+-------+--------+
| 103 | 3-105 |     92 |
| 103 | 3-245 |     86 |
| 103 | 6-166 |     85 |
| 105 | 3-105 |     88 |
| 105 | 3-245 |     75 |
| 105 | 6-166 |     79 |
| 109 | 3-105 |     76 |
| 109 | 3-245 |     68 |
| 109 | 6-166 |     81 |
+-----+-------+--------+

我们发现在这两个表中都有sno这一列,我们只需要把每一个相同的sno一一对应起来就OK了。
那么接下来:

select sname,cno,degree from students,score where students.sno=score.sno;

查询结果:

mysql> select sname,cno,degree from students,score where students.sno=score.sno;
+--------+-------+--------+
| sname  | cno   | degree |
+--------+-------+--------+
| 王丽   | 3-105 |     92 |
| 王丽   | 3-245 |     86 |
| 王丽   | 6-166 |     85 |
| 王芳   | 3-105 |     88 |
| 王芳   | 3-245 |     75 |
| 王芳   | 6-166 |     79 |
| 赵铁柱 | 3-105 |     76 |
| 赵铁柱 | 3-245 |     68 |
| 赵铁柱 | 6-166 |     81 |
+--------+-------+--------+

接下来在看一个查询:
查询所有学生的sno,cname和degree
那么我们查看以前的数据表发现:sno和degree在score表中,cname在course表中,那我们看看这两个表:

mysql> select * from score;
+-----+-------+--------+
| sno | cno   | degree |
+-----+-------+--------+
| 103 | 3-105 |     92 |
| 103 | 3-245 |     86 |
| 103 | 6-166 |     85 |
| 105 | 3-105 |     88 |
| 105 | 3-245 |     75 |
| 105 | 6-166 |     79 |
| 109 | 3-105 |     76 |
| 109 | 3-245 |     68 |
| 109 | 6-166 |     81 |
+-----+-------+--------+

mysql> select * from course;
+-------+------------+-----+
| cno   | cname      | tno |
+-------+------------+-----+
| 3-105 | 计算机导论 | 825 |
| 3-245 | 操作系统   | 804 |
| 6-166 | 数字电路   | 856 |
| 9-888 | 高等数学   | 831 |
+-------+------------+-----+

我们发现都有cno这一列,那接下来就把cno以一一对应就好了:

select sno,cname,degree from score,course where score.cno=course.cno;

查询结果:

mysql> select sno,cname,degree from score,course where score.cno=course.cno;
+-----+------------+--------+
| sno | cname      | degree |
+-----+------------+--------+
| 103 | 计算机导论 |     92 |
| 103 | 操作系统   |     86 |
| 103 | 数字电路   |     85 |
| 105 | 计算机导论 |     88 |
| 105 | 操作系统   |     75 |
| 105 | 数字电路   |     79 |
| 109 | 计算机导论 |     76 |
| 109 | 操作系统   |     68 |
| 109 | 数字电路   |     81 |
+-----+------------+--------+

上面的两个例子都是数据来自两个表的,那如果表更多,例如三个表该怎么办呢?那看下面这个查询:
查询所有学生的sname,cname 和 degree
我们查看表结构发现:sname来自students表,cname来自course表,degree来自score表,那我们看看这三个表:

mysql> select * from students;
+-----+--------+------+---------------------+-------+
| sno | sname  | ssex | sbirthday           | class |
+-----+--------+------+---------------------+-------+
| 101 | 曾华   | 男   | 1977-09-01 00:00:00 | 95033 |
| 102 | 匡明   | 男   | 1975-10-02 00:00:00 | 95031 |
| 103 | 王丽   | 女   | 1976-01-23 00:00:00 | 95033 |
| 104 | 李军   | 男   | 1975-02-10 00:00:00 | 95033 |
| 105 | 王芳   | 女   | 1974-06-03 00:00:00 | 95031 |
| 106 | 陆君   | 男   | 1974-06-03 00:00:00 | 95031 |
| 107 | 王尼玛 | 男   | 1976-02-20 00:00:00 | 95033 |
| 108 | 张全蛋 | 男   | 1975-02-10 00:00:00 | 95031 |
| 109 | 赵铁柱 | 男   | 1974-06-03 00:00:00 | 95031 |
+-----+--------+------+---------------------+-------+

mysql> select * from course;
+-------+------------+-----+
| cno   | cname      | tno |
+-------+------------+-----+
| 3-105 | 计算机导论 | 825 |
| 3-245 | 操作系统   | 804 |
| 6-166 | 数字电路   | 856 |
| 9-888 | 高等数学   | 831 |
+-------+------------+-----+

mysql> select * from score;
+-----+-------+--------+
| sno | cno   | degree |
+-----+-------+--------+
| 103 | 3-105 |     92 |
| 103 | 3-245 |     86 |
| 103 | 6-166 |     85 |
| 105 | 3-105 |     88 |
| 105 | 3-245 |     75 |
| 105 | 6-166 |     79 |
| 109 | 3-105 |     76 |
| 109 | 3-245 |     68 |
| 109 | 6-166 |     81 |
+-----+-------+--------+

我们发现students表中的sno和score表中的sno是一同个字段,course中的cno和score中的cno是同一个字段,那么我们就可以通过score把他们对应起来:

select sname,cname,degree from students,course,score where students.sno=score.sno and course.cno=score.cno;

看一下查询结果:

mysql> select sname,cname,degree from students,course,score where students.sno=score.sno and course.cno=score.cno;
+--------+------------+--------+
| sname  | cname      | degree |
+--------+------------+--------+
| 王丽   | 计算机导论 |     92 |
| 王丽   | 操作系统   |     86 |
| 王丽   | 数字电路   |     85 |
| 王芳   | 计算机导论 |     88 |
| 王芳   | 操作系统   |     75 |
| 王芳   | 数字电路   |     79 |
| 赵铁柱 | 计算机导论 |     76 |
| 赵铁柱 | 操作系统   |     68 |
| 赵铁柱 | 数字电路   |     81 |
+--------+------------+--------+