日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle查询二

發布時間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle查询二 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 復合主鍵的問題
  • --學生表 create table student(sid number(4) primary key ,sname varchar2(20),sidcard varchar2(25),sgender number(1) --0:男,1:女 ); --課程表 create table course(cid number(4) primary key ,cname varchar2(20),tid number(4) references teacher(tid) ); --選課表 create table sc(sid number(4) references student(sid),cid number(4) references course(cid),score number(4,1),primary key (sid,cid) --復合主鍵 );

    這里對于選課表來說,他的的sid 和cid就是一個復合主鍵,共同決定了選課表的內容。那么對于sc里面的外鍵sid和cid在創建的時候,他們的類型必須和student和course的類型一致,并且字節大小也要盡量一致,如果小的話會造成內存溢出,如果太大呢,會造成空間的浪費。

  • 查詢學過100并且也學過編號200課程的同學的學號,姓名
  • 這是一種比較簡單和簡潔的寫法,像這樣同一個人有兩種行為的一般都要建立兩張表,進行自身的對比。同時有的時候還要和其他表進行連接 select student.sid, sname from sc a,sc b,student where a.sid=b.sid and a.cid=100 and b.cid=200 and student.sid=a.sid 這是一種比較保守的簡單的思路,雖然代碼要復雜一些,但是思路很簡單, 一般順著題目的意思一步一步的寫,就可以寫出來。 這里我們思路大概是這樣的,先找出學了100的學號,然后找出學了200的學號, 題目要求我們同時學了100200的學號,那么我們只需要將這兩張表和student表連接起來,自然也就是兩個課程都學了的表。然后選出學號和姓名就可以了。但是這里要注意表的連接,要注意重命名并且要注意on之后的條件,三張表的連接直接在后面寫join 就行了。 select stu.sid,stu.sname from student stu join ( select sid from sc where cid =100) c100 on stu.sid=c100.sid join ( select sid from sc where cid =200) c200 on stu.sid=c200.sid
  • 查詢100課程比200課程成績高的所有學生的學號。
  • 先來一個比較簡單的寫法,和上面的有點像,做法也是先分別查詢出100課程和200課程的分數,然后將這兩張表通過sid連接起來,再利用一個where語句就可以是實現了 是不是很簡單 select c100.sid from ( select sid,score from sc where cid=100) c100 join (select sid,score from sc where cid=200) c200 on c100.sid=c200.sid where c100.score>c200.score 第二種寫法同樣是涉及到自身的比較,那么高深一點的人就會馬上反應會有一個表的自身對比將表變成兩張表,一張表用于100一張表用于200,下面我們來看看具體怎么實現的 select a.sid from sc a,sc b where a.sid=b.sid and a.cid=100 and b.cid=200 and a.score>b.score 這里我們利用一個語句就實現了,是不是很簡單呢,所以一定要總結經驗,看到這樣的題目我們第一反應就是表的重命名
  • 按各科平均成績降序排列,平均成績相同時按及格率升序排列
    這道題的難點其實就在及格率怎么計算,及格率那么我們就要先找到每一科及格的人數,然后除以每一科的的總人數
  • 及格人數 select cid,count(1) from sc where score>=60 group by cid

    如圖
    這里對于求每一科的及格人數我們還可以這么想
    及格我們設置為1,不及格設置0,那么我們求和不就是及格的人數嗎

    case when then else end 這個語句返回的一個列,我們可以寫在select語句里面來用 感覺這種方法雖然不是很簡單,但是思維很特別, select cid, case when score>=60 then 1 else 0 end from sc

    下面我們來看下效果

    也就是我們將sc課表里面所有的同學的成績都分成了兩類,及格1,不及格0
    那么我們現在只需要統計每一科有多少個1就行了

    select cid, sum(case when score>=60 then 1 else 0 end ) from sc group by cid

    如圖:

    我們可以看到這里的結果和第一種方法一樣
    那么下面我還要統計每一科的總人數,這個就很簡單了

    select cid, sum(case when score>=60 then 1 else 0 end ) from sc group by cid

    如圖

    那么及格率我們就可以實現了

    select cid, sum(case when score>=60 then 1 else 0 end )/count(1) from sc group by cid

    這里我們將結果美化一下,利用round()函數保留2為小數 select cid, round( sum(case when score>=60 then 1 else 0 end )/count(1),2) from sc group by cid


    平均成績的話就很簡單了

    select cid, round(avg(score),2) avg_score from sc group by cid


    那么下面我們只需要對平均成績降序排列,平均成績相同時,按照及格率升序排列

    select cid, round(avg(score),2) avg_score, round( sum(case when score>=60 then 1 else 0 end )/count(1),2) pass_rate from sc group by cid order by avg_score desc,pass_rate asc--->order by 后面可以隨意進行排序的定義


    我們可以看到每一科成績都是按照平均成績由高到低,及格率由低到高

  • 查詢男生和女生的人數
    要查詢男生和女生的人數,那么我只需要兩列,一列是性別,一列是人數,性別可以根據group by 人數只需要count就行了,所以這題也很簡單,只需要將思路理清晰就很快實現了,要注意groupby后面的元素就是表格的主鍵或者一般都是第一列,根據什么分類
    所以我們在進行查詢的時候一定要先知道我需要什么,我select出的表格有哪些元素
    再根據這些元素去一一實現。
  • select sgender ,count(1) number from student group by sgender

  • 查出成績排名第五的學生姓名和總成績
    要找排名,那么我們可以通過rownum偽列來實現
  • select t2.*from( select rownum r,t1.* from( select sid,sum(score) from sc group by sid order by sum(score) desc) t1) t2 where r=5 一定要注意這里的rownum是和原始的表的行對應的一旦我們進行了排序的或者分組的操作就需要將改變之后的表看成一張新的表,然后選擇出新的表的偽列,才是真正的排名


    那么這里我們就選出了排名第五的學生
    但是有個問題來了,如果存在并列第五的話,那么偽列rownum就不再試用了。我們就需要借助排名函數rank來實現

    select sname,t1.sum_score,t1.rank_sum from student,( select sid,sum(score) sum_score, rank() over( order by sum(score) desc) rank_sum from sc group by sid ) t1 where rank_sum=5 and student.sid=t1.sid

  • 表的主鍵是自己的外鍵,同時自己的外鍵也是自己的主鍵如下
  • create table emp2(empno number(4) primary key,ename varchar2(25),job varchar2(10),hiredate date,mgr number(4) references emp2(empno) )

    今天就差不多總結到這里了,有什么不對希望多多指教

    轉載于:https://www.cnblogs.com/flyingcr/p/10428323.html

    總結

    以上是生活随笔為你收集整理的Oracle查询二的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。