NULL값 조회

1. NULL의 특징

  • NULL은 모르는 값을 의미한다
  • NULL은 값의 부재를 의미한다
  • NULL과 숫자 혹은 날짜를 더하면 NULL이 된다
  • NULL과 어떤 값을 비교할 때 '알 수 없음'이 반환된다

2. NULL값 조회

  • NULL을 조회 할 경우는 IS NULL을 사용하고 NULL값이 아닌 NOT NULL을 사용한다

2023.04.23 - [study/SQL] - [ORACLE] NULL값 처리 IS NULL / IS NOT NULL 연산자

 

[ORACLE] NULL값 처리 IS NULL / IS NOT NULL 연산자

Oracle 데이터베이스에는 값이 없는 NULL값이 있다. IS NULL과 IS NOT NULL을 사용해서 해당 값들을 조회할 수 있다 다음의 테이블에서 salary값이 null인 데이터를 추출하기 위해서는 select * from employees wher

w-world.tistory.com

NULL 관련 함수

NVL 함수 ◾ NULL이면 다른 값으로 바꾸는 함수
 NVL(값,0)은 '값' 칼럼이 NULL이면 0으로 바꾼다
NVL2 함수  NVL함수와 DECODE함수를 하나로 만든 것이다
 NVL2('값',1,0)은 '칼럼'이 NULL이면 0을 반환한다
NULLIF 함수  두 개의 값이 같으면 NULL을, 같지 않으면 첫번째 값을 반환한다
 NULLIF(exp1, exp2)0은 exp1과 exp2가 같으면 NULL을, 같지 않으면 exp1을 반환한다
COALSECE  NULL이 아닌 최초의 인자 값을 반환한다
 COALESCE(exp1, exp2, exp3 …)은 exp1이 NULL이 아니면 exp1값을, 그렇지 않으면 그 뒤의 값의 NULL여부를 판단하여 값을 반환한다

NVL

SELECT NVL(user_name, 'Unknown') as user_name
FROM game_player;

해당 쿼리는 'game_player' 테이블에서 'user_name'열의 NULL값을 기본값'Unknown'으로 바꾼다

NVL2

SELECT NVL2(nick_name, nick_name, 'Who are you') as nick_name
FROM game_player;

NULLIF

SELECT first_name, NULLIF(salary, 0) as salary
FROM employees;

해당 쿼리는 'employees'테이블에서 'first_name'열을 검색하고 0과 같은 급여 값을 NULL으로 바꾼다

COALESCE

SELECT COALESCE(first_name, last_name, 'Unknown') as full_name
FROM employees;

해당 쿼리는 null이 아닌 첫 번째 인자의 값을 반환한다.

반응형

WHERE은 오라클에서 특정 범위를 필터링 할 수 있다.

날짜, 숫자, 문자의 특정 값의 사이 값을 조회할 수 있다.

 

WHERE 절 기본형식

SELECT *
FROM 테이블명
WHERE 컬럼명 BETWEEN '시작 범위' AND '끝 범위';

WHERE 문 예제

다음과 같은 지브리 영화 목록에 대한 테이블이 있는데 2000년 부터 2010년 사이에 개봉한 영화를 조회하기 위해서는

다음 쿼리문을 통해 조회할 수 있다.

select *
from studio_ghibli
where release between 2000 and 2010;

한글로도 범위를 지정해서 검색할 수 있다.

select *
from test
where text_ between '나' and '마';

나 ~ 마 사이를 검색!

반응형

Oracle 데이터베이스에는 값이 없는 NULL값이 있다.

IS NULL과 IS NOT NULL을 사용해서 해당 값들을 조회할 수 있다

다음의 테이블에서 salary값이 null인 데이터를 추출하기 위해서는

select *
from employees
where salary is null;

월급이 없는 불쌍한 조정석

salary가 null인 데이터 하나만 추출된다.

해당 테이블에서 salary값이 null이 아닌 데이터를 추출하기 위해서는

select *
from employees
where salary is not null;

조정석을 제외한 다른 사람들의 결과 출력

salary값이 null이 아닌 데이터가 추출된다.

 

∩  ∩
ฅ(=ˇωˇ=)ฅ

반응형

