多表查询就是在一条查询语句中,从多张表里一起取出所需的数据,如果要想进行多表查询,直接在FROM子句之后跟上多个表即可,此时的语法如下:

select [DISTINCT]*|列名称[AS][列别名],列名称[AS][列别名],...FROM 表名称1[表别名],表名称2[表别名2]...
[WHERE 条件(S)]
[ORDER BY 排序的字段1 ASC|DESC,排序的字段1 ASC|DESC...];
例:查询emp,dept两张表的数据
select * from emp,dept

from后面多个不用的表数据变成两次 mysql sql中from跟多个表名_多表查询

 

从上表中可以看到,一共返回了39条数据,而且可以看到,有很多数据重复的。这些数据就是笛卡尔积造成的。在进行多表连接查询的时候,由于数据库内部的处理机制,会产生一些“无用”的数据,而这些数据就称为笛卡尔积。

 

--消除笛卡尔积

select *
from emp,dept
where emp.deptno = dept.deptno;

from后面多个不用的表数据变成两次 mysql sql中from跟多个表名_sql_02

 

一般而言,如果要想进行笛卡尔积的消除,往往会使用关联字段。由于多张表之间可能会有重名的字段,所以在进行重名字段访问的时候,前面需要加上表名称。采用“表名称.字段”的方式来进行访问。

--多表查询范例:

--查询每个雇员编号、姓名、职位、基本工资、部门名称、部门位置信息

select emp.empno,emp.ename,emp.job,emp.sal,dept.dname,dept.loc
from emp,dept
where emp.deptno = dept.deptno;

from后面多个不用的表数据变成两次 mysql sql中from跟多个表名_sql_03

 

步骤:

确定所需要的数据表:

emp:查询每个雇员的编号,姓名,职位,基本工资

dept表:部门名称,部门位置。

确定一致的关联字段:

部门与雇员关联:emp.deptno = dept.deptno

随后还需要按照一个SQL语法编写

 

多表查询别名定义:

--查询出每个雇员的编号、姓名、基本工资、工资等级

select e.empno,e.ename,e.sal,s.grade
from emp e,salgrade s
where e.sal BETWEEN s.losal AND s.hisal;

from后面多个不用的表数据变成两次 mysql sql中from跟多个表名_数据_04

 

--为了更加清楚的显示处工资等级的信息,现在希望可以按如下格式进行替换显示:

--grade = 1:显示为“E等工资”

--grade = 2:显示为“D等工资”

--grade = 3:显示为“C等工资”

--grade = 4:显示为“B等工资”

--grade = 5:显示为“A等工资”

 

select e.empno,e.ename,e.sal,

DECODE(s.grade,1,'E等工资',2,'D等工资',3,'C等工资',4,'B等工资',5,'A等工资') grade

from emp e,salgrade s

where e.sal BETWEEN s.losal AND s.hisal;

from后面多个不用的表数据变成两次 mysql sql中from跟多个表名_数据_05

 

--查询两张以上的表

--例:查询每个雇员的姓名,职位,基本工资,部门名称,工资等级

确定所需的数据表:

--emp表:每个雇员的姓名、职位、基本工资;

--dept表:部门名称

--salgrade:工资等级:

--确定一致的关联字段:

--雇员和部门:emp.deptno = dept.deptno

--雇员和工资等级:emp.sal BETWEEN salgrade.losal AND salgrade.hisal

 

select e.ename,e.job,e.sal,d.dname,
DECODE(s.grade,1,'E等工资',2,'D等工资',3,'C等工资',4,'B等工资',5,'A等工资') grade
from emp e,dept d,salgrade s
where e.deptno = d.deptno AND e.sal BETWEEN s.losal AND s.hisal;

from后面多个不用的表数据变成两次 mysql sql中from跟多个表名_数据_06

 

注:多表查询之中,每当增加一个关联表都需要设置消除笛卡尔积的条件。