아 머리 쓰기 싫다..
내가 보려고 정리
키워드별로 구글검색 + GPT + 책 보고 정리중
JOIN까지만 블로그에 정리하고 그 다음꺼는 그냥 혼자서 보고 알기만 해야 겠다...
정리하다가 컨디션 관리 안 될 듯 ㅋㅋㅋ....
어차피 복습하는거라 개념은 다 알고 헷갈리는 부분만 정리한거
티스토리 표 기능 구려도 너무 구리다
표를 만들면 제멋대로 색상이 칠해지고 테두리가 안보임 < 진짜 못쓰겠다
인내심 테스트..
참고로 2024.11.17 기준
내용물 중 표에 선 안보이고 배경색 마음대로 칠해진 건 내가 고칠 수 있는 부분이 아님
텍스트에디터에서는 문제 없어 보여도 발행하면 다 깨져있음,
몇번을 수정해도 답이 없는데 내일 오전에 당장 SQL 자격 시험이라
급한데로 표 삭제하고 텍스트에디터에서 캡처해서 붙여넣기함
EQUI JOIN VS Non EQUI JOIN
- `EQUI JOIN`은 `Equal(=)` 조건으로 JOIN
- `Non EQUI JOIN`은 그 외 조건(BETWEEM, >, >=, <, <=)으로 JOIN
❌EQUI JOIN과 Non EQUI JOIN은 하나의 쿼리에서 같이 사용할 수 없다.
⭕테이블 간에 PK, FK의 연관관계가 없어도 JOIN이 가능하다.
⭕Non EQUI JOIN의 경우 JOIN 컬럼이라도 서로 다른 값을 가질 수 있기 때문에 SELECT 절에서 A.COL1을 B.COL1로 대체 할 수 없다. p.124 <-> p.128에서는 가능
⭕JOIN 되는 두 테이블에 모두 존재하는 컬럼의 경우 컬럼명 앞에 반드시 테이블명이나 ALIAS를 명시 해 주어야 한다. 한쪽에만 존재하더라도 ALIAS 명시해 주어야 한다. 왜? SQL은 해당 컬럼을 어느쪽 테이블에서 가져올 지 모르기 때문
JOIN 종류
우리가 쓰는 통신사가 SKT, KT, LG 등이 있듯이 DBMS에서도 벤더가 여러 개 존재한다. 벤더별로 구분 해 보자면 Oracle, SQL Server(MSSQL), MySQL, MariaDB 등이 있다. 벤더마다 SQL문법에 차이가 너무 클 경우 호환성 이슈가 발생하고 SQL을 사용하는 사람들 입장에서도 효율성이 떨어지기 때문이 표준이 되는 ANSI SQL을 지정하게 되었다. STANDARD JOIN은 ANSI JOIN 중 하나로 쉽게 말해 Oracle 에서도 돌아가고 MySQL에서도 돌아가는 JOIN 쿼리라고 생각하면 된다. STANDARD JOIN 보다는 ANSI JOIN, 표준 조인이라는 말이 많이 쓰인다.
`INNER JOIN`은 두 테이블에서 일치하는 행만 반환
`OUTER JOIN` 두 테이블에서 일치하지 않는 행도 결과에 포함시키며, LEFT, RIGHT, FULL로 나뉨
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- FULL OUTER JOIN

`NATURAL JOIN`
- 동일한 이름의 컬럼을 기준으로 JOIN
- 중복된 컬럼이 하나만 반환
`CROSS JOIN`
데카르트 곱(Cartesian Product)으로 두 테이블의 모든 조합을 반환(테이블1의 행 수 * 테이블2의 행 수)
`SELF JOIN`
SELECT e1.id, e1.name, e2.name AS manager_name
FROM employees e1
JOIN employees e2
ON e1.manager_id = e2.id;
Employees 테이블을 자기 자신과 조인하여, 각 직원의 매니저 이름을 표시합니다.


