반응형
반응형
반응형

 

ANSI Query(SQL)

  • ANSI(American National Standards Institute, 미국 국립 표준 협회)에서 제시한 SQL에 대한 보편적인 문법

Visual Representation of SQL Joins - CodeProject

https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

 


 

오라클 Join 예제.

 

테이블 : T_MEMBER

T_MEMBER 테이블

 

테이블 : T_DEPARTMENT

T_DEPARTMENT 테이블

 


 

Inner Join
-- (교집합) 각 테이블에서 조인 조건에 일치되는 데이터만 가져온다.

(ANSI) SELECT m.*, d.* FROM T_MEMBER m INNER JOIN T_DEPARTMENT d ON m.DEPT_IDX = d.DEPT_IDX;
(Oralce) SELECT m.*, d.* FROM T_MEMBER m, T_DEPARTMENT d WHERE m.DEPT_IDX = d.DEPT_IDX;

Inner Join

 

 

 

Outer Join
-- 조인 조건에 일치하는 데이터 및 일치하지 않은 데이터를 모두 SELECT 한다.
-- 조인 조건에 일치하는 데이터가 없다면 NULL로 가져온다.
-- 주(main) 테이블이 어떤 테이블인지가 중요하다.

 

  • Left Outer Join
(ANSI) SELECT m.*, d.* FROM T_MEMBER m LEFT OUTER JOIN T_DEPARTMENT d ON m.DEPT_IDX = d.DEPT_IDX ORDER BY m.MEM_ID;
(Oralce) SELECT m.*, d.* FROM T_MEMBER m, T_DEPARTMENT d WHERE m.DEPT_IDX = d.DEPT_IDX(+) ORDER BY m.MEM_ID;

Left Outer Join

 

  • Right Outer Join
(ANSI) SELECT m.*, d.* FROM T_MEMBER m RIGHT OUTER JOIN T_DEPARTMENT d ON m.DEPT_IDX = d.DEPT_IDX ORDER BY m.MEM_ID;
(Oralce) SELECT m.*, d.* FROM T_MEMBER m, T_DEPARTMENT d WHERE m.DEPT_IDX(+) = d.DEPT_IDX ORDER BY m.MEM_ID;

Right Outer Join

 

  • Full Outer Join
(ANSI) SELECT m.*, d.* FROM T_MEMBER m FULL OUTER JOIN T_DEPARTMENT d ON m.DEPT_IDX = d.DEPT_IDX ORDER BY m.MEM_ID;
(Oralce) X

Full Outer Join

 

 

Cross Join
-- 두 테이블 조인 시 가능한 모든 경우의 레코드를 SELECT 한다.
-- 경우의 수 : N * M

(ANSI) SELECT m.*, d.* FROM T_MEMBER m CROSS JOIN T_DEPARTMENT d ORDER BY m.MEM_ID, d.DEPT_IDX;
(Oralce) SELECT m.*, d.* FROM T_MEMBER m, T_DEPARTMENT d ORDER BY m.MEM_ID, d.DEPT_IDX;

Cross Join

 

Self Join
-- 테이블이 자기 자신을 마치 다른 테이블처럼 취급하여 조인한다.

(ANSI) SELECT m.*, d.* FROM T_MEMBER m JOIN T_MEMBER d ON m.MEM_ID = d.MEM_ID ORDER BY m.MEM_ID;
(Oralce) SELECT m.*, d.* FROM T_MEMBER m, T_MEMBER d WHERE m.MEM_ID = d.MEM_ID ORDER BY m.MEM_ID;

Self Join

 

 

 

반응형

'Database > Oracle' 카테고리의 다른 글

NLS 파라미터 확인  (0) 2020.11.17
JDBC 오류?? varchar 에 2000byte 이상 insert 하기.  (0) 2011.11.07
캐릭터셋 확인.  (0) 2011.10.20
오라클 구동 방법  (0) 2011.01.05
[Link] hierarchy query  (0) 2010.11.09
반응형

