当需要同时显示多个表中的字段时,就可以用表连接来实现这样的功能。
- 从大类上分,表连接分为内连接和外连接,它们之间的最主要区别是內连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录。我们最常用的是内连接。
- 例如:查询出所有雇员的名字和所在部门名称,因为雇员名称和部门分别存放在表emp 和dept 中,因此,需要使用表连接来进行查询:
- select ename,deptname from emp,dept where emp.deptno=dept.deptno; ename是表emp里的字段 deptname是表dept里的字段 条件表示查出表emp和表dept里deptno相同的记录 再连接成一条记录,从这记录里查出ename和deptname字段
- 外连接有分为左连接和右连接,具体定义如下: 左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录 右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录
- 左连接:select ename,deptname from emp left join dept on emp.deptno=dept.deptno;右连接:select ename,deptname from dept right join emp on dept.deptno=emp.deptno;
- 这两个查出来是一模一样的记录 都是包含所有emp表中的记录甚至是dept表中没有和它匹配的记录
- 某些情况下,当我们查询的时候,需要的条件是另外一个select 语句的结果,这个时候,就要用到子查询
- 用于子查询的关键字主要包括in、not in、=、!=、exists、not exists 等。
- select * from emp where deptno in(select deptno from dept);
如果子查询记录数唯一,还可以用=代替in:
select * from emp where deptno = (select deptno from dept); ERROR 1242 (21000): Subquery returns more than 1 row
select * from emp where deptno = (select deptno from dept limit 1); OK
- 某些情况下,子查询可以转化为表连接,例如:select * from emp where deptno in(select deptno from dept); select emp.* from emp ,dept where emp.deptno=dept.deptno;
注意:子查询和表连接之间的转换主要应用在两个方面:MySQL 4.1 以前的版本不支持子查询,需要用表连接来实现子查询的功能 表连接在很多情况下用于优化子查询
-
我们经常会碰到这样的应用,将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示出来,这个时候,就需要用union 和union all 关键字来实现这样的功能,具体语法如下:SELECT * FROM t1
-
UNION|UNION ALL
-
SELECT * FROM t2……
-
UNION|UNION ALL
-
SELECT * FROM tn;
-
UNION 和UNION ALL 的主要区别是UNION ALL 是把结果集直接合并在一起,而UNION 是将UNION ALL 后的结果进行一次DISTINCT,去除重复记录后的结果。
Mysql表连接
原文:http://www.cnblogs.com/love-MJ/p/5982270.html