반응형

[MariaDB] 마리아DB SQL 쿼리 고급 - SQL 프로그래밍 (MySQL)

 

IF ELSE

DROP PROCEDURE IF EXISTS ifProc; -- 기존에 프로시저가 존재한다면 삭제
DELIMITER $$
CREATE PROCEDURE ifProc()	-- ifProc() 프로시저 생성
BEGIN
  DECLARE var1 INT;  -- var1 변수선언
  SET var1 = 100;  -- 변수에 값 대입

  IF var1 = 100 THEN  -- 만약 @var1이 100이라면,
	SELECT '100입니다.';
  ELSE	-- 아니라면
    SELECT '100이 아닙니다.';
  END IF;	-- IF 끝
END $$
DELIMITER ;
CALL ifProc();	-- 프로시저 호출하여 결과값 '100입니다.' 출력

 

IF ELSEIF ELSE

DROP PROCEDURE IF EXISTS ifProc; 
DELIMITER $$
CREATE PROCEDURE ifProc()
BEGIN
    DECLARE point INT ;
    DECLARE credit CHAR(1);
    SET point = 77 ;
    
    IF point >= 90 THEN	-- IF문
		SET credit = 'A';
    ELSEIF point >= 80 THEN
		SET credit = 'B';
    ELSEIF point >= 70 THEN	-- ELSEIF문 여기에 해당되어 실행
		SET credit = 'C';
    ELSEIF point >= 60 THEN
		SET credit = 'D';
    ELSE	-- 아무것에도 해당되지 않을때 실행
		SET credit = 'F';
    END IF;
    SELECT CONCAT('취득점수==>', point), CONCAT('학점==>', credit);	-- point, credit 출력
END $$
DELIMITER ;
CALL ifProc();	-- 프로시저 호출하여 결과 "취득점수==>77  학점==>C" 출력

 

CASE

DROP PROCEDURE IF EXISTS caseProc; 
DELIMITER $$
CREATE PROCEDURE caseProc()
BEGIN
    DECLARE point INT ;
    DECLARE credit CHAR(1);
    SET point = 77 ;
    
    CASE 	-- CASE문
		WHEN point >= 90 THEN
			SET credit = 'A';
		WHEN point >= 80 THEN
			SET credit = 'B';
		WHEN point >= 70 THEN	-- 여기 WHEN에 해당되어 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();	-- 프로시저 호출하여 "취득점수==>77  학점==>c" 출력

 

WHILE

DROP PROCEDURE IF EXISTS whileProc; 
DELIMITER $$
CREATE PROCEDURE whileProc()
BEGIN
	DECLARE i INT; -- 1에서 100까지 증가할 변수
	DECLARE hap INT; -- 더한 값을 누적할 변수
    SET i = 1;
    SET hap = 0;

	WHILE (i <= 100) DO	-- WHILE문 시작
		SET hap = hap + i;  -- hap의 원래의 값에 i를 더해서 다시 hap에 넣으라는 의미
		SET i = i + 1;      -- i의 원래의 값에 1을 더해서 다시 i에 넣으라는 의미
	END WHILE;

	SELECT hap;	-- hap을 조회
END $$
DELIMITER ;
CALL whileProc();	-- 프로시저 호출 hap을 조회 "5050" 출력

 

WHILE INTERATE / LEAVE

DROP PROCEDURE IF EXISTS whileProc; 
DELIMITER $$
CREATE PROCEDURE whileProc()
BEGIN
    DECLARE i INT; -- 1에서 100까지 증가할 변수
    DECLARE hap INT; -- 더한 값을 누적할 변수
    SET i = 1;
    SET hap = 0;

    myWhile: WHILE (i <= 100) DO  -- While문에 label(myWhile)을 지정. i가 100보다 같거나 작으면 작동. 크면 While을 벗어남.
	IF (i%7 = 0) THEN	-- i값이 7로 나눴을때 나머지가 0 이면 
		SET i = i + 1;     
		ITERATE myWhile; -- 지정한 label문으로 가서 계속 진행. 아래는 실행 안하고 바로 While로 돌아감.
	END IF;
        
        SET hap = hap + i;	-- i값을 누적
        IF (hap > 1000) THEN 	-- hap가 1000보다 커지면
		LEAVE myWhile; -- 지정한 label문을 떠남. 즉, While 종료.
	END IF;
        SET i = i + 1;
    END WHILE;	-- While로 다시 돌아감

    SELECT hap;	-- hap 조회
