Lecture 04, SQL (2)
2023. 8. 4. 10:34ㆍ2023/데이터베이스개론
반응형
- SQL 조작문 기초
- 부의 질의문(subquery)
- 질의문 안에 중첩되어 포함된 또 다른 SELECT 검색문으로 여러번 반복이 가능함
- 괄호 안의 가장 안쪽 부질의문 먼저 수행하고 바깥쪽 질의문을 가장 나중에 수행
- WHERE 절의 검색 조건값을 미리 알지 못하거나 실시간으로 조건식을 완성해야 하는 경우 유용
- inner query: 안쪽에 위치한 부질의문
- outer query 또는 main query: 바깥에 위치한 주질의문
- 부의 질의문(subquery)
SELECT 이름
FROM 학생
WHERE 학번 IN (SELECT 학번
FROM 수강
WHERE 과목번호='c002');

SELECT 이름
FROM 학생
WHERE 학번 IN (SELECT 학번
FROM 수강
WHERE 과목번호 = (SELECT 과목번호
FROM 과목
WHERE 이름='정보보호'));

- EXISTS 연산자
- 부질의문의 실행 결과로 반환되는 행이 존재하는지를 확인
- 왼쪽에 상수 값이나 열 이름을 명세하지 않고 사용
SELECT 이름
FROM 학생
WHERE EXISTS(SELECT *
FROM 수강
WHERE 수강.학번=학생.`학번` AND 과목번호='c002');

- 상호연관(상관) 질의문(correlated query)
- 중첩 질의문 중에서 내부 질의의 WHERE절 ‘검색_조건식’이 외부 질의에 선언된 테이블의 일부 열을 참조
- 안쪽 부질의문의 WHERE절 조건식에 바깥 주질의문의 학생 테이블이 사용되어 바깥 질의와 안쪽 질의가 서로 연관되어 실행
- 대부분 join으로 대체되어 실행
- 테이블 별칭 사용
- as 혹은 테이블 명 바로 옆에 별칭을 적음
SELECT 이름, 과목번호
FROM 학생 AS S, 수강 E
WHERE S.학번=E.학번 AND 과목번호='c002';
- Self Join
- 특정 테이블에 속하는 행들을 같은 테이블에 속하는 행들과 조인
- 하나의 테이블은 테이블 별칭을 다르게 지정함으로써 마치 복제된 두 테이블이 존재하는 것처럼 조인 가능
SELECT S1.이름, S2.이름
FROM 학생 S1 JOIN 학생 S2 ON S1.주소= S2.`주소`
WHERE S1.학년 > S2.학년;

- Outer Join
- 일반적으로 Inner Join은 조인 조건을 만족하는 행만 결과에 포함
- 조인 대상 테이블의 모든 행들이 결과에 포함되게 하려면 Outer Join을 사용해야 함
- 어느 테이블의 행을 모두 보여줄 것인가에 따라 Left, Right로 구분
SELECT 학생.`학번`, 이름, 평가학점
FROM 학생 LEFT OUTER JOIN 수강 ON 학생.학번 = 수강.학번

- left outer join
- 조인 연산자의 왼쪽 테이블의 모든 행들이 빠짐없이 조인 최종 결과에 포함
- right outer join
- 조인 연산자의 오른쪽 테이블의 모든 행들이 빠짐없이 조인 최종 결과에 포함
- full outer join
- 조인 연산자의 왼쪽과 오른쪽 테이블의 모든 행들이 빠짐없이 조인 최종 결과에 포함
- Insert, Delete, Update
- Insert
# 열리스트의 경우에는 생략 가능하나 이 경우 values의 값 부분이 전체 컬럼수, 순서와 일치해야 함
INSERT INTO 테이블_이름 [(열리스트)]
VALUES (열_값_리스트);
- null값을 입력할 때 null로 표시하거나 아예 입력하지 않음(null 허용하는 컬럼의 경우만)
- default값이 지정되어있는 경우에도 생략할 수 있음
- sub query를 이용해 입력할 수 있음
INSERT INTO 학생(이름, 주소, 학년, 나이, 성별, 휴대폰번호, 소속학과, 학번)
VALUES ('홍길동1', DEFAULT, 1, 26, '남', NULL, '통계', 'g002');
INSERT INTO 학생(이름, 학년, 나이, 성별, 소속학과, 학번)
VALUES ('홍길동1', 1, 26, '남', '통계', 'g002'); # 위의 쿼리나 이 쿼리를 이용하면 됨
INSERT INTO 학생(학년, 나이, 성별, 소속학과, 학번, 이름)
VALUES (3, 30, '남', '정보통신', 'g003', '이승엽1');

- Update
UPDATE 테이블_이름
SET 열이름 = 산술식 [,{열이름=산술식}*]
[WHERE 수정_조건식];
- 단일, 복수 행열 수정 가능
UPDATE 학생
SET 학년=3
WHERE 이름='이은진';
SELECT * FROM 학생
WHERE 이름='이은진';

UPDATE 학생
SET 학년=학년+1, 소속학과='자유전공학부'
WHERE 학년=4;
SELECT * FROM 학생;

# sub query를 활용한 update 방법
## 1
UPDATE 학생
SET 소속학과 = NULL
WHERE 학번 NOT IN (SELECT 학번
FROM 수강);
SELECT * FROM 학생;
## 2
UPDATE 수강
SET 학번 = (SELECT 학번
FROM 학생
WHERE 이름='이은진')
WHERE 학번='s003';
SELECT * FROM 수강 WHERE 학번='s003' OR 학번='s007';

- Delete
DELETE FROM 테이블이름
[WHERE 삭제조건식];
# 단일 행 삭제
DELETE FROM 학생
WHERE 이름='송윤아';
SELECT * FROM 학생;
# 복수 행 삭제
DELETE FROM 학생
WHERE 학년=3;
SELECT * FROM 학생1;

DELETE FROM 과목
WHERE 과목번호 IN (
SELECT 과목번호
FROM 수강
GROUP BY 과목번호
HAVING COUNT(*) < 2);
SELECT * FROM 과목;

DELETE FROM 학생;
SELECT * FROM 학생;

반응형
'2023 > 데이터베이스개론' 카테고리의 다른 글
Lecture 05, Table, View, Index (0) | 2023.08.24 |
---|---|
Lecture 04, SQL (1) (0) | 2023.08.03 |
Lecture 03, 데이터모델의 구성요소(2) (0) | 2023.06.25 |
Lecture 03, 데이터모델의 구성요소(1) (0) | 2023.06.25 |
Lecture 02, 데이터베이스의 구조 (0) | 2023.06.25 |