안녕하세요!
오늘은 내용이 여러가지네요.
짧게짧게 나눠서 세가지 배워보도록 하겠습니다.
EXISTS,
집합연산자,
그리고 DML 에 대해서 알아보겠습니다!
아 어제 배웠던 서브쿼리 하나만 복습 해볼까요?
어제 풀었던 문제와 비슷합니다.
customer, cycle, product 테이블을 이용해서 cid = 1 인 고객이 애음하는 제품중
cid = 2 인 고객도 애음하는 제품의 애음 정보를 조회하고 고객명과 제품명까지
포함하는 위와 같은 결과를 조회할 수 있는 쿼리를 작성 해보세요.
어제 풀었던 문제에서 customer 가 추가되고 cnm 컬럼이 추가 되었습니다.
이따 나올 내용이지만 행을 확장할 때는 집합 연산자를,
컬럼을 확장 할때는 JOIN 연산자를 사용합니다.
감이 좀 오시나요?
위와 같은 쿼리를 작성하셨다면 결과가 조회 되셨을겁니다.
어제 작성 했던 부분을 전에 배웠던 IN-LINE VIEW 로 만들어주고 별칭을 부여한 다음
세개의 테이블을 JOIN 으로 연결해주면 되겠습니다!
서브쿼리 복습은 아래를 참고해주세요!!
EXISTS 연산자
그럼 오늘 학습할 내용으로 바로 넘어가볼까요??
EXISTS 연산자 : 서브쿼리에서 반환하는 행이 존재하는지 체크하는 연산자
서브쿼리에서 반환하는 행이 하나라도 존재하면 TRUE
서브쿼리에서 반환하는 행이 존재하지 않으면 FALSE
위와 같은 논리법칙을 가진 연산자가 EXISTS 인데요,
그럼 특징을 알아보겠습니다.
1. WHERE 절에서 사용된다.
2. 메인테이블의 컬럼이 항으로 사용되지 않는다.
3. 비상호연관 서브쿼리, 상호연관 서브쿼리 둘 다 사용 가능하지만
주로 상호연관 서브쿼리와 사용된다.
4. 서브쿼리의 컬럼값은 중요하지 않다. ==> 서브쿼리의 행이 존재하는지만 체크.
그래서 관습적으로 SELECT 'X' 를 주로 사용한다.
형식은 WHERE EXISTS (서브쿼리)
와 같은 형태입니다.
그리고 일반적으로 EXISTS 연산자는 상호연관 서브쿼리에서 실행됩니다.
그럼 EXISTS 연산자를 적용한 서브쿼리는 서브쿼리만 실행이 안되겠죠?
그럼 문제 한 번 풀어보겠습니다.
위의 두 테이블은 cycle 과 product 테이블을 조회 한 것입니다.
위 두 테이블을 이용하여 cid = 1 인 고객이 애음하는 제품을 조회하는 쿼리를 작성하세요.
단, EXISTS 연산자를 사용해서 작성해보세요.(결과 : pid, pnm 조회)
먼저 cycle 테이블에서 cid = 1 인 고객이 애음하는 제품을 보면
pid = 100, 400 인 것을 알 수 있습니다.
결과가 pid, pnm 을 조회하는 것이므로 메인 테이블의 FROM 절에는
product 가 들어가야 한다는 것을 알 수 있겠네요.
그리고 나서 WHERE 절에서 EXISTS 연산자와 서브쿼리로 제한을 해주시면 되겠습니다.
저는 위와 같이 작성 했습니다.
제가 말한대로 메인 쿼리의 FROM 절에는 product 가 들어갔고,
서브쿼리에서 cid = 1이면서 cycle에 있는 pid 와 product에 있는 pid 를 연결하면
pid = 100, 400 이겠죠?
그대로 결과 출력하시면
위와 같은 결과를 얻을 수 있습니다.
쉽죠?
집합연산자
그럼 다음으로 집합 연산자에 대해서 알아보겠습니다.
집합연산은 아까 제가 뭐라고 했었나요?
행을 확장(세로 확장)한다고 말했었습니다.
집합 연산을 하기 위해서는 연산에 참여하는 두개의 SQL(집합)이 동일한 컬럼 개수와 타입을 가져야 합니다.
설명 먼저 하도록 하겠습니다.
합집합 UNION, UNION ALL
합집합은 말 그대로 두개의 집합을 하나로 합칠 때 사용합니다.
UNION 은 두 SQL 에서 중복되는 데이터를 한 번 제거합니다.
따라서 중복되는 데이터를 찾아야 하므로 연산이 필요하고, 속도가 느립니다.
UNION ALL 은 두 SQL 의 행을 붙이는 행위만 실시합니다.
따라서 중복을 찾는 과정이 없으므로 속도가 빠릅니다.
그러므로 개발자가 두 집합의 중복이 없다는 것을 알고 있다면 UNION ALL 을 사용하는게 더 좋겠죠??
교집합 INTERSECT
다음으로 교집합입니다.
두 개의 SQL에서 서로 중복되는 요소만 별도의 집합으로 생성합니다.
{1, 2, 3} INTERSECT {1, 4, 5} = {1}
과 같이 예시를 들 수 있을 것 같네요.
차집합 MINUS
앞에 선언된 집합의 요소중 뒤에 선언된 집합의 요소를 제거하고
남은 요소로 새로운 집합을 생성합니다.
{1, 2, 3} MINUS {1, 4, 5} = {2, 3}
이해가 되시나요?
그럼 실습으로 빠르게 예시 보여드리겠습니다.
위와 같이 결과가 나오는데요,
UNION ALL 과 비교해서 보면 좋을것 같아 바로 보여드리겠습니다.
위의 결과를 보시면 UNION 을 했을 때는 결과가 2건만 조회 됐는데요,
UNION ALL 을 하니 중복되는 결과까지 4건이 나오네요.
차이점을 확인 해주세요!
다음으로 INTERSECT 입니다.
교집합을 하려고 봤더니 공통되는 요소가 7566 밖에 없습니다.
그래서 결과는 당연히 7566 1건만 조회가 된것을 볼 수 있습니다.
마지막으로 MINUS입니다.
위의 SQL 에서 아래의 SQL 과 공통된 요소를 제거한 나머지로 결과를 구성합니다.
따라서 공통된 요소를 뺀 7369, 7499 가 조회 되었는데요,
위의 SQL 이 기준이라서 저런 결과가 나온것이지,
아래의 SQL 과 위치를 바꾼다면 다르게 나올 것입니다.
즉, 교환법칙이 성립하지 않는다는 말이죠!
이 부분도 알아두세요!
집합연산의 특징을 마지막으로 말씀드리고 넘어가겠습니다.
1. 컬럼명이 동일하지 않아도 된다. 단, 조회 결과는 첫 번째 집합의 컬럼을 따른다.
2. 정렬이 필요한 경우 마지막 집합 뒤에다가 기술하면 된다.
3. UNION ALL 을 제외한 경우 중복제거 작업이 들어간다.
DML
오늘의 마지막 부분 DML 입니다!
오늘은 INSERT 와 UPDATE 만 보도록 하겠습니다.
INSERT
테이블에 데이터를 입력하는 SQL 문장입니다.
1. 어떤 테이블에 데이터를 입력할 지 테이블을 정한다.
2. 해당 테이블의 어떤 컬럼에 어떤 값을 입력할 지 정한다.
문법은 위와 같습니다.
컬럼명과 컬럼의 값은 순서를 맞춰 주셔야 합니다.
사용한 쿼리를 보면
deptno 에 99를,
dname 에 'etc'를,
loc 에 'daejeon'을
넣는다는 의미 입니다.
위를 보면 알 수 있듯이 INSERT 구문은 FROM 절을 작성하지 않습니다.
만약, 테이블의 모든 컬럼에 대해 값을 입력하고자 할 경우는 컬럼을 나열하지 않아도 되는데요,
단, VALUES 절에 입력할 값을 기술할 순서는 테이블에 정의된 컬럼의 순서와 동일 해야합니다.
또한, 모든 컬럼에 값을 입력하지 않을 수도 있습니다.
단, 해당 컬럼이 NOT NULL 제약 조건이 걸려 있는 경우는 컬럼에 반드시 값이 들어가야 합니다.
컬럼에 NOT NULL 제약조건 적용 여부는 DESC 테이블; 을 통해서 확인할 수 있습니다.
UPDATE
UPDATE 는 테이블에 존재하는 데이터를 수정하는 것입니다.
1. 어떤 테이블을 업데이트 할 건지
2. 어떤 컬럼을 어떤 값으로 업데이트 할 건지
3. 어떤 행에 대해서 업데이트 할 건지(SELECT 쿼리의 WHERE 절과 동일)
위와 같은 사항들을 고려하여 UPDATE를 해주시면 됩니다.
문법은 위와 같습니다.
실습을 해보겠습니다.
아까 deptno가 99, dname이 ddit, loc가 daejeon 인 데이터를
dept 테이블에 입력했는데요,
이를 deptno가 99번인 부서의 부서명을 '대전it',
loc 를 'daejeon' 으로 업데이트 하려면
쿼리를 어떻게 작성해야 할까요?
위와 같이 작성할 수 있겠네요.
마지막으로 UPDATE 쿼리를 작성할 때 주의점을 말씀 드리겠습니다.
WHERE 절이 있는지 없는지 꼭 확인하세요!!
WHERE 절이 없다는건 모든 행에 대해서 업데이트를 행한다는 의미입니다.
다른 부분의 데이터를 건드릴 수 있다는 말이죠.
이를 방지하기 위해 기술한 WHERE 절을 SELECT 절에 적용하여
업데이트 대상 데이터를 눈으로 확인하고 실행하면 실수를 줄일 수 있습니다!
오늘 내용은 여기서 마치도록 하겠습니다.
여러개 많이 배웠으니 복습 꼭 해주세요!
오늘도 끝까지 봐주셔서 감사합니다!
다음에 또 봐요!
'프로그래밍 > 데이터베이스' 카테고리의 다른 글
[SQL 기초 - 13장] 오라클 SQL 제약조건, ALTER (0) | 2024.12.18 |
---|---|
[SQL 기초 - 12장] 오라클 SQL DELETE, DROP, CREATE 구문(feat. 제약조건) (0) | 2024.12.17 |
[SQL 기초 - 10장] 오라클 SQL 서브쿼리 (1) | 2024.12.13 |
[SQL 기초 - 9장] 오라클 SQL OUTER JOIN, 서브쿼리 (0) | 2024.12.12 |
[SQL 기초 - 8장] 오라클 SQL JOIN 연습!! (feat. xERD) (0) | 2024.12.11 |