Database 121

[MySQL] WITH - 임시 테이블 생성

CTE Common Table Expression 단일 문의 범위 내에 존재하고 나중에 해당 문 내에서 여러 번 참조할 수 있는 명명된 임시 결과 집합 하나의 쿼리문이 끝날 때까지 유지되는 일회성 테이블로, 서브 쿼리로 사용되는 파생 테이블과 비슷한 개념으로 사용된다. 복잡한 쿼리에서 코드의 가독성과 재사용성을 위해 파생 테이블 대신 사용할 수 있다. 또한 SELECT, UPDATE, DELETE 문은 CTE를 참조할 수 있다. 생성에 권한이 필요하고 사전에 정의해야 하는 VIEW와는 다르게, CTE는 권한이 필요하지 않다. MySQL 8.0.1부터 도입되었다. WITH CTE는 WITH 절을 이용하여 정의할 수 있으면 여러 테이블을 만들 때에는 ,로 구분하여 작성한다. WITH [RECURSIVE] c..

Database 2022.06.14

[MySQL] UNION

UNION 여러 개의 SELECT문의 결과를 하나의 테이블로 표현할 때 사용한다. 각 SELECT문으로 선택한 필드의 개수와 타입, 순서는 모두 동일해야 한다. 용법 SELECT column_list UNION [DISTINCT | ALL] SELECT column_list UNION [DISTINCT | ALL] SELECT column_list ... UNION 뒤의 연산자를 지정하지 않으면 기본적으로 DISTINCT로 동작하여 중복 행을 모두 제거한다. 예시 ) 아래와 같이 student1, student2 테이블이 존재한다고 하자. TABLE student1 TABLE student2 두 테이블에서 도시 이름을 한 번에 출력하고 싶다면 아래와 같이 UNION을 사용할 수 있다. SELECT Cit..

Database 2022.06.13

[MySQL] JOIN

JOIN 데이터베이스 내 여러 테이블에서 가져온 데이터를 조합하여 하나의 테이블로 표현한다. 방식에 따라 INNER JOIN, LEFT JOIN, RIGHT JOIN으로 구분한다. JOIN은 크게 아래와 같은 방식으로 사용하며, ON 절의 조건에 따라 여러 테이블을 하나의 테이블로 합쳐 표현할 수 있다. JOIN ON INNER JOIN ON 절을 만족하는 데이터만을 가져오며, 두 테이블 모두 값이 있는 레코드를 선택한다. 따라서 기준 테이블과 참조 테이블의 순서가 바뀌어도 결과에 영향을 미치지 않는다. MySQL에서 JOIN, INNER JOIN, CROSS JOIN 모두 INNER JOIN을 의미한다. 사용법 SELECT * FROM table1 INNER JOIN table2 ON table1.ke..

Database 2022.06.12

[MySQL] GROUP BY

GROUP BY 특정 컬럼을 그룹화한 데이터를 조회할 때 사용한다. 예시 ) SELECT ANIMAL_TYPE FROM ANIMAL_INS GROUP BY ANIMAL_TYPE; HAVING GROUP BY로 그룹화한 데이터는 HAVING 키워드를 사용하여 조건을 걸 수 있다. 💡 WHERE VS HAVING WHERE : 그룹화하기 전의 데이터에 대한 조건문 HAVING : 그룹화한 데이터에 대한 조건문 예시 ) SELECT NAME, count(NAME) FROM ANIMAL_INS WHERE NAME IS NOT NULL GROUP BY NAME HAVING count(NAME) > 1; 이 SQL는 FROM -> WHERE -> SELECT -> GROUP BY -> HAVING 순서로 실행된다...

Database 2022.06.11

[MySQL] MAX, MIN, COUNT, DISTINCT

