--学生表
CREATE TABLE S
(
       SID NUMBER(4),        --学生ID
       SNAME VARCHAR2(10),   --学生姓名
       SEX CHAR,             --学生性别
       AGE NUMBER(2)         --学生年龄
)--学生成绩表
CREATE TABLE SC
(
       SID NUMBER(4),        --学生ID
       CID NUMBER(4),        --课程ID
       GRADE NUMBER(3)       --成绩
)--课程表
CREATE TABLE C
(
       CID NUMBER(4),        --课程ID
       CNAME VARCHAR2(20),   --课程名
       TEACHER VARCHAR2(20)  --任课老师
)DECLARE
BEGIN
     INSERT INTO C VALUES(9001,'数据结构','胡老师');
     INSERT INTO C VALUES(9002,'数据库原理','徐老师');
     INSERT INTO C VALUES(9003,'计算机基础','王老师');
     
     INSERT INTO S VALUES(1001,'张三','F',20);
     INSERT INTO S VALUES(1002,'李四','F',21);
     INSERT INTO S VALUES(1003,'小丽','M',20);
     INSERT INTO S VALUES(1004,'王五','F',30);
     
     INSERT INTO SC VALUES(1001,'9001',80);
     INSERT INTO SC VALUES(1001,'9002',90);
     INSERT INTO SC VALUES(1001,'9003',98);
     
     INSERT INTO SC VALUES(1002,'9001',70);
     INSERT INTO SC VALUES(1002,'9002',60);
     
     INSERT INTO SC VALUES(1003,'9001',0);
     INSERT INTO SC VALUES(1003,'9002',50);
     INSERT INTO SC VALUES(1003,'9003',77);
     
     INSERT INTO SC VALUES(1004,'9001',0);
     INSERT INTO SC VALUES(1004,'9002',0);
     INSERT INTO SC VALUES(1004,'9003',0);
END;--查找出姓名为“张三”的“数据结构”的成绩
--方式1
SELECT ts.sname,tsc.grade
FROM SC tsc
INNER JOIN S ts ON tsc.sid=ts.sid
WHERE ts.sname='张三' 
AND tsc.cid=
(
SELECT tc.cid
FROM C tc
WHERE tc.cname='数据结构'
)--方式2
SELECT ts.sname,tc.cname,tsc.grade
FROM SC tsc
INNER JOIN S ts ON tsc.sid=ts.sid
INNER JOIN C tc ON tsc.cid=tc.cid
WHERE ts.sname='张三' AND tc.cname='数据结构'--方式3
SELECT ts.sname,tc.cname,tsc.grade
FROM SC tsc,S ts,C tc
WHERE tsc.sid=ts.sid 
AND tsc.cid=tc.cid 
AND ts.sname='张三' 
AND tc.cname='数据结构'--查找出没有选修“数据结构”课程的学员的ID和姓名
--方式1
SELECT ts.sid,ts.sname
FROM S ts
INNER JOIN SC tsc ON ts.sid=tsc.sid
WHERE tsc.grade=0 AND tsc.cid=
(
SELECT tc.cid
FROM C tc
WHERE tc.CNAME='数据结构'
)--方式2
SELECT ts.sid,ts.sname
FROM S ts
INNER JOIN SC tsc ON ts.sid=tsc.sid
INNER JOIN C tc ON tsc.cid=tc.cid
WHERE tsc.grade=0 AND tc.cname='数据结构'--方式3
SELECT ts.sid,ts.sname
FROM S ts,SC tsc,C tc
WHERE ts.sid=tsc.sid 
AND tsc.cid=tc.cid 
AND tsc.grade=0 
AND tc.cname='数据结构'=============================================================
1、以上几种查询方式有什么区别吗,各自的优点和缺点是什么呢?
2、一般在项目中都用哪种方式比较多呢?PS.题目中加了【值得探讨】只是针对初学者^^,请高手不要扔砖头~~~

解决方案 »

  1.   

    inner join=where,效果一样
      

  2.   

    我都用3,因为不会用inner join
    外连接都用(+),同理
      

  3.   

    你把join两边的数据量估算一下乘起来就知道了
      

  4.   

    没有区别,oracle里的执行计划都是一样的.
      

  5.   

    inner join是在9I以后的版本中才可以使用的,8i之前都用(+),原理都是一样的
      

  6.   

    from tab1 inner join tab2 on tab1.col1=tab2.col1  和平常的 from  tab1,tab2 where tab1.col1=tab2.col1 是一样的,只是语法形式上的区别.因为inner join 写法,确定了join的两个表,因此,怀疑在多个表的情况下,如果没有用inner join,那么 oracle 优化器会自动选择多个表之间如何组合起来依次做join,驱动表和非驱动表等,但是inner join 的写法下,表的join 顺序是基本确定的.可能有这么一个区别.