데이터베이스

데이터 베이스 MySQL 3

eunjineee 2024. 2. 3. 14:27

데이터와 대용량 데이터 저장

JSON

JSON_OBJECT( )

JSON_ARRAY( )

SELECT JSON_OBJECT('NAME',NAME,'HEIGHT',HEIGHT) AS 'JSON 값'
FROM USERTBL
WHERE HEIGHT > 180;
SET @JSON='{"userTBL" : 
[
	{"NAME":"강호동","HEIGHT":182},
	{"NAME":"이휘재","HEIGHT":180},
	{"NAME":"남희석","HEIGHT":180},
	{"NAME":"박수홍","HEIGHT":183}
    ]
}';

SELECT JSON_VALID(@JSON) AS JSON_VALID;
SELECT JSON_SEARCH(@JSON, 'ONE', '남희석') AS JSON_SEARCH;
SELECT JSON_EXTRACT(@JSON, '$.userTBL[2].NAME') AS JSON_EXTRACT;
SELECT JSON_INSERT(@JSON, '$.userTBL[0].MDATE','2019-09-09') AS JSON_INSERT;
SELECT JSON_REPLACE(@JSON, '$.userTBL[0].NAME','토마스') AS JSON_REPLACE;
SELECT JSON_REMOVE(@JSON, '$.userTBL[0]') AS JSON_REMOVE;

대용량 데이터 저장

LONG TEXT, LONG BLOB

영화사같은데서 많이 사용함

일반적인 회사에서는 사용하지 않는편

JOIN

2개 이상의 테이블을 묶어서 하나의 결과 테이블을 만드는 것

일대다 관계

  • 한쪽 테이블에는 하나의 값만 존재하고 그 값과 대응되는 다른 쪽 테이블의~

INNER JOIN

SELECT 열목록
	FROM 첫번째테이블
	INNER JOIN 두번째 테이블
		ON 조인될 조건
[WHERE 검색조건]
//동일한 결과

SELECT DISTINCT 열목록
	FROM 첫번째테이블 별칭1
	INNER JOIN 두번째 테이블 별칭2
		ON 조인될 조건 (별칭1.열 = 별칭2.열)
[WHERE 검색조건]

SELECT 열목록
	FROM 첫번째테이블 별칭1
	WHERE EXISTS(
		SELECT
		FROM
		WHERE
)

다대다 관계 (MANY-TO -MANY)

연결 테이블과 두 테이블이 일대다 관계를 맺도록 구성

SELECT S.STDNAME, S.ADDR, C.CLUBNAME, C.ROOMNO
	FROM STDTBL S
		INNER JOIN STDCLUBTBL SC
			ON S.STDNAME = SC.STDNAME
		INNER JOIN CLUBTBL C
			ON SC.CLUBNAME = C.CLUBNAME
	ORDER BY S.STDNAME;

>>>
STDNAME, ADDR, CLUBNAME, ROOMNO
강호동, 경북, 바둑, 102호
강호동, 경북, 축구, 103호
김용만, 서울, 축구, 103호
박수홍, 서울, 봉사, 104호
이휘재, 경기, 봉사, 104호
이휘재, 경기, 축구, 103호

OUTER JOIN

조인조건을 만족하지 않는 행까지 포함하여 출력하는 조인

SELECT 열목록
	FROM 첫번째테이블
	<LEFT/RIGHT> OUTER JOIN 두번째 테이블
		ON 조인될 조건
[WHERE 검색조건]
USE MYDB;
SELECT U.USERiD, U.NAME, B.PRODNAME, U.ADDR, CONCAT(U.MOBILE1, U.MOBILE2) AS '연락처'
	FROM USERTBL U
	LEFT OUTER JOIN BUYTBL B
		ON U.USERID=B.USERID;

#검색조건 추가
SELECT U.USERiD, U.NAME, B.PRODNAME, U.ADDR, CONCAT(U.MOBILE1, U.MOBILE2) AS '연락처'
	FROM USERTBL U
	LEFT OUTER JOIN BUYTBL B
		ON U.USERID=B.USERID
WHERE B.PRODNAME IS NULL
ORDER BY U.USERID;

UNION

SELECT ~
UNION
SELECT ~ ;
SELECT S.STDNAME, S.ADDR, C.CLUBNAME, C.ROOMNO
	FROM STDTBL S
		LEFT OUTER JOIN STDCLUBTBL SC
			ON S.STDNAME = SC.STDNAME
		LEFT OUTER JOIN CLUBTBL C
			ON SC.CLUBNAME = C.CLUBNAME
UNION
SELECT S.STDNAME, S.ADDR, C.CLUBNAME, C.ROOMNO
	FROM STDTBL S
		LEFT OUTER JOIN STDCLUBTBL SC
			ON S.STDNAME = SC.STDNAME
		RIGHT OUTER JOIN CLUBTBL C
			ON SC.CLUBNAME = C.CLUBNAME;

UNION 사용할 때는 위 아래 컬럼명 순서를 맞춰야함

그렇지 않으면 이상하게 조인됨.

 

CROSS JOIN

상호조인

상호조인은 카티션곱(cartesian product)라고도 함

SELECT *
	FROM 테이블명1
		CROSS JOIN 테이블명2;
USE MYDB;
SELECT COUNT(*)
FROM buytbl
CROSS JOIN usertbl;

 

SELF JOIN

자체조인

잘 쓰지 않는 방법

 

NOT IN, IN

 

SQL 프로그래밍

다른 프로그래밍 언어와 비슷한 분기, 흐름 제어, 반복 등의 기능이 있음

스토어드 프로시저의 작성 형식

DROP PROCEDURE IF EXISTS 함수이름;

DELIMITER $$
CREATE PROCEDURE 함수이름()
BEGIN
	 ...함수 내용
END $$
DELIMITER ; 

CALL 함수이름();

IF… ELSE… END IF 문

DELIMITER $$
CREATE PROCEDURE IFPROC()
BEGIN
	DECLARE VAR1 INT;
    SET VAR1 = 100;
    
    IF VAR1 = 100 THEN
		SELECT '100입니다.';
    ELSE
		SELECT '100이 아닙니다.';
	END IF;
END $$
DELIMITER ; 

CALL IFPROC();

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();

WHILE 문

DROP PROCEDURE IF EXISTS WHILEPROC;
DELIMITER $$
CREATE PROCEDURE WHILEPROC()
BEGIN
	DECLARE I INT;
	DECLARE HAP INT;
    SET I = 1;
    SET HAP = 0;
    
    WHILE (I<=100) DO
		SET HAP = HAP +1;
		SET I = I+1;
	END WHILE;
	SELECT HAP;
    
END $$
DELIMITER ; 

CALL WHILEPROC();

ITERATE/LEAVE 문

DROP PROCEDURE IF EXISTS iteratePROC;
DELIMITER $$
CREATE PROCEDURE iteratePROC()
BEGIN
	DECLARE I INT;
	DECLARE HAP INT;
    SET I = 1;
    SET HAP = 0;
    

    mywhile : WHILE ( I<=100) DO
		if(i%7 = 0 ) then
		SET I = I+1;
        iterate mywhile;
	END if;
	
    set hap = hap + i;
    if(hap >1000) then
    leave mywhile;
	end if;
    
	SELECT hap;
    
END $$
DELIMITER ; 

CALL iteratePROC();

동적 SQL

미리 쿼리문을 준비한 후 나중에 실행하는 것을 말함