본문 바로가기

데이터베이스

[DB] SQL 관계대수 (cross join, natural join, join using, join on)

728x90
반응형

select 절

 

select 절은 관계 대수에서 추출(projection) 연산과 일치한다.

 

Query의 결과에 나타나기를 바라는 속성들을 나열하는 데 사용된다.

 

co_1 co_2 co_3
1 2 3
6 0 0
11 22 33
1 2 3

 

select * from [테이블 이름]
-- 기본 형식

select * from en_table
-- 사용 예시

 

위 쿼리를 통해 아래와 같은 결과를 얻을 수 있다.

 

co_1 co_2 co_3
1 2 3
6 0 0
11 22 33
1 2 3

 

 

 

select 뒤에 distinct 키워드를 사용하여 중복을 제거하는 것도 가능하다.

 

select distinct * from [테이블 이름]
-- 기본 형식

select distinct * from en_table
-- 사용 예시

 

위 쿼리를 사용하여 아래와 같은 결과를 얻을 수 있다.

 

co_1 co_2 co_3
1 2 3
6 0 0
11 22 33

 

 

select 뒤에 all을 사용하여 중복을 허용하는 것을 명시적으로 나타낼 수도 있다.

 

 

 

 

 

select 뒤에 *는 모든 속성을 나타낼 때 사용한다.

 

따라서 select * from [테이블 이름] 은 테이블의 모든 속성이 선택된 것을 의미한다.

 

select 뒤에 선택을 원하는 속성을 명시하면 해당 속성만 선택하는 것이 가능하다.

 

select [속성] from [테이블]
-- 기본 형식

select co_1 from en_table
-- 사용 예시

 

따라서 위 쿼리를 통해 아래와 같은 결과를 얻을 수 있다.

 

co_1
1
6
11
1

 

 

 

이때 콤마(, )를 사용하여 여러 개의 속성을 선택하는 것도 가능하다.

 

select co_1, co_3 from en_table;

 

위 쿼리를 통해 아래와 같은 결과를 얻을 수 있다.

 

co_1 co_3
1 3
6 0
11 33
1 3

 

 

 

선택한 속성에 대수연산(+, -, *, /, %)을 적용하는 것도 가능하다.

 

select co_1, co_3*2 from en_table;

 

위 쿼리를 통해 아래와 같은 결과를 얻을 수 있다.

 

co_1 co_3
1 6
6 0
11 66
1 6

 

 

 

 

 

from 절

 

from 절은 관계 대수의 카티션곱(Cartesian product)에 해당한다.

 

Query에서 찾아보기를 원하는 릴레이션을 나열한다.

 

아래와 같은 두 개의 테이블이 있다고 가정하겠다.

en_table

co_1 co_2 co_3
1 2 3
6 0 0
11 22 33
1 2 3

e_table

col_1 col_2
1 4
2 5
3 6

 

 

from 절에서 테이블을 선택할 때 콤마를 사용하여 다음과 같이 작성하는 것도 가능하다.

 

select * from en_table, e_table;

 

from은 카티시안 곱(데카르트 곱)을 의미한다고 했었다. 즉, 콤마를 사용하면 두 테이블을 통해 만들 수 있는 모든 경우의 수를 조합하여 확인할 수 있다.

 

따라서 위 쿼리를 통해 아래와 같은 결과를 얻을 수 있다.

 

co_1 co_2 co_3 col_1 col_2
1 2 3 3 6
1 2 3 2 5
1 2 3 1 4
6 0 0 3 6
6 0 0 2 5
6 0 0 1 4
11 22 33 3 6
11 22 33 2 5
11 22 33 1 4
1 2 3 3 6
1 2 3 2 5
1 2 3 1 4

 

 

이때 콤마 대신 CROSS JOIN 키워드를 사용하는 것도 가능하다.

 

따라서 아래 두 쿼리는 같은 뜻이다.

 

select * from en_table, e_table;
select * from en_table cross join e_table;

 

 

 

동시에 select를 통해 속성을 선택하는 것도 가능하다.

 

select co_1, co_2, col_1, col_2 from en_table, e_table;

 

