쿼리문을 가끔 쓸때가 있어서 기본적인 내용을 공부해보았다.
프로그램은 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 는 제일 마지막에 진행된다.
'서버 > 데이터베이스' 카테고리의 다른 글
SQL 익히기 - 형변환 / 내장 함수 (4) | 2024.11.13 |
---|---|
SQL 익히기 - 윈도우 함수(Window Function) (0) | 2024.11.13 |
SQL 익히기 - UNION / EXCEPT,MINUS (0) | 2024.11.12 |
SQL 익히기 - JOIN (0) | 2024.11.11 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!