[SQL] "..에와"사이의 차이 "에 .. 어디"SQL 왼쪽에서 가입? [복제]
SQL"..에와"사이의 차이 "에 .. 어디"SQL 왼쪽에서 가입? [복제]
SQL 문을.
1.select a.* from A a left join B b on a.id =b.id and a.id=2;
2.select a.* from A a left join B b on a.id =b.id where a.id=2;
이 두 개의 SQL 문장의 차이는 무엇인가?
해결법
-
==============================
1.
create table A(id int); create table B(id int); INSERT INTO A VALUES(1); INSERT INTO A VALUES(2); INSERT INTO A VALUES(3); INSERT INTO B VALUES(1); INSERT INTO B VALUES(2); INSERT INTO B VALUES(3); SELECT * FROM A; SELECT * FROM B; id ----------- 1 2 3 id ----------- 1 2 3
온 필터는이 과정을 가입시 추가되는 행을 방지하기 위해 가입.
select a.*,b.* from A a left join B b on a.id =b.id and a.id=2; id id ----------- ----------- 1 NULL 2 2 3 NULL
(가) 발생에 가입하면 WHERE 필터링한다.
select a.*,b.* from A a left join B b on a.id =b.id where a.id=2; id id ----------- ----------- 2 2
-
==============================
2.조인 조건에서 이것은 단지 a.id <> (2)가 필터링되지 않는 경우 기록 있도록, a.id를 사용합니다. 이 같은 결과를 얻을 수 있습니다 :
조인 조건에서 이것은 단지 a.id <> (2)가 필터링되지 않는 경우 기록 있도록, a.id를 사용합니다. 이 같은 결과를 얻을 수 있습니다 :
+------+------+ | a.id | b.id | +------+------+ | 1 | NULL | | 2 | 2 | | 3 | NULL | +------+------+
당신은 B의 열 중 하나를 선택하지 않는다, 그러나 당신이 경우에, 쉽게 이해할 수 있습니다.
a.id <> 2 필터링합니까 어디 이제 기록합니다.
+------+------+ | a.id | b.id | +------+------+ | 2 | 2 | +------+------+
-
==============================
3.@hvd 말하는 것처럼이 "여기서"버전은 외부 조인 행을 (어떤이 a.id = NULL) 반환하지 않습니다, 그래서에 의해 반환 된 "여기서"절 필터 행은, 가입 할 수 있습니다.
@hvd 말하는 것처럼이 "여기서"버전은 외부 조인 행을 (어떤이 a.id = NULL) 반환하지 않습니다, 그래서에 의해 반환 된 "여기서"절 필터 행은, 가입 할 수 있습니다.
그러나 또 다른 중요한 차이가있다 : 외부 조인 행이 필터링되지 않은 경우에도, 결과 세트가 이전 작게되기 때문에, 절 "의"에 조건을 넣는 엄청난 성능 향상이있을 수 있습니다.
당신도 적합하지 않은 행에 대해 다음 표를 발생하지 조인 방지하고 잠재적으로 필터링에 도달 수백만 개의 행을 잘라 수 있습니다 ( "- 다른 왼쪽 조인 된 테이블의 일련가"와 "조건 하나를 다음과 경우에 특히 발음 ") 단계.
-
==============================
4.나는 시간을 시도하고 나는 이유, 그것은 단지 우선 순위와 관련이 무엇인지 알고있다.
나는 시간을 시도하고 나는 이유, 그것은 단지 우선 순위와 관련이 무엇인지 알고있다.
select * from A a left join B b on a.id=b.id and b.id=2
이 수단은 이것이 조건이다 (여기서 b.id = 2) 가입 왼쪽 필터 B 제
Select * from A a left join B b on a.id=b.id where a.id=2
이 방법은 이후 a.id = B (2)에 의해, 다음 필터 합류
-
==============================
5.당신은 SQL 쿼리 구문에 대해 생각하는 경우는 'AND'는 블록을 결합 확장 (있는 경우와 같은 경우 괄호) 곳으로 쿼리의 WHERE / 필터링 블록의 시작을 정의하는 'WHERE'가.
당신은 SQL 쿼리 구문에 대해 생각하는 경우는 'AND'는 블록을 결합 확장 (있는 경우와 같은 경우 괄호) 곳으로 쿼리의 WHERE / 필터링 블록의 시작을 정의하는 'WHERE'가.
-
==============================
6.명확하게 @mr_eclair에 의해 설명 된 바와 같이
명확하게 @mr_eclair에 의해 설명 된 바와 같이
무슨 일이 두 경우에 발생합니다. 내가 당신이 기억하는 쉬운 방법을 말씀 드리겠습니다.
select a.*,b.* from A a left join B b **on** a.id =b.id ***and*** a.id=2;
여기에 "AND"를 "ON"에 근무하고 그것은 가입 기준과 조건을 제공합니다.
select a.*,b.* from A a left join B b on a.id =b.id **where** a.id=2;
여기 반면 "WHERE"모든 결과에 조건을 제공했다.
더 명확하게 넣어하기 위해, "WHERE"에서 결과를 발견 한 후 결과 집합 필터링 문 "을 선택합니다." "AND"두 테이블을 조인의 조건이다.
from https://stackoverflow.com/questions/12400567/difference-between-on-and-and-on-where-in-sql-left-join by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 넓은 키가 큰 MySQL의 긴에서 모양 변경 데이터 / (0) | 2020.06.06 |
---|---|
[SQL] 어떻게 C #을에서 날짜가 제대로 SQL로 전달하는 방법? (0) | 2020.06.06 |
[SQL] 같은 '%'NULL 값을 허용하지 않습니다 (0) | 2020.06.06 |
[SQL] VARCHAR를 값을 변환 할 때 변환 int 데이터 형식 '단순한'를 실패한 (0) | 2020.06.06 |
[SQL] "수"버전으로 SQL 정렬, 다양한 길이의 문자열 (0) | 2020.06.06 |