co_1 co_2 col_1 col_2
1 2 3 6
1 2 2 5
1 2 1 4
6 0 3 6
6 0 2 5
6 0 1 4
11 22 3 6
11 22 2 5
11 22 1 4
1 2 3 6
1 2 2 5
1 2 1 4

 

 

 

 

 

 

where 절

 

where 절은 관계 대수에서 선택 조건에 해당한다.

 

from 절에 나타나는 릴레이션들의 속성들의 조건으로 구성되어 있다.

 

이때 속성을 선택하기 위해 and, or, not과 같은 논리 접속사와 <, >, <=, >=, =, <>를 포함하는 비교 연산자를 사용할 수 있다.

 

또한 where 절에서는 어떤 값보다는 작거나 같고 어떤 값보다는 크거나 같은 값을 간단히 명시하기 위해

BETWEEN 비교 연산자를 제공한다.

 

select [속성] from [테이블] where [속성] between [값1] and [값2]
-- 기본 형식

select co_1, co_3 from en_table where co_1 between 0 and 10;
-- 사용 예시

 

위 쿼리를 통해 아래와 같은 결과를 얻을 수 있다.

 

co_1 co_3
1 3
6 0
1 3

 

 

 

 

 

 

natural join

 

natural join은 두 개의 테이블에서 공통된 값이 존재하는 튜플을 중복을 제거하고 하나의 튜플로 나타낸다.

 

예를 들어 아래와 같은 두 테이블이 존재한다고 가정하자.

e_table

a_id b_id c_id
a1 101 XXX
a2 102 YYY
a3 103 ZZZ
a4 104 AAA
a5 105 BBB
a6 106 CCC

en_table

a_id b_id val
a1 101 1
a2 102 2
a3 103 3

 

 

 

select * from e_table natural join en_table;

 

위 쿼리로 아래와 같은 결과를 얻을 수 있다.

 

a_id b_id c_id val
a1 101 XXX 1
a2 102 YYY 2
a3 103 ZZZ 3

 

 

 

 

join using

 

join을 할 때 using을 사용하여 공통된 속성 중 동일한 값이 존재하는지 확인할 속성을 명시적으로 나타낼 수도 있다.

 

예를 들어 아래와 같은 쿼리를 사용할 경우 방금 사용한 natural join 쿼리와 같은 결과를 도출한다.

 

select * from e_table join en_table using (a_id, b_id);

 

 

 

 

그러나 아래와 같은 쿼리를 사용할 경우 a_id 속성에 공통된 값이 존재하는지만 확인하고 b_id라는 동일한 속성이 존재하더라도 다른 속성으로 인지하게 된다.

 

select * from e_table join en_table using (a_id);

 

따라서 위 쿼리의 결과는 아래와 같다.

 

a_id b_id c_id b_id val
a1 101 XXX 101 1
a2 102 YYY 102 2
a3 103 ZZZ 103 3

 

 

 

 

 

 

join on

 

join 할 때 on을 사용하여 조건을 명시하는 것도 가능하다.

 

예를 들어 두 테이블 e_table과 en_table에서 속성 a_id의 값이 동일한 튜플을 확인하고 싶다면 아래 쿼리를 사용할 수 있다.

 

select * from e_table join en_table on e_table.a_id = en_table.a_id;

 

join on을 사용할 때에는 중복된 값을 찾았다고 해서 중복을 제거하지 않고 그대로 결과로 내보낸다.

 

따라서 위 쿼리의 결과는 아래와 같다.

 

a_id b_id c_id a_id b_id val
a1 101 XXX a1 101 1
a2 102 YYY a2 102 2
a3 103 ZZZ a3 103 3

 

 

 

join on을 사용할 때 on 절의 조건을 동등 비교가 아닌 범위 비교를 사용하는 것도 가능하다.

 

 

 

 

 

 

 

 

 

 

728x90
반응형

'데이터베이스' 카테고리의 다른 글

[DB] SQL DML (CREATE, DROP, INSERT, UPDATE, DELETE)  (0) 2025.02.24
[DB] DataBase 정의 및 특징  (0) 2025.02.20