서버/데이터베이스

SQL 익히기 - 기본

데브준우 2024. 11. 11. 22:22

쿼리문을 가끔 쓸때가 있어서 기본적인 내용을 공부해보았다.

프로그램은 Oracle Sql Developer를 사용했다.

 

기본적인 TEST라는 테이블을 만들어두었다.

이름과 나이 연봉 부서 컬럼이 있다.

 


SELECT

SELECT는 특정 컬럼이나 특정 행을 조회 할 수 있다.

SELECT * 을 하면 모든 컬럼을 조회한다.

 

- TEST 테이블의 모든 행에서 모든 컬럼을 조회한다.

SELECT *
FROM TEST

 

 

- TEST 테이블의 모든 행에서 NAME,AGE 컬럼만 조회한다.

SELECT NAME,AGE
FROM TEST

 

 

이런식으로 || 붙일 문자열 을 써주면 조회 된 값 + 문자열이 추가된다.

아래 예제는 이름에 XX씨라고 출력된다.

 

 

SELECT NAME || '씨',AGE
FROM TEST

 


WHERE

WHERE 절은 조건을 붙일 수 있다.

 

- 30살 보다 나이가 많은 사람만 출력되게 조건을 걸었다.

SELECT NAME || '씨',AGE
FROM TEST
WHERE AGE > 30

 

 

LIKE 문

LIKE문은 와일드카드를 사용해서 데이터를 조회할 수 있다.

 

- 이름이 '재'로 시작하는 모든 데이터 조회

SELECT *
FROM TEST
WHERE NAME LIKE '재%';

 

- 연봉이 800으로 끝나는 모든 데이터 조회

SELECT *
FROM TEST
WHERE SAL LIKE '%800';

 

- NAME의 중간에 '태'가 들어간 모든 데이터 조회

SELECT *
FROM TEST
WHERE NAME LIKE '%태%';

 

- 와일드 카드를 사용하지 않는다면 그냥  = 와 같다.

SELECT *
FROM TEST
WHERE NAME LIKE '민수'

 

-  이름에서 '재'로 시작하고 뒤에 한글자가 더 있는 데이터를 조회한다.

SELECT *
FROM TEST
WHERE NAME LIKE '재_'

 

BETWEEN

BETWEEN A AND B 로 A 와 B 사이에 있는 데이터를 조회한다.

 

- 연봉이 3000~4000 사이인 데이터를 조회했다.

SELECT *
FROM TEST
WHERE SAL BETWEEN 3000 AND 4000

 

- 위 쿼리에서 NOT만 붙여서 부정을 해주면 연봉이 3000~4000 의 범위에 들어가지 않는 데이터만 조회한다.

SELECT *
FROM TEST
WHERE SAL NOT BETWEEN 3000 AND 4000

 

IN

IN 은 OR의 의미를 가지고 있어서 하나의 조건만 만족하면 조회가 된다.

 

- 연봉이 3천,2800,7000 인 데이터를 조회했다.

SELECT *
FROM TEST
WHERE SAL IN (3000,2800,7000)

 

- IN 도 부정이 가능하다.

SELECT *
FROM TEST
WHERE SAL NOT IN (3000,2800,7000)

 

 

- 이런식으로 여러개의 컬럼도 가능하다.

SELECT *
FROM TEST
WHERE (NAME,SAL)
IN (('병건',3800),('치형',4800));

 

NULL 값 조회

- IS NULL

- IS NOT NULL

두개를 이용해서 조회가 가능하다.

 

SELECT *
FROM TEST
WHERE NAME IS NULL
SELECT *
FROM TEST
WHERE NAME IS NOT NULL

 

NULL 관련 함수

 - NVL(컬럼,대체 값) 

 - 오라클 함수

SELECT NVL(NAME,'원래는 널'),SAL
FROM TEST

널이 대체 되었다.

 

- NVL2(컬럼,널이 아닐때 값, 널일 때 값)