END $$
DELIMITER ;
CALL whileProc();	-- 프로시저 호출 hap 조회 "1029" 출력

 

오류처리 (DECLARE CONTINUE HANDLER FOR 에러코드 에러시작업내역;)

DROP PROCEDURE IF EXISTS errorProc; 
DELIMITER $$
CREATE PROCEDURE errorProc()
BEGIN
    DECLARE CONTINUE HANDLER FOR 1146 SELECT '테이블 없음' AS '메시지';	-- 아래 SELECT문이 1146에러 시 '테이블 없음'을 출력
    SELECT * FROM noTable;  -- noTable은 없는 테이블로 위에 예외처리를 발생시킴
END $$
DELIMITER ;
CALL errorProc();
DROP PROCEDURE IF EXISTS errorProc; 
DELIMITER $$
CREATE PROCEDURE errorProc()
BEGIN
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION	-- 아래 INSERT에서 SQLEXCEPTION 에러 발생시 BEGIN~END 실행하는 예외처리
    BEGIN
	SHOW ERRORS; -- 오류 메시지를 보여 줌.
	SELECT '오류발생. 롤백합니다.' AS '메시지';	-- 오류발생시 '오류발생 롤백합니다' 출력
	ROLLBACK; -- 오류 발생시 작업을 롤백시킴.
    END;
    INSERT INTO userTBL VALUES('ID1004', '김이박', 1990, '서울', NULL, 
		NULL, 180, CURRENT_DATE()); -- 'ID1004' 값이 중복되는 아이디로 가정하여 위 예외처리 발생
END $$
DELIMITER ;
CALL errorProc();	-- '오류발생. 롤백합니다' 출력 및 오류 메세지 출력 및 롤백작업.

 

동적SQL (PREPARE / EXECUTE / DEALLOCATE PREPARE)

USE DB명;
PREPARE 쿼리명 FROM 'SELECT * FROM 테이블'; -- SELECT 문을 '쿼리명'으로 준비시킴
EXECUTE 쿼리명;	-- '쿼리명'의 SELECT문을 실행시킴
DEALLOCATE PREPARE 쿼리명;	--'쿼리명'의 준비를 해제시킴
USE DB명;
DROP TABLE IF EXISTS 테이블명;	-- 테이블이 존재한다면 지워줌
CREATE TABLE 테이블명 (id INT AUTO_INCREMENT PRIMARY KEY, mDate DATETIME);	-- 테이블 생성 (ID, 현재날짜시간)

SET @curDATE = CURRENT_TIMESTAMP(); -- @curDATE에 현재 날짜와 시간 입력

PREPARE 쿼리명 FROM 'INSERT INTO myTable VALUES(NULL, ?)';	-- 쿼리명 준비. 뒤에 '?'는 아래에서 정의함
EXECUTE 쿼리명 USING @curDATE;	-- 쿼리명 실행. ?에는 @curDATE 변수를 대입함.
DEALLOCATE PREPARE 쿼리명;	-- 쿼리명 해제

SELECT * FROM 테이블명;

 

 

[MariaDB] 전체보기

 

 

'MariaDB' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

반응형
반응형

[MariaDB] 마리아DB SQL 쿼리 고급 - JOIN 조인 (MySQL)

 

INNER JOIN(내부 조인)

N:1의 관계인 테이블1:테이블2를 이용하는 조인입니다.

테이블1(N)의 외래키와 테이블2(1)의 기본키를 조인될 조건으로 이용하여 두 테이블을 합칩니다.

예를 들자면 테이블1은 주문테이블, 테이블2는 개인정보(주소)테이블이라고 하면, 테이블1에 테이블2를 조인해서 주문자의 주소를 알아내는 기능을 합니다.