# 세션 레벨.(현재 세션 정보)
SELECT parameter, value FROM nls_session_parameters;
 - alter session set nls_XXX 로 변경 가능.

# 인스턴스 레벨.
SELECT PARAMETER, value FROM nls_instance_parameters;
 = SELECT name, VALUE FROM V$PARAMETER where name like '%nls%';

# DB 레벨.(설치시 정보 - 변경 불가)
SELECT parameter, value FROM nls_database_parameters;
= SELECT PARAMETER, VALUE FROM V$NLS_PARAMETERS;
= SELECT name, value$ FROM sys.props$ where name like '%NLS%';

set pagesize 30set linesize 300

column PARAMETER format a30
column VALUE format a30

column value$ format a30

반응형

'Database > Oracle' 카테고리의 다른 글

오라클 JOIN / ANSI JOIN  (0) 2022.02.03
JDBC 오류?? varchar 에 2000byte 이상 insert 하기.  (0) 2011.11.07
캐릭터셋 확인.  (0) 2011.10.20
오라클 구동 방법  (0) 2011.01.05
[Link] hierarchy query  (0) 2010.11.09
반응형
select * from nls_database_parameters where parameter like '%CHARACTER%';
OR
select * from v$nls_parameters where parameter like '%CHARACTER%';
NLS_CHARACTERSET 확인.

한글 byte 수 확인.
select lengthb('아') from dual;


KO16KSC5601 : 한글 2byte

한글 완성형 코드와 일치.
2350자의 한글을 25*94 매트릭스에 배열한 문자셋.
4888자의 한자와 히라카나, 카타카나, 그리고 영문 및 각종 기호들을 포함.
유닉스 환경에서는 LANG=ko로 하여 DBCA(Database Configuration Assistant)를 실행할 경우, 자동으로 캐릭터셋을 KO16KSC5601로 지정
아햏햏, 먄하다, 솔믜, 커피숖, 똠방각하 등의 문자는 입력이 제대로 안됨.


KO16MSWIN949 : 한글 2byte

마이크로소프트사의 Windows Codepage 949번, 즉 한글 코드 페이지를 따른 코드셋.
이는 완성형(KO16KSC5601)을 그대로 포함하고 있으며, 추가로 현대 한글 조합으로 표현할 수 있는 모든 가짓수에 해당하는 8822자의 한글을 추가해 포함하고 있다. 그러니까 "Windows-949 캐릭터셋은 KSC5601의 수퍼셋(Superset)"이 되며, 따라서 "KO16MSWIN949 또한 KO16KSC5601의 수퍼셋"이 된다.

"다른 운영 체제에서도 사용할 수 있다!"
운영 체제가 Windows 949 코드 페이지를 지원하지 않는다고 해서, KO16MSWIN949 캐릭터셋을 가진 데이터베이스 인스턴스를 생성할 수 없다는 것은 아니다. 데이터베이스 캐릭터셋과 운영체제의 캐릭터셋은 전혀 별개라고 인식해야 한다. 비록 Windows-949는 특정 업체의 문자셋이기는 하지만, 이를 기반으로 한 KO16MSWIN949 캐릭터셋은 한글 2350자의 한계를 가진 KO16KSC5601의 대안으로 용이하게 이용될 수 있다. 기억하자.
Unix에서든 Linux에서든, KO16MSWIN949 캐릭터셋을 가진 데이터베이스 인스턴스를 생성할 수 있다. 


UTF8/AL32UTF8 : 한글 3byte

UTF8은 유니코드를 구현한 캐릭터셋 중에 가변길이 인코딩 방식을 택하고 있는 캐릭터셋이다.
한 글자를 표현하는데 필요한 바이트의 길이가 최대 3바이트(AL32UTF8의 경우 6바이트)까지 늘어날 수 있다.

