SELECT
TARGET LIST
Select ๋ฌธ์ด ๋์์ผ๋ก ํ๋ ์ปฌ๋ผย ๋๋ Subquery ์ ๋ฆฌ์คํธ์ด๋ค.
Target list์ ์ฌ์ฉ๋ Subquery๋ WHERE ์กฐ๊ฑด์ ์์ ์ฌ์ฉ๋๋ Subquery์ ๊ฐ์ด ๋ ๊ฐ ์ด์์ ๊ฐ์ ๊ฐ๊ฑฐ๋ ๋ ๊ฐ ์ด์์ ๊ฒฐ๊ณผ ์ปฌ๋ผ์ ๊ฐ๋ ๊ฒฝ์ฐ์๋ ์ค๋ฅ๋ก ์ฒ๋ฆฌ๋๋ค.
SELECT i1, i2 ... SELECT i1 (Select avg(c1) FROM t1), i2 ...
CASE ๊ตฌ๋ฌธ
CASE <simple_case_expression|searched_case_expression> [else_clause] END simple_case_expression ::= expr WHEN comparison_expr THEN return_expr [WHEN comparison_expr THEN return_expr ...] searched_case_expression ::= WHEN condtion_expr THEN return EXPR [WHEN condtion_expr THEN return EXPR ...] else_clause ::= ELSE else_value_expr
์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋จ ์ธ์ด์ IF... THEN... ELSE๋ธ๋ก์ ์ง์ํ๋ ํํ์์ด๋ค. simple_case_expression์ ํ๋์ ์ปฌ๋ผ์ด๋ ํํ์์ด when ๋ค์ ์ค๋ comparison_expr ๊ฐ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ return_expr์ ๋ฐํํ๋ ํํ๋ก ์ํ๋๋ฉฐ ์ด when ... then ์ ์ ์ํ๋ ๋งํผ ๋ฐ๋ณตํ์ฌ ๊ธฐ์ ํ ์ ์๋ค.
searched_case_expression์ CASE ์ดํ์ ํํ์์ ์ง์ ํ์ง ์๊ณ when์ ์ ๋น๊ต์ฐ์ฐ์๋ฅผ ํฌํจํ ์กฐ๊ฑด์ ์ ๊ธฐ์ ํ๋ค. ๊ฐ ๋น๊ต์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ฐธ์ด๋ฉด then ์ ์ ๊ฐ์ ๋ฐํํ๋ค. else ์ ์ when ์ ๋ค์ ๊ฐ์ด ๋ง์กฑํ์ง ์์ ๊ฒฝ์ฐ(expression ๊ฒฐ๊ณผ๊ฐ NULL์ธ ๊ฒฝ์ฐ์๋) else_value๋ฅผ ๋ฐํํ๋ค.
select * from t1; I1 I2 --------------------------- 2 2 1 1 [2] row(s) selected. select case i1 when 1 then 100 end from t1; case i1 when 1 then 100 end ------------------------------ NULL 100 [2] row(s) selected.
simple_case_expression์ ์์ ์์ i1 ์ปฌ๋ผ์ ๊ฐ์ด 2์ธ ๊ฒฝ์ฐ์ ํด๋นํ๋ ๊ฐ์ด ์์ผ๋ฉด NULL์ ๋ฐํํ๋ค.
select case when i1 > 0 then 100 when i1 > 1 then 200 end from t1; case when i1 > 0 then 100 when i1 > 1 then 200 end ------------------------------------------ 100 100 [2] row(s) selected.
searched_case_expression์์ ๋ง์กฑํ๋ ์ฒซ ๋ฒ์งธ ์กฐ๊ฑด์ ์ ๋ฐํํ๋ฏ๋ก ์ฒซ ๋ฒ์งธ ์กฐ๊ฑด์ ์ ๋ฐํ๊ฐ์ธ 100์ด ๋ฐํ๋๋ฉฐ ๋ ๋ฒ์งธ ์กฐ๊ฑด์ ์ ์คํ์ด ๋์ง ์๋๋ค.
FROM
FROM ์ ์๋ ํ ์ด๋ธ ์ด๋ฆ์ด๋ Inline view๋ฅผ ์ง์ ํ ์ ์๋ค. ํ ์ด๋ธ ๊ฐ์ Join์ ์ํํ๋ ค๋ฉด ํ ์ด๋ธ ํน์ Inline view๋ฅผ ์ผํ(,)๋ก ๊ตฌ๋ถํด์ ๋์ดํ๋ค.
FROM table_name
table_name๋ก ์ง์ ํ ํ ์ด๋ธ ๋ด์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ค.
SUBQUERY(INLINE VIEW) ์ฌ์ฉ
FROM (Select statement)
๊ดํธ๋ก ๋๋ ค์ณ์ง subquery์ ๋ด์ฉ์ ๋ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ค.
๋งํฌ๋ฒ ์ด์ค ์๋ฒ๋ correlated subquery๋ฅผ ์ง์ํ์ง ์์ผ๋ฏ๋ก outer query์์ subquery ๋ด์ column์ ์ฐธ์กฐํ ์ ์๋ค.
JOIN(INNER JOIN)
FROM TABLE_1, TABLE_2
๋ ๊ฐ์ ํ ์ด๋ธ table_1 ๊ณผ table_2๋ฅผ JOINํ๋ค. INNER JOIN์ ํ ์ด๋ธ์ด 3๊ฐ ์ด์ ๋์ด๋ ๋์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ฉฐ WHERE ์ ์ ๊ฒ์ ์กฐ๊ฑด์ ๊ณผ JOIN ์กฐ๊ฑด์ ์ ๋ชจ๋ ๊ธฐ์ ํ์ฌ ์ฌ์ฉํ๋ค.
SELECT t1.i1, t2.i1 FROM t1, t2 WHERE t1.i1 = t2.i1 AND t1.i1 > 1 AND t2.i2 = 3;
INNER JOIN ๋ฐ OUTER JOIN
ANSI ์คํ์ผ์ INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN์ ์ง์ํ๋ค. FULL OUTER JOIN์ ์ง์ํ์ง ์๋๋ค.
FROM TABLE_1 [INNER|LEFT OUTER|RIGHT OUTER] JOIN TABLE_2 ON expression
ANSI ์คํ์ผ JOIN์ ์ ON์ ์๋ JOIN์์ ์ํํ๋ ์กฐ๊ฑด์ ์ ์ฌ์ฉํ๋ค. OUTER JOIN ์ง์์์ where์ ์ Inner table(ON ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ผ๋ฉด NULL์ด ์ฑ์์ง๋ ํ ์ด๋ธ)์ ๋ํ ์กฐ๊ฑด์ ์ด ์๋ ๊ฒฝ์ฐ, ํด๋น ์ง์๋ INNER JOIN์ผ๋ก ๋ณํ๋๋ค.
SELECT t1.i1 t2.i1 FROM t1 LEFT OUTER JOIN t2 ON (t1.i1 = t2.i1) WHERE t2.i2 = 1;
์ ์ง์๋ WHERE ์ ์ ์กฐ๊ฑด t2.i2 = 1์ ์ํ์ฌ INNER JOIN์ผ๋ก ๋ณํ๋๋ค.
PIVOT
PIVOT ๊ตฌ๋ฌธ์ ๋งํฌ๋ฒ ์ด์ค 5.5.6 ๋ฒ์ ๋ถํฐ ์ง์ํ๋ค.
pivot_clause:
PIVOT ๊ตฌ๋ฌธ์ ROW๋ก ์ถ๋ ฅ๋๋ GROUP BY์ ๋ํ ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ปฌ๋ผ์ผ๋ก ์ฌ๋ฐฐ์ดํ์ฌ ๋ณด์ฌ์ค๋ค.
Inline view์ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ ๋ค์๊ณผ ๊ฐ์ด ์ํ๋๋ค.
- Inline view์ ๊ฒฐ๊ณผ ์ปฌ๋ผ ์ค PIVOT ์ ์ ์ฌ์ฉ๋์ง ์์ ์ปฌ๋ผ์ผ๋ก GROUP BY๋ฅผ ์ํํ ํ PIVOT IN ์ ์ ๋์ด๋ ๊ฐ ๋ณ๋ก ์ง๊ณํจ์๋ฅผ ์ํํ๋ค.
- ๊ฒฐ๊ณผ๋ก ๋์จ grouping ์ปฌ๋ผ๊ณผ ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ ํ์ฌ ์ปฌ๋ผ์ผ๋ก ๋ณด์ฌ์ค๋ค.
์)ย ์ฌ๋ฌ ์ผ์๋ก๋ถํฐ ์์ง๋ ๋ฐ์ดํฐ์์ ๊ฐ device ๋ณ๋ก value ๊ฐ์ ์ง๊ณํด์ ์ถ๋ ฅํ๋ผ.
CASE ๊ตฌ๋ฌธ์ ํตํด ์ํํด์ผํ๋ ์ง์๋ฅผ PIVOT ๊ตฌ๋ฌธ์ ํตํด ๊ฐ๋จํ ํํํ ์ ์๋ค.
-- w/o PIVOT SELECT * FROM ( SELECT regtime, SUM(CASE WHEN tagid = 'FRONT_AXIS_TORQUE' THEN dvalue ELSE 0 END) AS front_axis_torque, SUM(CASE WHEN tagid = 'REAR_AXIS_TORQUE' THEN dvalue ELSE 0 END) AS rear_axis_torque, SUM(CASE WHEN tagid = 'HOIST_AXIS_TORQUE' THEN dvalue ELSE 0 END) AS hoist_axis_torque, SUM(CASE WHEN tagid = 'SLIDE_AXIS_TORQUE' THEN dvalue ELSE 0 END) AS slide_axis_torque FROM result_d WHERE regtime BETWEEN TO_DATE('2018-12-07 00:00:00') AND TO_DATE('2018-12-08 05:00:00') GROUP BY regtime ) WHERE front_axis_torque >= 40 AND rear_axis_torque >= 20; -- w/ PIVOT SELECT * FROM ( SELECT regtime, tagid, dvalue FROM result_d WHERE regtime BETWEEN TO_DATE('2018-12-07 00:00:00') AND TO_DATE('2018-12-08 05:00:00') ) PIVOT (SUM(dvalue) FOR tagid IN ('FRONT_AXIS_TORQUE', 'REAR_AXIS_TORQUE', 'HOIST_AXIS_TORQUE', 'SLIDE_AXIS_TORQUE')) WHERE front_axis_torque >= 40 AND rear_axis_torque >= 20; -- Result regtime 'FRONT_AXIS_TORQUE' 'REAR_AXIS_TORQUE' 'HOIST_AXIS_TORQUE' 'SLIDE_AXIS_TORQUE' ------------------------------------------------------------------------------------------------------------------------------------------------------ 2018-12-07 16:42:29 840:000:000 12158 7244 NULL NULL 2018-12-07 14:56:26 220:000:000 3308 663 NULL NULL 2018-12-07 12:20:13 844:000:000 3804 113 NULL NULL 2018-12-07 11:10:01 957:000:000 8729 5384 NULL NULL 2018-12-07 17:46:57 812:000:000 7500 4559 NULL NULL 2018-12-07 14:30:06 138:000:000 5080 6817 NULL -429 2018-12-07 13:09:20 464:000:000 5233 1869 -7253 NULL 2018-12-07 15:43:03 539:000:000 7491 4453 NULL NULL ...
WHERE
SUBQUERY์ ์ฌ์ฉ
์กฐ๊ฑด์ ์ ๋ํด์ subquery์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. IN ๊ตฌ๋ฌธ์ ์ ์ธํ ์กฐ๊ฑด์ ์์ subquery๊ฐ ๋ ๊ฐ ์ด์์ ๋ ์ฝ๋๋ฅผ ๋ฆฌํดํ๊ฑฐ๋, subquery์ ๊ฒฐ๊ณผ ์ปฌ๋ผ์ด ๋ ๊ฐ ์ด์์ธ ๊ฒฝ์ฐ๋ ์ง์ํ์ง ์๋๋ค.
WHERE i1 = (SELECT MAX(c2) FROM T1)
subquery๋ฅผ ์กฐ๊ฑด์ฐ์ฐ์ ์ค๋ฅธ์ชฝ์ ๊ดํธ๋ฅผ ๋๋ฌ์ณ์ ์ฌ์ฉํ๋ค.
SEARCH ๊ตฌ๋ฌธ
์ผ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฌธ๋ฒ์ด ๋์ผํ๋ค. ๋จ,ย ๋ฐ๋์ keyword index๋ฅผ ๋ฑ๋กํด์ผ ํ๋ฉฐ,ย ํ ์คํธ ๊ฒ์์ ์ํ ์ฐ์ฐ์ ํค์๋์ธ "SEARCH"๋ฅผ ์ถ๊ฐํ์ฌ, ๋ถ๊ฐ์ ์ธ ๊ฒ์ ์ฐ์ฐ์ด ๊ฐ๋ฅํ๋ค.
-- drop table realdual; create table realdual (id1 integer, id2 varchar(20), id3 varchar(20)); create keyword index idx1 on realdual (id2); create keyword index idx2 on realdual (id3); insert into realdual values(1, 'time time2', 'series series2'); select * from realdual; select * from realdual where id2 search 'time'; select * from realdual where id3 search 'series' ; select * from realdual where id2 search 'time' and id3 search 'series';
์ํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
Mach> create table realdual (id1 integer, id2 varchar(20), id3 varchar(20)); Created successfully. Mach> create keyword index idx1 on realdual (id2); Created successfully. Mach> create keyword index idx2 on realdual (id3); Created successfully. Mach> insert into realdual values(1, 'time time2', 'series series2'); 1 row(s) inserted. Mach> select * from realdual; ID1 ID2 ID3 ------------------------------------------------------------ 1 time time2 series series2 [1] row(s) selected. Mach> select * from realdual where id2 search 'time'; ID1 ID2 ID3 ------------------------------------------------------------ 1 time time2 series series2 [1] row(s) selected. Mach> select * from realdual where id3 search 'series'; ID1 ID2 ID3 ------------------------------------------------------------ 1 time time2 series series2 [1] row(s) selected. Mach> select * from realdual where id2 search 'time' and id3 search 'series'; ID1 ID2 ID3 ------------------------------------------------------------ 1 time time2 series series2 [1] row(s) selected.
ESEARCH ๊ตฌ๋ฌธ
ESEARCH ๊ตฌ๋ฌธ์ ASCII ๋ฌธ์ ํ ์คํธ์ ๋ํ ํ์ฅ ๊ฒ์์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ๊ฒ์ ํค์๋์ด๋ค. ์ด๋ฌํ ํ์ฅ์ ์ํด % ๋ฌธ์๋ฅผ ์ด์ฉํ์ฌ ์ํ๋ ํจํด์ ๊ฒ์์ ์ํํ๋ค. ์ด Like ์ฐ์ฐ์์ ์์ %๊ฐ ์ค๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ๊ฒ์ฌํด์ผ ํ์ง๋ง, ESEARCH์ ์ฅ์ ์ ์ด ๊ฒฝ์ฐ์๋ ๋น ๋ฅด๊ฒ ํด๋น ๋จ์ด๋ฅผ ์ฐพ์ ์ ์๋ค๋ ๋ฐ ์๋ค. ์ด ๊ธฐ๋ฅ์ ์๋ฌธ ๋ฌธ์์ด(์๋ฌ ๋ฌธ์์ด ํน์ ์ฝ๋)์ ์ผ๋ถ๋ฅผ ์ฐพ์ ๋ ๋งค์ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
์์ select id2 from realdual where id2 esearch 'bbb%'; id2 -------------------------------------------- bbb ccc1 aaa bbb1 [2] row(s) selected. ๊ฒ์ pattern 'bbb%'์ ์ํ์ฌ bbb1๋ ๊ฒ์ ๊ฒฐ๊ณผ์ ํฌํจ๋๋ค. select id3 from realdual where id3 esearch '%cd%'; id3 -------------------------------------------- cdf def1 bcd/cdf1ad abc, bcd1 [3] row(s) selected. % ๋ฌธ์๋ ๊ฒ์ pattern์ ์ฒ์, ๋ ๋ฟ๋ง ์๋๋ผ ๊ฐ์ด๋ฐ์ ์์ด๋ ๋์ํ๋ค. select id3 from realdual where id3 esearch '%cd%'; id3 -------------------------------------------- cdf def1 bcd/cdf1ad abc, bcd1 [3] row(s) selected.
NOT SEARCH ๊ตฌ๋ฌธ
NOT SEARCH๋ SEARCH๊ตฌ๋ฌธ์์ ๊ฒ์๋๋ ์กฐ๊ฑด ์ด์ธ์ ๋ ์ฝ๋๋ค์ ๋ํด์ ์ฐธ์ ๋ฆฌํดํ๋ ๊ตฌ๋ฌธ์ด๋ค.
NOT ESEARCH๋ ์ฌ์ฉํ ์ ์๋ค.
create table t1 (id integer, i2 varchar(10)); create keyword index t1_i2 on t1(i2); insert into t1 values (1, 'aaaa'); insert into t1 values (2, 'bbbb'); select id from t1 where i2 not search 'aaaa'; id -------------------------------------------- 2 [1] row(s) selected.
REGEXP ๊ตฌ๋ฌธ
REGEXP ๊ตฌ๋ฌธ์ ์ ๊ทํํ์์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ๋ํ ๊ฒ์์ ์ํํ๋๋ฐ ์ฌ์ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํน์ ์ปฌ๋ผ์ ํจํด์ ์ ๊ทํํ์์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ๊ฒ ๋๋ค.
ํ๊ฐ์ง ์ฃผ์ํ ์ ์ REGEXP ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ฒด ๊ฒ์ ๋ฒ์๋ฅผ ์ค์ด๊ธฐ ์ํด ๋ฐ๋์ ๋ค๋ฅธ ์ปฌ๋ผ์ ๋ํ ์ธ๋ฑ์ค ์กฐ๊ฑด์ ๋ฃ์ด์ ์ ์ฒด์ ์ธ ๊ฒ์ ๋น์ฉ์ ๋ฎ์ถฐ์ผ ํ๋ค.
ํน์ ํจํด์ ๊ฒ์ฌํ๊ณ ์ ํ ๋์๋ SEARCH ํน์ ESEARCH๋ฅผ ํตํด ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ๋๋ก ํ๊ณ , ์ด๋ฅผ ํตํด ์ ์ฒด์ ์ธ ๋ฐ์ดํฐ ๊ฑด์๊ฐ ์์์ง ์ํ์์ ๋ค์ REGEXP๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์์คํ ์ ์ฒด ํจ์จ ํฅ์์ ๋์์ด ๋๋ค
Mach> create table realdual (id1 integer, id2 varchar(20), id3 varchar(20)); create table dual (id integer); insert into dual values(1); insert into realdual values(1, 'time1', 'series1 series21'); insert into realdual values(1, 'time2', 'series2 series22'); insert into realdual values(1, 'time3', 'series3 series32'); Mach> select * from realdual where id2 REGEXP 'time' ; ID1 ID2 ID3 ------------------------------------------------------------ 1 time3 series3 series32 1 time2 series2 series22 1 time1 series1 series21 [3] row(s) selected. Mach> select * from realdual where id2 REGEXP 'time[12]' ; ID1 ID2 ID3 ------------------------------------------------------------ 1 time2 series2 series22 1 time1 series1 series21 [2] row(s) selected. Mach> select * from realdual where id2 REGEXP 'time[13]' ; ID1 ID2 ID3 ------------------------------------------------------------ 1 time3 series3 series32 1 time1 series1 series21 [2] row(s) selected. Mach> select * from realdual where id2 regexp 'time[13]' and id3 regexp 'series[12]'; ID1 ID2 ID3 ------------------------------------------------------------ 1 time1 series1 series21 [1] row(s) selected. Mach> select * from realdual where id2 NOT REGEXP 'time[12]'; ID1 ID2 ID3 ------------------------------------------------------------ 1 time3 series3 series32 [1] row(s) selected. Mach> SELECT 'abcde' REGEXP 'a[bcd]{1,10}e' from dual; 'abcde' REGEXP 'a[bcd]{1,10}e' --------------------------------- 1 [1] row(s) selected.
IN ๊ตฌ๋ฌธ
column_name IN (value1, value2,...)
IN ๊ตฌ๋ฌธ์ ๋ค์ value ๋ฆฌ์คํธ์์ ๋ง์กฑํ ๊ฒฝ์ฐ TRUE๋ฅผ ๋ฆฌํดํ๋ค. OR๋ก ์ฐ๊ฒฐ๋ ๊ตฌ๋ฌธ๊ณผ ๋์ผํ๋ค.
IN ๊ตฌ๋ฌธ๊ณผ SUBQUERY์ ์ฌ์ฉ
์กฐ๊ฑด์ ์ IN ๊ตฌ๋ฌธ์ ์ค๋ฅธ์ชฝ์ subquery๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋จ, IN ์กฐ๊ฑด์ ์ ์ผ์ชฝ์๋ ์ปฌ๋ผ ๋ ๊ฐ ์ด์์ ์ปฌ๋ผ์ ์ง์ ํ๋ฉด ์ค๋ฅ๋ก ์ฒ๋ฆฌํ๊ณ ์ค๋ฅธ์ชฝ์ subquery์์ ๋ฆฌํด๋๋ ๊ฒฐ๊ณผ ์งํฉ์ด ์ผ์ชฝ ์ปฌ๋ผ๊ฐ์ ์กด์ฌํ๋์ง๋ฅผ ๊ฒ์ฌํ๋ค.
WHERE i1 IN (Select c1 from ...)
๋งํฌ๋ฒ ์ด์ค ์๋ฒ๋ correlated subquery๋ฅผ ์ง์ํ์ง ์์ผ๋ฏ๋ก outer query์์ subquery ๋ด์ column์ ์ฐธ์กฐํ ์ ์๋ค.
BETWEEN ๊ตฌ๋ฌธ
column_name BETWEEN value1 AND value2
BETWEEN ๊ตฌ๋ฌธ์ column์ ๊ฐ์ด value1๊ณผ value2 ๋ฒ์์ ์์ ๊ฒฝ์ฐ, TRUE๋ฅผ ๋ฆฌํดํ๋ค.
RANGE ๊ตฌ๋ฌธ
column_name RANGE duration_spec; -- duration_spec : integer (YEAR | WEEK | HOUR | MINUTE | SECOND);
์ง์ ๋ ์ปฌ๋ผ์ ๋ํด ์๊ฐ ์กฐ๊ฑด์ ์ ์ฝ๊ฒ ์ง์ ํ๋ Range ์ฐ์ฐ์๋ฅผ ์ ๊ณตํ๋ค. Range ์ฐ์ฐ์๋ (BEFORE ํค์๋๋ก ์ง์ ํ๋ ๊ฒ์ฒ๋ผ) ํน์ ์์ ์ ์ง์ ํ๋ ๊ฒ ์๋๋ผ ํ์ฌ ์์ ๋ถํฐ์ ์๊ฐ ๋ฒ์๋ฅผ ์ฐ์ฐ์ ๋์ ์กฐ๊ฑด์ผ๋ก ์ง์ ํ๋ค. ์ด ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฝ๊ฒ ์ํ๋ ์๊ฐ ๋ฒ์ ๋ด์ ๊ฒฐ๊ณผ ๋ ์ฝ๋๋ค์ ๊ฒ์ํ ์ ์๋ค.
select * from test where id < 2 and c1 range 1 hour; ID C1 ----------------------------------------------- 1 2014-07-25 09:28:53 706:707:001 [1] row(s) selected.
GROUP BY / HAVING
GROUP BY ์ ์ SELECT ๋ฌธ์ผ๋ก ๊ฒ์ํ ๊ฒฐ๊ณผ๋ฅผ ํน์ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ฉฐ, ๊ทธ๋ฃน๋ณ๋ก ์ ๋ ฌ์ ์ํํ๊ฑฐ๋ ์ง๊ณ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ฃน๋ณ ์ง๊ณ๋ฅผ ๊ตฌํ ๋ ์ฌ์ฉํ๋ค. ๊ทธ๋ฃน์ด๋ GROUP BY ์ ์ ๋ช ์๋ ์ปฌ๋ผ์ ๋ํด ๋์ผํ ์ปฌ๋ผ ๊ฐ์ ๊ฐ์ง๋ ๋ ์ฝ๋๋ค์ ์๋ฏธํ๋ค.
GROUP BY ์ ๋ค์ HAVING ์ ์ ๊ฒฐํฉํ์ฌ ๊ทธ๋ฃน ์ ํ์ ์ํ ์กฐ๊ฑด์์ ์ค์ ํ ์ ์๋ค. ์ฆ, GROUP BY ์ ๋ก ๊ตฌ์ฑ๋๋ ๋ชจ๋ ๊ทธ๋ฃน ์ค HAVING ์ ์ ๋ช ์๋ ์กฐ๊ฑด์์ ๋ง์กฑํ๋ ๊ทธ๋ฃน๋ง ์กฐํํ๋ค.
SELECT ... GROUP BY { col_name | expr } ,...[ HAVING <search_condition> ] select id1, avg(id2) from exptab where id2 group by id1 order by id1; id1 ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก id2์ ํ๊ท ๊ฐ์ ๊ตฌํ๋ค.
ORDER BY
ORDER BY ์ ์ ์ง์ ๊ฒฐ๊ณผ๋ฅผ ์ค๋ฆ์ฐจ์ ๋๋ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ฉฐ, ASC ๋๋ DESC์ ๊ฐ์ ์ ๋ ฌ ์ต์ ์ ๋ช ์ํ์ง ์์ผ๋ฉด ๋ํดํธ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค. ORDER BY ์ ์ ์ง์ ํ์ง ์์ผ๋ฉด, ์กฐํ๋๋ ๋ ์ฝ๋์ ์์๋ ์ง์์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.
SELECT ... ORDER BY {col_name | expr} [ASC | DESC] select id1, avg(id2) from exptab where id2 group by id1 order by id1; id1 ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก id2์ ํ๊ท ๊ฐ์ ๊ตฌํ๋ค.
SERIES BY
SERIES BY ์ ์ ์ ๋ ฌ๋ ๊ฒฐ๊ณผ์งํฉ์ SERIES BY ์กฐ๊ฑด์ ์ ๋ง์กฑํ๋ ์ฐ์๋ ๊ฒฐ๊ณผ๊ฐ๋ค๋ก ์ถ์ถํ๋ค. ๋ง์ฝ ORDER BY ์ ์ด ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ์๋ _ARRIVAL_TIME ์ปฌ๋ผ๊ฐ์ ์ด์ฉํ์ฌ ์ ๋ ฌ๋ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ฏ๋ก, _ARRIVAL_TIME ์ปฌ๋ผ์ด ์๋ ํ๋ฐ์ฑ ํ ์ด๋ธ์ด๋ ์ฐธ์กฐ ํ ์ด๋ธ์ ๋ํ ์ง์๋, GROUP BY ์ ์ ์ด์ฉํ๋ ๊ฒฝ์ฐ์๋ ๋ฐ๋์ ORDER BY ์ ์ ์ด์ฉํด์ผ ํ๋ค.
์กฐ๊ฑด์ ์ ๋ง์กฑํ๋ ๊ฒฐ๊ณผ๊ฐ๋ค์ ๊ฐ์ SERIESNUM() ํจ์์ ๋ฐํ๊ฐ์ ๊ฐ๊ฒ ๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์์ ๋ฐ์ดํฐ์ ๋ํด์ CREATE TABLE T1 (C1 INTEGER, C2 INTEGER); INSERT INTO T1 VALUES (0, 1); INSERT INTO T1 VALUES (1, 2); INSERT INTO T1 VALUES (2, 3); INSERT INTO T1 VALUES (3, 2); INSERT INTO T1 VALUES (4, 1); INSERT INTO T1 VALUES (5, 2); INSERT INTO T1 VALUES (6, 3); INSERT INTO T1 VALUES (7, 1); ์๋์ ์ง์๋ ๋ค์์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค. SELECT C1,C2 FROM T1 ORDER BY C1 SERIES BY C2>1; C1 C2 --------------------------- 1 2 2 3 3 2 5 2 6 3 C2 ์ปฌ๋ผ์ ๊ฐ์ด 1 ๋ณด๋ค ํฐ C1์ RANGE๊ฐ์ ์๊ณ ์ถ์ ๊ฒฝ์ฐ, SERIESNUM ํจ์๋ก ๊ฐ ๋ ์ฝ๋๊ฐ ์ด๋ ๊ทธ๋ฃน์ ํฌํจ๋๋์ง๋ฅผ ์ถ๋ ฅํ์ฌ RANGE๋ฅผ ๊ฒฐ์ ํ ์ ์๋ค.
LIMIT
LIMIT ์ ์ ์ถ๋ ฅ๋๋ ๋ ์ฝ๋์ ๊ฐ์๋ฅผ ์ ํํ ๋ ์ฌ์ฉํ๋ค. ๊ฒฐ๊ณผ ์งํฉ์ ํน์ ํ๋ถํฐ ๋ง์ง๋ง ํ๊น์ง ์ถ๋ ฅํ๊ธฐ ์ํด ์ ์๋ฅผ ์ง์ ํ ์ ์๋ค
LIMIT [offset,] row_count select id1, avg(id2) from exptab where id2 group by id1 order by id1 LIMIT 10;
DURATION
DURATION์ _arrival_time์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ ๊ฒ์ ๋ฒ์๋ฅผ ์์ฝ๊ฒ ๊ฒฐ์ ํ๋๋ก ํด ์ฃผ๋ ํค์๋์ด๋ค. BEFORE ๊ตฌ๋ฌธ๊ณผ ํจ๊ป ์ฌ์ฉ๋์ด ํน์ ์์ ์ ํน์ ๋ฐ์ดํฐ ๋ฒ์๋ฅผ ์ค์ ํ๊ฒ ํด ์ค๋ค. ์ด DURATION์ ์ ํ์ฉํ๋ฉด ๊ฒ์ ์ฑ๋ฅ์ ํ๊ฒฉํ๊ฒ ์ฌ๋ฆผ๊ณผ ๋์์ ์์คํ ๋ถํ๋ฅผ ํ๊ธฐ์ ์ผ๋ก ๋ฎ์ถ ์ ์๋ค. ๋ ์์ธํ ํ์ฉ ์ฉ๋๋ ๋ค์์ ์ฐธ์กฐํ๋ค.
DURATION Number TimeSpec [BEFORE/AFTER Number TimeSpec] TimeSpec : YEAR | MONTH | WEEK | DAY | HOUR | MINUTE | SECOND
create table t8(i1 integer); insert into t8 values(1); insert into t8 values(2); select i1 from t8; # BEFORE ์ ์์ด select i1 from t8 duration 2 second; select i1 from t8 duration 1 minute; select i1 from t8 duration 1 hour; select i1 from t8 duration 1 day; select i1 from t8 duration 1 week; select i1 from t8 duration 1 month; select i1 from t8 duration 1 year; # DURATION ๊ตฌ๋ฌธ ์ ์ฒด๋ฅผ ์จ์ select i1 from t8 duration 1 second before 1 day; select i1 from t8 duration 1 minute before 1 day; select i1 from t8 duration 1 hour before 1 day; select i1 from t8 duration 1 day before 1 day; select i1 from t8 duration 1 week before 1 day; select i1 from t8 duration 1 month before 1 day; select i1 from t8 duration 1 year before 1 day;
์ํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
Mach> create table t8(i1 integer); Created successfully. Mach> insert into t8 values(1); 1 row(s) inserted. Mach> insert into t8 values(2); 1 row(s) inserted. Mach> select i1 from t8; i1 -------------- 2 1 [2] row(s) selected. # BEFORE ์ ์์ด Mach> select i1 from t8 duration 2 second; i1 -------------- 2 1 [2] row(s) selected. Mach> select i1 from t8 duration 1 minute; i1 -------------- 2 1 [2] row(s) selected. Mach> select i1 from t8 duration 1 hour; i1 -------------- 2 1 [2] row(s) selected. Mach> select i1 from t8 duration 1 day; i1 -------------- 2 1 [2] row(s) selected. Mach> select i1 from t8 duration 1 week; i1 -------------- 2 1 [2] row(s) selected. Mach> select i1 from t8 duration 1 month; i1 -------------- 2 1 [2] row(s) selected. Mach> select i1 from t8 duration 1 year; i1 -------------- 2 1 [2] row(s) selected. # DURATION ๊ตฌ๋ฌธ ์ ์ฒด๋ฅผ ์จ์ Mach> select i1 from t8 duration 1 second before 1 day; i1 -------------- [0] row(s) selected. Mach> select i1 from t8 duration 1 minute before 1 day; i1 -------------- [0] row(s) selected. Mach> select i1 from t8 duration 1 hour before 1 day; i1 -------------- [0] row(s) selected. Mach> select i1 from t8 duration 1 day before 1 day; i1 -------------- [0] row(s) selected. Mach> select i1 from t8 duration 1 week before 1 day; i1 -------------- [0] row(s) selected. Mach> select i1 from t8 duration 1 month before 1 day; i1 -------------- [0] row(s) selected. Mach> select i1 from t8 duration 1 year before 1 day; i1 -------------- [0] row(s) selected.
SAVE DATA
์ง์์ ๊ฒฐ๊ณผ๋ฅผ CSV ๋ฐ์ดํฐ ํ์ผ๋ก ๋ฐ๋ก ์ ์ฅํ๋ค.
SAVE DATA INTO 'file_name.csv' [{FIELDS | COLUMNS} [TERMINATED BY 'char'] [ENCLOSED BY 'char'] ] [HEADER ON|OFF] [ENCODED BY coding_name] AS select query;
์ต์ ์ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ต์ | ์ค๋ช |
---|---|
(FIELDS|COLUMNS) TERMINATED BY 'term_char' ENCLOSED BY 'escape_char' | ์์ฑํ csv ํ์ผ์ ์ปฌ๋ผ ๊ตฌ๋ถ์์ ์ด์ค์ผ์ดํ ๊ตฌ๋ถ์๋ฅผ ์ง์ ํ๋ค. |
HEADER (ON|OFF) | ์์ฑํ csv ํ์ผ์ ์ฒซ๋ฒ์งธ ๋ผ์ธ์ ์ปฌ๋ผ๋ช ์ ์ ๋ ฅํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ค. ๊ธฐ๋ณธ๊ฐ์ OFF์ด๋ค. |
ENCODED BY coding_name coding_name = ( UTF8, MS949, KSC5601, EUCJP, SHIFTJIS, BIG5, GB231280 ) | ์ถ๋ ฅ ๋ฐ์ดํฐ ํ์ผ์ ์ธ์ฝ๋ฉ ํฌ๋งท์ ์ง์ ํ๋ค. ๊ธฐ๋ณธ๊ฐ์ UTF8์ด๋ค. |
SAVE DATA INTO '/tmp/aaa.csv' AS select * from t1; -- select ๋ฌธ์ ์คํํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ '/tmp/aaa.csv' ํ์ผ์ csv ํฌ๋ฉง์ผ๋ก ๊ธฐ๋กํ๋ค. SAVE DATA INTO '/tmp/ccc.csv' FIELDS TERMINATED BY ';' ENCLOSED '\'' HEADER ON ENCODED BY 'MS949' AS select * from t1 where i1 > 100; -- select ๋ฌธ์ ์คํํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ /tmp/ccc.csvํ์ผ์ ๊ธฐ๋กํ๋ค. ํ๋ ๊ตฌ๋ถ์์ ์ด์ค์ผ์ดํ ๊ตฌ๋ถ์๋ฅผ ๊ฐ๊ฐ ์ง์ ํ๊ณ ์ ์ฅ๋๋ ๋ฐ์ดํฐ์ ์ธ์ฝ๋ฉ์ MS949๋ก ์ค์ ํ๋ค.