USE 주문판매DB;
SELECT * 
   FROM 주문테이블명
     INNER JOIN 개인정보테이블명	-- 내부조인: 개인정보테이블
        ON 주문테이블명.userID(외래키) = 개인정보테이블명.userID(기본키)	-- 주문테이블 외래키와 개인정보테이블 기본키가 같은 값을 대상으로
   WHERE 주문테이블명.userID = '주문자ID';	-- 주문테이블의 아이디가 '주문자ID'인 사람만

 

전체를 SELECT 하지 않고 일부만 SELECT 하고자 할 경우는 어떤 테이블의 열이름인지를 확실히 해주어야 합니다.

USE 주문판매DB;
SELECT 주문테이블명.userID, 주소	-- userID의 경우 두 테이블 모두에 존재하기에 명확하기 어떤 테이블에서 가져올것인지 명시
   FROM 주문테이블명
     INNER JOIN 개인정보테이블명
        ON 주문테이블명.userID(외래키) = 개인정보테이블명.userID(기본키)
   WHERE 주문테이블명.userID = '주문자ID';

 

각 테이블을 별칭으로 만들어 쓸수도 있습니다.

USE 주문판매DB;
SELECT B.userID, U.주소	-- 아래 설정한 테이블 별칭을 이용해서 열이름을 명시
   FROM 주문테이블명 B	-- 주문테이블 별칭 B
     INNER JOIN 개인정보테이블명 U	-- 개인정보테이블 별칭 U
        ON B.userID(외래키) = U.userID(기본키)	-- 테이블 별칭 사용
   WHERE 주문테이블명.userID = '주문자ID';

 

OUTER JOIN(외부 조인)

외부조인은 테이블1의 모든 행이 조회되는 조인입니다.

예를 들어 개인정보테이블에 주문테이블을 외부조인한다면 주문내역이 없는 개인정보테이블의 행까지 조회 된다는 말입니다.

USE 주문판매DB;
SELECT * 
   FROM 개인정보테이블명
     LEFT OUTER JOIN 주문테이블명	-- 외부조인: 주문테이블 (앞에 LEFT는 RIGHT, FULL로 변경 가능)
        ON 개인정보테이블.userID(기본키) = 주문테이블명.userID(외래키)	-- 개인정보테이블 기본키와 주문테이블 외래키가 같은 값을 대상으로
   ORDER BY 개인정보테이블.userID;	-- userID 순으로 정렬

 

CROSS JOIN(상호 조인)

테이블1의 모든 행들을 테이블2의 모든행들과 조인하는 기능을 합니다.

만약 테이블1의 행이 5개이고, 테이블2의 행이 10개라면 5*10=50개의 행을 가진 상호 조인테이블이 생성됩니다.

보통 큰 샘플 데이터를 생성하고자 할때 사용하는 조인입니다.

USE 주문판매DB;
SELECT * 
   FROM 테이블1
	CROSS JOIN 테이블2;	-- 테이블2를 크로스 조인

 

SELF JOIN(자체 조인)

군대 중대원 테이블1에 행마다 맞선임이 대한 열정보가 있다고 생각해 봅시다. 특정인의 맞선임의 맞선임을 찾고자 할때 사용하는 것 이 셀프 조인입니다.

내부조인을 이용해서 만들지만 별칭을 달리해서 다른 행들의 열값을 SELECT 해서 가져옵니다.

SELECT A.본인이름, A.상사이름, B.상사이름 AS '상사의 상사이름'	-- 상사의 상사이름만 별칭으로 사용
	FROM 중대원테이블 A
		INNER JOIN 중대원테이블 B	-- 같은 테이블을 B라는 별칭으로 사용
        	ON A.상관이름 =	B.본인이름	-- 중대원테이블의 상사이름과 중대원테이블의 본인이름이 같을때
	WHERE A.본인이름 = '이름명';	-- '이름명'을 대상으로 조회

 

UNION / UNION ALL

데이터 형식이 같은 두 테이블이 있다면 UNION시 테이블1 마지막 행 밑에 테이블2가 붙여집니다.

UNION은 중복된 열은 제거되고, UNION ALL은 중복된 열까지 모두 출력됩니다.

