資料庫操作 多表查詢

2022-04-05 03:12:31 字數 4115 閱讀 3917

一 關鍵字 

join 多表建立交叉連線 cross join。

on  關鍵字 後面跟篩選條件。

二 分類

內連線 inner jion

外連線 left / right join

全連線  union

三 子查詢

子查詢就是select語句巢狀select語句,可以理解為子查詢是一張表

子查詢是將乙個查詢語句巢狀在另乙個查詢語句中。

內層查詢語句的查詢結果,可以為外層查詢語句提供查詢條件。

子查詢可以分為四類,標量子查詢,行查詢,列查詢,表查詢。(當然好像還有其他分類方法)。

標量查詢

select max(height) from students; -- select max(height) from students 185

乙個值select * from students where height = (select max(height) from

students);

列查詢select classes.name from classes where classes.id in (select cls_id from students);--執行效率低 結構分明;

行查詢--行級子查詢, 一行多列 要完成行級子查詢, 需要先構建行元素

#查詢班級年齡最大 身高最高的學生 不一定能查詢出來

select * from students where (age,height) = (select max(age),max(height) from

students);

表查詢--表級子查詢 查詢的結果是多行多列, 充當資料來源,需要講查詢的臨時結果集取別名才能夠使用

select stu.height from (select * from students) as stu;

格式:=select()

in select()

exist select()

作用:某些情況下,當進行查詢的時候,需要的條件是另外乙個select 語句的結果,這個時候,就要用到子查詢。

定義:為了給主查詢(外部查詢)提供資料而首先執行的查詢(內部查詢)被叫做子查詢。也就是說,先執行子查詢,根據子查詢的結果,再執行主查詢。

關鍵字:用於子查詢的關鍵字主要包括 in、not in、exist、not exist、=、<>等(符號「<>」的意思是:不等於)。

備註:mysql從4.1開始才支援sql的子查詢。一般說子查詢的效率低於連線查詢(因為子查詢至少需要查詢兩次,即至少兩個select語句。子查詢巢狀也多,效能越低)。表連線都可以用子查詢替換,但反過來說卻不一定。

left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄 

right join(右聯接) 返回包括右表中的所有記錄和左表中聯結字段相等的記錄

inner join(等值連線) 只返回兩個表中聯結字段相等的行

舉例如下: 

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

表a記錄如下:

aid     anum

1     a20050111

2     a20050112

3     a20050113

4     a20050114

5     a20050115

表b記錄如下:

bid     bname

1     2006032401

2     2006032402

3     2006032403

4     2006032404

8     2006032408

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

1.left join

sql語句如下: 

select * from a

left join b 

on a.aid = b.bid

結果如下:

aid     anum     bid     bname

1     a20050111    1     2006032401

2     a20050112    2     2006032402

3     a20050113    3     2006032403

4     a20050114    4     2006032404

5     a20050115    null     null

(所影響的行數為 5 行)

結果說明:

left join是以a表的記錄為基礎的,a可以看成左表,b可以看成右表,left join是以左表為準的.

換句話說,左表(a)的記錄將會全部表示出來,而右表(b)只會顯示符合搜尋條件的記錄(例子中為: a.aid = b.bid).

b表記錄不足的地方均為null.

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

2.right join

sql語句如下: 

select * from a

right join b 

on a.aid = b.bid

結果如下:

aid     anum     bid     bname

1     a20050111    1     2006032401

2     a20050112    2     2006032402

3     a20050113    3     2006032403

4     a20050114    4     2006032404

null     null     8     2006032408

(所影響的行數為 5 行)

結果說明:

仔細觀察一下,就會發現,和left join的結果剛好相反,這次是以右表(b)為基礎的,a表不足的地方用null填充.

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

3.inner join

sql語句如下: 

select * from a

innerjoin b 

on a.aid = b.bid

結果如下:

aid     anum     bid     bname

1     a20050111    1     2006032401

2     a20050112    2     2006032402

3     a20050113    3     2006032403

4     a20050114    4     2006032404

結果說明:

很明顯,這裡只顯示出了 a.aid = b.bid的記錄.這說明inner join並不以誰為基礎,它只顯示符合條件的記錄.

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

注: left join操作用於在任何的 from 子句中,組合**表的記錄。使用 left join 運算來建立乙個左邊外部聯接。左邊外部聯接將包含了從第乙個(左邊)開始的兩個表中的全部記錄,即使在第二個(右邊)表中並沒有相符值的記錄。

語法:from table1 left join table2 on table1.field1 compopr table2.field2

說明:table1, table2引數用於指定要將記錄組合的表的名稱。

field1, field2引數指定被聯接的字段的名稱。且這些字段必須有相同的資料型別及包含相同型別的資料,但它們不需要有相同的名稱。

compopr引數指定關係比較運算子:"=", "<", ">", "<=", ">=" 或 "<>"。

如果在inner join操作中要聯接包含memo 資料型別或 ole object 資料型別資料的字段,將會發生錯誤. 

MYSQL資料庫操作 多表操作

將多張表連在一起進行查詢。通過兩個表共有的列去進行拼接。多表連線,首先要在表之間建立連線。連線查詢一共分為以下幾類 交叉連線 內連線外連線 自然連線 將一張表的資料與另外一張表中的資料彼此交叉。也就是說把一張表中的每一行逐個與另一張表去進行匹配。沒有任何連線條件,所有的記錄都會被保留。select ...

多表查詢資料庫

在專案中建立資料庫的時候,我們經常會進行多表查詢。資料庫中建立乙個表應該與乙個實體類相對應。乙個實體物件應該與一條記錄相對應。資料庫是一種結構化的查詢語言,資料庫語言是非過程化的,寫一句就可以執行一句。進行建表的時候,如果是一對多的關係,應該在多的一方建立乙個字段。該字段為少的一方的id。進行建表的...

資料庫多表查詢

笛卡爾積 select from emp,dept select from emp cross join dept 內連線 inner join 內連線把兩個表連線成乙個表 稱為第三個表 在這個表中僅包含那些滿足連線條件的記錄行 select from emp,dept where emp.dept...