1. INNER JOIN
p.128
다음 SQL 중 결과가 다른 하나는 무엇인가? 3
// 1
SELECT A.COL1, B.COL2
FROM SAMPLE1 A, SAMPLE2 B
WHERE A.COL1 = B.COL1;
// 2
SELECT A.COL1, B.COL2
FROM SAMPLE1 A INNER JOIN SAMPLE2 B
ON A.COL1 = B.COL1;
// 3
SELECT A.COL1, B.COL2
FROM SAMPLE1 A, SAMPLE2 B
WHERE A.COL1 = B.COL1(+);
// 4
SELECT B.COL1, B.COL2
FROM SAMPLE1 A, SAMPLE2 B
WHERE A.COL1 = B.COL1;
4의 경우 EQUI JOIN이기 때문에 SELECT 절에서 A.COL1을 B.COL1로 대체 가능
두 쿼리는 같은 결과 도출
// 1
SELECT B.COL1, B.COL2
FROM SAMPLE1 A, SAMPLE2 B
WHERE A.COL1 = B.COL1;
// 4
SELECT B.COL1, B.COL2
FROM SAMPLE1 A, SAMPLE2 B
WHERE A.COL1 = B.COL1;
p.124
Non EQUI JOIN의 경우 JOIN 컬럼이라도 서로 다른 값을 가질 수 있기 때문에 SELECT 절에서 A.COL1을 B.COL1로 대체할 수 없다.
두 쿼리는 다른 결과 도출
// 1
SELECT A.COL1, B.COL3
FROM SAMPLE1 A, SAMPLE2 B
WHERE A.COL1 >= B.COL1
AND A.COL1 <= B.COL2;
// 2
SELECT A.COL1, B.COL3
FROM SAMPLE1 A, SAMPLE2 B
WHERE A.COL1 >= B.COL1
AND A.COL1 <= B.COL2;
2. OUTER JOIN
JOIN 조건에 충족하는 데이터가 아니어도 출력될 수 있는 방식이다.
LEFT OUTER JOIN
왼쪽에 표기된 테이블의 데이터는 무조건 출력되는 JOIN이다. 대신 오른쪽 테이블에 JOIN되는 데이터가 없는 Row들은 오른쪽 테이블 컬럼의 값이 NULL로 출력 된다.
SELECT A.PRODUCT_CODE,
A.PRODUCT_NAME,
B.MEMBER_ID,
B.CONTENT,
B.REG_DATE
FROM PRODUCT A LEFT OUTER JOIN PRODUCT_REVIEW B
ON A.PRODUCT_CODE = B.PRODUCT_CODE;
이 경우 상품 테이블에 있는 데이터는 다 나온다.
Oracle에서는 LEFT OUTER JOIN을 (+) 기호를 사용하여 표현할 수 있다. (+)는 기준이 되는 테이블의 반대쪽 테이블에 붙인다.
LEFT OUTER JOIN 하고 싶으면 오른쪽 테이블에 (+)붙인다. 그리고 조인 조건을 ON이 아니라 WHERE 절에 써 준다.
SELECT A.PRODUCT_CODE,
A.PRODUCT_NAME,
B.MEMBER_ID,
B.CONTENT,
B.REG_DATE
FROM PRODUCT A, PRODUCT_REVIEW B
WHERE A.PRODUCT_CODE = B.PRODUCT_CODE(+);
RIGHT OUTER JOIN
위와 같다
p.136 문제
다음 SQL의 결과로 가장 적절한 것은?
[SQL]
SELECT *
FROM SAMPLE1 A RIGHT OUTER JOIN SAMPLE2 B
ON (A.COL1=B.COL1 AND B.COL2 IS NOT NULL);

[결과]

일단 SAMPLE2의 데이터는 모두 출력 되지만, (A.COL1 = B.COL1 AND B.COL2 IS NOT NULL)을 만족하는 SAMPLE1의 데이터만 조인되어 최종적으로 함께 출력 된다.
p.138 문제
다음 SQL의 결과로 가장 적절한 것은?
[SQL]
SELECT *
FROM SAMPLE1 RIGHT OUTER JOIN SAMPLE2 B
ON A.COL1 = B.COL1
WHERE B.COL2 IS NOT NULL;

[결과]

OUTER JOIN에서 기준이 되는 테이블은 항상 모두 출력되지만 최종적으로 WHERE 조건에 의해 필터링을 거치게 된다.
SELECT *
FROM SAMPLE1 RIGHT OUTER JOIN SAMPLE2 B
ON A.COL1 = B.COL1

위처럼 WHERE절이 없는 경우 COL1이 3인 Row도 JOIN에 성공하여 출력되지만 WHERE B.COL2 IS NOT NULL 조건에 의해 필터링이 되어 최종적으로는 출력되지 않는다.
FULL OUTER JOIN
왼쪽 오른쪽 테이블의 데이터가 모두 출력되는 방식이다. LEFT OUTER JOIN과 RIGHT OUTER JOIN의 합집합니다. (단, 중복값은 제거)

