SQL 데이터
데이터의 삽입
Section titled “데이터의 삽입”데이터 조작 언어(DML)의 개념
Section titled “데이터 조작 언어(DML)의 개념”DDL로 정의된 데이터베이스 내의 테이블에 대해 CRUD 연산을 수행하기 위한 명령어의 집합
- 사용자에게 데이터베이스에 데이터 저장과 관련된 작업할 수 있게 하는 일체의 도구를 제공 대화식 질의 또는 임베디드 SQL 형식
- 정의된 테이블 등에 레코드를 삽입·수정·삭제 및 검색하는데 사용되는 SQL 명령어의 집합 종류: INSERT, UPDATE, DELETE, SELECT
DML은 실행 즉시 반영되는 영구적 변경이 아닌 복구가 가능한 명령
INSERT 명령어
Section titled “INSERT 명령어”테이블에 새로운 레코드를 삽입하는 명령어
- 모든 컬럼 또는 부분 컬럼에 대한 컬럼값을 입력
- NOT NULL, PRIMARY KEY 제약 조건이 있는 컬럼은 반드시 컬럼값을 입력
- 문자와 날짜 값은 따옴표(‘)로 처리
INSERT INTO 테이블이름 VALUES(값1, 값2, … 값n)테이블의 모든 컬럼에 값을 입력할 때 사용
INSERT INTO 테이블이름(컬럼1, 컬럼2, … 컬럼m) VALUES(값1, 값2, … 값m)원하는 컬럼만 선택해서 값을 입력할 때 사용
명시하지 않은 컬럼은 NULL 또는 DEFAULT 값이 자동 입력
컬럼 순서를 테이블 정의와 다르게 써도 됨
데이터의 수정
Section titled “데이터의 수정”UPDATE
Section titled “UPDATE”조건을 만족하는 레코드의 특정 컬럼값을 수정
UPDATE 테이블이름 SET 컬럼1=값1 [, 컬럼2=값2, … , 컬럼n=값n] [WHERE 조건]
UPDATE 테이블_이름 SET 컬럼1=수식1 [, 컬럼2=수식2, … , 컬럼n=수식n] [WHERE 조건]WHERE 특정 레코드를 선택하는 역할 ex)학과이름=‘농학과’
DELETE
Section titled “DELETE”조건에 일치하는 레코드 집합을 테이블에서 삭제할 때 사용하는 명령어
DELETE FROM 테이블이름 [WHERE 조건]UPDATE와 마찬가지로 WHERE 조건을 생략하면 테이블의 모든 레코드가 삭제되니 주의해야 한다.
다른 테이블에서 참조 중인 레코드는 외래키 제약 조건 때문에 바로 삭제가 안됨
- DML이 복구 가능한 명령인 이유 중 하나
- 데이터 무결성을 지키는 핵심 개념
데이터의 검색
Section titled “데이터의 검색”SELECT
Section titled “SELECT”- 한 개 이상의 테이블에서 주어진 조건에 만족하는 레코드를 출력하는 명령문
- 관계 대수의 셀렉트, 프로젝트, 카티션 프로덕트, 조인, 집계 함수 등의 연산 기능을 모두 포함하는 명령 SELECT 절과 부가적인 목적으로 사용하는 절을 혼합하여 검색 기능을 구체화
SELECT [DISTINCT] 컬럼1, 컬럼2, ..., 컬럼n [FROM 테이블1 [JOIN 유형 테이블2 ON 조인조건1 ... [JOIN 유형 테이블y ON 조인조건y]]] [WHERE 조건] [GROUP BY 컬럼1, 컬럼2, ...., 컬럼y [HAVING 조건]] [ORDER BY 컬럼1 [ASC|DESC], ... , 컬럼z [ASC|DESC]]실제 처리 순서는 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY 순으로 처리
단순 SELECT
Section titled “단순 SELECT”레코드를 제한하지 않고 전체 테이블을 검색하는 SELECT 문
SELECT [DISTINCT] 컬럼1, 컬럼2…, 컬럼n FROM 테이블이름
SELECT * FROM 테이블이름- WHERE 절이 없는 질의문
- DISTINCT 키워드를 통해 중복 제거 가능
ex) SELECT 학과 FROM 학생 > 결과: 컴퓨터, 컴퓨터, 수학, 수학, 수학, 영어
SELECT DISTINCT 학과 FROM 학생 > 결과: 컴퓨터, 수학, 영어 이렇게 중복 제거
조건 SELECT
Section titled “조건 SELECT”연산자와 함수를 포함하는 산술연산식을 사용한 조건을 WHERE 절에 기술하여 조건을 만족하는 레코드만 선택적으로 검색하는 SELECT 문
- 산술연산자
- 비교연산자
- 논리연산자
- 문자/숫자/날짜 함수
WHERE 절은 UPDATE, DELETE 문 등 조건을 기술하여 선택적으로 레코드에 적용하는 명령문에서 동일하게 사용
조건 표현 연산자
Section titled “조건 표현 연산자”산술연산자
- 컬럼값 또는 상수와의 산술 연산을 위한 연산자
- DIV, /, -, MOD(%), +, *
비교연산자
- 컬럼값과 상수의 크기를 비교하는 연산자
- =, <>(!=), >, >=, <, <=
논리연산자
- 두 개 이상의 조건이 기술되는 질의문에서 조건식 간의 관계를 정의하는 연산자
- AND, OR, NOT
데이터 정렬과 특수 연산자
Section titled “데이터 정렬과 특수 연산자”SELECT 명령어
Section titled “SELECT 명령어”- 한 개 이상의 테이블에서 주어진 조건에 만족하는 레코드를 출력하는 명령문
- 관계 대수의 셀렉트, 프로젝트, 카티션 프로덕트, 조인, 집계 함수 등의 연산 기능을 모두 포함하는 명령
- SELECT 절과 부가적인 목적으로 사용하는 절을 혼합하여 검색 기능을 구체화
SELECT [DISTINCT] 컬럼1, 컬럼2, ..., 컬럼n [FROM 테이블1 [JOIN 유형 테이블2 ON 조인조건1 ... [JOIN 유형 테이블y ON 조인조건y]]] [WHERE 조건] [GROUP BY 컬럼1, 컬럼2, ...., 컬럼y [HAVING 조건]] [ORDER BY 컬럼1 [ASC | DESC], ... ,컬럼z [ASC | DESC]]FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY 순으로 처리
데이터의 정렬
Section titled “데이터의 정렬”ORDER BY 절을 사용 - 검색 결과를 특정 컬럼에 대해 오름차순 또는 내림차순으로 정렬
오름차순: ASC / 내림차순: DESC
SELECT 문 형식 ORDER BY 컬럼1 [ASC | DESC], ..., 컬럼n [ASC | DESC]집합 연산자
Section titled “집합 연산자”- 테이블은 집합, 레코드는 집합에 포함된 원소의 관점
- 집합 이론에서의 이진 연산자
- 합집합: UNION
- 교집합: INTERSECT
- 차집합: EXCEPT
SELECT문1 UNION | INTERSECT | EXCEPT SELECT문2집합 연산자 사용 조건 : 테이블 R과 S의 차수 및 각 컬럼의 도메인이 일치
범위, 부분 일치 여부, 포함 여부 등 RDBMS에서 사용되도록 고안된 연산자
| 종류 | 사용 예 | 의미 |
|---|---|---|
| BETWEEN | 컬럼명 BETWEEN V1 AND V2 | 컬럼값이 V1 ~ V2 사이에 존재하는지 검사 |
| LIKE | 컬럼명 LIKE ‘V1%‘ | V1으로 시작하는 문자열 검사 |
| LIKE | 컬럼명 LIKE ‘%V1’ | V1으로 끝나는 문자열 검사 |
| LIKE | 컬럼명 LIKE ‘%V1%‘ | V1이 문자열 내부에 존재하는지 검사 |
| LIKE | 컬럼명 LIKE ‘V1_‘ | V1 뒤에 한 문자만 일치하는지 검사 |
| IN | 컬럼명 IN (V1, …, Vn) | 컬럼값이 V1, V2, …, Vn 중 하나와 일치하는지 검사 |
함수의 사용
Section titled “함수의 사용”- 특정 목적을 수행하도록 사전에 정의된 연산 및 기능을 수행한 후 결과값을 반환하는 명령어 집합
- 고도의 데이터 조작을 지원하고 SQL문 작성의 편의성을 향상
- 함수의 종류
- 내장 함수: DBMS가 제공
- 사용자 정의 함수: 사용자가 직접 정의하여 사용
- 프로그래밍 언어적 특성을 갖는 확장된 언어를 사용
- DBMS는 사용자에게 여러 형태로 사용되도록 데이터 타입별 다양한 내장 함수를 제공
삼각함수, 상수, 올림과 버림, 난수 등의 숫자 데이터 타입에 적용할 수 있는 계산을 위한 함수
| 함수명 | 의미 |
|---|---|
| ABS(X) | X의 절대값을 반환 |
| SIN(X), COS(X) 등 | X의 삼각함수 값을 반환 |
| CEILING(X), FLOOR(X) | X의 보다 크지(작지) 않은 최소(최대)의 정수 |
| PI() | 원주율(Π) 값을 반환 |
| POWER(X, Y) | 거듭제곱 X^Y의 값을 반환 |
| RAND() | 0과 1 사이의 임의의 값을 반환 |
| ROUND(X, Y) | X의 Y번째 소수점 위치의 수를 반올림 값을 반환 |
| TRUNCATE(X, Y) | X의 Y번째 소수점 이하를 버림한 값을 반환 |
| MOD(X, Y) | X를 Y로 나눈 나머지 |
SELECT 계좌번호, TRUNCATE(잔액, -5) AS 절삭잔액 FROM 계좌AS 별칭 : TRUNCATE(잔액, -5) AS 절삭잔액 → 결과 테이블에서 해당 컬럼이 절삭잔액 으로 표시됨
SELECT POWER(12.4, 2) * 3.141592 AS 원넓이, ABS(2.54E-1) AS 절댓값문자열 조작 및 문자 형식 변환 등의 문자와 관련된 다양한 연산을 지원하는 함수
| 함수명 | 의미 |
|---|---|
| ASCII(s) | 문자열 s의 맨 왼쪽 문자의 ASCII 코드 값을 반환 |
| CONCAT(s1, s2, …) | 여러 문자열을 연결하여 하나의 문자열로 반환 |
| CHAR_LENGTH(s) | 문자열 s의 전체 문자 수를 반환 |
| INSERT(s1, x, y, s2) | 문자열 s1의 x번째 문자부터 y개의 문자를 문자열 s2로 대체하여 반환 |
| REPLACE(s, s1, s2) | 문자열 s에서 부분 문자열 s1을 찾아 s2로 대체 |
| UPPER(s) | 문자열 s의 모든 문자를 대문자로 변환 |
| LOWER(s) | 문자열 s의 모든 문자를 소문자로 변환 |
| SUBSTRING(s, x, y) | 문자열 s의 x번째 위치에서 시작하여 y개의 문자를 반환 (y 생략 시 끝까지 반환) |
SELECT SUBSTRING(학생번호, 1, 6) AS 학생번호, 학생이름, CONCAT(성별, '성') AS 성별 FROM 학생학생의 학생번호, 이름, 성별 출력. 단, 학생번호는 앞 6자리만 출력하고 설명뒤에는 ‘성’ 붙이기
날짜 및 시간 데이터 타입에 적용되어 산술 연산 및 시간형 변환 등의 조작을 위한 함수
| 함수명 | 의미 |
|---|---|
| CURRENT_DATE | 시스템의 현재 날짜를 반환 |
| CURRENT_TIME | 시스템의 현재시간을 반환 |
| CURRENT_TIMESTAMP | 시스템의 현재날짜와 시간을 모두 반환 |
| EXTRACT | 날짜/시간 데이터에서 특정 단위(년, 월, 일 등)를 숫자로 추출 |
| CAST | 데이터 타입을 변환(날짜 → 문자열 등) |
| INTERVAL | 날짜 연산(더하기/빼기)을 위한 간격을 정의 |
입력된 날짜를 기준으로 연산
SELECT 학생번호, 과목코드, EXTRACT(DAY FROM (TIMESTAMP '2025-08-01 00:00:00' - 신청시각)) AS 경과일수 FROM 수강 WHERE 신청시각 BETWEEN (TIMESTAMP '2025-08-01 00:00:00' - INTERVAL '30' DAY) AND TIMESTAMP '2025-08-01 00:00:00' ORDER BY 경과일수 ASC그룹 질의문
Section titled “그룹 질의문”- 특정 컬럼에 집계함수를 통해 다양한 통계 연산을 수행할 수 있는 기능
- SELECT 절 또는 HAVING 절에 기술
- 집계 함수의 종류
COUNT: 컬럼에 있는 값들의 개수
SUM: 컬럼에 있는 값들의 합
AVG: 컬럼에 있는 값들의 평균
MAX: 컬럼에서 가장 큰 값
MIN: 컬럼에서 가장 작은 값
SELECT COUNT(단과대학) AS 단과대학수 FROM 학과특정 기준으로 레코드를 그룹화하고 각 레코드 그룹에 대해 집계 함수를 적용하는 질의
SELECT 절에 그룹의 기준과 집계 함수 이외의 컬럼은 포함 불가능
조건 그룹 질의
Section titled “조건 그룹 질의”그룹 질의의 결과 레코드에 대해 출력 조건을 기술하는 질의
SELECT 문 형식 GROUP BY 컬럼 HAVING 조건조건에 대한 기술
- WHERE: 레코드에 대한 조건을 기술
- HAVING: 집계 결과 레코드에 대한 조건을 기술
SELECT 학생번호, COUNT(*) AS 신청_전공수 FROM 전공 GROUP BY 학생번호 HAVING 신청_전공수 >= 2