多表查詢:從多表中獲取數(shù)據(jù);
兩個(gè)表的結(jié)構(gòu)是一樣的,但是紅框的數(shù)據(jù)是不同的。利用表的加法將兩個(gè)表合并成一個(gè)表;
表的加法(union)根據(jù)行合并兩個(gè)表的數(shù)據(jù),刪除重復(fù)數(shù)據(jù);
要保留重復(fù)數(shù)據(jù),請(qǐng)使用union all
1)什么是聯(lián)結(jié)?
關(guān)系是數(shù)據(jù)庫(kù)可以對(duì)應(yīng)的匹配,在關(guān)系數(shù)據(jù)庫(kù)中稱為連接(join);
連接是通過表與表之間的關(guān)系將表合并在一起的操作;
學(xué)生表-成績(jī)表 通過學(xué)號(hào)連接;成績(jī)表-課程表 通過課程號(hào)連接;課程表-教師表 通過教師號(hào)聯(lián)系;
2)常見的連接方式
①交叉連接(笛卡爾積)
將表中的每一行與另一行合并;
如圖:表1、表2、表3分別和A、B合并在一起;
新表行數(shù)=表1行數(shù)*表2行數(shù)。
在實(shí)際工作中使用的交叉聯(lián)系較少,結(jié)果行數(shù)過多,需要大量的運(yùn)算成本和設(shè)備的支持,
而且行數(shù)過多,實(shí)際價(jià)值有限;
但是,交叉連接是后面所有連接的基礎(chǔ),其他連接是在交叉連接的基礎(chǔ)上+過濾條件。
②內(nèi)聯(lián)結(jié)(inner join)
兩張表中的數(shù)據(jù)同時(shí)存在于搜索中
內(nèi)部聯(lián)系的操作:從學(xué)生表和成績(jī)表中取出合格的行 → 交叉聯(lián)結(jié);
內(nèi)聯(lián)SQL語(yǔ)句:
③左聯(lián)結(jié)(left join)
找出表中左側(cè)的所有數(shù)據(jù),左連接是下圖中的紅色部分;
左連接操作:通過學(xué)號(hào)產(chǎn)生匹配關(guān)系。左連接將以左表為主表,讀取所有數(shù)據(jù)(學(xué)生表中的所有數(shù)據(jù)都取出)。右表只取學(xué)號(hào)相同的數(shù)據(jù),然后交叉組合;
左聯(lián)系SQL語(yǔ)句:
如何連接下圖中的句子,只保留紅色區(qū)域
左聯(lián)+where句子句子
④右聯(lián)結(jié)(right join)
右表中的數(shù)據(jù)全部取出,右0005左表中沒有相應(yīng)的數(shù)據(jù),顯示nulll
右連接的操作:通過學(xué)號(hào)產(chǎn)生匹配關(guān)系,讀取右表的所有數(shù)據(jù)(取出成績(jī)表的所有數(shù)據(jù)),左表只取學(xué)號(hào)相同的數(shù)據(jù),然后交叉組合并;
SQL語(yǔ)句右聯(lián):
在右聯(lián)結(jié)的基礎(chǔ)上,去除重疊部分
⑤全聯(lián)結(jié)(full join)
返回左表和右表的所有行。當(dāng)一行與另一行數(shù)據(jù)匹配時(shí),兩行合并。如果沒有匹配線,則填充相應(yīng)的空值,my sql不支持全聯(lián)系;
SQL 總結(jié)聯(lián)結(jié)方式
翻譯成白話,寫出分析思路,寫出相應(yīng)的sql語(yǔ)句;
問題1:查詢所有學(xué)生的學(xué)號(hào)、姓名、選課數(shù)、總分
1)學(xué)號(hào)、姓名(學(xué)生表) student)
2)選課數(shù)量(每個(gè)學(xué)生選課數(shù)量:成績(jī)表score,按學(xué)號(hào)分組,計(jì)算課程號(hào))
3)總分(每個(gè)學(xué)生總分:成績(jī)表 score,按學(xué)號(hào)分組,成績(jī)求和sum)
問題2:查詢所有平均成績(jī)大于85的學(xué)生的學(xué)號(hào)、姓名和平均成績(jī)
1)查詢所有學(xué)生的學(xué)號(hào)、姓名和平均成績(jī);學(xué)號(hào)、姓名(在學(xué)生表中);
平均分?jǐn)?shù)(每個(gè)學(xué)生的平均分?jǐn)?shù):在分?jǐn)?shù)表中,按學(xué)號(hào)分組,平均分?jǐn)?shù):avg(成績(jī)));
2)平均成績(jī)>85
問題3:查詢學(xué)生選課情況:學(xué)號(hào)、姓名、課程號(hào)、課程名稱
1)學(xué)號(hào),姓名在學(xué)生表上(student)
2)課程編號(hào),課程名稱在課程表中(course)
學(xué)生表格與課程表格有關(guān),需要通過成績(jī)表建立關(guān)系
case whenthen
whenthen
whenthen
...
else
end
1)case表達(dá)式的作用
當(dāng)有多種情況需要判斷時(shí),需要使用case表達(dá)式;
它可以幫助我們解決復(fù)雜的查詢問題。case表達(dá)的功能相當(dāng)于判斷每一行是否滿足某一條件的條件判斷函數(shù);
如何滿足某一條件,操作后面的then子句,如果不符合條件,繼續(xù)操作when子句。如果您沒有找到合適的數(shù)據(jù),您將訪問else子句。
2)問題1:
運(yùn)行順序:
第一步:先操作>=60、滿意后,顯示合格,end;
第二步:運(yùn)行
switch case用法詳解:
1、switch是“開關(guān)”的意思,它也是一種“選擇”語(yǔ)句,但它的用法非常簡(jiǎn)單。
2、switch是多分支選擇語(yǔ)句。說得通俗點(diǎn),多分支就是多個(gè)if。
從功能上說,switch語(yǔ)句和if語(yǔ)句完全可以相互取代。但從編程的角度,它們又各有各的特點(diǎn),所以至今為止也不能說誰可以完全取代誰。
3、當(dāng)嵌套的if比較少時(shí)(三個(gè)以內(nèi)),用if編寫程序會(huì)比較簡(jiǎn)潔。但是當(dāng)選擇的分支比較多時(shí),嵌套的if語(yǔ)句層數(shù)就會(huì)很多,導(dǎo)致程序冗長(zhǎng),可讀性下降。因此C語(yǔ)言提供switch語(yǔ)句來處理多分支選擇。所以if和switch可以說是分工明確的。在很多大型的項(xiàng)目中,多分支選擇的情況經(jīng)常會(huì)遇到,所以switch語(yǔ)句用得還是比較多的。
4、switch的一般形式如下:
switch(表達(dá)式)
{
case常量表達(dá)式1:語(yǔ)句1
case常量表達(dá)式2:語(yǔ)句2
┇
case常量表達(dá)式n:語(yǔ)句n
default:語(yǔ)句n+1
}
擴(kuò)展資料:
說明:
1)、switch后面括號(hào)內(nèi)的“表達(dá)式”必須是整數(shù)類型。也就是說可以是int型變量、char型變量,也可以直接是整數(shù)或字符常量,哪怕是負(fù)數(shù)都可以。但絕對(duì)不可以是實(shí)數(shù),float型變量、double型變量、小數(shù)常量通通不行,全部都是語(yǔ)法錯(cuò)誤。
2)、switch下的case和default必須用一對(duì)大括號(hào){}括起來。
3)、當(dāng)switch后面括號(hào)內(nèi)“表達(dá)式”的值與某個(gè)case后面的“常量表達(dá)式”的值相等時(shí),就執(zhí)行此case后面的語(yǔ)句。執(zhí)行完一個(gè)case后面的語(yǔ)句后,流程控制轉(zhuǎn)移到下一個(gè)case繼續(xù)執(zhí)行。如果你只想執(zhí)行這一個(gè)case語(yǔ)句,不想執(zhí)行其他case,那么就需要在這個(gè)case語(yǔ)句后面加上break,跳出switch語(yǔ)句。
再重申一下:switch是“選擇”語(yǔ)句,不是“循環(huán)”語(yǔ)句。很多新手看到break就以為是循環(huán)語(yǔ)句,因?yàn)閎reak一般給我們的印象都是跳出“循環(huán)”,但break還有一個(gè)用法,就是跳出switch。
4)、若所有的case中的常量表達(dá)式的值都沒有與switch后面括號(hào)內(nèi)“表達(dá)式”的值相等的,就執(zhí)行default后面的語(yǔ)句,default是“默認(rèn)”的意思。如果default是最后一條語(yǔ)句的話,那么其后就可以不加break,因?yàn)榧热灰呀?jīng)是最后一句了,則執(zhí)行完后自然就退出switch了。
5)、每個(gè)case后面“常量表達(dá)式”的值必須互不相同,否則就會(huì)出現(xiàn)互相矛盾的現(xiàn)象,而且這樣寫造成語(yǔ)法錯(cuò)誤。
6)、“case常量表達(dá)式”只是起語(yǔ)句標(biāo)號(hào)的作用,并不是在該處進(jìn)行判斷。在執(zhí)行switch語(yǔ)句時(shí),根據(jù)switch后面表達(dá)式的值找到匹配的入口標(biāo)號(hào),就從此標(biāo)號(hào)開始執(zhí)行下去,不再進(jìn)行判斷。
7)、各個(gè)case和default的出現(xiàn)次序不影響執(zhí)行結(jié)果。但從閱讀的角度最好是按字母或數(shù)字的順序?qū)憽?/p>
8)、當(dāng)然你也可以不要default語(yǔ)句,就跟if…else最后不要else語(yǔ)句一樣。但最好是加上,后面可以什么都不寫。這樣可以避免別人誤以為你忘了進(jìn)行default處理,而且可以提醒別人switch到此結(jié)束了。
switch (x/1000)
{
case 0:
cout << x << endl;
break;
case 1:
cout << x * 0.9 << endl;
break;
}
說明:
switch語(yǔ)句的執(zhí)行
1,對(duì)switch中的控制表達(dá)式進(jìn)行求值。這里是對(duì)x/1000求值,如果0<=x<1000,求值結(jié)果為0,如果1000<=x<2000,結(jié)果為1
2,根據(jù)控制表達(dá)式的求值結(jié)果,跳轉(zhuǎn)到相應(yīng)的case入口,向后執(zhí)行。注意是向后執(zhí)行到整個(gè)switch語(yǔ)句之外,而不是只執(zhí)行這一個(gè)case中包括的語(yǔ)句。通常只需要執(zhí)行一個(gè)case語(yǔ)句,這需要通過goto,return,break,continue等語(yǔ)句來轉(zhuǎn)移到switch之外。這里用的是break語(yǔ)句,如果把第一個(gè)break去掉,而的范圍又在0-1000之間,這時(shí)不但會(huì)輸出x,還會(huì)執(zhí)行下一個(gè)case語(yǔ)句,輸出 0.9*x。
3,如果控制表達(dá)式的求值結(jié)果不等于任何的case入口,則會(huì)轉(zhuǎn)移到default語(yǔ)句(如果有的話,沒有就結(jié)束了)。比如這里還可以加入一個(gè)default語(yǔ)句來處理x<0或x>2000的情況
default:
cout << "你輸入的數(shù)據(jù)不合法 " << endl;
break;
注意,default,不一定要放在所有的case語(yǔ)句之后,也可以放中間或開始的,但通常都放最后,比較符合習(xí)慣,所以如果放最后break可以省略。同理上面程序中的第二個(gè)break可以省略,但是這不是一個(gè)好的編程習(xí)慣,假如你在以后要在程序中加入一個(gè) case 2的話,就很可能會(huì)把break可忘了。
其實(shí)default可以看成一個(gè)特殊的case語(yǔ)句,它的用法和case是一樣,只是它能匹配所有case入口之外的其余情況。
PS: 我所有的回答都是自己手工輸入,認(rèn)真回答的,不是胡亂粘貼的。滿意的話給個(gè)最佳吧
本文地址:http://www.soujuw.cn/shiershengxiao/72888.html.
聲明: 我們致力于保護(hù)作者版權(quán),注重分享,被刊用文章因無法核實(shí)真實(shí)出處,未能及時(shí)與作者取得聯(lián)系,或有版權(quán)異議的,請(qǐng)聯(lián)系管理員,我們會(huì)立即處理,本站部分文字與圖片資源來自于網(wǎng)絡(luò),轉(zhuǎn)載是出于傳遞更多信息之目的,若有來源標(biāo)注錯(cuò)誤或侵犯了您的合法權(quán)益,請(qǐng)立即通知我們(管理員郵箱:602607956@qq.com),情況屬實(shí),我們會(huì)第一時(shí)間予以刪除,并同時(shí)向您表示歉意,謝謝!
上一篇: 十二生肖中最好的婚姻配對(duì)
下一篇: 男女最佳婚配大全