3. NATURAL JOIN
A테이블과 B테이블에서 같은 이름을 가진 컬럼들이 모두 동일한 데이터를 가지고 있을 경우 JOIN이 되는 방식이다. MYSQL에서는 지원하지 않는다. p.141
같은 이름의 컬럼 중 값이 동일하지 않은 데이터일 때는 JOIN 시 출력되지 않는다.
이 때 USING 조건절을 이용하여 같은 이름을 가진 컬럼 중 원하는 컬럼만 JOIN에 이용 할 수 있다.
CAST, GENDER, JOB 을 가진 테이블 2개가 있는 경우... 만약 첫번째 테이블에서는 인스턴스의 JOB값과 두번째 테이블에서의 JOB이 동일하지 않은 상황인 것이다. 그 때 USING (CAST, GENDER) 해 주면 JOB이 달라도 JOIN 결과에 출력된다.
4. CROSS JOIN
다음 SQL과 같은 결과를 출력하는 SQL은?
[SQL]
SELECT BOY_NAME, GIRL_NAME
FROM GIRL, BOY B;
별도의 JOIN 조건이 없는 경우 두 테이블은 Cartesian Product(카티션 곱)가 된다. CROSS JOIN은 A 테이블과 B 테이블 사이에 JOIN 조건이 없는 경우, 조합할 수 있는 모든 경우를 출력하는 방식으로 같은 결과를 출력한다.
SELECT BOY_NAME, GIRL_NAME
FROM GIRL CROSS JOIN BOY;
아 티스토리 표 기능 구려서 못쓰겠다 진짜로....
'SQL&DataBase' 카테고리의 다른 글
[SQLD] 오답정리 & 서브쿼리 & 집합연산자 UNION, UNION ALL (7) | 2024.11.17 |
---|---|
[SQLD] NULL 관련 함수, CASE, DECODE, SQL실행순서 (5) | 2024.11.16 |
[SQLD] SQL 기본 함수 (문자열, 숫자, 날짜 등) (7) | 2024.11.16 |
[SQLD] 정규화, 반정규화 (36) | 2024.11.16 |
[SQLD] 데이터모델링의 이해 (6) | 2024.11.16 |
아 머리 쓰기 싫다..
내가 보려고 정리
키워드별로 구글검색 + GPT + 책 보고 정리중
JOIN까지만 블로그에 정리하고 그 다음꺼는 그냥 혼자서 보고 알기만 해야 겠다...
정리하다가 컨디션 관리 안 될 듯 ㅋㅋㅋ....
어차피 복습하는거라 개념은 다 알고 헷갈리는 부분만 정리한거
티스토리 표 기능 구려도 너무 구리다
표를 만들면 제멋대로 색상이 칠해지고 테두리가 안보임 < 진짜 못쓰겠다
인내심 테스트..
참고로 2024.11.17 기준
내용물 중 표에 선 안보이고 배경색 마음대로 칠해진 건 내가 고칠 수 있는 부분이 아님
텍스트에디터에서는 문제 없어 보여도 발행하면 다 깨져있음,
몇번을 수정해도 답이 없는데 내일 오전에 당장 SQL 자격 시험이라
급한데로 표 삭제하고 텍스트에디터에서 캡처해서 붙여넣기함
EQUI JOIN VS Non EQUI JOIN
- EQUI JOIN
은 Equal(=)
조건으로 JOIN
- Non EQUI JOIN
은 그 외 조건(BETWEEM, >, >=, <, <=)으로 JOIN
❌EQUI JOIN과 Non EQUI JOIN은 하나의 쿼리에서 같이 사용할 수 없다.
⭕테이블 간에 PK, FK의 연관관계가 없어도 JOIN이 가능하다.
⭕Non EQUI JOIN의 경우 JOIN 컬럼이라도 서로 다른 값을 가질 수 있기 때문에 SELECT 절에서 A.COL1을 B.COL1로 대체 할 수 없다. p.124 <-> p.128에서는 가능
⭕JOIN 되는 두 테이블에 모두 존재하는 컬럼의 경우 컬럼명 앞에 반드시 테이블명이나 ALIAS를 명시 해 주어야 한다. 한쪽에만 존재하더라도 ALIAS 명시해 주어야 한다. 왜? SQL은 해당 컬럼을 어느쪽 테이블에서 가져올 지 모르기 때문
JOIN 종류
우리가 쓰는 통신사가 SKT, KT, LG 등이 있듯이 DBMS에서도 벤더가 여러 개 존재한다. 벤더별로 구분 해 보자면 Oracle, SQL Server(MSSQL), MySQL, MariaDB 등이 있다. 벤더마다 SQL문법에 차이가 너무 클 경우 호환성 이슈가 발생하고 SQL을 사용하는 사람들 입장에서도 효율성이 떨어지기 때문이 표준이 되는 ANSI SQL을 지정하게 되었다. STANDARD JOIN은 ANSI JOIN 중 하나로 쉽게 말해 Oracle 에서도 돌아가고 MySQL에서도 돌아가는 JOIN 쿼리라고 생각하면 된다. STANDARD JOIN 보다는 ANSI JOIN, 표준 조인이라는 말이 많이 쓰인다.
INNER JOIN
은 두 테이블에서 일치하는 행만 반환OUTER JOIN
두 테이블에서 일치하지 않는 행도 결과에 포함시키며, LEFT, RIGHT, FULL로 나뉨
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- FULL OUTER JOIN

