본문 바로가기
DBMS

DMBS의 기본(DISTINCT, 자료형,연산자, LIKE, NULL )_(3)

by 바다의 공간 2025. 1. 17.

📒 다시 dbeaver을 다시킬때!

dbeaver.exe를 누르게되면 다시 실행되고 켜지게 됩니다.

이후에 파일-> 작업공간 전환을 꼭 해서 내가 만든 워크플레이스인지 확인해야합니다.

 


📒 중복값 제거 (DISTINCT)

테이블에보면 중복되는값이 있을 수 있겠죠?(당연한)

예를들어서 한 회사의 직급을 조회할때 과장이 3명 부장이 2명이럴경우 과장, 부장 이런 총으로 직급을 보고싶을때

중복값지거를 쓰면 되겠죠!

그럴때 쓰는 함수는 DSTINCT입니다.

SELECT DISTINCT JOB_ID
FROM EMPLOYEES;

 

--실습1. 연봉에서 중복되는 값을 삭제하고 조회

SELECT DISTINCT SALARY
FROM HR.EMPLOYEES;

 

--실습2. 직급과 성이 동일한 중복 값을 제거 [SAREP / David]가 삭제 처리됨

SELECT DISTINCT JOB_ID,FIRST_NAME
FROM HR.EMPLOYEES;

여기서는 JOB_ID와 FIRST_NAME이 AND조건으로 성립되게됩니다.


📒 다운로드

 

생성자-> 우클릭->데이터추출

확장자 선택

 

확장자를 선택할 수 있는데  csv(엑셀)로 진행해보았습니다.

 

 

버전에따라 다를 수 있지만 보통은 UTF-8이지만 한글일경우 깨질수도 있어서 EUC-KR로 변경해보면 된다.

경로는 TARGET Container로 보면됩니다.


📒 자료형의 구조

1. 문자형

- CHAR()

- VARCHAR2()

(옛날버전은 VARCHAR())

 

: 괄호안에는 입력받는 값의 바이트 단위를 써줍니다 예를들어서 CHAR(2)는  IM 이런식으로만 가능합니다.

 

둘의 차이점

CHAR(100) -> ABC --> 3바이트 활용 / 97바이트 자원낭비 ->NULL값으로 채워짐

VARCHAR2(100) -> ABC --> 3바이트 활용 / 97바이트 자원회수(절약!)

즉 고정졍 가변형의 차이이다.

 

그럼 다 VARCHAR2를 쓰면되지않나라고 생각할텐데예를들어서 직관적일때 (W/M) 로 성별을 나눌때 CHAR(1)이렇게 사용할 수 있다.

 

2. 숫자형

- NUMBER()

NUMBER(10,2)로 하면 10자리 소수점 2자리로 표기한다

예를들어 12345678.90 이런식으로 표기된다.

 

 

3. 날짜형

- SYSDATE

SELECT SYSDATE
FROM DUAL;

현재시간을 알 수 있는 기본문법입니다.


📒 연산자

1. 소괄호() :  소괄호 안에있는 쿼리문이 가장 먼저 실행된다.

▶  select 안에 select안에 select가 있따면 어떤 쿼리문을 먼저 실행해줄지 결정하게 됩니다.

 

2. 산술연산자 : 곱셈(*), 나눗셈(/), 덧셈(+), 뺄셈(-)

 

3. 비교연산자 : =. <, <=, >, >=,  같지않음(!=, 또는 <>)

 

4. 논리 연산자 : AND, OR, NOT

- A AND B  : A조건 그리고 B 조건을 모두 만족하는 상황

▶ 예를들어서 100 =100 AND 200= 200;

▶ 결과출력 완료

 

- A OR B :  A조건 또는 B조건중 하나만이라도 만족하는 상황

▶ 예를들어서 100 =100 OR 300= 200;

 

- A NOT B : A조건이 TRUE이면 FALSE로 출력, FALSE이면 TRUE로 출력 (무조건 반대)

▶조건이 무조건 뒤에 들어옵니다.

▶ 예를들어서 NOT 300 = 200; 의 결과값은 TRUE로 나옴

 

5. IS NULL, IS NOT NULL ▶ NULL(빈값)의 여부를 확인하는 연산자.

말 그대로 값이 없는 값을 NULL이라고 한다 아무의미 없음 6. BETWEEN, IN, ANY, ALL 연산자 : 특정 범위 내에서 데이터를 조회

 

7. LIKE : 패턴 매칭을 수행하는 문법제일 많이쓰이고 제일 간단한거!예를들어서 이름중간에 '길'이 들어가는것! ,끝글자가 '3'으로 끝나는거! 이런거 찾을때 씁니다.

SELECT FIRST_NAME
FROM EMPLOYEES
WHERE FIRST_NAME LIKE '%e';

 

