본문 바로가기
클라우드 활용 자바개발자 양성과정/02. 데이터베이스 활용

01. SELECT (기본 문법)

by moca7 2024. 7. 16.

 

ㅁ 보통 테이블의 첫 컬럼이 기본키(PRIMARY KEY)

- 절대 중복되면 안되고, 없어서도 안 됨. 

- 식별자 역할 수행.

 

ㅁ 컬럼값 = 데이터값.

- 행과 열이 만나는 지점. 하나 하나가 데이터다.

 

ㅁ SQL 명령어를 이렇게까지 세분화하지 않고 크게 3개로 분류하기도 한다.

- DDL, DML, DCL

- DQL(SELECT)은 DML로, TCL(COMMIT, ROLLBACK)은 DCL로.

 

 

 

 

 

ㅁ 명령문을 전부 소문자로 실행해도 결과는 동일하다. 

- 오라클의 예약어(키워드)는 대소문자를 가리지 않는다.

- 테이블명, 칼럼명도 대소문자를 가리지 않는다. 

- 작성 스타일은 회사마다 다르다. 

전부 대문자, 전부 소문자, 예약어는 대문자 나머지는 소문자로 쓰기도 한다.

 

- 단 실제 담겨있는 데이터 값은 대소문자를 가린다.

조건식에서 데이터 값을 표현할 때는 정확히 써야 한다.

- 오라클에서 테이블명 또는 칼럼명을 대문자와 소문자를 섞어서 작성해도,  전부 대문자로 보인다.

그래서 여러 단어를 조합할 경우에 낙타 표현법이 불가능하다.

각 단어들마다 주로 언더바로 연결한다. 

 

ㅁ (null) 이라고 되어있는 컬럼값은 이 문자가 있는게 아니고 엑셀로 보면 진짜 비어있음. 

 

ㅁ BR 계정 워크시트 열고, C:\workspaces에 "01_SELECT(기본문법)_BR계정.sql" 파일을 저장하고 시작한다.

 

 

ㅁ < SELECT >

- DATA QUERY LANGUAGE(DQL)

- 데이터 조회 명령문. 데이터 조회시 사용한다.

- 조회 결과를 RESULT SET이라고 한다.

- 데이터 조회했다고 데이터가 변경되지는 않음.

 

 

- 표현법

 

SELECT   조회할칼럼, 칼럼, ..., 산술식, 함수식, ...    AS   "별칭" 

   FROM   조회할테이블

 

- SELECT문에서 SELECT절, FROM절은 필수다.

나머지는 다 생략 가능.

 

 

 

 

 

     SELECT   조회할칼럼, 칼럼, ..., 산술식, 함수식, ...    AS   "별칭" 

        FROM   조회할테이블

      WHERE   조회할데이터의 조건식

GROUP BY   그룹핑시킬 컬럼, 컬럼, ...

     HAVING   그룹에 대한 조건식

ORDER BY   정렬기준

 

 

 

ㅁ "Oracle수업용스크립트.sql" 파일에서 EMPLOYEE 테이블의 데이터 조회하기.

- EMPLOYEE 테이블을 열어서 '데이터' 탭을 가보면 열이 엄청 많다.

- '열' 탭에는 각 칼럼에 대한 정보가 있다.

 

 

- EMPLOYEE 테이블에서 전사원의 모든 칼럼 조회하기

 

 

 

- EMPLOYEE 테이블에서 전사원의 사번, 이름 급여만 조회하기

 

 

 

ㅁ 실습

- JOB 테이블의 모든 컬럼 조회

 

SELECT *
FROM JOB;

 

- JOB 테이블의 직급명 컬럼만 조회

 

SELECT JOB_NAME
FROM JOB;

 

- DEPARTMENT 테이블의 모든 컬럼 조회

 

SELECT *
FROM DEPARTMENT;

 

- DEPARTMENT 테이블의 부서코드, 부서명 컬럼만 조회

 

SELECT DEPT_ID, DEPT_TITLE
FROM DEPARTMENT;

 

- EMPLOYEE 테이블의 사원명, 이메일, 전화번호, 입사일, 급여 조회

 

SELECT EMP_NO, EMAIL, PHONE, HIRE_DATE, SALARY
FROM EMPLOYEE;

 

 

 

ㅁ 컬럼값을 통한 산술연산

