Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

jh-data1og 님의 블로그

패스트캠퍼스 ㅣ 데이터분석부트캠프 18기 8주차 ㅣ MYSQL 기본 용어 본문

카테고리 없음

패스트캠퍼스 ㅣ 데이터분석부트캠프 18기 8주차 ㅣ MYSQL 기본 용어

jh-data1og 2025. 4. 17. 21:33

 

MYSQL

 

DAY 3

1. FUNCTIONS (함수)

: 미리 만들어져있는 기능을 사용하는 방식

 

1) 단일행 함수 : 특정 컬럼의 데이터 1개에 특별한 기능을 정용해 결과를 출력함 , ROW 데이터의 갯수와 동일하게 출력

- CEIL, ROUND, TUNCATE, CONCAT, DATE_FORMAT

     
CEIL  소수점 자리를 올림해 정수로 출력
 but, 소수점을 지정할수 없음
SELECT CEIL(12.345);
ROUND 소수점 3번째 자리에서 반올림해, 소수점 2번째 자리까지 출력 SELECT ROUND(12.345, 2);
TRUNCATE 소수점 3번째 자리에서 버림해, 소수점 2번째 자리까지 출력 SELECT TRUNCATE(12.345, 2);
CONCAT 데이터베이스의 테이블에서 '국가이름(국가코드)' 와 같은 포멧의 문자열로 출력되는 컬럼을 생성하여 출력 SELECT code, name, CONCAT(code, '(', name, ')') AS code_name 3
FROM country;
DATE_FORMAT 데이터베이스의 테이블에서
요금지불일 (payment_date)의 날짜 포멧을 '년-월'로 변경하고,
monthly 컬럼을 추가해 데이터를 출력
SELECT payment_date, DATE_FORMAT(monthly, '%Y-%M') AS monthly
FROM payment;

 

 

2) 다중행 함수 : 특정 컬럼에 있는 모든 데이터에 특별한 기능을 적용해 결과를 출력함

- COUNT, SUM, AVG, MIN, MAX 등등

- 다중행 함수는 결과가 1개의 row로 출력

- 여러개의 컬럼에 적용해 사용할 수 있음

     
COUNT() 데이터베이스의 테이블에서 인구수 100만 이상인 도시의 갯수 출력 SELECT COUNT(*) AS upper_100
FROM city
WHERE population >= 100 * 10000;
SUM() 데이터베이스의 테이블에서 인구수 Asia 대륙의 총인구수 출력 SELECT SUM(population)
FROM country
WHERE continent = 'Asia';
AVG() 데이터베이스의  테이블에서 전세계의 인구와 평균GNP 출력 SELECT SUM(population) AS total_population, AVG(gnp) AS avg_gnp
FROM country;

 

 

 

2. CONDITION (조건문)

: 특정 조건에 따라서 출력되는 결과를 다르게 하는 문법, 함수와 명령어를 사용해 조건문을 구현함

 

1) IF : 1가지 조건의 논리값(True, False)에 따라서 결과를 출력함

- IF(Condition, True Data, False Data)

 

예시)  데이터베이스의 테이블에서 도시의 인구가 100만 이상이면 'big', 아니면 'small'을 출력하는 scale 컬럼 추가

SELECT countrycode, name, population
           , IF(scale >= 100 * 10000, 'big', 'small') AS scale
FROM city;

 

2) IFNULL 

- IFNULL(True Data, False Data)

 

예시) 데이터베이스의 테이블에서 독립년도(indepyear)가 NULL 데이터는 0으로 출력 

SELECT code, name, ISNULL(indepyear, 0) AS indepyear
FROM country;

 

3) CASE WHEN THEN ELSE : 조건이 2가지 이상인 경우, 출력되는 결과를 다르게 할 때 사용되며 명령어로 구현함

- 기본구조

CASE

             WHEN condition1 THEN data1

             WHEN condition2 THEN data2

             ELSE data3

END AS column_name

 

 

 

3. GROUP BY / HAVING

- GROUP BY : 특정 컬럼의 중복데이터를 경합해 결과를 출력함

- 중복데이터를 결합할 컬럼을 설정하고, 다른 컬럼은 어떤 방법으로 데이터를 결합할지에 대해

다중행함수를 사용하여 SQL을 작성

- GROUP BY 명령어 뒤에 중복데이터를 결합할 컬럼을 작성함

- GROUP BY 명령어 뒤에 ,를 이용하여 여러개의 컬럼을 그룹핑하여 데이터를 출력할수 있습니다.

ex) GROUP BY continent, region;

 

 

- HAVING : 쿼리 실행 후 결과데이터에서 데이터를 필터링해 결과를 출력함

예시) 데이터베이스의  테이블에서 대륙(continent)별 총인구(total_population)에서 5억 이상인 대륙의 데이터 출력

 

SELECT continent, SUM(population) AS total_population 7
FROM country
GROUP BY continent
HAVING total_population >= 50000 * 10000;

 

- WITH ROLLUP : 여러개의 컬럼을 그룹핑하고, 그룹별 총합을 출력하는 ROW를 추가하는 명령어

 

 

 

4. UNION

