본문 바로가기
Database & Bigdata/SQLD

[SQLD] SQL 기본 - WHERE,GROUP,SELECT문 실행순서,형변환,내장형 함수

by jionee 2020. 8. 20.
SMALL

<WHERE문>

1. WHERE문이 사용하는 연산자

- 비교 연산자 생략 (>,<,=)

 

-부정 비교 연산자

연산자 설명
!= 같지 않은 것 조회
^= 같지 않은 것 조회
<> 같지 않은 것 조회
NOT 칼럼명 =  같지 않은 것 조회
NOT 칼럼명 > 크지 않은 것 조회

 

- 논리 연산자

연산자 설명
AND 조건을 모두 만족해야 참
OR 조건 중 하나만 만족해도 참

 

 

- SQL 연산자

연산자 설명
LIKE '비교 문자열' 비교 문자열을 조회(%,-,^,[]등 사용)
BETWEEN A AND B A와 B 사이의 값을 조회
IN (list) OR을 의미하며 list 값 중에 하나만 일치해도 조회됨
IS NULL NULL 값을 조회 

 

 

- 부정 SQL 연산자

연산자 설명
NOT BETWEEN A AND B A와 B 사이의 해당되지 않는 값을 조회
 NOT IN (list)  list와 불일치한 것을 조회
IS NOT NULL NULL 값이 아닌 것을 조회 

 

SELECT *
FROM EMP
WHERW EMPNO=1001 AND SAL >= 1000 ; / enpno가 1001이고, sal이 1000이상인 데이터 조회

 

 

2. LIKE문 사용

- 와일드 카드를 사용해 데이터 조회

와일드카드 설명
% 어떤 문자를 포함한 모든 것을 조회

ex) %조% -> 조를 포함한 모든 문자
조% -> 조로 시작하는 모든 문자
_ 한개인 단일 문자를 의미

ex) 조__ -> 조로 시작하는 3글자 문자
__조 -> 조로 끝나는 3글자 문자

 

SELECT *
FROM EMP
WHERE ENAME LIKE '%est%' // ename의 중간에 est가 포함된 모든 데이터 조회

 

SELECT *
FROM EMP
WHERE ENAME LIKE 'test_'; // ename 칼럼이 test로 시작하고 하나의 글자만 더 있는 데이터 조회

 

 

3. Between문 사용

- 지정된 범위에 있는 값을 조회

- 사이는 AND로 표시

SELECT *
FROM EMP
WHERE SAL BETWEEN 20000 AND 20001; // SAL값이 20000이상 20001이하인 데이터 조회

WHERE 칼럼명 BETWEEN 값1 AND 값2;

 

 

SELECT *
FROM EMP
WHERE SAL NOT BETWEEN 20000 AND 20001; // SAL값이 20000미만 20001초과인 데이터 조회

WHERE NOT 칼럼명 BETWEEN 값1 AND 값2;

 

 

 

4. IN문 사용

- OR의 의미를 가짐 (하나의 조건만 만족해도 조회)

SELECT *
FROM EMP
WHERE JOB IN ('CLERK', 'MANAGER'); // JOB 칼럼이 'CLERK'이나 'MANAGER'인 데이터 조회

WHERE 칼럼명 IN ('값1', '값2')

 

SELECT *
FROM EMP
WHERE (JOB,ENAME) IN (('CLERK', 'test1'),('MANAGER', 'test4')); // 여러 칼럼 조건 지정 가능

 

 

 

4. NULL값 조회

- 모르는 값, 값의 부재 의미

- 숫자 or 날짜 + NULL = NULL

- NULL과 어떤 값을 비교하면 '알수없음' 반환

 

- NULL 관련 함수 (Oracle 함수 이므로 다른 데이터베이스와 호환불가)

NULL 함수 설명
NVL 함수 - NULL값이면 다른 값으로 바꾸는 함수
- NVR(MGR, 0)은 MGR 칼럼이 NULL이면 0으로 바꾼다.
NVL2 함수  - NVL함수와 DECODE 함수를 하나로 만든 것
- NVR2(MGR,1,0)은 MGR 칼럼이 NULL이 아니면 1을 NULL이면 0을 반환
NULLIF 함수 - 두개의 값이 같으면 NULL을, 같지 않으면 첫번째 값을 반환
- NULLIF(exp1, exp2)은 exp1와 exp2가 같으면 NULL을 같지 않으면 exp2를 반환
COALESCE - NULL이 아닌 최초의 인자 값을 반환
- COALESCE(exp1, exp2, exp3)은 exp1이 NULL이 아니면 exp1 값을, 그렇지 않으면 그 뒤의 값의 NULL 여부를 판단해 값을 반환

 

 

<GROUP 연산>

1. GROUP BY문

- 테이블에서 소규모 행을 그룹화해 합계, 평균, 최댓값, 최솟값 등을 계산할 수 있다.

- ORDER BY로 정렬 가능

SELECT DEPTNO, SUM(SAL)
FROM EMP
GROUP BY DEPTNO; // 부서별 월급합 계산

 

 

2. HAVING문

- GROUB BY사용시에는 HAVING구에 조건문 사용 (WHERE절에 조건문을 사용하면 조건 불충족 데이터들은 GROUP BY 대상에서 제외)

SELECT DEPTNO, SUM(SAL)
FROM EMP
GROUP BY DEPTNO
HAVING SUM(SAL)>10000; // 그룹별 월급합이 10000이상인 경우 조회

 

 

3. 집계 함수 종류

