MySQL连接查询 - 极悦

MySQL教程

MySQL连接查询

SQL92语法

连接查询:也可以叫跨表查询,需要关联多个表进行查询。

● 显示每个员工信息,并显示所属的部门名称

select ename, dname from emp, dept;

SQL> select ename, dname from emp, dept;

 

ENAME      DNAME

---------- --------------

SMITH      ACCOUNTING

ALLEN      ACCOUNTING

WARD       ACCOUNTING

JONES      ACCOUNTING

MARTIN     ACCOUNTING

BLAKE      ACCOUNTING

CLARK      ACCOUNTING

SCOTT      ACCOUNTING

KING       ACCOUNTING

TURNER     ACCOUNTING

ADAMS      ACCOUNTING

JAMES      ACCOUNTING

FORD       ACCOUNTING

MILLER     ACCOUNTING

SMITH      RESEARCH

ALLEN      RESEARCH

WARD       RESEARCH

JONES      RESEARCH

MARTIN     RESEARCH

BLAKE      RESEARCH

CLARK      RESEARCH

SCOTT      RESEARCH

KING       RESEARCH

TURNER     RESEARCH

ADAMS      RESEARCH

JAMES      RESEARCH

FORD       RESEARCH

MILLER     RESEARCH

SMITH      SALES

ALLEN      SALES

WARD       SALES

JONES      SALES

MARTIN     SALES

BLAKE      SALES

CLARK      SALES

SCOTT      SALES

KING       SALES

TURNER     SALES

ADAMS      SALES

JAMES      SALES

FORD       SALES

MILLER     SALES

SMITH      OPERATIONS

ALLEN      OPERATIONS

WARD       OPERATIONS

JONES      OPERATIONS

MARTIN     OPERATIONS

BLAKE      OPERATIONS

CLARK      OPERATIONS

SCOTT      OPERATIONS

KING       OPERATIONS

TURNER     OPERATIONS

ADAMS      OPERATIONS

JAMES      OPERATIONS

FORD       OPERATIONS

MILLER     OPERATIONS

 

已选择56行。

以上输出,不正确,输出了56条数据,其实就是两个表记录的成绩,这种情况我们称为:“笛卡儿乘积”,出现错误的原因是:没有指定连接条件。

指定连接条件

select emp.ename, dept.dname from emp, dept where

emp.deptno=dept.deptno;


也可以使用别名


select e.ename, d.dname from emp e, dept d where e.deptno=d.deptno;

以上结果输出正确,因为加入了正确的连接条件;

以上查询也称为 “内连接”,只查询相等的数据(连接条件相等的数据)。

● 取得员工和所属的领导的姓名

select e.ename, m.ename from emp e, emp m where e.mgr=m.empno;

SQL> select * from emp;(普通员工)

 

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------

      7369 SMITH      CLERK           7902 17-12月-80            800                    20

      7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30

      7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30

      7566 JONES      MANAGER         7839 02-4月 -81           2975                    20

      7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30

      7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30

      7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10

      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20

      7839 KING       PRESIDENT            17-11月-81           5000                    10

      7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30

      7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20

      7900 JAMES      CLERK           7698 03-12月-81            950                    30

      7902 FORD       ANALYST         7566 03-12月-81           3000                    20

      7934 MILLER     CLERK           7782 23-1月 -82           1300                    10

 

已选择14行。

 

SQL> select * from emp;(管理者)

 

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------

      7369 SMITH      CLERK           7902 17-12月-80            800                    20

      7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30

      7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30

      7566 JONES      MANAGER         7839 02-4月 -81           2975                    20

      7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30

      7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30

      7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10

      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20

      7839 KING       PRESIDENT            17-11月-81           5000                    10

      7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30

      7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20

      7900 JAMES      CLERK           7698 03-12月-81            950                    30

      7902 FORD       ANALYST         7566 03-12月-81           3000                    20

      7934 MILLER     CLERK           7782 23-1月 -82           1300                    10

 

已选择14行。

 

SQL> select e.ename, m.ename from emp e, emp m where e.mgr=m.empno;

 

ENAME      ENAME

---------- ----------

SMITH      FORD

ALLEN      BLAKE

WARD       BLAKE

JONES      KING

MARTIN     BLAKE

BLAKE      KING

CLARK      KING

SCOTT      JONES

TURNER     BLAKE

ADAMS      SCOTT

JAMES      BLAKE

FORD       JONES

MILLER     CLARK

 

已选择13行。

以上称为“自连接”,只有一张表连接,具体的查询方法,把一张表看作两张表即可,如以上示例:第一个表emp e代码了员工表,emp m代表了领导表,相当于员工表和部门表一样

SQL99语法

● (内连接)显示薪水大于2000的员工信息,并显示所属的部门名称

采用SQL92语法:

采用SQL92语法:
select e.ename, e.sal, d.dname from emp e, dept d where e.deptno=d.deptno and  e.sal > 2000;
采用SQL99语法:
select e.ename, e.sal, d.dname from emp e join dept d on e.deptno=d.deptno where e.sal>2000;
或
select e.ename, e.sal, d.dname from emp e inner join dept d on e.deptno=d.deptno where e.sal>2000;
在实际中一般不加inner关键字

Sql92语法和sql99语法的区别:99语法可以做到表的连接和查询条件分离,特别是多个表进行连接的时候,会比sql92更清晰。

●(外连接)显示员工信息,并显示所属的部门名称,如果某一个部门没有员工,那么该部门也必须显示出来

右连接:
select e.ename, e.sal, d.dname from emp e right join dept d on e.deptno=d.deptno;
左连接:
select e.ename, e.sal, d.dname from dept d left join emp e on e.deptno=d.deptno;
以上两个查询效果相同

连接分类:

1、内链接

* 表1 inner join 表2 on 关联条件

* 做连接查询的时候一定要写上关联条件

* inner 可以省略

2、外连接

● 左外连接

* 表1 left outer join 表2 on 关联条件

* 做连接查询的时候一定要写上关联条件

* outer 可以省略*

● 右外连接

* 表1 right outer join 表2 on 关联条件

* 做连接查询的时候一定要写上关联条件

* outer 可以省略

*左外连接(左连接)和右外连接(右连接)的区别:

*左连接以左面的表为准和右边的表比较,和左表相等的不相等都会显示出来,右表符合条件的显示,不符合条件的不显示

*右连接恰恰相反,以上左连接和右连接也可以加入outer关键字,但一般不建议这种写法,如:

select e.ename, e.sal, d.dname from emp e right outer join dept d on e.deptno=d.deptno;

select e.ename, e.sal, d.dname from dept d left outer join emp e on e.deptno=d.deptno;

左连接能完成的功能右连接一定可以完成。

技术文档推荐

更多>>

视频教程推荐

更多>>