📝

3. SQL 연산자와 표현식

 

3.1. 연산자

SQL 쿼리를 실행할 때 다양한 연산자를 사용하여 데이터를 처리할 수 있습니다. 데이터를 계산하여 복잡한 쿼리를 작성하거나 조건을 설정하여 데이터를 필터링하고 가공하여 원하는 결과를 얻을 수 있습니다.
 

3.1.1. 산술 연산자

숫자 데이터를 다룰 때 사용되며, 더하기(+), 빼기(-), 곱하기(*), 나누기(/)의 기본 산술 연산을 수행합니다.
  • + (덧셈): 두 값 또는 열을 더합니다.
    • SELECT a+b;
  • - (뺄셈): 두 값 또는 열을 빼냅니다.
    • SELECT a-b;
  • * (곱셈): 두 값 또는 열을 곱합니다.
    • SELECT a*b;
  • / (나눗셈): 두 값 또는 열을 나눕니다.
    • SELECT a/b;
       
예시 1
10과 2의 덧셈, 뺄셈, 곱셈, 나눗셈을 구해봅니다.
SELECT 10+2 , 10-2 , 10*2 , 10/2;
notion imagenotion image
 
예시 2
“jobs” 테이블에서 모든 항목과 직업별로 최고 연봉(”max_salary”)과 최소 연봉(”min_salary”)의 차이를 조회합니다.
SELECT * , max_salary - min_salary AS range_salary FROM `HR.jobs`;
notion imagenotion image
 
예시 3
“employees” 테이블에서 “salary”, “commission_pct” 컬럼명과 사원별로 “salary”에 “commission_pct”를 곱한 금액을 “salary”에 더해 조회합니다.
SELECT salary , commission_pct , salary+salary*commission_pct AS commission_price FROM `HR.employees`;
notion imagenotion image
 

3.1.2. 비교 연산자

데이터를 비교하여 조건에 맞는 데이터만 표현합니다.
SELECT * FROM Table1 WHERE column1 비교_연산자 비교할_값;
  • a=b (등호): a와 b 두 값이 같으면 TRUE를 반환합니다.
  • a<b (작음, 미만): a가 b보다 작으면 TRUE를 반환합니다.
  • a>b (큼, 초과): a가 b보다 크면 TRUE를 반환합니다.
  • a<=b (작거나 같음, 이하): a가 b보다 작거나 같으면 TRUE를 반환합니다.
  • a>=b (크거나 같음, 이상): a가 b보다 크거나 같으면 TRUE를 반환합니다.
  • a!=b 또는 a<>b (부등호): a, b 두 값이 같지 않으면 TRUE를 반환합니다.
 
예시 1
“employees” 테이블에서 “first_name”이 “John”인 “employee_id”, “first_name”을 조회합니다.
SELECT employee_id , first_name FROM `HR.employees` WHERE first_name = 'John';
notion imagenotion image
 
예시 2
“employees” 테이블에서 “first_name”이 “John”이 아닌 “employee_id”, “first_name”을 조회합니다.
SELECT employee_id , first_name FROM `HR.employees` WHERE first_name <> 'John';
SELECT employee_id , first_name FROM `HR.employees` WHERE first_name != 'John';
notion imagenotion image
 
예시 3
“employees” 테이블에서 “salary”가 15000을 초과하는 행의 “employee_id”, “salary”를 조회합니다.
SELECT employee_id , salary FROM `HR.employees` WHERE salary > 15000;
notion imagenotion image
 
예시 4
“employees” 테이블에서 “salary”가 15000 이상인 행의 “employee_id”, “salary”를 조회합니다.
SELECT employee_id , salary FROM `HR.employees` WHERE salary >= 15000;
notion imagenotion image
 
예시 5
”employees” 테이블에서 “salary”가 10000 미만인 “employee_id”, “salary”를 조회합니다.
SELECT employee_id , salary FROM `HR.employees` WHERE salary < 10000;
notion imagenotion image
 
예시 6
”employees” 테이블에서 “salary”가 10000 이하인 “employee_id”, “salary”를 조회합니다.
SELECT employee_id , salary FROM `HR.employees` WHERE salary <= 10000;
notion imagenotion image
 

