데이터베이스
데이터 베이스 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
미리 쿼리문을 준비한 후 나중에 실행하는 것을 말함