多表查询

多表查询尽量使用SQL:1999语法

预先预估可能产生的数据量

③SELECT [DISTINCT] * | 列 [别名] , .. | 计算

①FROM 数据表 | 行列的集合 [AS] |别名|,数据表 |行列的集合 [AS] [别名] , ...

②[WHERE 数据筛选条件(s)]

④[ORDER BY 排序字段 | 别名 [ASC | DESC]]

1.多表查询:

统计emp,dept表中数据量 ,如果直接使用下列语句查询会造成笛卡儿积,两个表的查询结果积(正确的应该是18条);

查询另外一个表里的信息需要进行表关联

SELECT COUNT(*) FROM emp,dept;            //结果是56条,正确的应该是18条

消除迪尔卡积(会有重复,只不过不显示)

SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno ;         //根据部门进行关联查询

SELECT emp e ,dept d WHERE e.deptno=d.deptno ;                 //使用别名进行查寻

2.表连接

内连接:内连接为等值连接,等值连接必须保证多张表指定列完全一致

外连接(左外连接,右外连接,全外连接):可以显示左表或右表完整数据(即使判断条件不足)

 

(1)内连接:

SELECT e.empno,e.enam,e.job,e.deptno,d.dname FROM emp e,dept d WHERE e.deptno = d.deptno ;         

 

(2)右外连接:

SELECT e.empno,e.ename,e.job,d.deptno,d.dname FROM emp e,dept d WHERE e.deptno(+)=deptno;         // 右外连接:【FROM 左表 右表】 左表.字段=右表.字段(+) ;

 

(3)左外连接:

SELECT e.empno,e.ename,e.job,d.deptno,d.dname FROM emp e,dept d WHERE e.deptno=d.deptno(+);         //左外连接:【FROM 左表 右表】 左表.字段(+)=右表.字段 ;

 

 

3.SQL:1999语法支持

SELECT table.column,table2.column

FROM table1 [CROSS DOIN table2] |

[NATURAL JOIN table2] |

[JOIN table2 USING(column_name)] |

[JOIN table ON(table.column_name=table2.column_name)] | 

[LEFT|RIGHT|FULL OUTER JOIN table2 ON(table1.column_name=table2.column_name)] ;

 

(1)自然连接(NATURAL),自然连接主要形式是自动获取关联列(列名相同):

SELECT * FROM emp e NATURAL JOIN dept d ;              //会默认相同字段放在首列,可以查询较大数据量的表

(2)USING子句(可以指定多个关联列,用于关联列很多)

SELECT table1.column,table2.column FROM table1 JOIN table2... USING(列1,列2....) 

SELECT * FROM emp e JOIN dept d USING(deptno) ;

(3)ON子句(设置关联条件)

SELECT table1.column,table2.column FROM table1 JOIN table2 ...ON(条件);

SELECT * FROM emp e JOIN dept d ON(e.deptno=d.deptno);                //根据部门编号查询

(4)外连接(左外,右外,全外):

SELECT table.column,table2.column 

FROM table1 LEFT|RIGHT|FULL OUTER JOIN table2

ON(table1.column_name=table2.column_name);

全外连接:全外连接特点是可以将数据表中的全部数据进行展示

SELECT *  FROM emp e FULL OUTER JOIN dept d

ON(e.deptno=d.deptno);

 

左连接:左边有的,右边没有的为null

右连接:左边没有的,右边有的为null

内连接:显示左边右边共有的

 

4.集合运算:交集,并集,差集,补集,

(1)实现交集:INTERSECT

SELRECT empno,ename,job,deptno FROM emp WHERE deptno=10

                    INTERSECT

SELECT empno,ename,job,deptno FROM emp;             //显示重复

(2)实现并集:UNION ALL

SELRECT empno,ename,job,deptno FROM emp WHERE deptno=10

                UNION ALL

SELECT empno,ename,job,deptno FROM emp;            //显示重复

SELRECT empno,ename,job,deptno FROM emp WHERE deptno=10

                UNION 

SELECT empno,ename,job,deptno FROM emp;               //交集不显示重复

(3)差集(多减少):MINUS

SELRECT empno,ename,job,deptno FROM emp 

                MINUS

SELECT empno,ename,job,deptno FROM emp WHEREdeptno=10;

posted @ 2019-08-21 01:41  萧余  阅读(176)  评论(0编辑  收藏  举报