본문 바로가기

디비

[SQL] 연속되는 숫자, SEQUENCE(시퀀스)! 우리가 학급에서 학생들에게 번호를 부여할때 1번부터 차례대로 최대 학생수까지 번호가 배정됩니다. 이 번호는 각 학생들을 구별할 수 있는 하나의 체계로서 데이터베이스에서는 기본키로 설정이 되는데요, 문자나 어떤 특정한 값이 아닌 이렇게 숫자로 각 데이터들을 구분한다고 할때, 사용되는 것이 SEQUENCE(시퀀스) 입니다. 시퀀스를 설정하게 되면 자료입력시에 순서대로 번호가 입력이 되는데, 한가지 예로 우리가 잘 알고 있는 hr 스키마의 employees 테이블을 살펴볼 수 있습니다. 어느 회사에서는 각 사원들이 입사를 할때 사원번호를 부여한다라고 할때, 이 사원번호는 그 사원을 인식할 수 있는 유일무일한 체계입니다. 다른 사원이 그 사원번호를 가질 수 없다는 말입니다. 이렇게 사원들을 관리하는 employ.. 더보기
[SQL] 제약조건, Constraint(NOT NULL, UNIQUE, PRIMARY KEY(기본키), FOREIGN KEY(외래키))! 테이블 작성시에 Constraint를 사용해서 입력하는 자료에 대해서 제약, 즉 규칙을 정해줄 수 있는데요. 이때 정해진 제약에 따라서 데이터가 입력이 됩니다. 제약에 배반된다면 자료 입력이 거부되면서 오류가 납니다. 즉, 데이터 무결성(Data Integrity)을 지키기 위한 데이터 무결성 제약조건(Integrity Constraint)에 대해서 알아볼까 합니다. 참고로, 네이버 지식백과에서는 데이터 무결성에 대해서 다음과 같이 밝히고 있는데요. "데이터를 인가되지 않은 방법으로 변경할 수 없도록 보호하는 성질" 쉽게 말하면, 권한이 부여된 계정이나 사람만이 접근 가능하고, 정확하고 완전한 데이터들이 저장되어 있는 상태라고 생각하시면 되겠습니다. 여기서 제약조건은 이러한 데이터 무결성을 보장함으로써 .. 더보기
[SQL] 추가된 데이터 타입, TIMESTAMP! TIMESTAMP는 오라클 9I 부터 추가된 확장형 데이터 타입으로 밀리초까지를 지원함으로써 DATE 타입보다는 정밀하게 시간을 나타냅니다. 초를 최대 9자리 지정해서 나타냄이 가능한데 보다 정밀하게 시간 정보를 알 수 있습니다. 디폴트(Default) 값은 6자리로 지정됩니다. 우선 TIMESTAMP는 3가지 종류로 나누어 볼 수 있는데요, 다음을 참조하시길 바랍니다. 1. TIMESTAMP(자리수) - '자리수'에 밀리초의 자리수를 지정해줍니다.(디폴트 6자리) 2. TIMESTAMP(자리수) WITH TIME ZONE - '자리수'에 밀리초의 자리수를 지정해줍니다.(디폴트 6자리) - TIMESTAMP + GMT 즉, 그리니치 표준시와의 차이를 함께 나타냅니다. 3. TIMESTAMP(자리수) WI.. 더보기
[SQL] 기본 데이터 타입(숫자, 문자, 날짜) CREATE를 이용한 테이블 생성시에 표기해주는 것이 데이터 타입인데요. 이번 글에서는 추가된 DATE타입을 제외한 기본 데이터 타입에 대해서 알아볼까해요. 우선 다루게 될 내용은 숫자, 문자, 날짜 데이터 타입 3가지입니다. 사실 각 타입에 더 많은 종류가 있으나 많이 쓰이는 것만 다루겠습니다. 1. 숫자 데이터 타입 · NUMBER(①, ②) - 가변 숫자 타입 - ① 전체 자리수 ② 소수점 이하 자리수 ※ 정수부의 자리수 = (전체자리수 - 소수점 이하 자리수) 먼저, 숫자 데이터 타입입니다. 만일에 숫자데이터 타입을 NUMBER(7,4) 로 지정한다면 , 소수자리수를 포함한 전체자리수가 7자리이고 그중에서 소수자리수는 4자리가 됩니다. 그러면 나머지 정수부분은 3자리가 되는군요. 자료 입력을 해보.. 더보기
[SQL] SET 연산자에 대해서 알아보자, INTERSECT, MINUS! 이글 보시기 전에 SET연산자에 관한 글 먼저 보시길 바랍니다. (밑의 링크를 누르시면 해당 페이지로 이동합니다.) SET연산자에 대해서 알아야할 사전지식 우선 INTERSECT 교집합 입니다. 이전 UNION에 관한 글을 보셨다면 UNION ALL에 썼던 테이블을 그대로 쓸테니 참고 바랍니다. INTERSECT는 두 테이블의 공통 요소만을 뽑아옵니다. 일단 다음 테이블은 한 학원의 두명의 강사의 강의를 듣는 학생들에 대한 테이블입니다. 1. 강사 1 2. 강사 2 여기서 조회하고 싶은건 어느 학생이 두 강사에게 모두 강의를 듣나~ 인데요. INTERSECT를 통해서라면 간단합니다. SELECT * FROM tutor1 INTERSECT SELECT * FROM tutor2; 이와같이 두명의 학생들이 조.. 더보기
[SQL] SET 연산자에 대해서 알아보자, UNION(ALL)! 이글 보시기 전에 SET연산자에 관한 글 먼저 보시길 바랍니다. (밑의 링크를 누르시면 해당 페이지로 이동합니다.) SET연산자에 대해서 알아야할 사전지식 이미 윗글에서 UNION이 무엇인지는 설명을 했기 때문에 쿼리를 실행시키면서 결과를 볼텐데요. 자~ 우선 UNION이 쿼리문에서는 어떻게 쓰이는지 모양새를 봅시다. SELECT 컬럼 1, 컬럼 2 FROM 테이블 UNION(OR UNION ALL) SELECT 컬럼 3, 컬럼 4 FROM 테이블 이렇게 쓸때 주의할 점이 있습니다. 두개의 쿼리의 조회 결과가 합쳐지는 것인데요, 합쳐질때 컬럼의 갯수 및 타입이 다르면 오류가 납니다. 우선 컬럼의 갯수는 SET연산자인 UNION으로 묶어지는 두 쿼리의 컬럼 갯수가 동일해야 합니다. 그렇지 않으면 오류가 나.. 더보기
[SQL] SET 연산자에 대해서 알아보자, 우선 배경지식! SET 연산자에 대해서 우리는 초중고 때 배웠던 집합의 개념을 다시 떠올려 볼 수 있습니다. 사실 초등학교때 배웠는지는 기억이 안나는데요. ^^; 집합의 개념만 잡고 있다면 SET연산자에 대해서 이해가 더 잘 될 겁니다. SET 연산자에서 다룰 내용은요 UNION, UNION ALL, INTERSECT, MINUS 입니다. UNION 들은 합집합에 해당되는 내용이겠구요. INTERSECT는 교집합, 그리고 MINUS는 차집합이 되겟습니다. 우선 혹시나 합집합에 대해서 모르시는 분들을 위해서 잠시 수학의 시간으로 돌아가볼게요 ^^ 합집합은 두개의 집합의 합, 표현식으로는 A∪B 으로 나타낼 수 있겠는데요. 두개의 집합이 합쳐질때 공통요소는 한번만 포함이 됩니다. 즉 예로, A 집합에는 1~5까지의 수가 존.. 더보기
[SQL] WHERE 절을 활용하자, NULL! NULL 은 의미하는 바 대로 존재하지 않는다 입니다. 오라클에서는 NULL을 값이 아닌 상태로 표시하기 때문에 우리가 알고 있는 연산자를 쓸 수 없습니다. department_id=null 과 같이 말이죠. 못 쓰는 것은 아니지만 우리가 의도한 값이 나오지 않게 됩니다. 이때 쓸수 있는 것이 IS NULL 인데요. 다른 SQL에서는 위와 같이 사용 가능합니다. 즉 오라클에서는 부서아이디가 NULL인 사원을 조회하고 싶을때 WHERE department_id IS NULL; 로 하게 되면 우리가 의도 한 것을 얻을 수 있습니다. 해봅시다. SELECT department_id, first_name, salary FROM hr.employees WHERE department_id IS NULL; 이렇게 쓰.. 더보기
[SQL] WHERE 절을 활용하자, LIKE! 쿼리를 이용해서 데이터를 조회 할 때 어떤 특정 패턴을 이용한 조회가 가능합니다. 가령, 회사의 사원들 중에 이름이 'J' 로 시작하는 하는 사원을 조회하고 싶다라던지 사원들의 전화번호가 001로 시작하는 사원들을 조회하고 싶을 때를 말하는 겁니다. 즉 데이터의 일부나 그런 조건을 이용할 수 있도록 가능하게 하는것이 LIKE 라는 키워드 입니다. 다음과 같이 쓸 수 있겠습니다. WHERE 컬럼명 LIKE 조건; 위의 '조건'에 해당하는 부분에 대해서 짚고 넘어갈게요. J로 시작하는 사원의 이름을 조회하고 싶다면 다음과 같이 하면 됩니다. 'J%' 여기서 '%'의 의미는 그 자리가 위치하는 곳에서 다른 문자나 숫자따위가 0개 또는 하나 이상임을 표시합니다. 즉 이렇게 된다면 이름 자체가 J 또는 James.. 더보기
[SQL] WHERE 절을 활용하자, EXISTS! EXISTS는 IN과 유사한 개념입니다. 하지만 적용되는 범위가 다른데요. IN의 괄호( ) 사이에는 특정값이나, 서브쿼리가 올 수 있는 반면에 EXISTS의 () 사이에는 서브쿼리만 올 수 있습니다. 그리고 IN는 ( ) 안에 있는 특정값이나 서브쿼리의 결과값이 포함이 되는지만 체크를 하지만 EXISTS는 () 안의 서브쿼리로 부터 해당 컬럼의 값이 존재 유무만 체크를 합니다. 서브쿼리에 관한 것은 다른글을 참조하면 되겠습니다. 우선 IN을 통해서 부서아이디가 100 또는 110인 부서를 조회해봅시다. IN을 이용한 방법 2가지와 EXIST 문을 작성하겠습니다. 참고로 셋다 같은 결과를 반환하도록 작성할 것이구요. 1. IN에 특정값을 명시해줬습니다. SELECT department_id, employ.. 더보기