%e로 끝나는것!한글자,두글자든 상관없다. 맨 마지막이 e가 되면 모두 출력해준다.

 

만약 자리수를 정하고싶다면

SELECT *
FROM EMPLOYEES
WHERE FIRST_NAME LIKE '_____e';

 

조건 해석 : e로 끝나는데 앞에글자가 5개 있기때문이 _를 5개 쳐줌

SELECT *
FROM EMPLOYEES
WHERE FIRST_NAME LIKE '%a%';

앞뒤로 몇글자인지는 모르지만 중간에 a가 들어가는, 끝나는 모든것을 찾아달라는 조건문

 

즉 %는 앞에 몇개인지 모르는거고 _는 자리수를 좀 더 구체화해주는것.

 

여기서는 대소문자를 가린다 그대로 작성해줘야된다.

단 컬럼명은 대소문자 구별하지않고 안에있는 내용들은 대소문자를 구별해줍니다.

 

LIKE절 실습문제

실습#1). location테이블에서 도시가 o로 끝나는 데이터를 조회하여라.

SELECT *
FROM LOCATIONS
WHERE CITY LIKE '%o';

 


실습#2). 이메일 아이디가 P로 끝나고, 연봉이 3000이상인 직원의 모든 정보를 조회해라.

SELECT *
FROM EMPLOYEES
WHERE EMAIL LIKE '%P'AND SALARY >= 3000;


# WHERE절 (조건절)

-데이터에 조건을 설정해서 원하는 값을 조회하는 문법-문법 : SELECT 컬럼명 FROM 테이블명 WHERE조건;

 

- 문법:

          SELECT 컬럼명

          FROM 테이블명

          WHERE 조건;


📒 WHERE절 예시

SELECT LAST_NAME, FIRST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY >= 10000;

 

연봉이 1억이상인 사람들

위와같은경우에는 명령어 순서가 달라진다. (겁나중요!!!!)

FORM -> WHERE ->SELECT ->  ORDER BY

 

또한  NOT을 작성하면 부등호도 바뀐다는점을 꼭 염두에두어야한다.

WHERE NOT SALARY >= 10000
          SALARY < 10000

금액도 반대이지만 부등호도 완전히 반대로 된다느점을 꼭!!알아두어야한다.

 


조건절 실습문제

전체 직원 중  David(FIRST_NAME)성을 가진 직원에 대해서 이름, 성, 봉급을 조회(ALIAS == 별칭 지정)하고, 봉급이 가장높은 직원을 순서로 조회하여라.

SELECT * FROM EMPLOYEES;

SELECT LAST_NAME AS "이름",
       FIRST_NAME AS "성",
       SALARY AS "봉급"
FROM EMPLOYEES
WHERE FIRST_NAME = 'David'
ORDER BY "봉급" DESC;

 

WHERE NOT을 하면

SELECT * FROM EMPLOYEES;

SELECT LAST_NAME AS "이름",
       FIRST_NAME AS "성",
       SALARY AS "봉급"
FROM EMPLOYEES
WHERE NOT FIRST_NAME = 'David'
ORDER BY "봉급" DESC;

로 하게되면 DAVID를 뺴고 출력하게 됩니다.


예시로 확인해보기

SELECT 10 || 20
FROM DUAL;

데이터 조회를 할때 성과이름을 붙여서 조회하고싶을때 사용합니다.

그럼 앞뒤로 연결(연결연산자 ||)되어 표시된다.

일시적이고 어디 저장되지않는다 단순조회만 가능

결과값

SELECT '내가 좋아하는 영화는' || '파묘이다.'
FROM DUAL;

 

결과값

 

큰 따옴표, 작은 따옴표는 문법적으로 정해져있다.

알리아스는 큰따옴표, 단순 문자는 작은따옴표로 감싸줍니다.

 

성과 이름을 연결해서 출력하고싶다면?

SELECT FIRST_NAME || LAST_NAME
FROM EMPLOYEES;

FRIST_NALE ❘❘ LAST_NAME

SELECT FIRST_NAME || LAST_NAME AS "FULL_NAME"
FROM EMPLOYEES;

 

알리아스로 변경도 가능합니다.


실습문제

#1) LOCATIONS 테이블에서 나라와 도시 이름을 연결해서 조회하시오.

SELECT * FROM LOCATIONS;

SELECT COUNTRY_ID || '_' || CITY
FROM HR.LOCATIONS;

 

구분연산자



#2) 성과 이름을 연결해서 조회한다. (연결해서 조회할 때는 구분자(_)로 표기한다)       
      EX). 김_고은*

SELECT FIRST_NAME || '_' || LAST_NAME 
FROM HR.EMPLOYEES;

 

    - 이메일 ID를 조회하고, 연결연산자를 이용해서 @koireait.com을 추가 한다.          
      ex). [abc@koreait.com](mailto:abc@koreait.com)*

