Like 연산자
현실에서 데이터를 검색할 때, 한 조건에 맞는 데이터를 검색하고 싶을 때가 있습니다. 예를 들어, 주소지가 서울인 학생을 찾는다거나, 주민등록번호를 기준으로 성별을 찾는다거나 하는 경우가 이에 해당하죠. 이럴 때, SQL에서는 '=' 연산자 대신 like연산자를 이용합니다.
우선, like연산자에 사용가능한 문자열 패턴의 종류에 대해 알아보겠습니다.
① _ : 임의의 한 개의 문자를 말합니다.
② % : 임의의 문자 여러개를 의미합니다.
사용 예를 들어보겠습니다.
'%서울%' : '서울'이라는 단어가 포함된 문자열
'서울%' : 서울로 시작하는 문자열
'_ _ _' : 3 개의 문자로 구성된 문자열
'_ _ _%' : 최소 세 개로 구성된 문자열
이런 식으로 사용됩니다.
예시문제 ) 김씨 성을 가진 학생의 이름을 찾아라
student 테이블에서 여학생을 찾아라!
이렇게 like연산자를 이용하여 쉽게 찾을 수 있다.
집합 연산
table들은 집합으로 이루어져있기 때문에 집합 연산 사용이 가능하다. 주로 합집합, 교집합, 차집합을 사용한다.
select문1 집합연산자 select문2
이렇게 구성된다.
여기서 집합 연산자의 조건이 있다. 바로, 두 select문의 필드 개수와 데이터 타입이 서로 같아야 한다는 점이다.
UNION
이제, 합집합부터 천천히 알아보자. union이 사용되는 문제 예시는 다음과 같다.
교내 학생이름과 교수이름을 모두 출력하라
select name
from student
union
(select name
from professor);
UNION ALL
이 때, 생각지도 못한 문제가 생길 수 있다. 바로 union연산의 경우 합집합이기 때문에 당연히 중복값은 알아서 삭제하고 하나만 보여준다는 것이다. 이름을 출력해달라고 했는데 동명이인은 나오지 않는 문제가 생긴다.
그래서 우리는 union all 연산자를 이용해 중복을 허용하여 값을 받는다.
select name
from student
union all
(select name
from professor);
INTERSECT
intersect는 교집합을 말한다. 교집합 연산의 경우, 문제를 조금만 깊게 생각하면 훨씬 쉽게 풀수 있다는 장점이 있다.
예시로 다음과 같은 문제를 교집합과 교집합이 아닌 방식으로 풀어보자
컴퓨터 공학과 재학생들 중, 교과목에 상관없이 'A+' 학점을 받은 학생들의 이름과 학번을 출력하라.
1. intersect 사용하지 않은 답안
select s.stu_id, s.name
from student s, department d, takes t
where s.dept_id = d.dept_id
and t.stu_id = s.stu_id
and dept_name = '컴퓨터공학과' and grade='A+';
2. intersesct 사용한 답안
select s.stu_id, s.name
from student s, department d
where s.dept_id = d.dept_id
and dept_name = '컴퓨터공학과'
intersect
(select s.stu_id, s.name
from student s, takes t
where s.stu_id = t.stu_id
and grade = 'A+');
이렇게도 사용이 가능하다.
추가적으로, 차집합을 의미하는 MINUS연산도 있다. 그러나, MINUS연산의 경우 Oracle에서만 실행되고 나머지 DBMS에서는 실행이 되지 않는다. 그렇기 때문에 MINUS에 대해선 따로 보지 않겠다.
다음 포스팅에선 주로 조인에 대해 사람들이 많이 틀리는 조인에 대해 다루어 볼 예정이다!
'학교 수업 > DB시스템 구현' 카테고리의 다른 글
[DB 시스템 구현]SQL 레코드 검색 ① (0) | 2023.07.06 |
---|---|
[DB 시스템 구현] 틀리기 쉬운 SQL문제 정리하기 (0) | 2023.07.04 |
[DB 시스템 구현] SQL ① (0) | 2023.07.02 |
[DB 시스템 구현] 오라클 구조 (0) | 2023.07.02 |
[DB 시스템 구현] 오라클 설치방법 (0) | 2023.07.02 |