집계 함수 설명
COUNT() 행 수를 조회
- COUNT(*)  :  NULL 값을 포함한 모든 행 계산
- COUNT(칼럼명)  :  NULL 값을 제외한 행 계산
SUM() 합계를 계산
AVG() 평균을 계산
MAX()와 MIN() 최댓값과 최솟값을 계산
STDDEV() 표준편차를 계산
VARIAN() 분산을 계산

 

 

<SELECT문 실행순서>

1. FROM (테이블을 읽어옴)

2. WHERE (조건에 해당하는 데이터 찾기)

3. GROUP BY (그룹별로 분류)

4. HAVING (조건에 해당하는 그룹 찾기)

5. SELECT (조회할 칼럼 찾기)

6. ORDER BY(정렬)

 

 

 

<명시적(Explicit) 형변환과 암시적(Implicit) 형변환 >

- 형변환 : 두개의 데이터의 데이터 타입(형)이 일치하도록 변환하는 것

ex) 숫자&문자열 비교, 문자열&날짜형 비교 등 데이터 타입이 불일치할 때 발생

- 명시적(Explicit)과 암시적(Implicit) 형변환이 있다.

- 명시적 형변환형변환 함수를 사용해 데이터 타입을 일치 시킴 ( 개발자가 SQL을 사용할 때 형변환 함수를 사용해야 함 )

암시적 형변환은 개발자가 형변환을 하지 않은 경우 데이터 베이스 관리 시스템자동으로 형변환 하는 것을 의미

형변환 함수 설명
TO_NUMBER(문자열) 문자열을 숫자로 변환
TO_CHAR(숫자 혹은 날짜, [FORMAT]) 숫자 혹은 날짜를 지정된 FORMAT의 문자로 변환
TO_DATE(문자열, FORMAT) 문자열을 지정된 FORMAT 형태의 날짜형으로 변환

 

SELECT *
FROM EMP
WHERE EMPNO = '100'; 
// 숫자형 데이터 타입을 가진 EMPNO 칼럼에 문자형 데이터 타입 '100'을 비교해 암시적 형변환이 일어난다.
// Oracle이 자동으로 EMPNO을 TO_CHAR(EMPNO)로 변환해 데이터 타입을 일치 시킴

* 인덱스 칼럼에 형변환이 일어나면 인덱스를 사용할 수 없다.

 

WHERE EMPNO = TO_NUMBER('100');

* 명시적 형변환을 사용해 EMPNO 칼럼이 변환되지 않도록 한다. (인덱스 사용 가능)

 

 

 

< 내장형 함수 >

1. 내장형 함수

- 모든 데이터베이스는 SQL에서 사용할 수 있는 내장형 함수를 가지고 있

(DBMS 벤더별로 약간의 차이가 있지만 거의 비슷한 방법으로 사용 가능)

- 형변환 함수, 문자열 및 숫자형 향수, 날짜형 함수가 있다.

 

 

2. DUAL 테이블

- Oracle 데이터베이스에 의해 자동으로 생성되는 테이블

- Oracle 데이터베이스 사용자가 임시로 사용할 수 있는 테이블로 내장형 함수를 실행할 때도 사용 가능

DESC DUAL; // oracle은 기본적으로 dual이라는 dummy 테이블이 존재 

 

 

3. 내장형 함수의 종류

 

- 문자열 함수

문자열 함수 설명
ASCII(문자) 문자 혹은 숫자를 ASCII 코드값으로 변환
CHR(ASCII 코드값) ASCII 코드값을 문자로 변환
SUBSTR(문자열,m,n) 문자열을 m번째 위치부터 n개를 자름
CONCAT(문자열1,문자열2) 문자열 1번과 문자열 2번을 결합한다.
- Oracle은 '||', MS-SQL은 '+' 사용 가능
LOWER(문자열) 영문자를 소문자로 변환
UPPER(문자열) 영문자를 대문자로 변환
LENGTH 혹은 LEN(문자열) 공백을 포함해 문자열의 길이를 계산
LTRIM(문자열, 지정문자) 왼쪽에서 지정된 문자를 삭제
RTRIM(문자열, 지정문자) 오른쪽에서 지정된 문자를 삭제
TRIM(문자열, 지정된 문자) 왼쪽 및 오른쪽에서 지정된 문자를 삭제

 

- 날짜형 함수

날짜형 함수 설명
SYSDATE 오늘의 날짜를 날짜 타입으로 알려줌
EXTRACT('YEAR' | 'MONTH' | 'DAY' from dual) 날짜에서 년,월,일을 조회

 

SELECT SYSDATE, EXTRACT(YEAR FROM SYSDATE), TO_CHAR(SYSDATE, 'YYYY-MM-DD')
FROM DUAL;
// 오늘 날짜 표시
// 오늘 날짜에서 년도만 표시
// 오늘 날짜를 YYYY-MM-DD 포맷의 문자열로 형변환

 

- 숫자형 함수

숫자형 함수 설명
ABS(숫자) 절댓값을 돌려줌
SIGN(숫자) 양수,음수,0을 구별
MOD(숫자1, 숫자2) 숫자1을 숫자2로 나눠 나머지를 계산 (%연산과 같음)
CEIL/CEILING(숫자) 숫자보다 크거나 같은 최소의 정수를 돌려줌
FLOOR(숫자) 숫자보다 작거나 같은 최대의 정수를 돌려줌
ROUND(숫자,m) 소수점 m자리에서 반올림 (m의 디폴트값은 0)
TRUNC(숫자,m) 소수점 m자리에서 절식 (m의 디폴트값은 0)

 

댓글