📝

2. BigQuery SQL 문법

 

2.1. DQL

DQL(Data Query Language)은 데이터셋에서 정보를 조회하기 위해 사용하는 SQL의 하위 집합으로 데이터셋에 저장된 데이터를 질의하고 검색 결과를 반환합니다. 데이터 질의어인 DQL은 데이터셋에서 필요한 정보를 추출하는데 필수적인 도구이며, 대표적으로 SELECT문이 있습니다.
SELECT문은 데이터 조작어인 DML(Data Manipulation Language)로 분류되기도 하고, DQL로 별도로 분류되기도 합니다. Google BigQuery에서는 데이터셋의 관리와 데이터의 조작을 명확하게 분리하고자 하여 SELECT문을 DQL로 분류하나, 대부분의 SQL에서는 DML으로 포함시킵니다.
 

2.1.1. DQL 구성요소

다음은 DQL인 SELECT문과 함께 사용되는 기본 구성요소입니다.
쿼리 작성 시 SELECT는 데이터를 선택, FROM은 데이터를 추출하는 기능을 수행하기 때문에 SELECTFROM은 DQL의 필수 키워드라고 할 수 있습니다.
선택 구성요소인 WHERE, GROUP BY, HAVING, ORDER BY, LIMIT은 데이터 필터링, 데이터 결과 갯수 제한 기능으로 조회하고자 하는 데이터를 효과적으로 탐색하여 효율성을 높여줄 수 있습니다.
SELECT # 데이터 조회 column1 , column2 FROM Table1 AS alias # 별칭(alias) 지정하여 데이터 추출 WHERE condition1 # 조건(condition1)을 지정하여 데이터 필터링 GROUP BY column[1|2] # 원하는 컬럼명 그룹화 HAVING condition2 # 필터링 된 데이터 기준으로 조건(condition2) 지정 ORDER BY column[1|2][ASC|DESC] # 원하는 컬럼명 기준 결과 정렬 LIMIT limiting number; # 데이터 결과 갯수 제한
  • SELECT
    • SELECT 는 데이터를 조회하기 위한 SQL 키워드입니다. SELECT절에 조회하고자 하는 컬럼명을 리스트로 나열합니다. 모든 컬럼을 조회하려면 *(Asterisk)을 사용합니다.
       
  • FROM
    • FROM 은 데이터를 탐색하거나 조작할 대상 테이블(Table)을 정의하는 구성요소입니다. FROM절에 `데이터셋.테이블명` 형태로 데이터를 조회 할 테이블의 이름을 지정해 줍니다. 여러 테이블의 조인, 서브쿼리, 테이블 별칭 지정 등 다양한 기능을 제공합니다.
       
  • WHERE
    • WHERE절은 행에 대한 필터링 조건을 지정하여 특정 조건을 만족하는 행만 조회하기 위한 키워드입니다. WHERE절에서 비교연산자와 논리연산자를 활용하여 조건을 설정함으로써 원하는 데이터를 효과적으로 조회할 수 있습니다.
    • 비교 연산자를 사용하여 조건을 지정할 수 있습니다. a= b : a는 b와 같음 a = b
      • a > b : a는 b보다 큼
        a < b : a는 b보다 작음
        a >= b : a는 b보다 크거나 같음
        a <= b : a는 b보다 작거나 같음
        a <> b : a는 b와 같지 않음
        a != b : a는 b와 같지 않음
    • 논리 연산자를 사용하여 여러 조건을 결합하거나 결과를 반전시킬 수 있습니다.
      • a AND b : a와 b 두 조건이 모두 TRUE일 경우, TRUE를 반환
        a OR b : a와 b 두 조건 중 한 조건이라도 TRUE일 경우, TRUE를 반환
        NOT a : 주어진 조건 a의 결과를 반대로 반환 (a가 TRUE이면 FALSE, a가 FALSE이면 TRUE)
    • 문자열, 날짜, 수치 등의 함수를 사용하여 조건을 세밀하게 설정할 수 있습니다.
    •  
  • AS
    • AS 는 테이블명과 컬럼명을 별칭 하는 데 사용합니다. SELECT절에서 컬럼명 뒤에 AS키워드와 별칭을 지정하여 사용합니다. 별칭은 결과셋에서 해당 컬럼의 이름으로 사용됩니다.
      FROM절에서는 테이블명 뒤에 AS키워드와 별칭을 지정하여 사용합니다. SELECT, WHERE, GROUP BY, ORDER BY 등 구문에서 FROM절에서 별칭 한 테이블을 참조 시 ‘별칭.테이블명’ 형식으로 사용합니다.
       
  • GROUP BY
    • GROUP BY는 지정한 컬럼을 기준으로 결과를 그룹화합니다. GROUP BY절에 그룹화 할 컬럼명 리스트를 “’column1, column2,..” 형식으로 순서대로 나열해 줍니다.
       
  • HAVING
    • HAVING은 앞의 GROUP BY절에서 그룹화 한 결과에 대해 특정 조건을 적용하여 필터링 하는데 사용합니다.
      HAVING은 그룹화 된 데이터를 필터링하고, WHERE은 개별 행에 대해 필터링을 수행한다는 점에서 차이가 있습니다.
       
  • ORDER BY
    • ORDER BY 는 SQL 질의의 결과를 특정 컬럼 또는 여러 컬럼을 기준으로 정렬합니다. 여러 컬럼을 기준으로 정렬하고자 할 경우 “column1, column2, ..” 형식으로 컬럼명을 나열해줍니다. 첫 번째 열을 기준으로 정렬한 후, 동일한 값이 있을 경우 두 번째 열을 기준으로 추가 정렬을 수행하고, 이를 계속 반복합니다.
      기본적으로 오름차순(’ASC’)으로 정렬되며, 내림차순으로 정렬하려면 ‘DESC’ 키워드를 사용합니다.
       
  • LIMIT
    • LIMIT은 반환할 행의 최대 수를 지정하여 결과를 제한합니다. 제한할 행(limiting number)의 시작 인덱스는 0부터 시작하며, 반환할 행의 수를 지정하여 결과의 범위를 조절할 수 있습니다.
 

