SQL中表的联结
1. 表的联结
今天面试的时候,问到了关于数据库操作的一些知识。因为时间太久,基本都忘光了。尤其是JOIN操作,基本完全没有想出来,弄的非常尴尬。
为了使事情尽量简单,先假设有三张Table
#1. student
+----+-------+
| id | name |
+----+-------+
| 1 | Harry |
| 2 | Merry |
| 3 | Henry |
| 4 | Terry |
| 5 | Jerry |
+----+-------+
5 rows in set
#2. course
+------+
| id |
+------+
| 9 |
| 8 |
| 7 |
| 6 |
| 5 |
| 4 |
| 3 |
| 2 |
| 1 |
| 0 |
+------+
#3. classroom
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+----+
再使用“存储过程”来方便地填充这些表
delimiter $$ create procedure add5cols() begin declare n int default 10; while n > 0 do set n = n - 1; insert into course (id) values (n); end while; end $$ call add5cols();
JOIN常用的有三种
#1. CROSS JOIN
select * from student, course;
叉联结,是一种返回笛卡尔积的联结方式,如
如果联结的两个表之间没有任何关联(如上),则结果为(左表行数X右表函数)。
#2. LEFT JOIN
select * from student left join course on student.id=course.id;
左联结,需要指定是依据哪一个属性联结
如果左边属性值的个数要多于右边,那么会创造出一些空行(值为null)
#3. RIGHTJOIN
同上, 示例为左边匹配的值小于右边的情况。
select * from student right join course on course.id=student.id;
#4. INNER JOIN
一种是未指定过依据的JOIN
select * from student inner join course;
效果等同于CROSS JOIN;
一种是指定了依据的JOIN
select * from student inner join course on student.id=course.id;
可见效果等同于LEFT JOIN