資料庫多表查詢之 where和INNER JOIN

2021-08-21 05:40:33 字數 3393 閱讀 1644

select a.id, b.name, b.date

from customers a, sales b where a.id = b.id;

select a.id, b.name, b.date

from customers a inner

join sales b on a.id = b.id;

inner join(內連線,或等值連線):獲取兩個表中字段匹配關係的記錄。

left

join(左連線):獲取左表所有記錄,即使右表沒有對應匹配的記錄。

right

join(右連線): 與 left

join 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄。

我在練習mysql操作語句時,使用一條完全沒有錯誤的語句:

update students set name=

'drake

'where name=

'chuan

';

卻報了如下錯誤:

error code:1175. you are using safe update mode and you tried to

update a table without a where that uses a key

column

to disable safe mode, toggle the option

in preferences -> sql queries and reconnect.

簡單翻譯一下:

你正在使用 安全更新模式(safe upate mode)並且你在嘗試 update 乙個表時 沒有用帶有鍵的列 作為where條件,在首選項中切換選項。

初學者在修改乙個值時可能會用以下語句:

update t set col=

'new_value

'

而這正是很多人常犯的錯誤。因為他沒有限定條件,會將表中所有的記錄都修改一遍。

為了防止這種錯誤出現,我們可以開啟安全更新模式(safe update mode):

set

[global

] sql_safe_updates =

1;

在update操作中:當where條件中列(column)沒有索引可用且無limit限制時會拒絕更新。where條件為常量且無limit限制時會拒絕更新。

在delete操作中: 當①where條件為常量,②或where條件為空,③或where條件中 列(column)沒有索引可用且無limit限制時拒絕刪除。

需要注意的是:

update操作中,where可以為常量  ,where條件中列(column)可以沒有索引。但是需要有limit限制。

然而delete要嚴格一些:where不能為常量,且where條件中列(column)不能沒有索引!

1 .where子句中使用的連線語句,在資料庫語言中,被稱為隱性連線。inner join……on子句產生的連線稱為顯性連線。(其他join引數也是顯性連線)where 和inner join產生的連線關係,沒有本質區別,結果也一樣。但是!隱性連線隨著資料庫語言的規範和發展,已經逐漸被淘汰,比較新的資料庫語言基本上已經拋棄了隱性連線,全部採用顯性連線了。

sql(join on 和where的執行順序)

left join :左連線,返回左表中所有的記錄以及右表中連線字段相等的記錄。

right join :右連線,返回右表中所有的記錄以及左表中連線字段相等的記錄。

inner join: 內連線,又叫等值連線,只返回兩個表中連線字段相等的行。

full join:外連線,返回兩個表中的行:left join + right join。

cross join:結果是笛卡爾積,就是第乙個表的行數乘以第二個表的行數。

關鍵字: on

資料庫在通過連線兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者。

在使用left jion時,on和where條件的區別如下:

1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。

2、where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。

假設有兩張表:

表1:tab2

idsize110

220330

表2:tab2

size

name

10aaa

20bbb

20ccc

兩條sql:

1、select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=』aaa』

2、select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=』aaa』)

第一條sql的過程:

1、中間表

on條件:

tab1.size = tab2.size

tab1.id

tab1.size

tab2.size

tab2.name110

10aaa220

20bbb220

20ccc330

(null)

(null)

2、再對中間表過濾

where 條件:

tab2.name=』aaa』

tab1.id

tab1.size

tab2.size

tab2.name110

10aaa

第二條sql的過程:

1、中間表

on條件:

tab1.size = tab2.size and tab2.name=』aaa』

(條件不為真也會返回左表中的記錄)

tab1.id

tab1.size

tab2.size

tab2.name110

10aaa220

(null)

(null)330

(null)

(null)

其實以上結果的關鍵原因就是left join,right join,full join的特殊性,不管on上的條件是否為真都會返回left或right表中的記錄,full則具有left和right的特性的並集。 而inner jion沒這個特殊性,則條件放在on中和where中,返回的結果集是相同的。

舉個栗子~in

舉個栗子~比較運算子

多表查詢資料庫

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

資料庫多表查詢

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

資料庫多表查詢 子查詢

子查詢 查詢中巢狀查詢,稱巢狀巢狀查詢為子查詢 下面要使用的表如下,放在此處便於更好地理解 emp 員工資訊表 dept 部門表 例 查詢公司員工工資最高的員工資訊 首先要得到公司員工的最高工資的值 select max salary from emp 假設查詢結果為10000然後根據上一句sql語...