목차
1. APACHE - 가상 호스트
1-1 APACHE 서버 가상 호스트 설정
2. 단일 행 함수 날짜 함수
2-1 날짜 함수
3. 단일 행 함수 변환 함수
3-1 날짜 및 숫자 형식
3-2 변환 함수
4. 그룹 함수와 GROUP BY
4-1 그룹 함수
4-2 GROUP BY
1. APACHE - 가상 호스트
1-1 APACHE 서버 가상 호스트 설정
실제 하나의 웹서버에서 여러 ip주소를 운용하기에는 이 세상에 한정된 ip주소의 개수로는 부족하다. 그러므로 현재는 같은 ip 주소여도 도메인에 따라 다른 홈페이지가 열리도록 세팅하는 가상 호스팅을 이용한다.
● conf/extra/httpd‐vhosts.conf 파일 설정
NameVirtualHost *:80 ← * 대신 아파치 서버 IP 지정
<VirtualHost *:80>
ServerAdmin [메일 주소]
DocumentRoot" [Web 홈디렉토리]"
ServerName [접속 도메인명]
ServerAlias [별명]
ErrorLog"logs/ [에러 로그 파일명]"
CustomLog"logs/ [접속 로그 파일명]" common
</VirtualHost>
ex)
NameVirtualHost 192.168.10.142:80
<VirtualHost 192.168.10.142:80 >
DocumentRoot /home/httpd/sec
ServerName www.ast09.sec
ServerAlias ast09.sec
</VirtualHost>
<VirtualHost 192.168.10.142:80 >
DocumentRoot /home/httpd/itc
ServerName www.ast09.itc
ServerAlias ast09.itc
</VirtualHost>
설정 항목 중 필수 항목은
NameVirtualHost 부분, DocumentRoot 부분, ServerName 부분이다.
NameVirtualHost, ServerName 부분에는 아파치 서버의 ip 주소를 입력하고, ServerName 부분에는 접속하기 위해 검색할 도메인명을 작성한다.
이후 httpd.conf 파일에서 include 설정을 해야한다. 다음과 같이 Virtual hosts 부분 'Include ~' 부분의 주석을 지워 include 설정을 완료한다.
다음과 같이 같은 ip에서 두 홈페이지로 접속이 가능한 것을 확인할 수 있다.
2. 단일 행 함수 날짜 함수
2-1 날짜 함수
함수명 | 기능 | 함수명 | 기능 | |
ROUND | 형식에 따라 반올림한다. ROUND(날짜, 형식) |
YYYY 년 MM 월 DD 일 HH24 시 HH 시 MI 분 SS 초 |
LAST_DAY | 날짜를 포함한 달의 마지막 날짜를 검색한다. |
ROUND(sysdate, 'DD') → '2021/09/23' |
LAST_DAY('2013/09/24') → 2013/09/30 | |||
TRUNC | 형식에 따라 절삭한다. TRUNC(날짜, 형식) |
ADD_MONTHS | 날짜에 n달을 더한 날짜를 검색한다. ADD_MONTHS(날짜, n) |
|
TRUNC(sysdate, 'YYYY') → '2021/01/01' |
ADD_MONTHS('2011/07/01', 23) → 2013/06/01 |
|||
MONTHS_BETWEEN | 두 날짜 간의 기간을 월 수로 계산한다. 날짜1 > 날짜2 : 양수. MONTHS_BETWEEN(날짜1, 날짜2) |
NEXT_DAY | 날짜 이후 지정된 요일에 해당하는 날짜를 검색한다. - 일요일, SUNDAY, 1 모두 동일하다. NEXT_DAY(날짜, 요일) |
|
MONTHS_BETWEEN('2013/09/01', '2013/01/01') → 8 |
NEXT_DAY('2013/07/14', '일요일') → 2013/07/21 |
- MONTHS_BETWEEN에서 날짜1이 더 작다면 음수가 출력된다.
● 날짜 함수의 이용
ex) 날짜를 다양한 단위에서 반올림하거나 절삭해 본다.
SQL> ALTER SESSION SET SQL> ALTER SESSION SET nls_date_format = 'YYYY/MM/DD:HH24:MI:SS';
SQL> SELECT sysdate,
2 ROUND(sysdate,'YYYY') 년,
3 ROUND(sysdate,'MM') 월,
4 ROUND(sysdate,'DD') 일
5 FROM dual;
SQL> SELECT sysdate,
2 TRUNC(sysdate,'YY') 년,
3 TRUNC(sysdate,'MM') 월,
4 TRUNC(sysdate,'DD') 일
5 FROM dual;
ex)
20번 부서 직원들이 현재까지 근무한 개월 수를 검색한다.
20번 부서원들의 입사한 달의 마지막 날짜와 입사한 달의 근무 일수를 검색한다.
SQL> SELECT eno, ename, TRUNC(MONTHS_BETWEEN(sysdate,hdate)) 근무_개월
2 FROM emp
3 WHERE dno = '20';
SQL> SELECT eno, ename, hdate, LAST_DAY(hdate) 마지막날,
2 LAST_DAY(TRUNC(hdate))‐TRUNC(hdate)+1 "입사 달 근무일수"
3 FROM emp
4 WHERE dno = '20';
3. 단일 행 함수 변환 함수
3-1 날짜 및 숫자 형식
● 날짜 시간 형식
형식 | 의미 | 형식 | 의미 | ||
년 | YYYY | 네 자리 연도: 2021, 1999 | 시 | HH24 | 01 ~ 24, 24시간 표현 |
YY | 두 자리 연도: 99 - 2099 | ||||
HH | 01 ~ 12, 12시간 표현 | ||||
RR | 두 자리 연도: 99 - 1999 | ||||
월 | MM | 숫자: 01, 02 | |||
분 | MI | ##, 분 | |||
MONTH | 문자: MARCH, APRIL, 3월, 4월 | ||||
초 | SS | ##, 초 | |||
MON | 약자: MAR, APR, 3월, 4월 | ||||
SSSSSS | 하루를 초로 환산 (0 ~ 86399) | ||||
일 | DD | 숫자: 01, 02 | |||
DAY | 요일: SUNDAY, 일요일 | ||||
오전/오후 | AM/PM | 오전, 오후 형식으로 의미 없음. | |||
DY | 약자요일: MON, 월 |
- YY는 입력값의 앞부분에 현재 연도를 나타내고 RR은 가까운 연도를 나타낸다. 즉, 현재 2025년이므로 YY에서 99는 2099를 나타내며 RR에서 99는 1999를 나타낸다.
- 이렇듯 YY와 RR은 때에 따라 값이 달라지므로 항상 정확한 값을 나타내는 YYYY를 사용한다.
- HH에 AM혹은 PM을 붙여 형식을 지정하면 하루를 AM혹은 PM을 붙여 12시간으로 표현한다.
● 숫자 형식
형식 | 의미 |
9 | 숫자의 출력 폭을 지정한다. |
0 | 선행 0을 표기한다 |
$ | 화폐 표기 형식이다. (달러) |
L | 화폐 표기 형식이다. (각 국가의 언어 세팅에 따라 다르다.) |
, | 쉼표 위치를 지정한다. (보통은 세 자리마다 지정한다.) |
. | 소수점 위치를 지정한다. |
MI | 음수의 -기호 표시를 오른쪽에 표기한다. |
EEEE | 실수 표현 기법이다. |
- 형식 지정에 따른 10000의 표기는 다음과 같다.
999,999,999 : 10,000
000,000,000 : 000,010,000
3-2 변환 함수
함수명 | 기능 |
TO_CHAR | 날짜나 숫자를 지정된 형식의 문자로 변환한다. - 출력 형식을 지정한다. TO_CHAR(날짜, 형식), TO_CHAR(숫자, 형식) |
TO_DATE | 문자를 지정된 형식의 날짜로 해석한다. TO_DATE(문자, 형식) |
TO_NUMBER | 문자를 숫자로 해석한다. 대부분의 경우 오라클의 자동 형변환에 의해 SQL 구문 작성시에는 사용 빈도가 매우 낮다. |
- TO_CHAR 함수는 데이터를 출력하거나 전달할 때 서식에 맞추어 가공하는 기능을 제공한다.
형식을 변환하고 출력하는 것으로, 오라클이 사람에게 출력해주는 것이다.
- TO_DATE 함수는 사용자가 입력하거나 전달 받은 문자열을 시스템이 정확한 형식에 따라 날짜로 해석하도록 하는 함수로 날짜 데이터에 반드시 사용한다.
출력하는 것이 아니라 해석하는 것으로, 오라클에게 날짜 형식으로 읽으라고 명령하는 것이다.
● TO_CHAR를 이용한 검색
ex) 오늘 날짜를 다양한 형식으로 검색한다.
SQL> SELECT TO_CHAR(sysdate, 'YYYY/MM/DD') 날짜,
2 TO_CHAR(sysdate, 'YYYY/MM/DD:HH24:MI:SS') 날짜,
3 TO_CHAR(sysdate, 'YY/MM/DD:HH:MI:SS AM') 날짜
4 FROM dual;
SQL> SELECT TO_CHAR(sysdate, 'DAY Mon YY') 날짜 FROM DUAL;
SQL> SELECT ename||' 사원의 입사일은'||
2 TO_CHAR(hdate, 'YYYY"년 "MM"월 "DD"일 입니다."') 입사일
3 FROM emp;
ex) 숫자를 다양한 형식으로 검색한다.
SQL> SELECT TO_CHAR(12345.678, '999,999.99999') num FROM dual;
SQL> SELECT TO_CHAR(12345.678, '099,999.999') num FROM dual;
SQL> SELECT TO_CHAR(12345.678, '99,999.9') num FROM dual; // 반올림 수행
SQL> SELECT TO_CHAR(12345.678, '9,999.9') num FROM dual;
SQL> SELECT TO_CHAR(1234, '$999,999') num FROM dual;
SQL> SELECT TO_CHAR(1234, 'L999,999') num FROM dual; // 시스템 내부 언어세팅에 따름
SQL> SELECT TO_CHAR(123456789, '9.999EEEE') num FROM dual;
SQL> SELECT TO_CHAR(‐1234, '999,999MI') num FROM dual;
ex) 10번 부서 사원의 보너스가 급여의 몇 퍼센트인지 검색한다.
SQL> SELECT eno 사번, ename 이름,
2 TO_CHAR(NVL(comm,0)/(sal*12)*100, '90.99')||'%' 급여_비율
3 FROM emp
4 WHERE dno='10';
SQL> SELECT eno 사번, ename 이름,
2 ROUND(NVL(comm,0)/(sal*12)*100,2)||'%' 급여_비율
3 FROM emp
4 WHERE dno='10';
값이 '0.~' 과 같이 출력될 경우, '.~' 과 같이 0이 생략되어 화면에 출력되므로 그대로 '0.~' 형식으로 나오도록 '90.99'로 형식을 지정하였다.
● TO_DATE를 이용한 검색
ex) 1992년 이전에 입사한 사원의 정보를 검색한다
SQL> SELECT eno 사번, ename 이름, hdate 입사일
2 FROM emp
3 WHERE hdate < TO_DATE('19920101','YYYYMMDD');
SQL> SELECT eno 사번, ename 이름, hdate 입사일
2 FROM emp
3 WHERE hdate <= TO_DATE('19911231:235959','YYYYMMDD:HH24MISS');
4. 그룹 함수와 GROUP BY
4-1 그룹 함수
그룹 함수는 여러 행의 컬럼을 기반으로 계산된 값을 제공하는 다중 행 함수를 의미한다.
함수 | 설명 |
MAX(컬럼) | 컬럼 값 중에 최대값을 반환한다. |
MIN(컬럼 | 컬럼 값 중에 최소값을 반환한다. |
AVG(컬럼) | 평균값을 반환한다. NULL은 무시한다. |
COUNT(컬럼 | *) | NULL이 아닌 행의 수를 반환한다. *는 모든 행의 수를 반환한다. |
SUM(컬럼) | 컬럼의 합계를 반환한다. |
STDDEV(컬럼) | 표준 편차를 반환한다. |
VARIANCE(컬럼) | 분산을 반환한다. |
- MAX(), MIN()의 기능은 ANY나 ALL같은 다중 행 서브 쿼리와 동일하지만 가독성이 훨씬 높다.
- 그룹 함수에서 NULL은 무시된다. 이를 이용한 값 조작이 가능하다.
- GROUP BY 절 없이 일반 컬럼과 같이 기술될 수 없다.
● 그룹 함수를 이용한 검색
ex)
사원의 평균 급여를 검색한다.
월간 지급 급여 총액과 연간 지급 급여 총액을 검색한다.
SQL> SELECT AVG(sal) 평균급여, TO_CHAR(AVG(sal),'$999,999') 평균급여
2 FROM emp;
SQL> SELECT SUM(sal), TO_CHAR(SUM(sal),'$999,999') 월간_급여_총액,
2 SUM(sal)*12, TO_CHAR(SUM(sal)*12,'$999,999') 년급여_총액
3 FROM emp;
값이 더럽게 나오는 경우가 많아 to_char 함수와 자주 함께 쓴다.
두 번째 SQL 문에서 sum(sal), sum(sal)*12 와 같이 쓰는 일은 앞으로는 없다. 반드시 변환 함수를 이용하여 포맷을 지정하여 검색한다.
● 그룹 함수와 NULL
ex) 사원에게 지금된 보너스 지급 총액과 보너스 평균을 검색한다.
SQL> SELECT SUM(comm) 총액, TO_CHAR(AVG(comm),'$999,999') 보너스_평균
2 FROM emp;
SQL> SELECT SUM(comm) 총액,
2 COUNT(comm) 수령인원, TO_CHAR(AVG(comm),'999,999') 평균,
3 COUNT(*) 전체인원, TO_CHAR(AVG(NVL(comm,0)),'999,999') 평균
4 FROM emp;
NULL 값을 고려하지 않았을 때와 고려했을 때의 count 값과 avg값이 차이가 나는 것을 확인할 수 있다.
- DB에 저장된 NULL은 무결성에 문제를 유발한다.
- 개발자보다는 설계자나 운영자의 문제일 가능성이 높다.
4-2 GROUP BY
SELECT ...
FROM 테이블...
WHERE 조건...
GROUP BY 컬럼
ORDER BY 정렬_대상... ;
- GROUP BY 절은 컬럼의 동일한 값을 바탕으로 소그룹에 대한 통계 정보를 검색한다.
- 일반컬럼에 나왔으면 GROUP BY 절에 반드시 나와야 한다.
- 결과값이 정렬되길 원한다면 반드시 ORDER BY 절을 추가한다.
● 카디널리티와 정렬
- 카디널리티
: 값의 개수를 의미한다.
: SELECT 문의 각 컬럼은 반드시 카디널리티가 같아야 한다.
: 그룹 함수와 같이 검색되는 모든 컬럼은 반드시 GROUP BY 절에 기술한다.
(GROUP BY 절에 기술되었다고 꼭 그룹 함수와 같이 검색되지는 않는다.)
ex) 각 부서별 급여 평균이 가장 높은 값과 낮은 값을 검색한다.
SQL> SELECT dno 부서번호,
2 MAX(AVG(sal)) 최대평균, MIN(AVG(sal)) 최소평균
3 FROM emp
4 GROUP BY dno;
SQL> SELECT MAX(AVG(sal)) 최대평균, MIN(AVG(sal)) 최소평균
2 FROM emp
3 GROUP BY dno;
- 두 SQL 문 중 위의 문장은 카디널리티가 맞지 않아 GROUP BY 절의 컬럼을 SELECT 할 수 없다.
- 정렬
: GROUP BY 절은 정렬을 수행한다. (오라클에서만 정렬을 하지 않는다.)
: 정렬된 결과를 위해서는 반드시 ORDER BY 절을 이용한다.
● GROUP BY 절을 이용한 검색
ex) 부서별 평균 급여, 평균 연봉을 검색한다.
SQL> SELECT d.dno부서번호, dname부서,TO_CHAR(AVG(sal),'999,999') 평균_급여,
2 TO_CHAR(AVG(sal*12+NVL(comm,0)),'999,999') 평균_연봉
3 FROM dept d, emp e
4 WHERE d.dno= e.dno
5 GROUP BY d.dno, dname
6 ORDER BY d.dno;
일반컬럼에 나왔으면 GROUP BY 절에 반드시 나와야 하므로 GROUP BY 절에 d.dno와 dname 모두 작성한다. 그저 문법적인 규칙이다.
ex) 각 부서별 최소 급여를 받는 사원의 정보를 검색한다.
SQL> SELECT d.dno, dname, eno, ename, sal
2 FROM emp e, dept d
3 WHERE d.dno=e.dno
4 AND (d.dno, sal) IN (SELECT dno, MIN(sal)
5 FROM emp
6 GROUP BY dno)
7 ORDER BY d.dno;
'일일 정리' 카테고리의 다른 글
DML - INSERT, UPDATE, DELETE, Transaction과 Lock (0) | 2025.03.06 |
---|---|
NFS, 그룹 함수와 HAVING (0) | 2025.03.05 |
단일 행 함수 - 숫자 함수와 날짜 연산, PHP - 2차원 배열 (0) | 2025.02.28 |
APACHE - httpd.conf, 다중 행/열 서브 쿼리, 집합 연산자, 단일 행 함수와 문자 함수 (2) | 2025.02.27 |
APACHE, 자기 참조 조인과 외부 조인, 단일 행 서브 쿼리 (0) | 2025.02.26 |