유니코드는 현대 한글 11172자를 모두 가나다 순으로 잘 정렬된 상태로 포함하고 있다.
그래도 한글 한 자가 3바이트의 물리적 공간을 차지하므로, 오로지 모든 한글을 지원한다는 이유만으로 사용하는 것은 곤란하다. 하지만, 한글 이외에도 다른 언어들을 함께 데이터베이스에 저장해야 한다면 다른 선택의 여지가 없는 유일한 선택이 된다.


National Characterset

네셔널 캐릭터셋은 유니코드를 지원하지 않는 캐릭터셋을 가진 데이터베이스에서 유니코드를 지원하기 위해 부가적으로 설정할 수 있는 캐릭터셋이다. 즉, 하나의 데이터베이스 인스턴스는 "캐릭터셋"과 "네셔널 캐릭터셋"을 가진다. 처음 시스템 구축 당시와는 달리, 한글 이외의 다른 언어를 급히 저장해야 할 필요성이 있는 경우 네셔널 캐릭터셋을 적절히 활용할 수 있다.

네셔널 캐릭터셋을 가능한 캐릭터셋은 단 두 가지이다. UTF8과 AL16UTF16(기본값).
네셔널 캐릭터셋을 사용하기 위해서는 특정 타입으로 테이블의 컬럼 또는 PL/SQL 변수를 선언해야 한다. CHAR와 VARCHAR2,CLOB에 대응되는 네셔널 캐릭터셋 기반의 타입으로는 NCHAR, NVARCHAR2,NCLOB이 있다.

즉, KO16MSWIN949 데이터베이스에서 다음과 같이 테이블을 생성할 경우,

CREATE TABLE test_table
( varchar_value VARCHAR2(2000),
nvarchar_value NVARCHAR2(2000)
);
"varchar_value" 컬럼에는 KO16MSWIN949에 속하는 글자들만 저장할 수 있는 반면, nvarchar_value 컬럼에는 유니코드에 속한 모든 글자들을 저장할 수 있다.


캐릭터셋 선택의 원칙
한글 지원을 위해서는 반드시 위의 네 가지 캐릭터셋 중에 하나를 선택해야 한다

한국에서만 사용하는 시스템이라면 KO16MSWIN949를 선택한다
한국어 뿐 아니라 중국어, 일본어, 러시아어 등 다양한 언어로 된 데이터를 저장해야 한다면 UTF8, AL32UTF8을 선택한다. 인코딩 변환으로 한국어 기반의 캐릭터셋에 비해 속도의 저하가 있다고 알려져 있다.
대부분이 한글이며, 일부 외국어가 필요하다면, 한국어 기반의 캐릭터셋(KO16MSWIN949)을 사용하되, National Characterset을 이용한 컬럼에 외국어를 저장한다.


NLS_LANG 변수 값 설정
한글을 지원하는 데이터베이스와 통신한다면 반드시 NLS_LANG값을 설정해야 한다.
 NLS_LANG=[언어]_[영역].[캐릭터 셋]

Windows 운영체제에서 한국어 환경을 사용하는 사용자들은 다음과 같이 NLS_LANG 값을 설정할 수 있다.
KOREAN_KOREA.KO16MSWIN949

유닉스 운영체제에서 한국어를 입출력한다면 다음과 같이 NLS_LANG을 설정할 수 있다.
KOREAN_KOREA.KO16KSC5601


참조 Link : http://dba.pe.kr/1524
반응형

'Database > Oracle' 카테고리의 다른 글

NLS 파라미터 확인  (0) 2020.11.17
JDBC 오류?? varchar 에 2000byte 이상 insert 하기.  (0) 2011.11.07
오라클 구동 방법  (0) 2011.01.05
[Link] hierarchy query  (0) 2010.11.09
[오라클] 버전 확인.  (0) 2009.08.31
반응형

