Basic SELECT

vencott·2021년 5월 19일
0

sinc 인턴교육

목록 보기
3/18

Oracle Database Setting

// cmd
sqlplus / as sysdba

alter user hr identified by hr account unlock ;

conn hr/hr

exit

sqlplus hr/hr

SELECT 기본

SELECT의 중요성

현업 업무의 80%가 SELECT

INSERT, UPDATE 등을 쓸 일이 많지 않다

Result Set

데이터를 조회한 결과

0개, 1개, 여러 개가 될 수 있다

SQL 구문 작성 tip

  • 키워드를 포함한 모든 SQL 문장은 대문자로 작성
  • 한칸 공백 사용
  • SELECT, WHERE 등의 절 사이에 줄 나눔
  • 들여 쓰기
  • comma(,)는 앞에
// comma는 앞에
SELECT	  SALARY 
					, NAME 
					, DEPT 
FROM      EMPLOYEE;

단독 테이블

업무적인 연관관계를 가지지 않는 테이블

하지만 Join의 대상으로 활용될 수 있다(Non-EQUI Join)

  • EQUI Join: 부모의 기본키와 자식의 외래키를 equals로 비교
  • Non-EQUI Join

식별 관계

식별 관계

  • 부모의 기본키가 자식의 외래키로 전이됨과 동시에, 자식의 기본키로 활용되는 경우

비식별 관계

  • 부모의 기본키가 자식의 외래 키로 전이되었으나 기본키로 활용되지 않고 일반 속성으로 사용될 때

SELECT 기본 구문

SELECT * | {[DISTINCT] {{colume_name | expr} {[AS] [alias]}, ...}}
FROM table_name
WHERE serach_condition [{AND | OR}, search_condition ...];

SELECT에서 산술 연산을 할 때, NULL인 데이터에 대한 연산 결과는 NULL이 나온다

SELECT	  EMP_NAME, SALARY * 12, (SALARY + (SALARY*BONUS_PCT))*12
FROM	    EMPLOYEE;

AS

AS로 속성명에 별칭을 부여

SELECT	  EMP_NAME AS 이름
		      , SALARY * 12 AS "1년 급여" // ""(double quotation)은 숫자로 시작하거나 특수문자, 공백이 들어갈 때 사용
		      , (SALARY + (SALARY*BONUS_PCT))*12 AS 총소득
FROM	    EMPLOYEE;

리터럴(Literal)

임의로 지정한 문자열

Dummy 컬럼을 생성

SELECT	  EMP_NAME AS 이름
		      , SALARY * 12 AS "1년 급여"
		      , (SALARY + (SALARY*BONUS_PCT))*12 AS 총소득
FROM	    EMPLOYEE;

DISTINCT

중복되는 데이터를 합쳐서 출력

SELECT DISTINCT DEPT_ID
FROM 	 EMPLOYEE;

DISTINCT 키워드 뒤에 여러 개의 속성명이 오면 Composite으로 인식해 두 속성명 모두의 중복을 제거

WHERE

WHERE는 조건을 제시할 때 사용한다

// WHERE 기본
SELECT	  EMP_NAME AS 이름
		      , DEPT_ID AS 부서
FROM 	    EMPLOYEE
WHERE	    DEPT_ID = '90';

WHERE절 내에서 산술 조건을 이용 가능

// WHERE절 내의 산술연산
SELECT	  EMP_NAME AS 이름
		      , SALARY AS 급여
FROM 	    EMPLOYEE
WHERE	    SALARY > 4000000;

AND / OR 키워드로 다수 조건 검색

// AND
SELECT	  EMP_NAME AS 이름
		      , DEPT_ID AS 부서
		      , SALARY AS 급여
FROM 	    EMPLOYEE
WHERE	    DEPT_ID = '90'
AND		    SALARY > 4000000;

// OR
SELECT	  EMP_NAME AS 이름
		      , DEPT_ID AS 부서
		      , SALARY AS 급여
FROM 	    EMPLOYEE
WHERE	    DEPT_ID = '90'
OR		    DEPT_ID = '20;

연결 연산자

연결 연산자 '||'를 사용하여 여러 컬럼을 하나의 컬럼인 것처럼 연결하거나, 컬럼과 리터럴을 연결할 수 있다

// 컬럼과 컬럼을 연결
SELECT	EMP_ID||EMP_NAME||SALARY
FROM	  EMPLOYEE;

// 컬럼과 리터럴을 연결
SELECT	EMP_NAME||'의 월급은'||SALARY||'원 입니다'
FROM	  EMPLOYEE;

논리 연산자

AND

OR

비교 연산자

<>, !=, ^=

  • 같지 않다

BETWEEN AND

  • 특정 범위에 포함되는지 비교

LIKE / NOT LIKE

  • 문자 패턴을 비교
    • %: 문자열의 길이에 상관없음
    • '_': 문자 1개에 해당

IS NULL / IS NOT NULL

  • NULL여부 비교

IN

  • 비교 값 목록에 포함되는지 여부 비교
// BETWEEN AND
SELECT	  EMP_NAME
		      , SALARY
FROM 	    EMPLOYEE
WHERE 	  SALARY BETWEEN 3500000 AND 5500000;

// same as...
SELECT	  EMP_NAME
		      , SALARY
FROM 	    EMPLOYEE
WHERE 	  SALARY >= 3500000
AND 	    SALARY <= 5500000;
// '%' 패턴
SELECT	  EMP_NAME
		      , SALARY
FROM	    EMPLOYEE
WHERE	    EMP_NAME LIKE '김%';

// '_' 패턴
SELECT	  EMP_NAME
		      , PHONE
FROM	    EMPLOYEE
WHERE	    PHONE LIKE '___9_______';

LIKE 뒤에 ESCAPE 옵션을 줘서 해당 문자 뒤의 % 나 _는 문자로 인식

// ESCAPE
SELECT	  EMP_NAME
		      , EMAIL
FROM 	    EMPLOYEE
WHERE	    EMAIL LIKE '___\_%' ESCAPE '\';
// NOT LIKE
SELECT  EMP_NAME
		    , SALARY
FROM    EMPLOYEE
WHERE   EMP_NAME NOT LIKE '김%';

Java와 같이 == NULL이 아닌 IS NULL 사용한다

// IS NULL
SELECT	  EMP_NAME
		      , MGR_ID
		      , DEPT_ID
FROM 	    EMPLOYEE
WHERE 	  MGR_ID IS NULL
AND 	    DEPT_ID IS NULL;
// IN
SELECT	  EMP_NAME
		      , DEPT_ID
		      , SALARY
FROM	    EMPLOYEE
WHERE 	  DEPT_ID IN ('60', '90');

// same as...
SELECT	  EMP_NAME
		      , DEPT_ID
		      , SALARY
FROM	    EMPLOYEE
WHERE 	  DEPT_ID = '60'
OR		    DEPT_ID = '90';
// AND가 OR보다 우선순위가 높아서 오류
SELECT	  EMP_NAME
		      , SALARY
		      , DEPT_ID
FROM 	    EMPLOYEE
WHERE 	  DEPT_ID = '20'
OR 		    DEPT_ID = '90'
AND 	    SALARY > 3000000;

// ()를 통해 해결
SELECT	  EMP_NAME
		      , SALARY
		      , DEPT_ID
FROM 	    EMPLOYEE
WHERE 	  ( DEPT_ID = '20'
OR 		    DEPT_ID = '90' )
AND 	    SALARY > 3000000;

출처: SHINSEGAE I&C 인턴십

profile
Backend Developer

0개의 댓글