mysql 从句_MySQL select语句之from从句
http://www.lovestblog.cn,歡迎轉(zhuǎn)載該文,但請(qǐng)注明文章出處,謝謝合作。
mysql的from從句用來(lái)指定參與查詢的表,當(dāng)然也可以是生成的中間表,在表前我們有時(shí)需要指定數(shù)據(jù)庫(kù),這主要是用在我們需要訪問(wèn)當(dāng)前數(shù)據(jù)庫(kù)之外的數(shù)據(jù)庫(kù)中的表的情況,在這中情況下我們采用"."操作符來(lái)進(jìn)行,如userdb.user,其實(shí)userdb為數(shù)據(jù)庫(kù)名,user為表名,這是對(duì)mysql數(shù)據(jù)庫(kù)而言的,對(duì)于DB2和Oracle就不是通過(guò)指定數(shù)據(jù)庫(kù)名了,而是指定sql用戶了,這就是說(shuō)不同sql用戶可以建立相同名字的表,但是同一個(gè)sql用戶只能建立唯一名字的表。這就是它們?cè)谶@表規(guī)范上面的區(qū)別。對(duì)于列規(guī)范,mysql可以在需要查詢的列則可以采用如下形式進(jìn)行訪問(wèn):“數(shù)據(jù)庫(kù)名.表名.列名”。對(duì)于多個(gè)表的規(guī)范,也就是涉及查詢多個(gè)表的情況下,執(zhí)行的過(guò)程是采用笛卡爾積的形式進(jìn)行的。也就是說(shuō)生成的中間表的列數(shù)為兩個(gè)表中列數(shù)的總和,而行的總數(shù)等于一個(gè)表中的行的數(shù)量與另外一個(gè)表中行的數(shù)量的乘積。
對(duì)于from從句中使用假名的情況,比如select u.id,name,age,a.account from utb as u,atb as a where u.id=a.user_id,在我們使用假名之后,那么在該sql語(yǔ)句的任何地方都只能使用假名,不能使用真實(shí)的表名,同時(shí)上面的as關(guān)鍵字也是可以省略的,也就是說(shuō)對(duì)于上面的語(yǔ)句不能用atb來(lái)取代a,utb來(lái)取代u了。雖然from從句不是我們指定的第一條語(yǔ)句,但是絕對(duì)是第一個(gè)被處理的語(yǔ)句,所以在聲明假名前使用假名不會(huì)導(dǎo)致錯(cuò)誤。如果一條from從句引用到兩個(gè)有著相同名稱的表,則必須使用假名。如:
select p.playerno
from players as p,players as par
where par.fn="jp" and par.ln="l" and p.birth_date
對(duì)于多個(gè)表間的連接處理可能會(huì)導(dǎo)致有相同的結(jié)果,即有重復(fù)的結(jié)果,sql并不會(huì)自動(dòng)從最終結(jié)果中刪除重復(fù)的行,這是如果我們不希望在結(jié)果中出現(xiàn)重復(fù)的行,那么我們可以在select后直接指定distinct。如:
select distinct T.playerno
from teams as T,penalties as pen
where T.playerno=pen.playerno。
接下來(lái)說(shuō)說(shuō)連接哈,對(duì)于內(nèi)連接,如果是兩個(gè)表的話,就取兩個(gè)表的一個(gè)交集,如果是左外連接的話,那就是左邊的表全取,右邊沒(méi)有的用null替代,弱國(guó)是右外連接的話,那就是右邊的表全取,左邊沒(méi)有的用null表示。下面看看一個(gè)具體的例子:
--表stu --表exam
id name id grade
1, Jack 1, 56
2, Tom 2, 76
3, Kity 11, 89
4, nono
內(nèi)連接 (顯示兩表id匹配的)
select stu.id,exam.id,stu.name, exam.grade from stu (inner) join exam on stu.id=exam.id
--------------------------------
1 1 Jack 56
2 2 Tom 76
左連接(顯示join 左邊的表的所有數(shù)據(jù),exam只有兩條記錄,所以stu.id,grade 都用NULL 顯示)
select stu.id,exam.id,stu.name, exam.grade from stu left (outer) join exam on stu.id=exam.id
1 1 Jack 56
2 2 Tom 76
3 NULL Kity NULL
4 NULL nono NULL
右連接(與作連接相反,顯示join右邊表的所有數(shù)據(jù))
select stu.id,exam.id,stu.name, exam.grade from stu right join exam on stu.id=exam.id
1 1 Jack 56
2 2 Tom 76
NULL 11 NULL 89
內(nèi)連接取交集,外連接分左和右,
左連接左邊的全取,
右連接右邊的全取
對(duì)于連接的列的名稱相同的話,那么可以使用using來(lái)替代條件,如上面的內(nèi)連接可以這樣改寫(xiě):
select stu.id,exam.id,stu.name, exam.grade from stu inner join exam using(id)。
對(duì)于左外連接使用的情況一般是當(dāng)左表的連接列中存在未出現(xiàn)在右表的連接列中的值時(shí),左外連接才有用。
還有個(gè)全外連接的,也就是說(shuō)只要在兩個(gè)表中出現(xiàn)的記錄都會(huì)在中間表中出現(xiàn),當(dāng)右表有而左表沒(méi)有或當(dāng)左表有而右表沒(méi)有的時(shí)候用null表示。具體語(yǔ)法如下:select stu.id,exam.id,stu.name, exam.grade from stu full join exam using(id)。
交叉連接:就是顯示求表的笛卡爾積,select * from teams cross join penalties.這句完全等價(jià)于select teams.*,penalties.* from teams,penalties.
聯(lián)合連接:select * from teams union join penalties,這個(gè)其實(shí)很容易理解,產(chǎn)生結(jié)果所包含的列為兩個(gè)表所有的列和,對(duì)于數(shù)據(jù)的列出,首先列出左表的數(shù)據(jù),對(duì)于屬于右表的列,用null表示,接下來(lái)列出右表的數(shù)據(jù),對(duì)于屬于左表的列用null表示。
自然連接:select * from teams nature inner join penalties where division='first';此句完全等同于select t.playerno,t.teamno,t.division,pen.paymentno,pen.payment_date,pen.amount from teams as t inner join penalties as pen on t.playerno=pen.playerno where dividion='first'.相比就知道,我們無(wú)須顯示指出必須要連接到哪些列,sql會(huì)自動(dòng)查找兩表中是否有相同名稱的列,且假設(shè)他們必須在連接條件中使用。此處的on或using從句是多余的,因此不允許使用。
下面看個(gè)例子創(chuàng)建一個(gè)稱為towns的虛擬表:
select *
from (select 'Stratford' as town,4 as number
union
select 'Plymouth',6
union
select 'Inglewood',1
union
select 'Douglas',2) as towns
order by town;結(jié)果為:
town number
----------------------
Douglas 2
Inglewood 1
Plymouth 6
Stratford 4
1
頂
0
踩
分享到:
2009-09-24 15:44
瀏覽 2267
分類:數(shù)據(jù)庫(kù)
評(píng)論
總結(jié)
以上是生活随笔為你收集整理的mysql 从句_MySQL select语句之from从句的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网游服务器搭建方案图解(以魔兽世界为例)
- 下一篇: E3--FPGA实现LVDS收发实例和原