#################
# 오라클 구동 방법 #
#################
 - 참고 사이트 : http://calmmass.tistory.com/246
                       http://blog.naver.com/syun?Redirect=Log&logNo=60008399058


(oracle 계정으로 접속)
$ cd $ORACLE_HOME/bin

# 오라클 시작.
$ ./dbstart

# 리스너 시작.
$ ./lsnrctl start

 


================================================================================================
- 오라클 시작의 또 다른 방법
- 2가지 방법
================================================================================================

------------------------------------------------------------------------------------------------
- 방법 1 : 한번에 구동 완료
------------------------------------------------------------------------------------------------
$ sqlplus '/as sysdba'
SQL> startup
  (한번에 구동 완료. instance -> mount -> open)


------------------------------------------------------------------------------------------------
- 방법 2 : 단계별 구동
------------------------------------------------------------------------------------------------
................................................................................................................................................
[ 1 단계 : instance start ]
................................................................................................................................................
# 인스턴스 상태를 확인 해본 결과 아직 데이터베이스를 기동하지 않았습니다.
SQL> select status from v$instance;
select status from v$instance
*
ERROR at line 1:
ORA-01034: ORACLE not available

# instance start
SQL> startup nomount;
ORACLE instance started.

# 파라미터 파일 읽기 시작
# 파라미터 파일 확인
SQL> show parameter processes

# 상태 확인
SQL> SELECT status FROM v$instance;
STATUS
------------------------
STARTED


................................................................................................................................................
[ 2 단계 : mount start ]
................................................................................................................................................
SQL> ALTER DATABASE mount;
Database altered.

SQL> SELECT status FROM v$instance;
STATUS
------------
MOUNTED


................................................................................................................................................
[ 3 단계 : open start ]
................................................................................................................................................
# 데이터베이스 open 시작
SQL> ALTER DATABASE open;
Database altered.

SQL> SELECT status FROM v$instance;
STATUS
------------
OPEN

반응형

'Database > Oracle' 카테고리의 다른 글

JDBC 오류?? varchar 에 2000byte 이상 insert 하기.  (0) 2011.11.07
캐릭터셋 확인.  (0) 2011.10.20
[Link] hierarchy query  (0) 2010.11.09
[오라클] 버전 확인.  (0) 2009.08.31
with as 문.  (0) 2009.07.28
반응형
반응형

'Database > Oracle' 카테고리의 다른 글

캐릭터셋 확인.  (0) 2011.10.20
오라클 구동 방법  (0) 2011.01.05
[오라클] 버전 확인.  (0) 2009.08.31
with as 문.  (0) 2009.07.28
백업 받은 파일로 복구하기.  (1) 2009.07.28
반응형


jdbc에서 resultSet.getDate() 하면 new java.util.Date();
 - 시간, 분, 초 정보는 가지고 있지 않다.

ResultSet 의 메소드를 살펴 보면.

java.sql.ResultSet


public abstract Date getDate(String columnName) throws SQLException
 Get the value of a column in the current row as a java.sql.Date object.
 Returns: the column value; if the value is SQL NULL, the result is null


public abstract Time getTime(String columnName) throws SQLException
 Get the value of a column in the current row as a java.sql.Time object.
 Returns: the column value; if the value is SQL NULL, the result is null

getDate() 나 getTime() 은 java.util.Date 객체를 반환하는 것이 아니라
java.sql 패키지의 java.sql.Date와 java.sql.Time 객체를 반환하고 있습니다.


반면

public abstract Timestamp getTimestamp(String columnName) throws SQLException
 Get the value of a column in the current row as a java.sql.Timestamp object.
 Returns: the column value; if the value is SQL NULL, the result is null


getTimestamp() 는 "java.sql.Date, java.sql.Time, java.sql.Timestamp 는 java.util.Date를 상속받아서
모든 정보를 가지고 있다.



