Study/이것이 MYSQL이다

[이것이 MYSQL이다] 7장 초반 정리 (내장함수, MYSQL 자료형)

반응형
SMALL
본 포스트는 2021년에 업로드된 포스트입니다. 개념이 아직 정리안된 나이에 업로드한 포스트이기에 수정사항이 있으면 연락주세요.

MYSQL의 자료형

mysql의 자료형은 무궁무진하게 많다.

 

하지만 이들중 많이 사용되는것은 많이 없다.

 

대표적으로 VARCHAR, CHAR, INT, BIGINT, SMAIL INT 등이 있다.

 

나는 기본적으로 VARCHAR과 CHAR의 차이를 햇갈려했었는데 그 이유는 실행 했을떄 저장되는 데이터의 차이를 모르겠어서이다.

 

VARCHAR과 CHAR의 차이는 CHAR는 고정적인 byte 길이, VARCHAR은 유동적인 byte 길이를 뜻한다. CHAR(30)은 크기가 30byte인 고정적인 길이를 할당한다.

 

따라서 30byte인 char에 "Helloworld"만 입력한다면 20byte를 낭비하는 것이라고 볼 수 있다.

 

VARCHAR(30)은 유동적으로 변하는 30byte를 할당한다. 위와 같이 "Helloworld"를 입력하면 byte를 딱 10byte로 줄여버려서 낭비를 방지할 수 있다. 하지만 MYSQL의 성능면에서는 CHAR를 사용하는것이 좋다.

 

또한 영상이나 큰파일을 저장하기 위한 자료형이 있는데 LONGTEXT와 LONGBLOB이다.

 

LONGTEXT 자료형은 큰 용량의 파일을 저장하기 위한 자료형이다 주로 영화 대본, 다른 스크립트 등을 저장하기 위한 자료형이다.

 

LONGBLOB는 큰 바이너리 파일이라고 보면된다 주로 영상과 같은 비디오를 저장하기 위한 자료형으로 많이 사용된다.

내장함수

내장함수는 MYSQL에서 미리 등록되어있는 함수들이다.

 

기본적으로 지원되는 함수들이며 엄청나게 많은 함수를 지원하고 있다.

 

그중에서는 "replace"와 같이 일반적인 프로그래밍 언어에서 지원하는 함수도 지원하는데 그러면 "그냥 프로그래밍 언어에서 데이터 처리하고 저장만 하면 되는데 굳이 내장함수를 써야하나?"러는 의문이 들었었다.

 

하지만 하는 역할은 같지만 내부를 뜯어보면 둘의 차이점이 있다고 한다.

 

또한 쿼리문을 처리할때는 내장함수를 처리하는것이 혼자 개발할 때는 더 유용하다고 한다.

 

프로그래밍 언어를 사용하지 않고 SQL파일으로만 쿼리문을 작성해야할때 2가지 언어를 모두 사용해야하는 아주 불필요한 행동이 생기기 때문이다.

 

내장함수의 대표적인 함수는 REPLACE, IF, REVERSE등이 있다.

 

IF문과 변수도 지원하므로 다양한 용도로 내장함수를 사용할 수 있다.

서브쿼리

서브쿼리란 쿼리문에서 또 하나의 쿼리를 포함하는 종속적인 관계를의 쿼리를 뜻한다.

아래의 예시를 참고하자

SELECT id AS '아이디', height AS '높이' FROM testTBL
	WHERE height = (SELECT height FROM test2TBL WHERE height = 170);

 

위와 같은 예제 쿼리를 작성하였다. 여기서 testTBL 안에있는 height컬럼과 다른 외부의 test2TBL에 있는 height라는 컬럼의 값이 170 이상인 데이터만 가져온다.

 

이렇게 되면 result는 testTBL에서 height가 170이상인 Rows만 추출되게 된다.

 

이처럼 서브쿼리를 외부의 다른 테이블의 값과 비교해서 사용할 수 있다.

 

서브쿼리는 메인쿼리가 서브쿼리를 참조하는 형태라고 정의 할수 있다.

집계함수

집계함수는 일반적으로 AVG, SUM, MIN과 같은 데이터를 집계할때 사용하는 함수이다.

예시쿼리를 참고하자.

SELECT SUM(height) AS '키 총합' FROM testTBL GROUP BY student_name;

 

하나의 가정을 해보자면 student_name 컬럼에는 2명의 동명이인의 학생의 키가 있다.

 

이 2명의 학생의 키의 총 cm를 알고싶을때 이를 group으로 묶은 데이터중 height라는 컬럼을 더한 것이다.

 

이해가 안될시 아래의 예시를 더 참고하자.

{
	[
		{"student_name": "정건우", "height": 180},
		{"student_name": "정건우", "height": 160},
	]
}

#### 위와 같은 2개의 데이터의 이름이 같을때 위의 쿼리를 이용하면
{"student_name": "정건우", "height": 340},
#### 이렇게 같은 이름을 하나의 그룹으로 묶고 그 데이터중 height라는 값을 서로 더한것이다.
하지만 이보다 더 많은 COUNT, AVG와 같은 집계함수도 있으므로 참고하도록 하자.

WITH CTE

쿼리문을 묶어서 사용할때 CTE문을 사용하게 된다.

 

CTE문은 일회성 쿼리다 한번 사용하면 더이상 사용할수 없는 쿼리이다.

 

서브쿼리의 개념과 좀 비슷하지만 차이가 있다.

 

쿼리가 길거나 쿼리의 처리 별로 분류를 하고 싶을떄 사용하면 매우 유용하다 아래의 예시를 참고하자.

WITH test(height)
	AS (
		SELECT height FROM testTBL
	);

SELECT height AS '키' FROM test;

 

test라는 쿼리를 만들어서 거기의 반환값으로 height를 지정하였다.

 

test의 height라는 부분은 AS안의 SELECT문을 사용해서 testTBL에서 height값을 불러온것을 test라는 cte에 저장한다.

그리고 SELECT할때 test를 불러와서 조회할 수 있다.

 

CTE문은 여러번 사용할수 있으며 여러 CTE문과 체이닝 할수 있다.

 

매우 유용한 방식으로 잘 알아두어서 나중에 사용하도록 하자.

DDL, DML

DDL : CRUD와 같은 일반적인 쿼리에서 발생하는 작업들을 DDL 형식의 처리라고 부른다.

 

DML : DROP, 트리거, 뷰, 스토어드 프로시저와 같은 CRUD작업이 아닌 형식의 처리를 DML 처리라고 부른다.

정리

CRUD와 같은 작업을 많이 하게될수록 내장함수가 없을시 안되는 처리부분이 많다.

 

만약에 이러한 내장함수가 없었다면 우리가 직접 해당 기능들을 만들어야 했을것이다.

 

이렇게 불편한 점을 해결하기 위해서 생긴것들을 예전에는 이용하지 않았지만 이제부터는 효율적으로 활용하여 쿼리문의 실행속도와 간결함을 더욱더 유지하기 위해 노력해야겠다.

반응형
LIST