USE DB명;
SELECT 열이름1, 열이름2 FROM 테이블1
	UNION ALL
SELECT 열이름1, 열이름2 FROM 테이블2;	-- 위 테이블1의 셀렉터의 열이름1,2와 갯수도 데이터 형식도 같아야 함.

 

NOT IN / IN

NOT IN은 첫번째 쿼리 결과중에서 두번째 쿼리에 해당하는 행을 제외하고 출력합니다.

SELECT * FROM 개인정보테이블
	WHERE 이름열 NOT IN (SELECT 이름열 FROM 개인정보테이블 WHERE 모바일열 IS NULL);
/* 개인정보테이블의 이름열중에 모바일열이 NULL인 이름열들은 제외 */

IN은  첫번째 쿼리 결과중에서 두번째 쿼리에 해당하는 행들만 출력합니다.

SELECT * FROM 개인정보테이블
	WHERE 이름열 IN (SELECT 이름열 FROM 개인정보테이블 WHERE 모바일열 IS NULL);
/* 개인정보테이블의 이름열중에 모바일열이 NULL인 이름열들만 출력 */

 

 

[MariaDB] 전체보기

 

 

'MariaDB' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

 

반응형
반응형

[MariaDB] 마리아DB SQL 쿼리 고급 - LONGTEXT (MySQL)

 

선행작업

올릴 데이터파일이 용량이 높다면 O/S별 아래 위치에서 config파일을 찾아 내용에 "max_allowed_packet = 1000M"를 추가 또는 수정해줘야 합니다. (권한있는 계정 or root로 수정)

Windows10: c:\Program Files\MariaDB(ver)\data\my.ini

CentOS 8: /etc/my.cnf.d/mariadb-server.cnf

라즈베리파이4: /etc/mysql/maariadb.conf.d/50-server.cnf

변경전 주석(16M)
변경후 1000M

 

이후 MariaDB를 재시작 해줍니다.

($ sudo systemctl restart mariadb.service)

마리아DB 재시작

 

대용량 텍스트(LONGTEXT) 생성하기

먼저 대용량 데이터를 입력하기 위한 테이블을 만들어 줍니다.

USE DB명;
CREATE TABLE 대용량테이블명 ( 열이름1 LONGTEXT,  열이름2 LONGTEXT);	-- 테이블생성

 

다음은 용량이 큰 텍스트파일과, 데이터 파일을 인서트 해줍니다.

INSERT INTO 대용량테이블명 VALUES(
	REPEAT('A', 1000000),	-- 영문 'A' 문자를 1000000 반복입력
	REPEAT('가', 1000000));	-- 한글 '가' 문자를 1000000 반복입력

 

입력된 값의 크기를 확인해 봅니다.

SELECT LENGTH(열이름1), LENGTH(열이름2) FROM 테이블명;	-- 영문은 1바이트, 한글은 3바이트 확인

 

 

[MariaDB] 전체보기

 

 

'MariaDB' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

반응형
반응형

[MariaDB] 마리아DB SQL 쿼리 고급 - 내장 함수 (MySQL)

 

제어 흐름 함수

IF(수식, 참, 거짓)

/* 수식이 참이면 2번째 값 출력, 수식이 거짓이면 3번째 값 출력 */
SELECT IF (100>200, '참이다', '거짓이다'); -- 거짓이 출력

IFNULL(수식1, 수식2)

/* 수식1값이 NULL이면 수식2가 반환, NULL이 아니면 수식1이 반환 */
SELECT IFNULL(NULL, '널이군요'), IFNULL(100, '널이군요'); -- 앞은 NULL이라 '널이군요'반환, 뒤는 NULL이 아니라 100이 반환

NULLIF(수식1, 수식2)

/* 수식1과 수식2가 같으면 NULL을 반환, 다르면 수식1을 반환 */
SELECT NULLIF(100,100), NULLIF(200,100);	-- 앞은 같으니 NULL반환, 뒤는 다르니 200 반환

CASE~WHEN~ELSE~END