- SELECT절에 산술연산식을 작성시 해당 컬럼을 통한 산술연산 결과가 조회됨.

(데이터가 변경되는 것은 아님)

 

- EMPLOYEE의 사원명, 사원의 연봉(급여*12) 조회하기

 

SELECT EMP_NAME, SALARY*12
FROM EMPLOYEE;

 

 

- (SALARY + BONUS*SALARY) * 12

 

산술연산을 하는데 NULL이 포함되면, 산술연산 결과도 NULL이 나온다.

자동으로 NULL이 0으로 취급안 됨. 

곱셈 연산뿐 아니라 덧셈 연산도 NULL이다!

 

 

 

 

- 오라클에서는 날짜 데이터 타입도 있고, 날짜 데이터간의 산술 연산도 가능하다.

입사일로부터 오늘날까지 근무일수 구하기.

 

 

- 날짜만 보여지고 있지만 내부적으로 시간에 대한 데이터도 표현 가능

 

 

 

- SYSDATE : 현재 시스템의 날짜 및 시간

 

SELECT SYSDATE

FROM DUAL; 

 

DUAL은 테이블이 필요없는경우 작성하는 가상 테이블(더미 테이블)이다.

실제 데이터값이 담겨있진 않지만 FROM절을 필수로 써야 하기 때문에 작성한다.

 

"두자리 년도 / 두자리 월 / 두자리 일" 로 보여진다.

만약 지금 조회되고 있는 날짜 및 시간에 대한 상세정보가 궁금하다면 그 데이터 값을 더블클릭하면 연필모양이 뜸.

그걸 누르면 실제 데이터값을 확인할 수 있는 창이 뜬다. 

 

 

 

 

- 날짜 데이터 간의 산술 연산

 

- 입사한 날부터 오늘까지 12579일 지났다. 일단위는 맞음. 

그런데 날짜 - 날짜하면 시간에 대한 데이터까지도 뺄셈이 진행되서 소수점 아래로 지저분하게 보인다.

나중에 버림이나 반올림하는 것을 배운다.

 

 

 

ㅁ 칼럼에 별칭 부여하기

- 조회시 보여질 컬럼명에 별칭을 부여할 수 있다.

- 부여할 별칭에 띄어쓰기나 특수문자가 포함될 경우, 반드시 쌍따옴표를 써준다.

- 열 별칭을 정의할 때, 별칭에 한글을 사용할 경우 큰 따옴표로 감싸야 합니다.

 

 

- 컬럼명 | 산술식     [AS]     별칭 | "별칭"                       //          AS는 생략 가능.

 

 

 

 

 

ㅁ 리터럴

- 임의로 지정한 문자(' ') 값을 리터럴이라고 한다.

- SELECT절에 리터럴값을 제시하면 마치 존재하는 데이터처럼 같이 조회가 가능하다.

 

 

- 사원의 사번, 사원명, 급여, 단위 조회

 

네번째 컬럼 자리에 리터럴 값이 조회됨.

조회만 되는 것뿐이지 실제 EMPLOYEE 테이블에 존재하는 것은 아님.

 

 

 

연결연산자 ( || )

- 여러 컬럼 값들을 마치 하나의 컬럼인 것처럼 연결해서 조회하거나

또는 컬럼 값과 리터럴 값을 연결해서 조회할 때 사용

 

 

- 각각의 컬럼 값들이 하나의 컬럼으로 연결돼서 조회됨.

 

 

 

 

- 오라클에서는 문자(한 글자)와 문자열(여러 글자)을 따로 취급하지 않음.

 

 

 

 

ㅁ DISTINCT

- 조회되는 컬럼 값들 중에 중복된 값은 한번씩만 조회. (NULL도 한번만 조회)

 

 

 

 

- DISTINCT 사용시 유의사항. 

DISTINCT는 SELECT절에 딱 한번만 사용 가능. (조회되는 행수가 다를 수 있어서)

 

 

- 여러 컬럼을 묶어서 중복 제거.

 

DEPT_CODE와 JOB_CODE를 묶어서 중복을 제거함.

DISTINCT를 빼면 15개의 데이터가 조회됨.

 

 

 

ㅁ < WHERE 절> 

- 특정 조건에 만족하는 데이터만을 조회할 때 조건식을 작성하는 구문 

