多表连接子查询;left join、right join、inner join的区别

left join、right join、inner join的区别 (举例很详细)

数据库中的左连接(left join)和右连接(right join)区别 ( 左连接where只影向右表,右连接where只影响左表。


学习视频   :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;

你可能感兴趣的:(JOIN,c,table,query)