MySQL select語句之from從句

2021-08-30 05:40:58 字數 3728 閱讀 3751

mysql的from從句用來指定參與查詢的表,當然也可以是生成的中間表,在表前我們有時需要指定資料庫,這主要是用在我們需要訪問當前資料庫之外的資料庫中的表的情況,在這中情況下我們採用"."操作符來進行,如userdb.user,其實userdb為資料庫名,user為表名,這是對mysql資料庫而言的,對於db2和oracle就不是通過指定資料庫名了,而是指定sql使用者了,這就是說不同sql使用者可以建立相同名字的表,但是同乙個sql使用者只能建立唯一名字的表。這就是它們在這錶規範上面的區別。對於列規範,mysql可以在需要查詢的列則可以採用如下形式進行訪問:「資料庫名.表名.列名」。對於多個表的規範,也就是涉及查詢多個表的情況下,執行的過程是採用笛卡爾積的形式進行的。也就是說生成的中間表的列數為兩個表中列數的總和,而行的總數等於乙個表中的行的數量與另外乙個表中行的數量的乘積。

對於from從句中使用假名的情況,比如select u.id,name,age,a.account from utb as u,atb as a where u.id=a.user_id,在我們使用假名之後,那麼在該sql語句的任何地方都只能使用假名,不能使用真實的表名,同時上面的as關鍵字也是可以省略的,也就是說對於上面的語句不能用atb來取代a,utb來取代u了。雖然from從句不是我們指定的第一條語句,但是絕對是第乙個被處理的語句,所以在宣告假名前使用假名不會導致錯誤。如果一條from從句引用到兩個有著相同名稱的表,則必須使用假名。如:

select p.playerno

from players as p,players as par

where par.fn="jp" and par.ln="l" and p.birth_date

對於多個表間的連線處理可能會導致有相同的結果,即有重複的結果,sql並不會自動從最終結果中刪除重複的行,這是如果我們不希望在結果中出現重複的行,那麼我們可以在select後直接指定distinct。如:

select distinct t.playerno 

from teams as t,penalties as pen

where t.playerno=pen.playerno。

接下來說說連線哈,對於內連線,如果是兩個表的話,就取兩個表的乙個交集,如果是左外連線的話,那就是左邊的表全取,右邊沒有的用null替代,弱國是右外連線的話,那就是右邊的表全取,左邊沒有的用null表示。下面看看乙個具體的例子:

--表stu        --表exam 

id name id grade

1, jack 1, 56

2, tom 2, 76

3, kity 11, 89

4, nono

內連線 (顯示兩表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 左邊的表的所有資料,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右邊表的所有資料)

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

內連線取交集,外連線分左和右,

左連線左邊的全取,

右連線右邊的全取

對於連線的列的名稱相同的話,那麼可以使用using來替代條件,如上面的內連線可以這樣改寫:

select stu.id,exam.id,stu.name, exam.grade from stu inner join exam using(id)。

對於左外連線使用的情況一般是當左表的連線列中存在未出現在右表的連線列中的值時,左外連線才有用。

還有個全外連線的,也就是說只要在兩個表中出現的記錄都會在中間表中出現,當右表有而左表沒有或當左表有而右表沒有的時候用null表示。具體語法如下:select stu.id,exam.id,stu.name, exam.grade from stu full join exam using(id)。

交叉連線:就是顯示求表的笛卡爾積,select * from teams cross join penalties.這句完全等價於select teams.*,penalties.* from teams,penalties.

聯合連線:select * from teams union join penalties,這個其實很容易理解,產生結果所包含的列為兩個表所有的列和,對於資料的列出,首先列出左表的資料,對於屬於右表的列,用null表示,接下來列出右表的資料,對於屬於左表的列用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'.
相比就知道,我們無須顯示指出必須要連線到哪些列,sql會自動查詢兩表中是否有相同名稱的列,且假設他們必須在連線條件中使用。此處的on或using從句是多餘的,因此不允許使用。

下面看個例子建立乙個稱為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;

結果為:

town             number

----------------------

douglas 2

inglewood 1

plymouth 6

stratford 4

Mysql Select 語句中實現的判斷

select if sva 1,男 女 as ssva from tableame where id 1 quote 控制流程函式 case value when compare value then result when compare value then result else result...

Mysql Select 語句中實現的判斷

select if sva 1,男 女 as ssva from tableame where id 1 quote 控制流程函式 case value when compare value then result when compare value then result else result...

Mysql Select 語句中實現的判斷

select if sva 1,男 女 as ssva from tableame where id 1 quote 控制流程函式 case value when compare value then result when compare value then result else result...