3.1.3. 논리 연산자

여러 조건을 결합하거나 조건이 참인지 거짓인지 판단합니다. 논리 연산자들을 사용하여 데이터를 필터링하거나 복잡한 쿼리를 작성할 수 있습니다. 우선순위는 NOT, AND, OR입니다.
SELECT a AND b; SELECT a OR b; SELECT NOT a;
  • AND (논리곱): 두 조건이 모두 참일 때 참을 반환합니다.
    • SELECT TRUE AND TRUE; // TRUE SELECT TRUE AND FALSE; // FALSE SELECT FALSE AND TRUE; // FALSE SELECT FALSE AND FALSE; // FALSE
  • OR (논리합): 두 조건 중 하나 이상이 참일 때 참을 반환합니다.
    • SELECT TRUE OR FALSE; // TRUE SELECT TRUE OR FALSE; // TRUE SELECT FALSE OR TRUE; // TRUE SELECT FALSE OR FALSE; // FALSE
  • NOT (논리적 NOT): 조건이 아닌, 부정인 레코드를 반환합니다.
    • SELECT NOT TRUE; // FALSE SELECT NOT FALSE; // TRUE
 
예시 1
”employees” 테이블에서 “first_name”이 “David”이고, “employee_id”가 150 이상인 “employee_id”, “first_name”을 조회합니다.
SELECT employee_id , first_name FROM `HR.employees` WHERE first_name = 'David' AND employee_id >= 150;
notion imagenotion image
 
예시 2
”employees” 테이블에서 “first_name”이 “John”이거나, “job_id”가 “ST_CLERK”인 “employee_id”, “first_name”, “job_id”를 조회합니다.
SELECT employee_id , first_name , job_id FROM `HR.employees` WHERE first_name = 'John' OR job_id = 'ST_CLERK';
notion imagenotion image
 
예시 3
”employees” 테이블에 서“first_name”이 “Peter”가 아니거나 “department_id”가 50 이상이 아닌 “employee_id”, “first_name”, “department_id”를 조회합니다.
SELECT employee_id , first_name , department_id FROM `HR.employees` WHERE NOT (first_name = 'Peter' OR department_id >= 50);
notion imagenotion image
 

3.1.4. LIKE 연산

문자열 패턴을 기반으로 지정된 패턴과 일치하는 문자열 값을 필터링합니다.
  • 비교 문자와 형태가 일치하는지 확인합니다.
  • 와일드카드 : %(모든 문자), _(언더바, 한 개의 글자) 사용합니다.
  • 대소문자를 가리지 않습니다.
SELECT * FROM Table1 WHERE column1 LIKE '문자열 패턴';
 
예시 1
”employees”에서 “job_id”가 “CLERK”으로 끝나는 “employee_id”, “job_id”를 조회합니다.
SELECT employee_id , job_id FROM `HR.employees` WHERE job_id LIKE '%CLERK';
notion imagenotion image
 
예시 2
”employees” 테이블에서 “phone_number”가 515.으로 시작하는 “employee_id”, “phone_number”를 조회합니다.
SELECT employee_id , phone_number FROM `HR.employees` WHERE phone_number LIKE '515.%';
notion imagenotion image
 
예시 3
”employees” 테이블에서 “hire_date” 월(month)이 6월인 “employee_id”, “hire_date”를 조회합니다. (단, “hire_date”는 DATE 유형이기 때문에 문자열로 변경한 후 진행합니다.)
SELECT employee_id , hire_date FROM `HR.employees` WHERE STRING(hire_date) LIKE '%-06-%';
notion imagenotion image
 
예시 4
”employees” 테이블에서 “last_name”의 두 번째 문자가 a로 시작하는 “employee_id”, “first_name”, “last_name”를 조회합니다.
SELECT employee_id , first_name , last_name FROM `HR.employees` WHERE last_name LIKE '_a%';
notion imagenotion image
 
예시 5
”employees” 테이블에서 “phone_number”에서 첫 번째 점(.) 이후에 3개의 글자로 이루어지고 두 번째 점(.)으로 끝나고 나머지 번호가 이어지는 “employee_id”, “phone_number”를 조회합니다.
ex) 010.000.0000(O)
010.00.0.0000(X)
SELECT employee_id , phone_number FROM `HR.employees` WHERE phone_number LIKE '%.___.%';
notion imagenotion image
 
