SQL 함수 사용하기 (단일 행 함수의 숫자형 함수)

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


SQL 함수

SQL에서 함수란 데이터를 조회, 집계, 수정하는 과정에서 값을 가공하기 위해 다양한 내장함수를 제공한다. 단일 행 함수는 각각의 행(row)에 대해 개별적으로 적용되어 하나의 입력값에 대해 하나의 결과를 반환한다.

숫자형 함수

숫자를 다루는 단일 행 함수를 통해 올림, 버림, 반올림, 절대값, 나머지, 제곱수 등의 기능을 수행

CEILING, FLOOR, ROUND, TRUNCATE

  • CEILING(int): 올림
  • FLOOR(int): 내림
  • ROUNG(int, int): 지정한 위치에서 반올림
  • TRUCATE(int, int): 지정한 위치에서 절삭
SELECT CEILING(123.45);  -- 124
SELECT FLOOR(123.45);  -- 123
SELECT ROUND(123.45);  -- 124
SELECT TRUNCATE(123.45, 1);  -- 123.4

ABS, SIGN

  • ABS(int): 절대값 반환
  • SIGN(int): 양수의 경우 1, 음수인 경우 -1을 반환
SELECT ABS(-123.45);  -- 123.45
SELECT SIGN(-123.45);  -- -1

MOD

  • MOD(int, int): 나머지를 구하는 함수
SELECT MOD(203, 4);  -- 3
SELECT MOD(200, 2);  -- 0

POWER, SQRT, RAND

  • POWER(int, int): 제곱수의 값을 반환
  • SQRT(int): 제곱근을 반환
  • RAND(int): 0과 1사이의 랜덤 실수값을 반환
SELECT POWER(2,3);  -- 8
SELECT SQRT(16);  -- 4
SELECT RAND(100);  -- 0.17353134804734155 (random seed)
SELECT RAND();  -- 0.5599961407110059

SQL 함수 사용하기 (단일 행 함수의 문자형 함수)

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


SQL 함수

SQL에서 함수란 데이터를 조회, 집계, 수정하는 과정에서 값을 가공하기 위해 다양한 내장함수를 제공한다. 단일 행 함수는 각각의 행(row)에 대해 개별적으로 적용되어 하나의 입력값에 대해 하나의 결과를 반환한다.

문자형 함수

문자 데이터를 가공하거나 문자열에 대한 정보를 얻을 떄 사용

LENGTH, CHAR_LENGTH

  • LENGTH(str): 바이트 수
  • CHAR_LENGTH(str): 문자수를 반환
-- 문제: 고객 테이블에서 고객회사명의 문자 개수와 바이트 수를 조회
SELECT CHAR_LENGTH(고객회사명) AS '문자 개수', LENGTH(고객회사명) AS '바이트 수' FROM 고객;

CONCAT, CONCAT_WS

  • CONCAT(str1, str2…): 여러 문자열을 하나로 합침
  • CONCAT_WS(seperator, str1, str2…): 구분자(seperator)를 넣어 여러 문자열을 합침
-- 문제1: 고객의 담당자명과 담당자직위를 공백 없이 붙인 문자열을 출력
-- 추가로 문자열의 길이도 함께 출력
SELECT CONCAT(TRIM(담당자명), TRIM(담당자직위)) AS "공백 없음", CHAR_LENGTH("공백 없음") FROM 고객;

-- 문제2: 고객 테이블의 도시와 주소를 합쳐서 '전체 주소' 라는 별칭으로 조회
-- 단, 도시와 주소 사이는 , 로 구분
SELECT CONCAT_WS(', ', 도시, 주소) AS '전체 주소' FROM 고객;

LEFT, RIGHT, SUBSTR

  • LEFT(str, len): 문자열을 왼쪽에서 len만큼 잘라냄
  • RIGHT(str, len): 문자열을 오른쪽에서 len만큼 잘라냄
  • SUBSTR(str, pos, len): pos위치에서 len만큼 잘라냄
-- 문제: 사원 테이블에서 입사일을 기준으로 연도, 월, 일을 각각 잘라서 조회
SELECT LEFT(입사일, 4) , SUBSTR(입사일, 6,2) , RIGHT(입사일, 2)  FROM 사원;

LPAD, RPAD

  • LPAD(str, len, pad): str를 len길이 만큼 왼쪽에서부터 pad문자를 채움
  • RPAD(str, len, pad): str를 len길이 만큼 오른쪽에서부터 pad문자를 채움
