表联接
2016-03-16 23:31
281 查看
表1:teacher
+----+--------+
| id | name |
+----+--------+
| 1 | 刘德华 |
| 2 | 张学友 |
| 4 | 黎明 |
+----+--------+
表2:student
+----+------+--------+
| id | name | tea_id |
+----+------+--------+
| 1 | 张三 | 1 |
| 2 | 李四 | 1 |
| 3 | 王五 | 1 |
| 4 | 赵六 | 2 |
| 5 | 孙七 | 2 |
+----+------+--------+
1.内连接:在每个表中找出符合条件的共有记录。[x inner join y on...]
第一种写法:(相当于多表查询,用的是where!)
select t.*,s.* from teacher t,student s where t.id=s.tea_id;
第二种写法:(inner省略了)
select t.*,s.* from teacher t join student s on t.id=s.tea_id;
第三种写法:
select t.*,s.* from teacher t inner join student s on t.id=s.tea_id;
+----+--------+----+------+--------+
| id | name | id | name | tea_id |
+----+--------+----+------+--------+
| 1 | 刘德华 | 1 | 张三 | 1 |
| 1 | 刘德华 | 2 | 李四 | 1 |
| 1 | 刘德华 | 3 | 王五 | 1 |
| 2 | 张学友 | 4 | 赵六 | 2 |
| 2 | 张学友 | 5 | 孙七 | 2 |
+----+--------+----+------+--------+
2.外连接有三种方式:左连接,右连接和全连接。
2.1 左连接:根据左表的记录,在被连接的右表中找出符合条件的记录与之匹配
找不到与左表匹配的,用null表示。[x left [outer] join y on...]
第一种写法:
select t.*,s.* from teacher t left join student s on t.id=s.tea_id;
第二种写法:
select t.*,s.* from teacher t left outer join student s on t.id=s.tea_id;
+----+--------+------+------+--------+
| id | name | id | name | tea_id |
+----+--------+------+------+--------+
| 1 | 刘德华 | 1 | 张三 | 1 |
| 1 | 刘德华 | 2 | 李四 | 1 |
| 1 | 刘德华 | 3 | 王五 | 1 |
| 2 | 张学友 | 4 | 赵六 | 2 |
| 2 | 张学友 | 5 | 孙七 | 2 |
| 4 | 黎明 | NULL | NULL | NULL |
+----+--------+------+------+--------+
2.2 右连接:根据右表的记录,在被连接的左表中找出符合条件的记录与之匹配,
找不到匹配的,用null填充。[x right [outer] join y on...]
第一种写法:
select t.*,s.* from teacher t right join student s on t.id=s.tea_id;
第二种写法:
select t.*,s.* from teacher t right outer join student s on t.id=s.tea_id;
+------+--------+----+------+--------+
| id | name | id | name | tea_id |
+------+--------+----+------+--------+
| 1 | 刘德华 | 1 | 张三 | 1 |
| 1 | 刘德华 | 2 | 李四 | 1 |
| 1 | 刘德华 | 3 | 王五 | 1 |
| 2 | 张学友 | 4 | 赵六 | 2 |
| 2 | 张学友 | 5 | 孙七 | 2 |
+------+--------+----+------+--------+
2.3 全连接:返回符合条件的所有表的记录,没有与之匹配的,用null表示(结果是左连接和右连接的并集)
第一种写法:
select t.*,s.* from teacher t full join student s on t.id=s.tea_id;
第二种写法:
select t.*,s.* from teacher t full outer join student s on t.id=s.tea_id;
3 交叉连接(结果是笛卡尔积)
select t.*,s.* from teacher t cross join student s;
等效于:
select t.*,s.* from teacher t,student s;
+----+--------+----+------+--------+
| id | name | id | name | tea_id |
+----+--------+----+------+--------+
| 1 | 刘德华 | 1 | 张三 | 1 |
| 2 | 张学友 | 1 | 张三 | 1 |
| 4 | 黎明 | 1 | 张三 | 1 |
| 1 | 刘德华 | 2 | 李四 | 1 |
| 2 | 张学友 | 2 | 李四 | 1 |
| 4 | 黎明 | 2 | 李四 | 1 |
| 1 | 刘德华 | 3 | 王五 | 1 |
| 2 | 张学友 | 3 | 王五 | 1 |
| 4 | 黎明 | 3 | 王五 | 1 |
| 1 | 刘德华 | 4 | 赵六 | 2 |
| 2 | 张学友 | 4 | 赵六 | 2 |
| 4 | 黎明 | 4 | 赵六 | 2 |
| 1 | 刘德华 | 5 | 孙七 | 2 |
| 2 | 张学友 | 5 | 孙七 | 2 |
| 4 | 黎明 | 5 | 孙七 | 2 |
+----+--------+----+------+--------+
5自连接:连接的表都是同一个表,同样可以由内连接,外连接各种组合
方式,按实际应用去组合。
SELECT a.*,b.* FROM table_1 a,table_1 b WHERE a.[name]=b.[name] --连接的两表是同一个表,别称不一样
SELECT a.*,b.* FROM table_1 a LEFT JOIN table_1 b ON a.[name]=b.[name] --左连接写法
+----+--------+
| id | name |
+----+--------+
| 1 | 刘德华 |
| 2 | 张学友 |
| 4 | 黎明 |
+----+--------+
表2:student
+----+------+--------+
| id | name | tea_id |
+----+------+--------+
| 1 | 张三 | 1 |
| 2 | 李四 | 1 |
| 3 | 王五 | 1 |
| 4 | 赵六 | 2 |
| 5 | 孙七 | 2 |
+----+------+--------+
1.内连接:在每个表中找出符合条件的共有记录。[x inner join y on...]
第一种写法:(相当于多表查询,用的是where!)
select t.*,s.* from teacher t,student s where t.id=s.tea_id;
第二种写法:(inner省略了)
select t.*,s.* from teacher t join student s on t.id=s.tea_id;
第三种写法:
select t.*,s.* from teacher t inner join student s on t.id=s.tea_id;
+----+--------+----+------+--------+
| id | name | id | name | tea_id |
+----+--------+----+------+--------+
| 1 | 刘德华 | 1 | 张三 | 1 |
| 1 | 刘德华 | 2 | 李四 | 1 |
| 1 | 刘德华 | 3 | 王五 | 1 |
| 2 | 张学友 | 4 | 赵六 | 2 |
| 2 | 张学友 | 5 | 孙七 | 2 |
+----+--------+----+------+--------+
2.外连接有三种方式:左连接,右连接和全连接。
2.1 左连接:根据左表的记录,在被连接的右表中找出符合条件的记录与之匹配
找不到与左表匹配的,用null表示。[x left [outer] join y on...]
第一种写法:
select t.*,s.* from teacher t left join student s on t.id=s.tea_id;
第二种写法:
select t.*,s.* from teacher t left outer join student s on t.id=s.tea_id;
+----+--------+------+------+--------+
| id | name | id | name | tea_id |
+----+--------+------+------+--------+
| 1 | 刘德华 | 1 | 张三 | 1 |
| 1 | 刘德华 | 2 | 李四 | 1 |
| 1 | 刘德华 | 3 | 王五 | 1 |
| 2 | 张学友 | 4 | 赵六 | 2 |
| 2 | 张学友 | 5 | 孙七 | 2 |
| 4 | 黎明 | NULL | NULL | NULL |
+----+--------+------+------+--------+
2.2 右连接:根据右表的记录,在被连接的左表中找出符合条件的记录与之匹配,
找不到匹配的,用null填充。[x right [outer] join y on...]
第一种写法:
select t.*,s.* from teacher t right join student s on t.id=s.tea_id;
第二种写法:
select t.*,s.* from teacher t right outer join student s on t.id=s.tea_id;
+------+--------+----+------+--------+
| id | name | id | name | tea_id |
+------+--------+----+------+--------+
| 1 | 刘德华 | 1 | 张三 | 1 |
| 1 | 刘德华 | 2 | 李四 | 1 |
| 1 | 刘德华 | 3 | 王五 | 1 |
| 2 | 张学友 | 4 | 赵六 | 2 |
| 2 | 张学友 | 5 | 孙七 | 2 |
+------+--------+----+------+--------+
2.3 全连接:返回符合条件的所有表的记录,没有与之匹配的,用null表示(结果是左连接和右连接的并集)
第一种写法:
select t.*,s.* from teacher t full join student s on t.id=s.tea_id;
第二种写法:
select t.*,s.* from teacher t full outer join student s on t.id=s.tea_id;
3 交叉连接(结果是笛卡尔积)
select t.*,s.* from teacher t cross join student s;
等效于:
select t.*,s.* from teacher t,student s;
+----+--------+----+------+--------+
| id | name | id | name | tea_id |
+----+--------+----+------+--------+
| 1 | 刘德华 | 1 | 张三 | 1 |
| 2 | 张学友 | 1 | 张三 | 1 |
| 4 | 黎明 | 1 | 张三 | 1 |
| 1 | 刘德华 | 2 | 李四 | 1 |
| 2 | 张学友 | 2 | 李四 | 1 |
| 4 | 黎明 | 2 | 李四 | 1 |
| 1 | 刘德华 | 3 | 王五 | 1 |
| 2 | 张学友 | 3 | 王五 | 1 |
| 4 | 黎明 | 3 | 王五 | 1 |
| 1 | 刘德华 | 4 | 赵六 | 2 |
| 2 | 张学友 | 4 | 赵六 | 2 |
| 4 | 黎明 | 4 | 赵六 | 2 |
| 1 | 刘德华 | 5 | 孙七 | 2 |
| 2 | 张学友 | 5 | 孙七 | 2 |
| 4 | 黎明 | 5 | 孙七 | 2 |
+----+--------+----+------+--------+
5自连接:连接的表都是同一个表,同样可以由内连接,外连接各种组合
方式,按实际应用去组合。
SELECT a.*,b.* FROM table_1 a,table_1 b WHERE a.[name]=b.[name] --连接的两表是同一个表,别称不一样
SELECT a.*,b.* FROM table_1 a LEFT JOIN table_1 b ON a.[name]=b.[name] --左连接写法
相关文章推荐
- android面试问题
- Android各种简单的对话框的实现案例
- 进程间通信之-管道--linux内核剖析(八)
- 认识DOM的三大节点:元素节点,文本节点,属性节点以及nodeName,nodeType,nodeValue的区别
- ListView中的item中有删除按钮,点击删除按钮,该item删除。
- 获取历史和实时股票数据接口
- Java-线程安全和线程池
- 写在2016
- 程序猿系列笑话
- JAVA WEB中如何让数据库连接对开发人员完全透明?
- python 根据路径和类名动态加载类
- BMP格式解析与保存 画图板的重绘
- Apache服务器 域名解析和绑定
- 从决策树学习谈到贝叶斯分类算法、EM、HMM
- (手记)Handler机制原理
- JavaScript正则匹配练习。。。
- 心情
- 栈的定义及其基本运算
- 栈的定义及其基本运算
- 面试题合集