정보처리기사/데이터베이스 구축
SQL 2
RangA
2023. 5. 28. 00:03
01. SQL 명령어
03. 데이터 조작어(DML)
1) DML 명령어 종류
- 데이터 삽입(INSERT) : 삽입 형태로 신규 데이터를 테이블에 저장함
- 데이터 수정(UPDATE) : 테이블의 내용을 수정함
- 데이터 삭제(DELETE) : 테이블의 내용을 삭제함
- 데이터 조회(SELECT) : 테이블의 내용을 조회함
2) 데이터 삽입
- 입력하고자 하는 테이블에 모든 컬럼 데이터를 입력한다면 컬럼명을 명시하지 않아도 되지만, 특정 컬럼만을 입력하고자 한다면 반드시 컬럼명을 명시해야 함
- 컬럼명 수와 VALUES 절의 수는 반드시 동일해야 함
- 기존에 존재하는 테이블 데이터로부터 특정 테이블로 데이터를 복사할 수 있음
- 필드명을 지정하는 경우
INSERT INTO 테이블명(필드명1, 필드명2, 필드명3, ...)
VALUES (값1, 값2, 값3, ...);
- 필드명을 지정하지 않는 경우
INSERT INTO 테이블명 VALUES (값1, 값2, 값3, ...);
- 특정 테이블로 복사하는 경우
INSERT INTO 사본테이블명(필드명1, 필드명2, ...)
SELECT 필드명1, 필드명2, ... FROM 원본테이블명;
3) 테이블 수정(UPDATE)
- UPDATE 명령문은 보통 WHERE 절을 통해 어떤 조건이 만족할 경우에만 특정 필드의 값을 수정하는 용도로 많이 사용됨
- 값에는 상수뿐만 아니라 수식도 사용이 가능함
UPDATE 테이블명 SET 필드1 = 값1, 필드명2 = 값2, ...
[WHERE 절];
4) 데이터 삭제(DELETE)
- 튜플을 선택적으로 삭제할 때 사용됨
- 조건절 없이 DELETE를 사용하는 경우, 테이블 전체가 한 번에 삭제되는 위험이 있음
DELETE FROM 테이블명 [WHERE 절];
5) 데이터 조회(SELECT)
- 데이터의 내용을 조회할 때 사용하는 명령어
- 가장 많이 사용되는 SQL 명령어
SELECT [ OPTION ] 필드명 FROM 테이블명 [WHERE 절];
04. SELECT 명령어
1) SELECT 명령어 형식
- SELECT 명령어 형식
SELECT [ DISTINCT ] {*|필드명1, ...|필드명1 AS 별명1, ...|연산}
FROM 테이블명
{ WHERE 조건 | GROUP BY 필드명 [ HAVING 조건 ]}
[ ORDER BY { 정렬 필드명 [ ASC|DESC ]}];
- SELECT 명령어의 옵션(Option)
- DISTINCT : 중복되는 튜플(레코드, 행)을 제거하여 조회함
- : 모든 필드를 조회함
- 필드명1 : 필드명1, 필드명2, ... 으로 여러 개를 지정할 수 있음
- 별명1 : 필드명이나 연산 결과를 별명으로 제목을 부여할 수 있음
- 연산 : 사칙연산, SUM(), AVG() 등의 함수를 사용할 수 있음
- WHERE 조건 : 조건을 만족하는 튜플들만 조회함
- GROUP BY 필드명 : 그룹별로 묶을 필드명을 지정함
- HAVING : 그룹별로 조건을 만족하는 튜플들만 조회함
- ORDER BY : 정렬 옵션으로 ASC(오름차순, 생략 가능), DESC(내림차순), 1차키 정렬 필드, 2차 정렬 필드, ...를 지정할 수 있음
2) SELECT의 기본적인 명령
<테이블명 : 학생>
학번 | 이름 | 학과코드 | 시험점수 | 과제 | 학점 |
---|---|---|---|---|---|
H01 | 최성호 | A01 | 98 | 1 | A |
H02 | 김희정 | A02 | 47 | 0 | F |
H03 | 이재춘 | A01 | 86 | 1 | B |
H04 | 임승현 | E01 | 28 | 1 | NULL |
H05 | 김현태 | C07 | 67 | 1 | D |
H06 | 김유신 | C07 | 98 | 0 | A |
H07 | 정용조 | A01 | 37 | 1 | F |
H08 | 신사임 | D03 | 95 | 1 | A |
H09 | 김유신 | E01 | 69 | 0 | D |
H10 | 윤정연 | E01 | 89 | 1 | B |
- <학생> 테이블의 모든 내용을 검색(조회)함
SELECT * FROM 학생;
- 이름과 시험점수만을 검색함
SELECT 이름, 시험점수 FROM 학생;
- 중복된 이름을 제거하여 검색함
SELECT DISTINCT 이름 FROM 학생;
- 시험점수에 5를 빼서 출력함
SELECT 시험점수 - 5 FROM 학생;
- 학과코드가 중복된 것은 제외하고 그 개수를 출력함
SELECT COUNT(DISTINCT 학과코드) FROM 학생;
- 학과코드가 중복된 것은 제외하고 학과코드가 A01인 개수를 출력함
SELECT COUNT(DISTINCT 학과코드) FROM 학생
WHERE 학과코드 = 'A01';
- 시험 점수 합계를 출력함
SELECT SUM(시험점수) FROM 학생;
- 시험점수의 평균을 출력함(단, NULL 학점은 제외함)
SELECT SVG(시험점수) FROM 학생
WHERE 학점 IS NOT NULL;
- 시험점수의 최댓값을 출력함
SELECT MAX(시험점수) FROM 학생;
- 시험점수의 최솟값을 출력함
SELECT MIN(시험점수) FROM 학생;
3) SELECT의 조건 지정 검색 명령
<테이블명 : 학생>
학번 | 이름 | 학과코드 | 시험점수 | 과제 | 학점 |
---|---|---|---|---|---|
H01 | 최성호 | A01 | 98 | 1 | A |
H02 | 김희정 | A02 | 47 | 0 | F |
H03 | 이재춘 | A01 | 86 | 1 | B |
H04 | 임승현 | E01 | 28 | 1 | NULL |
H05 | 김현태 | C07 | 67 | 1 | D |
H06 | 김유신 | C07 | 98 | 0 | A |
H07 | 정용조 | A01 | 37 | 1 | F |
H08 | 신사임 | D03 | 95 | 1 | A |
H09 | 김유신 | E01 | 69 | 0 | D |
H10 | 윤정연 | E01 | 89 | 1 | B |
- 시험점수가 70점 이상인 학생의 이름, 시험점수, 학점을 검색함
SELECT 이름, 시험점수, 학점 FROM 학생
WHERE 시험점수 >= 70;
- 시험점수가 60점 이상이고 90점 미만인 학생 이름을 검색함
SELECT 이름 FROM 학생
WHERE 시험점수 >= 60 AND 시험점수 < 90;
- 시험점수가 60점 이상이거나 과제가 1인 학생의 이름을 검색함
SELECT 이름 FROM 학생
WHERE 시험점수 >= 60 OR 과제 = 1;
- 과제가 0 또는 1인 학생의 이름, 시험점수, 과제를 검색함
SELECT 이름, 시험점수, 과제 FROM 학생
WHERE 과제 IN(0, 1);
- 학점이 NULL인 학생의 이름과 시험점수를 검색함
SELECT 이름, 시험점수 FROM 학생
WHERE 학점 IS NULL;
- 이름이 '김'으로 시작되는 학생의 이름과 학점을 검색함
SELECT 이름, 학점 FROM 학생
WHERE 이름 LIKE '김%';
- 시험점수가 60점에서 90점 사이인 학생의 이름을 검색함
SELECT 이름 FROM 학생
WHERE 시험점수 BETWEEN 60 AND 90;
4) SELECT의 부속, 복수 질의 명령
<테이블명 : 학생>
학번 | 이름 | 학과코드 |
---|---|---|
H01 | 최성호 | A01 |
H02 | 김희정 | A02 |
H03 | 이재춘 | A01 |
H04 | 임승현 | E01 |
H05 | 김현태 | C07 |
H06 | 김유신 | C07 |
H07 | 정용조 | A01 |
H08 | 신사임 | D03 |
H09 | 김유신 | E01 |
H10 | 윤정연 | E01 |
<테이블명 : 학과>
학과코드 | 학과명 |
---|---|
A01 | 수학과 |
A02 | 물리학과 |
A03 | 화학과 |
A04 | 통계학과 |
C07 | 경제학과 |
C08 | 경영학과 |
D03 | 무역학과 |
E01 | 컴공과 |
E02 | 건축학과 |
E03 | 기계학과 |
- <학과> 테이블에서 학과명이 '수학과'를 찾아 <학생> 테이블에서 학과코드가 같은 학번과 이름을 검색함
SELECT 학번, 이름 FROM 학생 WHERE 학과코드 =
(SELECT 학과코드 FROM 학과 WHERE 학과명 = '수학과');
- <학생> 테이블의 학과코드와 <학과> 테이블의 학과코드가 'A01'로 같은 학생의 이름과 학과명을 검색함
SELECT 학생.이름, 학과.학과명 FROM 학생, 학과
WHERE 학생.학과코드 = 'A01' AND 학과.학과코드 = 'A01';
5) SELECT의 그룹 지정 명령
<테이블명 : 성적테이블>
학번 | 과목 | 학점 | 점수 |
---|---|---|---|
100 | 자료 구조 | A | 90 |
100 | 운영체제 | A | 95 |
200 | 운영체제 | B | 85 |
300 | 프로그래밍 | A | 90 |
300 | 데이터베이스 | C | 75 |
300 | 자료 구조 | A | 95 |
400 | 소프트웨어 | B | 80 |
500 | 자료 구조 | C | 75 |
500 | 운영체제 | D | 65 |
500 | 프로그래밍 | F | 54 |
- <성적테이블>의 모든 속성을 대상으로 학번에 따라 그룹지어서 학번별로 튜플의 개수를 출력함
SELECT 학번, COUNT(*) FROM 성적테이블
GROUP BY 학번;
- <성적테이블>에서 학번에 따라 그룹지어 학번별로 튜플의 개수가 3 이상인 학생의 학번과 튜플 개수를 출력함
SELECT 학번, COUNT(*) FROM 성적테이블
GROUP BY 학번 HAVING GOUNT(*) >= 3;
- <성적테이블>에서 학번 속성을 대상으로 학번에 따라 그룹지어서 학번 별로 튜플의 개수를 출력하되 튜플 개수의 속성명을 학생수로 지정함(단, 학번별로 튜플의 개수가 3이상)
SELECT 학번, COUNT(학번) AS 학생수 FROM 성적테이블
GROUP BY 학번 HAVING COUNT(학번) >= 3;
- <성적테이블>에서 학번 속성을 대상으로 학번에 따라 그룹지어서 학번별로 튜플의 개수와 점수의 평균점수를 출력하되 튜플 개수의 속성명을 학생수, 평균점수의 속성명을 평균점수로 지정함(단, 학번별로 튜플의 개수가 3 이상)
SELECT 학번, COUNT(*) AS 학생수,
AVG(점수) AS 평균점수 FROM 성적테이블
GROUP BY 학번 HAVING COUNT(학번) >= 3;
6) SELECT의 테이블 생성 명령
- SELECT의 테이블 생성 명령
- 새롭게 생성하고자 하는 테이블이 기존에 사용하고 있는 테이블과 동일한 구조를 갖고 있다면 다음과 같이 기존에 존재하는 테이블 정보를 이용하여 새로운 테이블을 만들 수 있음
- SQL문의 SELECT 부분을 통해 기존 테이블의 속성을 조회하여 신규 테이블의 속성으로 정의하여 생성하는 방식
CREATE TABLE 신규_테이블 AS SELECT * FROM 기존_테이블;
- SELECT의 테이블 생성 명령의 특징
- 생성된 테이블은 기존 테이블의 컬럼 및 데이터 유형과 길이 등을 그대로 적용함
- NOT NULL의 정의는 그대로 적용함
- 제약조건은 적용되지 않음
- ALTER TABLE을 사용하여 제약조건을 추가해야 함
- 동일한 컬럼들로 생성된 경우 '*'을 사용함
- 필요한 컬럼만을 지정하여 테이블을 생성할 수 있음