코딩하는 문과생

[SQL] 2. SQL 기초 & SELECT 본문

프로그래밍/SQL

[SQL] 2. SQL 기초 & SELECT

코딩하는 문과생 2020. 1. 20. 10:58

[ERD: 객체 관계도]
ERD: Entity Relationship Diagram

# Recursive relationship이 존재할 수도 있다.
자기가 자신을 참조
ex. 사원에 대한 사수와 관계

# 관계가 없는 테이블: Some table
-> JOIN이 될 수 있다.(Non-equals JOIN)

# 관계
실선: 식별 유형 (전이된 기본키가 자식테이블의 기본 키가 되는 경우, Optional이 사라진다.)
점선: 비식별 유형 (전이된 기본키가 자식테이블의 기본 속성이 되는 경우)

[기본용어] 

컬럼
기본키(Identifier): 각 행을 식별할 수 있는 칼럼 또는 컬럼 조합 (중복 x, Null x, if 관계, no Change)
외래키: 다른 테이블의 기본키를 참조하는 컬럼 (부모테이블의 기본키가 자식 테이블에 전이된다. Null값 허용)
컬럼 값 

[SQL]
SELECT: 데이터 검색(SELECT)
DML: 데이터 조작(INSERT, UPDATE, DELETE)
DDL: 데이터 정의(CREATE, DROP, ALTER)
TCL: 트랜잭션 제어(COMMIT, ROLLBACK)

[주요 데이터 타입]
NUMBER 
CHARACTER(CHAR - 고정길이가 필요할 때, VARCHAR - 가변길이, LONG) 
DATE
//참고: NUMBER(정수자릿수, 실수자릿수)
//DATE는 기본적으로 년/월/일 만 지원, 그리고 날짜 연산 및 비교 가능

[SELECT]
결과집합: Result Set 을 가져와야 한다.
특정 컬럼 조회
특정 행 조회
특정 행/컬럼 조회
조인된 테이블의 특정 행/컬럼 조회

SELECT * | [DISTINCT] ... , [AS] ... 
FROM table_name 
WHERE search_condition | [ [AND, OR], search_condition...]; 


[실습]

# ex1)

SELECT 	EMP_ID 
	, EMP_NAME 
	, SALARY  
FROM EMPLOYEE ; 


# ex2)

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

// [문자열]
// ' ': 기본 데이터에 사용 
// " ": 기본 데이터 이외, 숫자로 시작, 특수문자 포함, 띄어쓰기 있을 경우


# ex3)

SELECT	EMP_ID,
	EMP_NAME,
	'재직' AS 근무여부
FROM 	EMPLOYEE ;
// 더미 칼럼 추가도 가능


# ex4)

SELECT	DISTINCT DEPT_ID
FROM	EMPLOYEE ;
// DISTINCT는 중복사용이 불가능 하다. 단독으로만 사용 가능

SELECT	DISTINCT JOB_ID, DEPT_ID
FROM	EMPLOYEE ;
// 하나의 Composite키로 본다.

 

# ex5)

SELECT	EMP_NAME AS 이름,
	SALARY AS 급여
FROM 	EMPLOYEE
WHERE SALARY > 4000000;
// where는 행에 대한 필터링이다.

 

# ex6)

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

//******************************

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

 

# ex7)

//연결연산자: 컬럼들을 연결시킬 수 있다.
SELECT	EMP_NAME||'의 월급은 '||SALARY||'원 입니다.' AS 월급내용
FROM	EMPLOYEE ;

 

# 비교연산자

<>, !=, ^= 같지 않다.
BETWEEN AND 특정범위
LIKE, NOT LIKE 문자 패턴을 비교
IS NULL, IS NOT NULL NULL여부
IN 비교 값 목록에 포함되는지

 

# ex8)

SELECT	EMP_NAME,
	SALARY
FROM	EMPLOYEE
WHERE	SALARY BETWEEN 3500000 AND 5500000;

 

#LIKE 연산자

  • % : %부분에는 임의 문자열
  • _ : 문자 1개만 있다는 의미
SELECT	EMP_NAME,
	SALARY
FROM	EMPLOYEE
WHERE	EMP_NAME LIKE '김%';

//******************************

SELECT	EMP_NAME,
	PHONE
FROM	EMPLOYEE
WHERE	PHONE LIKE '___9_______';
SELECT	EMP_NAME,
	EMAIL
FROM	EMPLOYEE
WHERE	EMAIL LIKE '___\_%' ESCAPE '\';
//ESCAPE OPTION에 사용하는 문자는 임의 지정 가능

 

# ex9)

SELECT	EMP_NAME,
	SALARY
FROM	EMPLOYEE
WHERE	EMP_NAME NOT LIKE '김%' ;

 

# ex10)

SELECT	EMP_NAME, MGR_ID, DEPT_ID
FROM	EMPLOYEE
WHERE	MGR_ID IS NULL
AND	DEPT_ID IS NULL ;

 

# ex11)

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

 

# ex12)

SELECT	EMP_NAME, DEPT_ID, SALARY
FROM	EMPLOYEE
WHERE	DEPT_ID = '20'
OR	DEPT_ID = '90'
AND	SALARY > 3000000 ;
//오류 발생
//AND가 우선 순위가 더 높기 때문에

SELECT	EMP_NAME, DEPT_ID, SALARY
FROM	EMPLOYEE
WHERE	( DEPT_ID = '20'
OR	DEPT_ID = '90' )
AND	SALARY > 3000000 ;