본문 바로가기
데이터베이스

데이터 베이스 MySQL 2

by eunjineee 2024. 2. 3.

DML (data manipulation language)

데이터 조작 언어

트랜잭션이 발생하는 SQL도 이 DML에 속함

커밋, 롤백 → 트랜잭션

DDL(data definition language)

create drop alter

롤백, 커밋 사용불가

실행즉시 적용됨

DCL (data contril language)

사용자에게 권한을 부여하거나 빼앗을 때 주로 사용하는 구문

Insert

INSERT INTO 테이블이름 VALUES(값)

USE SQLDB;

CREATE TABLE TESTTBL1(id INT, userNAME CHAR(3), age INT);
INSERT INTO TESTTBL1 VALUES (1, '뽀로로', 16);
INSERT INTO TESTtesttbl1TBL1 (id, userNAME) VALUES (2, '크롱');
INSERT INTO TESTTBL1 VALUES (3, '루피', 14);

AUTO_INCREMENT

자동으로 1부터 증가하는 값을 입력하는 키워드

반드시 열을 기본키 또는 유니크로 설정해야함

USE SQLDB;

CREATE TABLE TESTTBL2(id INT AUTO_INCREMENT PRIMARY KEY, userNAME CHAR(3), age INT);
INSERT INTO TESTTBL2 VALUES (NULL, '에디', 15);
INSERT INTO TESTTBL2 VALUES (NULL, '포비', 12);
INSERT INTO TESTTBL2 VALUES (NULL, '퉁퉁이', 11);

ALTER TABLE TESTTBL2 AUTO_INCREMENT = 100;
INSERT INTO TESTTBL2 VALUES (NULL, '패티', 11);

>>>
1	에디	15
2	포비	12
3	퉁퉁이	11
100	패티	11

→ AUTO_INCREMENT PRIMARY KEY

SET @@auto_increment_increment=3

  • @@ 붙이면 서버 변수
USE SQLDB;

CREATE TABLE TESTTBL3(id INT AUTO_INCREMENT PRIMARY KEY, userNAME CHAR(3), age INT);
ALTER TABLE TESTTBL3 AUTO_INCREMENT = 100;
SET @@auto_increment_increment=3;
INSERT INTO TESTTBL3 VALUES (NULL, '에디', 15);
INSERT INTO TESTTBL3 VALUES (NULL, '포비', 12);
INSERT INTO TESTTBL3 VALUES (NULL, '퉁퉁이', 11);

>>>
100	에디	15
103	포비	12
106	퉁퉁이	11

대량 데이터 삽입 형식

INSERT INTO 테이블이름 SELECT문;

VER1.

CREATE TABLE TESTTBL4(id INT, Fname VARCHAR(50), Lnmae VARCHAR(50));
INSERT INTO TESTTBL4 SELECT emp_no,first_name, last_name FROM employees.employees;

VER2.

CREATE TABLE TESTTBL5( SELECT emp_no,first_name, last_name FROM employees.employees);
SELECT * FROM TESTTBL5 LIMIT 5;

UPDATE

테이블에 입력된 값을 수정하는 명령어

UPDATE 테이블 이름
SET 열1=값1, 열2=값2
WHERE 조건;

DELETE

DELETE FROM TESTTBL4 WHERE Fname='Aamer';
DELETE FROM TESTTBL4 WHERE Fname= 'Aamer' LIMIT 5;
CREATE TABLE BIGTBL1(SELECT * FROM employees.employees);
CREATE TABLE BIGTBL2(SELECT * FROM employees.employees);
CREATE TABLE BIGTBL3(SELECT * FROM employees.employees);

DELETE FROM BIGTBL1;                //데이터 삭제     //롤백하기 위한 자료를 만드느라 오래걸림
DROP TABLE BIGTBL2;                 //테이블 삭제
TRUNCATE TABLE BIGTBL3;             //자료만 삭제    //롤백을 못한다

[ 자세한 설명 ]

