多表查詢:從多表中獲取數據;
兩個表的結構是一樣的,但是紅框的數據是不同的。利用表的加法將兩個表合并成一個表;
表的加法(union)根據行合并兩個表的數據,刪除重復數據;
要保留重復數據,請使用union all
1)什么是聯結?
關系是數據庫可以對應的匹配,在關系數據庫中稱為連接(join);
連接是通過表與表之間的關系將表合并在一起的操作;
學生表-成績表 通過學號連接;成績表-課程表 通過課程號連接;課程表-教師表 通過教師號聯系;
2)常見的連接方式
①交叉連接(笛卡爾積)
將表中的每一行與另一行合并;
如圖:表1、表2、表3分別和A、B合并在一起;
新表行數=表1行數*表2行數。
在實際工作中使用的交叉聯系較少,結果行數過多,需要大量的運算成本和設備的支持,
而且行數過多,實際價值有限;
但是,交叉連接是后面所有連接的基礎,其他連接是在交叉連接的基礎上+過濾條件。
②內聯結(inner join)
兩張表中的數據同時存在于搜索中
內部聯系的操作:從學生表和成績表中取出合格的行 → 交叉聯結;
內聯SQL語句:
③左聯結(left join)
找出表中左側的所有數據,左連接是下圖中的紅色部分;
左連接操作:通過學號產生匹配關系。左連接將以左表為主表,讀取所有數據(學生表中的所有數據都取出)。右表只取學號相同的數據,然后交叉組合;
左聯系SQL語句:
如何連接下圖中的句子,只保留紅色區域
左聯+where句子句子
④右聯結(right join)
右表中的數據全部取出,右0005左表中沒有相應的數據,顯示nulll
右連接的操作:通過學號產生匹配關系,讀取右表的所有數據(取出成績表的所有數據),左表只取學號相同的數據,然后交叉組合并;
SQL語句右聯:
在右聯結的基礎上,去除重疊部分
⑤全聯結(full join)
返回左表和右表的所有行。當一行與另一行數據匹配時,兩行合并。如果沒有匹配線,則填充相應的空值,my sql不支持全聯系;
SQL 總結聯結方式
翻譯成白話,寫出分析思路,寫出相應的sql語句;
問題1:查詢所有學生的學號、姓名、選課數、總分
1)學號、姓名(學生表) student)
2)選課數量(每個學生選課數量:成績表score,按學號分組,計算課程號)
3)總分(每個學生總分:成績表 score,按學號分組,成績求和sum)
問題2:查詢所有平均成績大于85的學生的學號、姓名和平均成績
1)查詢所有學生的學號、姓名和平均成績;學號、姓名(在學生表中);
平均分數(每個學生的平均分數:在分數表中,按學號分組,平均分數:avg(成績));
2)平均成績>85
問題3:查詢學生選課情況:學號、姓名、課程號、課程名稱
1)學號,姓名在學生表上(student)
2)課程編號,課程名稱在課程表中(course)
學生表格與課程表格有關,需要通過成績表建立關系
case whenthen
whenthen
whenthen
...
else
end
1)case表達式的作用
當有多種情況需要判斷時,需要使用case表達式;
它可以幫助我們解決復雜的查詢問題。case表達的功能相當于判斷每一行是否滿足某一條件的條件判斷函數;
如何滿足某一條件,操作后面的then子句,如果不符合條件,繼續操作when子句。如果您沒有找到合適的數據,您將訪問else子句。
2)問題1:
運行順序:
第一步:先操作>=60、滿意后,顯示合格,end;
第二步:運行
switch case用法詳解:
1、switch是“開(kai)關”的意(yi)思,它(ta)也(ye)是一種“選擇”語句,但它(ta)的用法非常(chang)簡單。
2、switch是(shi)多(duo)分支選擇語句。說得通(tong)俗點,多(duo)分支就是(shi)多(duo)個if。
從功(gong)能(neng)上說(shuo),switch語句和if語句完全可以(yi)(yi)相互取代(dai)。但(dan)從編程的(de)角度,它們又各有各的(de)特點,所以(yi)(yi)至今為止也不能(neng)說(shuo)誰(shui)可以(yi)(yi)完全取代(dai)誰(shui)。
3、當嵌套的(de)if比(bi)較(jiao)少時(三個以(yi)內),用(yong)if編(bian)寫程序會(hui)比(bi)較(jiao)簡潔。但是當選(xuan)擇的(de)分支比(bi)較(jiao)多(duo)時,嵌套的(de)if語(yu)(yu)句層(ceng)數就會(hui)很(hen)多(duo),導致(zhi)程序冗長,可讀性(xing)下降。因此C語(yu)(yu)言提供switch語(yu)(yu)句來處理多(duo)分支選(xuan)擇。所以(yi)if和switch可以(yi)說是分工明確(que)的(de)。在很(hen)多(duo)大型的(de)項目中,多(duo)分支選(xuan)擇的(de)情況經常(chang)會(hui)遇(yu)到,所以(yi)switch語(yu)(yu)句用(yong)得還是比(bi)較(jiao)多(duo)的(de)。
4、switch的一般形式如下(xia):
switch(表達式)
{
case常量表達式1:語(yu)句1
case常量表達(da)式(shi)2:語句2
┇
case常量表達(da)式n:語(yu)句n
default:語句n+1
}
擴展資料:
說明:
1)、switch后面(mian)括號內的“表達式”必須(xu)是整數(shu)類型(xing)。也(ye)就是說可以(yi)(yi)是int型(xing)變量、char型(xing)變量,也(ye)可以(yi)(yi)直接是整數(shu)或字符常量,哪怕是負數(shu)都可以(yi)(yi)。但絕對不可以(yi)(yi)是實數(shu),float型(xing)變量、double型(xing)變量、小數(shu)常量通通不行(xing),全部都是語法錯誤。
2)、switch下的case和default必須(xu)用一對大括號{}括起(qi)來(lai)。
3)、當(dang)switch后(hou)面(mian)(mian)括號內“表達式(shi)”的(de)(de)值(zhi)與(yu)某個(ge)case后(hou)面(mian)(mian)的(de)(de)“常量表達式(shi)”的(de)(de)值(zhi)相等時,就(jiu)執行(xing)此(ci)case后(hou)面(mian)(mian)的(de)(de)語(yu)(yu)句(ju)(ju)。執行(xing)完一個(ge)case后(hou)面(mian)(mian)的(de)(de)語(yu)(yu)句(ju)(ju)后(hou),流程控制轉(zhuan)移到(dao)下(xia)一個(ge)case繼續執行(xing)。如(ru)果你只想執行(xing)這(zhe)一個(ge)case語(yu)(yu)句(ju)(ju),不想執行(xing)其(qi)他(ta)case,那么就(jiu)需要在這(zhe)個(ge)case語(yu)(yu)句(ju)(ju)后(hou)面(mian)(mian)加(jia)上break,跳(tiao)出switch語(yu)(yu)句(ju)(ju)。
再(zai)重申一(yi)下:switch是“選擇”語(yu)句(ju),不是“循(xun)(xun)環”語(yu)句(ju)。很多新手看(kan)到break就以為(wei)是循(xun)(xun)環語(yu)句(ju),因為(wei)break一(yi)般給(gei)我們的印象(xiang)都是跳出“循(xun)(xun)環”,但(dan)break還(huan)有一(yi)個(ge)用法,就是跳出switch。
4)、若所(suo)有的(de)(de)(de)case中的(de)(de)(de)常量表(biao)達(da)式的(de)(de)(de)值(zhi)都沒有與(yu)switch后(hou)面(mian)(mian)括(kuo)號內“表(biao)達(da)式”的(de)(de)(de)值(zhi)相等的(de)(de)(de),就執(zhi)行(xing)default后(hou)面(mian)(mian)的(de)(de)(de)語(yu)句(ju),default是“默認”的(de)(de)(de)意思。如(ru)果default是最后(hou)一(yi)條(tiao)語(yu)句(ju)的(de)(de)(de)話(hua),那么(me)其后(hou)就可(ke)以不加break,因(yin)為既然已經是最后(hou)一(yi)句(ju)了,則(ze)執(zhi)行(xing)完后(hou)自然就退出(chu)switch了。
5)、每個case后面“常量表達式”的值必(bi)須互(hu)不(bu)相同,否則(ze)就會(hui)出現(xian)互(hu)相矛盾的現(xian)象,而(er)且這樣寫造成語法(fa)錯誤。
6)、“case常量表達式”只(zhi)是起語句標(biao)(biao)號(hao)的作用,并(bing)不(bu)是在該處進(jin)(jin)行(xing)判斷(duan)。在執行(xing)switch語句時,根據(ju)switch后面表達式的值(zhi)找到匹配(pei)的入口(kou)標(biao)(biao)號(hao),就從此標(biao)(biao)號(hao)開始執行(xing)下去,不(bu)再進(jin)(jin)行(xing)判斷(duan)。
7)、各個(ge)case和(he)default的(de)出現次序不影響(xiang)執行結果。但從閱讀的(de)角度最好是按字(zi)母(mu)或數(shu)字(zi)的(de)順序寫。
8)、當然你也可以(yi)(yi)不要(yao)default語句(ju),就跟(gen)if…else最后(hou)不要(yao)else語句(ju)一樣。但最好是(shi)加上,后(hou)面可以(yi)(yi)什么都(dou)不寫(xie)。這樣可以(yi)(yi)避免別人(ren)誤以(yi)(yi)為你忘了進行default處理,而且可以(yi)(yi)提(ti)醒(xing)別人(ren)switch到此結束(shu)了。
switch (x/1000)
{
case 0:
cout << x << endl;
break;
case 1:
cout << x * 0.9 << endl;
break;
}
說明:
switch語句的執行
1,對switch中的控制表達式進行求值。這里是對x/1000求值,如果0<=x<1000,求值結果為0,如果1000<=x<2000,結果為1
2,根據控制表達式的求值結果,跳轉到相應的case入口,向后執行。注意是向后執行到整個switch語句之外,而不是只執行這一個case中包括的語句。通常只需要執行一個case語句,這需要通過goto,return,break,continue等語句來轉移到switch之外。這里用的是break語句,如果把第一個break去掉,而的范圍又在0-1000之間,這時不但會輸出x,還會執行下一個case語句,輸出 0.9*x。
3,如果控制表達式的求值結果不等于任何的case入口,則會轉移到default語句(如果有的話,沒有就結束了)。比如這里還可以加入一個default語句來處理x<0或x>2000的情況
default:
cout << "你輸入的數據不合法 " << endl;
break;
注意,default,不一定要放在所有的case語句之后,也可以放中間或開始的,但通常都放最后,比較符合習慣,所以如果放最后break可以省略。同理上面程序中的第二個break可以省略,但是這不是一個好的編程習慣,假如你在以后要在程序中加入一個 case 2的話,就很可能會把break可忘了。
其實default可以看成一個特殊的case語句,它的用法和case是一樣,只是它能匹配所有case入口之外的其余情況。
PS: 我所有的(de)回答(da)都是自己手工(gong)輸入,認真回答(da)的(de),不(bu)是胡亂粘貼(tie)的(de)。滿(man)意的(de)話給個最(zui)佳吧(ba)
本文地(di)址://n85e38t.cn/shiershengxiao/72888.html.
聲明: 我(wo)們(men)(men)致(zhi)力于(yu)保護(hu)作(zuo)者版權,注(zhu)重分享,被刊用文(wen)章因無(wu)法核實(shi)真實(shi)出處,未(wei)能及時與(yu)作(zuo)者取得聯(lian)系,或有(you)版權異(yi)議的(de)(de),請(qing)(qing)聯(lian)系管理(li)員,我(wo)們(men)(men)會立(li)即處理(li),本(ben)站部分文(wen)字與(yu)圖片資源(yuan)來自于(yu)網(wang)絡,轉載是(shi)出于(yu)傳(chuan)遞更多(duo)信息之目(mu)的(de)(de),若有(you)來源(yuan)標注(zhu)錯誤或侵犯了您(nin)的(de)(de)合法權益,請(qing)(qing)立(li)即通知我(wo)們(men)(men)(管理(li)員郵箱(xiang):),情況屬實(shi),我(wo)們(men)(men)會第(di)一(yi)時間(jian)予(yu)以刪除,并同時向您(nin)表示歉意,謝(xie)謝(xie)!
上一篇: 十二生肖中(zhong)最(zui)好的(de)婚姻(yin)配(pei)對
下一篇: 男女最佳婚配大全