728x90
반응형
📒 SQL 문법
📕 SQL 기본
1. SQL 분류
1) DML (Data Manipulation Language)
- 데이터 조작 (선택, 삽입, 수정, 삭제)
- 테이블의 행 사용
- DML을 사용하기 위해서는 그 전에 테이블 정의 필요
- 트랜잭션 발생하는 SQL
- 종류
- SELECT
- INSERT
- UPDATE
- DELETE
2) DDL (Data Definition Language)
- 데이터베이스, 테이블, 뷰, 인덱스 등 데이터베이스 개체를 생성/삭제/변경하는 역할
- 트랜잭션을 발생하지 않음
- 되돌림(ROLLBACK), 완전 적용(COMMIT) 시킬 수 없음
- 실행 즉시 MySQL에 적용됨
- 종류
- CREATE
- DROP
- ALTER
3) DCL (Data Control Language)
- 사용자에게 어떤 권한을 부여하거나 빼앗을 때 사용
- 종류
- GRANT
- REVOKE
- DENY
2. CREATE문
-- 회원 테이블 생성
CREATE TABLE usertbl (
userID char(8) not null primary key, -- 사용자 아이디(PK)
name varchar(10) not null, -- 이름
birthYear int not null, -- 출생년도
addr char(2) not null, -- 지역경기, 서울, 경남 식으로 2글자만 입력
mobile1 char(3), -- 휴대폰의 국번 (011, 016, 017, 018, 019, 010 등)
mobile2 char(8), -- 휴대폰의 나머지 전화번호 (하이픈 제외)
height smallint, -- 키
mDate date -- 회원 가입일
);
-- 회원 구매 테이블 생성
CREATE TABLE buytbl (
num int auto_increment not null primary key,
userID char(8) not null,
prodName char(8) not null,
groupName char(4),
price int not null,
amount smallint not null,
FOREIGN KEY(userID) REFERENCES usertbl(userID)
);
3. SELECT문
- 데이터베이스 내의 테이블에서 원하는 정보를 추출
1) SELECT 구문 형식
SELECT select_expr
[FROM table_references]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}]
2) SELECT 구문 상세
SELECT
[ALL | DISTINCT | DISTINCTROW]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT][SQL_BIG_RESULT][SQL_BUFFER_RESULT]
[SQL_NO_CACHE][SQL_CALC_FOUND_ROWS]
select_expr [, select expr ...]
[FROM table_references]
[PARTITION partition_list]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
[HAVING where_condition]
[WINDOW window_name AS (window_spec)
[, window_name AS (window_spec) ...]
[ORDER BY {col_name | expr | position} [ASC|DESC], ... [WITH ROLLUP]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[INTO OUTFILE 'file_name'
| CHARACTER SET charset_name] export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name]]
[FOR {UPDATE | SHARE} [OF tbl_name [, tbl_name] ...] [NOWAIT|SKIP LOCKED] | LOCK IN SHARE MODE]]
3) WHERE절
- 기본적인 WHERE절
SELECT 필드 이름 FROM 테이블 이름 WHERE 조건식;
- 연산자의 사용
- 조건 연산자 (=, <, <=, >, >=, != 등)
- 관계 연산자 (AND, OR, NOT)
SELECT userID, Name FROM usertbl WHERE birthYear >= 1970 AND height >= 182;
- BETWEEN, IN(), LIKE
- BETWEEN : 연속적인 값 검색
- IN : 이산적인 값 검색
- LIKE : 문자열 내용 검색 (% 무엇이든 허용, _ 한글자 매치)
-- BETWEEN ... AND
SELECT name, height FROM usertbl WHERE height BETWEEN 180 AND 183;
-- IN()
SELECT name, addr FROM usertbl WHERE addr IN ('경남', '전남', '경북');
-- LIKE
SELECT name, height FROM uertbl WHERE name LIKE '김%';
- ANY/ALL/SOME, 서브쿼리
- ANY : 서브쿼리의 여러 개의 결과 중 한가지만 만족해도 됨
- =ANY는 IN과 동일
- ALL
- SOME : ANY와 동일
- ANY : 서브쿼리의 여러 개의 결과 중 한가지만 만족해도 됨
SELECT name, height
FROM usertbl
WHERE height > (SELECT height FROM usertbl WHERE name = '김경호');
-- 하위 쿼리가 2 이상의 값을 반환하여 오류 발생
select name, height
from usertbl
where height >= (
select height
from usertbl
where addr='경남'
);
-- ANY (하위 조건 - 키가 170보다 크거나 같은 사람)
select name, height
from usertbl
where height >= ANY (
select height
from usertbl
where addr='경남'
);
-- ALL (상위 조건 - 키가 173보다 크거나 같은 사람)
select name, height
from usertbl
where height >= ALL (
select height
from usertbl
where addr='경남'
);
4) ORDER BY
- 원하는 순서대로 정렬하여 출력
- 기본적으로 오름차순(ASC) 출력, 내림차순(DESC) 정렬시 뒤에 작성
SELECT name, mDate FROM usertbl ORDER BY mDate DESC;
5) DISTINCT
- 중복된 것을 하나만 남김
SELECT DISTINCT addr FROM usertbl;
6) LIMIT
- 출력 개수 제한
SELECT emp_no, hire_date FROM employees
ORDER BY hire_date ASC
LIMIT 5;
7) GROUP BY절
- 형식
SELECT 컬럼명
[FROM table_references]
[WHERE where_condition]
[GROUP BY {col_name|expr|position}]
[HAVING where_condition]
[ORDER BY {col_name|expr|position}]
- 집계 함수
- AVG() : 평균
- MIN() : 최소값
- MAX() : 최대값
- COUNT() : 행의 개수 (중복 제외 COUNT(DISTINCT))
- STDEV() : 표준편차
- VAR_SAMP() : 분산
8) HAVING절
- 집계 함수는 WHERE절에 사용할 수 없음
- WHERE절 처럼 조건을 제한하고, GROUP BY절 다음에 사용
SELECT userID AS '사용자', SUM(price * amount) AS '총구매액'
FROM buytbl
GROUP BY userID
HAVING SUM(price*amount) > 1000;
9) ROLLUP
- 분류별로 합계 및 총합 구하기
- GROUP BY절과 함께 사용
SELECT num, groupName, SUM(price * amount) AS '비용'
FROM buytbl
GROUP BY groupName, num
WITH ROLLUP;
4. INSERT문
- INSERT 구문 형식
- 테이블명 다음에 나오는 열은 생략 가능 (단, 테이블에 정의된 열 순서 및 개수 동일해야 함)
- 입력할 열의 목록 나열
- 입력하지 않으면 NULL 삽입
INSERT [INTO] 테이블[(열1, 열2, ...)] VALUES(값1, 값2, ...)
- IGNORE
- 입력시 데이터가 중복되어 입력되지 않는 오류 무시하고 넘어감
INSERT IGNORE INTO memberTBL VALUES ('BBK', '비비코', '미국');
- ON DUPLICATE KEY UPDATE
- PK가 중복되지 않으면 INSERT
- PK가 중복되면 UPDATE문 수행
INSERT INTO memberTBL VALUES ('BBK', '비비코', '미국')
ON DUPLICATE KEY UPDATE name='비비코', addr='미국';
- AUTO_INCREMENT
- 자동으로 1부터 증가하는 값 입력 (데이터 형은 숫자 형식만 사용 가능)
- 지정시 PRIMARY KEY 또는 UNIQUE 지정 필요
- INSERT에서 해당 열 입력하지X, NULL값 지정하면 자동으로 값 입력됨
CREATE TABLE testTBL2 (
id int AUTO_INCREMENT PRIMARY KEY,
userName char(3),
age int);
INSERT INTO testTBL2 VALUES (NULL, '지민', 22);
-- 마지막에 입력된 값 확인
SELECT LAST_INSERT_ID();
-- AUTO_INCREMENT 입력값 변경
ALTER TABLE testTBL2 AUTO_INCREMENT=100;
-- AUTO_INCREMENT 증가값 변경 (서버 변수 변경)
SET @@auto_increment_increment=3;
- 대량의 샘플 데이터 생성
INSERT INTO 테이블 이름(열 이름1, 열 이름2, ...)
SELECT문;
-- employees 데이터 복사
CREATE TABLE testTBL4 (id int, Fname varchar(50), Lname varchar(50));
INSERT INTO testTBL4
SELECT emp_no, first_name, last_name
FROM employees.employees;
5. UPDATE문
- UPDATE 구문 형식
- WHERE절 생략시 테이블의 전체 행 변경됨
UPDATE 테이블 이름
SET 열1 = 값1, 열2 = 값2, ...
WHERE 조건;
6. DELETE문
- DELETE 구문 형식
- WHERE절이 생략되면 전체 데이터 삭제
DELETE FROM 테이블 이름 WHERE 조건;
- 테이블 삭제
- DELETE
- 트랜잭션 로그를 기록하는 작업으로 삭제 오래 걸림
- DROP
- 테이블 자체 삭제 (구조도 삭제)
- 트랜잭션 발생X
- TRUNCATE
- DELETE와 기능 동일하지만, 트랜잭션 로그를 기록하지 않아 속도 빠름
- 테이블 구조는 남겨놓고 싶을 경우
- DELETE
DELETE FROM 테이블명;
DROP TABLE 테이블명;
TRUNCATE TABLE 테이블명;
7. WITH절과 CTE
1) WITH절
- CTE(Common Table Extension)를 표현하기 위한 구문
- CTE
- 기존의 뷰, 파생 테이블, 임시 테이블 등으로 사용되던 것을 대신함
- 비재귀적/재귀적 CTE로 분류
2) 비재귀적 CTE
- 복잡한 쿼리 문장을 단순화 시키는데 적합함
WITH CTE_테이블이름(열이름)
AS
(
<쿼리문>
)
SELECT 열이름 FROM CTE_테이블이름;
- 💡 참고
- USE
- 사용할 데이터베이스 지정
- USE 데이터베이스_이름;
- SHOW
- 현재 서버에 존재하는 데이터베이스/테이블 정보 조회
- SHOW DATABASES; SHOW TABLE;
- DESCRIBE (DESC)
- 테이블 정보 확인
- DESCRIBE 테이블명; DESC 테이블명;
- 테이블 복사
- PK, FK 등 제약조건은 복사되지 않음
- CREATE TABLE buytbl2 (SELECT * FROM buytbl);
- 트랜잭션
- 테이블의 데이터를 변경(입력/수정/삭제) 할 때 실제 테이블에 완전히 적용X
- 임시로 적용시키는 것
- 실수가 발생할 경우 취소 가능
- USE
📕 SQL 고급
1. MySQL의 데이터 형식
1) 데이터 형식
- 숫자 데이터 형식
- BIT(N) : N/8 바이트
- TINYINT : 1 바이트
- SMALLINT : 2 바이트
- MEDIUMINT : 3 바이트
- INT / INTEGER : 4 바이트
- BIGINT : 8 바이트
- FLOAT : 4 바이트
- DOUBLE / REAL (m, [d]) : 8 바이트
- DECIMAL / NUMBERIC (m, [d]) : 5 ~ 17 바이트
- 정수 (UNSIGNED - 부호 없음)
- 문자 데이터 형식
- CHAR(n) : 1 ~ 255
- VARCHAR(n) : 1 ~ 65535
- BINARY(n) : 1 ~ 255
- VARBINARY(n) : 1 ~ 255
- TINYTEXT(n) : 1 ~ 255
- TEXT(n) : 1 ~ 65535
- MEDIUMTEXT(n) : 1 ~ 16777215
- LONGTEXT(n) : 1 ~ 4294967295
- TINYBLOB(n) : 1 ~ 255
- BLOB(n) : 1 ~ 65535
- MEDIUMBLOB(n) : 1 ~ 16777215
- LONGBLOB(n) : 1 ~ 4294967295
- ENUM(값) : 1 또는 2
- SET(값) : 1, 2, 3, 4, 8
- 고정길이 문자형
- 날짜와 시간 데이터 형식
- DATE : 3 바이트 (’YYYY-MM-DD’)
- TIME : 3 바이트 (’HH:MM:SS’)
- DATETIME : 8 바이트 (’YYYY-MM-DD HH:MM:SS’)
- TIMESTAMP : 4 바이트 (’YYYY-MM-DD HH:MM:SS’)
- YEAR : 1 바이트 (’YYYY’)
- 기타 데이터 형식
- GEOMETRY : N/A (공간 데이터 형식으로 선, 점 및 다각형 같은 공간 데이터 개체 저장하고 조작)
- JSON : 8 바이트 (JavaScript Object Notation 문서 저장)
2) 변수
- @변수명
- 전역 변수
- DECLARE 변수명
- 지역 변수
- 스토어드 프로시저나 함수 안에서 변수명만 사용하여 선언
SET @변수 이름 = 변수의 값; -- 변수의 선언 및 값 대입
SELECT @변수 이름; -- 변수의 값 출력
3) 데이터 형 변환
- 명시적인 변환
CAST( expression AS 데이터형식 [길이] )
CONVERT( expression, 데이터형식 [길이] )
- 임시적인 변환
SELECT '100' + '200'; -- 문자와 문자를 더함 (정수로 변환되어 연산)
SELECT CONCAT('100', '200'); -- 문자와 문자를 연결 (문자로 처리)
SELECT CONCAT(100, '200'); -- 정수와 문자를 연결 (정수가 문자로 변환되어 처리)
SELECT 1 > '2mega'; -- 정수인 2로 변환되어 비교
SELECT 0 = 'mega2'; -- 문자는 0으로 변환됨
4) MySQL 내장 함수
- 제어 흐름 함수
- IF(수식, 참, 거짓)
- IFNULL(수식1, 수식2)
- NULLIF(수식1, 수식2)
- CASE ~ WHEN ~ ELSE ~ END
SELECT IF (100 > 200, '참', '거짓');
SELECT IFNULL(NULL, '널'); -- 수식1이 NULL이 아니면 수식1 반환, NULL이면 수식2 반환
SELECT NULLIF(100, 200); -- 같으면 NULL 반환, 다르면 수식1(100) 반환
SELECT CASE 10
WHEN 1 THEN '일'
WHEN 5 THEN '오'
WHEN 10 THEN '십'
ELSE '모름'
END AS 'CASE연습';
- 문자열 함수
- ASCII(아스키 코드), CHAR(숫자)
- BIT_LENGTH(문자열), CHAR_LENGTH(문자열), LENGTH(문자열)
- CONCAT(문자열1, 문자열2, …), CONCAT_WS(구분자, 문자열1, 문자열2, …)
- ELT(위치, 문자열1, 문자열2, …)
- FIELD(찾을 문자열, 문자열1, 문자열2, …)
- FIND_IN_SET(찾을 문자열, 문자열 리스트)
- INSTR(기준 문자열, 부분 문자열)
- LOCATE(부분 문자열, 기준 문자열)
소수점 표현SELECT ASCII('A'), CHAR(65); SELECT BIT_LENGTH('abc'), CHAR_LENGTH('abc'), LENGHT('abc'); SELECT CONCAT_WS('/', '2025', '01', '01'); SELECT ELT(2, '하나', '둘', '셋'), -- 위치 번째에 해당하는 문자열 반환 FIELD('둘', '하나', '둘', '셋'), -- 찾을 문자열의 위치 반환 (없으면 0 반환) FIND_IN_SET('둘', '하나,둘,셋'), -- 찾을 문자열을 문자열 리스트에서 찾아서 위치 반환 (콤마(,)로 구분, 공백없음) INSTR('하나둘셋', '둘'), -- 기준 문자열에서 부분 문자열을 찾아서 시작 위치를 반환 LOCATE('둘', '하나둘셋'); -- INSTR()와 동일하지만 파라미터의 순서만 반대
- FORMAT(숫자, 소숫점 자릿수)
- BIN(숫자), HEX(숫자), OCT(숫자)
- INSERT(기준 문자열, 위치, 길이, 삽입할 문자열)
- LEFT(문자열, 길이)
- RIGHT(문자열, 길이)
- SUBSTRING(문자열, 시작위치, 길이), SUBSTRING(문자열 FROM 시작위치 FOR 길이)
- SUBSTRING_INDEX(문자열, 구분자, 횟수)
대/소문자 변경SELECT FORMAT(123456.789, 4); -- 1000 단위마다 콤마(,) 표시 SELECT BIN(31), HEX(31), OCT(31); -- 2진수, 16진수, 8진수 값 반환 SELECT INSERT('abcdefghi', 3, 4, '@@@@'); SELECT LEFT('abcdefghi', 3), SUBSTRING('대한민국', 3, 2), SUBSTRING_INDEX('cafe.naver.com', '.', 2); -- 구분자가 횟수 번째 나오면 나머지 버림
- UPPER(문자열)
- LOWER(문자열)
- LPAD(문자열, 길이, 채울 문자열)
- RPAD(문자열, 길이, 채울 문자열)
- LTRIM(문자열)
- RTRIM(문자열)
- TRIM(문자열)
- TRIM(방향 ‘자를 문자열' FROM 문자열)
문자열 반복SELECT LOWER('abcdEFGH'); SELECT LPAD('여기에', 6, '붙이기'); SELECT LTRIM(' 공백제거'), -- 중간의 공백은 제거되지 않음 TRIM(' 공백제거 '), -- 앞뒤 공백 제거 TRIM(LEADING 'ㅋ' FROM ' ㅋㅋ제거ㅋㅋ '); -- 자를 문자열 제거 -- 방향 : LEADING(앞), BOTH(양쪽), TRAILING(뒤)
- REPEAT(문자열, 횟수)
- REPLACE(문자열, 원래 문자열, 바꿀 문자열)
- REVERSE(문자열)
- SPACE(길이)
SELECT REPEAT('ABC', 3); SELECT REPLACE('AAABCDE', 'AAA', 'ZZZ'); SELECT REVERSE('ABCDE'); SELECT CONCAT('이것이', SPACE(10), 'MySQL'); -- 길이만큼의 공백 반환
- 수학 함수
- ABS(숫자)
- ACOS(숫자), ASIN(숫자), ATAN(숫자), ATAN2(숫자1, 숫자2)
- SIN(숫자)
- COS(숫자)
- TAN(숫자)
- CEILING(숫자)
- FLOOR(숫자)
- ROUND(숫자)
- TRUNCATE(숫자, 정수)
- CONV(숫자, 원래 진수, 변환할 진수)
- DEGREES(숫자)
- RADIANS(숫자)
- PI()
- EXP(X)
- LN(숫자)
- LOG(숫자), LOG(밑수, 숫자), LOG2(숫자), LOG10(숫자)
나머지SELECT ABS(-100); SELECT CEILING(4.7); SELECT CONV('AA', 16, 2); SELECT DEGREES(PI()); -- PI() : 파이값인 3.141592 반환 SELECT TRUNCATE(12345.67, 2); -- 소수점 기준으로 정수 위치까지 구하고 나머지 버림
- MOD(숫자1, 숫자2)
- 숫자1 % 숫자2
- 숫자1 MOD 숫자2
- POW(숫자1, 숫자2)
- SQRT(숫자)
- RAND()
- FLOOR(m + (RAND() * (n - m)))
- SIGN(숫자)
SELECT MOD(157, 10); SELECT POW(2, 3), SQRT(9); SELECT RAND(), -- 0 이상 1 미만의 실수 FLOOR(1 + (RAND() * (7 - 1))); -- m <= 임의의 정수 < n SELECT SIGN(100);
- 절대값
- 날짜 및 시간 함수
- ADDDATE(날짜, 차이), SUBDATE(날짜, 차이)
- ADDTIME(날짜/시간, 시간), SUBTIME(날짜/시간, 시간)
- MAKEDATE(연도, 정수)
- MAKETIME(시, 분, 초)
- CURDATE(), CURTIME()
- NOW(), SYSDATE()
- YEAR(날짜), MONTH(날짜), DAY(날짜)
- HOUR(시간), MINUTE(시간), SECOND(시간), MICROSECOND(시간)
- DATE()
- TIME()
- DATEDIFF(날짜1, 날짜2), TIMEDIFF(시간1, 시간2)
- DAYOFWEEK(날짜), MONTHNAME(), DAYOFYEAR(날짜)
- LAST_DAY(날짜)
- PERIOD_ADD(연월, 개월수), PERIOD_DIFF(연월1, 연월2)
- QUARTER(날짜)
- TIME_TO_SEC(시간)
SELECT ADDDATE('2025-01-01', INTERVAL 31 DAY), -- 31일 후 날짜 반환 ADDTIME('2025-01-01 23:59:59', '1:1:1'), -- 1시간 1분 1초 후 반환 MAKEDATE(2025, 32), -- 2025년의 32일 지난 날짜 반환 MAKETIME(12, 11, 10); -- '12:11:10' 반환 SELECT CURDATE(), -- 현재 '연-월-일' CURTIME(), -- 현재 '시:분:초' NOW(); -- SYSDATE()와 동일 (현재 '연-월-일 시:분:초') SELECT DAY(); -- DAYOFMONTH()와 동일 SELECT DATEDIFF('2025-01-01', NOW()), -- (날짜1-날짜2)의 일수를 경과로 반환 DAYOFWEEK(CURDATE()), -- 1년 중 몇 번째 날짜인지 구함 LAST_DAY('2025-02-01'), -- 주어진 날짜의 마지막 날짜 구함 PERIOD_ADD(202501, 11), -- 연월에서 개월만큼 지난 연월 반환 PERIOD_DIFF(202501, 202312), -- (연월1-연월2)의 개월 수 QUARTER('2025-07-07'), -- 날짜 분기 TIME_TO_SEC('12:11:10'); -- 시간 초 단위 구함
- 날짜/시간 연산
- 시스템 정보 함수
- USER()
- DATABASE()
- FOUND_ROWS()
- ROW_COUNT()
- VERSION()
- SLEEP(초)
SELECT CURRENT_USER(), -- 현재 사용자 DATABASE(); -- 현재 선택된 데이터베이스 SELECT * FROM usertbl; SELECT FOUND_ROWS(); -- SELECT문에서 조회된 행의 개수 UPDATE usertbl SET price=price * 2; SELECT ROW_COUNT(); -- 입력/수정/삭제된 행의 개수
- 사용자/데이터베이스 정보
2. 조인
1) INNER JOIN (내부 조인)
- JOIN일 경우 INNER JOIN 의미
SELECT <열 목록>
FROM <첫 번째 테이블>
INNER JOIN <두 번째 테이블>
ON <조인될 조건>
[WHERE 검색조건];
2) OUTER JOIN (외부 조인)
- 조인의 조건에 만족되지 않는 행까지 포함시키는 것
SELECT <열 목록>
FROM <첫 번째 테이블>
<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블>
ON <조인될 조건>
[WHERE 검색조건];
3) CROSS JOIN (상호 조인)
- 한쪽 테이블의 모든 행들과 다른 쪽 테이블의 모든 행을 조인시키는 기능
- 결과 개수 : 두 테이블 개수를 곱한 개수
- ON 구문 사용X
- 테스트로 사용할 많은 용량의 데이터를 생성할 때 주로 사용
SELECT *
FROM <첫 번째 테이블>
CROSS JOIN <두 번째 테이블>
4) SELF JOIN (자체 조인)
- 자기 자신과 자기 자신이 조인함
SELECT <열 목록>
FROM <테이블>
INNER JOIN <테이블>
ON <조인될 조건>
[WHERE 검색조건];
5) UNION / UNION ALL / NOT IN / IN
- UNION
- 두 쿼리의 결과를 행으로 합치는 것
- UNION : 중복된 열은 제거, 데이터 정렬
- UNION ALL : 중복된 열까지 모두 출력
SELECT 문장1
UNION [ALL]
SELECT 문장2
- IN
- 쿼리의 결과 중에서, 다음 쿼리에 해당하는 것만 포함/제외하는 것
- IN : 첫 번째 쿼리의 결과 중에서, 두 번째 쿼리에 해당하는 것만 조회
- NOT IN : 첫 번째 쿼리의 결과 중에서, 두 번째 쿼리에 해당하는 것을 제외
SELECT <열 목록> FROM <테이블> WHERE <열 이름> [NOT] IN (SELECT문);
3. SQL 프로그래밍
- 스토어드 프로시저 생성/실행
DELIMITER $$
CREATE PROCEDURE 스토어드 프로시저 이름()
BEGIN
// SQL 프로그래밍 코딩
END $$
DELIMITER ;
CALL 스토어드 프로시저 이름();
1) IF … ELSE
- 조건에 따라 분기
- 한 문장 이상이 처리되어야 할 때는 BEGIN .. END로 함께 묶기
IF <부울 표현식>
THEN
SQL 문장들1
ELSE
SQL 문장들2
END IF;
2) CASE
- 다중 분기
- 조건에 맞는 WHEN이 여러 개일 경우, 먼저 조건이 만족하는 WHEN 먼저 처리 후 CASE 종료
CASE
WHEN <부울 표현식> THEN
SQL 문장들1
ELSE
SQL 문장들2
END CASE;
3) WHILE / ITERATE / LEAVE
- 해당 <부울 식>이 참인 동안에 계속 반복되는 반복문
- ITERATE
- CONTINUE와 비슷한 역할
- WHILE문의 조건문으로 바로 이동
- LEAVE
- BREAK문과 비슷한 역할
- WHILE문을 빠져 나옴
WHILE <부울 식> DO
SQL 문장들
END WHILE;
4) 오류 처리
- 액션
- 오류 발생 시에 행동을 정의
- CONTINUE (‘처리할 문장’ 처리) / EXIT
- 오류 조건
- 어떤 오류를 처리할 것인지 지정
- MySQL 오류 코드 숫자 / SQLSTATE ’상태코드’ / SQLEXCEPTION / SQLWARNING / NOT FOUND
- 처리할 문장
- 여러 개인 경우 BEGIN … END 묶어주기
DECLARE 액션 HANDLER FOR 오류조건 처리할_문장;
728x90
반응형
'BE > SQL' 카테고리의 다른 글
6. 스토어드 프로그램 (0) | 2025.04.09 |
---|---|
5. 인덱스 (0) | 2025.04.09 |
4. 테이블과 뷰 (0) | 2025.04.09 |
2. MySQL 유틸리티 (0) | 2025.04.09 |
1. MySQL 설치 (0) | 2025.04.09 |