9033 / coding_programming

coding programming of problems
MIT License
0 stars 0 forks source link

SQL(mariadb) #1

Open 9033 opened 3 years ago

9033 commented 3 years ago
/*
두 row를 생성함
*/
INSERT INTO dest (`name`) VALUES ('sam'),('john');

/*
dest 에서 name은 그대로 age에는 3을 더해서 so 에 추가
*/
INSERT INTO so (`name`,`age`) SELECT `dest`.`name`, `dest`.`age`+3 FROM `dest`;

/*
so의 sam의 나이를 1 증가
*/
UPDATE so SET age=age+1 WHERE `name`='sam';

/*
나이
세는 나이: 테어나자 마자 1세, 한국식 나이
만 나이: 처음 태어나면 0세. 생일이 지나면 1살식 늘어남.
연 나이: 만 몇세가 되는 해. 보통 법관련해서 많이 쓰임. (만 19세가 되는 해의 1월 1일 부터 ~, 한국 시간 기준)
*/
-- 만 나이 계산: 현재 년도에서 출생년도를 뺌 그리고 현재 생일이 지나지 않았으면 1을 뺌.
SELECT
dest.id,
dest.name AS '이름',
dest.birthday AS '생년월일',
YEAR(CURDATE()) - YEAR(birthday) + 1 AS '세는 나이',
TIMESTAMPDIFF(YEAR, birthday, CURDATE()) AS '만 나이',
-- YEAR(CURDATE()) - YEAR(birthday) - (CURDATE() < ADDDATE(birthday, INTERVAL YEAR(CURDATE()) - YEAR(birthday) YEAR)) AS '만 나이',
YEAR(CURDATE()) - YEAR(birthday) AS '연 나이'
FROM dest
;

/*
COMPRESS
BASE64
HEX
디코딩된것을 CONVERT로 UTF8로 변경해야 한글이 나옴.
*/
SET @s = 'english 한글 <table>테이블</table>';
SELECT @s, COMPRESS(@s), CONVERT(UNCOMPRESS(COMPRESS(@s)) USING UTF8);
SELECT @s, COMPRESS(@s), TO_BASE64(COMPRESS(@s)), FROM_BASE64(TO_BASE64(COMPRESS(@s))), CONVERT(UNCOMPRESS(FROM_BASE64(TO_BASE64(COMPRESS(@s)))) USING UTF8);
SELECT @s, TO_BASE64(@s), HEX(@s), CONVERT(FROM_BASE64(TO_BASE64(@s)) USING UTF8), CONVERT(UNHEX(HEX(@s)) USING UTF8);
9033 commented 3 years ago

join table

dest

id name age birthday
1 999 2020-04-01
2 333 2021-04-02

info

id address
1 서울
2 부산

detail

destId phone
2 010
1 911

payment

destId account
2 K-은행
1 KB-은행

-- 10.5.9-MariaDB
SELECT *
FROM `test`.`dest`
NATURAL JOIN `test`.`info`
JOIN (
    SELECT *
    FROM `test`.`detail`
    NATURAL JOIN `test`.`payment`
) AS `moreInfo` ON `moreInfo`.`destId` = `test`.`dest`.`id`
;
id name age birthday address destId phone account
2 333 2021-04-02 부산 2 010 K-은행
1 999 2020-04-01 서울 1 911 KB-은행
9033 commented 3 years ago

so

id name age
1 53
2 37
4 66
5 77
6 14
7 55
8 44

age_label

label age_low age_high
청년 20 39
중년 40 59
노인 60 999
생산연령 15 65

SQL 1

SELECT `so`.*, GROUP_CONCAT(`age_label`.`label`)
FROM `so`, `age_label`
WHERE `so`.`age` BETWEEN `age_label`.`age_low` AND `age_label`.`age_high`
GROUP BY `so`.`id`
;
id name age labels
1 53 생산연령,중년
2 37 생산연령,청년
4 66 노인
5 77 노인
7 55 중년,생산연령
8 44 생산연령,중년
9033 commented 3 years ago

dest

id name age birthday
1 999 2020-04-01
2 333 2021-04-02

info

id address
1 서울
2 부산

SELECT *
FROM `test`.`dest`
NATURAL JOIN `test`.`info`
;
SELECT *
FROM `test`.`dest`
JOIN `test`.`info` USING (`id`)
;
컬럼명과 타입이 같아야함. id name age birthday address
1 999 2020-04-01 서울
2 333 2021-04-02 부산

SELECT *
FROM `test`.`dest`, `test`.`info`
WHERE `test`.`dest`.`id` = `test`.`info`.`id`
;
id name age birthday id address
1 999 2020-04-01 1 서울
2 333 2021-04-02 2 부산
9033 commented 3 years ago

json

UPDATE `test`.`json` SET `json`.`data`= JSON_SET(`json`.`data`,'$.f',2221)
WHERE `json`.`id`= 1
;
SELECT JSON_DETAILED(`json`.`data`)
from `test`.`json`
WHERE `json`.`id`= 1
;
9033 commented 2 years ago

GROUP BY로 한 row로 묶을때 모든 row의 id를 목록으로 출력하는 컬럼

SELECT *, GROUP_CONCAT(id) as room_ids
FROM `room`
GROUP BY `user_id`