CS/데이타베이스

[SQL] 데이터 조작어(DML) 활용

코딩하는 포메라니안 2022. 3. 16. 17:34

1. SELECT

- 데이터 검색하기

 

더보기

SQL과 이론적 관계형 데이터 모델 차이점

 

SQL은 똑같은 투플들을 자동으로 제거하지 않는다.  단, 사용자가 SELECT문에 "DISTINCT"를 명시할 때만 "투플의 중복을 제거"한다.

 

이론상의 관계형 모델은 "투플의 유일성"에 따라 똑같은 투플을 허용하지 않는다.

따라서, SELECT의 결과가 SQL과 이론상 결과가 다를 수 있다.

 

 

기본 구조

SELECT [ALL|DISTINCT] 열_리스트
FROM 테이블_리스트
[WHERE 조건]
[GROUP BY 열_리스트 [HAVING 조건]]
[ORDER BY 열_리스트 [ASC|DESC]];

# [ ]는 선택 가능 요소로 작성 안해도 되는 구간을 표시한 것,
# 실제로 작성할 때는 괄호는 지우기

 

 

1. 테이블의 투플 전체 검색

# 학생 테이블 전부를 검색하라
SELECT * FROM 학생;

 

 

2. DISTINCT를 이용한 검색

- 중복된 투플은 한 번만 취급

# 학생 테이블에 어떤 학과들이 있는지 검색하라
SELECT DISTINCT 학과 FROM 학생;

 

 

3. 조건 검색

- 조건에 해당하는 투플을 선택한다.

# 과목 테이블에서 학점이 3이고 학년이 4인 과목코드와 과목명을 검색하라
SELECT 과목코드, 과목명
FROM 과목
WHERE 학점 = 3 AND 학년 = 4;

 

 

4. LIKE를 이용한 검색

- '%' : 갯수는 0개 이상, 범위는 모든 문자

- '_' : 갯수는 1개, 범위는 모든 문자 ex) ___ : 3개의 문자인 값 선택

# 과목코드가 ‘CO’로 시작하는 과목의 과목코드와 과목명을 검색하라
SELECT 과목코드, 과목명
FROM 과목
WHERE 과목코드 LIKE 'CO%';

 

 

5. NULL을 이용한 검색

- NULL은 '='이 아닌 'is'를 사용

# 강의 테이블에서 강의실이 NULL인 교수번호와 과목코드를 검색하라
SELECT 교수번호, 과목코드
FROM 강의
WHERE 강의실 IS NULL;

 

 

6. 범위 검색

- 점수 BETWEEN 80 AND 90는 80 <= 점수 <= 90으로 범위 값도 포함

# 수강 테이블에서 점수가 80점부터 90점 사이의 열들을 검색하라
# 방법1
SELECT *
FROM 수강
WHERE 점수 BETWEEN 80 AND 90;
# 방법2
SELECT *
FROM 수강
WHERE 80<=점수 and 점수<=90;

 

 

7. ORDER BY를 이용한 검색

- ASC : 오름차순 정렬

- DESC : 내림차순 정렬

/*수강 테이블에서 점수가 80점 이상인 학생의 학번과 성적을 검색하되, 
학번은 오름차순으로, 같은 학번에 대해서 성적은 내림차순으로 검색하라.*/
# 1. 학번으로 1차 정렬
# 2. 부 정렬키인 성적으로 2차 정렬
SELECT 학번, 성적
FROM 수강
WHERE 점수 >= 80
ORDER BY 학번 ASC, 성적 DESC;

 

 

8. AS로 속성 이름 변경

- 계산된 값을 쓸 때 유용

/*수강 테이블에서 과목코드 ‘CO123’에 수강한 학생의 학번과 점수에 2점을 더한 값을 검색하되, 
학번의 열 이름은 “DB수강학번”, 점수의 열 이름은 “수정점수”, 
그리고 그 사이에는 “최종점수 =”라는 텍스트 내용을 “내용”이라는 열 이름으로 디스플레이하라.*/
SELECT 학번 AS DB수강학번, '최종점수=' AS 내용, 점수+2 AS 수정점수
FROM 수강
WHERE 과목코드 = 'CO123';

 

 

9. 집계 함수를 이용한 검색

- 집계 함수