1) DELETE

  • 하여 테이블에 있는 하는 방식데이터를 하나하나 선택하여 제거
  • WHERE절을 사용
  • WHERE절을 사용하지않고 테이블의 모든 데이터를 삭제하더라도, 내부적으로는 한줄 한줄 일일히 제거하는 과정을 거칩니다.
  • 처리속도가 늦고, 퍼포먼스에 좋지않은 영향을 줄 수 있습니다.
  • 원하는 데이터만 골라서 삭제할 때에는 DELETE 사용 / 전체 데이터 삭제할 때에는 TRUNCATE 사용합니다.
  • 데이터를 삭제하더라도 데이터가 담겨있던 Storage는 Release 되지 않습니다.
  • DELETE된 데이터는 COMMIT 명령어를 사용하기 전이라면, ROLLBACK 명령어를 통해 되돌릴 수 있습니다.

2) TRUNCATE

  • 하는 방식 ( <-> DELETE)
  • 전체 데이터를 한번에 삭제
  • 최초 생성되었을 당시의 Storage만 남기고, 데이터가 남겨있던 Storage는 Release 됩니다.
  • TRUNCATE TABLE을 하면 CREATE TABLE을 한 직후의 상태와 같습니다.
  • 자동 COMMIT이 되는 명령어이기 때문에, 이미 지운 데이터는 되돌릴 수 없습니다.

3) DROP

  • 버리는 방식입니다. (처음부터 없었던 테이블처럼)
  • 테이블 자체를 완전히 날려
  • 테이블 자체가 모두 지워지며, 해당 테이블에 생성되어있던 모든 인덱스도 사라집니다.
  • 자동 COMMIT이 되는 명령어이기 때문에, 이미 지운 데이터는 되돌릴 수 없습니다.
  • 오라클에서(오라클10g부터)는 테이블이 삭제되는 것이 아니라 윈도우의 휴지통 개념처럼 잠시 삭제 -> 테이블 이름이 BIN$..로 변경됩니다.

 

IGNORE

INSERT IGNORE INTO ~ ;

기본키가 중복되어도 에러 메세지만 띄우고 뒷줄로 넘어감

 

ON DUPLICATE KEY UPDATE구문

INSERT INTO memberTBL VALUES(’KHD’,’강후덜’,’미국’) 
    ON DUPLICATE KEY UPDATE userName = ‘강후덜’,addr=’미국’)

 

순위 함수

비집계함수중 RANK(), NTILE(), DENSE_RANK(), ROW_NUMBER()

SELECT ROW_NUMBER() OVER(ORDER BY height DESC) 
     "키큰순위", userName, addr, height FROM userTBL;

SELECT ROW_NUMBER() OVER(ORDER BY height DESC, 두번째 조건) 
     "키큰순위", userName, addr, height FROM userTBL;

SELECT ROW_NUMBER() OVER(PARTITION BY addr ORDER BY height DESC) 
     "키큰순위", userName, addr, height FROM userTBL;

 

DENSE_RANK

값이 같을 경우 동일한 등수로 처리함

RANK

공동 3등 다음에 5등이 나오게 함

NTILE

NTILE(나눌 그룹 갯수)

  • RANK 랑 같이 쓸 수는 없음

LEAD()

바로 다음 사람 하고 키 차이를 나타낼 수 있다

select NAME, ADDR, height AS '키', height-(lead(height,1,0) 
OVER (ORDER BY height DESC )) AS "다음사람과 키 차이" FROM mydb.userTBL;

>>>
박은빈	서울	182	0
김용규	서울	182	0
이승규	서울	182	0
이슝기	서울	182	0
이승동	서울	182	0
이가은	서울	182	0
김지연	서울	182	0
박완호	서울	182	0
송은지	서울	182	0
양은진	서울	182	182

제일 마지막 값은 비교할 대상이 없어서 자기 자신이 나옴

FIRST_VALUE()

select NAME, ADDR, height AS '키', height-(FIRST_VALUE(height) 
OVER (PARTITION BY ADDR ORDER BY height DESC )) AS "다음사람과 키 차이" FROM mydb.userTBL;

→ PARTITION BY

CUME_DIST() 누적 백분율

SELECT ADDR, NAME, HEIGHT AS '키', (CUME_DIST() 
OVER (PARTITION BY ADDR ORDER BY height DESC )) * 100 
AS "누적인원 백분율%" FROM mydb.userTBL;

PIVOT