NATURAL JOIN
- 동일한 이름의 컬럼을 기준으로 JOIN
- 중복된 컬럼이 하나만 반환
CROSS JOIN
데카르트 곱(Cartesian Product)으로 두 테이블의 모든 조합을 반환(테이블1의 행 수 * 테이블2의 행 수)
SELF JOIN
SELECT e1.id, e1.name, e2.name AS manager_name FROM employees e1 JOIN employees e2 ON e1.manager_id = e2.id;
Employees 테이블을 자기 자신과 조인하여, 각 직원의 매니저 이름을 표시합니다.


1. INNER JOIN
p.128
다음 SQL 중 결과가 다른 하나는 무엇인가? 3
// 1 SELECT A.COL1, B.COL2 FROM SAMPLE1 A, SAMPLE2 B WHERE A.COL1 = B.COL1; // 2 SELECT A.COL1, B.COL2 FROM SAMPLE1 A INNER JOIN SAMPLE2 B ON A.COL1 = B.COL1; // 3 SELECT A.COL1, B.COL2 FROM SAMPLE1 A, SAMPLE2 B WHERE A.COL1 = B.COL1(+); // 4 SELECT B.COL1, B.COL2 FROM SAMPLE1 A, SAMPLE2 B WHERE A.COL1 = B.COL1;
4의 경우 EQUI JOIN이기 때문에 SELECT 절에서 A.COL1을 B.COL1로 대체 가능
두 쿼리는 같은 결과 도출
// 1 SELECT B.COL1, B.COL2 FROM SAMPLE1 A, SAMPLE2 B WHERE A.COL1 = B.COL1; // 4 SELECT B.COL1, B.COL2 FROM SAMPLE1 A, SAMPLE2 B WHERE A.COL1 = B.COL1;
p.124
Non EQUI JOIN의 경우 JOIN 컬럼이라도 서로 다른 값을 가질 수 있기 때문에 SELECT 절에서 A.COL1을 B.COL1로 대체할 수 없다.
두 쿼리는 다른 결과 도출
// 1 SELECT A.COL1, B.COL3 FROM SAMPLE1 A, SAMPLE2 B WHERE A.COL1 >= B.COL1 AND A.COL1 <= B.COL2; // 2 SELECT A.COL1, B.COL3 FROM SAMPLE1 A, SAMPLE2 B WHERE A.COL1 >= B.COL1 AND A.COL1 <= B.COL2;
2. OUTER JOIN
JOIN 조건에 충족하는 데이터가 아니어도 출력될 수 있는 방식이다.
LEFT OUTER JOIN
왼쪽에 표기된 테이블의 데이터는 무조건 출력되는 JOIN이다. 대신 오른쪽 테이블에 JOIN되는 데이터가 없는 Row들은 오른쪽 테이블 컬럼의 값이 NULL로 출력 된다.
SELECT A.PRODUCT_CODE, A.PRODUCT_NAME, B.MEMBER_ID, B.CONTENT, B.REG_DATE FROM PRODUCT A LEFT OUTER JOIN PRODUCT_REVIEW B ON A.PRODUCT_CODE = B.PRODUCT_CODE;
이 경우 상품 테이블에 있는 데이터는 다 나온다.
Oracle에서는 LEFT OUTER JOIN을 (+) 기호를 사용하여 표현할 수 있다. (+)는 기준이 되는 테이블의 반대쪽 테이블에 붙인다.
LEFT OUTER JOIN 하고 싶으면 오른쪽 테이블에 (+)붙인다. 그리고 조인 조건을 ON이 아니라 WHERE 절에 써 준다.
SELECT A.PRODUCT_CODE, A.PRODUCT_NAME, B.MEMBER_ID, B.CONTENT, B.REG_DATE FROM PRODUCT A, PRODUCT_REVIEW B WHERE A.PRODUCT_CODE = B.PRODUCT_CODE(+);
RIGHT OUTER JOIN
위와 같다
p.136 문제
다음 SQL의 결과로 가장 적절한 것은?
[SQL]
SELECT * FROM SAMPLE1 A RIGHT OUTER JOIN SAMPLE2 B ON (A.COL1=B.COL1 AND B.COL2 IS NOT NULL);

