DAY02. SQL Basic (Data type, Select)
SQL Basic (data type)
์คํค๋ง : ํ ์ด๋ธ์ ์ ์ฒด ๊ตฌ์กฐ
ํ๊ธ ํ๋ : 3๋ฐ์ดํธ
โ
Oracle ์ฃผ์ ์๋ฃํ(=data type)
1. number(n) : nํฌ๊ธฐ ๋งํผ ์ซ์(์ค์, ์์์ ์๋)๋ฅผ ์ ์ฅ
2. int : 4๋ฐ์ดํธ ํฌ๊ธฐ๋ก ์ ์ ์ ์ฅ
3. varcahr2(n) : nํฌ๊ธฐ ๋งํผ ๊ฐ๋ณ๊ธธ์ด ๋ฌธ์ ์ ์ฅ
4. char(n) : nํฌ๊ธฐ ๋งํผ ๊ณ ์ ๊ธธ์ด ๋ฌธ์ ์ ์ฅ
5. date : ๋ ์ง/์๊ฐ ์ ์ฅ
์ ์ฝ์กฐ๊ฑด
1. primary key : ๊ธฐ๋ณธํค (์ค๋ณต๋ถ๊ฐ+null๋ถ๊ฐ)
2. not null : null๊ฐ ํ์ฉ ์ ํจ = ์๋ต ๋ถ๊ฐ
3, unique : ์ ์ผ๊ฐ (์ค๋ณต๋ถ๊ฐ)โ
โ
โ
1. table ์์ฑ
create table st(
sid int primary key, -- ํ๋ฒ (์ค๋ณต/null ๋ถ๊ฐ)
name varchar(20) not null, -- ์ด๋ฆ (null ๋ถ๊ฐ) null : ๊ฐ์ด ์์
phone varchar(30) unique, --์ ํ๋ฒํธ (ํ์ดํ ๋ํ ๋ฌธ์์ด์ด๋ฏ๋ก varchar, ์ ์ฝ์กฐ๊ฑด unique๋ ์ค๋ณต๋ถ๊ฐ)
email char(50), -- ์ด๋ฉ์ผ (์ ์ฝ์กฐ๊ฑด์ด ์์ = null ํ์ฉ)
enter_date date not null -- ์
ํ๋
๋ (๋ ์ง/์๊ฐ, null ๋ถ๊ฐ)
);
โโ
2. ๋ ์ฝ๋(ํ, row) ์ฝ์
insert into st values(2021001, 'ํ๊ธธ๋', '010-111-1111', 'hong@naver.com', sysdate); --sysdate : ํ์ฌ ์์คํ
์ด ์ธ์ํ๊ณ ์๋ ๋ ์ง
insert into st values(2021002, '์ด์์ ', '010-222-2222', 'lee@naver.com', sysdate);
insert into st values(2021003, '๊ฐ๊ฐ์ฐฌ', '010-333-3333', 'kang@naver.com', sysdate);
โ
3. ๋ ์ฝ๋ ์กฐํ(๊ฒ์)
select*from st; -- * : stํ ์ด๋ธ์ด ๊ฐ์ง ๋ชจ๋ ์ปฌ๋ผ์ ์กฐํ
โ
* ์ ์ฝ์กฐ๊ฑด ์๋ฐฐ ์ฌ๋ก
insert into st values(2021003, '์ ๊ด์', '010-444-4444', 'yoo@naver.com', sysdate); -- ์ ์ผ๊ฐ
insert into st values(2021004, '', '010-555-5555', 'yoo@naver.com', sysdate); -- null๊ฐ
โโ
โ4. ์์ ํ ๋ด์ฉ DB๋ฐ์
commit;
SQL Select (Data type)
1. ์ ์ฒด ๊ฒ์ (ํน์ ์นผ๋ผ ๊ฒ์)
SELECT * FROM emp; -- ์ฌ์ ํ
์ด๋ธ ์ ์ฒด ์กฐํ (14๊ฐ์ ๋ ์ฝ๋)
โ
1) ํน์ ์นผ๋ผ ์กฐํ
SELECT empno, ename, sal, job FROM emp; -- 4๊ฐ ์นผ๋ผ ์กฐํ
SELECT ename, sal, sal+300 FROM emp; -- ์ฐ์ ํํ(+, _, *, /)
SELECT ename, sal, sal*1.1 FROM emp;-- ex) ๊ธ์ฌ 10% ์ธ์
โโ
2) null ์ฒ๋ฆฌ (= ๊ฒฐ์ง์ฒด. ๊ฐ์ด ์๋ ์ํ)
SELECT empno, ename, sal, comm, sal+comm/100 FROM emp -- null ์ฒ๋ฆฌ X
SELECT empno, ename, sal, comm, sal+ NVL(comm,0)/100 FROM emp; -- null ์ฒ๋ฆฌ O
โ
โ3) NVL (ํจ์. ๋์์ผ๋ก ํ๋ ์นผ๋ผ๋ช , ํด๋น ์นผ๋ผ์ด null ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๋ฌด์์ผ๋ก ๋์ฒดํ ๊ฒ์ธ์ง)
SELECT empno, ename, sal, comm, sal*12+ NVL(comm,0)/100 FROM emp; -- sal*12์์์ผ๋ก ์ฐ๋ด ๊ณ์ฐ
โ
4) AS ๋ณ์นญ ํํ (=์ด์ด๋ฆ)
SELECT empno, ename, sal, comm, sal*12+ NVL(comm,0) AS "์ฐ๋ด" FROM emp;
โ
5) ์ฐ๊ฒฐ ์ฐ์ฐ์ || (shift ํค+enter์ ์ํ ํค)
SELECT ename, job FROM emp;
SELECT ename || ' ' || job FROM emp;
SELECT ename || ' ' || job AS "์ฌ์์ง์ฑ
" FROM emp;
โ
6) DISTINCT ๋ช ๋ น๋ฌธ (์ค๋ณต ๊ฐ ์ ๊ฑฐ)
SELECT ename, job From emp;
SELECT DISTINCT job From emp; -- ์ ์ผํ ๊ฐ๋ง ํํฐ๋งํด์ ๋ณด๊ณ ์ ํ ๋
SELECT DISTINCT deptno, job FROM emp; -- DISTINCT ๋ค์๋ ๋ฒ์ฃผํ ์นผ๋ผ๋ง ์ฌ ์ ์์
โ
์ฐ์ต๋ฌธ์
1. ๋ค์ ๋ฌธ์ฅ์์ ์๋ฌ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์์ (๋ ๋ด์ ๋ณ์นญ)
SELECT empno,ename,sal X 12 ๋
๋ด FROM emp;
SELECT empno,ename,sal * 12 ๋
๋ด FROM emp;
โ
2. EMP ํ ์ด๋ธ์ ๊ตฌ์กฐ ํ์ธํ๊ธฐ : ํ์) DESC ํ ์ด๋ธ
DESC emp;
โ
3. EMP ํ ์ด๋ธ์ ๋ชจ๋ ๋ด์ฉ ์กฐํํ๊ธฐ
SELECT * FROM EMP;
โ
4. EMP ํ ์ด๋ธ์์ ์ค๋ณต๋์ง ์๋ empno๋ฅผ ์ถ๋ ฅ
SELECT DISTINCT deptno From emp;
โ
5. EMP ํ ์ด๋ธ์ ename๊ณผ job๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ถ๋ ฅ
SELECT ename ||' '|| job FROM emp;
โ
6. DEPT ํ ์ด๋ธ์ dname๊ณผ aread๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ถ๋ ฅ
SELECT dname ||' '|| loc AS "๋ถ์๋ช
๊ณผ ์์น" FROM dept;
โ
7. EMP ํ ์ด๋ธ์ job๊ณผ sal๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ถ๋ ฅ
SELECT job ||' '|| sal AS "์ง์ฑ
๊ณผ ๊ธ์ฌ" FROM emp;
โ-- ๋ฌธ8) gift ํ ์ด๋ธ์ ๋์์ผ๋ก ๋ณ์นญ์ ์ฌ์ฉํ์ฌ <์ถ๋ ฅ ํ์>๊ณผ ๊ฐ์ด ์ถ๋ ฅ
/* <์ถ๋ ฅ ํ์>
์ ๋ฌผ๋ฒํธ ์ ๋ฌผ์ด๋ฆ
1 ์ฐธ์น์ธํธ
2 ์ดํธ์ธํธ */
SELECT DISTINCT gno AS ์ ๋ฌผ๋ฒํธ, gname AS ์ ๋ฌผ์ด๋ฆ FROM gift;
2. ์กฐ๊ฑด ๊ฒ์ (ํน์ ํ ๊ฒ์)
๋น๊ต ์ฐ์ฐ์
= ๊ฐ๋ค
> ๋ณด๋ค ํฌ๋ค
>= ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค
< ๋ณด๋ค ์๋ค
<= ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค
<>, !=, ^= ๊ฐ์ง ์๋ค
NOT Column_name = ๊ฐ์ง ์๋ค
NOT Column_name > ๋ณด๋ค ํฌ์ง ์๋ค
โ
โ
โ
โ
1) ์ซ์ ์นผ๋ผ : ๋์ ๋น๊ต
SELECT empno, ename, job, sal
FROM emp
WHERE sal >= 3000; -- ๊ธ์ฌ 3000 ์ด์์ธ ์ฌ๋
โโ
2) ๋ฌธ์ ์นผ๋ผ : ๋๋ฑ ๋น๊ต
SELECT empno, ename, job, sal, deptno
FROM emp
WHERE job = 'MANAGER'; -- ๋งค๋์ ์ง์ฑ
์ ๊ฐ์ง ์ฌ๋.
* ์ฃผ์! ๋ฌธ์ ์์(=๋ฆฌํฐ๋) : ๋์๋ฌธ์ ๊ตฌ๋ถ
โ
SELECT empno, ename, job, sal, deptno
FROM emp
WHERE job != 'MANAGER'; -- ๋งค๋์ ์ง์ฑ
์ด ์๋ ์ฌ๋
โ
โ
3) ๋ ์ง ์นผ๋ผ (๋ฌธ์ ์ปฌ๋ผ์ด์ง๋ง ๋ด๋ถ์ ์ผ๋ก๋ ์ซ์ํ์ผ๋ก ์ฒ๋ฆฌ)
SELECT empno,ename,job,sal,hiredate,deptno
FROM emp
WHERE hiredate >= to_date('1982/01/01', 'yyyy/mm/dd'); -- 1982.01.01์ดํ ์
์ฌํ ์ฌ์
-- to_date () : ๋ฆฌํฐ๋ -> ๋ ์งํ ๋ณํ
SELECT empno,ename,job,sal,hiredate,deptno
FROM emp
WHERE hiredate >= '1982/01/01'; -- ์์ ๊ฒฐ๊ณผ๊ฐ์ ๊ฐ์
4) SQL ์ฐ์ฐ์ ์ด์ฉ
SELECT ename, job, sal, deptno
FROM emp
WHERE sal BETWEEN 1300 AND 1500;
SELECT empno,ename,job,sal,hiredate
FROM emp
WHERE empno IN (7902,7788,7566); -- ์๋ ํญ๋ชฉ์ ์๋์ผ๋ก ์๋ต
SELECT empno,ename,job,sal,deptno
FROM emp
WHERE deptno IN (10, 30);
โโ
5) ๊ด๊ณ์ฐ์ฐ์ & ๋ ผ๋ฆฌ์ฐ์ฐ์
* ์ฐ์ฐ์ ์ฐ์ ์์ : ๊ดํธ > ์ฐ์ > ๊ด๊ณ ์ฐ์ฐ์ > ๋ ผ๋ฆฌ ์ฐ์ฐ์ (NOT > AND > OR)
SELECT empno,ename,job,sal,hiredate,deptno
FROM emp
where hiredate >= to_date('1982/01/01', 'yyyy/mm/dd') and -- ๋
ผ๋ฆฌ์ฐ์ฐ์ and : TRUE์ธ ์ข์ฐ ๊ฒฐ๊ณผ๊ฐ์ ๋ชจ๋ ๋ง์กฑ์ํค๋
hiredate <= to_date('1982/12/31', 'yyyy/mm/dd');
SELECT empno,ename,job,sal,hiredate,deptno
FROM emp
WHERE hiredate BETWEEN to_date('1982/01/01', 'yyyy/mm/dd')
AND to_date('1982/12/31', 'yyyy/mm/dd'); -- ์์ ๊ฒฐ๊ณผ๊ฐ์ ๋์ผ
6) LIKE '%' ์ฌ๋ฌ ๊ฐ์ ๋ฌธ์๋ฅผ ๋์ or '_' ์ค์ง ํ ๊ฐ์ ๋ฌธ์๋ง ๋์
SELECT empno,ename,job,sal,hiredate,deptno
FROM emp
WHERE hiredate LIKE '87%'; -- ์
์ฌ๋
๋๊ฐ 87๋ก ์์ํ๋ ์ฌ์
SELECT empno,ename,job
FROM emp
WHERE ename LIKE 'S%'; -- ์ด๋ฆ์ด S๋ก ์์ํ๋ ์ฌ์
SELECT empno,ename,job
FROM emp
WHERE ename LIKE '%M%'; -- ์ด๋ฆ์ M๋ฌธ์๊ฐ ํฌํจ๋ ์ฌ์
SELECT empno,ename,job
FROM emp
WHERE ename LIKE '%S'; -- ์ด๋ฆ์ด S๋ก ๋๋๋ ์ฌ์
SELECT* FROM emp WHERE ename LIKE '%L_K%'; -- ๊ฒฐ๊ณผ๊ฐ : BLAKE
โ
7) IS NULL
SELECT empno,ename,job,sal,comm,deptno
FROM emp
WHERE comm IS NULL; -- ์๋น์ ๋ฐ์ง ๋ชปํ๋ ์ฌ์
SELECT empno,ename,job,sal,comm,deptno
FROM emp
WHERE comm IS NOT NULL; -- ์๋น์ ๋ฐ๋ ์ฌ์ (0๊ฐ๋ ํฌํจ)
โโ
8) ๋ ผ๋ฆฌ์ฐ์ฐ์ : AND, OR, NOT
SELECT empno,ename,job,sal,hiredate,deptno
FROM emp
WHERE sal >= 1100 AND job = 'MANAGER'; -- AND (๋
ผ๋ฆฌ๊ณฑ) : ๋๊ฐ๋ฅผ ๋ชจ๋ ๋ง์กฑ์ํค๋
SELECT empno,ename,job,sal,hiredate,deptno
FROM emp
WHERE sal >= 1100 OR job = 'MANAGER'; -- OR (๋
ผ๋ฆฌํฉ) : ๋ ์ค ํ๋๋ง ๋ง์กฑ์์ผ๋ ๋๋
SELECT empno,ename,job,sal,deptno
FROM emp
WHERE job NOT IN ('MANAGER','CLERK'); -- NOT(๋ถ์ ) : ๋งค๋์ ์ ์ฌ์ ์ง์ฑ
์ ํฌํจ๋์ง ์๋
FROM emp
WHERE job NOT IN ('MANAGER','CLERK'); -- NOT(๋ถ์ ) : ๋งค๋์ ์ ์ฌ์ ์ง์ฑ
์ ํฌํจ๋์ง ์๋
โ
9) ๊ดํธ ์ด์ฉ : ์ฐ์ ์์ ๋ณ๊ฒฝ
SELECT empno,ename,job,sal
FROM emp
WHERE job = 'SALESMAN' OR job = 'PRESIDENT' AND sal > 1500;
SELECT empno,ename,job,sal
FROM emp
WHERE (job = 'SALESMAN' OR job = 'PRESIDENT') AND sal > 1500; -- AND๋ณด๋ค OR๋ฅผ ์ฐ์ ์์๋ก ๋
์ฐ์ต๋ฌธ์
๋ฌธ1) sal์ด 3000์ด์์ธ ์ฌ์์ empno, ename, job, sal ์ถ๋ ฅ
SELECT empno, ename, job
FROM emp
WHERE sal>=3000;
โ
๋ฌธ2) empno๊ฐ 7788์ธ ์ฌ์์ ename๊ณผ deptno ์ถ๋ ฅ
SELECT empno, ename
FROM emp
WHERE empno IN 7788;
โ
๋ฌธ3) sal์ด 1500์ด์์ด๊ณ deptno๊ฐ 10,30์ธ ์ฌ์์ ename๊ณผ sal๋ฅผ ์ถ๋ ฅ
SELECT ename, sal
FROM emp
WHERE sal>=1500 AND deptno IN (10, 30);
โ
๋ฌธ4) hiredate๊ฐ 1982๋ ์ ์ฌํ ์ฌ์์ ๋ชจ๋ ์ ๋ณด ์ถ๋ ฅ(ํํธ : between ~ and ~)
SELECT *
FROM emp
WHERE hiredate BETWEEN '1982/01/01' AND '1982/12/31';
SELECT *
FROM emp
WHERE hiredate LIKE '82%';
๋ฌธ5) comm์ NULL์ด ์๋ ์ฌ์์ ๋ชจ๋ ์ ๋ณด๋ฅผ ์ถ๋ ฅ(ํํธ : is not null)
SELECT *
FROM emp
WHERE comm IS NOT NULL;
๋ฌธ6) comm์ด sal๋ณด๋ค 10%๊ฐ ๋ง์ ๋ชจ๋ ์ฌ์์ ๋ํ์ฌ ename,sal,comm ์ถ๋ ฅ
SELECT ename, sal, comm
FROM emp
WHERE comm >= (sal*1.1);
๋ฌธ7) job์ด CLERK์ด๊ฑฐ๋ ANALYST์ด๊ณ sal์ด 1000,3000,5000์ด ์๋ ๋ชจ๋ ์ฌ์ ์ถ๋ ฅ(ํํธ : in, not in)
SELECT *
FROM emp
WHERE (job='CLERK' OR job= 'ANALYST') AND sal NOT IN (1000,3000,5000);
๋ฌธ8) ename์ L์ด ๋ ์๊ฐ ์๊ณ deptno๊ฐ 30์ด๊ฑฐ๋ ๋๋ mgr์ด 7782์ธ ๋ชจ๋ ์ฌ์ ์ถ๋ ฅ(ํํธ : like)
SELECT *
FROM emp
WHERE ename LIKE '%L%L%' AND (deptno=30 OR mgr=7782);