176142998

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            116 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks

          課程
            java語言  java基本編程 -> j2EE編程
            數據庫的能力 sqlserver -> ORACLE
            數據結構    訓練編程思維方式 實際問題到計算機問題的轉化
            linux      熟悉一種新的操作系統

            軟件工廠    學到的知識 去做一個項目

            課程安排
            linux操作系統 4天
            數據結構    5天
            DOTNET介紹      4天

            ORACLE
              ORACLE數據庫  10天
              XML語言       5天
            J2EE 
              JSP/servlet   12天
              EJB           3天
              struts        4天


            軟件工廠        2周


          找工作的技能
              j2EE   +  XML   + ORACLE/SQLSERVER
          基礎 java    html javascript   sql


          ORACLE數據庫
             甲骨文   英文中 意思是神寓 神說的話
                復雜性
                公司野心
          1973年
              i  internet
              g  grid (網格)
             
              ERP  企業資源計劃 Enterprise Resource Plan
              MIS  管理信息系統 Management Information System

              德國 SAP
              ORACLE application 11i
             

          別的數據庫
             DB2  IBM公司  IBM產品綁定緊密 (windows unix/linux)
             sybase  sybase公司  電信和銀行 (windows unix/linux)
             sqlserver          windows平臺 
            
          小型
             access     office套件
             mysql      PHP(Personal HomePage)(linux) +
                         mysql(不支持存儲過程,觸發器等)

                

          學習方法
             動手能力
             做會的  不是書本學會的
            
             找問題的答案:
               問同學 問老師
               從網上 找答案
                 搜索引擎  www.google.com
                          百度
                   錯誤號  錯誤文字放入關鍵字中
                   提取關鍵字 多實驗
                    ORACLE安裝
                    ORACLE  +“安裝”

          ORACLE安裝和刪除
             ORACLE9i  9.0.1  空間1.76G
             ORACLE9i  9.0.2  空間2.86G
              事務處理 --  增 刪除 修改頻繁
              數據倉庫 -- 查詢 頻繁

              GBK    --多200個字左右(偏僻字)
              GB2312 
           
           SETUP.exe 雙擊


           啟動ORACLE數據庫  OracleServiceACCP  服務  多啟動幾次
                            OracleOraHome90TNSListener 服務
              如果啟動不了Listener(監聽器)
               <1>改注冊表 
                     ImagePath  D:\oracle\ora90\BIN\TNSLSNR
               <2>用命令行啟動
                      cmd  ->   tnslsnr 最小化
                      tNSlsnter  監聽器  如果無法啟動
                      運行cmd 切換到DOS界面 敲tnslsnr 窗口不要關閉
               <3>D:\oracle\ora90\network\ADMIN
                          listener.ora 文本文件
                       HOST=localhost或機器名
                        存盤
           
           
                    用工具 ORACLE SQL*PLUS驗證數據庫是否啟動
                      用戶名system   密碼manager
                      出現 連接到 和 SQL>符號 說明數據庫已經可用了

                  默認用戶:
                    超級用戶: 用戶名system/密碼manager
                             用戶名sys/密碼change_on_install

                    普通的用戶: 用戶名scott/密碼tiger


           注意的問題:安裝的源程序放在什么目錄下??
                  <1>目錄中不要出現中文名字的目錄
                  <2>數據庫的名字不要是中文,8個字符以內
                  <3>字符集用默認的ZHS16GBK

          刪除:
             在硬盤上的一個隱含安裝的目錄Programm Files下的ORACLE  

          操作ORACLE數據庫的工具

             ORACLE SQL*PLUS 字符界面 ORACLE自帶
               sqlplusw.exe windows窗口下的sqlplus
               sqlplus.exe   DOS下的sqlplus          
                  
                 用戶名scott 密碼tiger 普通用戶
                       system    manager   超級用戶
                       sys       change_on_install  超級用戶 比system權限還要大

               SQLPLUS下的常用命令
                 show user 察看用戶
                 connect 用戶名/密碼  連接到指定用戶
                      connect scott/tiger   
                  select * from tab where tabtype='TABLE';  察看當前用戶下的表      
                 select count(*) from dept;  查詢表dept中記錄的行數
                 desc dept             察看表dept的結構
                 quit/exit             退出
                 clear screen          清除屏幕
                 set linesize 200      設置一行顯示200個字符
                 set pagesize 20       設置每頁顯示20行

                 spool 文件名 (spool c:\abc.txt) 作日志文件命令        
                 spool off
                 
                 修改D:\oracle\ora90\sqlplus\admin\glogin.sql文件
           可以設置SQLPLUS的環境
                     set linesize 200
                     set pagesize 20  

             
                    

             ORACLE 企業管理器 (OEM)  圖形界面

             PL/SQL Developer 第三方軟件 ORACLE不帶的

            SQLPLUS  /nolog    nolog是不登陸

            瀏覽器使用oracle (isqlplus)
               D:\oracle\ora90\Apache\Apache\conf\httpd.conf
                     修改80端口   -> 8001
              http://localhost:8001/isqlplus

           

          ORACLE中字段的數據類型
             字符型    char        范圍  最大2000個字節 定長
                         char(10)   '張三' 后添空格6個把10個字節補滿  '張三      '
                           性別 char(2)   '男'
                          
                        varchar2    范圍  最大4000個字節 變長
                           varchar2(10)  '張三'      在數據庫中'張三'
                          
                       大對象 字符型大對象 >4000字節 最大4G
                         CLOB (Character Large OBject)    
              
             數字     number     范圍  10的-38次方 到10的38次方          
                        可以表示小數 也可以表示整數  
                       number(4)   最大表示4位整數  -9999 到 9999
                       number(5,2)   表示5位有效數字 2位小數的 一個小數  -999.99 到 999.99
                            
                      
             日期     date      包含年月日和時分秒  7個字節
             圖片     blob      二進制大對象    圖像/聲音  4G

          如何建表
             學生表student
                  create table student( --學生表
                     xh number(4), --學號
                     xm varchar2(10), --姓名
                     sex char(2), --性別
                     birthday date, --日期
                     sal number(7,2) --獎學金
                  );
             班級class
                 create table class( --班級表
                    classid number(2), --班級編號
                    cname varchar2(20) --班級名字
                 );
            添加字段(學生所在班級classid)
                alter table student add (classid number(2));
            修改字段的長度
                alter table student modify (xm varchar2(12)) ;
            修改字段的類型(不能有記錄的)
                alter table student modify (xh varchar2(5));
            刪除一個字段
                alter table student drop column sal;
            刪除表
                drop table student;
            表的名字修改
                rename student to stu;
            字段如何改名字
                --先刪除
                a)alter table student drop column sal;        
                --再添加
                b)alter table student add (salary number(7,2));

          如何插入數據
            插入數據 insert語句
                所有字段都插入
                 insert into student values ('A001','張三','男','01-5月-05',10);
                      ORACLE中默認的日期格式'DD-MON-YY'   dd 日子(天)  mon 月份 yy 2位的年
                       '09-6月-99' 1999年6月9號
                      改日期的默認格式
                           alter session set nls_date_format = 'yyyy-mm-dd';
              
                 insert into student values ('A002','MIKE','男','1905-05-06',10);

                     恢復ORACLE默認格式
                         alter session set nls_date_format = 'dd-mon-yy';
                     察看日期的格式
                         set linesize 1000
                         select * from nls_session_parameters
                           where parameter='NLS_DATE_FORMAT';
                     永久設置日期格式
                         改注冊表oracle/HOME0 加字符串NLS_DATE_FORMAT 值yyyy-mm-dd
               部分字段插入
                 insert into student(xh,xm,sex) values ('A003','JOHN','女');
               插入空值
                 insert into student(xh,xm,sex,birthday) values ('A004','MARTIN','男',null);

            修改  update
                改一個字段 
                 update student set sex='女' where xh='A001';
                改多個字段
                 update student set sex='男',
                                    birthday='1980-04-01'
                        where xh='A001';
                改為空值 (修改為空時=null)
                 update student set birthday=null where xh='A001';
                把生日為空的人的班級編號改為20(條件中的空是is null / is not null)
                    update student set classid=20 where birthday is null;
                   錯誤的沒有達到要求
                   update student set classid=20
                     where birthday=null;
                   不表示空值 表示xm是null的字符串        
                   update student set classid=20 where xm='null';
           
             
            刪除 delete
                delete from student;  刪除所有記錄,表結構還在,寫日志,可以恢復的,速度慢
                drop table student;  刪除表的結構和數據
                delete from student where xh='A001';  刪除一條記錄

                truncate table student; 刪除表中的所有記錄,表結構還在,不寫日志,無法找回刪除的記錄,速度快

            查詢 select   
                select * from student;

                select xh,xm,sex from student;    

                select * from student where xh like 'A%1'; %任意多個字符
                select * from student where xh like 'A__1'; _1個字符
                select * from student where xh like '%A%';             select * from student where xh like 'A%';
          select * from student where xh like '%A';                              

                select * from student where xh = 'A%';
                                 
            
                select * from student
                order by birthday ;  升序 (order by birthday asc;)
           
                select * from student
                order by birthday desc; --降序
            
                select * from student
                order by birthday desc,xh asc; --按birthday 降序 按xh升序(asc/默認)
                          
                select * from student
                where sex='女' or birthday='1999-02-01';

                select * from student
                where sex='女' and birthday='1999-02-01';

                select * from student
                 where salary > 20 and xh <> 'B002'; (!=)

          ORALCE的函數
             單行函數   返回值只有一個
               
             分組函數   返回值是多條記錄
                group by
                sum
                avg           
               
          單行函數
            字符函數
              concat 連接  ||
             <1>顯示dname和loc中間用-分隔
               select deptno,dname||'----'||loc from dept;
              
               dual啞元表   沒有表需要查詢的時候 可以用它
                   select 'Hello World' from dual;
                   select 1+1 from dual;
                   查詢系統時間
                    select sysdate from dual;
             <2>  initcap 首字母大寫
                 select ename,initcap(ename) from emp;
             <3>  lower   轉換為小寫字符
                  select ename,lower(ename) from emp;
             <4> upper 轉換為大寫
                  update dept set loc=lower(loc);
                  update dept set loc=upper(loc);
             <5> LPAD 左填充
                  select deptno,lpad(dname,10,' '),loc from dept;
             <6> RPAD 右填充
             <7> LTRIM 去除左邊的空格
                 RTRIM 去除右邊的空格
                 ALLTRIM  去除兩邊的空格
             <8>replace    替換
                translate  轉換
                 select ename,replace(ename,'S','s') from emp;
                     用's'去替換ename中的'S'
                  select ename,translate(ename,'S','a') from emp;
             <9> ASCII 求ASC碼
                 chr   asc碼變字符
                   select ascii('A') from dual;
                   select chr(97) from dual;
                   select 'Hello'||chr(9)||'World' from dual;
                                     '\t' ascii碼是 9
                                     '\n' ascii碼是 10

                   select 'Hello'||'\t'||'World' from dual;    

             <10> substr 字符截取函數
                     select ename,substr(ename,1,3) from emp;
                         從第1個位置開始 顯示3個字符
                     select ename,substr(ename,4) from emp;
                        從第4個位置開始顯示后面所有的字符
             <11> instr 測試字符串出現的位置
                    select ename,instr(ename,'S') from emp;
                       'S'第1次出現的位置
            select ename,instr(ename,'T',1,2) from emp;                
                       從第1個位置開始 測試'T'第2次出現的位置 
            <12> length 字符串的長度
                  select ename,length(ename) from emp;
                
          日期和 時間函數
             <1> sysdate 系統時間
                  select sysdate from dual;
                  select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;
                  select to_char(sysdate,'DDD') from dual  
                select to_char(sysdate,'D') from dual
                select to_char(sysdate,'DAY') from dual

                select to_char(sysdate,'yyyy-mm-dd') from dual;

            select to_char(sysdate,'yyyy"年"mm"月"dd"日" hh24:mi:ss') from dual;
           
           select '''' from dual;

          select to_char(sysdate,'SSSSS') from dual;
            --從今天零點以后的秒數

             <2> ADD_MONTHS 添加月份 得到一個新的日期
                  select add_months(sysdate,1) from dual;

                 select add_months(sysdate,-1) from dual;

                 select trunc(sysdate)-to_date('20050101','yyyymmdd') from dual;
                 select add_months(sysdate,12) from dual;
                     一年以后的今天
          select add_months(sysdate,-12) from dual;
                     一年以前的今天

               trunc(sysdate) 截取年月日
           
           select sysdate+2 from dual;
                  數字代表的是天數

               兩個日期之間的差值代表天數

             <3> last_day  某月的最后一天
                 select last_day(sysdate) from dual;
                
                 select add_months(last_day(sysdate)+3,-1) from dual;
                      本月第3天的日期
            <4>  months_between 兩個日期之間的月數
                   select months_between(sysdate,'2005-02-01') from dual;
                           方向 sysdate - '2005-02-01'
                select months_between('2005-02-01',sysdate) from dual;
              
           轉換函數
             to_char   把日期或數字類型變為字符串
                 select to_char(sysdate,'hh24:mi:ss') from dual;
                 select to_char(sysdate,'yyyymmdd hh24:mi:ss') from dual;

                 select sal,to_char(sal,'L9,999') from emp;
                       L本地貨幣
            to_number   把字符串變成數字
                select to_number('19990801') from dual;
           
            to_date     把字符串變成日期
                select to_date('19800101','yyyymmdd') from dual;

                select to_char(to_date('19800101','yyyymmdd'),
                  'yyyy"年"mm"月"dd"日"') from dual;     
           數學函數
              ceil(x)  不小于x的最小整數
                  ceil(12.4)   13
                  ceil(-12.4)   -12
              floor(x)  不大于x的最大整數
                  floor(12.5)  12
                  floor(-12.4)  -13


             round(x)  四舍五入
               round(12.5)   13
               round(12.456,2) 12.46

             trunc(x)  舍去尾數
               trunc(12.5)  12
               trunc(12.456,2)  12.45
              舍去日期的小時部分
               select to_char(trunc(sysdate),'yyyymmdd hh24:mi:ss') from dual;
             mod(x,n)  x除以n以后的余數
               mod(5,2) 1
               mod(4,2) 0

             power(x,y)  x的y次方
              select power(3,3) from dual;
              
           
          混合函數
                求最大值
             select greatest(100,90,80,101,01,19) from dual;
            
                求最小值
             select least(100,0,-9,10) from dual;

                空值轉換函數 nvl(comm,0) 字段為空值 那么就返回0 否則返回本身
             select comm,nvl(comm,0) from emp;
                comm 類型和 值的類型是 一致的
            
          復雜的函數
             decode   選擇結構  (if ... elseif .... elesif ... else結構)
             
          要求:
             sal=800  顯示低工資  
             sal=3000  正常工資
             sal=5000  高工資
              只能做等值比較

            select sal,decode(sal,800,'低工資',3000,'正常工資',5000,'高工資','沒判斷')
            from emp;
           表示如下的if  else 結構
               if sal=800 then
                  '低工資'
               else if sal =3000 then
                  '正常工資'
               else if  sal = 5000 then
                   '高工資'
               else
                  '沒判斷'
               end if
                   

             sal > 800           sal -800 > 0  

           判斷正負
            sign(x)   x是正  1
                      x是負  -1
                      x是0   0
              select sign(-5) from  dual;


           如何做大于小于的比較????
            sal<1000  顯示低工資   sal-1000<0   sign(sal-1000) = -1
             1000<=sal<=3000  正常工資
             3000<sal<=5000  高工資

             select sal,decode(
                       sign(sal-1000),-1,'低工資',
                      decode(sign(sal-3000),-1,'正常工資',
                                      0,'正常工資',1,
                      decode(sign(sal-5000),-1,'高工資','高工資')
                       )) as 工資狀態 from emp;
               
            一般的情況  decode(x,y1,z1,y2,z2,z3)
                if x= y1 then
                    z1         
                else if x = y2 then
                    z2
                else
                   z3
                end if 

          分組函數   返回值是多條記錄 或計算后的結果
                group by
                sum
                avg

          <1>  計算記錄的條數 count

            select count(*) from emp;
            select count(1) from emp;


            select count(comm) from emp; 字段上count 會忽略空值
                comm不為空值的記錄的條數

            統計emp表中不同工作的個數 ????
             select count(distinct job) from emp;

             select distinct job from emp;
             select distinct job,empno from emp;
             select job,empno from emp;
              得到的效果是一樣的,distinct 是消去重復行
                                 不是消去重復的列
           <2>group  by 分組統計
               --在沒有分組函數的時候
               --相當于distinct 的功能
               select job from emp group by job;

               select distinct job from emp;

             --有分組函數的時候
             --分組統計的功能
             統計每種工作的工資總額是多少??
               select job,sum(sal) from emp
                    group by job;       --行之間的數據相加

               select sum(sal) from emp;  --公司的工資總額


           統計每種工作的平均工資是多少?? 
               select job,avg(sal) from emp
                    group by job;   

              select avg(saL) from emp; --整個公司的平均工資


           顯示平均工資>2000的工作???
             <1>統計每種工作的平均工資是多少
             <2>塞選出平均工資>2000的工作     

              從分組的結果中篩選 having
             select job,avg(sal) from emp
                    group by job
                    having avg(sal) > 2000;
             group by 經常和having搭配來篩選

          計算工資在2000以上的各種工作的平均工資????
            select job,avg(sal) from emp
                    where sal > 2000
                    group by job
                    having avg(sal) > 3000;

              一般group by  和 having搭配
                  表示對分組后的結果的篩選
               where子句 --- 用于對表中數據的篩選  
           
            <3> max min
             select max(sal) from emp;
               公司的最高工資
             select min(sal) from emp ;
               公司的最低工資

          找每個部門的最高和最低的工資??
            select deptno,max(sal),min(sal) from emp
               group by deptno;
          找每個工作的最高和最低的工資??
            select job,max(sal),min(sal) from emp
               group by job;
          找每個部門中每種工作的最高和最低的工資??
            select deptno,job,max(sal),min(sal)
             from emp
             group by deptno,job;

           select max(sal),min(sal)
             from emp
             group by deptno,job;

              單個字段如果沒有被分組函數所包含,
                 而其他字段又是分組函數的話     
                一定要把這個字段放到group by中去

           <4>關聯查詢
                多張表,而表與表之間是有聯系的

                 是通過字段中的數據的內在聯系來發生
                 而不是靠相同的字段名來聯系的或者是否有主外鍵的聯系是沒有關系的
                select dname,ename from emp,dept;
                   笛卡爾積  (無意義的)
                --當2個表作關聯查詢的時候一定要寫關聯的條件
                --N個表 關聯條件一定有N-1個

                select dname,ename from mydept,myemp
                 where mydept.no = myemp.deptno;


                多表查詢的時候一定要有關聯的條件
                  --使用的表的全名
                  select dname,ename from emp,dept
                   where emp.deptno = dept.deptno ;
                 
                  --使用表的別名
                   select dname,ename,a.deptno from emp a,dept b
                   where a.deptno = b.deptno and a.deptno = 10;

                 --等值連接(內連接-兩個表的數據作匹配a.deptno = b.deptno )
                   select dname,ename,a.deptno from
                   emp a inner join dept b
                   on a.deptno = b.deptno;
                   where a.deptno = 10;

                 --on寫連接條件的
                 --where中寫別的條件

                 --使用where/on
                   select dname,ename,a.deptno from emp a,dept b
                   where a.deptno = b.deptno and a.deptno=10;
                  
                    --on中寫連接條件
                    --where中寫其他的條件
                    select dname,ename,a.deptno from
                   emp a inner join dept b
                   on a.deptno = b.deptno
                   where a.deptno = 10 ;

                 --外連接
                   左外連接 右外連接  全外連接
                   (+)寫法只有在ORACLE中有效
                  select dname,ename,b.deptno
                  from emp a,dept b
                  where a.deptno(+) = b.deptno;
                 --標準寫法
                   select dname,ename,b.deptno
                  from emp a right outer join dept b
                  on a.deptno = b.deptno;        


                  select dname,ename,b.deptno
                  from emp a,dept b
                  where a.deptno = b.deptno(+);
              --標準寫法
                   select dname,ename,b.deptno
                  from emp a left outer join dept b
                  on a.deptno = b.deptno;        

              --標準寫法(全外聯) 
                     select dname,ename,b.deptno
                  from emp a full outer join dept b
                  on a.deptno = b.deptno;    
            
              --自連接
                  select a.ename as 員工姓名,b.ename as 經理名字 from emp a,emp b
                  where a.mgr = b.empno(+);
                        a.empno = b.mgr  ???????
           
           <5>子查詢
              在select語句中嵌套了另一個select語句
               1)where 子句中嵌套子查詢
               2)用子查詢的結果 作為字段來出現

          --1)where 子句中嵌套子查詢,執行順序是
                先執行子查詢 再執行主查詢
            找出工資高于公司平均工資的所有員工??
             select * from emp where sal+nvl(comm,0) > (select avg(sal+nvl(comm,0)) from emp);

             高于部門30中員工最高工資的其他員工???
              
            select * from emp where  sal+nvl(comm,0) > all (select sal+nvl(comm,0) from emp
                         where deptno = 30);

             低于部門30中員工工資的其他員工???
            select * from emp where  sal+nvl(comm,0) < all (select sal+nvl(comm,0) from emp
                         where deptno = 30);

            select * from emp where  sal+nvl(comm,0) < any (select sal+nvl(comm,0) from emp
                         where deptno = 30);


          --2)用子查詢的結果 作為字段來出現 
                先執行主查詢 再執行子查詢

            <1>找員工姓名和直接上級的名字
             select ename as 員工姓名,(select ename from emp where empno = a.mgr) as 經理姓名
             from emp a;      
           <2>顯示部門名稱和人數
            select dname,(select count(*) from emp where deptno=a.deptno) as rs from dept a;
           <3>顯示每個部門的最高工資的員工
              select * from emp a where (deptno, sal) in  (  select deptno,max(sal) from emp group by deptno);
           
           select a.* from emp a,(  select deptno,max(sal) as msal from emp group by deptno) c where a.deptno = c.deptno and
          a.sal = c.msal;

          --最大值和最小值的比較 轉化為人數的比較
          select * from emp a where (select count(*) from
           emp where deptno = a.deptno and
           sal > a.sal) = 0 and a.deptno is not null;

           <4>顯示每個部門的工資前2名的員工
          select * from emp a where (select count(*) from
           emp where deptno = a.deptno and
           sal > a.sal) <=1 and a.deptno is not null;

          <6> 層次查詢
          --level 偽列 層次查詢的時候可以使用的  層的編號

            select lpad('+',level,' ')||ename from emp
               connect by prior empno = mgr --父子關系 父結點中的empno = 子節點中的mgr
               start with mgr is null;--從 mgr is null的節點 開始遍歷

          select lpad('+',level,' ')||ename from emp
               connect by prior empno = mgr
               start with ename = 'BLAKE';

          <7> TOP 前幾行 (sqlserver)
              rownum  (oracle偽列)

           --emp表的前2行
           --rownum必須使用<=的關系比較運算符

           select * from emp where rownum <= 2;

           select top 2 * from emp; --sqlserver的寫法

           select * from emp where rownum = 1;

           --公司工資最高的2個人
           /*select * from emp
           where rownum <= 2
          order by sal desc;*/ 錯誤的

             select * from (select * from emp order by sal desc)
             where rownum <= 2;

           --分頁查詢
            --每頁顯示4行 一共有14行記錄

            第1頁    第1-4行
            第2頁    第5-8行
            第3頁    第9-12行
            第4頁    第13-14行

           --希望每次頁面顯示的時候 都只查詢回需要的記錄
           
             select * from (select rownum as num,emp.* from emp)
             where num >= 9 and num <= 12;

             select * from (select rownum as num,emp.* from emp)
             where num >= 13 and num <= 14;


          <例子>
          建立表如下:

          學生基本信息表
          CREATE Student(
          [Studentid][Int]IDENTITY(1,1)NOT NULL primary key,--主鍵
          [StudentName][char]NOT NULL

          )
          課程信息表
          CREATE Subject(
          [SubjectID][char]NOT NULL primary key,       --主鍵
          [SubjectName][char]NOT NULL
          )
          成績表
          CREATE Grade(
          [Studentid][Int]NOT NULL,  --聯合主鍵
          [SubjectID][char]NOT NULL,  --聯合主鍵
          [Grade] [INT]NOT NULL,
          primary key (studentid,subjectid)
          )

          1.將建表命令改為ORACLE語句在ORACLE中建表
          create table student( --學生表
          studentid number(3) primary key, --學生編號
          studentname varchar2(20) --學生的姓名
          );

          create table subject( --課程表
          subjectid char(3) primary key, --課程編號
          subjectname varchar2(20)  --課程的名字
          );


          create table grade( --分數表
          studentid number(3) references student(studentid), --學生id
          subjectid char(3) references subject(subjectid), --課程id
          mark      number(3), --分數
          primary key (studentid,subjectid) --聯合主鍵
          );

           

          insert into student values (101,'張三');
          insert into student values (102,'李云');
          insert into student values (103,'未');

          insert into subject values ('A01','C++');
          insert into subject values ('A02','ASP');
          insert into subject values ('A03','JAVA');


          insert into grade values (101,'A01',59);
          insert into grade values (101,'A02',72);
          insert into grade values (101,'A03',90);

          insert into grade values (102,'A01',75);
          insert into grade values (102,'A02',91);

          insert into grade values (103,'A01',71);

           


          2.作如下4題

          第一問:查詢出以下信息

          學號 學生姓名 課程名稱 成績 (要全部學生信息)

          關聯查詢 (多張表的)
          別名

          select a.studentid as "學  號",studentname "學生姓名",
          subjectname "課程名稱",mark "成  績"
          from student a , subject b , grade c
          where a.studentid = c.studentid
          and b.subjectid = c.subjectid;

          [select a.studentid "學  號",studentname "學生姓名",
          subjectname "課程名稱",mark "成  績"
          from student a , subject b , grade c] 笛卡爾積

                 3 * 3 * 6 = 54;


          第二問:查詢出以下信息

          學號 學生姓名 課程名稱 成績(只顯示每科最高分)

          select a.studentid "學  號",studentname "學生姓名",
          subjectname "課程名稱",mark "成  績"
          from student a,subject b,grade c
          where a.studentid = c.studentid
          and b.subjectid = c.subjectid
          and (subjectname,mark)
          in (select subjectname "課程名稱",max(mark) "成  績"
          from student a,subject b,grade c
          where a.studentid = c.studentid
          and b.subjectid = c.subjectid
          group by subjectname)

          (最高分---分數比我高的學生的人數=0)
          select a.studentid "學  號",studentname "學生姓名",
          subjectname "課程名稱",mark "成  績"
          from student a,subject b,grade c
          where a.studentid = c.studentid
          and b.subjectid = c.subjectid
          and (select count(*) from grade
          where subjectid = b.subjectid and
          mark > c.mark) = 0


          第三問:查詢出以下信息

          學號 學生姓名 課程名稱 成績 (成績大于60時的顯示及格,小于60時的顯示不及格)

          select a.studentid "學  號",studentname "學生姓名",
          subjectname "課程名稱",
          decode(sign(mark-60),-1,'不及格','及格') "成  績"
          from student a,subject b,grade c
          where a.studentid = c.studentid
          and b.subjectid = c.subjectid

          第四問:查詢出以下信息

          學號 學生姓名 (查詢出課程超過1門以上學生的信息)

          select a.studentid "學  號",studentname "學生姓名",
          count(subjectname)
          from student a , subject b , grade c
          where a.studentid = c.studentid
          and b.subjectid = c.subjectid
          group by a.studentid,studentname
          having count(subjectname) >= 2

           

           

           

           

           

           

           

           

           

           

           

           


          -- select * from emp where rownum > 2;   錯誤的

           

           

           

           

           

           

           


              

          posted on 2008-06-12 10:29 飛飛 閱讀(1303) 評論(3)  編輯  收藏

          Feedback

          # re: ORACLE第一天[未登錄] 2008-06-12 10:48 Paul Lin
          不知所云  回復  更多評論
            

          # re: ORACLE第一天 2008-06-12 15:36 懶人
          總結的很詳細不錯,有心了  回復  更多評論
            

          # re: ORACLE第一天 2008-06-13 09:21 懶人
          @飛飛
          很基礎的東西為什么不看?  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 高唐县| 临沧市| 巴东县| 桂平市| 昌宁县| 南江县| 安达市| 绥江县| 闽侯县| 通化市| 礼泉县| 龙口市| 东兴市| 彰化县| 禹城市| 斗六市| 桦南县| 玉环县| 上高县| 崇阳县| 韶山市| 罗定市| 信阳市| 洛扎县| 常宁市| 磐石市| 房产| 临夏市| 桑日县| 册亨县| 长春市| 五家渠市| 沐川县| 固安县| 湖南省| 桐梓县| 资中县| 楚雄市| 汪清县| 郧西县| 安龙县|