조인
- 두 개 이상의 테이블을 묶어 연관된 데이터를 가지고 오는 것.
내부 조인(INNER JOIN)
- 가장 많이 사용
- 교집합으로 두 키 값이 매칭 될 경우 선택된 모든 열을 출력하는 방법
- 일반적으로 JOIN 은 내부 조인
- FROM 테이블1
INNER JOIN 테이블2 ON 조건
: 조건에 맞춰 테이블1과 테이블2를 합치는 것
SELECT <열목록>
FROM <첫번쨰table>
INNER JOIN <두번째table>
ON <조인될조건>
[WHERE 검색조건]
USE ssdb;
SELECT U.userID, U.userName, B.prodName, CONCAT(U.mobile1, U.mobile2) AS '핸드폰번호'
FROM userT U
INNER JOIN buyT B ON U.userID = B.userID
ORDER BY U.userID;
- 관계형성이 (외래키로 인하여) 되어야만 INNER JOIN 가능 -> 자식쪽 userID가 삭제됨(중복이니까)
USE sqlDB;
SELECT DISTINCT U.userID, U.userName, U.addr
FROM usertbl U
INNER JOIN buytbl B ON U.userID = B.userID
ORDER BY U.userID;
- SELECT문에 DISTINCT를 사용하여 중복을 없애준다.(회원 명단을 간단히하는데 사용)
- 3개 테이블 조인 : 다대다 관계. 두 테이블 사이에 연결 테이블을 두어서 1:N 조인을 할 수 있도록 처리
결국 2번의 내부 조인
외부 조인(OUTER JOIN)
- 내부조인에서 추가로 조인 조건을 만족하는 row와 만족하지 않는 row까지 가지고 오는 방법 (합집합)
SELECT <열 목록>
FROM <첫번째테이블(LEFT테이블)>
<LEFT | RIGHT | FULL> OUTER JOIN <두번째테이블(RIGHT테이블)>
ON <조인조건>
[WHERE 검색조건] ;
- LEFT, RIGHT, FULL
- LEFT OUTER JOIN : 왼쪽 테이블의 데이터를 기준으로 키 값에 맞는 오른쪽 테이블에 있는 데이터를 붙여 데이터를 출력
- RIGHT OUTER JOIN은 오른쪽 테이블을 기준으로 왼쪽 테이블의 데이터가 붙도록 출력
- FULL OUTER JOIN은 두 테이블의 합집합과 같으며 왼쪽 테이블과 오른쪽 테이블의 모든 열들을 나열하여 출력
UNION예약어로 FULL JOIN
스토어드 프로시저
DELIMITER $$
CREATE PROCEDURE 스토어드프로시저이름()
BEGIN
SQL코딩...
END $$
DELIMITER ;
CALL 스토어드프로시저이름() ;
- DELIMITER $$ ~ END $$까지 코딩할 부분..
- 문의끝(종료문자)를 $$로 설정하여 구별 편하게한것
- 프로시저 안에서 변수선언은 '@' 없이 DECLARE로 대체하여 진행.
IF ... ELSE ...
- bool표현식에 따라 분기
IF <bool표현식> THEN
SQl문1...
ELSE
SQL문2...
END IF;
- 한 문장 이상이 처리되어야 할 때는 BEGIN... END와 함께 묶어줄 것
- IF로 열면 반드시 END IF;로 닫아주어야 한다.
DROP PROCEDURE IF EXISTS proFunc;
DELIMITER $$
CREATE PROCEDURE proFunc()
BEGIN
DECLARE var1 INT; -- var1 변수선언
SET var1 = 10; -- 변수에 값 대입
IF var1 = 10 THEN -- 만약 @var1이 10이라면,
SELECT '10!!!';
ELSE
SELECT '10이 아님';
END IF;
END $$
DELIMITER ;
CALL proFunc();
- 다중if-else구문에서 elseif는 붙여서 사용하기 IF... THEN... ELSEIF... THEN... ... END IF;
CASE문
DROP PROCEDURE IF EXISTS caseProc;
DELIMITER $$
CREATE PROCEDURE caseProc()
BEGIN
DECLARE POINT INT;
DECLARE credit CHAR(1);
SET POINT = 77;
CASE
WHEN POINT >= 90 THEN
SET credit = 'A';
WHEN POINT >= 80 THEN
SET credit = 'B';
WHEN POINT >= 70 THEN
SET credit = 'C';
WHEN POINT >= 60 THEN
SET credit = 'D';
ELSE
SET credit = 'F';
END CASE;
SELECT CONCAT('취득점수 : ', POINT), CONCAT('학점 : ', credit);
END $$
DELIMITER ;
CALL caseProc();
- CASE WHEN ... THEN ... ... ELSE ... END CASE;
WHILE 문
- bool식이 true이면 계속 반목.
WHILE <bool식> DO
SQL문...
END WHILE;
- ITERATE문 : CONTINUE
- LEAVE문 : BREAK
오류처리
DECLARE 액션 HANDLER FOR 오류조건 처리할문장 ;
- 액션 : 오류 발생 시의 행동 정의
CONTINUE와 EXIT 둘 중 하나 사용
CONTINUE가 나오면 제일 뒤 처리할문장 이 처리된다.
- 오류조건 : 어떤 오류를 처리?
MariaDB의 오류코드숫자
SQLSTATE '상태코드' -> 5자리의 문자열
SQLEXCEPTION : 대부분의 오류
SQLWARNING : 경고 메세지
NOT FOUND : 커서나 SELECT ... INTO에서 발생
- 처리할문장 : 문장이 여러개면 BEGIN ... END로 묶어준다.
SHOW ERRORS문 : 오류에 대한 코드와 메세지 출력
ROLLBACK : 진행중인 작업 취소
COMMIT 은 작업 완전히 확정
동적 SQL
- 미리 쿼리문을 준비하고, 나중에 실행
- PREPARE : 미리준비
- EXECUTE : 준비한 쿼리 실행
- DEALLOCATE PREFARE : 실행하고 문장 해제
'MariaDB' 카테고리의 다른 글
MariaDB#15 : 뷰View (221229)8 (0) | 2022.12.29 |
---|---|
MariaDB#10 : 데이터형, 형변환, 내장함수, 변수, 테이블, SQL(221229)7 (0) | 2022.12.29 |
MariaDB#9 : SQL - DDL, DML, DCL(221228)6 (0) | 2022.12.28 |
MariaDB#8 : HeidiSQL 살펴보기, 주석(221228)5 (0) | 2022.12.28 |
MariaDB#7 : 모델링 (221228)4 (0) | 2022.12.28 |
댓글