SELECT 	CASE 10 -- CASE값이 10일때
		WHEN 1  THEN  '일'
		WHEN 5  THEN  '오'
		WHEN 10 THEN  '십'	-- WHEN 값이 10인것을 찾아 THEN 뒤에 값을 반환
		ELSE '모름' -- WHEN 값에 존재하지 않으면 ELSE 뒤에 값을 반환
	END;

 

문자열 함수

ASCII(아스키코드), CHAR(숫자)

SELECT ASCII('A'), CHAR(65);	-- 앞은 65 출력, 뒤는 'A' 출력

BIT_LENGTH(문자열), CHAR_LENGTH(문자열), LENGTH(문자열)

/*	BIT_ 할당된 Bit 크기, 또는 문자 크기를 반환
	CHAR_ 문자의 개수를 반환
    LENGTH 할당된 바이트 수를 반환 */
    
SELECT BIT_LENGTH('abc'),  CHAR_LENGTH('abc'), LENGTH('abc');	-- 24, 3, 3 (영문은 3바이트)
SELECT BIT_LENGTH('가나다'),  CHAR_LENGTH('가나다'), LENGTH('가나다');	-- 72, 3, 9  (한글은 9바이트)

CONCAT(문자열1, 문자열2,...), CONCAT_WS(문자열1, 문자열2,...)

/* 문자열들을 이어준다. CONCAT_WS는 구분자와 함께 문자열을 이어준다 */
SELECT CONCAT_WS('/', '2022', '01', '01');	-- 2020/01/01 출력

ELT(위치, 문자열1, 문자열2,...), FIELD(찾을문자열, 문자열1, 문자열2,...), FIND_IN_SET(찾을문자열, 문자열리스트), INSTR(기준문자열, 부분문자열), LOCATE(부분문자열, 기준문자열)

SELECT ELT(2, '하나', '둘', '셋');	-- '둘' 출력
SELECT FIELD('둘', '하나', '둘', '셋');	-- 2 출력
SELECT FIND_IN_SET('둘', '하나,둘,셋');	-- 2 출력
SELECT INSTR('하나둘셋', '둘');	-- 3출력
SELECT LOCATE('둘', '하나둘셋');	-- 3출력 (LOCATE와 POSITION은 동일한 함수임)

FORMAT(숫자, 소수점자리수)

SELECT FORMAT(123456.123456, 4);	-- 123,456.1235 출력

BIN(숫자), HEX(숫자), OCT(숫자)

SELECT BIN(31), HEX(31), OCT(31);	-- 2진수 11111, 16진수 1F, 8진수 37 출력

INSERT(기준문자열, 위치, 길이, 삽입할문자열)

/* 기준 문자열의 위치부터 길이만큼을 지우고, 삽입할 문자열을 끼워 넣음 */
SELECT INSERT('abcdefghi', 3, 4, '@@@@'), INSERT('abcdefghi', 3, 2, '@@@@');	-- ab@@@@ghi, ab@@@@efghi 출력

LEFT(문자열, 길이), RIGHT(문자열, 길이)

SELECT LEFT('abcdefghi', 3), RIGHT('abcdefghi', 3);	-- abc, ghi를 출력

UPPER(문자열), LOWER(문자열)

SELECT LOWER('abcdEFGH'), UPPER('abcdEFGH');	-- abcdefgh, ABCDEFGH를 출력
/* LOWER()와 LCASE()는 동일함수. UPPER()와 UCASE()는 동일함수 */

LPAD(문자열, 길이, 채울문자열), RPAD(문자열, 길이, 채울문자열)

/* 문자열을 길이만큼 늘린 후에 빈곳을 채울 문자열로 채움 */
SELECT LPAD('김이박', 5, '##'), RPAD('김이박', 5, '##');	-- '##김이박', '김이박##' 출력

LTRIM(문자열), RTRIM(문자열)

/* 문자열의 왼쪽, 오른쪽 공백을 제거. 가운데 공백은 제거하지 않음. */
SELECT LTRIM('   김이박'), RTRIM('김이박   ');	-- '김이박', '김이박' 출력

TRIM(문자열), TRIM(방향 자를문자열 FROM 문자열)

/*	TRIM() 앞뒤 공백을 모두 제거함
	방향: LEADING 앞쪽, BOTH 양쪽, TRAILING 뒤쪽 */