[결과]

일단 SAMPLE2의 데이터는 모두 출력 되지만, (A.COL1 = B.COL1 AND B.COL2 IS NOT NULL)을 만족하는 SAMPLE1의 데이터만 조인되어 최종적으로 함께 출력 된다.
p.138 문제
다음 SQL의 결과로 가장 적절한 것은?
[SQL]
SELECT * FROM SAMPLE1 RIGHT OUTER JOIN SAMPLE2 B ON A.COL1 = B.COL1 WHERE B.COL2 IS NOT NULL;

[결과]

OUTER JOIN에서 기준이 되는 테이블은 항상 모두 출력되지만 최종적으로 WHERE 조건에 의해 필터링을 거치게 된다.
SELECT * FROM SAMPLE1 RIGHT OUTER JOIN SAMPLE2 B ON A.COL1 = B.COL1

위처럼 WHERE절이 없는 경우 COL1이 3인 Row도 JOIN에 성공하여 출력되지만 WHERE B.COL2 IS NOT NULL 조건에 의해 필터링이 되어 최종적으로는 출력되지 않는다.
FULL OUTER JOIN
왼쪽 오른쪽 테이블의 데이터가 모두 출력되는 방식이다. LEFT OUTER JOIN과 RIGHT OUTER JOIN의 합집합니다. (단, 중복값은 제거)

3. NATURAL JOIN
A테이블과 B테이블에서 같은 이름을 가진 컬럼들이 모두 동일한 데이터를 가지고 있을 경우 JOIN이 되는 방식이다. MYSQL에서는 지원하지 않는다. p.141
같은 이름의 컬럼 중 값이 동일하지 않은 데이터일 때는 JOIN 시 출력되지 않는다.
이 때 USING 조건절을 이용하여 같은 이름을 가진 컬럼 중 원하는 컬럼만 JOIN에 이용 할 수 있다.
CAST, GENDER, JOB 을 가진 테이블 2개가 있는 경우... 만약 첫번째 테이블에서는 인스턴스의 JOB값과 두번째 테이블에서의 JOB이 동일하지 않은 상황인 것이다. 그 때 USING (CAST, GENDER) 해 주면 JOB이 달라도 JOIN 결과에 출력된다.
4. CROSS JOIN
다음 SQL과 같은 결과를 출력하는 SQL은?
[SQL]
SELECT BOY_NAME, GIRL_NAME FROM GIRL, BOY B;
별도의 JOIN 조건이 없는 경우 두 테이블은 Cartesian Product(카티션 곱)가 된다. CROSS JOIN은 A 테이블과 B 테이블 사이에 JOIN 조건이 없는 경우, 조합할 수 있는 모든 경우를 출력하는 방식으로 같은 결과를 출력한다.
SELECT BOY_NAME, GIRL_NAME FROM GIRL CROSS JOIN BOY;
아 티스토리 표 기능 구려서 못쓰겠다 진짜로....
'SQL&DataBase' 카테고리의 다른 글
[SQLD] 오답정리 & 서브쿼리 & 집합연산자 UNION, UNION ALL (7) | 2024.11.17 |
---|---|
[SQLD] NULL 관련 함수, CASE, DECODE, SQL실행순서 (5) | 2024.11.16 |
[SQLD] SQL 기본 함수 (문자열, 숫자, 날짜 등) (7) | 2024.11.16 |
[SQLD] 정규화, 반정규화 (36) | 2024.11.16 |
[SQLD] 데이터모델링의 이해 (6) | 2024.11.16 |