关系表中的一行称为元组,元组可表示一个实体或实体之间的联系。
一、内连接
就是将表1的某属性与表2的相应属性进行逐行匹配,找出匹配的组合,并按照输出需求合并成一行。即只连接匹配的行。
内连接有两种:等值连接和自然连接。
1、等值连接(最常用)
SELECT [column1],[column2] FROM [t1] INNER JOIN [t2] ON ]t1.column]=[t2.column] GROUP BY [column];
//例子
SELECT course_id,building FROM course INNER JOIN department ON course.dept_name=department.dept_name GROUP BY course_id;
course表
department表
建立连接得出的结果为
2、自然连接
自然连接只考虑那些在关系模式中都出现的属性上取值相同的元组对。得出的结果表中两表中名称相同的列只出现一次。
Mysql不支持natural join 但也可以通过多表查询实现。
SELECT xxx,xxx FROM t1,t2 WHERE t1.xxx=t2.xxx ORDER BY xxx;
//例子
SELECT course_id,department.dept_name,building,title FROM course,department WHERE course.dept_name=department.dept_name ORDER BY course_id;
结果
二、外连接
外连接通过在结果中创建包含空值元组的方式,保留了在内连接中丢失的元组。
1、左外连接
只保留出现在左外连接运算之前(左边表)的关系中的元组。
SELECT student.ID,name,takes.couse_id,dept_name FROM student LEFT JOIN takes ON student.ID= takes.ID ORDER BY student.ID;
结果
图中ID=70557的学生没有课程id但还是被保留。
2、右外连接
只保留出现在右外连接运算之后(右边表)的关系中的元组。
代码格式与左外连接格式类似(只是将LEFT改成RIGHT),就不一一赘述。
3、全外连接
保留出现在两个关系中的元组。 MySQL不支持全连接,Null值不能参加运算。
若要实现全连接,可以使用UNION。即将左连接表和右连接表合并。
SELECT student.ID,name,takes.couse_id,dept_name
FROM student LEFT JOIN takes
ON student.ID= takes.ID
UNION
SELECT student.ID,name,takes.couse_id,dept_name
FROM student RIGHT JOIN takes
ON student.ID= takes.ID
WHERE student.ID is NULL OR takes.ID is NULL;
结果
三、交叉连接
将两个表的所有行进行组合,连接后的行数为两个表的乘积数。(笛卡尔积)
SELECT * FROM course CROSS JOIN department;
结果
四、自连接
详解请看链接http://blog.youkuaiyun.com/cheryl_l/article/details/53523657#t8