; MySQLは唯一の後にのみ4.0、それはそう、連合(連合)集合演算をサポートし ますが、交差点交差、除きセットの違いのために、それは真実ではありません。 、解決するために少量のデータをすることができますが、非常に低い効率で大量のデータではなく、使用中の一般的なソリューションを提供します。 実際には、もちろん、方法ではありませんが、他の2つの操作を達成するために連合を使用することができます。 差が設定除き: SELECT ID FROM( SELECT DISTINCT AS ID A.AID A TABLE_A FROM UNION ALLは、 AS IDがBからtable_b DISTINCT B.BID SELECT TEMP HAVING COUNTのID(ID)BY GROUP 1 =)。 交差の交差点: SELECT ID FROM( SELECTをAS ID A.AIDはTABLE_A区別A UNION ALLは、 AS IDがBからtable_b DISTINCT B.BID SELECT TEMP)を有するCOUNTのID(ID)= 2でグループが 、しかし、上記の方法の機能は、制限されている IDを調べるために使用することができますAではない、表Bが存在する、 または1つのテーブルB Aにのみ存在 チェックがテーブルのIDに複数回行われません。 また、セットの間の差が点を有し、全く存在していません。
2. http://hi.baidu.com/truetruelove/blog/item/f0fda8441bf22048510ffeba.html
1。二つのテーブルの差集合を検索、書籍テーブルをewb_t_books、ewb_t_title本の分類はbt_titleid(NOT NULL)を介して接続されています。 分類は本の中で存在していない見つける ないでAサブクエリ。 #explain拡張 bt_titleid、SELECT book_idを bのewb_t_books FROM IN(SELECTがewb_t_title FROM bt_titleid)NOT bt_titleid WHERE #show表し警告; 。Bは、サブクエリがないEXISTS #explain拡張 、SELECT book_idをbt_titleid B FROM ewb_t_books NOTが存在する場合(ewb_t_title SELECT * FROM A = WHERE b.bt_titleid a.bt_titleid)を 、表す警告#show 。右テーブルCは、左連結NULLの決定 拡張#explain SELECT book_idは、bt_titleid ewb_t_booksから左に(ewb_t_title USING BをJOIN bt_titleid) WHERE ISNULL(b.bt_titleid) #show表す警告。 概要:簡単なテストは、最も遅いで、他の2つは同じ株を持っていない、検証します。 従業員の給与どこ<> SELECT * FROM ; 3000 :このクエリのために、あなたは、NOTを使用しないように書き換えることができ 、従業員からのSELECT *給与<3000または給与> 3000; 両方のクエリの結果が、しかし、第二の問い合わせプログラムの意志最初のクエリプランよりも速いです。2番目のクエリは、データベースが給与列インデックスを使用できるように、最初のクエリは、インデックスを使用できません
; MySQLは唯一の後にのみ4.0、それはそう、連合(連合)集合演算をサポートし ますが、交差点交差、除きセットの違いのために、それは真実ではありません。 、解決するために少量のデータをすることができますが、非常に低い効率で大量のデータではなく、使用中の一般的なソリューションを提供します。 実際には、もちろん、方法ではありませんが、他の2つの操作を達成するために連合を使用することができます。 差が設定除き: SELECT ID FROM( SELECT DISTINCT AS ID A.AID A TABLE_A FROM UNION ALLは、 AS IDがBからtable_b DISTINCT B.BID SELECT TEMP HAVING COUNTのID(ID)BY GROUP 1 =)。 交差の交差点: SELECT ID FROM( SELECTをAS ID A.AIDはTABLE_A区別A UNION ALLは、 AS IDがBからtable_b DISTINCT B.BID SELECT TEMP)を有するCOUNTのID(ID)= 2でグループが 、しかし、上記の方法の機能は、制限されている IDを調べるために使用することができますAではない、表Bが存在する、 または1つのテーブルB Aにのみ存在 チェックがテーブルのIDに複数回行われません。 また、セットの間の差が点を有し、全く存在していません。
2. http://hi.baidu.com/truetruelove/blog/item/f0fda8441bf22048510ffeba.html
1。二つのテーブルの差集合を検索、書籍テーブルをewb_t_books、ewb_t_title本の分類はbt_titleid(NOT NULL)を介して接続されています。 分類は本の中で存在していない見つける ないでAサブクエリ。 #explain拡張 bt_titleid、SELECT book_idを bのewb_t_books FROM IN(SELECTがewb_t_title FROM bt_titleid)NOT bt_titleid WHERE #show表し警告; 。Bは、サブクエリがないEXISTS #explain拡張 、SELECT book_idをbt_titleid B FROM ewb_t_books NOTが存在する場合(ewb_t_title SELECT * FROM A = WHERE b.bt_titleid a.bt_titleid)を 、表す警告#show 。右テーブルCは、左連結NULLの決定 拡張#explain SELECT book_idは、bt_titleid ewb_t_booksから左に(ewb_t_title USING BをJOIN bt_titleid) WHERE ISNULL(b.bt_titleid) #show表す警告。 概要:簡単なテストは、最も遅いで、他の2つは同じ株を持っていない、検証します。 従業員の給与どこ<> SELECT * FROM ; 3000 :このクエリのために、あなたは、NOTを使用しないように書き換えることができ 、従業員からのSELECT *給与<3000または給与> 3000; 両方のクエリの結果が、しかし、第二の問い合わせプログラムの意志最初のクエリプランよりも速いです。2番目のクエリは、データベースが給与列インデックスを使用できるように、最初のクエリは、インデックスを使用できません