2013-05-14 3 views
1

안녕하세요, 저는 예제 # 7 SQL Zoo 튜토리얼에서 작업하고 있습니다 : SELECT within SELECT. 다음 질문에서IN 대 IN은 무료 결과를 반환하지 않습니다

"모든 인구가 25000000 미만인 대륙에 속한 각 국가를 찾습니다. 이름, 대륙 및 인구를 표시하십시오."

나는 NOT IN을 사용하여 정답을 얻을이 같은 하위 쿼리

SELECT name, continent, population FROM world 
WHERE continent NOT IN (
    SELECT continent FROM world 
    WHERE population > 25000000) 

이 "IN"반면 사용에 내가 대신 "NOT IN"과 "인구 < 25000000"I의 정답을 얻지 못하면 그 이유를 이해할 수 없습니다. 아마 이것에 대한 간단한 이유가있을 것입니다. 나는 그것을 보지 못했습니다. 누군가 저에게 설명 할 수 있습니까?

+5

개별 하위 쿼리의 결과를 살펴 보셨습니까? – Yuck

+3

"population <25000000"및 "population> 25000000"은 모든 경우를 다루지는 않습니다. –

+0

아마도 남극 대륙 이외에 25,000,000보다 작은 인구를 가진 대륙이 없으므로 '... in (null)'을하려고합니다. –

답변

3

, 문제는 올바른, 모든 국가는 25,000,000 이하의 인구가 대륙의 모든 국가를 나열하도록 요청?

예 경우, 서브 쿼리에서 보면 : 당신은 25,000,000 이상 모든 국가 중 한 곳 이상에서 w를 가지고 대륙/인구를 당겨 그래서 작동 왜 사람들은 제외된다

SELECT continent FROM world 
WHERE population > 25000000 

.

예 : 대륙 알파 5 개국, 그 중 네 개의 작은, 그러나 그들 중 하나가, 국가 찰리

50000000.의 인구가있다 그래서 국가 찰리의 제약 조건에 맞게 때문에 대륙 알파를 반환하여 하위 쿼리 population> 25000000입니다.이 하위 쿼리는 원하지 않는 모든 것을 발견 할 수 있습니다. 그 때문에 의지가 작동하지 않는 이유가 있습니다. 한편

: 모든 국가가 25,000,000 이하인 경우

SELECT continent FROM world 
WHERE population > 25000000 

, 그것은 당신이 모든 국가가 아래로 원하기 때문에, 당신이 원하는하지 않은, 대륙을 표시합니다.

예 : 대륙 이전의 알파, 네 개의 작은 국가. 이 4 개는 25000000 미만이므로 국가 별 Charlie가 50000000이라는 사실에 관계없이 하위 쿼리에서 반환됩니다.

분명히이 방법은 최선의 방법은 아니지만 이것이 첫 번째 쿼리가 일하고, 두 번째는하지 않았다.

+0

그래서 "IN"을 사용하면 인구가 25000000보다 적은 국가를 가진 대륙을 얻을 수 있다고 말합니다. 아마도 이것이 맞을 것입니다. 고마워요. – Addi

+0

그렇습니다. 서브 쿼리가 수행 중이기 때문에 맞습니다. 미안하지만 그건 최선의 표현이 아니 었어. 나는 그것을 약간 지우기 위해 그것을 편집했다. – Julian

+0

@Julian 또한 이해할 때 문제를 해결하는 가장 좋은 방법은 어느 것이지 지적 할 수 있습니까? 감사 –

0

왜 하위 쿼리를 사용합니까? 사용

시도 :

SELECT name, continent, population FROM world 
WHERE population > 25000000 

및/또는

SELECT name, continent, population FROM world 
WHERE population <= 25000000 

당신의 상태의 열 : "세계": "인구"는 FROM 테이블에 있습니다.

SELECT name, continent, population FROM world 
WHERE continent NOT IN (
    SELECT continent FROM world 
    GROUP BY continent 
    HAVING SUM(population) > 25000000) 

으로 통지 : "세계"를 다시 바로 WHERE

