22 Jul 2025
|
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
21 Jul 2025
|
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); -- ***
21 Jul 2025
|
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 담당자직위 != "대표이사";
21 Jul 2025
|
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 고객;