Sql '란' 와 며칠입니까 참가하십시오 유형이 다른?
'' 은 SQL 데이터베이스 테이블 2 개 이상의 데이터를 검색하는 방법을 참가하십시오.
총 5 가지 참가하십시오 '의. 그 내용은 다음과 같습니다.
1. JOIN or INNER JOIN
2. OUTER JOIN
2.1 LEFT OUTER JOIN or LEFT JOIN
2.2 RIGHT OUTER JOIN or RIGHT JOIN
2.3 FULL OUTER JOIN or FULL JOIN
3. NATURAL JOIN
4. CROSS JOIN
5. SELF JOIN
이 같은 조인 ',' 우리 모든 기록을 모두 테이블 조건과 일치하는 테이블뿐 및 기록 모두 않습니다를 일치하지 않는 것으로 알려졌다.
즉, '내부 조인' 에서 하나의 사실에 기반을 두고 있다. 테이블 만 일치하는 항목을 모두 나열해야 합니다.
단, '다른' 없이 '여러_키워드 참가하십시오 참가하십시오' (like '내부', '외부', '좌파' 등) 는 '내부 조인'. 즉, '는' 참가하십시오 설탕 한 "에 대한 내부 조인 '통사 (참조: https://stackoverflow.com/questions/565620/difference-between-join-and-inner-join).
'외부 조인' 읽어들입니다
나도 이 모든 행을 다른 테이블에 한 테이블 및 정합된 행뿐만 또는, 모든 테이블에서 모든 행 (doesn&, t # 39 이 문제가 있는지 여부를 a 매치).
세 가지 종류의 외부 조인의 예는 다음과 같다:
2.1 왼쪽 외부 조인 또는 왼쪽 bigadmin
이 모든 행뿐만 참가하십시오 되돌려줍니다 왼쪽에서 테이블에 일치하는 행뿐만 함께 &solarisdvd 오른쪽 표. 오른쪽 표, 열이 없으면 일치 'NULL' 값을 돌려준다.
이 '에서' 모든 행 참가하십시오 되돌려줍니다 일치하는 행뿐만 함께 에서 오른쪽 표 왼쪽 테이블. 열이 없으면 'NULL' 의 왼쪽 테이블을 일치하는 값을 돌려준다.
2.3 전체 외부 조인 또는 전체 bigadmin
'는' 왼쪽 외부 조인 '와' '이' 참가하십시오 오른쪽과 왼쪽 외부 조인은 기능적으로 동일하다. 이 때 표 값 중 하나를 행뿐만 되돌려줍니다 조건 충족 'NULL' 되돌려줍니다 해당되어서는 없을 때.
즉, 외부 조인 '는' 사실에 기반한 것이었다. 일치하는 항목 중 하나에 만 표 (오른쪽 또는 왼쪽) 또는 두 개의 테이블 (전체) 나열해야 합니다.
Note that `OUTER JOIN` is a loosened form of `INNER JOIN`.
이 두 가지 조건을 바탕으로 하고 있다.
이 같은 이름의 한 '1' 은 모든 열이 참가하십시오 평등을 위한. 2. 열 절감뿐만 복제본임을 &solarisdvd 결과.
이에 따라 더 많은 것 같다고 이론적 특성을 가진 대부분의 DBMS (아마도) 이를 뒷받침하듯 don& # 39, 느끼지 못할 정도였습니다.
이는 제품 (product of the 카티시안 두 테이블이 있었다. Cross JOIN 결과일 '' 은 쉽게 이해할 수 없습니다. 대부분의 경우. 게다가 우리는 won& # 39, 모든 (또는 필요한 최소 정확히) 에서 이에 필요한 건 아니다.
',' 아니다 '는 것이 아니라, 다른 형태의 참가하십시오 참가하십시오' ('내부', '외부' 등) 의 표를 말한다.
연산자에서 따라 사용할 수 없다 ',' 조 '의 두 가지 유형의 참가하십시오 참가하십시오. 이들은
동등 참가하십시오
참가하십시오 세타
동등 bigadmin:
무료로 그 참가하십시오 '유형' ('내부', '외부' 등) 만 말하는 하나님은 우리가 사용하는 경우 항등 연산자 (=) '는' 이 '참가하십시오 참가하십시오 동등'.
하지만 이 같은 조인 '는' 동등 >;; = > 수행되었는지 다른 모든 사업자들은 < 상술합니다.
>. 많은 동등 '와 유사한 내부 조인' 모두 '고려해보십시오 참가하십시오 세타 (θ)' '', '외부' >. 참가하십시오 상술합니다 '의. 하지만 난 그 실수를 하면 이 강력히 믿는다 >. 막연한 아이디어를. '있다', '등 모두 연결된 외부 조인' 때문에 내부 조인을 >. 반면 그들의 데이터 테이블을 돌며 '와' 만 '이' 동등 참가하십시오 참가하십시오 세타 >. 우리가 사용하는 연결되어 있는 종합유선방송사업자 (so) 전. >. >. 일종의 '자연' 으로 다시 고려해보십시오 참가하십시오 이들이 많다 >. " peculiar"; '동등 bigadmin'. 사실 때문에, 첫 번째 것은 >. 찼음을 대해 언급한 바와 같이 '자연 조인'. 그러나 우리는 don& # 39 수 없다. >. 단순히 제한할 수 있는 '자연 bigadmin 혼자예요. '의' 의 내부, 외부 조인 참가하십시오 >. 동등 '등' 참가하십시오 소요될 수 없다.
Rdbms 의 조인을 5 종 염려사항 수 있습니다.
이 두 테이블의 조건 없이 모든 기록을 금지커서 결합하였습니다 카티시안 Product: - 기술적으로, 그 결과 되돌려줍니다 쿼리하지 세트 없이 where 절.
모든 RDBMS 의 가입 및 SQL 조인을 따라 몇 가지 3 종 염려사항 및 발전을 통해 달성할 수 있는 이러한 유형의 조인.
2.1. 왼쪽 외부 조인 (앨k.a, 왼쪽 참가하십시오): 2 개의 테이블, 그리고 탁월한 정합된 되돌려줍니다) 에서 가장 왼쪽에서 표 (이리에, 첫 번째 테이블) 만.
이 참가하십시오 CROSS-JOIN:* 병합합니다 결합하였습니다 대신 향상합니다 카티시안 제품 / 3. 않습니다.
enter 이미지 여기에 설명을! 참고: 자가 조인 테이블을 외부 조인 할 수 있지만, 요구 사항 및 cross join 인컨텍스트 통해 달성됩니다 내부 조인을 기반으로 하는 결합할 수 있다.
1.1: 내부 조인을: 동등 참가하십시오 구축상의
SELECT *
FROM Table1 A
INNER JOIN Table2 B ON A.<Primary-Key> =B.<Foreign-Key>;
1.2: 내부 조인을: 자연 조인 구축상의
Select A.*, B.Col1, B.Col2 --But no B.ForeignKeyColumn in Select
FROM Table1 A
INNER JOIN Table2 B On A.Pk = B.Fk;
1.3: 함께 내부 조인을 동등 참가하십시오 비사양 구축상의
Select *
FROM Table1 A INNER JOIN Table2 B On A.Pk <= B.Fk;
1.4: 자가 조인 함께 내부 조인을
Select *
FROM Table1 A1 INNER JOIN Table1 A2 On A1.Pk = A2.Fk;
2.1: 외부 조인 (전체 외부 조인)
Select *
FROM Table1 A FULL OUTER JOIN Table2 B On A.Pk = B.Fk;
2.2: 왼쪽 bigadmin
Select *
FROM Table1 A LEFT OUTER JOIN Table2 B On A.Pk = B.Fk;
2.3: 오른쪽 bigadmin
Select *
FROM Table1 A RIGHT OUTER JOIN Table2 B On A.Pk = B.Fk;
3.1: Cross JOIN
Select *
FROM TableA CROSS JOIN TableB;
3.2: 금지커서 bigadmin 자체 참가하십시오
Select *
FROM Table1 A1 CROSS JOIN Table1 A2;
//OR//
Select *
FROM Table1 A1,Table1 A2;
이 두 문제를 겪을 대부분의 다른 대답이 가장 많았다.
벤 다이어그램 만들 수 있도록, 그래서 설명하란말야 부정확하게 참가하십시오 카티시안 제품 때문에 둘 사이의 참여됨 표. 위키백과 it 아주 잘 보여 줍니다. ! [입력하십시오. 이미지 여기에 설명을] [4] Sql 구문에서 조인 '는' 금지커서 카티시안 제품. 예를 들면 다음과 같습니다.
SELECT *
-- This just generates all the days in January 2017
FROM generate_series(
'2017-01-01'::TIMESTAMP,
'2017-01-01'::TIMESTAMP + INTERVAL '1 month -1 day',
INTERVAL '1 day'
) AS days(day)
-- Here, we're combining all days with all departments
CROSS JOIN departments
모든 행 한 행이 있는 테이블을 table:) 에서 다른 모든 결합한 출처: <! - 언어: > 랑 없음 -;
+--------+ +------------+
| day | | department |
+--------+ +------------+
| Jan 01 | | Dept 1 |
| Jan 02 | | Dept 2 |
| ... | | Dept 3 |
| Jan 30 | +------------+
| Jan 31 |
+--------+
결과:. <! - 언어: > 랑 없음 -;
+--------+------------+
| day | department |
+--------+------------+
| Jan 01 | Dept 1 |
| Jan 01 | Dept 2 |
| Jan 01 | Dept 3 |
| Jan 02 | Dept 1 |
| Jan 02 | Dept 2 |
| Jan 02 | Dept 3 |
| ... | ... |
| Jan 31 | Dept 1 |
| Jan 31 | Dept 2 |
| Jan 31 | Dept 3 |
+--------+------------+
만약 그냥 쓰기 쉼표로 구분된 목록니다 테이블뿐 we& # 39, ll get 동일합니다.
-- CROSS JOINing two tables:
SELECT * FROM table1, table2
단순히 내부 조인 '한' 있는 '세타 (θ)' 에서 '필터링됨' cross join 필터링합니다 조건자 호출됨 관계대수. 예를 들면 다음과 같습니다.
SELECT *
-- Same as before
FROM generate_series(
'2017-01-01'::TIMESTAMP,
'2017-01-01'::TIMESTAMP + INTERVAL '1 month -1 day',
INTERVAL '1 day'
) AS days(day)
-- Now, exclude all days/departments combinations for
-- days before the department was created
JOIN departments AS d ON day >= d.created_at
참고로, 키워드 '내부' 선택적입니다 (제외) 의 MS Access). ([결과 기사를 보면 참조용이므로)
우리는 대부분 사용할 수 있는 특별한 종류의 참가하십시오 세타 동등 참가하십시오 있다. 이 조건자 파견할 수 있는 표에 외래 키 다른 기본 키를 한 표. 사키라 데이터베이스 를 사용할 수 있다면, 우리는 그림으로의 쓸 수 있다.
SELECT *
FROM actor AS a
JOIN film_actor AS fa ON a.actor_id = fa.actor_id
JOIN film AS f ON f.film_id = fa.film_id
모든 배우들이 이 영화를 통해 결합하였습니다. 또한, 일부 또는 데이터베이스:
SELECT *
FROM actor
JOIN film_actor USING (actor_id)
JOIN film USING (film_id)
'이' () 를 사용하는 구문을 지정할 수 있도록 열 존재해야 하는 한쪽에 bigadmin operation& # 39 의 테이블 및 조건자 사람들에 대해 두 개의 열이 잘 만듭니다.
이 " 나열되는지 참가하십시오 type", 다른 대답을 한다. 한편, 하지만 그 doesn& # 39, 쉽게 이해할 수 없다. # 39 의 it& 단순한 설탕, 이는 특수한 경우는 참가하십시오 세타 참가하십시오 구문 형식의 동등 또는 내부 조인. 모든 수집됩니다 참가하십시오 앨리어스가 자연 조인 테이블 () 를 사용하는 것을 모두 공통적으로 사용되는 열 기능을 참여됨 '및' 해당 열. 이는 판매업체에서 유용한 실수로 일치시킵니다 때문에 거의 같은 LAST_UPDATE '단' 사키라 데이터베이스).
SELECT *
FROM actor
NATURAL JOIN film_actor
NATURAL JOIN film
이제 좀 다른 내부, 외부 조인 '는' 에서 '으로' '노조의 참가하십시오 e-lab 은 여러 카티시안 제품. 우리가 쓸 수 있다.
-- Convenient syntax:
SELECT *
FROM a LEFT JOIN b ON <predicate>
-- Cumbersome, equivalent syntax:
SELECT a.*, b.*
FROM a JOIN b ON <predicate>
UNION ALL
SELECT a.*, NULL, NULL, ..., NULL
FROM a
WHERE NOT EXISTS (
SELECT * FROM b WHERE <predicate>
)
그래서 우리는 쓸 사람은 아무도 없을 rmw 쓰기 '외부 조인' (대개 의해 더 최적화된 데이터베이스). ',' 키워드 'like' 내부, 외부 선택적입니다 삽입하십시오. '3' 는 외부 조인 음식과는 잘 어울린다.
Oracle 에서 사용할 수 있는 몇 가지 역사적, 사용되지 않는 '외부 조인 구문을, SQL Server, 표준 SQL 구문 전에 이미' 이 있었다.
-- Oracle
SELECT *
FROM actor a, film_actor fa, film f
WHERE a.actor_id = fa.actor_id(+)
AND fa.film_id = f.film_id(+)
-- SQL Server
SELECT *
FROM actor a, film_actor fa, film f
WHERE a.actor_id *= fa.actor_id
AND fa.film_id *= f.film_id
따라서 이 구문을 사용하여, t # 39 don& 할 것 "이라고 말했다. 난 그냥 여기 오래된 블로그 포스트를 통해 이를 알 수 있도록 기존의 코드 목록 /.
이런 사실을 아는 사람은 그리 많지 않지만, SQL 표준 지정 파티셔닝된 '외부 조인' (Oracle 구축 및 it). 이 같은 쓸 수 있습니다.
WITH
-- Using CONNECT BY to generate all dates in January
days(day) AS (
SELECT DATE '2017-01-01' + LEVEL - 1
FROM dual
CONNECT BY LEVEL <= 31
),
-- Our departments
departments(department, created_at) AS (
SELECT 'Dept 1', DATE '2017-01-10' FROM dual UNION ALL
SELECT 'Dept 2', DATE '2017-01-11' FROM dual UNION ALL
SELECT 'Dept 3', DATE '2017-01-12' FROM dual UNION ALL
SELECT 'Dept 4', DATE '2017-04-01' FROM dual UNION ALL
SELECT 'Dept 5', DATE '2017-04-02' FROM dual
)
SELECT *
FROM days
LEFT JOIN departments
PARTITION BY (department) -- This is where the magic happens
ON day >= created_at
부분을 결과:. <! - 언어: > 랑 없음 -;
+--------+------------+------------+
| day | department | created_at |
+--------+------------+------------+
| Jan 01 | Dept 1 | | -- Didn't match, but still get row
| Jan 02 | Dept 1 | | -- Didn't match, but still get row
| ... | Dept 1 | | -- Didn't match, but still get row
| Jan 09 | Dept 1 | | -- Didn't match, but still get row
| Jan 10 | Dept 1 | Jan 10 | -- Matches, so get join result
| Jan 11 | Dept 1 | Jan 10 | -- Matches, so get join result
| Jan 12 | Dept 1 | Jan 10 | -- Matches, so get join result
| ... | Dept 1 | Jan 10 | -- Matches, so get join result
| Jan 31 | Dept 1 | Jan 10 | -- Matches, so get join result
여기에 요점이지 그게 단가요 행뿐만 파티셔닝된 side of the wind up 는 결과에 상관 없이 참가하십시오 의 경우, 다른 면이 있는 것도 '' 매칭됨 참가하십시오 " JOIN". 긴 얘기를 파선-짧은: 이는 것가운데 칠하려면 스파스 data-in 보도했다. 매우 유용합니다!
농담하십니까? 다른 어떤 오토메이티드 맡을게? 물론, 때문에 별로 없는 기본 구문을 doesn& # 39, SQL 에서는 외람되나 (ANTI 마찬가지로 커넥트릭스 (아래 참조). 하지만 우리는 '에서 사용할 수 있습니다 ()' 와 ' ()' 등 영화에 재생할지를 사용는 배우 모두 찾을 수 있습니다.
SELECT *
FROM actor a
WHERE EXISTS (
SELECT * FROM film_actor fa
WHERE a.actor_id = fa.actor_id
)
이 '=' 역할을 하고 있는 a.actor_id fa.actor_id 조건자 참가하십시오 조건자 올라왔다. # 39, t believe it 체크아웃합니다 don& 경우, 예를 들어 실행 계획, Oracle 의. # 39 에 데이터베이스가 you& ll see, 구사 () '가 아닌' 약간 결합 연산의 조건자. ! [입력하십시오. 이미지 여기에 설명을] [8]
이것은 단지 참가하십시오 반대 SEMI (주의해서 사용하지 않는 '없음' 표시되어도 가지고 있기 때문에 중요한 단서 조항) 다음은 없이 모든 배우가 영화.
SELECT *
FROM actor a
WHERE NOT EXISTS (
SELECT * FROM film_actor fa
WHERE a.actor_id = fa.actor_id
)
일부 사람들은 (특히 MySQL 명) 도 쓰기 안티 bigadmin 다음과 같습니다.
SELECT *
FROM actor a
LEFT JOIN film_actor fa
USING (actor_id)
WHERE film_id IS NULL
중요한 것은 성능입니까 역사적인 이유 생각한다.
OMG, 이건 너무 좋네요. # 39 m, 유일하게 언급하십시오 i& it? # 39 의 멋진 here& 쿼리하지:
SELECT a.first_name, a.last_name, f.*
FROM actor AS a
LEFT OUTER JOIN LATERAL (
SELECT f.title, SUM(amount) AS revenue
FROM film AS f
JOIN film_actor AS fa USING (film_id)
JOIN inventory AS i USING (film_id)
JOIN rental AS r USING (inventory_id)
JOIN payment AS p USING (rental_id)
WHERE fa.actor_id = a.actor_id -- JOIN predicate with the outer query!
GROUP BY f.film_id
ORDER BY revenue DESC
LIMIT 5
) AS f
ON true
It 발견하리니 호스트당 TOP 5 의 제작 영화 배우이다. 필요할 때마다 뭔가 호스트당 상단형 n 쿼리하지 참가하십시오 측면 '을' 친구. 이런 사실을 아는 사람, 그런 're a # 39 you& 경우, SQL Server 이름으로 참가하십시오' 유형 '적용'
SELECT a.first_name, a.last_name, f.*
FROM actor AS a
OUTER APPLY (
SELECT f.title, SUM(amount) AS revenue
FROM film AS f
JOIN film_actor AS fa ON f.film_id = fa.film_id
JOIN inventory AS i ON f.film_id = i.film_id
JOIN rental AS r ON i.inventory_id = r.inventory_id
JOIN payment AS p ON r.rental_id = p.rental_id
WHERE fa.actor_id = a.actor_id -- JOIN predicate with the outer query!
GROUP BY f.film_id
ORDER BY revenue DESC
LIMIT 5
) AS f
이것은 단지 상행담관염이라고 구현됩니까 수 있지만, Oracle 에서 및 nformix (내 지식) 의 시스템 및 / 또는 XML 과 SQL Server (XML) 를 사용하여 에뮬레이션된 PostgreSQL. 중복집합 상관식 서브케리 및 결과 집합을 둥지를 만드는 '' 행을 외부 질의입니다. 영화에 대한 그들의 모든 배우들의 선택함 쿼리하지 아래 각 배우 수집됩니다 네스트된 컬렉션:
SELECT a.*, MULTISET (
SELECT f.*
FROM film AS f
JOIN film_actor AS fa USING (film_id)
WHERE a.actor_id = fa.actor_id
) AS films
FROM actor
지금까지 살펴본 바에 따라 여러 가지 다양한 종류의 참가하십시오 그냥 " boring"; '내부', '보통' 외부 '및' CROSS JOIN 않는비즈니스 언급되지 않았다. 자세한 내용은 내 문서. 그리고 제발 정지점을 벤 다이어그램을 사용하여, 이를 설명하기 위해.
내가 만든 그림으로의 보다 내 의견으로는 설명하는 것이다. ! [SQL bigadmin 표 설명] [1]
양쪽의 두 테이블이 외래 키 가지고 제대로 release. 참가하십시오 경우 (즉, 동일한 이름을 " 아니라, id) 그런 다음 이 사용할 수 있습니다.
SELECT ...
FROM customers JOIN orders USING (customer_id)
내가 찾을 수 있을 만큼 이 매우 현실적이며, 판독값, 사용되지 않는 경우가 많습니다.