2.1.2. DQL 쿼리 실행 순서

BigQuery에서 쿼리 실행 시, 실제로 처리되는 순서는 쿼리 작성 순서와 다릅니다. 쿼리 실행 시 데이터베이스 시스템이 데이터를 효율적으로 필터링하고 조작하기 위해 WHERE, GROUP BY, HAVING , SELECT 구문의 순서로 재구성합니다.
 
DQL의 구성에 따라 처리 순서가 변동 될 수 있으나, 일반적인 순서는 다음과 같습니다.
  1. FROM: 데이터를 조회할 기본 테이블을 정의합니다.
  1. WHERE: 특정 조건을 만족하는 행을 필터링합니다.
  1. GROUP BY : 지정된 열을 기준으로 결과를 그룹화합니다.
  1. HAVING: WHERE절에서 행을 필터링 후 그룹화된 결과에서 추가적인 조건을 지정합니다.
  1. SELECT: 조회할 열을 지정하고, 필요한 경우 계산된 열을 정의합니다.
  1. ORDER BY: 지정된 열을 기준으로 결과를 정렬합니다.
  1. LIMIT: 결과의 행 수를 제한합니다.
 
SELECT는 앞에서 살펴보았던 다양한 구성요소와 함께 ‘기본 조회’, ‘조건부 조회’, ‘정렬 후 조회’, ‘그룹화 및 집계’ 앞의 4가지 기능을 수행할 수 있습니다.
 

2.1.3. DQL의 기능

  • 기본 조회 구문
FROM절에서 추출하고자 하는 데이터의 테이블명 “Table1”을, SELECT절에서 조회하고자 하는 컬럼 2가지 “column1”, “column2”를 지정합니다.
AS 키워드는 결과 집합의 컬럼에 별칭을 부여하는 데 사용됩니다. 별칭은 컬럼의 이름을 변경하거나 컬럼에 대한 이름을 지정할 때 사용됩니다. SELECT문의 컬럼명을 변경하는데 사용할 수 있습니다. FROM절에서도 데이터의 별칭을 제공합니다.
SELECT column1 , column2 FROM Table1 AS alias;
💡
SELECT 절이 쿼리 문장에서 FROM 절 앞에 위치하여야 합니다. 실행 순서 측면에서는 FROM절이 먼저 처리됩니다. 앞에서 살펴보았던 SELECT의 구성요소인 WHERE, GROUP BY, HAVING, ORDER BY, LIMIT절은 선택사항으로 필요에 따라 쿼리에서 제외시킬 수 있습니다.
 
