学习视频 :http://v.youku.com/v_show/id_XMTY5ODQwMDg0.html?firsttime=7026
一、笛卡尔积(无实用意义)
二、表连接查询:
①等值连接
语法格式:
Select 字段列表
From table1 a,table2 b
Where table1.column1 = table2.column2 AND 。。。;
②非等值连接
字段 between 字段1 字段2;
字段 > 字段1 AND 字段 < 字段2
③外连接(outer join)(左、右、满外连接)
可以将未匹配的字段显示出来(左表或者右表或者都显示)
左外连接 语法格式:
Select 字段列表
From table1 a,table2 b
Where a.column1(+) = b.column2;
④自连接(self join)
需要的信息在一张表上,如何查得每个员工及其上司的工号和姓名
将一张表看做两张表,用表别名区分
三、多表连接中:
可使用AND \ OR操作符增加查询条件
使表别名可以简化查询
使用表名(表别名)前缀,可提高查询效率
为了连接n个表,至少需要n-1个连接条件
四、交叉连接(cross join)
产生一个笛卡尔积,效果等同于在两个表进行连接时未使用WHERE子句限定连接条件
没什么意义
五、自然连接(natural join)
Select*
Fromtable1 natural join table2;
相当于将所有同名字段加上了等值连接Where table1.column1 = table2.column2
故不能再使用表名前缀,同名列数据类型必须相同,从两个表中选出同名列的值所有行均对应相等的
六、Using子句
Selecta,b,c,d
Fromaa join bb
Using(c,d,b);
代表同名列表相等
不能在参照列上使用表名前缀
七、ON子句
如果要参照非同名的列进行等值连接,或者想设置任意的连接条件,可以使用ON子句
Selectempno,ename,sal,emp.deptno,dname
Fromemp join dept
On(emp.deptno = dept.deptno);
相当于
Selectempno,ename,sal,emp.deptno,dname
Fromemp ,dept
whereemp.deptno = dept.deptno;
八、子查询(sub query)
问题引入:如何查询所有比“张三”工资高的员工的信息
子查询在主查询前执行一次,结果供主查询使用
注意:
1、在查询是基于未知值时应考虑使用子查询
2、子查询必须包含在括号内
3、建议将子查询放在比较运算符的右侧,以增强可读性
4、除非进行Top-N分析,否则不要在子查询中使用ORDER BY子句
5、对单行子查询使用单行运算符
6、对多行子查询只能使用多行运算符(IN,ANY,ALL)
九、Top-N
ORACLE中通常采用子查询的方式实现TOP-N查询
Select 字段列表
From(select 字段列表 from table order by 排序字段)
Where rownum <=n;
Eg:
Select *
From (select * from emp order by sal desc)
Where rownum <=5;