-- 문제: SQL 글자의 전체길이를 10개로 맞추되 빈 공백을 #으로 왼쪽에서부터 채우기
SELECT LPAD('SQL',10,'#')  -- #######SQL
SELECT RPAD('SQL',10,'#')  -- 오른쪽에 채우가 

TRIM, LTRIM, RTRIM

  • TRIM(str): 양쪽의 공백을 제거
  • LTRIM(str): 왼쪽의 공백을 제거
  • RTRIM(str): 오른쪽의 공백을 제거
-- 문제: 고객의 담담자직위를 공백없이 문자열 출력
SELECT TRIM(담당자직위) FROM 고객;

REPLACE

  • REPLACE(str, from, to): str에서 from 문자열을 to로 바꿈
-- 문제1: 고객 테이블의 전화번호에서 구분자 - 을 . 로 변경하여 조회
SELECT 전화번호, REPLACE(전화번호, "-", ".") 번호변경 FROM 고객;

-- 문제2: 주문번호가 H0248이면, 주문일자를 "2020-03-12"에서 "20200312" 형식으로 바꾸고, 이를 이용해 "ORD-H0248-20200312" 형식의 문자열을 출력
SELECT 주문일자, REPLACE (주문일자, "-", ""), CONCAT_WS("-", "ORD", 주문번호, REPLACE (주문일자, "-", "")) FROM 고객 WHERE 주문번호 = "H0248";

SUBSRING_INDEX

  • SUBSRING_INDEX(str, ‘’, index): 지정한 구분자를 기준으로 문자열을 분리해서 가져옴
-- 문제: '서울시 동작구 흑석로'를 공백을 기준으로 2번째 인덱스까지 조회
SELECT SUBSTRING_INDEX('서울시 동작구 흑석로', ' ',  2);
SELECT SUBSTRING_INDEX('서울시 동작수 흑석로', ' ', -1); -- 흑석로 반환

FIELD

  • FIELD(str, str…): 여러 문자열 중에서 찾는 문자열이 있으면 문자열의 위치값을 반환(없으면 0)
  • FIELD(찾을 문자열, 문자1, 문자2…)
- 다음 나열에서 JAVA 몇번째 인덱스에 있는지 조회
SELECT FIELD('JAVA','C','JAVA','PYTHON'); -- 2

FIND_IN_SET

  • FIND_IN_SET(str, ‘str…’): 문자열 리스트에서 지정한 문자열을 찾아서 위치값을 반환
  • FIND_IN_SET(찾을 문자열, ‘문자열 리스트’)
    • FIND_IN_SET내에서 ,를 구분으로 첫번쨰 매개변수의 위치를 추척
    • 따라서 ‘‘내에서 띄어쓰기 x
-- 문제: 다음 나열에서 JAVA가 몇번째 인덱스에 있는지 조회
SELECT FIND_IN_SET('JAVA','C,JAVA,PYTHON');

INSTR

  • INSTR(str, substr): str에서 substr이 처음 나타나는 위치를 반환(없으면 0)
-- 문제: '네 인생을 살아라'에서 '인생'이 시작되는 인덱스 위치 조회
SELECT INSTR('네 인생을 살아라', '인생');  -- 3

ELT

  • ELT(int, str, str..): 지정한 위치에 있는 문자열을 반환
  • ELT(찾을 문자열 위치, 문자열1, 문자열2…)
SELECT ELT(2, 'SQL', 'JAVA', 'PYTHON');  -- JAVA

REVERSE

  • REVERSE(str): 문자열을 거꾸로 뒤집어 반환
SELECT REVERSE('HELLO');  -- OLLEH

REPEAT

  • REPEAT(str, int): 문자열을 반복해서 반환
  • REPEAT(반복할 문자열, 반복할 횟수)
SELECT REPEAT("*",3);  -- ***

SQL 연산자

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


연산자로 데이터 다루기

우선 MySQL 환경과 MySQLWorkbench 환경은 아래와 같다.

MySQL 8.0.42-arm64
MySQLWorkbench 8.0.42-arm64

SQL 연산자는 WHERE절 등에서 더 정교한 조건을 만들거나 SELECT 절에서 데이터를 계산할 떄 사용

산술 연산자

  • +(더하기), -(뻬기), *(곱하기), /(나누기), %(나머지)
  • DIV: 정수 나누기
  • MOD: 나머지(%와 동일)
-- 문제: 숫자 23과 5를 이용한 다양한 산술 연산 결과를 확인해보기
SELECT 23 + 5 AS 더하기, 23 - 5 AS 뺴기,23 * 5 AS 곱하기,23 / 5 AS 나누기,23 % 5 AS 나머지1 ,23 mod 5 AS 나머지2;