SELECT TRIM('   김이박   ');	-- '김이박' 출력
SELECT TRIM(BOTH 'ㅎ' FROM 'ㅎㅎㅎ힘들다.ㅎㅎㅎ');	-- '힘들다.' 출력

REPEAT(문자열, 횟수)

SELECT REPEAT('김이박', 3);	-- '김이박김이박김이박' 출력

REPLACE(문자열, 원래문자열, 바꿀문자열)

SELECT REPLACE ('이제는 잘 수 있겠다.', '있겠다' , '없겠다');	-- '이제는 잘 수 없겠다'로 변경 출력

REVERSE(문자열)

SELECT REVERSE ('김이박');	-- '박이김' 출력

SPACE(길이)

SELECT CONCAT('이제는', SPACE(10), '졸립다');	-- '이제는          졸립다' 출력

SUBSTRING(문자열, 시작위치, 길이) or (문자열 FROM 시작위치 FOR 길이)

/* 시작위치부터 길이만큼 문자를 반환. 길이가 생략되면 준마열 끝까지 반환 */
SELECT SUBSTRING('이제그만자자', 3, 2);	-- '그만' 출력
/* SUBSTRING(), SUBSTR(), MID()는 모두 같은 함수 */

SUBSTRING_INDEX(문자열, 구분자, 횟수)

/* 문자열에서 구분자의 횟수번째 나오는 부분 뒤를 버림. 횟수가 음수면 우측부터 횟수번째 나오는 앞을 버림. */
SELECT SUBSTRING_INDEX('cafe.daum.net', '.', 2);	-- cafe.daum 출력
SELECT SUBSTRING_INDEX('cafe.daum.net', '.', -2);	-- daum.net 출력

 

수학 함수

ABS(숫자)

SELECT ABS(-100);	-- 절대값 100이 출력됨

CEILING(숫자), FLOOR(숫자), ROUND(숫자)

SELECT CEILING(4.7), FLOOR(4.7), ROUND(4.7);	-- 올림 5, 내림 4, 반올림 5 출력

CONV(숫자, 원래진수, 변환할진수)

SELECT CONV('AA', 16, 2);	-- 16진수 AA를 2진수로 변환하여 10101010 출력
SELECT CONV(100, 10, 8);	-- 10진수 100을 8진수로 변환하여 144 출력

DEGREES(숫자), RADIANS(숫자), PI()

/* 라디안 값을 각도값으로 변환, 각도값을 라디안 값으로 변환, PI값인 3.141592를 반환 */
SELECT DEGREES(PI()), RADIANS(180);	 -- 180, 3.141592 출력

MOD(숫자1, 숫자2) or 숫자1 % 숫자2 or 숫자1 MOD 숫자2

/* 숫자1을 숫자2로 나눈 나머지 값을 반환 */
SELECT MOD(157, 10), 157 % 10, 157 MOD 10;	-- 모두 157을 10으로 나눈 나머지값인 7을 반환

POW(숫자1, 숫자2), SQRT(숫자)

/* 숫자1의 숫자2 만큼 제곱값 반환, 숫자의 제곱근을 반환 */
SELECT POW(2,3), SQRT(9);	-- 8, 3 출력

RAND()

/* 0이상 1미만의 실수를 반환. 실행할때마다 값이 변경 됨*/
SELECT RAND(), FLOOR(1 + (RAND() * (7-1)) );	-- 0~1 실수 반환. 1~6 정수 반환

SIGN(숫자)

/* 숫자가 양수, 0, 음수 인지를 구함. 각 1, 0, -1 을 반환. */
SELECT SIGN(100), SIGN(0), SIGN(-100.123);	-- 1, 0, -1 출력

TRUNCATE(숫자, 정수)

/* 숫자를 소수점을 기준으로 정수 위치(양수는 우측, 음수는 좌측)까지 구하고 나머지는 버린다. */
SELECT TRUNCATE(12345.12345, 2), TRUNCATE(12345.12345, -2);	-- 12345.123, 12300 반환

 

날짜 및 시간 함수

ADDDATE(날짜, 차이), SUBDATE(날짜, 차이)