에서 직접 "인구"열을 사용하거나이 작업을 수행하려고하는 동일한 테이블의 하위 쿼리를 사용할 필요가 없습니다 : SUM(), GROUP BY 및 HAVING

0

표 DECLARATION을 표시합니다. CONTINENT를 대륙 번호로 사용하는 것 같습니다. 그런 다음 PRIMARY KEY 및 NOT NULL 옵션으로 표시되어 있는지 확인해야합니다. 내가 realyl은 당신이 NULL이 SQL에 가지고있는 매우 특별한 의미를 잊어 버렸다고 생각합니다.

저는 Firebird 2.5.1 SQL 서버에서 예제를 만듭니다. 이제

CREATE TABLE WORLD (
    CONTINENT INTEGER, 
    NAME  VARCHAR(20), 
    POPULATION INTEGER 
); 


INSERT INTO WORLD (CONTINENT, NAME, POPULATION) VALUES (NULL, 'null-id', 100); 
INSERT INTO WORLD (CONTINENT, NAME, POPULATION) VALUES (1, 'normal 1', 10); 
INSERT INTO WORLD (CONTINENT, NAME, POPULATION) VALUES (2, 'normal 2', 200); 
INSERT INTO WORLD (CONTINENT, NAME, POPULATION) VALUES (3, 'null-pop', NULL); 
INSERT INTO WORLD (CONTINENT, NAME, POPULATION) VALUES (4, 'normal 4', 110); 

COMMIT WORK; 

대륙을 가진 것은 어디있을 것 NULL IS,의는 귀하의 요청을 시도하고 1 행 있는지 확인하자 다음

SELECT continent, population FROM world 
WHERE continent IN (
    SELECT continent FROM world 
    WHERE population > 100) 

CONTINENT POPULATION 
2   200 
4   110 

SELECT continent, population FROM world 
WHERE continent NOT IN (
    SELECT continent FROM world 
    WHERE population > 100) 

CONTINENT POPULATION 
1   10 
3   <NULL> 

를 요청의 논리에 의해 행 ID가 CONTINENT라고 가정하면, NOT-NULL로 설정하고 [NOT] IN 조건으로 볼 수없는 행은 없을 것입니다.

SELECT continent, population FROM world 
    WHERE NOT (population > 100) 

CONTINENT POPULATION 
<NULL>  100 
1   10 

SELECT continent, population FROM world 
    WHERE population > 100 

CONTINENT POPULATION 
2   200 
4   110 

누락 된 행이 인구 컬럼에 대한 하나 가지고 NULL했다이 시간 :


지금, 평면 쿼리로이 다시 문구를 보자.

그런 다음 FreshPrinceOfSO는 EXISTS 절 사용하여 제안했다.잠재적으로 대부분의 느린 (비효율적 인) 쿼리 계획으로 끝날 수도 있지만 적어도 SQL에서 NULL 값의 특별한 의미를 숨 깁니다. 내가 올바르게 읽고 있어요 경우

SELECT continent, population FROM world w_ext 
WHERE EXISTS (
    SELECT continent FROM world w_int 
    WHERE (w_int.population > 100) and (w_int.continent = w_ext.continent) 
) 

CONTINENT POPULATION 
2 200 
4 110 

SELECT continent, population FROM world w_ext 
WHERE NOT EXISTS (
    SELECT continent FROM world w_int 
    WHERE (w_int.population > 100) and (w_int.continent = w_ext.continent) 
) 

CONTINENT POPULATION 
<NULL> 100 
1 10 
3 <NULL> 
2

다른 모든 대륙에는 적어도 25 개의 미오 인구가있는 국가가 하나씩 있기 때문입니다. 그것이 이것이 말하는 것입니다.

 SELECT name, continent, population FROM world 
WHERE continent IN (
    SELECT continent FROM world 
    WHERE population < 25000000) 

단어로 번역 : 대륙 미만 25 미오의 인구를 가지고 국가가 모든 국가를 찾아주십시오 (테이블 세계) 모든 국가의 목록에서.

관련 문제