[Database Programming] 2. SQL (SELECT, FROM, ORDER BY, WHERE)
SQL
- Structed Query Language
- 데이터베이스가 관리하는 데이터를 조작하는 언어(구조화된 언어체계 가지고있음)
- 데이터베이스, 테이블, 컬럼등을 생성Create, 수정Alter, 삭제Drop 할 수 있음
- DCL, DDL, DML 중 DML 사용 ( 테이블 내 ROW를 추가(C) insert, 조회(R) select, 수정(U) update, 삭제(D) delete
-- Single line 주석
/*
* Multi line 주석
*/
데이터 조회
- 하나 이상의 테이블에서 여러 Row(데이터) 가져옴
데이터 가져올 때 :
SELECT [COLUMN], [COLUMN], [....]
FROM [TABLE]
FROM STUDENT
데이터정렬
- ORDER BY를 문장의 가장 끝에 써줌
- ORDER_BY + 정렬기준 적어주기 -> 정렬기준을 중심으로 오름차순으로 정렬해줌
내림차순으로 하고싶다면 : ORDER_BY [COLUMN] [ORDERTYPE에 DESC 적어주기!]
hr이라는 이름의 데이터베이스(=스키마)를 활용한 예제
-- Single line comment
/*
* Multi line commnet
*/
-- EMPLOYEES 테이블에서 모든 컬럼들의 모든 데이터를 조회
SELECT *
FROM EMPLOYEES
;
-- EMPLOYEES 테이블에서 EMPLOYEE_ID의 모든 데이터를 조회
SELECT EMPLOYEE_ID
FROM EMPLOYEES
;
--EMPLOYEES 테이블에서 EMPLOYEE_ID, FIRST_NAME 의 모든 데이터를 조회
SELECT EMPLOYEE_ID
, FIRST_NAME
FROM EMPLOYEES
;
--DEPARTMENTS 테이블에서 DEPARTMENT_NAME, LOCATION_ID의 모든 데이터를 조회
SELECT DEPARTMENT_NAME
, LOCATION_ID
FROM DEPARTMENTS
;
-- LOCATIONS테이블에서 모든 컬럼들의 모든 데이터를 조회
SELECT *
FROM LOCATIONS
;
-- EMPLOYEES테이블에서 모든 데이터를 LAST_NAME을 기준으로 오름차순 조회(ORDER_BY)
-- PRIMARY KEY를 기준으로 오름차순 된 상태로 조회됨.
SELECT *
FROM EMPLOYEES
;
-- LAST NAME으로 오름차순 조회
SELECT *
FROM EMPLOYEES
-- 이 때, ORDER BY는 SELECT 조회문의 가장 아래쪽에 위치해야 함
ORDER BY LAST_NAME -- <- 오름차순 정렬
;
SELECT *
FROM EMPLOYEES
ORDER BY LAST_NAME ASC -- <- 오름차순 정렬(명시해준것)
;
/*
* ASC 혹은 생략 : 오름차순
* DESC : 내림차순
*/
-- EMPLOYEES테이블에서 모든 데이터를 LAST_NAME을 기준으로 내림차순 조회(ORDER_BY)
SELECT *
FROM EMPLOYEES
ORDER BY LAST_NAME DESC
;
--정렬할때 주의할점 : ORDER_BY명령은 CPU를 매우많이 사용하는 키워드임 -> 실무에서는 가급적 안쓰려고 함
-- 2차정렬 : EMPLOYEES테이블에서 LAST_NAME으로 내림차순 정렬을하고 FIRST_NAME으로오름차순 정렬을 해서 모든 데이터를 조회
SELECT *
FROM EMPLOYEES
ORDER BY LAST_NAME DESC
, FIRST_NAME ASC
;
-- EMPLOYEES테이블에서 SALARY(연봉)로 오름차순 정렬을하고
-- FIRST_NAME으로 내림차순 한 뒤, HIRE_DATE로 오름차순 정렬하여 모든데이터 조회
SELECT *
FROM EMPLOYEES
-- ORDER BY 는 SELECT 문장의 가장 마지막에 위치해야함!
ORDER BY SALARY ASC
, FIRST_NAME DESC
, HIRE_DATE ASC
데이터 필터링
- WHERE
SELECT [COLUMN], [COLUMN], […]
FROM [TABLE]
WHERE [CONDITIONS]
자바에서의 같다 : ==
SQL에서의 같다 : =
EMPLOYEES테이블에서 EMPLOYEE_ID가 101인 정보를 조회
SELECT *
FROM EMPLOYEES
WHERE EMPLOYEE_ID = 101
;
EMPLOYEES테이블에서 FIRST_NAME이 "Neena"인 정보를 조회
- SQL에서 문자는 작은따옴표로 작성함
SELECT *
FROM EMPLOYEES
WHERE FIRST_NAME = 'Neena'
;
EMPLOYEES테이블에서 COMMISSION_PCT(인센티브)를 0.2보다 크거나 같은 정보를 SALARY로 내림차순 정렬해서 EMPLOYEE_ID, FIRST_NAME, EMAIL, SALARY, COMMISSION_PCT 만 조회
SELECT EMPLOYEE_ID
, FIRST_NAME
, EMAIL
, SALARY
, COMMISSION_PCT
FROM EMPLOYEES
WHERE COMMISSION_PCT >= 0.2
ORDER BY SALARY DESC
;
BETWEEN A AND B 사용하기
-- DEPARTMENTS테이블에서 LOCATION_ID가 1500~2000 사이에 있는 모든 정보를 조회
SELECT *
FROM DEPARTMENTS
WHERE LOCATION_ID BETWEEN 1500 AND 2000 --해당범위 제외일경우 NOT BETWEEN
;
IS NULL, IS NOT NULL 사용하기
--DEPARTMENTS테이블에서 MANAGER_ID(부서장 사원의 번호)가 없는것만 조회
SELECT *
FROM DEPARTMENTS
WHERE MANAGER_ID IS NULL --MANAGER_ID != NULL로 하면 안됨!! -> != 은 같지않다 라는 뜻
;
--MANAGER_ID가 있는것만 조회
SELECT *
FROM DEPARTMENTS
WHERE MANAGER_ID IS NOT NULL
;
* NOT 은 연산자이다*
IN 사용하기
--EMPLOYEES 테이블에서 DEPARTMENT_ID(근무중인 부서번호)가 90 OR 30 OR 60 OR 100인 모든정보를 조회
SELECT *
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN (90, 30, 60, 100)
;
- IN에 넣을수있는 비교값은 1000개까지만 사용가능함
-- EMPLOYEES 테이블에서 JOB_ID(직무ID) 가 IT_PROG이 아니고 AD_VP도 아니고 FI_ACCOUNT도 아닌
-- EMPLOYEE_ID, JOB_ID, SALARY를 조회
SELECT EMPLOYEE_ID
, JOB_ID
, SALARY
FROM EMPLOYEES
WHERE JOB_ID NOT IN ('IT_PROG', 'AD_VP', 'FI_ACCOUNT')
;
LIKE 사용하기
LIKE (자리수 체크) : 문자열 검색만 허용(숫자는 불가능함)
WILD CARD
- 1) "_" : 아무 글자 1개, "__" : 아무 글자 2개
- 2) % : 포함되어있음
ex) "A%" : A로 시작하는것 / "%A" : A로 끝나는것 / "%A%" : A가 포함되어있는것
- LIKE검색도 CPU를 매우 많이 사용하기 때문에 최대한 사용 지양
SELECT *
FROM EMPLOYEES
WHERE FIRST_NAME LIKE '_____' --> FIRST_NAME이 5글자
;
-- EMPLOYEES 테이블에서 FIRST_NAME이 6글자인 모든 정보를 조회
SELECT *
FROM EMPLOYEES
WHERE FIRST_NAME LIKE '______' --> FIRST_NAME이 6글자
;
-- EMPLOYEES 테이블에서 FIRST_NAME이 5글자가 아닌 모든 정보를 조회
SELECT *
FROM EMPLOYEES
WHERE FIRST_NAME NOT LIKE '_____'
;
-- EMPLOYEES 테이블에서 EMAIL이 S로 시작하는 모든 정보를 조회
SELECT *
FROM EMPLOYEES
WHERE EMAIL LIKE 'S%'
;
-- EMPLOYEES 테이블에서 EMAIL이 S로 시작하지 않는 모든 정보를 조회
SELECT *
FROM EMPLOYEES
WHERE EMAIL NOT LIKE 'S%'
;
WHERE절은 여러개의 조건을 지원함
- AND, OR을 사용해 여러개의 조건을 사용할 수 있다. 단, AND, OR이 동시에 사용될때 AND가 우선순위를 가짐
WHERE [CONDITION1]
AND [CONDITION2]
AND [CONDITION3]
OR [CONDITION4]
AND [CONDITION5]
→ CONDITION1 AND CONDITION2
→ CONDITION2 AND CONDIDTION3
→ CONDITION3 OR (CONDITION4 AND CONDITION5)
-> 우선순위 높여주기위해 괄호 사용
WHERE [CONDITION1]
AND [CONDITION2]
AND ([CONDITION3]
OR [CONDITION4])
AND [CONDITION5]
→ CONDITION1 AND CONDITION2
→ CONDITION2 AND (CONDIDTION3 OR CONDITION4) AND CONDITION5
- WHERE을 쓰지않고 AND를 쓰게되면, 에러발생함. 반드시 WHERE 이후에 AND, OR 써줘야함
EMPLOYEES 테이블에서 FIRST_NAME이 6자리이고, JOB_ID가 'AD_PRES'이거나, 'IT_PROG'인 모든정보를 조회
--1) IN을 이용한 방법
SELECT *
FROM EMPLOYEES
WHERE FIRST_NAME LIKE '______'
AND JOB_ID IN ('AD_PRES', 'IT_PROG')
;
--2) AND 와 OR을 이용한 방법
SELECT *
FROM EMPLOYEES
WHERE FIRST_NAME LIKE '______'
AND (JOB_ID = 'AD_PRES'
OR JOB_ID = 'IT_PROG')
;
EMPLOYEES테이블에서 MANAGER_ID 가 NULL이 아니고, COMMISSION_PCT는 NULL이고,
EMPLOYEE_ID는 200미만이면서, EMAIL이 'S' 혹은 'D' 로 시작하는 모든 정보를 조회
SELECT *
FROM EMPLOYEES
WHERE MANAGER_ID IS NOT NULL
AND COMMISSION_PCT IS NULL
AND EMPLOYEE_ID < 200
AND (EMAIL LIKE 'S%'
OR EMAIL LIKE 'D%')
;