Database Programming

[Database Programming] 2. SQL (SELECT, FROM, ORDER BY, WHERE)

코딩펭귄 2024. 2. 15. 16:43

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]

 

 
SELECT NAME, AGE
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]

- IN : 하나의 컬럼에 여러 개의 값을 검색함. (OR연산의 연속)                 -> 여러개중 한개라도 맞으면 가지고와라

 

- LIKE : 하나의 컬럼에 포함된값을 검색함.                                              -> WILD CARD(%, _) 가 사용됨

 

자바에서의 같다 : ==

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%')
;