: sql 쿼리를 실행한 결과를 결합해 출력할 수 있음

 

예시) 데이터베이스의 테이블에서 첫번째 ROW에는 아시아(asia)의 총인구수(total_population)와
총GNP(total_gnp)출력하고, 두번째 ROW에는 아프리카(africa)의 총인구수와 총GNP를 출력

 

SELECT 'Asia' AS continent, SUM(poplulation) AS total_population, SUM(gnp) AS total_gnp
FROM countrycode;
WHERE continent = 'Asia'
UNION
SELECT 'Africa' AS continent, SUM(poplulation) AS total_population, SUM(gnp) AS total_gnp
FROM countrycode
WHERE continent = 'Africa';

 

 

 

DAY 4

 

 

 

1. JOIN

: 특정 컬럼을 기준으로 두 개의 테이블을 컬럼으로 결합

- INNER, LEFT, RIGHT, OUTER, CROSS, SELF

- JOIN을 잘못하면 시스템에 많은 과부하를 줄 수 있음

- 과부하 문제를 해결하려면, 서브쿼리를 사용해서 데이터의 양을 줄이거나 / INDEX를 사용해서 쿼리의 탐색속도를 빠르게 하거나/ 서버의 성능을 높이는 방법이 있음

 

1) INNER JOIN

SELECT user.ui, user.name, addr.an
FROM user
(INNER) JOIN addr
ON user.ui = addr.ui;

 

★INNER 생략 가능

 

2) LEFT JOIN

SELECT user.ui, user.name, addr.an
FROM user
LEFT JOIN addr
ON user.ui = addr.ui;

 

3) RIGHT JOIN

SELECT addr.ui, user.name, addr.an
FROM user
RIGHT JOIN addr
ON user.ui = addr.ui;

 

4) OUTER JOIN

SELECT user.ui, user.name, addr.an6
FROM user
LEFT JOIN addr
ON user.ui = addr.ui
UNION
SELECT addr.ui, user.name, addr.an
FROM user
RIGHT JOIN addr
ON user.ui = addr.ui;

 

★별도의 명령어가 없어 UNION을 이용해 구현해야함.

 

 

 

2. SUB QUERY

: 쿼리 안에 쿼리를 작성 가능

- SELECT, FROM(JOIN), WHERE(HAVING) 사용 가능

- FROM : 쿼리의 실행 순서를 변경할 때, 쿼리 실행결과를 쿼리로 실행하고 싶을 때

- 단점 : 코드의 복잡도가 증가함 -> 이를 해결하기 위해 사용하는 방법 : VIEW, WITH

 

 

 

3. VIEW

: 가상의 테이블

- 실제로 데이터를 저장하지않음 -> 데이터를 추가, 수정, 삭제하지않음

- 복잡한 쿼리를 단순화함. READ만 사용가능해 데이터 보안을 향상시킴.

 

- VIEW 생성 포맷

CREATE VIEW <view name> AS <view query>

 

 

 

4. WITH

: 본 쿼리를 실행하기 전에, 미리 실행한 임시쿼리를 실행한 결과를 본 쿼리에서 사용할 수 있도록 함

- CTE (공통테이블 표현식)을 표현하기 위한 구문

- MYSQL 8.0버전부터 사용가능

 

- 기본구조
WITH cte_name AS (
             SQL Query
)
SELECT columns
FROM cte_name;

 

 

 

5. INDEX

: 테이블의 컬럼을 기준으로 설정 가능함

- 장점 : READ의 속도를 빠르게 해줌

- 단점: CREATE, UPDATE, DELETE 속도가 느려짐 / 저장공간 10%정도 더 사용함

- 효율적인 사용방법: WHERE 구문에서 자주 사용되는 컬럼을 INDEX로 설정

 

- INDEX 종류

1) 클러스터형 인덱스 : PRIMARY KEY 설정된 컬럼이 적용 -> 속도가 빨라지는 것보다 데이터 정렬을 위해 사용함

2) 보조 인덱스 : 일부 데이터만 INDEX로 사용해 속도가 빨라지게 하는 인덱스

 

 - 기본구조

INDEX  목록 확인 -> INDEX 사용 X 실행시간 확인 -> INDEX 생성 -> INDEX 목록 확인

-> INDEX 사용 O 실행시간 확인 -> 실행계획 확인 : EXPLAIN 활용(쿼리 실행 전 쿼리가 INDEX 사용하는지 확인)

-> INDEX 삭제

 

 

 

6. TRIGGER

:  특정 테이블을 감시하고 있다가 설정한 조건에 대한 쿼리가 실행되면, 
미리 설정해놓은 쿼리가 자동으로 실행되도록하는 방법

- 간단한 백업이나 쿼리 실행 시 다른 테이블 데이터를 추가, 수정할 때 많이 사용함

 

- 기본 구조
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} 
ON table_name FOR EACH ROW
BEGINE 
            trigger_body; 
END

 

예시)

DELIMITER $$
           CREATE TRIGGER chat_bak_tr
           BEFORE DELETE ON chat
           FOR EACH ROW BEGIN
                      INSERT INTO chat_bak(chat_id, msg)
                      VALUES(old.chat_id, old.msg);
           END $$