mysql表连接
2016-05-20 本文已影响329人
Fa1se003
当同时要现实多张表中的数据库时,可以会用表连接来完成这样的需求。从大类上分,表连接分为内连接和外连接,他们的区别主要是,内连接可以选出两张表中互相匹配的记录,外连接会选出其他不匹配的记录。我们最常用的是内连接。
学生表
mysql> select * from student;
+----+--------+-------+---------+
| id | name | score | classid |
+----+--------+-------+---------+
| 1 | 张三 | 99 | 3 |
| 2 | 李四 | 60 | 2 |
| 3 | 王五 | 88 | 2 |
| 4 | 赵6 | 22 | 1 |
+----+--------+-------+---------+
4 rows in set (0.00 sec)
班级表
mysql> select * from class;
+---------+-----------+
| classid | classname |
+---------+-----------+
| 1 | 快班 |
| 2 | 慢班 |
| 3 | 中等班 |
+---------+-----------+
3 rows in set (0.00 sec)
查询出所有学生的名字,和他们所在的班级。
mysql> select name,classname from student ,class where student.classid=class.classid;
+--------+-----------+
| name | classname |
+--------+-----------+
| 张三 | 中等班 |
| 李四 | 慢班 |
| 王五 | 慢班 |
| 赵6 | 快班 |
+--------+-----------+
4 rows in set (0.00 sec)
外连接又分为左连接
和右连接
。
左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。
右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。
学生表
mysql> select * from student;
+----+--------+-------+---------+
| id | name | score | classid |
+----+--------+-------+---------+
| 1 | 张三 | 99 | 3 |
| 2 | 李四 | 60 | 2 |
| 3 | 王五 | 88 | 2 |
| 4 | 赵6 | 22 | 1 |
| 5 | 神童 | 100 | NULL |
+----+--------+-------+---------+
5 rows in set (0.00 sec)
班级表
mysql> select * from class;
+---------+-----------+
| classid | classname |
+---------+-----------+
| 1 | 快班 |
| 2 | 慢班 |
| 3 | 中等班 |
+---------+-----------+
3 rows in set (0.00 sec)
查出学生表中所有学生名字和他们所在的班级
mysql> select s.name,c.classname from student as s left join class as c on s.classid=c.classid;
+--------+-----------+
| name | classname |
+--------+-----------+
| 赵6 | 快班 |
| 李四 | 慢班 |
| 王五 | 慢班 |
| 张三 | 中等班 |
| 神童 | NULL |
+--------+-----------+
5 rows in set (0.00 sec)
右连接和左连接类似,两者可以互相转化,用student表作为右表查询如下。
mysql> select s.name,c.classname from class as c right join student as s on s.classid=c.classid;
+--------+-----------+
| name | classname |
+--------+-----------+
| 赵6 | 快班 |
| 李四 | 慢班 |
| 王五 | 慢班 |
| 张三 | 中等班 |
| 神童 | NULL |
+--------+-----------+
5 rows in set (0.01 sec)
右连接,用班级表作为右表,查询结果则没有神童这条记录。
mysql> select s.name,c.classname from student as s right join class as c on s.classid=c.classid;
+--------+-----------+
| name | classname |
+--------+-----------+
| 张三 | 中等班 |
| 李四 | 慢班 |
| 王五 | 慢班 |
| 赵6 | 快班 |
+--------+-----------+
4 rows in set (0.00 sec)