- 다양한 연산자를 통해 참/거짓이 나오도록 조건식을 작성

- 작성위치는 FROM절 뒤에 작성

- 매행 매행 조건검사를 한다. 

 

 

(1) 비교 연산자

- 대소비교: >, <, >=, <=

- 동등비교: =, != 혹은 ^= 혹은 <>

 

 

- 데이터 값을 표현할 때는, 특히 문자 값은 ' '를 써야 한다.

- 데이터 값은 대소문자를 가린다.

 

 

 

 

- DEPT_CODE가 D1이 아닌 사원은 20명인데 18명만 조회되었다.

NULL인 사람 2명이 빠졌다.

 

NULL 값은 비교 연산자(=, <>, 등)를 사용할 때 특별한 처리가 필요합니다.

DEPT_CODE가 NULL인 사원들은 WHERE 절에서 DEPT_CODE <> 'D1' 조건을 만족시키지 않습니다.

 

- NULL인 사람도 포함시키려면, 

WHERE DEPT_CODE <> 'D1' OR DEPT_CODE IS NULL;

 

 

 

ㅁ 지금까지 만든 파일을 깃허브에 올리기

- 3번째 방법.

이미 있는 폴더를 로컬저장소로 지정하고, 원격 저장소 만들기.

- 깃허브데스크톱 - 파일 - new repository.

내가 올리고자 하는 폴더의 상위폴더를 Local Path로 지정. (폴더를 지정하는게 아니고)

Name은 아무거나 쓰면 안되고, 올리고자하는 폴더명과 똑같이 작성. 

- 깃허브데스크톱 - publish repository까지 눌러야 원격저장소가 만들어짐. 

 

 

ㅁ WHERE절에 별칭을 쓸 수 있나?

- WHERE절에서 SELECT절에서 부여한 별칭 사용 불가.

SELECT EMP_NAME, SALARY, SALARY*12 AS 연봉, DEPT_CODE
FROM EMPLOYEE
WHERE 연봉 >= 50000000;             //           불가

- 연산식 다 써줘야 함. 

SELECT EMP_NAME, SALARY, SALARY*12 AS 연봉, DEPT_CODE
FROM EMPLOYEE
WHERE SALARY*12 >= 50000000;

- 왜냐면 실행순서 때문이다.

 

- 회사에서는 하나의 쿼리문에서 SELECT절이 100줄이 넘을 수도 있다.

SELECT문 안에 SELECT문 안에 SELECT문. 

 

 

 

(2) 논리 연산자 ( AND, OR )

- 여러 개의 조건을 엮어서 하나로 제시하고자할 때 사용

- A조건 AND B조건 : 두 조건 모두 참이어야만 최종 결과도 참

- A조건 OR B조건 : 두 조건 중 하나만 참이어도 최종 결화는 참

- BEETWEEN  A   AND   B : A 이상, B 이하의 범위

 

WHERE SALARY BETWEEN 3500000 AND 6000000; 

 

 

(3) 논리 부정 연산자 NOT

WHERE NOT SALARY  BETWEEN 3500000 AND 6000000; 

WHERE SALARY NOT BETWEEN 3500000 AND 6000000; 

 

컬럼명 앞 또는 BETWEEN 앞에 작성 가능. 

 

- 입사일이 90년대(90/01/01 ~ 99/12/31)인 사원들의 모든 컬럼 조회

SELECT *

FROM EMPLOYEE

WHERE HIRE_DATE >= '90/01/01' AND HIRE_DATE <= '99/12/31'

 

DATE와 DATE 간에 있어서 숫자간의 산술연산 다 가능.

대소비교도 가능. 비교할 날짜 형식을 문자열 전달.

 

SELECT *

FROM EMPLOYEE

WHERE HIRE_DATE BETWEEN '90/01/01' AND '99/12/31';

 

 

(4) LIKE 연산자

- 비교하고자하는 컬럼값이 내가 제시한 "특정 패턴"에 만족하는지를 비교할 때 사용. 일치가 아니라. 

- 비교대상컬럼 LIKE '특정패턴' 

만족할 경우 참, 만족하지 못할 경우 거짓.

 

- 참고)

특정패턴 작성시 %, _를 와일드 카드로 사용할 수 있다.

%는 0글자 이상

_는 무조건 1글자 

 

 

