首页 > 代码库 > Mysql表连接

Mysql表连接

当需要同时显示多个表中的字段时,就可以用表连接来实现这样的功能。

  • 从大类上分,表连接分为内连接和外连接,它们之间的最主要区别是內连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录。我们最常用的是内连接。
    • 例如:查询出所有雇员的名字和所在部门名称,因为雇员名称和部门分别存放在表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,去除重复记录后的结果。

    • 例如:将emp 和dept 表中的部门编号的集合显示出来:

    • select deptno from emp

    • -> union all

    • -> select deptno from dept;

Mysql表连接