Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  ANY、IN、または SOME を使用したサブクエリー

13.2.10.3 ANY、IN、または SOME を使用したサブクエリー

構文:

operand comparison_operator ANY (subquery)
operand IN (subquery)
operand comparison_operator SOME (subquery)

ここで、comparison_operator は次の演算子のいずれかです。

=  >  <  >=  <=  <>  !=

ANY キーワード (これは比較演算子のあとに指定する必要があります) は、このサブクエリーが返すカラム内の値の ANY (いずれか) に対して比較が TRUE である場合は TRUE を返すことを示します。例:

SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);

テーブル t1 内に (10) を含む行が存在するとします。テーブル t2(21,14,7) が含まれている場合、t2 には 10 より小さい値 7 が存在するため、この式は TRUE です。テーブル t2(20,10) が含まれている場合、またはテーブル t2 が空である場合、この式は FALSE です。テーブル t2(NULL,NULL,NULL) が含まれている場合、この式は不明 (つまり、NULL) です。

サブクエリーで使用されている場合、ワード IN= ANY のエイリアスです。そのため、次の 2 つのステートメントは同じです。

SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 IN    (SELECT s1 FROM t2);

式リストで使用されている場合、IN= ANY はシノニムではありません。IN は式リストを取得できますが、= ANY はできません。セクション12.3.2「比較関数と演算子」を参照してください。

NOT IN<> ANY ではなく、<> ALL のエイリアスです。セクション13.2.10.4「ALL を使用したサブクエリー」を参照してください。

ワード SOMEANY のエイリアスです。そのため、次の 2 つのステートメントは同じです。

SELECT s1 FROM t1 WHERE s1 <> ANY  (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 <> SOME (SELECT s1 FROM t2);

ワード SOME はほとんど使用されませんが、この例は、これがなぜ役立つ可能性があるかを示しています。ほとんどの人びとにとって、a is not equal to any b(a はどの b にも等しくない) という英語のフレーズはthere is no b which is equal to a(a に等しい b は存在しない) を示しますが、それはこの SQL 構文が示す内容とは異なります。この構文は、there is some b to which a is not equal(a に等しくない b がいくつか存在する) を示します。代わりに <> SOME を使用すると、このクエリーの本当の意味がすべての人に理解されるようにするのに役立ちます。


User Comments
  Posted by anonymous on September 2, 2004
SELECT s1 FROM t1 WHERE s1 <> SOME (SELECT s1 FROM t2); example:
if there is a row containing (10) in table t1, the expression is true if table t2 contains (20,10) because 10 is not equal to one or more (i.e., some) of t2's values, namely the 20.

A NOT IN condition, otoh, would be false. NOT IN is always going to be at least as hard to satisfy (as <> SOME) because to be true /all/ rows have to be non-equal.
  Posted by sukasom chaiyakul on April 8, 2005
# table paper, contains the record of each research paper
CREATE TABLE paper
(
paperid INTEGER NOT NULL AUTO_INCREMENT,
title varchar(256) not null,
PRIMARY KEY(paperid)
)

# One paper can have many reviewing,
# table reviewing contains the reviewing records.
CREATE TABLE reviewing
(
reviewingid INTEGER NOT NULL AUTO_INCREMENT,
paperid INTEGER NOT NULL,
reviewerid INTEGER NOT NULL,
unique(paperid, reviewerid),
PRIMARY KEY(reviewingid),
FOREIGN KEY (paperid) REFERENCES paper (paperid),
FOREIGN KEY (reviewerid) REFERENCES reviewer (reviewerid)
);

#table score , each record contains the score of each reviewing and each questions
CREATE TABLE score
(
reviewingid integer ,
score integer,
FOREIGN KEY (reviewingid) REFERENCES reviewing (reviewingid)
);

#find all paperid that are not dont from reviewing
# Finish reviewing paper are paper that
# for each reviewing answer 9 QAs
# for paper there are three done reviewings.
# We want to find paper that are not done from reviewing.
SELECT paperid from paper
WHERE paperid not in
(
SELECT paperid FROM
(
SELECT paperid, COUNT(paperid) as numdonereviewing from
(
SELECT reviewing.paperid , COUNT(*) as numcheck from reviewing, score
where reviewing.reviewingid = score.reviewingid
GROUP by reviewing.reviewingid
) as temp1
WHERE numcheck = 9
GROUP by paperid
) AS temp2 WHERE numdonereviewing >= 3
);

  Posted by Patrick Jackson on March 3, 2007
Using IN in a DELETE subquery is a handy way to remove orphans.

Suppose you want to create foreign keys on an existing table with orphans. If you try to ALTER TABLE to create the foreign keys, get the dreaded:

error 1452 "cannot add or update a child row: foreign key constaint fails"

This is a good thing, because after implementing foreign keys you want your tables to be consistent, and not contain orphans, so you must delete them beforehand.

Given tables 'child' and 'parent' where child.parent_id is a foreign key referencing parent.id, use the following to clean up any orphans.

DELETE FROM child WHERE child.parent_id NOT IN (SELECT id FROM parent)
Sign Up Login You must be logged in to post a comment.