SELECT EMAIL || '@koreait.com'
FROM HR.EMPLOYEES;

 

    - 성과 이름을 연결할 때는 별칭을 “전체이름”으로, 이메일정보를 조회할 때는 
      “이메일”로 지정하여 조회한다.*


 

📒 산술연산자

SELECT * FROM EMPLOYEES;

SELECT EMPLOYEE_ID,
EMPLOYEE_ID +10,
EMPLOYEE_ID -10,
EMPLOYEE_ID * 10,
EMPLOYEE_ID /10
FROM EMPLOYEES;

각 ID가 산술 123이니까 각각 산술연산가에 10을 값처리를 하면된다.


실습문제

- 직원의 이름(LAST_NAME), 봉급(SALARY), 인상 봉급, 감축 봉급을 조회.
- 직원의 이름 : 이름과 성을 띄어쓰기로 구분해서 연결하고 컬럼명은 “직원이름”으로 조회
- 봉급       : 기존 봉급을 조회하고, 컬럼명은 “봉급”으로 변경
- 인상 봉급    : 기존 봉급에서 10% 증가(1.1%)한 상태로 조회하고 컬럼명은 “인상봉급”으로 변경
- 감축 봉급    : 기존 봉급에서 10% 감소(0.9%)한 상태로 조회하고 컬럼명은 “감축봉급”으로 변경
- 기본 봉급에서 가장 높은 순서대로 조회

SELECT * FROM EMPLOYEES;

SELECT LAST_NAME || ' ' || FIRST_NAME AS "직원이름",
       SALARY AS "봉급",
       SALARY * 1.1 AS "인상봉급",
       SALARY * 0.9 AS "감축봉급"
FROM EMPLOYEES
ORDER BY "봉급" DESC;

아래의 조건에 해당하는 정보를 조회 (모두 ALIAS == 별칭을 지정)
- 성, 이름, 연봉, 부서ID(DEPARTMENT_ID)를 조회
- 부서ID가 80이상이고 연봉이 10,000이상인 직원만을 조회
- 봉급이 가장 많은 순서대로 조회

SELECT FIRST_NAME AS "성",
	   LAST_NAME AS "이름",
	   SALARY AS "연봉",
	   DEPARTMENT_ID AS "부서ID"
FROM EMPLOYEES
WHERE DEPARTMENT_ID >= 80 AND SALARY >= 10000
ORDER BY SALARY DESC;

📒 BETWEEN A  AND B

AND랑 비슷함

: A이상 B이하인 조건

: 범위를 지정하는것

: EX). BETWEEN 1 AND 100 <- 1이상 100 이하

 

WHERE 컬럼명 >= 1 AND 컬럼명 <= 100

SELECT *
FROM HR.EMPLOYEES
WHERE SALARY BETWEEN 1000 AND 12000
ORDER BY SALARY DESC;

 

1억이상이고 1억2천 이하인 연봉자가 DESC내림차순으로 조회되게 됩니다.


📒 IN(A,B,C...)

: 딱 일치하는 값만 도출함.

: A혹은 B 혹은 C 혹은 단 1개라도 맞으면 TRUE로 조회합니다.

:비교연산자를 넣지 못함

SELECT *
FROM HR.EMPLOYEES
WHERE SALARY IN(24000,17000);
-------------------------------정상

SELECT *
FROM HR.EMPLOYEES
WHERE SALARY >= IN(24000,17000);
-------------------------------------에러
비교값이 들어가서에러남

 

📒 ANY문법

:A,B,C 중의 어떤 단 1개라도 맞으면 TRUE로 조회함

:IN과 다르게 비교연산자를 넣을 수 있음

SELECT *
FROM HR.EMPLOYEES
WHERE SALARY >= ANY(24000,17000);

 

📒 ALL(A,B,C)

: A,B,C의 값을 모두 만족해야 TRUE로 조회됨.

: 내가 값을지정한 모든것을 만족해야함.

 


📒 NULL

IS NULL : 빈값을 찾을 때 <-> IS NOT NULL :값이 있는걸 다 찾을때

앞에다 NOT을 붙이면 반대가 출력된다.

SELECT FIRST_NAME, LAST_NAME, COMMISSION_PCT
FROM HR.EMPLOYEES
WHERE NOT COMMISSION_PCT IS NULL;

 

'DBMS' 카테고리의 다른 글

조합(복합)키, NULL값 제어, 모델링  (0) 2025.02.02
제약조건, REFERENCES, 기타 제약조건  (0) 2025.01.21
TABLE만들기 & DDL언어  (0) 2025.01.20
DMBS의 기본(SELECT, ALIAS,ORDER BY)_(2)  (0) 2025.01.15
DMBS_오라클 설치(1)  (1) 2025.01.14