
2025-03-25
SQL์์ ํจ์(Function)๋ ํน์ ์์
์ ์ํํ๊ธฐ ์ํด ๋ฏธ๋ฆฌ ์ ์๋ ๋ช
๋ น์ด ์งํฉ์ ์๋ฏธํฉ๋๋ค.
์
๋ ฅ๊ฐ์ ๋ฐ์ ์ฒ๋ฆฌํ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๊ฑฐ๋ ๋ถ์ํ ๋ ํ์์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
UPPER(), ROUND(), TO_CHAR() ๋ฑSUM(), AVG(), COUNT() ๋ฑRANK(), LAG(), SUM() OVER() ๋ฑ์ข์! ์๋๋ ๋ฒจ๋ก๊ทธ ์
๋ก๋์ฉ ๋งํฌ๋ค์ด ํ์์ผ๋ก ์ ๋ฆฌํ 2, 3, 4, 5๋ฒ ํญ๋ชฉ์ด์ผ.
๊ฐ ํญ๋ชฉ์ ํจ์ ์ค๋ช
+ ์ฝ๋ ์์ ๊น์ง ํฌํจํ์ด. ์ด๋๋ก ๋ณต์ฌํด์ ๋ฒจ๋ก๊ทธ์ ์ฌ๋ฆฌ๋ฉด ์๋ฒฝํด โ
โธป
SELECT name,
LOWER(name) AS lower_name,
UPPER(name) AS upper_name,
INITCAP(name) AS initcap_name,
LENGTH(name) AS name_len,
SUBSTR(name, 1, 2) AS first_two_chars,
INSTR(name, '๊น') AS position_kim
FROM userTbl;
SELECT price,
ROUND(price / 1000, 2) AS rounded,
TRUNC(price / 1000, 1) AS truncated,
MOD(price, 100) AS remainder,
CEIL(price / 100) AS ceiled,
FLOOR(price / 100) AS floored
FROM buyTbl;
SELECT name, mDate,
SYSDATE AS today,
ADD_MONTHS(mDate, 6) AS six_months_later,
MONTHS_BETWEEN(SYSDATE, mDate) AS months_diff,
NEXT_DAY(mDate, '๊ธ์์ผ') AS next_friday,
LAST_DAY(mDate) AS last_day_of_month
FROM userTbl;
SELECT name,
NVL(mobile1, '์์') AS nvl_result,
NVL2(mobile1, '์ฐ๋ฝ์ฒ ์์', '๋ฏธ์
๋ ฅ') AS contact_check,
COALESCE(mobile1, mobile2, '๋ฏธ๊ธฐ์ฌ') AS best_contact,
NULLIF(price, 30) AS null_if_price
FROM userTbl u
JOIN buyTbl b ON u.userID = b.userID;
SELECT name, height,
CASE
WHEN height >= 180 THEN 'ํค ํผ'
WHEN height >= 170 THEN '๋ณดํต'
ELSE '์์'
END AS height_grade
FROM userTbl;
โธป
SELECT COUNT(*) AS ์ ์ฒด์ธ์,
COUNT(mobile1) AS ์ฐ๋ฝ์ฒ์
๋ ฅ,
AVG(height) AS ํ๊ท ํค,
MAX(height) AS ์ต๊ณ ํค,
MIN(height) AS ์ต์ ํค,
STDDEV(height) AS ํคํ์คํธ์ฐจ,
VARIANCE(height) AS ํค๋ถ์ฐ
FROM userTbl;
SELECT addr,
COUNT(*) AS ์ธ์์,
AVG(height) AS ํ๊ท ํค
FROM userTbl
GROUP BY addr;
SELECT addr, AVG(height) AS ํ๊ท ํค
FROM userTbl
GROUP BY addr
HAVING AVG(height) >= 170;
โธป
SELECT u.userID, u.addr, SUM(b.price * b.amount) AS ๊ตฌ๋งค์ด์ก
FROM userTbl u
JOIN buyTbl b ON u.userID = b.userID
GROUP BY u.userID, u.addr
HAVING SUM(b.price * b.amount) > (
SELECT AVG(total)
FROM (
SELECT u2.addr, SUM(b2.price * b2.amount) AS total
FROM userTbl u2
JOIN buyTbl b2 ON u2.userID = b2.userID
GROUP BY u2.addr
HAVING u2.addr = u.addr
)
);
SELECT groupName, SUM(price * amount) AS ํ๋งค๊ธ์ก
FROM buyTbl
WHERE groupName IS NOT NULL
GROUP BY ROLLUP(groupName);
SELECT groupName, prodName, SUM(price * amount) AS ํ๋งค๊ธ์ก
FROM buyTbl
WHERE groupName IS NOT NULL
GROUP BY CUBE(groupName, prodName);
SELECT groupName, prodName, SUM(price * amount) AS ํ๋งค๊ธ์ก
FROM buyTbl
WHERE groupName IS NOT NULL
GROUP BY GROUPING SETS((groupName), (prodName), ());
โธป
SELECT name, height,
RANK() OVER (ORDER BY height DESC) AS rank_result,
DENSE_RANK() OVER (ORDER BY height DESC) AS dense_rank_result,
ROW_NUMBER() OVER (ORDER BY height DESC) AS row_num
FROM userTbl;
SELECT name, addr, height,
RANK() OVER (PARTITION BY addr ORDER BY height DESC) AS local_rank
FROM userTbl;
SELECT name, birthYear, height,
LAG(name, 1, '์์') OVER (ORDER BY birthYear) AS ์ด์ ์ฌ๋,
LEAD(name, 1, '์์') OVER (ORDER BY birthYear) AS ๋ค์์ฌ๋
FROM userTbl;
SELECT userID, prodName, price * amount AS ๊ตฌ๋งค๊ธ์ก,
SUM(price * amount) OVER (PARTITION BY userID ORDER BY num) AS ๋์ ๊ตฌ๋งค๊ธ์ก
FROM buyTbl
ORDER BY userID, num;
โธป
์กฐ์ธ(Join)์ ๋ ๊ฐ ์ด์์ ํ
์ด๋ธ์ ์ฐ๊ฒฐํ์ฌ ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๊ฒฐ๊ณผ๋ก ์กฐํํ ์ ์๋๋ก ํ๋ SQL ๊ธฐ๋ฅ์
๋๋ค.
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ
์ด๋ธ ๊ฐ ๊ด๊ณ๋ฅผ ์ค์ ํด ๋ณตํฉ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์์ชฝ ํ ์ด๋ธ์์ ์กฐ๊ฑด์ด ์ผ์นํ๋ ํ๋ง ๋ฐํํฉ๋๋ค.
SELECT u.userID, u.name, SUM(b.price * b.amount) AS ์ด๊ตฌ๋งค๊ธ์ก
FROM userTbl u
JOIN buyTbl b ON u.userID = b.userID
GROUP BY u.userID, u.name;
SELECT DISTINCT u.name
FROM userTbl u
JOIN buyTbl b ON u.userID = b.userID
WHERE b.prodName = '์ฑ
';
SELECT rownum AS RN, name, ์ด์๋
FROM (
SELECT u.name, SUM(b.amount) AS ์ด์๋
FROM userTbl u
JOIN buyTbl b ON u.userID = b.userID
GROUP BY u.name
ORDER BY ์ด์๋ DESC
)
WHERE rownum = 1;
ํ์ชฝ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ํฌํจํ๊ณ , ์ฐ๊ฒฐ๋์ง ์์ ์ชฝ์ NULL๋ก ํ์๋ฉ๋๋ค.
SELECT *
FROM userTbl u
LEFT JOIN buyTbl b ON u.userID = b.userID;
SELECT u.userID, u.name
FROM userTbl u
LEFT JOIN buyTbl b ON u.userID = b.userID
WHERE b.userID IS NULL;
SELECT u.name, b.prodName, b.price
FROM userTbl u
RIGHT JOIN buyTbl b ON u.userID = b.userID;
์์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ์กฐํํ๋ฉฐ, ์ผ์นํ์ง ์๋ ๋ฐ์ดํฐ๋ NULL๋ก ์ฑ์๋๋ค.
-- ํ์ ํ
์ด๋ธ
CREATE TABLE studentTbl (
studentID CHAR(5) PRIMARY KEY,
name VARCHAR2(20)
);
-- ์ํ ์์ ํ
์ด๋ธ
CREATE TABLE examTbl (
examID CHAR(5) PRIMARY KEY,
studentID CHAR(5),
subject VARCHAR2(20),
score NUMBER
);
-- ๋ฐ์ดํฐ ์ฝ์
INSERT INTO studentTbl VALUES ('S001', 'ํ๊ธธ๋');
INSERT INTO studentTbl VALUES ('S002', '๊น์ฒ ์');
INSERT INTO studentTbl VALUES ('S003', '์ด์ํฌ');
INSERT INTO studentTbl VALUES ('S004', '๋ฐ์ง๋ฏผ');
INSERT INTO examTbl VALUES ('E101', 'S001', '์ํ', 85);
INSERT INTO examTbl VALUES ('E102', 'S002', '์์ด', 90);
INSERT INTO examTbl VALUES ('E103', 'S005', '๊ตญ์ด', 88);
SELECT s.name AS ํ์์ด๋ฆ, e.subject AS ๊ณผ๋ชฉ, e.score
FROM studentTbl s
FULL OUTER JOIN examTbl e ON s.studentID = e.studentID;
| ์กฐ์ธ ์ ํ | ์ค๋ช |
|---|---|
| INNER JOIN | ์์ชฝ ํ ์ด๋ธ์์ ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๋ง ๋ฐํ |
| LEFT OUTER JOIN | ์ผ์ชฝ ํ ์ด๋ธ ์ ์ฒด + ์ค๋ฅธ์ชฝ ์ผ์นํ๋ ํ๋ง |
| RIGHT OUTER JOIN | ์ค๋ฅธ์ชฝ ํ ์ด๋ธ ์ ์ฒด + ์ผ์ชฝ ์ผ์นํ๋ ํ๋ง |
| FULL OUTER JOIN | ์์ชฝ ํ ์ด๋ธ ์ ์ฒด + ์ผ์นํ์ง ์์ผ๋ฉด NULL ๋ฐํ |