/* 날짜를 기준으로 차이를 더한 날짜, 뺀 날짜를 구한다. */
SELECT ADDDATE('2022-01-01', INTERVAL 31 DAY), ADDDATE('2022-01-01', INTERVAL 1 MONTH);	-- 2022-02-01 출력
SELECT SUBDATE('2022-01-01', INTERVAL 31 DAY), SUBDATE('2022-01-01', INTERVAL 1 MONTH);	-- 2021-12-01 출력

ADDTIME(날짜/시간, 시간), SUBTIME(날짜/시간, 시간)

/* 날짜/시간을 기준으로 시간을 더한결과, 뺀결과를 반환 */
SELECT ADDTIME('2022-01-01 23:59:59', '1:1:1'), ADDTIME('15:00:00', '2:10:10');	-- 2020-01-02 01:01:00, 17:10:10 출력
SELECT SUBTIME('2022-01-01 23:59:59', '1:1:1'), SUBTIME('15:00:00', '2:10:10');	-- 2022-01-01 22:58-58, 12:49:50 출력

CURDATE() 현재 연-월-일, CURTIME() 현재 시:분:초, NOW()와 SYSDATE() 현재 연-월-일 시:분:초 출력

 

YEAR(날짜), MONTH(날짜), DAY(날짜), HOUR(시간), MINUTE(시간), SECOND(시간), MICROSECOND(시간)

(현재 날짜 또는 시간에서 연, 월, 일, 시, 분, 초 , 밀리초를 출력)

 

DATE(), TIME()

SELECT DATE(NOW()), TIME(NOW());	-- 2020-08-29, 05:33:00 현재 날짜, 시간 출력

DATEDIFF(날짜, 날짜2), TIMEDIFF(날짜1or시간1, 날짜2or시간2)

/* 날짜1 - 날짜2 일수 결과 반환, 시간1-시간2 시간 결과 반환. */
SELECT DATEDIFF('2022-01-01', NOW()), TIMEDIFF('23:23:59', '12:11:10');	-- 490, 11:12:49 출력

DAYOFWEEK(날짜), MONTHNAME(), DAYOFYEAR(날짜)

/* 현재요일(순서), 월이름, 일년 중 몇일이 지났는지를 반환 */
SELECT DAYOFWEEK(CURDATE()), MONTHNAME(CURDATE()), DAYOFYEAR(CURDATE());	-- 7, August, 242 출력

LAST_DAY(날짜)

/* 날짜 달의 마지막 날짜를 반환. 보통 날짜 달의 마지막 날짜를 확인할 때 사용. */
SELECT LAST_DAY('2022-02-01');	-- 2022-02-28 출력

MAKEDATA(연도, 정수)

/* 연도에서 정수만큼 지난 날짜를 구한다 */
SELECT MAKEDATE(2022, 32);	-- 2022-02-01 출력

MAKETIME(시, 분, 초)

/* 시:분:초 형식으로 만든다 */
SELECT MAKETIME(12, 11, 10);	-- 12:11:10 출력

PERIOD_ADD(연월, 개월수), PERIOD_DIFF(연월1, 연월2)

/* 연월(YYYYMM)에서 개월수만큼 지난 연월을 구한다. 연월1 - 연월2의 개월수를 구한다. */
SELECT PERIOD_ADD(202201, 11), PERIOD_DIFF(202201, 201812);	-- 202212, 37 출력

QUARTER(날짜)

/* 날짜가 몇분기인지 출력 */
SELECT QUARTER('2022-07-07');	-- 3 출력

TIME_TO_SEC(시간)

/* 시간을 초단위로 구한다 */
SELECT TIME_TO_SEC('12:11:10');	-- 43870 출력

 

시스템 정보 함수

USER(), DATABASE()

SELECT CURRENT_USER(), DATABASE();	-- 현재 사용자, 현재 선택된 DATABASE 출력

FOUND_ROWS()

USE DB명;	-- DB선택
SELECT * FROM 테이블명;	-- 테이블에서 *(모든) 열 조회
SELECT FOUND_ROWS();	-- 바로 앞의 SELECT에서 조회된 행의 개수를 구함

