본문 바로가기

SQL

[SQL] SELF JOIN, 내 자신과의 조인 이번에 다루게 될 것은 SELF JOIN 입니다. 말 그대로 해당 테이블 자신과 조인을 하는 것을 일컫는데요. 사실 잘 쓰이진 않지만 쓰는 경우도 있습니다. 일단 소개를 하자면 내부조인을 하든 외부조인을 하든 자기 자신의 테이블의 이름을 적어주면 되겠는데요. 이를테면 다음과 같이요. FROM hr.employees INNER JOIN hr.employees 이렇게 적어주면 되겠습니다. 그렇다면, 어떻게 쓰일까요? 예로. employees 테이블을 살펴보면 employee_id 와 manager_id 컬럼이 있는 것을 볼 수 있는데요. 여기서 manager_id는 어느 한사원의 상관의 employee_id가 되겠죠? 그러니 한사원의 상관의 이름이나 기타 다른 정보를 알고 싶을때 사용될 수 있습니다. 다음과.. 더보기
[SQL] CROSS JOIN 또다른 이름 카타시안 프로덕트(Cartesian Product) 이글에서는 CROSS JOIN, 크로스 조인에 대해서 알아볼까 합니다. 타이틀에서 명시했듯이 카타시안 프로덕트라고 하는 이름도 있는데요. 원래 존재하던 SQL 키워드인 카타시안 프로덕트가 SQL이 표준화가 진행되면서 ANSI 표준으로 바뀌었는데 그 이름이 CROSS JOIN 이 된것입니다. 이런 이야기는 앞에서 이야기 했구요. 개념적인 것을 먼저 살펴 보도록 할게요. '모든 경우를 고려한다!' 이것이 바로 크로스 조인의 핵심입니다. 사실 크로스 조인은 개념적인 조인이라고도 하는데요. 이유는 실제 프로젝트에서 이 크로스 조인이 쓰이는 경우는 없기 때문이죠. 그래서 조인이 아니다라고도 한답니다. 위의 말처럼 모든 경우를 고려하기 때문에 우리가 적던 ON절이나 USING절을 배제한체 조인조건을 적지 않습니다... 더보기
[SQL] OUTER JOIN, 외부조인(LEFT, RIGHT, FULL) INNER JOIN, 내부조인에 이은 외부조인 입니다. 내부조인을 접한후에 외부조인을 접하면 개념이 이해가 안갈데가 더 많은데요. 요렇게 생각해보는건 어떨까요? 내부조인 결과+@ 제가 이렇게 한건 결국 외부조인은 내부조인처럼 조인조건을 만족하는 결과에다가(내부조인의 결과와 같습니다.) 내가 조인을 건 어느 테이블의 데이터를 더 보겠다는 겁니다. 그러니 외부조인을 이용해서 데이터를 조회했을 경우에 어느 한쪽 테이블의 값이 null이고 다른 테이블의 데이터는 값이 나오게 되는거죠. 일단 이렇게 알고나서 구문형식을 보도록 할게요. SELECT 테미블명.컬럼명1, 테미블명.컬럼명2, 테미블명.컬럼명3, .. FROM 테이블 명1 (LEFT, RIGHT, FULL) OUTER JOIN 테이블명2 ON 조인조건; .. 더보기
[SQL] INNER JOIN, 내부조인에 대해서 알아보자! (Equi INNER JOIN) 사용하게될 테이블들의 컬럼명입니다. desc조회를 했어요. 1. employees 테이블입니다. 2. departments 테이블입니다. 우선 타이틀에 두개의 조인타입에 대해서 적어 놧는데요. 동일한 타입의 JOIN 입니다. 다만 INNER JOIN 할때 명시해 놓은 조인조건의 결과, 로우가 조인에 참여한 테이블의 조회조건에 상응하는 로우수가 같기때문에 동등하단 의미로 Equi라는 것이 붙은 것입니다. 똑같으니 염려 마세요. 내부조인이라고 불리우는 INNER JOIN 외에도 OUNTER JOIN, CROSS JOIN, NATURAL JOIN이 존재합니다. 우선 여기선 INNER JOIN에 대해서 알아볼건데요. 문법은 다음과 같습니다. SELECT 테이블명.컬럼명1, 테이블명.컬럼명2, ... FROM 테.. 더보기
[SQL] JOIN 조인에 대해서 알아보자! 우리가 여태껏 SQL 문을 써오면서 썻던 hr 스키마 계정에서 항상 employees 테이블에 있는 department_id를 활용을 했었는데요. 그때 아이디로만 활용을 했을뿐 부서명을 알지 못했는데요. 우선 employees 테이블을 조회하여 확인해 보겠습니다. 보세요. 부서명과 관련된 컬럼이 없죠? 그리고 다른 것도 한번 보세요. 하고 있는일, 과업(JOB_ID) 부분도 조회해보면 ID만 알수 있을뿐 이름을 알 수 없습니다. 그럼 이러한 정보는 어디에 있을까요? employees 테이블과 같이 다른 테이블에 그 정보들이 존재합니다. 여기서 테이블에 대해서 설명하고자 한다면 성격이나 데이터 타입이 비슷한 것을 세트로 묶어 놓은 것이라 이야기 할수 있는데요. 우리가 요구한 각 정보들은 department.. 더보기
[SQL] 그룹으로 묶어서 관리해봅시다, GROUP BY! 이제 이쯤 보셨다면 SQL이랑은 많이 친해졌을듯 한데요~ 조금만더 열심히 해요~ 저두 열심히 한답니다!! 앞에서 SUM(), AVG()에 대해서 조금 했었죠? 이와 같은 함수와 같이 쓰이는게 'GROUP BY'입니다. 조금 눈치 채셨을지는 모르겠어요. 이 구문은 데이터들을 묶어서 쿼리를 처리할때 쓰인답니다. 묶는다라.. 감이 안잡히시나요? 간단합니다. 이상한 예이지만. 초등학교 전국 체전이 있습니다. 여기서 우리는 A 부터 Z까지 26개 초등학교가 있는데요. 우리는 여기서 각 초등학교의 참가한 학생수를 알고 싶은겁니다. 각!! 학교별로 말이죠. 그러면 여기서 A라는 학교에 속해있는 100명의 학생들은(가정) A라는 학교라는 공통점이 있고, B라는 학교에 속해있는 120명의 학생들은 B라는 같은 학교를 다.. 더보기
[SQL] 색다른 쓰임, NVL2! 이전글에서 NVL함수에 대해서 살펴봤는데요. NVL함수에 이은 두번째 버전이 있습니다. 그것은 NVL2죠! 다를건 없습니다. 넣는 파라미터 값이 하나더 추가 되었는데요. 문법은 다음과 같습니다. NVL2(컬럼명, 데이터1, 데이터2) 어떻게 쓰냐면요 해당 컬럼에 데이터가 있으면 데이터1을 사용하구요, 반면에 데이터가 없으면 데이터2를 사용합니다. 조금의 차이가 있나요? 있습니다. NVL2는 NVL과는 달리 데이터가 있는 경우에도 명시된 데이터로 바꾸어 버리죠. 만일 이렇게 쓴다면 NVL과 똑같습니다. salary 가 NULL이고 그 컬럼에 대해서 NVL(salary, 0) - 해당 salary 값이 null이면 0으로 아니면 명시된 salary로 NVL2(salary, salary, 0) - 해당 sal.. 더보기
[SQL] NULL 상태도 처리하자, NVL 함수! 우리가 일반 연산자나 그룹 함수(sum, avg 등)를 쓰다보면 각 컬럼의 값이 null인 행이 존재하는데요, 이때 그룹 함수들은 이 null인 행을 연산처리를 안하거나 무시를 합니다. 가령 예를 들면 null은 값이 아닌 상태이기 때문에 아무리 +,-,/,* 등을 해줘도 결과같은 null로 테이블을 조회 했을때 아무것도 표시되지 않습니다. 한번 보실까요? 다음은 월급과 성과급(커미션)을 곱해서 연봉을 계산해볼건데요. 여기서 유의하셔야 할건 커미션을 받는 사람과 그렇지 않는 사람이 있다는 겁니다. SQL> SELECT department_id, first_name, salary, commission_pct AS "CM", salary*12+salary*commission_pct*12 AS "AN_SAL".. 더보기
[SQL] 테이블의 데이터를 바꾸어보자, UPDATE! 이번 글에서는 이미 입력된 데이터를 바꾸어 보도록 합시다. 역시 테이블은 이미 만들어 놓은 hr.employees1 으로 실습을 진행하겠습니다. 구문은 UPDATE로 해석이 되는데요. 다음과 같이 문장이 성립됩니다. SQL> UPDATE 테이블명 SET 바꿀 데이터 WHERE 업데이트할 데이터의 조건 여기서 SET에서는 WHERE절로 조회된 데이터(행)들을 어떠한 정보로 바꿀껀지에 대해서 서술하게 됩니다. 그럼 다음과 같이 써볼게요. SQL> UPDATE hr.employees1 SET salary=1000 WHERE first_name='Ricardo'; 이 구문은 이와 같이 해석될 수 있습니다. 나는 hr.employees1 테이블로 부터 first name이 리카르도인 녀석을 찾아서 그 녀석의 월급.. 더보기
[SQL] 테이블의 데이터를 지워보자, DELETE! 데이터 삭제를 해볼까요? 관련 테이블은 테이블 생성글에서 만들었던 hr 스키마의 employees1과 데이터 입력글에서 추가했던 데이터들로 해볼게요. 기본 문법은 이렇습니다. SQL> DELETE FROM 테이블명 WHERE 조건; 여기서 한가지 주의할건 조건을 적어주지 않게 되면 그 테이블에 있는 모든 행들 즉, 데이터를 날려버리게 됩니다. 트랜잭션에 아시는분들은 ROLLBACK하면 되겠지 하시겠지만 그래도 주의하세요!! 그럼 예제로 사용하게될 employees1 의 테이블을 살펴볼까요? 위처럼 두개의 행이 존재하죠? 여기서 Julia를 퇴사(?)시켜버리겠습니다. 그냥.. 데이터를 지운다구요 ^^ 다음과 같이 할 수 있습니다. SQL> DELETE FROM hr.employees1 WHERE first.. 더보기