
SQL 프로그래밍
# 2024-02-13
-- LEFT(문자열, 문자수) :
SELECT RIGHT(dept_no, 3) AS NO, LEFT(dept_name, 3) AS dept FROM departments;
SELECT *, LEFT(from_date, 4) AS year, SUBSTRING(from_date,6,2) AS mon, right(from_date,2) AS DAY
FROM salaries LIMIT 10;
SELECT SUBSTRING_INDEX(from_date, '-', 1) AS si
FROM salaries
LIMIT 10;
SELECT from_date, substring(from_date, 6, 2) AS fd, INSTR(SUBSTRING(from_date, 6, 2), '-') AS fdi
FROM salaries
LIMIT 10;
# INSTR의 경우 탐색 후 없으면 0을 반환합니다. (0번째 위치 XXX)
SELECT INSTR('010-8467-6191', '-');
SELECT from_date, LOCATE('06', from_date) AS lo
FROM salaries
LIMIT 10;
select ELT(2, '월', '화', '수', '목', '금', '토') AS el1, ELT(8, '월', '화', '수', '목', '금', '토') AS el2;
select FIELD('수', '월', '화', '수', '목', '금', '토') AS el1;
SELECT FIND_IN_SET('수', '월,화,수,목,금,토');
# 완벽히 일치해야해서 콤마로 구분된 기준으로 띄어쓰기라도 하나 더 있으면 못찾음.
# 콤마로 구분 안되어있어도 못찾음.
SELECT distinct title AS t1, LCASE(title) AS t2, LOWER(title) AS t3 FROM titles LIMIT 100;
# 소문자로 전환!
SELECT distinct title AS t1, UCASE(title) AS t2, UPPER(title) AS t3 FROM titles LIMIT 100;
# 대문자로 전환!
SET @str = ' 빈 문자 열 ';
SELECT @str as org, LTRIM(@str) AS li, RTRIM(@str) AS r1, TRIM(@str) AS t1;
# LTRIM : 좌측 공백 제거 / RTRIM : 우측 공백 제거 / TRIM : 좌우 공백 제거
# 입력된 값에 공백이 있을 수 있기 떄문에 값을 검색할 떄 REPLACE(TRIM(값), ' ', '') 이런식으로 예상치 못한 공백을 다 지워줘야합니다.
SELECT CHAR_LENGTH('홍길동') AS k1, # 문자개수 : 3
CHAR_LENGTH('Senior Engineer') AS e1, # 문자개수 : 15
CHAR_LENGTH('데이터베이스SQL\u2506') AS u1, # 문자개수 : 14
CHAR_LENGTH(' MariaDB') AS e2, # 문자개수 : 8개
CHARACTER_LENGTH(' MariaDB') as e3; # 문자개수 : 8개
# character_length == char_length
;
-- LENGTH(), LENGTHB()
SELECT LENGTH('홍길동') AS k1, # byte 수 : 한글3byte * 3문자 = 9
LENGTH('Senior Engineer') AS e1, k1, # byte 수 : 영문1byte * 15글자 = 15
LENGTHB(' MariaDB') AS e2 # byte 수 : 영문1byte * 8개 = 8
# length == lengthb 바이트수를 구하는 함수
;
-- CONCAT()
SELECT CONCAT('문자열A', '문자열B') AS con;
# 문자열끼리 합치는 함수
-- CONCAT_WS()
SELECT CONCAT_WS('|','문자열A', '문자열B', '문자열C') AS con_ws;
# 문자열끼리 합치는데 맨앞에 입력한 구분자를 갖고 합쳐주는 함수
SELECT CONCAT_WS(' ', first_name, last_name)
FROM employees
LIMIT 100;
# 이런식으로 자주 활용 합니다.
-- CAST() : 형변환
SELECT CAST(123 AS VARCHAR(20)), CONVERT(123,VARCHAR(20));
-- 사용예시
SELECT CAST(FROM_date AS CHAR(4)), CONVERT(to_date, CHAR(4))
FROM salaries
WHERE CAST(from_date AS CHAR(4)) >= '1989' AND CAST(from_date AS CHAR(4)) <= '1992'
LIMIT 100;
-- LPAD(). RPAD() : 좌측/우측으로 내가원하는 글자수만큼 되도록 특정문자로 채워랏
SELECT first_name,
LPAD(first_name, 10, '@') AS f1,
RPAD(first_name, 10, '@') AS f2
FROM employees
LIMIT 10
;
-- INSERT() : 문자열에서 시작위치부터 입력받은 개수만큼 삭제 후 입력받은 문자로 삽입한 결과를 반환합니다.* INSERT문과 햇갈리지 말것!
SELECT first_name,
INSERT(first_name, 6, 3, '@') AS f1
FROM employees
LIMIT 100;
-- REVERSE() : 문자열의 좌우 바꾸기
SELECT REVERSE(first_name)
FROM employees
LIMIT 10;
-- SPACE() : 공백줄때
SELECT CONCAT(first_name, SPACE(10), last_name) AS f1
FROM employees
LIMIT 100;
-- FORMAT()
SELECT FORMAT(12345.6289, 2);
SELECT FORMAT(12345.6289, 2, 'es_ES'); #에스파냐는 12,345.00이 아니라 12.345,00입니다.....굉장하다
-- ASCII() : 아스키코드로 변환 (문자여러개 넣으면 처음 넣은 문자만 ASCII로 변환함)
SELECT ASCII(0);
-- CHR(), CHAR() : 숫자(아스키모드인듯)값을 문자로 변환해줌
-- CHAR()는 값을 여러개 넣을 수 있음! 그것만 다름
SELECT CHR(65), CHR(48), CHAR(65, 48, 66, 67);
-- HEX() : 문자를 헥사코드로 변환
-- UNHEX() : 헥사코드를 문자코드로 변환
SELECT HEX('AB'), UNHEX('4142');
-- 날짜함수
-- to_char() : 날짜를 원하는 포맷으로 바꿔서 출력할 때 사용가능
SELECT NOW(), to_char(NOW(), 'YYYY-MM-DD'), to_char(NOW(), 'MON dd DY RRRR');
# 적용할 수 있는 포맷 같이 정리하면 좋을듯
-- ADDDATE() : 특정날짜로 부터 몇일 후 계산할 때 사용
-- DATE_ADD() : ADDDATE()와 동일하나 INTERVAL을 이용해서 넣어줘야함.
SELECT NOW(), ADDDATE(NOW(), 30);
SELECT NOW(), ADDDATE(NOW(), -30);
SELECT NOW(), ADDDATE(NOW(), INTERVAL 2 MONTH);
SELECT NOW(), ADDDATE(NOW(), INTERVAL 30 YEAR);
SELECT NOW(), DATE_ADD(NOW(), INTERVAL 30 YEAR);
-- SUBDATE() : 위 ADDDATE()에서 음수를 넣어줘도 되지만, 별도의 날짜 빼는 함수가 있음
-- DATE_SUB() : SUBDATE()와 동일하나 INTERVAL을 이용해서 넣어줘야함.
-- 여기에서도 음수를 넣으면 반대로 동작하기 때문에 날짜가 더해짐.
-- 둘 중하나로 다 쓸 수 있지만, 함수가 분리되어있으므로써 직관적으로 읽을 수가 있음
SELECT NOW(), SUBDATE(NOW(), 30);
SELECT NOW(), DATE_SUB(NOW(), INTERVAL 30 YEAR);
-- NOW() : 오늘 날짜! YYYY-MM-DD HH:MM:SS
-- CURDATE(), CURRENT_DATE() : 오늘날짜! YYYY-MM-DD
SELECT NOW(), CURDATE(), CURRENT_DATE();
-- CURRENT_TIMESTAMP(), SYSDATE(), LOCALTIME(), LOCALTIMESTAMP() : 로컬 시간에 맞춰 현재 날짜시간 표시해줌
SELECT CURRENT_TIMESTAMP(), SYSDATE(), LOCALTIME(), LOCALTIMESTAMP();
-- YEAR(), MONTH(), DAY() : 날짜에서 년도, 월, 날짜로 표시해줌
SELECT to_char(NOW(),'YYYY'), # 그냥 YEAR()로 사용했더니 2,024로 숫자형식으로 나와서 바꿔줌 - 방법 ①
cast(YEAR(NOW()) AS CHAR(4)), # 그냥 YEAR()로 사용했더니 2,024로 숫자형식으로 나와서 바꿔줌 - 방법 ②
CONVERT(YEAR(NOW()), CHAR(4)), # 그냥 YEAR()로 사용했더니 2,024로 숫자형식으로 나와서 바꿔줌 - 방법 ③
MONTH(NOW()),
DAY(NOW())
;
-- HOUR(), MINUTE(), SECOND(), MICROSECOND() : 시, 분, 초, 밀리초 단위로 표시해줌
SELECT NOW(), to_char(NOW(), 'HH24'), to_char(NOW(), 'MI'), to_char(NOW(), 'SS'),
HOUR(NOW()), MINUTE(NOW()), SECOND(NOW()), MICROSECOND(NOW());
# HH로 하면 2시 3시, HH24로 하면 14시 15시 형태
-- DAYOFYEAR(), DAYOFMONTH(), DAYOFWEEK() : 기준일이 해당년도/해당월/해당주가 시작되고 며칠이 지났는지 보여주는 함수
-- MONTHNAME() : 기준일의 월 풀네임.
SELECT DAYOFYEAR('2024-05-05'),
DAYOFMONTH(NOW()),
DAYOFWEEK(NOW()), # 주의 경우 일요일부터 시작.
MONTHNAME(NOW());
-- DATE() : 날짜시간 형식에서 날짜부분만 출력
-- TIME() : 날짜시간 형식에서 시간부분만 출력
SELECT DATE(NOW()), TIME(NOW());
-- DATEDIFF() : 날짜 차이 계산해주는 함수
-- TIMEDIFF() : 시간 차이 계산해주는 함수
SELECT DATEDIFF( '2024-02-13', '2023-02-13'); # 앞에 인자에서 뒤에 인자 날짜를 뺴서 계산하는듯
SELECT TIMEDIFF('23:00:20','00:00:00'); # 표현식이 같아야하고, 둘다 시간이거나 둘다 날짜시간이어야함.
SELECT TIMEDIFF('2024-02-13 23:00:20','2023-02-13 00:00:00');
-- LAST_DAY(날짜) : 입력한 날짜의 월의 마지막 일자를 보여줌
SELECT LAST_DAY('2024-02-01') AS '2024',
LAST_DAY('2023-02-01') AS '2023',
LAST_DAY('2022-02-01') AS '2022'
;
# LAST_DAY() 함수 없을 때는 계산하고자하는 날짜의 다음달 1일을 가져와서 -1하는식으로 사용함
SELECT ADDDATE('2024-03-01', -1);
-- MAKEDATE(년도, 일자) : 입력한 년도 시작하고 입력한 일자가 지난 날짜가 언제지를 보여주는 함수
SELECT MAKEDATE(2022, 60), # 1일로부터 60일째
ADDDATE('2022-01-01', 59); # ADDDATE는 날짜를 더해주는 개념이므로 59를 입력해줌.
-- MAKETIME(시, 분, 초) : 입력한 시간, 분, 초로 시간을 만들어줍니다.
SELECT MAKETIME(15, 35, 30);
-- QUARTER : 입력한 날짜가 몇번째 분기에 있는가를 보여주는 함수
SELECT QUARTER('2024-10-01');
-- DATE_FORMAT : 입력된 날짜의 포맷을 지정해서 출력해줍니다.
SELECT DATE_FORMAT(NOW(), '%Y년 %b %d 일', 'ko_KR'); # 월 표시해주는게 나라마다 좀 달라서 한국에 맞게 변환 'ko_KO'
SELECT DATE_FORMAT(NOW(), '%Y/%m/%d');
-- 수치 함수
-- ABS() : 절대값 반환함수
SELECT ABS(-50);
-- SIGN() : 주어진 수치형 데이터의 부호를 반환
SELECT SIGN(-10), SIGN(0), SIGN(100);
-- SUM() : 주어진 인자들을 다 더함
-- AVG() : 주어진 인자들의 평균을 구함
-- CEILING(), CEIL() : 주어진 인자에서 주어진 실수보다 큰 정수 중 가장 작은 정수를 반환합니다. (정수로 올림한다고 보면 될 듯)
-- FLOOR() : 주어진 인자에서 주어진 실수보다 작은 수 중 가장 큰 정수를 반환합니다. (정수로 버림처리한다고 보면 될 듯)
-- TRUNCATE() : 첫번쨰 인자는 계산할 값, 두번째 인자는 기준 소수점 자리를 받아 주어진 값에서 기준자리 까지만 남기고 전부 버림처리
-- ROUND() : 첫번쨰 인자는 계산할 값, 두번째 인자는 기준 소수점 자리를 받아 주어진 값에서 기준자리 아래에서 반올림합니다.
SELECT SUM(salary) AS cnt,
AVG(salary) AS avg1,
CEILING(AVG(salary)) AS c1,
FLOOR(AVG(salary)) AS f1,
TRUNCATE(AVG(salary), 3) AS t1, # 얘만 MariaDB에서만 이리 동작함.
ROUND(AVG(salary), 1) AS r1
FROM salaries
WHERE from_date BETWEEN '2002-01-01' AND '2002-07-23';
-- PI() : 원주율
SELECT PI();
SELECT PI() + 0.00000000000; # 원주율의 원하는 자리수까지 0.000....을 더해서 구할 수 있음
-- CREATEST() : 가장 큰 값을 구하는 함수
-- LEAST() : 가장 작은 값을 구하는 함수
# 근데 얘네는 콤마로 구분되어있는 개별 값이 들어올때만 쓸수있어서 MIN(), MAX()를 더 많이 씀
SELECT GREATEST(30, 10, 5, 40),
LEAST(30, 10, 5, 40);
SELECT MAX(salary) AS max_salary, MIN(salary) AS min_salary FROM salaries;
-- DEGREES() : 주어진 값을 라디안 값으로 간주하여 각도값으로 반환
SELECT DEGREES(PI());
-- RADIANS() : 주어진 값을 각도로 간주하여 라디안값으로 반환
SELECT RADIANS(180);
-- RAND() : 0~1에서 랜덤한 난수생성
SELECT RAND();
SQL 학습노트 정리방법을 바꿀 예정, 코드부분에 내용과 예시를 한번에 보여주는게 더 보기 깔끔할 것 같음.
2/23일 까지 MariaDB완료 후 2월 마지막 주 부터 팀프로젝트 준비예정이라고 하심
팀구성 : 4명 / 4명 / 4명 / 3명
교육 관련 사이트 서칭할 예정 - 서칭해서 리뷰할 예정
4개의 사이트 뽑아서 - 기획서 작성
오 정처기 보시는군요! 제 지인들도 많이 보는데 지현님도 화이팅입니다!! 컬렉션은 저도 공부하는 부분인데 다음 글도 기대할게요 😁