ROW_COUNT()

USE DB명;	-- DB선택
UPDATE 테이블명 SET 값이숫자인열이름=값이숫자인열이름*2;	-- 테이블명의 값이숫자인열이름 행들을 *2 하여 업데이트
SELECT ROW_COUNT();	-- 바로 앞의 INSERT, UPDATE, DELETE문에서 변경된 행들의 개수를 반환. CREATE, DROP문은 0을 반환. SELECT는 -1을 반환

VERSION() - 현재 DBMS의 버전을 확인

 

SLEEP(초)

/* 쿼리의 실행을 초만큼 멈춤 */
SELECT SLEEP(5);	-- 5초간 멈춤
SELECT '5초후에 보여요';	-- 5초후 '5초후에 보여요' 출력

 

 

[MariaDB] 전체보기

 

'MariaDB' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

반응형
반응형

[MariaDB] 마리아DB SQL 쿼리 고급 - 변수 사용 및 데이터 형 변환 (MySQL)

 

변수의 사용

SET @변수이름 = 변수의값 ;	-- 변수의 선언 및 값 대입
SELECT @변수이름 ;	-- 변수의 값 출력

/* 사용 예제 */
USE DB명;

SET @변수명1 = 4 ;		-- 변서 선언 및 값 대입
SET @변수명2 = 2 ;
SET @변수명3 = 3.25 ;	-- 실수 대입
SET @변수명4 = '지역명--> ' ;	-- 문자 대입

SELECT @변수명1 ;	-- 정수 출력
SELECT @변수명2 + @변수명3 ;	-- 정수+실수는 실수 출력
SELECT @변수명4 , 지역명열이름 FROM 테이블명 ;	-- 1열은 '지역명-->' 출력, 2열은 테이블의 지역명열 내용 출력

LIMIT에 변수 사용방법(기본적으로 변수 사용 불가능하나 PREPARE와 EXECUTE문을 활용해서 사용 가능)

SET @변수1 = 5 ;
PREPARE 쿼리이름 
    FROM 'SELECT 열이름1, 열이름2 FROM 테이블명 ORDER BY 열이름1 LIMIT ?';	-- ?에 값이 입력될 준비
EXECUTE 쿼리이름 USING @변수1 ;	-- 여기서 ?에 @변수1 값을 대입하게 됨

 

데이터 형 변환

// 데이터 형 변환 방식1 CAST
CAST (expression AS 데이터형식 [(길이)])

// 데이터 형 변환 방식2 CONVERT
CAST (expression , 데이터형식 [(길이)])


// 형 변환 예시: 평균(AVG)가 소숫점으로 나오지 않도록 SIGNED INT로 형변환 출력
SELECT CAST(AVG(amount) AS SIGNED INTEGER) AS '평균 구매 개수'  FROM 테이블명 ;
SELECT CONVERT(AVG(amount) , SIGNED INTEGER) AS '평균 구매 개수'  FROM 테이블명 ;

// 형 변환 예시: 날짜 데이터 형식으로 변환하기
SELECT CAST('2022$12$12' AS DATE);	-- 결과값: 2020-12-12
SELECT CAST('2022/12/12' AS DATE);	-- 결과값: 2020-12-12
SELECT CAST('2022%12%12' AS DATE);	-- 결과값: 2020-12-12
SELECT CAST('2022@12@12' AS DATE);	-- 결과값: 2020-12-12 (모두 같은 결과)

// 암시적인 형 변환
SELECT '100' + '200' ;	-- 문자와 문자를 더함 (정수로 변환되서 연산됨)
SELECT CONCAT('100', '200');	-- 문자와 문자를 연결 (문자로 처리)
SELECT CONCAT(100, '200');	-- 정수와 문자를 연결 (정수가 문자로 변환되서 처리)
SELECT 1 > '2mega';	-- 정수 2로 변환되어서 비교
SELECT 3 > '2MEGA';	-- 정수 2로 변환되어서 비교
SELECT 0 = 'mega2';	-- 문자는 0으로 변환됨

 

 

[MariaDB] 전체보기

 

 

'MariaDB' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

반응형