언더바(_)의 개수가 3개이므로 첫 번째 점(.) 뒤에 세 글자가 붙고 두 번째 점(.)으로 끝나며, 번호가 계속해서 이어지는 “phone_number” 레코드를 조회합니다.
 

3.1.5. BETWEEN 연산

특정 범위의 값들을 검색할 때 사용됩니다. 주어진 값이 두 개의 지정된 값 사이에 위치한 경우 해당 레코드를 선택합니다. 숫자, 날짜 및 문자열 값에 대해 사용할 수 있어 데이터의 범위를 지정하여 쿼리를 구성할 때 유용합니다.
SELECT * FROM Table1 WHERE column1 BETWEEN A AND B;
  • BETWEEN A AND B : A와 B를 포함(이상, 이하) 하면 TRUE를 반환합니다.
 
예시 1
”employees” 테이블에서 “salary”가 10,000 이상이거나 15,000 이하인 “employee_id”, “salary”를 조회합니다.
SELECT employee_id , salary FROM `HR.employees` WHERE salary BETWEEN 10000 AND 15000;
SELECT employee_id , salary FROM `HR.employees` WHERE salary >= 10000 and salary <= 15000;
notion imagenotion image
 
예시 2
”employees” 테이블에서 2006년 3월 고용한 직원의 “employee_id”, “hire_date”를 조회합니다.
SELECT employee_id , hire_date FROM `HR.employees` WHERE hire_date BETWEEN '2006-03-01' AND '2006-03-31';
SELECT employee_id , hire_date FROM `HR.employees` WHERE hire_date >= '2006-03-01' AND hire_date <= '2006-03-31';
notion imagenotion image
 

3.1.6. IN 연산

여러 값을 비교할 때 사용됩니다. 주어진 열 또는 표현식이 여러 값을 가지고 있는지 확인하고, 그중 하나와 일치하는 레코드를 반환합니다.
SELECT * FROM Table1 WHERE column1 IN A;
  • IN A : A 값과 일치하면 TRUE를 반환합니다.
 
예시
”employees” 테이블에서 “first_name”이 “David”와 일치하는 모든 항목을 조회합니다.
SELECT * FROM `HR.employees` WHERE first_name IN ('David');
notion imagenotion image
 

3.1.7. IS / IS NOT 연산자

IS NULL : 값이 NULL 인지 확인합니다.
  • 1(TRUE) : NULL 값을 가지고 있습니다.
  • 0(False) : NULL 값을 가지고 있지 않습니다.
SELECT * FROM Table1 WHERE column1 IS NULL;
 
IS NOT NULL : 값이 NULL이 아닌지 확인합니다. 예를 들어, NULL(빈 값) != 'NULL'(문자 값)은 서로 타입이 다르다는 것을 확인할 수 있습니다.
  • 1(TRUE) : NULL 값을 가지고 있지 않습니다.
  • 0(False) : NULL 값을 가지고 있습니다.
SELECT * FROM Table1 WHERE column1 IS NOT NULL;
 
IS / IS NOT 연산자는 NULL 대신 TRUE, False 값으로도 설정할 수 있습니다.
SELECT * FROM (SELECT TRUE AS t) WHERE t IS TRUE;
notion imagenotion image
 
예시 1
”employees” 테이블에서 ”manager_id”가 NULL 값인 것을 조회합니다.
SELECT * FROM `HR.employees` WHERE manager_id IS NULL;
notion imagenotion image
 
예시 2
”departments” 테이블에서 “manager_id”가 NULL 값이 아닌 “employee_id”, “manager_id”를 조회합니다.
SELECT employee_id , manager_id FROM `HR.departments` WHERE manager_id IS NOT NULL;
notion imagenotion image
 

3.2. 정규 표현식