2009.10.21 00:00:00  <-- rs.getDate()
1970.01.01 01:15:38  <-- rs.getTime()
2009.10.21 01:15:38  <-- rs.getTimestamp()

반응형

'프로그래밍 > Java' 카테고리의 다른 글

외부 명령어 실행  (1) 2010.01.29
순서 보장 되는 HashMap  (0) 2009.11.19
[CVS] 이클립스에서 CVS 생성하기.  (0) 2009.08.04
IOStream 관련..  (0) 2009.07.21
[log4j] log4j 에 대한 설명.  (0) 2009.07.10
반응형
테이블 데이터의 사이즈를 계산해주는 SQL
/*--------------------------------------------------------------------------*/
/* TABLE DATA SIZE를 정확히 계산해주는 스크립트. 
/* 사용법 : @TAB_SIZE [TABLE_NAME]
/*--------------------------------------------------------------------------*/
ANALYZE TABLE &1 DELETE STATISTICS;
ANALYZE TABLE &1 COMPUTE STATISTICS;

SELECT GREATEST(4, CEIL(NUM_ROWS/
((ROUND(((1958-(INI_TRANS*23))*
((100-PCT_FREE)/100))/AVG_ROW_LEN)))) * 2048) 
TABLESIZE_KBYTES
FROM USER_TABLES
WHERE TABLE_NAME = UPPER('&1'); 

 

테이블이 사용중인 블록 크기를 계산해주는 SQL
/*--------------------------------------------------------------------------*/
/* TABLE이 사용하는 블럭 크기를 구하는 스크립트...
/* 사용법 : 1) DBA 권한으로 로그인한다.
/* 2) SQL> @TAB_BLOCK [TABLE명]
/* NOTICE : SUM(BLOCKS)는 사용하는 블럭의 갯수이며 사이즈는 
/* DB_BLOCK_SIZE를 곱하여 얻을 수 있다.
/*--------------------------------------------------------------------------*/
SELECT OWNER, TABLESPACE_NAME, SEGMENT_NAME, SUM(BLOCKS)
FROM DBA_EXTENTS
WHERE SEGMENT_NAME = UPPER('&1')
GROUP BY OWNER, TABLESPACE_NAME, SEGMENT_NAME
/

/* 테이블스페이스별 디스크 사용량 보기 */
SELECT SUBSTRB(A.TABLESPACE_NAME, 1,16) as TABLESPACE,
TO_CHAR(A.TOTAL, '999,999,999,990') as "총량(바이트)",
TO_CHAR(B.FREE, '999,999,999,990') as "남은량(바이트)",
TO_CHAR(A.BLOCKS, '9,999,990') as "총블럭",
TO_CHAR(C.BLOCKS, '9,999,990') as "사용블럭",
TO_CHAR(100*NVL(C.BLOCKS,0)/A.BLOCKS, '999.99') as "사용율%"
FROM (SELECT TABLESPACE_NAME,
SUM(BYTES) as TOTAL,
SUM(BLOCKS) as BLOCKS
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME
) A,
(SELECT TABLESPACE_NAME,
SUM(BYTES) as FREE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME
) B,
(SELECT TABLESPACE_NAME,
SUM(BLOCKS) as BLOCKS
FROM DBA_EXTENTS
GROUP BY TABLESPACE_NAME
) C
WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME(+)
AND A.TABLESPACE_NAME = C.TABLESPACE_NAME(+)
ORDER BY A.TABLESPACE_NAME ;

 

 

SELECT SUBSTRB(TABLESPACE_NAME,1,20) AS "테이블스페이스",
SUBSTRB(FILE_NAME, 1, 26) AS "파일명",
TO_CHAR(BLOCKS,'999,999,990') as " 블럭수",
TO_CHAR(BYTES/1024/1024,'99,999,999') as " 크기(MB)"/*,
decode(STATUS, 'AVAILABLE', '사용', '중지') as "상태"*/
FROM SYS.DBA_DATA_FILES
WHERE TABLESPACE_NAME like 'REC_%'
ORDER BY TABLESPACE_NAME, FILE_NAME ;





