본문 바로가기
BE/SQL

3. SQL 문법

by soohykim 2025. 4. 9.
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와 동일
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 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
      • 임시로 적용시키는 것
      • 실수가 발생할 경우 취소 가능

📕 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
    최대 64개 중 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(숫자)
    0 이상 1 미만 실수
    • 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()
    MySQL 버전
    • 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