한열에 포함된 여러 값을 여러 열로 변환하여 출력하고 필요하면 집계까지 출력 가능

CREATE TABLE PIVOTTEST ( uName CHAR(3), season CHAR(2), amount INT);
INSERT INTO PIVOTTEST VALUES('유재석','겨울',10);
INSERT INTO PIVOTTEST VALUES('강호동','여름',10);
INSERT INTO PIVOTTEST VALUES('유재석','가을',10);
INSERT INTO PIVOTTEST VALUES('유재석','봄',10);
INSERT INTO PIVOTTEST VALUES('유재석','봄',10);
INSERT INTO PIVOTTEST VALUES('강호동','겨울',10);
INSERT INTO PIVOTTEST VALUES('유재석','여름',10);
INSERT INTO PIVOTTEST VALUES('유재석','겨울',10);
INSERT INTO PIVOTTEST VALUES('강호동','여름',10);

SELECT uName,
	SUM(CASE WHEN season='봄' THEN amount END) AS '봄',
	SUM(CASE WHEN season='여름' THEN amount END) AS '여름',
	SUM(CASE WHEN season='가을' THEN amount END) AS '가을',
	SUM(CASE WHEN season='겨울' THEN amount END) AS '겨울'
FROM PIVOTTEST
GROUP BY uName;

데이터 형식의 종류

숫자 데이터

출처 : https://velog.io/@98kimjh/Database-MySQL-Data-Types

 

문자 데이터

출처 : https://velog.io/@98kimjh/Database-MySQL-Data-Types

 

날짜와 시간 데이터

출처 : https://velog.io/@98kimjh/Database-MySQL-Data-Types

@ : 지역변수

USE SQLDB;
SET @myVar1 = 5;
SET @myVar2 = 3;
SET @myVar3 = 4.25;
SET @myVar4 = 'MC 이름 ==>';

 select @myVar1;
 select @myVar2 + @myVar3;
 
 select @myVar4 , userName From userTBL WHERE height > 180;

CAST

avg(amount) as signed integer

as date로도 가능

 

CONVERT

암시적인 형 변환

cast함수나 convert함수를 사용하지 않고 데이터 형식을 변환하는 것

select '100' + '200';
 select CONCAT('100' , '200');
 select CONCAT(100 , '200');
 SELECT 1 > '3mega';   #3으로 간주
 SELECT 4 > '3MEGA';   #3으로 간주  
 SELECT 0 = 'mega3';   #0으로 간주

내장함수

IF, IFNULL, NULLIF

SELECT IF(100>200, '참이다','거짓이다');
 SELECT NULLIF (NULL, '널이군요'), IFNULL(100,'널이군요');
 SELECT NULLIF (100,100), IFNULL(200,100);

CASE… WHEN … ELSE… END

SELECT CASE 10
	 WHEN 1 THEN '일'
	 WHEN 5 THEN '오'
	 WHEN 10 THEN '십'
 	ELSE '모름'
END;

 

ASCII, CHAR

GIT_LENGTH, CHAR_LENGTH, LENGTH

CONCAT, CONCAT_WS

ELT : 첫번째 인수인 ‘위치’에 적힌 숫자를 보고 그 숫자 번째에있는 문자열을 반환

FIELD

FIND_IN_SET

INSTR

LOCATE

LOWER, UPPER

INSERT

LEFT, RIGHT

BIN, HEX, OCT

LPAD, RPAD

LTRIM, RTRIM

TRIM

REPEAT

REPLACE

REVERSE

SPACE(길이) : 길이만큼의 공백을 반환

SUBSTRING

SUBSTRING_INDEX

수학 함수

ABS

CELING, FLOOR, ROUND

CONV (진수 변경)

DEGREE, RADIANS, PI

MOD

POW, SQRT

날짜/시간 함수

ADDDATE, SUBDATE

ADDTIME, SUBTIME

YEAR

DATE, TIME

DATEDIFF, TIMEDIFF

DAYOFWEEK, MONTHNAME, DAYOFYEAR

PERIOD_ADD, PERIOD_DIFF

QUARTER

TIME_TO_SEC

CURDATE, CURTIME, NOW, SYSDAYE

시스템 / 정보 함수

USER, DATABASE

SLEEP

VERSION