Oracle 데이터베이스는 관계형 데이터베이스 관리 시스템(RDBMS)으로, 다양한 종류의 테이블을 생성하여 데이터를 생성하고, 수정하고, 삭제하며 관리할 수 있다.

 

 

테이블 생성

기본형식

CREATE TABLE 테이블명
(
	컬럼명 데이터타입 NOT NULL,
    컬럼명 데이터타입,
    ...
);

예제

CREATE TABLE employees
(
  emp_id NUMBER(5) PRIMARY KEY,
  first_name VARCHAR2(50),
  last_name VARCHAR2(50) NOT NULL,
  hire_date DATE,
  salary NUMBER(10,2

PRIMARY KEY

  • 기본키를 지정할 때 칼럼 옆에 작성
  • 기본키는 기본적으로 NOT NULL 옵션을 가진다

NOT NULL

  • 해당 칼럼에 NOT NULL 옵션을 부여한다
  • NULL 값이 들어갈 수 없다

NULL DEFAULT(값)

  • 초기값을 지정해서 넣을 수 있다

 

테이블 변경

기본 형식

ALTER TABLE 테이블명;

예제

-- 컬럼 추가
ALTER TABLE employees
ADD (email VARCHAR2(100));

-- 컬럼 삭제
ALTER TABLE employees
DROP COLUMN email;

-- 컬럼 수정
ALTER TABLE employees
MODIFY (salary NUMBER(12,2));

-- 제약 조건 추가
ALTER TABLE employees
ADD CONSTRAINT emp_pk PRIMARY KEY (emp_id);

-- 제약 조건 삭제
ALTER TABLE employees
DROP CONSTRAINT emp_pk;

-- 제약 조건 수정
ALTER TABLE employees
MODIFY (salary DEFAULT 0);

테이블 삭제

기본형식

DROP TABLE 테이블명;

예제

-- 테이블 삭제
DROP TABLE employees;

-- 테이블 삭제시 CASCADE 옵션 사용
DROP TABLE employees CASCADE CONSTRAINTS;

DROP

  • 해당 테이블 삭제
  • 테이블의 데이터 구조 뿐 아니라 저장된 데이터도 모두 삭제

CASECADE CONSTRAINT

  • 해당 테이블의 데이터를 외래키로 참조한 테이블과 관련된 제약사항도 함께 삭제한다
반응형

sqldeveloper 내에서 한글 데이터가 다음과 같이 깨지는 것을 발견했다.

 

도구 > 환경설정 > 환경 > 인코딩 을 확인한다

MS949로 되어있는 것을 UTF-8로 변경시켜준다

반응형

ORA-12899: "SYSTEM"."POKEMON_MSTR"."DETAIL" 열에 대한 값이 너무 큼(실제: 136, 최대값: 128)

 

ALTER TABLE POKEMON_MSTR MODIFY(DETAIL varchar2(200));

내가 입력할 값보다 더 큰 크기로 값을 수정해주면 해결할 수 있다.

반응형

오라클 데이터 베이스 공부를 하기위해 임의의 데이터 테이블을 생성하고 해당 테이블에 데이터를 넣어보고 있다.

 

테이블 칼럼은 pno(number), pname(varchar), categorize(varchar)로 생성하였으며

INSERT INTO POKEMON_MSTR
VALUES(0001,'이상해씨','씨앗포켓몬');

다음과 같이 INSERT문을 통해 데이터를 입력할 수 있다.

 

하지만 내가 원하는건 한번에 데이터를 넣는 것...

INSERT INTO POKEMON_MSTR
VALUES(0004,'파이리','도롱뇽포켓몬'),
	(0005,'리자드','화염포켓몬'),
	(0006,'리자몽','화염포켓몬');
SQL 오류: ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다
00933. 00000 -  "SQL command not properly ended"

단순히 VALUES를 반복해서 작성하는 것으로는 sql문이 종료되지 않았다는 오류만 뱉어낼 뿐이다

 

INSERT ALL
    INTO POKEMON_MSTR
    VALUES (4, '파이리', '도롱뇽포켓몬')
    INTO POKEMON_MSTR
    VALUES (5, '리자드', '화염포켓몬')
    INTO POKEMON_MSTR
    VALUES (6, '리자몽', '화염포켓몬')
SELECT *
FROM DUAL;

 

다음과 같이 INSERT ALL을 써서 데이터를 넣어주면 데이터를 성공적으로 넣을 수 있다.

서브쿼리를 필요로 하기 때문에 SELECT * FROM DUAL;을 작성해준다.

 

∩  ∩

ฅ(=ˇωˇ=)ฅ

반응형

SELECT문

SELECT * FROM 테이블명

저장되어있는 데이터를 가져올 때 사용

*는 모든 정보를 가지고 온다

select *
from employees;

select *
from departments;

select *
from dept_manager;

select *
from titles;

SELECT 컬럼명1, 컬럼명2 FROM 테이블명

테이블의 컬럼 정보를 가지고 온다

select emp_no, first_name, last_name
from employees;

연산자

데이터베이스의 연산자는 컬럼의 값을 더하고 빼는데 사용된다

select 20 + 10;
select 20 - 10;
select 20 * 10;
select 20 / 10;

급여의 10% 인상액 계산

select emp_no, salary, salary * 1.1
from salaries;

문자열을 더할 경우 문자열을 0으로 취급한다

select last_name + first_name
from employees;

같은 부서 번호의 중복을 제거한다

select distinct dept_no
from dept_emp;

조건절

d001 부서의 사원번호와 부서번호

select emp_no, dept_no
from dept_manager
where dept_no = 'd001';

<> 아닌

d001 부서가 아닌 사원번호와 부서번호

select emp_no, dept_no
from dept_manager
where dept_no <> 'd001';

급여가 70000이상인 사원

select emp_no, salary
from salaries
where salary >= 70000;

1990년 01월 01일 이후 입사한 사원

select emp_no, first_name, last_name, hire_date
from employees
where hire_date >= '1990-01-01';

논리 연산자

- 두 개 이상의 조건문을 작성할 때 사용하는 연산자

- and : 양쪽 조건 모두 만족

- or : 양쪽 조건 중 하나만 만족

- not : 조견 결과 부정

 

1990년 01월01일 이후 입사했고, 성별이 남자인 사람

select emp_no, gender, hire_date, first_name
from employees
where hire_date >= '1990-01-01' and gender="M";

1990년 01월 01일 이후 부터 80000이 넘는 경우

select emp_no, salary, from_date
from salaries
where from_date >= '1990-01-01' and salary >= 80000;

d0001 혹은 d0001 부서의 매니저

select emp_no, dept_no
from dept_manager
where dept_no = 'd001' or dept_no = 'd002';

 

select emp_no, dept_no
from dept_manager
where dept_no in('d001','d002');

70000과 79999사이

select emp_no, salary
from salaries
where salary between 70000 and 79999;

그 반대

select emp_no, salary
from salaries
where not salary between 70000 and 79999;

 

select *
from employees;

select *
from departments;

select *
from dept_manager;

select *
from titles;

select emp_no, first_name, last_name
from employees;

select 20 + 10;
select 20 - 10;
select 20 * 10;
select 20 / 10;

select emp_no, salary, salary * 1.1
from salaries;

select last_name + first_name
from employees;

select distinct dept_no
from dept_emp;

select emp_no, dept_no
from dept_manager
where dept_no = 'd001';

select emp_no, dept_no
from dept_manager
where dept_no <> 'd001';

select emp_no, salary
from salaries
where salary >= 70000;

select emp_no, first_name, last_name, hire_date
from employees
where hire_date >= '1990-01-01';

select emp_no, gender, hire_date, first_name
from employees
where hire_date >= '1990-01-01' and gender="M";

select emp_no, salary, from_date
from salaries
where from_date >= '1990-01-01' and salary >= 80000;

select emp_no, dept_no
from dept_manager
where dept_no = 'd001' or dept_no = 'd002';

select emp_no, dept_no
from dept_manager
where not dept_no = 'd001';

select emp_no, salary
from salaries
where salary between 70000 and 79999;

select emp_no, salary
from salaries
where not salary between 70000 and 90000;

select emp_no, dept_no
from dept_manager
where dept_no in('d001','d002');

 

 

 

반응형

+ Recent posts