목차
1. 다수의 도메인 서버
1-1 다중 도메인 서버 구현
1-2 Slave 도메인 서버 구현
2. sqlplus 출력 제어
2-1 sqlplus출력제어
2-2 설정방법
3. 연결 연산자와 중복 제거
3-1 연결 연산자를 이용한 검색
3-2 중복 제거
4. 정렬을 이용한 자료 검색
4-1 정렬 검색
4-2 묶음 검색
4-3 무의미한 검색
5. WHERE 절을 이용한 조건 검색
5-1 조건 검색
5-2 날짜 검색
5-3 관계 연산자와 부정 연산자
1. 다수의 도메인 서버
1-1 다중 도메인 서버 구현
하나의 DNS 서버에서 여러 개의 도메인을 서비스할 수 있다.
기존 실습했던 named.conf 파일에 각 도메인 별 zone 항목을 추가한다.
options {
directory "/var/named";
};
zone "." {
type hint;
file "named.ca";
};
zone "ast09.sec." {
type master;
file "ast09.sec.zone";
};
// 추가 //
zone "ast09.itc." {
type master;
file "ast09.itc.zone";
};
다음과 같은 ast09.itc.zone 파일을 /var/named/ 경로에 생성한다. 형식은 기존 ast09.sec.zone 과 동일하다.
$TTL 1D
@ IN SOA ns.ast09.itc. root.ns.ast09.itc. (
1 ; Serial
1D ; Refresh
1H ; Retry
1W ; Expire
3H ) ; Minimum
; Name Server
IN NS ns.ast09.itc.
; Host address
IN A 192.168.10.141
ns IN A 192.168.10.141
www IN A 192.168.10.142
파일 설정을 완료하고 서버를 재부팅하여 다음과 같이 다중 도메인을 구현한 것을 확인할 수 있다.
1-2 Slave 도메인 서버 구현
다수의 도메인 서버를 따로따로 생성할 수는 있으나 그 경우 서버 관리상의 불편함이 있으므로 Master - Slave 관계의 서버를 구현하여 Master 서버의 변경사항을 Slave 서버에 적용할 수 있도록 설정한다.
기존 DNS 서버는 192.168.10.141 로 생성하였다. 이를 Master 서버로 사용하고 192.168.10.142 로 두 번째 DNS 서버를 생성하여 Slave 서버로 사용한다.
마스터로 사용할 서버에 다음과 같이 슬레이브로 이전할 zone을 지정한다.
zone "te.sec." {
type master;
file "te.sec.zone";
also‐notify { 192.168.10.32; }; // IXFR
};
also‐notify { 192.168.10.32; }; 문장은 마스터 서버를 수정하고 재부팅했을 때 { } 안의 주소로 공지를 날리도록 한다. 이 공지를 통해 실시간으로 슬레이브 서버에서 마스터 서버의 te.sec.zone 파일의 내용을 받아가 반영할 수 있다. 이를 IXFR이라 한다.
슬레이브로 사용할 서버에 다음과 같이 공지를 받아 반영할 zone을 지정한다.
zone "te.sec." {
type slave;
file "te.sec.zone";
masters { 192.168.10.31; };
};
masters { 192.168.10.31; }; 문장은 { } 안의 주소에서 날아온 공지를 받아들여 자기 파일에 반영하도록 한다.
이때 슬레이브 서버 측은 named 그룹이므로, 마스터 서버의 /var/named/ 안에서 복사할 파일의 퍼미션을 named 그룹에 대하여 w 권한을 허용하도록 한다. (2025-02-21 수정)
설정이 완료되었다면 다음과 같이 ~.142 서버를 통해 ip 주소를 받아오는 것을 확인할 수 있다.
2. SQL 출력 화면 제어
2-1 sqlplus출력제어
● SET 명령
SET LIN[ESIZE] ## : 한 라인에 출력할 문자의 수를 설정한다.
SET PAGES[IZE] ## : 한 페이지에 출력할 라인의 수를 설정한다.
● 컬럼 형식 지정
COL[UMN] 컬럼 FORMAT [A## | 숫자형식]
‐ 컬럼의 출력 형식을 지정한다.
‐ 문자 컬럼 : A##로 출력 너비를 지정한다.
- 숫자 컬럼 : 0, 9를 이용해서 출력 형식을 지정한다.
COL[UMN] 컬럼 CLEAR
‐ 컬럼의 출력 형식을 삭제한다.
2-2 설정방법
•화면 제어 설정 방법
‐ ORACLE_HOME/sqlplus/admin/glogin.sql
sqlplus가 실행될 때 자동으로 실행되는 스크립트 파일로 이 파일에 원하는 설정 명령어를 입력해 사용할 수 있다.
3. 연결 연산자와 중복 제거
3-1 연결 연산자를 이용한 검색
SELECT [컬럼| '리터럴'] ||, ...FROM 테이블;
‐ 연결연산자( || )는 리터럴이나 컬럼을 하나의 문자열로 검색한다. 뭘 쓰든 반드시 문자열로 인식한다.
‐ 리터럴이란 데이터베이스 안의 데이터를 제외한 모든 데이터이다.
ex)
SELECT ename||sal이름_급여 FROM emp;
SELECT ename||' '||sal이름_급여 FROM emp;
SELECT ename||'의 업무는 '||job||'입니다.' FROM emp;
● 주의할 연결 연산자
SELECT ename||' '||sal+100 이름_급여 FROM emp; // 에러 발생
SELECT ename||' '||sal*1.1 이름_급여 FROM emp;
위의 두 문장은 구조가 비슷해보이지만 첫 번째 문장은 에러가 발생하게 된다. '||' 도 연산자로서 연산자 우선순위에 영향을 받으므로 ||가 +보다 먼저 적용되어 문자열에 +100을 하는 꼴이다.
- 연산자 우선순위를 고려하지 않아도 가독성이 확보되도록 괄호()를 적극 활용한다.
ex)
SELECT eno||ename ||'님의 연봉은 '||(sal*12+nvl(comm,0))||'입니다.' FROM emp;
3-2 중복 제거
SELECT [DISTINCT | ALL] ...FROM 테이블;
중복된 데이터가 있는 것 자체가 무결성 훼손이므로 중복 제거를 신경 쓰도록 한다.
- DISTINCT : 중복된 행은 한 번만 검색한다. (출력되는 행을 기준으로 한다.)
‐ ALL : 중복된 모든 행을 검색한다.(기본 적용)
ex)
SELECT DISTINCT job 업무 FROM emp;
원래 DISTINCT 는 정렬을 통해 중복을 찾아내는 것이지만 오라클은 해시정렬을 사용한다. 출력하는 데이터의 해시코드를 뽑으면 그 코드가 출력하는 데이터의 메모리 주소이다. 같은 데이터라면 메모리 번지수가 같아서 생략되는 원리로 중복을 제거한다.
오라클은 ORDER BY 문을 제외하고는 정렬을 하지 않는다.
4. 정렬을 이용한 자료 검색
4-1 정렬 검색
SELECT * | [DISTINCT] 컬럼|수식 [AS 별명], ... FROM 테이블 ORDER BY 컬럼 [ASC|DESC], 컬럼 [ASC|DESC], ...
‐ ORDER BY : 지정된 컬럼을 대상으로 정렬을 수행한다.
- ASC: 오름차순 정렬을 지정한다. (기본 적용)
- DESC: 내림차순 정렬을 지정한다.
‐ 정렬 대상인 컬럼이 여러 개인 경우 앞에 지정한 컬럼이 동일한 값에 대해서 뒤에 지정된 컬럼으로 정렬된다. 이 경우 순서가 중요하다.
ex)
SELECT eno 사번, ename 이름, sal 급여 FROM emp ORDER BY sal DESC;
SELECT eno 사번, ename 이름, sal 급여 FROM emp ORDER BY 급여 DESC; //오라클에서만 order by 절에 별명 사용 가능
SELECT eno 사번, ename 이름, sal 급여 FROM emp ORDER BY 3 DESC; //3번째 출력 항목 기준으로 정렬
위의 세 문장은 모두 같은 결과를 출력하지만 두 번째 문장의 별명 사용은 ORDER BY에서만 가능하니 주의한다. 세 번째 문장의 숫자 사용은 출력할 컬럼이 방대해지면 거의 사용이 불가능하다.
SELECT eno 사번, ename 이름 FROM emp ORDER BY sal*12+nvl(comm,0) DESC; //sal*12+nvl(comm,0)=연봉
위와 같이 명령어를 작성한다면 검색 결과에서 연봉 기준으로 정렬했다는 의미를 알 수가 없으므로 연봉 컬럼까지 검색하거나 연봉 컬럼 없이 의미를 알 수 있는 적당한 별명을 이용해야 한다.
4-2 묶음 검색
중복 컬럼이 많은 데이터를 정렬하여 묶음 검색으로 이용 가능하다.
중복 컬럼이 많은 데이터는 카디널리티가 낮다 (ex. 성별), 중복이 적은 데이터는 카디널리티가 높다고 표현한다. (ex. 사원번호)
ex)
부서별로 사원의 급여를 검색한다.
SELECT dno 부서번호, eno 사번, ename 이름, sal 급여 FROM emp ORDER BY 부서번호, sal DESC;
4-3 무의미한 검색
SELECT dno 부서번호, eno 사번, ename 이름, sal 급여 FROM emp ORDER BY sal, dno;
데이터를 검색할 때는 다음과 같은 조건이 있다.
① sql 문장이 옳아야 한다. = 자연어로 의미있는 문장으로 번역될 수 있어야 한다.
② 검색된 데이터가 옳아야 한다.
위의 명령어는 문장 자체에 문법 문제는 없으나, 급여를 기준으로 정렬 후 같은 급여일 시 부서번호 기준으로 정렬하라는 문장은 실질적으로 전혀 의미 없는 문장이므로 무의미한 검색이 된다.
5. WHERE 절을 이용한 조건 검색
5-1 조건 검색
SELECT * | 컬럼, ... FROM 테이블 WHERE 검색조건 ORDER BY 컬럼 [ASC|DESC], 컬럼[ASC|DESC], ...
‐ 조건을 통해 테이블의 일부 행만을 검색한다.
‐ 조건은 컬럼을 대상으로 데이터를 제한한다.
‐ 조건에는 비교 연산자가 사용된다.
비교 연산자: =, <, >, <=, >=
부정 연산자: !=, <>, ^= ( '!=' 을 가장 많이 사용한다.)
SELECT eno 사번, ename 이름, sal 급여 FROM emp WHERE sal >= 4000;
SELECT * FROM emp WHERE ename = '홍길동';
SELECT * FROM dept WHERE dno != '10';
- where을 작성할 때 데이터 타입이 숫자일 경우에만 ' ' 표시를 사용하지 않는다.
- 이름을 한 컬럼에 저장 시 특정 성씨나 특정 이름을 가진 사람을 묶어 검색할 수 없으므로 이름은 성과 이름을 따로 저장하도록 한다.
- 세 번째 문장과 같이 문자열이면서 숫자인 척 하는 데이터를 주의한다. ' ' 표시를 붙이지 않을 경우 검색 자체는 정상적으로 되나, dno의 모든 데이터들이 숫자열로 자동 변환되어 시스템 내부적으로 문제가 발생한다.
다음과 같은 조건 검색도 가능하다.
SELECT dno 부서, eno 사번, ename 이름, sal*12+nvl(comm,0) 연봉
FROM emp WHERE sal*12+nvl(comm,0) >= 30000 ORDER BY dno;
연봉이 30000 이상인 사원을 부서별로 검색한다.
WHERE 절에서 sal*12+nvl(comm,0) 를 별명이 연봉으로 바꿔 적는 것은 불가능하다. 이는 ORDER BY 절에서만 가능하다.
5-2 날짜 검색
SELECT * FROM emp WHERE hdate >= '1996/01/01';
입사일이 1996년 이후인 사원의 정보를 검색한다.
이때 날짜의 형식은 출력 포맷에 따라 다르므로 출력 포맷에 맞게 where 문을 작성해야 한다.
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD';
명령어를 통해 출력 포맷을 변경할 수 있다.
- SET NLS_DATE_FORMAT = 날짜를 현재 세션에서 출력하는 포맷
5-3 관계 연산자와 부정 연산자
조건이 여러 개인 경우나 부정 검색인 경우 관계 연산자가 사용된다.
‐ AND, OR, NOT
ex)
- 회계 업무를 담당하는 여성 사원을 검색한다.
- 회계 업무와 분석 업무 담당 사원을 검색한다.
- 회계 업무 이외 업무는 어떤 업무가 있는지 검색한다.
SELECT * FROM emp SQL> SELECT * FROM emp WHERE job='회계' AND sex ='여';
SELECT * FROM emp WHERE job='회계' OR job ='분석';
SELECT DISTINCT job FROM emp WHERE NOT job ='회계'; // NOT job ='회계' 는 job != '회계'와 같다. //
'일일 정리' 카테고리의 다른 글
JOIN - 등가 조인과 비등가 조인, 조인문 작성 요령 (0) | 2025.02.25 |
---|---|
도메인 위임, SQL 다양한 조건 검색, PHP 배열(배열의 구조와 정의) (0) | 2025.02.23 |
Authoritative DNS 서버, 데이터베이스, SELECT 문의 이해 (0) | 2025.02.20 |
DNS, 원격 데스크톱, SQL(ORACLE, TNS) (0) | 2025.02.18 |
네트워크 구성 실습, SSH 서버, 해시 함수, 전자 서명 (0) | 2025.02.17 |