📋

2회차

SQL 함수란?

미리 정의된 기능 모음, 단일 행 함수와 그룹 함수가 있습니다. 모든 함수를 나열한 것은 아니지만, 전체적으로 어떤 기능들이 구현되어 있는지 보기에는 수월할 것입니다.

데이터 타입 함수
  • 문자 : CHAR(값) : 문자 타입 지정 2000바이트 @
  • 문자 : VARCHAR2(값) : 문자 타입 지정 4000바이트
  • 숫자 : Oracle에서는 NUMBER(정수 자릿수, 소수 자릿수), MySQL은 INT사용
  • 날짜 : DATE()
  • 시간 : TIME()

문자열 처리
  • CONCAT('abc', 'def') → 'abcdef' : 문자열을 연결합니다.
  • LOWER('ABC') → 'abc'
  • UPPER('abc') → 'ABC'
  • INITCAP('abc') → 'Abc' : 앞문자만 대문자
  • SUBSTR('hello world', 1, 5) → 'hello' : 문자열을 자를 때 많이 사용합니다. 숫자는 시작위치, 자를 문자열의 길이를 나타냅니다.
  • REPLACE('hello world', 'world', 'SQL') → 'hello SQL' : 바꾸고 싶은 값으로 대상 값을 교체합니다.
  • LENGTH('hello') → 5 : 문자열의 길이를 출력합니다. COUNT와 비교해서 기억해주세요.
  • COUNT : 행의 개수를 출력합니다.
  • INSTR('ABCDEF', 'B') → 2 : 문자열의 위치를 구합니다. 여기서 INDEX는 1부터 시작합니다. 프로그래밍 언어는 0부터 시작하니, 이 차이를 꼭 기억해두세요.

  • ROUND(반올림할 숫자, 자릿수) : 숫자를 반올림, 0이 소숫점 첫째자리
  • TRUNC(절삭할 숫자, 자릿수) : 숫자를 절삭, 0이 소숫점 첫째자리
  • MOD(수, 나누는 값) : 나머지
  • POWER(수, 승수) : 제곱 출력
  • SQRT : 제곱근 출력

(실습) SQL 함수

AS를 사용하지 않아도 동일하게 출력합니다. 대문자와 소문자로 바꾸어 보았어요.

(실습) SUBSTR(컬럼, START, LENTH) : 슬라이싱

SELECT SUBSTR('hello world', 1, 5);

(실습) 문제

  1. 이름의 문자열의 길이를 출력해주세요.
  1. 이름의 앞 5자리를 *로 처리해주세요.
SELECT CustomerID, CustomerName, LENGTH(CustomerName) AS 이름길이, SUBSTR(CustomerName, 6) AS 자른이름, REPLACE(CustomerName, SUBSTR(CustomerName, 0, 6), '******') AS 별표채운이름 FROM Customers;
여기서 사용한 SUBSTR 같은 경우
  • Oracle은 SUBSTR, SUBSTRB
  • MsSQL은 SUBSTRING
  • MySQL은 SUBSTRING, SUBSTR, MID
을 사용합니다.

(실습) 날짜

날짜와 시간이 어떻게 더해지는지 확인해보세요.
SELECT DATE();
SELECT DATE() + 10;
SELECT TIME() + 10;

(실습) 통계

통계관련된 함수를 실습해봅니다. 하나씩 사용해보세요. 보통은 분산과 표준편차 함수도 제공합니다. W3School에서는 분산과 표준편차가 작동하지 않습니다.
SELECT MAX(CustomerID) AS 최댓값 FROM Customers; SELECT SUM(CustomerID) AS 전체합 FROM Customers; SELECT MIN(CustomerID) AS 최솟값 FROM Customers; SELECT COUNT(CustomerID) AS 전체행의수 FROM Customers; SELECT AVG(CustomerID) AS 평균 FROM Customers;

(실습 안함) 문자열 변환

실습은 안하지만 해당함수는 간혹 SQL Injection 공격에 사용되곤하니, 혹시 정보보안을 공부하는 학생이라면 기억해주시기 바랍니다.
SELECT CHAR(65) || CHAR(65)); SELECT CONCAT(CHAR(65), CHAR(65)); SELECT ASCII('A');
 

(실습) 문제 풀이

SELECT * FROM Products;
  1. 전체 제품의 개수를 구해주세요.
    1. /* SELECT COUNT(ProductID) FROM Products; */ SELECT COUNT(*) FROM Products;
      아래 1번 쿼리처럼 구문을 작성하시면 안됩니다. 이유는 아래 코드를 실행해보시면 알 수 있습니다.
      INSERT INTO Products (Price) VALUES ('500');
      SELECT COUNT(ProductName) FROM Products;
  1. 값의 평균을 구해주세요.(함수를 사용해주세요.)
    1. SELECT AVG(Price) FROM Products;
  1. 제품 이름이 'A'로 시작하면서 가격이 평균 이상인 제품을 구해주세요. 아래와 같이 작성하면 애러가 발생됩니다. 이유를 설명하고, 코드를 작성하세요.
    1. /* SELECT * FROM Products WHERE ProductName LIKE 'A%' AND Price > AVG(Price); */