개발/Oracle

    [Database] 데이터 입력과 삭제 그리고 수정

    데이터 입력 - INSERT SELECT문을 활용하면 한번에 여러개의 컬럼을 INSERT시킬 수 있다. CREATE TABLE subway_dml_test AS SELECT * FROM subway_statistics WHERE ROWNUM < 1; ALTER TABLE subway_dml_test ADD PRIMARY KEY ( seq_id ); 여기서 AS는 SELECT로 선택된 테이블의 데이터와 컬럼을 복사하는 역할을 한다. 또한 ROWNUM은 SELECT문장에서 반환되는 로우 수를 의미한다. 하지만 AS로 테이블을 만들었을 때는 기본키를 설정할 수 없기 때문에 추후에 ALTER를 사용해서 기본 키를 지정한다. 만약 종합운동장에 승하차한 역만 복사하고 싶다면 어떻게 하면 될까? CREATE TABL..

    [Database] 세미조인과 안티조인

    [Database] 세미조인과 안티조인

    세미조인 메인 쿼리에서 사용된 테이블과 서브쿼리 결과를 조인하는 조인을 의미한다. 먼저 세미 조인은 말 그대로 조인과 유사한 연결방법을 의미한다. 위에서 말했다 싶이 세미조인의 조인 대상은 SELECT문으로 추출된 테이블을 의미한다. 예시를 보면 다음과 같다. EXISTS 연산자를 사용한 세미조인 SELECT * FROM dept_master a WHERE EXISTS (SELECT FROM emp_master b WHERE b.age BETWEEN 40 AND 49 AND a.dept_id = b.dept_id ); Exists연산자는 메인쿼리의 테이블 데이터를 기준으로 서브쿼리에서 반환하는 데이터가 존재하면 참을 반환합니다. INNER JOIN vs SEMI JOIN INNER JOIN과 SEMI J..

    [Database] 서브 쿼리

    [Database] 서브 쿼리

    서브쿼리란? 기존까지 진행했던 쿼리는 1개였다. 하지만 쿼리 내에 쿼리를 집어넣을 수 있는 경우가 존재하는데 이를 서브 쿼리라고 한다. 서브 쿼리는 메인 쿼리 안에 또 다른 SELECT문장을 말한다. 스칼라 서브쿼리 스칼라 서브쿼리는 메인 쿼리의 SELECT 절에서 컬럼이나 표현식처럼 사용되는 쿼리를 의미합니다. 따라서 해당 쿼리의 결과가 여러개의 컬럼을 반환하거나 그러면 안됩니다. SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id, (SELECT b.dept_name FROM dept_master b WHERE a.dept_id = b.dept_id) dept_name FROM emp_master a 서브쿼리는 dept_name이라는 컬럼을 추출한다. ..

    [Database] 테이블 간 관계 맺기 - 외부 조인과 카티션 곱

    [Database] 테이블 간 관계 맺기 - 외부 조인과 카티션 곱

    외부 조인은 내부조인과 달리 다른 테이블과 조인을 하되 조인 컬럼이 존재하지 않는 데이터를 포함시켜서 관계를 맺는 것이다. Left Join Oracle SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id, b.dept_id, d.dept_name, b.use_yn FROM emp_master a, dept_master b WHERE a.dept_id = b.dept_id (+) ORDER BY a.emp_id; 현재 상황에서 a에 있는 데이터 중에 a.dept_id가 null인 데이터가 있다. 해당 데이터가 dept_master와 관계를 맺기위해서는 a.dept_id가 필수적이다. 하지만 이 부분을 null로 채워서 합치게 되면 외부조인이 완성된다. 따라..

    [Database]  테이블 간 관계 맺기 - 내부 조인

    [Database] 테이블 간 관계 맺기 - 내부 조인

    RDBMS는 관계형 데이터 베이스를 관리한다. 관계형 데이터 베이스란 테이블 사이에 관계가 있다는 이야기다. 즉, 테이블 사이에 관계가 있다는 건데 이러한 관계를 만드는 방법이 조인이다. 관계를 맺는 다는 거는 아래의 그림으로 나타낼 수 있을 것이다. 우리가 여기서 눈 여겨보야할 점은 부서번호라는 컬럼이다. 사원테이블과 부서 테이블의 연결고리를 담당하는 컬럼이 부서번호 컬럼이다. 여기서 생각해보야할 점은 테이블 간 연결고리 컬럼은 이름과 데이터형이 동일해야한다는 것이다. 내부 조인은 두 테이블의 연결관계 컬럼을 이용해서 공통적인 부분을 추출해낼때 사용한다. Oracle Inner Join SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id, b.dept_i..

    [Database] 집합 쿼리

    [Database] 집합 쿼리

    RDBMS는 집합 개념이 적용되어있다. 이러한 집합개념을 쿼리로 만들 수 있는데 그러한 연산자를 집합 연산자라고 부른다. SQL의 집합연산자는 기본적으로 두 개 이상의 독립적인 SELECT 문장을 연결하는 형태이다. 그렇기 때문에 두 SELECT문이 반환하는 결과의 컬럼 수와 데이터 형은 동일해야한다. UNION ALL 두 집합의 모든 원소를 가져오는 집합연산자입니다. Ex) 올바른 집합연산자를 이용한 쿼리 SELECT emp_id, emp_name, gender, age FROM emp03 UNION ALL SELECT emp_id2, emp_name2, gender, age FROM emp08 Ex) 집합연산자를 사용할 때 컬럼 수가 다른 경우 SELECT emp_id, emp_name, gender..

    [Database] 데이터 집계 - HAVING

    [Database] 데이터 집계 - HAVING

    WHERE 절에서는 집계합수를 사용하지 못한다. 따라서 집계함수를 사용할 때 조건 비교를 하기 위해서 HAVING을 쓰게 된다. 그렇기에 HAVING의 경우 GROUP BY절과 함께 사용된다. 다음은 HAVING절을 이용한 SQL예시와 설명이다. Q) 승하차 인원 합계가 15000 ~ 16000사이 인 시간대와 역은? My Solution & Answer My Solution SELECT station_name, boarding_time, gubun, MAX(passenger_number) max_value, MIN(passenger_number) min_value, SUM(passenger_number) sum_value FROM subway_statistics GROUP BY station_name,..

    [Database] 데이터 집계 - GROUP BY

    [Database] 데이터 집계 - GROUP BY

    GROUP BY 절 GROUP BY절은 WHERE 절과 ORDER BY 절 사이에 위치해 집계할 대상 컬럼이나 표현식을 명시해주면 된다 SELECT station_name FROM subway_statistics WHERE gubun='승차' GROUP BY station_name ORDER BY station_name; 해설) subway statistics이라는 테이블로 부터 gubun이라는 컬럼이 승차인 애들을 station_name이라는 컬럼을 기준으로 묶어서 집계해봐라. 그렇게 묶인 데이터를 station_name을 기준으로 오름차순 정렬해서 보여줘라 집계 함수 함수 의미 COUNT(expr) expr의 전체 개수를 반환한다. MAX(expr) expr의 최댓값을 반환한다. MIN(expr) e..