*. 한 개의 BLOCK에 Available 한 Bytes - 1958
*. 각 initrans 는 23 Bytes
*. PCT_FREE : Table 의 pctfree 값(default 10)
*. ADJ_ROW_SIZE : 각 row 의 평균 SIZE 추정치
*. ROW_COUNT : table 의 row 의 갯수
*. BLOCK_SIZE : 1 block의 크기 (단위: K)

analyze table emp compute statistics;
(또는 건수가 매우 많을 때에는 compute 대신 estimate 사용)
반응형
반응형
MERGE INTO tbl_1 T1 USING (SELECT 'abc' userid FROM dual) T2 ON (T1.userid = T2.userid)
  WHEN MATCHED THEN UPDATE SET T1.username = 'name2'
  WHEN NOT MATCHED THEN INSERT(userid, username) VALUES('newid', 'newname')


위의 내용은 같은 테이블 내에서 비교, update, insert 하는 방법.

반응형

'Database > Oracle' 카테고리의 다른 글

사용자 추가  (2) 2009.04.09
테이블 사이즈 구하기  (0) 2009.02.11
sum over 와 rollup 을 이용한 통계, 누적 쿼리  (0) 2009.02.11
누적 쿼리  (0) 2009.02.11
Date 관련 query  (1) 2009.02.11
반응형
원본 데이터.



        cp_id             datetime
61 2008-12-03
62 2008-11-03
62 2008-12-03
62 2008-12-03
63 2008-12-03
63 2008-12-03



Count 통계 구하는 쿼리.

SELECT NVL(to_char(cp_id), 'Total') cp_id, NVL(to_char(datetime, 'YYYYMM'), 'Sum') datetime, count(*) cnt
FROM tbl_subscriber
GROUP BY ROLLUP(cp_id, to_char(datetime, 'YYYYMM'))

- 결과
       cp_id     datetime           cnt
61     200812 1
61     Sum 1
62     200811 1
62     200812 2
62     Sum 3
63     200812 2
63     Sum 2
        Total     Sum 6




- 누적 통계 구하는 쿼리.

SELECT cp_id, datetime, sum(cnt) OVER (PARTITION BY cp_id order by datetime) as count
FROM (
  SELECT cp_id, to_char(datetime, 'YYYYMM') datetime, count(*) cnt
  FROM tbl_subscriber
  GROUP BY cp_id, to_char(datetime, 'YYYYMM')
  ORDER BY cp_id, datetime ASC
)

- 결과

        cp_id     datetime           cnt
61     200812 1
62     200811 1
62     200812 3
63     200812 2



이와 같다..


^^

반응형

'Database > Oracle' 카테고리의 다른 글

테이블 사이즈 구하기  (0) 2009.02.11
merge into = mysql 의 replace 와 비슷한 기능  (0) 2009.02.11
누적 쿼리  (0) 2009.02.11
Date 관련 query  (1) 2009.02.11
날짜 계산 - 날짜 차이  (0) 2009.02.11
반응형
SELECT datetime, sum(count) OVER (ORDER BY datetime)
FROM (
  SELECT to_char(datetime, 'YYYYMMDD') datetime, count(*) count FROM tbl_xxxx
  GROUP BY to_char(datetime, 'YYYYMMDD')
)



일별 누적 쿼리..
반응형

'Database > Oracle' 카테고리의 다른 글

merge into = mysql 의 replace 와 비슷한 기능  (0) 2009.02.11
sum over 와 rollup 을 이용한 통계, 누적 쿼리  (0) 2009.02.11
Date 관련 query  (1) 2009.02.11
날짜 계산 - 날짜 차이  (0) 2009.02.11
Date 포멧..  (0) 2009.02.11

+ Recent posts