비교 연산자

두 값의 크기를 비교해 TRUE(1), FALSE(0)로 반환 > WHERE 절에서 많이 사용!

-- 문제1: 숫자 23과 5를 이용한 비교 연산 결과를 확인
SELECT 23 >= 5 , 23 <= 5 , 23 > 5 ,23 < 5 ,23 = 5 ,23 != 5;

-- 문제2: 사원 테이블에서 직위가 '대표 이사'가 아닌 사원의 모든 정보를 조회
SELECT * FROM 사원 WHERE 직위 != '대표 이사';
SELECT * FROM 사원 WHERE 직위 <> '대표 이사';

논리 연산자

여러개의 조건을 조합할 때 사용

  • AND: 모든 조건이 참일 때 참
  • OR: 조건 중 하나라도 참일때 참
  • NOT: 조건을 부정
-- 문제:  고객 테이블에서 '부산광역시'에 살면서 마일리지가 1,000점 미만인 고객 정보를 조회
SELECT * FROM 고객 WHERE 도시 = "부산광역시" AND 마일리지 < 1000;

집합 연산자 UNION

두개 이상의 SELECT 문을 하나로 합침

  • UNION: 중복된 행은 제거하고 합치기
  • UNION ALL: 중복 상관없이 모든 결과를 합치기
-- 문제: '부산광역시'에 살거나 또는 마일리지가 1,000점 미만인 고객의 고객번호, 도시를 조회
-- 결과는 고객번호 순으로 정렬
SELECT 고객번호, 도시 FROM 고객 WHERE 도시 = '부산광역시' UNION SELECT 고객번호, 도시 FROM 고객 WHERE 마일리지 < 1000 ORDER BY 1

SELECT 고객번호, 도시 FROM 고객 WHERE 도시 = '부산광역시' OR 마일리지 < 1000 ORDER BY 1

이떄 주의할 점은 UNION을 사용하기 위해서는 SELECT문의 컬럼개수와 데이터 타입이 서로 호환되어야 한다.

IS NULL

값이 없는 데이터를 찾음

-- 문제: 고객 테이블에서 지역 정보가 비어있는( NULL ) 고객 정보를 조회
SELECT * FROM 고객 WHERE 지역 = "";  -- 지역에 빈 문자열이 있는지 확인
UPDATE 고객 SET 지역 = null where 지역 = "";  -- 빈 문자열을 null 로 업데이트

SELECT * FROM 고객 WHERE 지역 IS NULL;

IN, BETWEEN

WHERE절의 조건을 더 간결하게 만들어줌

  • IN(값1, 값2…): 여러 OR 조건을 대체
  • BETWEEN 값1 AND 값2: 범위 조건을 간결하게 표현
-- 문제1: 고객 테이블에서 담당자 직위가 '영업 과장'이거나 '마케팅 과장'인 고객의 담당자명, 담당자직위를 조회
SELECT 담당자명, 담당자직위 FROM 고객 WHERE 담당자직위 IN ('영업 과장', '마케팅 과장');

-- 문제2: 마일리지가 100,000점 이상 200,000점 이하인 고객의 담당자명, 마일리지를 조회
FROM 담당자명, 마일리지 FROM 고객 WHERE 마일리지 BETWEEN 100000 AND 200000;
FROM 담당자명, 마일리지 FROM 고객 WHERE 마일리지 >= 100000 AND 마일리지 < 200000;

LIKE

문자열 데이터에서 특정 패턴을 검색할 때 사용

  • %: 0r개 이상의 모든 문자를 의미
  • _: 1개 이상의 문자를 의미
-- 문제:  고객 테이블에서 도시가 '광역시'로 끝나면서, 고객번호의 두 번째 또는 세 번째 글자가 'C'인 고객 정보를 조회
SELECT * FROM 고객 WHERE 도시 LIKE '%광역시' AND (고객번호 LIKE '__C%' OR 고객번호 LIKE '___C%');

문제 풀어보기

문제1

서울에 사는 고객중에 마일리지가 15000점 이상 20000점 이하인 고객의 모든 정보

SELECT * FROM 고객 WHERE 도시 LIKE '서울%' AND (마일리지 BETWEEN 15000 AND 20000);

문제2

고객들은 어느 지역, 어느 도시에 사는지 지역과 도시를 한번씩만 보이시오. 이때 결과를 지역순으로 나타내고 동일지역에 대해서는 도시순.

SELECT DISTINCT 지역,도시 FROM 고객 ORDER BY 1,2;

문제3