예시 1
아래 예시는 oracle의 HR 데이터셋의 “employees” 테이블을 별칭 “e”로 지정합니다. 별칭 “e”의 “first_name”, “last_name” 컬럼의 모든 값을 조회합니다.
SELECT e.first_name , e.last_name FROM `HR.employees` AS e;
notion imagenotion image
💡
SELECT절과 FROM절에서 AS를 생략하고 별칭을 사용할 수 있습니다. 그러나 SELECT절에서 별칭을 생략하는 것은 권장하지 않습니다. FROM절에서 지정한 별칭을 이용해 SELECT절에서는 ‘테이블별칭.컬럼명’ 형태로 사용함으로써 어떤 컬럼이 어느 테이블에서 나왔는지 명확히 할 수 있습니다. 해당 방식은 쿼리의 가독성을 향상시키는데 도움을 줍니다.
 
만약 FROM 절에서 별칭을 정의했다면, SELECT 절에서 해당 별칭을 사용해야 합니다. 반대로 FROM에서 별칭 “d”를 지정하지 않았다면, SELECT절에서 별칭을 사용할 수 없습니다.
SELECT e.first_name , d.department_name FROM `HR.employees` AS e;
notion imagenotion image
 
예시 2
“employees” 테이블의 모든 열에 대한 값을 조회합니다. AS는 생략이 가능하며 뒤에 별칭을 바로 지정할 수 있습니다.
SELECT * FROM `HR.employees` e;
notion imagenotion image
💡
BigQuery의 경우, 탐색하고자 하는 데이터 용량에 따라 비용이 부과됩니다. 따라서 *(Asterisk) 사용을 자제하고, 조회하고자 하는 컬럼명만 나열한 뒤 *를 사용하는 것을 권장합니다.
 
AS를 사용하여 SELECT문에서 조회하고자 하는 컬럼명을 변경 해줄 수도 있습니다. 새로 지어진 이름은 별칭(Alias)이라고합니다.
SELECT column1 AS alias FROM Table1;
 
