SQL多表查询基本语法与实例

           多表查询就是在一条查询语句中,从多张表里一起取出所需的数据,如果要想进行多表查询,直接在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

 

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

 

--消除笛卡尔积

select *

from emp,dept

where emp.deptno = dept.deptno;

 

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

--多表查询范例:

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

select emp.empno,emp.ename,emp.job,emp.sal,dept.dname,dept.loc

from emp,dept

where emp.deptno = dept.deptno;

 

步骤:

确定所需要的数据表:

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;

 

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

--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;

 

--查询两张以上的表

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

确定所需的数据表:

--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;

 

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

  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小左YY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值