日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Oracle查询二

發(fā)布時(shí)間:2025/3/21 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle查询二 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • 復(fù)合主鍵的問題
  • --學(xué)生表 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) --復(fù)合主鍵 );

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

  • 查詢學(xué)過100并且也學(xué)過編號(hào)200課程的同學(xué)的學(xué)號(hào),姓名
  • 這是一種比較簡(jiǎn)單和簡(jiǎn)潔的寫法,像這樣同一個(gè)人有兩種行為的一般都要建立兩張表,進(jìn)行自身的對(duì)比。同時(shí)有的時(shí)候還要和其他表進(jìn)行連接 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 這是一種比較保守的簡(jiǎn)單的思路,雖然代碼要復(fù)雜一些,但是思路很簡(jiǎn)單, 一般順著題目的意思一步一步的寫,就可以寫出來。 這里我們思路大概是這樣的,先找出學(xué)了100的學(xué)號(hào),然后找出學(xué)了200的學(xué)號(hào), 題目要求我們同時(shí)學(xué)了100200的學(xué)號(hào),那么我們只需要將這兩張表和student表連接起來,自然也就是兩個(gè)課程都學(xué)了的表。然后選出學(xué)號(hào)和姓名就可以了。但是這里要注意表的連接,要注意重命名并且要注意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課程成績(jī)高的所有學(xué)生的學(xué)號(hào)。
  • 先來一個(gè)比較簡(jiǎn)單的寫法,和上面的有點(diǎn)像,做法也是先分別查詢出100課程和200課程的分?jǐn)?shù),然后將這兩張表通過sid連接起來,再利用一個(gè)where語句就可以是實(shí)現(xiàn)了 是不是很簡(jiǎn)單 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 第二種寫法同樣是涉及到自身的比較,那么高深一點(diǎn)的人就會(huì)馬上反應(yīng)會(huì)有一個(gè)表的自身對(duì)比將表變成兩張表,一張表用于100一張表用于200,下面我們來看看具體怎么實(shí)現(xiàn)的 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 這里我們利用一個(gè)語句就實(shí)現(xiàn)了,是不是很簡(jiǎn)單呢,所以一定要總結(jié)經(jīng)驗(yàn),看到這樣的題目我們第一反應(yīng)就是表的重命名
  • 按各科平均成績(jī)降序排列,平均成績(jī)相同時(shí)按及格率升序排列
    這道題的難點(diǎn)其實(shí)就在及格率怎么計(jì)算,及格率那么我們就要先找到每一科及格的人數(shù),然后除以每一科的的總?cè)藬?shù)
  • 及格人數(shù) select cid,count(1) from sc where score>=60 group by cid

    如圖
    這里對(duì)于求每一科的及格人數(shù)我們還可以這么想
    及格我們?cè)O(shè)置為1,不及格設(shè)置0,那么我們求和不就是及格的人數(shù)嗎

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

    下面我們來看下效果

    也就是我們將sc課表里面所有的同學(xué)的成績(jī)都分成了兩類,及格1,不及格0
    那么我們現(xiàn)在只需要統(tǒng)計(jì)每一科有多少個(gè)1就行了

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

    如圖:

    我們可以看到這里的結(jié)果和第一種方法一樣
    那么下面我還要統(tǒng)計(jì)每一科的總?cè)藬?shù),這個(gè)就很簡(jiǎn)單了

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

    如圖

    那么及格率我們就可以實(shí)現(xiàn)了

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

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


    平均成績(jī)的話就很簡(jiǎn)單了

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


    那么下面我們只需要對(duì)平均成績(jī)降序排列,平均成績(jī)相同時(shí),按照及格率升序排列

    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 后面可以隨意進(jìn)行排序的定義


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

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

  • 查出成績(jī)排名第五的學(xué)生姓名和總成績(jī)
    要找排名,那么我們可以通過rownum偽列來實(shí)現(xiàn)
  • 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是和原始的表的行對(duì)應(yīng)的一旦我們進(jìn)行了排序的或者分組的操作就需要將改變之后的表看成一張新的表,然后選擇出新的表的偽列,才是真正的排名


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

    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

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

    今天就差不多總結(jié)到這里了,有什么不對(duì)希望多多指教

    轉(zhuǎn)載于:https://www.cnblogs.com/flyingcr/p/10428323.html

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。