예시 3
다음 예시는 “employees” 테이블에서 컬럼명 “salary”를 별칭 “월급”으로 변경합니다.
SELECT salary AS `월급` FROM `HR.employees`;
notion imagenotion image
notion imagenotion image
💡
별칭 하고자 하는 이름이 한글이라면, 위의 예시에서 사용한 별칭 `월급`처럼, 별칭 앞뒤에는 반드시 백틱(`)을 써주어야 합니다. 백틱이 아닌 따옴표(")를 쓸 경우 아래와 같은 에러가 발생합니다.
notion imagenotion image
 
  • 조건부 조회 구문
특정 조건을 만족하는 행만 조회하기 위해 WHERE절에 조건식(condition)을 설정해 주고, FROM절에서 추출하고자 하는 데이터의 테이블명 “Table1”을, SELECT절에서 조회하고자 하는 컬럼 2가지 “column1”, “column2”를 지정합니다.
SELECT column1 , column2 FROM Table1 WHERE condition;
 
예시 1
다음 예시는 “employees” 테이블에서 “salary”가 15,000 이상인 직원들의 “first_name”, “last_name”, “hire_date”, “salary”를 ‘이름’, ‘성’, ‘입사일자’, ‘월급’으로 지정해 조회합니다.
SELECT first_name AS `이름` , last_name AS `성` , hire_date AS `입사일자` , salary AS `월급` FROM `HR.employees` WHERE salary >= 15000;
notion imagenotion image
 
예시 2
다음 예시는 “departments” 테이블에서 “department_name” 컬럼의 값이 ‘IT’인 모든 직원들의 정보를 조회합니다.
SELECT * FROM `HR.departments` WHERE department_name = 'IT';
notion imagenotion image
 
  • 정렬 후 조회 구문
결과를 지정된 열의 값에 따라 오름차순(ASC) 또는 내림차순(DESC)으로 정렬하고, 조회하고자 하는 결과의 갯수를 LIMIT절에서 limiting number을 지정해 주어 제한할 수 있습니다.
SELECT column1 , column2 FROM Table1 ORDER BY column [1|2] [ASC|DESC]; LIMIT limiting number;
💡
ORDER BY는 보통 쿼리의 최하단에 위치하며 ORDER BY절 아래에는 LIMIT절에서 limiting number를 지정하여 결과 갯수를 제한해줄 수 있습니다.
 
예시 1
다음 예시는 “employees” 테이블에서 모든 직원의 “first_name”, “last_name”, “salary”를 “salary” 기준으로 내림차순으로 정렬하여 상위 5개만 조회합니다.
SELECT first_name , last_name , salary FROM `HR.employees` ORDER BY salary DESC LIMIT 5;
notion imagenotion image
 
예시 2
“countries” 테이블에서 컬럼명 “region_id”는 오름차순 정렬하고 동일한 지역 id에서는 “country_name”으로 내림차순 정렬합니다. “region_id”의 별칭을 ‘지역ID’, “country_id”의 별칭을 ‘국가ID’, “country_name”의 별칭을 ‘국가명’으로 지정하여 조회합니다.
SELECT region_id AS `지역ID` , country_id AS `국가ID` , country_name AS `국가명` FROM `HR.countries` ORDER BY region_id ASC, country_name DESC
notion imagenotion image
 
  • 그룹화 및 집계
SELECT절에서 그룹화의 기준인 컬럼명을 지정해 줍니다. COUNT는 집계함수 중 하나로, 특정 열의 값의 개수를 반환합니다.
GROUP BY 절은 “column1”의 각 고유한 값에 대해 각 컬럼 값에 따라 행들을 묶어 그룹을 생성합니다. GROUP BY절 뒤에 나오는 집계함수(Aggregation)는 각 그룹에 대해 적용됩니다.
SELECT column1 , Aggregation(column2) FROM Table1 GROUP BY column1;
 
예시 1
“countries“테이블에서 “region_id” 별로 그룹화합니다. “region_id”의 “country_id”를 집계함수 COUNT를 이용하여 갯수를 세고 별칭을 ‘num_country’로 지정하여 조회합니다.
SELECT region_id , COUNT(country_id) AS num_country FROM `HR.countries` GROUP BY region_id
notion imagenotion image
💡
별칭으로 영문을 사용하면 `(백틱)을 사용하지 않고 조회할 수 있지만, SELECT, FROM등 예약어를 별칭으로 사용하려면 반드시 따옴표를 사용해야 합니다.
 
예제 2
다음 예시는 "employees" 테이블에서 급여가 $7,000 초과인 직원들의 데이터를 기반으로, 부서별 평균 급여를 계산합니다. 계산된 평균 급여가 $10,000 초과 및 $19,000 미만인 부서들의 ID와 평균 급여를 내림차순으로 상위 3개만 출력합니다.
SELECT department_id , AVG(salary) AS avg_salary FROM `HR.employees` WHERE salary > 7000 GROUP BY department_id HAVING AVG(salary) > 10000 AND AVG(salary) < 19000 ORDER BY avg_salary DESC LIMIT 3;
notion imagenotion image
 

2.2. DML

DML(Data Manipulation Language)은 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 조작하고 관리할 수 있는 명령어입니다.
데이터 조작어인 DML은 테이블에 저장된 데이터에 대한 생성, 읽기, 업데이트, 삭제 작업을 수행할 수 있으며 대표적으로 INSERT, UPDATE, DELETE가 있습니다.
DML 쿼리는 데이터를 추가하거나 업데이트, 삭제하는 데 사용되며, DQL 쿼리는 데이터를 조회하고 분석하는 데 사용됩니다. BigQuery에서 이러한 쿼리를 실행할 때는 쿼리 작성, 실행 및 결과 처리 단계를 따릅니다.
 

2.2.1. DML의 특징

  1. 불변성 : BigQuery는 기본적으로 데이터의 불변성 원칙을 따릅니다. DML 작업은 실제로 기존 데이터를 ‘변경’하는 것이 아니라 새로운 데이터를 쓰는 방식으로 동작합니다.
  1. 쿼터 및 제한 : BigQuery는 DML 작업에 대한 일일 쿼터와 제한이 있습니다. 예를 들어, 특정 테이블에 대한 DML 작업의 빈도 및 업데이트된 행의 수 등에 제한이 있을 수 있습니다.
  1. 비용 : DML 작업은 BigQuery에서 데이터를 스캔하므로 비용이 발생할 수 있습니다. 따라서 비용과 관련된 부분을 고려하여 DML 작업을 수행해야 합니다.
 

2.2.2. DML의 구성요소

  • INSERT
INSERT는 기존 테이블의 열에 데이터를 삽입하는 행(row)을 추가하는 작업을 수행합니다.
INSERT INTO는 데이터를 삽입하기 위한 SQL 키워드이며, 데이터를 삽입할 테이블의 이름과 소괄호 안에 해당 테이블에서 삽입하고자 하는 컬럼명을 쉼표로 구분하여 나열합니다.
VALUES는 삽입할 데이터 값을 지정하는 키워드이며 실제로 삽입할 데이터 값을 괄호 안에 쉼표로 구분하여 나열합니다. 앞에서 사용한 컬럼 “column1”, “column2”을 참조하여 VALUES절에서 ‘value1’, ‘value2’와 같이 제공된 데이터는 각각 “column1”, “column2”에 삽입됩니다.
INSERT INTO Table1 (column1, column2, ...) VALUES (value1, value2, ...);
 
예시
“employees” 테이블에 새로운 직원을 추가하기 위해 컬럼명을 지정합니다.
“employee_id”, “first_name”, “last_name”, “email”, “hire_date”, “job_id”, “salary” 컬럼에 각각의 값을 삽입합니다. 해당 직원의 “employee_id”는 207, “first_name”은 Hailey, “last_name”은 Kim, “email”은 haileyk@example.com, “hire_date”는 2023-07-01, “job_id”는 IT_PROG, “salary”는 10000으로 설정합니다.
INSERT INTO `HR.employees` (employee_id, first_name, last_name, email, hire_date, job_id, salary) VALUES (207, 'Hailey', 'Kim', 'haileyk@example.com','2023-07-01', 'IT_PROG', 10000);
notion imagenotion image
 
“employees” 테이블에서 맨 마지막 행에 삽입하고자 하는 값이 추가된 것을 알 수 있습니다. 아래 이미지와 같이, 입력되지 않은 값은 NULL로 대체됩니다.
notion imagenotion image
 
💡
INSERT할 값의 형식이 기존과 다를 경우 에러가 발생합니다. 예를 들어, 기존 DATE유형 컬럼의 형식이 ‘2023-07-01’일 때, ‘01-JUL-2023’ 데이터를 INSERT하면 아래와 같은 에러가 발생합니다.
notion imagenotion image
 
  • UPDATE
UPDATE는 테이블의 기존 행을 수정합니다.
 
UPDATE는 데이터를 수정하는 SQL 키워드이며 수정할 테이블명을 “Table1”에 지정합니다.
SET은 수정할 열과 할당될 값을 지정하는 키워드로 “column1 = value1, column2 = value2, ...” 형식으로 수정할 열과 새로운 값을 지정합니다. WHERE절에는 수정할 행에 대한 조건을 설정합니다. 해당 조건이 없을 시 테이블의 모든 행이 수정될 수 있으므로 주의가 필요합니다.
UPDATE Table1 SET column1 = value1, column2 = value2, ... WHERE condition;
 
예시
“employees” 테이블에서 “first_name”이 Hailey이고 “last_name”이 Kim인 직원의 ”salary”, “email”, “phone_number”를 각각 12000, HKIM, 515.123.8282로 변경합니다.
UPDATE `HR.employees` SET salary = 12000, email = 'HKIM', phone_number = '515.123.8282' WHERE first_name = 'Hailey' AND last_name = 'Kim';
notion imagenotion image
 
아래 결과 테이블을 보면, “phone_number”의 값 515.123.8282이 추가되고, “email”은 HKIM으로, “salary”는 12000으로 수정되었습니다.
notion imagenotion image
💡
WHERE 문을 생략한다면, 모든 직원의 “salary”, “email”, “phone_number” 값이 SET에서 정한 값으로 변경되니 주의해야 합니다.
 
  • DELETE
DELETE는 데이터를 삭제하기 위한 SQL 키워드로 테이블의 행을 삭제합니다.
 
DELETE FROM에 삭제할 데이터셋의 테이블(”Table1”)을 지정합니다.
WHERE절에 삭제할 행을 지정하는 조건을 지정합니다. WHERE절에 조건이 없을 시, 테이블의 모든 행이 삭제되므로 주의해야 합니다.
DELETE FROM Table1 WHERE condition;
 
예시
“employees” 테이블에서 “first_name”이 Hailey이고 “last_name” 이 Kim인 모든 직원을 삭제합니다.
DELETE FROM `HR.employees` WHERE first_name = 'Hailey' AND last_name = 'Kim';
notion imagenotion image
💡
DELETE 명령어를 사용 시 WHERE절을 잘못 지정하면 예상치 못한 행들이 삭제 될 수 있으므로 주의해야합니다. WHERE을 생략 시에는 전체 삭제됩니다.
 
💡
DCL(Data Control Language)은 이 책에서 왜 다루지 않나요? Google BigQuery는 GCP(Google Cloud Platform)의 일부입니다. 데이터 액세스 및 권한 관리는 GCP의 IAM(Identity and Access Management) 기능을 사용합니다. 따라서, BigQuery에서는 GRANT 및 REVOKE와 같이 권한 관리 기능 수행을 하는 데이터 제어어(DCL, Data Control Language)는 사용되지 않습니다. 따라서 본 책에서 DCL명령문은 다루지 않습니다.
❗ BigQuery에서 권한을 부여하거나 제거하기 위해서는 GCP Console의 IAM 페이지를 통해 수행하거나, gcloud 명령줄 도구 혹은 REST API를 사용합니다.
 

2.3. DDL

DDL(Data Definition Language)는 데이터베이스를 정의하는 ‘데이터 정의어’입니다.
데이터베이스에 저장 가능한 공간과 테이블 형식을 정의하면 데이터를 처리할 수 있는 구조가 됩니다.
저장 가능한 공간은 테이블, 해당 테이블의 형식이 스키마입니다.
즉, DDL은 데이터베이스의 구조나 스키마를 변경하는 데 사용되는 명령어 집합입니다.
 

2.3.1. DDL의 구성요소

DML이 데이터 자체를 조작하는 것이라면, DDL은 데이터의 구조인 테이블(TABLE), 인덱스(INDEX), 뷰(VIEW), 제약조건(CONSTRAINTS) 등 데이터베이스 객체를 생성, 수정, 삭제하는데 사용됩니다.
DDL의 대표적인 명령어로는 CREATE, ALTER, DROP 가 있습니다.
 
CREATE 는 데이터셋이나 테이블을 생성 시 사용합니다. 데이터셋을 생성하기 위해서는 CREATE SCHEMA, 테이블 생성을 하고자 하면 CREATE TABLE을 사용합니다.
 
ALTER 는 데이터셋의 테이블 구조를 수정할 때 사용합니다. 테이블에 새로운 컬럼을 추가할 때나 기존 컬럼의 속성을 변경할 때, 또는 컬럼을 삭제할 때 사용됩니다.
테이블에 새로운 컬럼을 추가하기 위해서는 ALTER TABLE ADD COLUMN문,
테이블의 이름을 변경하기 위해서는 ALTER TABLE RENAME TO문,
테이블의 컬럼을 삭제하기 위해서는 ALTER TABLE DROP COLUMN 문을 사용합니다.
 
DROP 은 기존 테이블의 컬럼명을 삭제합니다.DROP 절에서 데이터셋을 삭제 시 ALTER SCHEMA와 사용됩니다. 컬럼명 삭제 시에는 어느 테이블에서 삭제해줄 것인지도 명시해주어야 하므로 ALTER TABLE과 함께 쓰입니다.
DDL의 구성요소들에 대한 기능은 2.3.3.절에서 예시와 함께 자세하게 다루도록 하겠습니다.
 
💡
테이블의 모든 데이터만을 삭제하는 TRUNCATE도 일반 SQL에서는 DDL에 속하나, BigQuery에서는 지원하지 않습니다. 테이블의 모든 데이터만을 삭제하기 위해서는 TRUNCATE 대신 DML의 DELETE 를 사용해야 합니다.
 
💡
DDL 명령어는 데이터의 구조에 영향을 미치기 때문에 사용 시 주의해야 합니다. 특히 DROP , ALTER같은 경우 실수로 중요한 데이터나 구조를 손상시킬 위험이 있습니다. DROP의 경우 데이터베이스 객체와 그 안의 모든 데이터가 영구적으로 삭제하기 때문에 실수로 중요한 테이블을 삭제할 경우 모든 데이터를 잃게 될 수 있습니다. ALTER를 이용하여 데이터 타입 변경 시에 호환되지 않는 타입으로 변경한다면 데이터가 잘릴 수 있어 원치 않는 데이터 손실이 발생할 수 있으므로 주의해야 합니다.
 

2.3.2. DDL의 기능

DDL은 데이터 베이스 객체를 조작하는 기능을 가지고 있으며 명령어를 사용하는 즉시 취소할 수 없습니다. 또한 데이터 무결성 규칙을 설정하여 데이터 품질과 일관성을 보장합니다.
  1. 스키마의 생성(CREATE), 변경(ALTER), 삭제(DROP) 등 스키마에 대한 조작을 할 수 있습니다. 즉, 데이터베이스, 테이블, 뷰, 인덱스 등 데이터베이스 객체에 대한 조작을 수행합니다.
  1. 직접 데이터 베이스의 테이블에 영향을 주기 때문에 실행 즉시 자동으로 테이블 상태를 데이터베이스에 적용되어 명령어를 취소(ROLLBACK) 할 수 없습니다.
  1. 데이터 무결성 규칙을 지정하는데 사용할 수 있습니다. 무결성을 보장하기 위한 규칙과 제약조건도 DDL을 통해 정의하여 데이터의 품질과 일관성을 보장하는데 도움을 줍니다.
 

2.3.3. CREATE

CREATE를 사용하면 SCHEMA, 테이블, 뷰 등 객체를 생성할 수 있습니다.
 
  • CREATE SCHEMA
BigQuery에서 SCHEMA는 데이터셋을 의미하며, CREATE SCHEMA를 통해 데이터셋을 생성합니다.
CREATE SCHEMA [ IF NOT EXISTS ] [project_name.]dataset_name [DEFAULT COLLATE collate_specification] [OPTIONS(schema_option_list)];
project_name은 데이터셋을 만들 프토젝트의 이름입니다. project_name을 입력하지 않으면, DDL 문을 실행하는 프로젝트에 데이터셋이 생성됩니다.
 
CREATE SCHEMA mydataset;
notion imagenotion image
IF NOT EXISTS구문을 사용하면 동일한 이름의 데이터셋이 있을 경우 CREATE문이 동작하지 않습니다. 또한 DEFAULT COLLATE를 지정하여 STRING 유형 컬럼의 정렬 방식을 지정할 수 있고, OPTION 구문을 이용하여 옵션을 설정할 수 있습니다. 다양한 옵션은 공식 문서를 참고해 주시기 바랍니다.
 
  • CREATE TABLE
CREATE TABLE [dataset_name.]table_name ( column_name column_schema [NOT NULL]);
column_name은 열 이름입니다. 300자 이하의 문자열로, 영문 소문자(a-z), 대문자(A-Z), 숫자(0-9), 밑줄(_)만을 포함할 수 있으며, 문자나 밑줄로 시작해야 합니다. column_schema는 데이터 유형을 지정하고, NOT NULL을 입력하여 해당 컬럼이 NULL 값을 가질 수 없도록 설정할 수 있습니다. NOT NULL을 입력하지 않으면, 해당 컬럼의 값은 NULL을 포함할 수 있습니다.
 
CREATE TABLE mydataset.departments ( department_id INTEGER NOT NULL, department_name STRING, location_id INTEGER, manager_id INTEGER);
notion imagenotion image
 
CREATE TABLE구문에서 DEFAULT COLLATE를 설정하거나, OPTION구문을 통한 다양한 옵션을 설정할 수 있습니다. 또한, 파티션이나 클러스터를 설정하여 테이블을 최적화 할 수 있습니다.
💡
테이블의 다양한 옵션을 설정하는 방법은 공식 문서를 참고해 주시기 바랍니다.
 
이 외에도 임시 테이블을 설정하거나 백업 테이블을 생성할 수 있습니다.
💡
CREATE TABLE COPY : 원본 테이블의 내용을 복사한 테이블을 생성합니다. 원본 테이블의 변경사항에 영향을 받지 않습니다. CREATE TABLE CLONE : 원본 테이블과 복제된 테이블은 독립적인 테이블이지만, 한 테이블의 변경사항이 다른 테이블에 적용됩니다. CREATE SNAPSHOT TABLE : 특정 시점 원본 테이블의 스냅샷을 생성합니다.
자세한 방법은 공식 문서를 참고해 주시기 바랍니다.
 

2.3.4. ALTER

ALTER를 사용하면 SCHEMA와 테이블 등 객체를 수정할 수 있습니다.
  • ADD COLUMN
ADD COLUMN을 사용하여 테이블에 새로운 컬럼을 추가합니다.
ALTER TABLE table_name ADD COLUMN [IF NOT EXISTS] column[, ...];
 
아래 예시는 “departments”테이블에 STRING유형의 “newcolumn”컬럼을 추가합니다.
ALTER TABLE mydataset.departments ADD COLUMN newcolumn STRING;
notion imagenotion image
 
  • RENAME TO (rename table)
RENAME TO를 사용하여 테이블 이름을 변경합니다.
ALTER TABLE [IF EXISTS] table_name RENAME TO new_table_name;
 
아래 예시는 이전에 생성한 “departments”테이블의 이름을 “newtable”로 수정합니다.
ALTER TABLE mydataset.departments RENAME TO newtable;
notion imagenotion image
 
  • RENAME COLUMN
RENAME COLUMN을 사용하여 컬럼 이름을 변경합니다.
ALTER TABLE [IF EXISTS] table_name RENAME COLUMN [IF EXISTS] column_name TO new_column_name[, ...];
 
아래 예시는 “newtable”의 “newcolumn”컬럼의 이름을 “columnA”로 변경합니다.
ALTER TABLE mydataset.newtable RENAME COLUMN newcolumn TO columnA;
notion imagenotion image
 
  • DROP COLUMN
DROP COLUMN을 사용하여 테이블 내 컬럼을 제거합니다.
ALTER TABLE table_name DROP COLUMN [IF EXISTS] column_name [, ...];
 
아래 예시에서는 이전에 RENAME COLUMN으로 컬럼 이름을 변경했던 “columnA”를 제거합니다.
ALTER TABLE mydataset.newtable DROP COLUMN columnA;
notion imagenotion image
 
💡
테이블을 생성할 때 지정한 COLLATE를 변경하거나, 테이블 옵션을 변경할 수 있습니다. 또한, ALTER SCHEMA를 사용하여 테이블 옵션을 수정하거나, ALTER COLUMN을 사용하여 컬럼 SCHEMA를 변경할 수 있습니다. 자세한 내용은 공식 문서를 참고해 주시기 바랍니다.
 

2.3.5. DROP

DROP을 사용하여 객체를 삭제할 수 있습니다.
 
  • DROP TABLE
DROP TABLE을 사용하여 테이블을 삭제할 수 있습니다. DROP TABLE은 삭제할 테이블이 저장된 데이터셋 명을 함께 지정해야 합니다.
DROP TABLE [IF EXISTS] dataset_name.table_name;
 
아래 예시는 DROP TABLE을 사용하여 “mydataset”데이터셋의 “newtable”테이블을 삭제합니다.
DROP TABLE mydataset.newtable;
notion imagenotion image
 
  • DROP SCHEMA
DROP SCHEMA를 사용하여 데이터셋을 삭제할 수 있습니다.
DROP SCHEMA [IF EXISTS] [project_name.]dataset_name [CASCADE|RESTRICT];
DDL 문을 실행하는 프로젝트의 데이터셋이 아닌 경우, 프로젝트 이름을 함께 명시해야 합니다. 또한, 데이터셋은 테이블과 함수 등 다양한 리소스를 포함하고 있기 때문에 삭제 옵션을 지정해야 합니다. CASCADE는 데이터셋 내 모든 리소스를 함께 삭제합니다. RESTRICT는 데이터셋이 비어 있는 경우에만 데이터셋을 삭제합니다. 데이터셋에 리소스가 있으면 오류를 반환합니다. 기본값은 RESTRICT입니다.
 
아래 예시는 DROP SCHEMA를 사용하여 “mydataset” 데이터셋을 삭제합니다.
DROP SCHEMA mydataset;
notion imagenotion image
💡
이 외에도 DROP을 사용하여 다양한 객체를 삭제할 수 있습니다. 자세한 방법은 공식 문서를 참고해 주시기 바랍니다.