춘천시나 과천시 또는 광명시에 사는 고객 중에서 담당자직위에 이사 또는 사원이 들어가는 고객의 모든 정보

SELECT * FROM 고객 WHERE 도시 IN ('춘천시','과천시','광명시') AND (담당자직위 LIKE '%이사' OR 담당자직위 LIKE '%사원');

문제4

광역시나 특별시에 살지않는 고객들 중에서 마일리지가 많은 상위 고객 3명의 모든 정보

SELECT * FROM 고객 WHERE 도시 NOT LIKE '%광역시' AND 도시 NOT LIKE '%특별시' ORDER BY 마일리지 DESC LIMIT 3;'

문제5

지역에 값이 들어있는 고객 중에서 담당자 직위가 대표이사인 고객을 뺴고 보이시오

SELECT * FROM 고객 WHERE 지역 IS NOT NULL AND 담당자직위 != "대표이사";

SQL 기본 질의문

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


데이터 조회를 위한 SQL 문법

우선 MySQL 환경과 MySQLWorkbench 환경은 아래와 같다.

MySQL 8.0.42-arm64
MySQLWorkbench 8.0.42-arm64

SELECT, FROM

데이터베이스에서 원하는 정보를 가져오는 가장 기본적인 방법

  • SELECT [컬럼명]: 조회할 컬럼을 지정. 모든 컬럼을 보고 싶다면 *을 사용
  • FROM [테이블명]: 데이터를 가져올 테이블을 지정
-- 고객 테이블의 모든 컬럼 데이터를 가져온다 
SELECT * from 고객;

컬럼 별칭(Alias) 사용하기 > as

조회된 컬럼의 이름을 임시로 바꾸고 싶을때 as 키워드를 사용한다. 별칭 내 공백이나 특수문자가 존재한다면 '' 혹은 ""으로 감싸준다.

-- 아래 모두 가능
SELECT 마일리지 as m FROM 고객;
SELECT 마일리지 m FROM 고객;
SELECT 마일리지 '마일 리지' FROM 고객;

계산식이 포함된 SQL문

SELECT 절에는 컬럼명 외에도 계산식이나 함수 사용이 가능

-- 문제: 고객 테이블에서 고객번호, 마일리지, 10% 인상된 마일리지로 조회
-- 이때 마일리지는 ‘포인트’ 컬럼명 변경
-- 인상된 마일리지는 ‘10%인상된 마일리지’로 별명을 불임
SELECT 고객번호, 마일리지 as 포인트, 마일리지*1.1 as '10%인상된 마일리지' FROM 고객;

WHERE

특정 조건에 만족하는 데이터만 필터링 조회

-- 문제: 고객 테이블에서 마일리지가 100,000점 이상인 고객의 고객번호, 마일리지를 조회
SELECT 고객번호, 마일리지 FROM 고객 WHERE 마일리지 >= 100000

ORDER BY

조회된 결과를 정렬

  • ASC: 오름차순(작은 값부터 정렬, 기본값임)
  • DESC: 내림차순(큰 값부터)
-- 문제: 서울특별시'에 사는 고객들의 고객번호, 마일리지를 조회
-- 결과는 마일리지가 많은 순서로
SELECT 고객번호, 마일리지 FROM 고객 WHERE 도시 = "서울특별시" ORDER BY 마일리지 desc
SELECT 고객번호, 마일리지 FROM 고객 WHERE 도시 = "서울특별시" ORDER BY 2 desc

위와 같이 ORDER BY절에는 컬럼명 대신 별칭이나 SELECT 절에서의 컬럼순서를 사용 가능!

LIMIT n

반환되는 행의 수를 제한. ORDER BY와 함께 상위/하위 n개를 조회하는 데 사용

-- 문제1: 고객 테이블에서 첫 3개의 고객 정보를 조회
SELECT * FROM 고객 LIMIT 3

-- 문제2: 마일리지가 가장 많은 상위 3명의 고객 정보를 조회
SELECT * FROM 고객 ORDER BY 마일리지 desc LIMIT 3

-- 문제3: 마일리지가 가장 적은 하위 3명의 고객 정보를 조회
SELECT * FROM 고객 ORDER BY 마일리지 asc LIMIT 3
SELECT * FROM 고객 ORDER BY 마일리지 LIMIT 3

DISDICNT

특정 컬럼의 값에서 중복을 제거하고 고유한 값을 보여줌

-- 문제: 고객 테이블에 등록된 고객들이 사는 도시를 중복 없이 모두 보여주기
SELECT DISTINCT 도시 FROM 고객;

자료구조, 그래프와 트리

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


그래프