PengTory

SQL 학습 정리 본문

데이터베이스

SQL 학습 정리

펭토리 2023. 2. 24. 14:06
--DML Insert
INSERT INTO member (
    id, name, age, email
) VALUES (
    'test', '테스터', 10, 'test@gamil.com'
);

-- update
UPDATE member SET
    name = '홍길동',
    age = 10
WHERE id = 'hong';

-- delete
DELETE FROM member WHERE id = 'hong';

-- insert, update, delete 실행결과 값이 변형된 개수가 리턴된다!

-- select
-- 어디에서? 어떻게? 무엇을?
/*
SELECT
    컬럼명..
FROM 테이블명
WHERE 조건  
GROUP BY  
ORDER BY... 
*/

-- where 조건식 (비교, 논리, IN, LIKE)
-- ~별 -> group by (group by 하면 group by 한것만 출력 가능!! group by 한 컬럼이나 직계 함수만 가능)
-- order by 정렬, (asc: 오름차순, desc: 내림차순) -> 가장 마지막에 실행!

-- 학생, 교수의 이름 아이디 출력
SELECT name, id, 1 type FROM student
UNION ALL
SELECT name, id, 2  FROM professor ORDER BY name;

-- join
SELECT
   s.name, p.name 
FROM student s JOIN professor p -- inner join
ON s.profno = p.no
AND s.grade = 2;

-- outer join (join을 기준으로 left, right)
SELECT
   s.name, p.name 
FROM student s LEFT JOIN professor p -- outer join
ON s.profno = p.no
AND s.grade = 2;

-- subquery (쿼리 안의 쿼리)
SELECT
    ename, salary
FROM emp
WHERE salary > (SELECT salary FROM emp WHERE ename = '양준혁'); -- 단일 행

SELECT
    ename, salary
FROM emp
WHERE salary in (SELECT salary FROM emp WHERE deptno = 20); -- 다중 행

-- 스칼라 서브쿼리 **(복습 필요해보임 헷갈림)
SELECT
    name, (select name from professor where no = student.profno) pname
FROM student; -- 단일 행

-- inline view (view: 가상의 테이블)
-- 학생 + 교수 이름, 아이디, 학생1/ 교수2 -> 박씨들만 출력
SELECT * FROM (
    SELECT name, id, 1 type FROM student 
    UNION ALL
    SELECT name, id, 2  FROM professor ORDER BY name
) a
WHERE name LIKE '박%';

-- 가장 먼저 입사한 직원명, 입사일 출력
-- rownum, rowid 라는 것이 오라클 내부적으로 존재함. 따라서 alias를 주는게 추후에 헷갈리지 않을 수 있음
-- 두번 걸어주지 않아도 WHERE =1 로 하면 동작은 함. 그러나 우리가 만든 rn이 아닌 오라클 내부의 rownum
SELECT * FROM(
    SELECT rownum rn, ename, hiredate FROM (
        SELECT 
            ename, hiredate
        FROM emp
        ORDER BY hiredate
    ) a
)b
WHERE rn <= 3;

SELECT ename, hiredate from emp where hiredate = (select min(hiredate) from emp);

SELECT ename, hiredate from emp where hiredate = min(hiredate); -- 얘는 안됨! 이유는 min()은 함수이기 때문에 where절에서 그룹함수를 쓸 수 없음. 

-- 백업
create table emp_bak as select * from emp;

-- emp_back -> 급여 10% 인상
update emp_bak set salary = salary * 1.1;




CREATE SEQUENCE emp_ex_seq
    START WITH 1
    INCREMENT BY 1
    MINVALUE 1
    MAXVALUE 99999;

SELECT emp_ex_seq.CURRVAL FROM dual;

SELECT emp_ex_seq.NEXTVAL FROM dual;

-- 실제 INSERT 활용
INSERT INTO emp_ex VALUES (emp_ex_seq.nextval, '유관순', 500);

-- view 활용
CREATE VIEW stupro AS 
SELECT * FROM(
    SELECT name, id FROM student
    UNION ALL
    SELECT name, id FROM professor
    ORDER BY NAME
) b;

-- 만약에 새로운 학생이 테이블에 추가될 시 view는 연동이 되어있지 않기 때문에 view에는 추가되지 않는다는 문제가 있다. => 무결성이 떨어짐 그래서 잘 안쓴다.
select * from stupro;

'데이터베이스' 카테고리의 다른 글

JOIN이란? (feat. oracle)  (0) 2023.02.23
GROUPING - GROUP BY 와 HAVING(feat. oracle)  (0) 2023.02.23
Oracle 리스너란?  (0) 2023.02.22
SQL (feat. Oracle)  (0) 2023.02.22
데이터베이스 이론  (0) 2023.02.21