- 오라클 함수

SELECT NVL2(NAME,'널이 아니야','널이야'),SAL
FROM TEST

 

 

-  NULLIF(arg1,arg2) 

- 인수 2개가 같으면 NULL, 아니면 arg1을 반환

- 오라클, MS-SQL,MYSQL

SELECT NAME, NULLIF(SAL,3800) AS 연봉
FROM TEST

연봉이 3800인 병건이의 연봉을 NULL로 바꾸어 버렸다.

 

- COALESCE(arg1,arg2,ar3 ...)

- 인수를 순차적으로 순회하면서 NULL 이 아니면 바로 반환한다.

SELECT COALESCE(NAME,DEPARTMENT,'널')
FROM TEST

 

데이터의 대부분은 이름이 널이 아니라서 이름이 반환 되었고,

모든 컬럼이 NULL인 데이터는 이름과 부서를 다 돌아도 널이기 때문에 '널' 이 리턴되었다.

 


ORDER BY

데이터를 오름차순, 내림차순으로 출력 가능하다.

 

SELECT *
FROM TEST
WHERE AGE > 30
ORDER BY AGE

SELECT *
FROM TEST
WHERE AGE > 30
ORDER BY SAL

 

기본적으로는 오름차순 이며, 내림차순으로도 출력 가능하다.

DESC만 추가해주면 된다.

 

SELECT *
FROM TEST
WHERE AGE > 30
ORDER BY SAL DESC

 

 


DISTINCT

 

DISTINCT 는 중복인 값을 제거 해준다.

테스트를 위해 억지로 재석이를 또 넣었다.

 

SELECT DISTINCT NAME,AGE
FROM TEST

 

 

중복되던 재석이가 사라졌다.

 


ALIAS

ALIAS(별칭)은 테이블명이나 컬럼명에 다른 별칭을 붙일 수 있게 해준다.

 

SELECT NAME,AGE,SAL AS 연봉
FROM TEST

 

SAL 컬럼이 연봉으로 바뀌었다.

 

SELECT NAME,AGE,SAL AS 연봉
FROM TEST T
WHERE T.sal > 3500

이런식으로 테이블에도 별칭을 넣어서 변수처럼 사용 가능하다.

 


GROUP BY

- 테이블에서 행을 그룹화 하여 집계 함수들을 통해 여러 계산을 할 수 있다.

- 그룹화 되지 않은 컬럼을 SELECT 하면 오류가 난다.

 

- 부서 별 연봉 합계

SELECT department,SUM(SAL)
FROM TEST
GROUP BY department;

 

- 부서 별 연봉 평균

SELECT department,AVG(SAL)
FROM TEST
GROUP BY department;

 

 

집계 함수 종류


COUNT - 행 수 조회
SUM - 합계 계산
AVG - 평균 계산
MAX,MIN - 최댓값, 최솟값 계산
STDDEV - 표준 편차 계산
VARIANCE - 분산을 계산

 

COUNT

- COUNT(*)  널 값 포함 O

SELECT COUNT(*)
FROM TEST

 

- COUNT()  널 값 포함 X

SELECT COUNT(NAME)
FROM TEST

 

HAVING

- WHERE은 GROUP BY 를 하기전에 필터링 하기 때문에, GROUP BY에 조건을 넣으려면 HAVING을 사용해야한다.

 

- 평균이 5000이 넘는 것만 필터링

SELECT department,AVG(SAL)
FROM TEST
GROUP BY department
HAVING AVG(SAL) > 5000;

 


SELECT 문의 실행 순서

SELECT department,AVG(AGE) AS AVG_AGE -- 5
FROM TEST -- 1
WHERE AGE > 20 -- 2
GROUP BY department --3
HAVING COUNT(*) >= 1 --4
ORDER BY AVG_AGE; --6

 

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

 

이런식으로 실행된다.

GROUP BY 는 제일 마지막에 진행된다.