정규표현식(Regular Expression)은 문자열에서 특정 패턴을 찾거나 다른 문자열로 대체하거나 특정 형식을 검증하는데 사용되는 문자열의 특정한 패턴을 나타내는 식입니다. 문자열이 가지고 있는 규칙을 파악하고, WHERE 절에 조건을 설정하여 원하는 데이터를 추출하거나 SELECT 절에서 문자열을 원하는 형태로 변경하여 조회할 수 있습니다. 다양한 함수를 이용해 정규 표현식을 사용하는 방법은 4장을 참고해 주시기 바랍니다.
 
이 장에서 정규 표현식 패턴 예시는 정규 표현식 함수 REGEXP_SUBSTR() , REGEXP_EXTRACT()를 사용합니다. REGEXP_CONTAINS() 함수는 (컬럼, 정규 표현식)을 입력받아 컬럼의 값이 정규 표현식을 만족하면 TRUE, 만족하지 않으면 FLASE를 반환합니다. REGEXP_SUBSTR()함수는 (컬럼, 정규 표현식)을 입력받아 각 행의 지정한 컬럼에서 정규 표현식을 만족하는 첫 번째 패턴을 추출합니다.
 

3.2.1. 문자 매칭

  • 문자 지정
지정한 문자를 포함한 데이터를 추출할 때 사용합니다. 논리 연산자 | 를 사용하여 여러 문자를 지정할 수 있습니다. 정규 표현식은 대소문자를 구별하기 때문에 문자를 지정할 때 대소문자를 고려해서 정확히 지정해야 합니다.
 
예시
아래 예시는 “departments” 테이블의 “department_name” 컬럼이 ‘IT’ 혹은 ‘Marketing’ 문자를 포함하는 데이터를 출력합니다.
SELECT * FROM `HR.departments` WHERE REGEXP_CONTAINS(department_name, 'IT|Marketing');
notion imagenotion image
 
  • 문자 그룹 지정
[] 에 지정하고자 하는 문자를 나열하거나 -(dash) 기호를 이용해 문자의 범위를 지정할 수 있습니다. 문자 그룹은 문자 1개를 대상으로 합니다. 일반적으로 문자 그룹은 뒤에서 다룰 반복 및 제한 패턴과 함께 사용합니다.
 
예시
아래 예시는 “locations” 테이블에서 “street_address” 컬럼 중 a부터 z, A부터 Z까지 문자를 포함하는 데이터를 출력합니다.
SELECT street_address FROM `HR.locations` WHERE REGEXP_CONTAINS(street_address, '[a-zA-Z]') LIMIT 10;
notion imagenotion image
💡
\(역슬래시)를 활용한 다양한 문자 패턴 지정 방법 \d: 숫자와 매치 ([0-9]와 같습니다.) \D: 숫자가 아닌 문자와 매치 ([^0-9]와 같습니다.) \w: 문자 혹은 숫자와 매치 ([a-zA-Z0-9]와 같습니다.) \W: 문자 혹은 숫자가 아닌 문자와 매치 ([^a-zA-Z0-9]와 같습니다.) \s: whitespace 문자와 매치 ([ \t\n\r\f\v]와 같습니다.) \S: whitespace 문자가 아닌 문자와 매치 ([^ \t\n\r\f\v]와 같습니다.)
 

3.2.2. 패턴 반복 매칭

  • 0회 이상: *
패턴을 입력한 뒤 *를 입력하면, * 앞에 입력된 패턴을 0회 이상 포함하는 문자열을 추출합니다.
 
예시
아래 예시는 “locations” 테이블의 “street_address” 컬럼에서 a부터 z, A부터 Z까지 문자가 0회 이상 반복되는 문자열을 추출합니다. 7부터 10행과 같이 패턴이 0회 반복되는 경우 공백을 반환합니다.
SELECT street_address , REGEXP_SUBSTR(street_address, '[a-zA-Z]*') FROM `HR.locations` ORDER BY 1 DESC;
notion imagenotion image
 
  • 1회 이상: +
패턴을 입력한 뒤 +를 입력하면, + 앞에 입력된 패턴을 1회 이상 포함하는 문자열을 추출합니다.
 
예시
아래 예시는 “locations” 테이블의 “street_address” 컬럼에서 a부터 z, A부터 Z까지 문자가 1회 이상 반복되는 문자열을 추출합니다.
SELECT street_address , REGEXP_SUBSTR(street_address, '[a-zA-Z]+') , REGEXP_SUBSTR(street_address, '[a-zA-Z]*') FROM `HR.locations`;
notion imagenotion image
 
  • n회 이상 m회 이하: {}
