Cartesian Productd(카티시안 곱)의 이해
카티션 곱(cartesian product)은 엄밀히 말하면 조인이라고 할 수 없는 조인으로,
WHERE 절에 조인 조건을 주지 않는 것을 말합니다.
두 테이블을 기준으로 FROM 절에는 두 개의 테이블을 명시하지만 WHERE 절에서 조인 조건을 주지 않습니다.
(WHERE 절을 추가하지 않거나 WHERE 절을 추가해도 조인 조건을 주지 않는 경우).
그 결과 두 테이블의 데이터를 기준으로 가능한 모든 조합의 데이터가 조회됩니다.
(inner)=(Equi) JOIN
JOIN은 데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현
그런데 아래의 코드를 보면 counrty와 city를 합치려는데 이 때 조건이 있다.
조인하는 테이블의 ON 절의 조건이 일치하는 결과만 출력
MySQL에서는 JOIN, INNER JOIN 같은 의미로 사용된다.
city 테이블의 countrycode(국가코드) 컬럼과 country 테이블의 code컬럼이 같은 항목을 기준으로 JOIN을 하라는 의미이다.
동일 칼럼을 기준으로 조인. N개의 테이블 조인시 N-1개의 조인 조건이 필요하다.
SELECT a.id, a.name, a.countrycode, b.code, b.name country_name,
a.district, a.population
FROM city a
INNER JOIN country b
ON a.countrycode = b.code
ORDER BY 1;
위의 코드 을 보면 FROM 다음에 city a, INNER JOIN 다음에 country b라고 테이블과 별칭을 명시했습니다. 이는 city와 country 테이블을 내부 조인한다는 뜻입니다. 그리고 ON 절에는 a.countrycode = b.code라는 조인 조건을 기술했는데, city의 countrycode 칼럼과 country의 code 칼럼의 값이 같은 건을 조회하라는 뜻입니다. 그리고 SELECT 절에는 city 테이블의 모든 칼럼과 country 테이블의 code, name 칼럼을 명시했습니다. 여기서도 마찬가지로 테이블별칭.칼럼명 형태로 해당 칼럼이 어느 테이블의 칼럼인지 명확히 기술했죠. 특히 b.code, b.name country_name 부분은 city가 아닌 country 테이블의 국가 코드와 국가명을 가져옵니다. 결국 두 테이블을 조인하는 이유는 국가 코드 대신 국가명을 보기 위함입니다. 결과를 보면 a.countrycode와 b.code가 같은 값이 반환됐고 국가 코드에 맞는 국가명도 가져왔습니다.
SELECT b.name country_name, a.language, a.isofficial, a.percentage
FROM countrylanguage a
INNER JOIN country b
ON a.countrycode = b.code
ORDER BY 1;
countrylanguage와 country 테이블을 조인해 국가명은 country 테이블에서, 나머지 칼럼은 countrylanguage 테이블에서 가져옵니다. 이 쿼리 역시 INNER JOIN 다음에 country 테이블을 명시하고, ON 절에 국가 코드가 같은 건을 찾는 조인 조건을 기술했습니다. 그리고 SELECT 절에는 country 테이블의 국가명과 countrylanguage 테이블의 국가 코드를 제외한 나머지 칼럼을 명시했죠. 이 쿼리 역시 해당 언어를 사용하는 국가명을 보기 위해 country 테이블과 조인한 것입니다.
SELECT b.name country_name, a.language, a.isofficial, a.percentage
FROM countrylanguage a
INNER JOIN country b
ON a.countrycode = b.code
WHERE a.countrycode = 'KOR'
ORDER BY 1;
WHERE 절을 추가해 국가 코드가 ‘KOR’인 건에 해당하는 데이터만 조회합니다. countrylanguage 테이블에서 국가 코드가 ‘KOR’인 건은 2개이므로 결과로 총 2건이 조회됐습니다. 이처럼 조인 쿼리에서도 WHERE 절에 조건을 추가해 원하는 데이터만 조회할 수 있습니다.
SELECT a.code, a.name, a.continent, a.region, a.population, b.language,
c.name, c.district, c.population
FROM country a
INNER JOIN countrylanguage b
ON a.code = b.countrycode
INNER JOIN city c
ON a.code = c.countrycode
WHERE a.code = 'KOR'
ORDER BY 1;
아래의 쿼리는 위와 같은 쿼리임
SELECT a.code, a.name, a.continent, a.region, a.population, b.language,
c.name, c.district, c.population
FROM country a, countrylanguage b , city c
where a.code = b.countrycode and a.code = c.countrycode and a.code = 'KOR'
ORDER BY 1;
즉, country 테이블과 city 테이블을 추가로 조인합니다. 3개 테이블이 조인하니 INNER JOIN과 ON 절을 하나 더 넣었습니다. 그리고 SELECT 절에 city 테이블의 도시명, 시/도명, 인구수를 추가해 해당 정보를 조회했습니다.
문제) 아래가 에러가 나는 이유는
SELECT a.code, a.name, a.continent, a.region, a.population, b.language,
name, c.district, c.population
FROM country a
INNER JOIN countrylanguage b
ON a.code = b.countrycode
INNER JOIN city c
ON a.code = c.countrycode
WHERE a.code = 'KOR'
ORDER BY 1;
SELECT b.name country_name, a.language, a.isofficial, a.percentage
FROM countrylanguage a, country b
WHERE a.countrycode = b.code
AND a.countrycode = 'KOR'
ORDER BY 1;
SELECT a.code, a.name, a.continent, a.region, a.population, b.language,
c.name, c.district, c.population
FROM country a, countrylanguage b, city c
WHERE a.code = b.countrycode
AND a.code = c.countrycode
AND a.code = 'KOR'
ORDER BY 1;
https://thebook.io/080268/0298/
https://bright-landscape.tistory.com/296