반응형
1. DISTINCT(중복값 제거)와 COUNT
-- 1. 아이돌 멤버테이블에서 아이돌 그룹 이름을 출력하시오 (단, 중복제거)
select distinct group_name from idol_member;
-- 아이돌 멤버테이블에 있는 모든 멤버의 총 인원 수 출력
select count(*) from idol_member;
-- 아이돌 멤버테이블에 있는 그룹의 총 개수를 출력
select count(distinct group_name) from idol_member;
-- 트와이스 그룹의 총 멤버 수를 출력하시오
select count(*) from idol_member where group_name = '트와이스';
-- 각 그룹별 총 멤버 수를 출력하시오
SELECT GROUP_NAME, COUNT(GROUP_NAME) FROM IDOL_MEMBER GROUP BY GROUP_NAME;
2. 함수의 필요성
- 테이블 데이터는 구조적인 틀안에 격자형으로 표현된다.
- 이 구조에서는 ROW만 또는 COLUMN만 필터링 가능하다.
- 이름은 몇 자인지, 성은 제외하고 이름만 어떻게 되는가?
- 이름에 빈 공백을 제거하고 출력하려면 함수가 필요하다.
3. 문자열 함수
1) SUBSTR('문자열', 시작위치, 길이)
SELECT substr('HELLO', 1, 3);
SELECT substr('HELLO', 3);
SELECT substr(GROUP_NAME, 2)
FROM idol_member;
-- 실습
> 모든 아이돌멤버의 이름과 출생 월만 조회하시오
---------------------------------------------------
select group_name, member_name, birthday, substr(birthday,5,2) "MON" from idol_member;
---------------------------------------------------
> 아이돌그룹 중 'JYP'로 시작하는 모든 그룹정보를 출력하시오
----------------------------------------------------
select * from idol_group where substr(company,1,3) = "JYP";
select * from idol_group where company like 'JYP%';
select * from idol_group where company regexp 'jyp';
select * from idol_group where company regexp '^jyp';
select * from idol_group where company regexp('^jyp');
----------------------------------------------------
> 모든 아이돌멤버의 나이를 출력하시오
----------------------------------------------------
select group_name, member_name, birthday, substr(now(),1,4) - substr(birthday,1,4) + 1 as "age" from idol_member;
2) CONCAT() : 문자열 이어주기,
CONCAT_WS() 구분자와 함께 문자열 이어주기
SELECT CONCAT('My', 'S', 'QL', ' JAVA211');
SELECT CONCAT('A', "B", "CDE", 'F');
SELECT CONCAT('A', "B", NULL, 'F');
SELECT CONCAT_WS('-','2021','01','20');
-- 실습
> 모든 아이돌그룹에 대하여 'BTS♥boys'의 형식과 같이 출력하시오
----------------------------------------------------
select concat(group_name, '♥', gender, 's') MESSAGE from idol_group;
----------------------------------------------------
3) TRIM() 문자열 공백제거 함수
----------------------------------------------------
SELECT ' Hello ' result1;
SELECT trim(' Hello ') result2;
----------------------------------------------------
4) LOWER() / UPPER()
----------------------------------------------------
SELECT lower('HELLO');
SELECT upper('WOrlD');
----------------------------------------------------
5) REPLACE('문자열', '찾는 문자열', '대치할 문자열')
----------------------------------------------------
SELECT replace('HELLO WORLD', 'HELLO', 'HI~') AS RESULT;
----------------------------------------------------
-- 실습
> 아이돌 그룹에서 회사명 '~ 엔터테인먼트'를 '~ ENTERTAINMENT'로 출력하시오
----------------------------------------------------------------------
SELECT replace(company, '엔터테인먼트', 'ENTERTAINMENT') 'COMPANY', GROUP_NAME from idol_group;
-------------------------------------------------------------------------
6) 문자열 패딩 함수() LPAD()/RPAD()
----------------------------------------------------
SELECT lpad('12345', 10, '0') AS RESULT; -- 총 10자리
SELECT rpad('12345', 10, '0') AS RESULT;
SELECT LPAD('AB',4,'CD') AS RESULT; -- 총 4자리
SELECT RPAD('AB',4,'CD') AS RESULT;
----------------------------------------------------
7) INSTR(문자열, 검색문자열) 위치 반환
----------------------------------------------------
SELECT INSTR('foobarbar', 'bar');
SELECT INSTR('xbar', 'foobar');
----------------------------------------------------
2. 숫자함수
----------------------------------------------------
SELECT ABS(-35);
SELECT SIGN(-10); SELECT SIGN(0); SELECT SIGN(10);
SELECT ROUND(3.141592); SELECT ROUND(3141.592);
SELECT ROUND(3.141592, 2);
SELECT ROUND(3.141592, 4);
SELECT MOD(17, 5); -- 나머지
SELECT POWER(2, 2);
SELECT POWER(2, 8);
SELECT SQRT(25);
SELECT SQRT(5);
----------------------------------------------------
3. 날짜함수
----------------------------------------------------
SELECT sysdate(); 2021-09-08 19:15:00
SELECT curdate(); 2021-09-08
SELECT current_date(); 2021-09-08
SELECT curtime(); 19:17:23
SELECT current_time(); 19:16:09
SELECT current_timestamp(); 2021-09-08 19:16:22
SELECT date_format(NOW(), '%Y년 %m월 %d일 %H시 %i분 %S초');
%i Minutes, numeric (00..59)
%j Day of year (001..366)
%k Hour (0..23)
%l Hour (1..12)
%M Month name (January..December)
%m Month, numeric (00..12)
%p AM or PM
%r Time, 12-hour (hh:mm:ss followed by AM or PM)
%S Seconds (00..59)
%s Seconds (00..59)
%T Time, 24-hour (hh:mm:ss)
%U Week (00..53), where Sunday is the first day of the week; WEEK() mode 0
%u Week (00..53), where Monday is the first day of the week; WEEK() mode 1
%V Week (01..53), where Sunday is the first day of the week; WEEK() mode 2; used with %X
%v Week (01..53), where Monday is the first day of the week; WEEK() mode 3; used with %x
%W Weekday name (Sunday..Saturday)
%w Day of the week (0=Sunday..6=Saturday)
%X Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V
%x Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v
%Y Year, numeric, four digits
%y Year, numeric (two digits)
%% A literal % character
%x x, for any “x” not listed above
SELECT YEAR(sysdate());
SELECT MONTH(sysdate());
SELECT DAY(sysdate());
SELECT HOUR(sysdate());
SELECT MINUTE(sysdate());
SELECT SECOND(sysdate());
----------------------------------------------------
-- 실습
> 아이돌멤버 중에서 생일이 지나지 않은 멤버를 모두 출력하시오
----------------------------------------------------
SELECT member_name, birthday from idol_member where substr(birthday,5,4) > date_format(now(),'%m%d');
--(이 코드는 결과 안나옴!) select group_name, member_name, birthday from idol_member where month(now()) <= month(birthday) or day(now()) <= day(birthday);
----------------------------------------------------
4. 변환함수(CAST/CONVERT)
- INSERT, UPDATE 로 컬럼에 값을 넣어야 하는 경우 설정한 데이터 타입으로 형변환
----------------------------------------------------
SELECT CAST(NOW() AS SIGNED);
SELECT CAST(NOW() AS YEAR);
SELECT CAST(NOW() AS DATE);
SELECT CAST(NOW() AS TIME);
SELECT CAST('20210915' AS DATE);
SELECT CONVERT(NOW(), SIGNED);
SELECT CONVERT(NOW(), DATE);
SELECT CONVERT('20210915', SIGNED);
SELECT CAST('12.34' AS UNSIGNED INTEGER);
SELECT CAST(1234 AS CHAR(10));
BINARY
CHAR
INTEGER
DECIMAL
DATE
DATETIME
SIGNED
UNSIGNED
SELECT BINARY 'A'='B'; -- 다르면 0 (false)
SELECT BINARY 'A'='A'; -- 같으면 1 (true)
SELECT CONVERT('A', BINARY); -- 0x41
SELECT CONV(3, 10, 2); -- 10진수 3은 2진수로 11
SELECT CONV(11, 10, 16); -- 10진수 11은 16진수로 B
SELECT FORMAT(123456789, 0); -- 123,456,789
SELECT FORMAT(123456789, 2); -- 소수점 둘째자리 까지 123,456,789.00
----------------------------------------------------
5. NULL 관련 함수
- 컬럼 값이 NULL 인지 아닌지 확인 필요
----------------------------------------------------
SELECT NULL + 3; -- NULL
----------------------------------------------------
-- 실습
> 멤버테이블에서 전화번호(PHONE)가 NULL 인 레코드를 추출하시오
-----------------------------------------------------------------------------------------------
SELECT * FROM MEMBER
WHERE PHONE IS NULL;
-----------------------------------------------------------------------------------------------
> 멤버테이블에서 전화번호(PHONE)가 NULL 이면 '9999-99-99'로 출력하시오
-----------------------------------------------------------------------------------------------
SELECT ID, PWD, NAME, GENDER, BIRTHDAY, ifnull(PHONE, '9999-99-99') 'PHONE', EMAIL FROM MEMBER;
-----------------------------------------------------------------------------------------------
반응형
'🛢 3. Database > 3-1 Mysql' 카테고리의 다른 글
[Database] 15. 부조회(서브쿼리) (0) | 2021.09.28 |
---|---|
[Database] 14. SELECT 구절 순서와 처리 과정 (1) | 2021.09.28 |
[Database] 12. 페이징 처리 (0) | 2021.09.27 |
[Database] 11. 정규표현식 (0) | 2021.09.23 |
[Database] 10. 연산을 통한 데이터 조회 (0) | 2021.09.17 |
댓글