/*학생 테이블에서 학생 수를 구하여라*/
SELECT COUNT(*) AS 학생 수
FROM 학생

/*과목 'CO123'에 대한 점수의 평균을 구하여라*/
SELECT AVG(점수) AS 평균
FROM 수강
WHERE 과목코드 = 'CO123';

 

 

10. GROUP BY를 이용한 검색

- 투플들을 특정 조건에 따라 그룹으로 묶어서 처리

/*과목별 점수의 평균을 구하라*/
SELECT 과목코드, AVG(점수) AS 평균
FROM 수강
GROUP BY 과목코드;

 

 

11. HAVING을 이용한 검색

- GROUP의 조건절

/*2명 이상 수강한 과목에 대한 점수의 평균을 구하라*/
SELECT 과목코드, AVG(점수) AS 평균
FROM 수강
GROUP BY 과목코드 HAVING COUNT(*) >= 2;

 

 

12. UNION(합집합) 이용한 검색

- 두 SELECT 결과 테이블이 합병 가능해야 함

- 합집합 = 중복되는 투플은 자동으로 제거됨

/*‘컴퓨터’과 학생이거나 ‘EE123’에 수강한 학생의 학번을 검색하라*/
SELECT 학번
FROM 학생
WHERE 학과 = '컴퓨터'
UNION
SELECT 학번
FROM 수강
WHERE 과목코드 = 'EE123';

 


 

2. INSERT

- 데이터 삽입하기

 

1. 단일 레코드 삽입

/*학번:20188991, 성명: ‘홍길동’ , 학과: ‘컴퓨터’, 전화번호: ‘010-1111-2222’인 학생을 삽입하라*/
/*방법 1*/
INSERT INTO 학생(학번, 성명, 학과, 전화번호)
VALUES (20188991, '홍길동', '컴퓨터', ‘010-1111-2222’);

/*방법 2*/
INSERT INTO 학생
VALUES (20188991, '홍길동', '컴퓨터', ‘010-1111-2222’);

 

 

2. 복수 레코드 삽입

 

1) 다른 테이블에서 여러 투플 가져와서 넣기

/*학생 테이블에서 ‘컴퓨터’과 학생의 학번, 성명, 전화번호를 검색하여 컴퓨터 테이블에 삽입하라*/
INSERT INTO 컴퓨터(학번, 성명, 전화번호)
SELECT 학번, 성명, 전화번호
FROM 학생
WHERE 학과 = '컴퓨터';

 

2) 직접 여러 투플 만들어서 넣기

 


 

3. DELETE

- 데이터 삭제

 

1. 단일 or 복수 레코드 삭제

/*학번 20181234인 학생을 삭제하라*/
DELETE FROM 학생
WHERE 학번 = 20181234;

 

 

2. 모든 레코드 삭제

/*학생 테이블의 모든 행을 삭제하라*/
DELETE FROM 학생;

 


 

4. UPDATE

- 데이터 갱신

 

1. 단일 레코드 변경

/*성명이 ‘홍길동’인 학생의 학과를 ‘컴퓨터’로 변경하라*/
UPDATE 학생
SET 학과 = '컴퓨터'
WHERE 성명 = '홍길동';

 

 

2. 복수 레코드 변경

/*과목 ‘CO123’의 점수를 2점씩 증가시켜라*/
UPDATE 수강
SET 점수 = 점수 + 2
WHERE 과목코드 = 'CO123';

 


 

5. TCL (Transaction Control Language)

- 트랜잭션(논리적 연산 단위) 제어어

 

1. COMMIT

- 물리적 데이터 베이스에 최종적으로 적용하기

- DDL과 DCL은 COMMIT이 포함되어 있다.

- DML은 따로 COMMIT을 해주어야 한다. 단, MySQL의 경우 DML이 자동 COMMIT하도록 되어 있기 때문에 따로 처리해줄 필요가 없다.

 

 

2. ROLLBACK

- 이전의 COMMIT한 지점으로 데이터 되돌리기

 

'CS > 데이타베이스' 카테고리의 다른 글

[SQL] 조인  (0) 2022.03.16
[SQL] SubQuery 중첩질의문  (0) 2022.03.16
[SQL] 데이터 정의어(DDL) 활용  (0) 2022.03.16
[실습] 트리거  (0) 2021.12.15
7. SQL  (0) 2021.12.15