패턴을 입력한 뒤 {n, m}을 입력하면, {n, m} 앞에 입력된 패턴을 n회 이상 m회 이하 포함하는 문자열을 추출합니다. m을 입력하지 않고 {n} 형태로 n만 입력하여 반복 횟수를 지정할 수 있습니다.
 
예시
아래 예시는 “locations” 테이블의 “street_address” 컬럼에서 각각 문자 5회, 숫자가 3회 이상 4회 이하 반복되는 문자열을 추출합니다.
SELECT street_address , REGEXP_SUBSTR(street_address, '[a-zA-Z]{5}') , REGEXP_SUBSTR(street_address, '[0-9]{3,4}') FROM `HR.locations`;
notion imagenotion image
 
  • 0회 혹은 1회: ?
패턴을 입력한 뒤 ?를 입력하면, ? 앞에 입력된 패턴을 0회 혹은 1회 포함하는 문자열을 추출합니다. ?는 2회 이상 반복되는 문자열과 매칭되지 않습니다.
 
예시
아래 예시는 “locations” 테이블의 “street_address” 컬럼에서 a부터 z, A부터 Z까지 문자가 0회 혹은 1회 일치하는 패턴을 추출합니다.
SELECT street_address , REGEXP_SUBSTR(street_address, '[a-zA-Z]?') FROM `HR.locations` ORDER BY 1 DESC;
notion imagenotion image
 

3.2.3. 패턴 위치 매칭

  • 문자열의 시작: ^
정규 표현식으로 추출할 패턴의 위치를 문자열의 시작으로 지정합니다. 문자열의 시작으로 지정할 패턴을 ^ 뒤에 입력합니다.
 
예시
아래 예시는 “locations” 테이블의 “street_address” 컬럼에서 문자열이 a부터 z, A부터 Z까지 문자로 시작하는 데이터를 반환합니다.
SELECT street_address FROM `HR.locations` WHERE REGEXP_CONTAINS(street_address, '^[a-zA-Z]');
notion imagenotion image
 
  • 문자열의 마지막: $
정규 표현식으로 추출할 패턴의 위치를 문자열의 마지막으로 지정합니다. 문자열의 마지막으로 지정할 패턴을 $ 앞에 입력합니다.
 
예시
아래 예시는 “locations” 테이블의 “street_address” 컬럼에서 문자열의 마지막이 a부터 z, A부터 Z까지 문자인 데이터를 반환합니다.
SELECT street_address FROM `HR.locations` WHERE REGEXP_CONTAINS(street_address, '[a-zA-Z]$');
notion imagenotion image
 
  • 문자열의 한 자리: .
문자 한 개의 위치를 지정합니다. 숫자와 특수문자를 비롯한 모든 문자를 포함합니다.
 
예시
아래 예시는 “locations” 테이블의 “city” 컬럼에서 S로 시작해서 e로 끝나며, 그 사이에 어떠한 문자가 1개 이상 포함된 도시명을 반환합니다.
SELECT city FROM `HR.locations` WHERE REGEXP_CONTAINS(city, '^S.+e$');
notion imagenotion image
 

3.2.4. escape

escape 문자는 *, +, []와 같은 메타 문자를 기능이 아닌 문자 그대로 지정할 때 사용합니다. 문자 그대로 지정할 메타 문자를 \(역슬래시) 뒤에 입력해서 사용합니다.
 
예시
아래 예시는 “employees” 테이블의 “phone_number” 컬럼에서 “000.000.0000” 과 같은 패턴을 가진 데이터를 반환합니다. . 문자를 기능이 아닌 문자 그대로 사용하기 위해 escape 문자 \를 사용했습니다. escape 문자 \ 또한 문자 그대로 사용해야 하기 때문에 최종적으로 \\.를 입력합니다.
SELECT first_name , email , phone_number , hire_date FROM `HR.employees` WHERE REGEXP_CONTAINS(phone_number, '[0-9]{3}\\.[0-9]{3}\\.[0-9]{4}');
notion imagenotion image