多表查询:表的概念

1、知识点

1、多表查询的实现形式

2、笛卡儿积的处理

3、数据表的连接操作

4、数据的集合操作

2、具体内容

2.1、多表查询的基本概念

  在之前所做的全部查询里面都有一个共同特点,在FROM子句里面只设置了一张数据表,如果现在需要从多个数据表里取出数据,那么就属于多表查询,在FROM子句后面要设置多张数据表。

SELECT [DISTINCT] * | 列名称 [别名],列名称 [别名],...
FROM 表名称[别名],表名称[别名]
[WHERE  过滤条件(s)]
[ORDER BY 字段 [ASC | DESC],字段 [ASC | DESC],...];
 

 

  下面准备将emp表和dept表进行多表查询。

范例:统计emp表中的数据量(14)

SELECT COUNT(*) FROM emp;

 

范例:统计dept表中的数据量(4)

SELECT COUNT(*) FROM dept;

 

范例:实现多表查询

SELECT * FROM emp,dept;

 

  此时的却实现了多表查询,但是查询的结果一共产生了56行记录。

  实际上这56行记录 = emp表的14行记录 * dept表的4行记录,也就是相当于emp表的全部记录被重复显示了4次(dept表的数据量)。

  如果按照集合的概念来讲就相当于出现了一个乘积的概念,即两个集合发生了积的关系,而这样积的关系在数据库上成为笛卡儿积问题

  如果说现在要想消除掉笛卡儿积的问题,那么必须想办法为两张数据表设置关系。

范例:消除掉积的影响

SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;

 

  以上的代码实际上只是显式的消除了笛卡儿积,而在数据库的多表查询之中,笛卡儿积会一直存在,只要是存在数据表,那么一定会存在笛卡儿积。

一个原则:多表查询性能一定是很差的,在开发之中应该尽可能回避。

  在进行列访问的时候发现都使用了表名称,严格来讲这样也不好,万一表的名称很长呢?所以在多表查询的时候,一般建议使用别名。

范例:使用别名

SELECT * FROM emp e,dept d WHERE e.deptno=d.deptno;

 

  任何情况下,如果要实现多表查询操作,永远都有一个前提:要关联的数据表一定要存在有关联字段,或者是关联条件,不存在这些要求的,一定不能够使用多表查询。

范例:要求显示每个雇员的编号、姓名、职位、工资、部门名称、部门位置。

  ~确定要使用的数据表:emp表,dept表

  ~确定已知的关联字段:emp.deptno=dept.deptno

SELECT e.empno,e.ename,e.job,e.sal,d.dame,d.loc FROM emp e, dept d WHERE e.deptno=d.deptno;

 

范例:要求显示每个雇员的编号、姓名、职位、工资、工资等级

SELECT e.empno,e.ename,e.job,e.sal,s.grade FROM emp e,salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal;

 

范例:查询每个雇员的编号、姓名、职位、工资、工资等级、部门名称

  一般情况下如果是多个消除笛卡儿积的条件都会使用AND进行连接。

SELECT e.empno,e.ename,e.job,e.sal,s.grade,d.dname FROM emp e,salgrade s,dept d WHERE e.sal BETWEEN losal AND hisal AND e.deptno=d.deptno;

 

多表查询操作的使用:

1、没有关联字段或者关联条件的两张数据表是永远不可能实现多表查询的;

2、在进行多表查询这样的复杂查询操作时,强烈建议分步骤解决问题

 

posted @ 2017-12-06 21:04  慕河河  阅读(497)  评论(0)    收藏  举报