- LIKE 대신 '='을 쓰면 이름 자체가 '전%'인 사람을 찾음. 

 

 

- 전화번호 3번째 자리가 1인 사원들의 컬럼들 조회

 

SELECT EMP_ID, EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE LIKE '__1%'

 

 

 

- 와일드 카드실제 데이터 값겹치는 경우

이메일 중 앞글자가 3글자인 사원들의 컬럼들 조회

ex) sim_bs@br.com, sum_di@br.com, ...

 

 

이메일 데이터 값 안에 실제로 언더바가 있다.

와일드카드를 의미하는 언더바 말고, 실제 데이터 값인 문자 언더바를 어떻게 구분하여 표시하는가.

데이터값으로 취급하고자 하는 값 안에 나만의 와일드 카드를 제시하고 해당 와일드 카드를 등록.

 

 

내가 데이터값으로 취급하고자 하는 값 앞에 특수문자 아무거나 하나 작성. 

대신 그 특수문자를 와일드카드로 등록해줘야 함.

 

 

ㅇ 실습 문제

- 사원들 중 전화번호 처음 3자리가 010이 아닌 사원들의 컬럼들 조회

 

SELECT EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE NOT LIKE '010%';          //         WHERE NOT PHONE LIKE '010%'도 가능.

 

 

- DEPARTMENT에서 해외영업부가 아닌 부서들의 컬럼들 조회

 

SELECT DEPT_ID, DEPT_TITLE
FROM DEPARTMENT
WHERE DEPT_TITLE NOT LIKE '해외영업_부';          //           WHERE NOT DEPT_TITLE LIKE '해외영업_부';

 

 

 

(5) NULL값 비교에 사용되는 연산자 ( IS NULL | IS NOT NULL )

- 이건 NOT 위치를 바꾸면 안 됨. 

 

 

(6) IN 연산자

- 비교대상 컬럼 값이 내가 제시한 목록 중에 일치하는 값이 있는지 비교

 

비교대상컬럼  IN  ( 값1,  값2,  값3, ... )

 

 

 

 

ㅁ 연산자 우선순위

- 괄호( )는 우선순위 0.

 

- JOB_CODE가 J7이거나 J2인 사원들 중, 급여가 200만원 이상인 사원들의 모든 컬럼 조회

 

괄호가 없으면, AND가 먼저 연산되어서 J2면서 급여가 200만원 미만인 사람들도 조회됨. 

 

 

 

 

ㅁ < ORDER BY 절 >

- 조회되는 데이터를 정렬시켜서 조회

- SELECT문의 가장 마지막 줄에 작성

- 실행 순서 가장 마지막이다.

실행 순서

 

 

- SELECT 절에서 부여한 별칭을 ORDER BY절에서 사용 가능. 실행 순서상.

 

- ORDER BY 정렬기준의컬럼명 | 별칭 | 컬럼순번   [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ]

 

ASC : 오름차순 정렬 (생략시 기본값)

DESC : 내림차순 정렬

 

NULLS LAST : 정렬하고자하는 컬럼 값에 NULL이 있을 경우 맨 뒤에 배치 (ASC일 때의 기본값)

NULLS FIRST : 정렬하고자하는 컬럼 값에 NULL이 있을 경우 맨 앞에 배치 (DESC일 때의 기본값)

 

 

 

 

 

- 정렬 기준 여러개 제시 가능. BONUS가 같은 경우. 

첫번째 기준의 컬럼 값이 동일할 경우 두번째 컬럼 기준으로 정렬.

 

 

 

-

SELECT EMP_NAME, SALARY*12 "연봉"

FROM EMPLOYEE

 

ORDER BY SALARY * 12 DESC;          산술 연산식 작성 가능

ORDER BY 연봉 DESC;                        별칭 작성 가능

ORDER BY 2 DESC;                             컬럼 순번(조회되는 컬럼 순서) 작성 가능

 

 

'클라우드 활용 자바개발자 양성과정 > 02. 데이터베이스 활용' 카테고리의 다른 글

05. SUBQUERY  (0) 2024.07.19
04. JOIN (조인문)  (0) 2024.07.18
03. GROUP BY & HAVING  (0) 2024.07.18
02. SELECT (함수)  (0) 2024.07.17
0. 오라클 설치  (0) 2024.07.15