A. inner join多表關聯的時候 WHERE語句或JOIN語句中限定條件哪個速度快
inner join 與 在where 添加條件,性能應該差不多
盡量使用Join 而不是Where來列出關聯條件,特別是多個表聯合內的時候。
原因是:容
在效率上,Where可能具有和Inner join一樣的效率。但基本可以肯定的(通過SQLServer幫助和其它資料,以及本測試)是Join的效率不比Where差。
使用Join可以幫助檢查語句中的無效或者誤寫的關聯條件
通常db引擎會將where解析為join ,既然這樣,何不直接使用join
B. SQL里select...where能與inner join 一起用嗎
SQL里select...where能與inner join 可以一起用,解決方法如下:
1、首先創建一個臨時表,用於sqlserver語法中的內INNER JOIN使用。
C. mysql where和 join on 哪個效率高
關於 「A LEFT JOIN B ON 條件表達式」 的一點提醒
ON 條件(「A LEFT JOIN B ON 條件表達式」中的ON)用來決定如何從 B 表中檢索數據行,即使on中包含有A表中的列的限制條件,也不會過濾A的任何數據(A的數據只會通過where過濾)。
如果 B 表中沒有任何一行數據匹配 ON 的條件,將會額外生成一行所有列為 NULL 的數據
在匹配階段 WHERE 子句的條件都不會被使用。僅在匹配階段完成以後,WHERE 子句條件才會被使用。它將從匹配階段產生的數據中檢索過濾。
讓我們看一個 LFET JOIN 示例:
01
mysql> CREATE TABLE `proct`
(
02
`id` int(10)
unsigned NOT NULL auto_increment,
03
`amount` int(10)
unsigned default NULL,
04
PRIMARY KEY (`id`)
05
)
ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
06
07
mysql> CREATE TABLE `proct_details`
(
08
`id` int(10)
unsigned NOT NULL,
09
`weight` int(10)
unsigned default NULL,
10
`exist` int(10)
unsigned default NULL,
11
PRIMARY KEY (`id`)
12
)
ENGINE=MyISAM DEFAULT CHARSET=latin1
13
14
mysql> INSERT INTO proct
(id,amount)
15
VALUES (1,100),(2,200),(3,300),(4,400);
16
Query
OK, 4 rows affected
(0.00 sec)
17
Records:
4 Duplicates: 0 Warnings: 0
18
19
mysql> INSERT INTO proct_details
(id,weight,exist)
20
VALUES (2,22,0),(4,44,1),(5,55,0),(6,66,1);
21
Query
OK, 4 rows affected
(0.00 sec)
22
Records:
4 Duplicates: 0 Warnings: 0
23
24
mysql> SELECT * FROM proct;
25
+----+--------+
26
|
id | amount |
27
+----+--------+
28
|
1 | 100 |
29
|
2 | 200 |
30
|
3 | 300 |
31
|
4 | 400 |
32
+----+--------+
33
4 rows in set (0.00
sec)
34
35
mysql> SELECT * FROM proct_details;
36
+----+--------+-------+
37
|
id | weight | exist |
38
+----+--------+-------+
39
|
2 | 22 | 0 |
40
|
4 | 44 | 1 |
41
|
5 | 55 | 0 |
42
|
6 | 66 | 1 |
43
+----+--------+-------+
44
4 rows in set (0.00
sec)
45
46
mysql> SELECT * FROM proct LEFT JOIN proct_details
47
ON (proct.id
= proct_details.id);
48
+----+--------+------+--------+-------+
49
|
id | amount | id | weight | exist |
50
+----+--------+------+--------+-------+
51
|
1 | 100 | NULL | NULL | NULL |
52
|
2 | 200 | 2 | 22 | 0 |
53
|
3 | 300 | NULL | NULL | NULL |
54
|
4 | 400 | 4 | 44 | 1 |
55
+----+--------+------+--------+-------+
56
4 rows in set (0.00
sec)
ON 子句和 WHERE 子句有什麼不同?
一個問題:下面兩個查詢的結果集有什麼不同么?
1
1. SELECT * FROM proct LEFT JOIN proct_details
2
ON (proct.id
= proct_details.id)
3
AND proct_details.id=2;
4
2. SELECT * FROM proct LEFT JOIN proct_details
5
ON (proct.id
= proct_details.id)
6
WHERE proct_details.id=2;
用例子來理解最好不過了:
01
mysql> SELECT * FROM proct LEFT JOIN proct_details
02
ON (proct.id
= proct_details.id)
03
AND proct_details.id=2;
04
+----+--------+------+--------+-------+
05
|
id | amount | id | weight | exist |
06
+----+--------+------+--------+-------+
07
|
1 | 100 | NULL | NULL | NULL |
08
|
2 | 200 | 2 | 22 | 0 |
09
|
3 | 300 | NULL | NULL | NULL |
10
|
4 | 400 | NULL | NULL | NULL |
11
+----+--------+------+--------+-------+
12
4 rows in set (0.00
sec)
13
14
mysql> SELECT * FROM proct LEFT JOIN proct_details
15
ON (proct.id
= proct_details.id)
16
WHERE proct_details.id=2;
17
+----+--------+----+--------+-------+
18
|
id | amount | id | weight | exist |
D. SQL問題,兩個表聯合查詢篩選條件的問題。
帶有中國的所有記錄(ID=3時,只顯示是中國的一條):
select a.* from a inner join b on a.id=b.aid where b.tagname='中國版'
只有有香港權,所屬ID全都不顯示:
select a.* from a inner join b on a.id=b.aid where b.tagname='中國' and not exists(select 1 from b as c where c.id=a.id and tagname='香港')
E. oracle資料庫中,left join後 where 的使用方法
可以這樣理解:on是在生成連接表時起作用的,where是生成連接表之後對內連接表再進行過濾。
1、容 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。
2、where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。
使用left join時,無論on的條件是否滿足,都會返回左表的所有記錄,對於滿足的條件的記錄,兩個表對應的記錄會連接起來,對於不滿足條件的記錄,那右表欄位全部是null。
F. mysql join中,on和where的區別
關於 「A LEFT JOIN B ON 條件表達式」 的一點提醒
ON 條件(「A LEFT JOIN B ON 條件表達式」中的)用來決定如何從 B 表中檢索數據行,即使on中包含有A表中的列的限制條件,也不會過濾A的任何數據(A的數據只會通過where過濾)。
如果 B 表中沒有任何一行數據匹配 ON 的條件,將會額外生成一行所有列為 NULL 的數據
在匹配階段 WHERE 子句的條件都不會被使用。僅在匹配階段完成以後,WHERE 子句條件才會被使用。它將從匹配階段產生的數據中檢索過濾。
讓我們看一個 LFET JOIN 示例:
01
mysql> CREATE TABLE `proct`
(
02
`id` int(10)
unsigned NOT NULL auto_increment,
03
`amount` int(10)
unsigned default NULL,
04
PRIMARY KEY (`id`)
05
)
ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
06
07
mysql> CREATE TABLE `proct_details`
(
08
`id` int(10)
unsigned NOT NULL,
09
`weight` int(10)
unsigned default NULL,
10
`exist` int(10)
unsigned default NULL,
11
PRIMARY KEY (`id`)
12
)
ENGINE=MyISAM DEFAULT CHARSET=latin1
13
14
mysql> INSERT INTO proct
(id,amount)
15
VALUES (1,100),(2,200),(3,300),(4,400);
16
Query
OK, 4 rows affected
(0.00 sec)
17
Records:
4 Duplicates: 0 Warnings: 0
18
19
mysql> INSERT INTO proct_details
(id,weight,exist)
20
VALUES (2,22,0),(4,44,1),(5,55,0),(6,66,1);
21
Query
OK, 4 rows affected
(0.00 sec)
22
Records:
4 Duplicates: 0 Warnings: 0
23
24
mysql> SELECT * FROM proct;
25
+----+--------+
26
|
id | amount |
27
+----+--------+
28
|
1 | 100 |
29
|
2 | 200 |
30
|
3 | 300 |
31
|
4 | 400 |
32
+----+--------+
33
4 rows in set (0.00
sec)
34
35
mysql> SELECT * FROM proct_details;
36
+----+--------+-------+
37
|
id | weight | exist |
38
+----+--------+-------+
39
|
2 | 22 | 0 |
40
|
4 | 44 | 1 |
41
|
5 | 55 | 0 |
42
|
6 | 66 | 1 |
43
+----+--------+-------+
44
4 rows in set (0.00
sec)
45
46
mysql> SELECT * FROM proct LEFT JOIN proct_details
47
ON (proct.id
= proct_details.id);
48
+----+--------+------+--------+-------+
49
|
id | amount | id | weight | exist |
50
+----+--------+------+--------+-------+
51
|
1 | 100 | NULL | NULL | NULL |
52
|
2 | 200 | 2 | 22 | 0 |
53
|
3 | 300 | NULL | NULL | NULL |
54
|
4 | 400 | 4 | 44 | 1 |
55
+----+--------+------+--------+-------+
56
4 rows in set (0.00
sec)
ON 子句和 WHERE 子句有什麼不同?
一個問題:下面兩個查詢的結果集有什麼不同么?
1
1. SELECT * FROM proct LEFT JOIN proct_details
2
ON (proct.id
= proct_details.id)
3
AND proct_details.id=2;
4
2. SELECT * FROM proct LEFT JOIN proct_details
5
ON (proct.id
= proct_details.id)
6
WHERE proct_details.id=2;
用例子來理解最好不過了:
01
mysql> SELECT * FROM proct LEFT JOIN proct_details
02
ON (proct.id
= proct_details.id)
03
AND proct_details.id=2;
04
+----+--------+------+--------+-------+
05
|
id | amount | id | weight | exist |
06
+----+--------+------+--------+-------+
07
|
1 | 100 | NULL | NULL | NULL |
08
|
2 | 200 | 2 | 22 | 0 |
09
|
3 | 300 | NULL | NULL | NULL |
10
|
4 | 400 | NULL | NULL | NULL |
11
+----+--------+------+--------+-------+
12
4 rows in set (0.00
sec)
13
14
mysql> SELECT * FROM proct LEFT JOIN proct_details
15
ON (proct.id
= proct_details.id)
16
WHERE proct_details.id=2;
17
+----+--------+----+--------+-------+
18
|
id | amount | id | weight | exist |
19
+----+--------+----+--------+-------+
20
|
2 | 200 | 2 | 22 | 0 |
21
+----+--------+----+--------+-------+
22
1
row in set (0.01
sec)
第一條查詢使用 ON 條件決定了從 LEFT JOIN的 proct_details表中檢索符合的所有數據行。
第二條查詢做了簡單的LEFT JOIN,然後使用 WHERE 子句從 LEFT JOIN的數據中過濾掉不符合條件的數據行。
再來看一些示例:
01
mysql>
02
mysql> SELECT * FROM proct LEFT JOIN proct_details
03
ON proct.id
= proct_details.id
04
AND proct.amount=100;
05
+----+--------+------+--------+-------+
06
|
id | amount | id | weight | exist |
07
+----+--------+------+--------+-------+
08
|
1 | 100 | NULL | NULL | NULL |
09
|
2 | 200 | NULL | NULL | NULL |
10
|
3 | 300 | NULL | NULL | NULL |
11
|
4 | 400 | NULL | NULL | NULL |
12
+----+--------+------+--------+-------+
13
4 rows in set (0.00
sec)
所有來自proct表的數據行都被檢索到了,但沒有在proct_details表中匹配到記錄(proct.id = proct_details.id AND proct.amount=100 條件並沒有匹配到任何數據)
01
mysql> SELECT * FROM proct LEFT JOIN proct_details
02
ON (proct.id
= proct_details.id)
03
AND proct.amount=200;
04
+----+--------+------+--------+-------+
05
|
id | amount | id | weight | exist |
06
+----+--------+------+--------+-------+
07
|
1 | 100 | NULL | NULL | NULL |
08
|
2 | 200 | 2 | 22 | 0 |
09
|
3 | 300 | NULL | NULL | NULL |
10
|
4 | 400 | NULL | NULL | NULL |
11
+----+--------+------+--------+-------+
12
4 rows in set (0.01
sec)
同樣,所有來自proct表的數據行都被檢索到了,有一條數據匹配到了。
G. inner join 後面的and條件如果換成where條件查詢效率有什麼區別
and 只是兩表連接的關系,而不能作為查詢條件,where則可以作為查詢條件,實質內上是先去判斷where後面的條容件,只有滿足條件的數據才能和另一張表建立關系。比如a表中有3條數據(1,0)、(2,1),b表中有2條數據1、2。這時你的第一條sql能查出2條數據,即使b表沒有count這個欄位,但第二條sql就只能查出一條數據了,因為在a表中count大於0的只有ID為2的這條數據,然後通過on後面的關系就只能查出一條了
H. 表連接用where和join的區別是什麼
區別來還是有的:(如自下)
1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。
2、where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。
I. 在join中加條件和where中條件的區別
on 是連接條件。
where 是取連接之後的記錄的條件。
對於 left join、right join ,on 條件與 where 條件還是有區別的,舉個例子版:
表 a:
id v
----
1 a1
2 a2
3 a3
4 a4
5 a5
表 b:
id v
----
1 b1
2 b2
3 b3
4 b4
5 b5
SQL 語句權
SELECT *
FROM a LEFT JOIN b ON a.id=b.id
AND a.id=1 AND b.id=2
結果
1 a1 NULL NULL
2 a2 NULL NULL
3 a3 NULL NULL
4 a4 NULL NULL
5 a5 NULL NULL
而如果我們把 a.id=1 AND b.id=2 寫在 where 中,那麼結果就是零條記錄
J. left join 過濾條件寫在on後面和寫在where 後面的區別
left join 過濾條件原文如下:
create table t1(id int, feild int);
insert into t1 values(1 , 1);
insert into t1 values(1 , 2);
insert into t1 values(1 , 3);
insert into t1 values(1 , 4);
insert into t1 values(2 , 1);
insert into t1 values(2 , 2);
create table t2(id int, feild int);
insert into t2 values(1 , 1);
insert into t2 values(1 , 2);
insert into t2 values(1 , 5);
insert into t2 values(1 , 6);
insert into t2 values(2 , 1);
insert into t2 values(2 , 3);
select t1.*,t2.* from t1 left join t2 on t1.id=t2.id --取t1表的第一行,掃瞄表,按條件做對比,如果滿足條件,就加入返回結果表.
然後取t1表的第二行,掃瞄t2表,按條件做對比,如果滿足條件,就加入返回結果表.
重復以上過程,直到t1表掃描結束.
select t1.*,t2.* from t1 left join t2 on t1.id=t2.id and t1.feild=1 --給左表加條件的時候,左表滿足條件的,按上面的過程返回值,左表不滿足條件的,直接輸出,右表的列補null
1 1 1 1
1 1 1 2
1 1 1 5
1 1 1 6
2 1 2 1
2 1 2 3
1 2 NULL NULL
1 3 NULL NULL
1 4 NULL NULL
2 2 NULL NULL
select t1.*,t2.* from t1 left join t2 on t1.id=t2.id where t1.feild=1 先執行where後連接查詢
執行where後表為 1 , 1
2 , 1
用它來left join t2.