多表查询尽量使用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;