집계함수 MySQL의 대표적인 집계함수 몇 가지를 간단히 정리한다. MAX 지정한 컬럼 데이터의 최댓값을 가져온다. 문자나 숫자가 대상이며 해당하는 값이 없으면 NULL을 반환한다. SELECT MAX(DATETIME) FROM ANIMAL_INS; MIN 지정한 컬럼 데이터의 최솟값을 가져온다. 문자나 숫자가 대상이며 해당하는 값이 없으면 NULL을 반환한다. SELECT MIN(DATETIME) FROM ANIMAL_INS; count 지정한 컬럼 데이터의 수를 가져온다. SELECT count(*) FROM ANIMAL_INS DISTINCT 지정한 컬럼 데이터에서 중복된 값을 제거한다. SELECT count(DISTINCT NAME) FROM ANIMAL_INS; 참고 문서 https://pro..

Database 2022.06.10

[MySQL] 명령줄에서 쿼리 실행하기

mysql-client를 사용하면 보통 접속할 서버와 사용자 정보를 지정하여, mysql 서버에 접속한 뒤 SQL Query 를 실행한다. 하지만 스크립트 등에서 활용하기 위해 MySQL 서버 접속 후에 쿼리를 실행하는 것이 아니라, 명령 실행 시 쿼리를 전달하여 그 결과를 받고 싶다면 -e, --execute 옵션을 사용하여 실행할 쿼리를 전달할 수 있다. mysql-cli는 옵션으로 전달된 쿼리를 실행하고 종료된다. mysql -e "QUERY" mysql -u -p -e "QUERY" # 예시 mysql -e 'SELECT VERSION();' mysql -u root -p PASSWD test_db -e "SELECT VERSION();" 실행할 쿼리는 따옴표나 큰따옴표로 묶어주어야 한다. 실행할..

Database 2022.04.08

[MySQL] mysql-client local-infile 활성화

2022.04.06 - [MySQL] ERROR 2068 (HY000) : LOAD DATA LOCAL INFILE file request rejected due to restrictions on access. 글에서 구글링을 통해 조치한 내용과 공식 문서에서 안내한 내용이 조금 달랐다. 차이점은 다음과 같다. 구글링 공식문서 Group mysql, mysqld client Variables name local-infile loose-local-infile 이전 글에서는 운영 서버에 조치하느라 테스트하지 못했기 때문에, 이 글에서 공식 문서대로 조치했을 때도 mysql-client가 local-infile을 활성화하는지 확인해보려고 한다. 테스트한 서버 OS와 MySQL 클라이언트 버전은 아래와 같다. ..

Database 2022.04.07

[MySQL] ERROR 2068 (HY000) : LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.

리눅스에서 mysql-client를 사용해 LOAD DATA LOCAL INFILE 문을 실행했더니, 아래와 같은 에러가 발생하면서 정상 동작하지 않았다. 실행한 명령어 mysql -u -p -P -h < /path/use.sql 에러 메세지 ERROR 2068 (HY000) at line 2: LOAD DATA LOCAL INFILE file request rejected due to restrictions on access. 공식 문서를 확인해보니 LOAD DATA LOCAL에 잠재적인 보안 문제가 있어 서버와 클라이언트 측에 보안 요구사항이 존재하며, 관련하여 MySQL 서버와 클라이언트 양측에서 local-infile을 활성화하지 않은 게 원인이었다. 관련하여 확인하고 조치해본다. 참고로 버전은 ..

Database 2022.04.06

[MySQL] 테이블 용량 확인

데이터베이스의 스토리지 용량이 계속 문제가 돼서 모든 테이블 용량을 확인하려고 한다. 테이블 용량은 테이블의 상태 정보를 통해 확인할 수 있다. 모든 테이블 용량의 합 모든 데이터베이스, 모든 테이블 용량의 합을 계산한다. SELECT SUM(DATA_LENGTH), SUM(INDEX_LENGTH), SUM((DATA_LENGTH + INDEX_LENGTH)) FROM information_schema.TABLES; # GB 단위로 출력 SELECT ROUND(SUM(DATA_LENGTH /(1024 * 1024 * 1024)), 2) AS 'DATA_SIZE(GB)', ROUND(SUM(INDEX_LENGTH /(1024 * 1024 * 1024)), 2) AS 'INDEX_SIZE(GB)', ROUN..

Database 2022.03.12