database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 1944 게시물 읽기
No. 1944
ANSI SQL... What is it and what do you do with it?
작성자
석이
작성일
2005-05-05 14:36ⓒ
2005-05-05 14:40ⓜ
조회수
3,712

참고문서 CA 의 (erwin 만든곳 있잖아요 ^^) 발표 ppt 중...

Help! I got a request for ANSI SQL
What is it and what do you do with it?

Presenter: Walter Guerrero
Computer Associates Email: walter.guerrero@ca.com

 

를 읽고 ............

 

 

 

select * from employees e
, assignments a
where e.emp_seq = a.emp_seq

이게 오라클의 전형적인 inner 조인 문법이다. 라고 소개하고 있네요 인제 알겠네..
ㅋㅋ

select * from employees e join assignment a
on e.emp_seq = a.emp_seq

이건 전형적인 ansi sql inner join 문법이라고 소개하고 있네요

으흐흐 정리되는거...

그럼 using 에 대해서

select * from employees e join assignments a
using (emp_seq);

이케도 쓸수 있숨당
그라면 Natural 은 어케 되냐

select * from employees e natural join assignments a;
이케 됩니다.

그라면 간단한 outer join 중 Oracle 문법을 볼까요?

Select * from employee e , assignments a
where e.emp_seq = a.emp_seq(+)

아 환상적으로 쉽습니다. 걍 + 만 붙이면 됩니다.

그럼 이것의 ansi syntax left outer join 을 알아 볼까요?

select * from employees e left outer join assignment a
on e.emp_seq = a.emp_seq

입니다.

내가 이게 ansi 라고 생각 했던 것도 mysql 에서도 이게 먹더라 이거지 ㅡ.ㅡ
oracle 도 되겠네요

그럼 sql 쓰는 사람들은 case 로 찾는데 오라클은 어케 찾느냐?
decode 로 한다.

우선 우리가 자주 쓰는거
select d.dept_seq, d.description,
CASE active
when 'Y' then 'Active'
when 'N' then 'Not Active'
else 'not applicable' end
form departments d


Oracle 문법으로 옮기면.... 간단하죠?


select d.dept_seq,d.description,
decode(d.active,
'Y','Active',
'N','Not Active',
'Not Applicable')
from departments d


There are slight performance differences between Oracle and ANSI SQL syntaxes
ANSI SQL provides you with improved readability
ANSI SQL provides you with code portability across different database systems


성능은 거의 같고 가독성과 다른데이터 베이스로 옮길때 유용한 ansi sql 을 쓰라는 말이죠 후후


Now that Oracle supports ANSI SQL 92 and parts of ANSI SQL 99, it is important to keep performance targets in mind
Do performance analysis of your ANSI/ISO SQL during your development phase
Use the CBO (Cost Based Optimizer) to your advantage


SELECT *
FROM employees e, assignments a
WHERE e.emp_seq = a.emp_seq
______________________________________

SELECT STATEMENT Cost = 17
HASH JOIN
TABLE ACCESS FULL ASSIGNMENTS
TABLE ACCESS FULL EMPLOYEES

SELECT *
FROM employees e JOIN
assignments a
ON e.emp_seq = a.emp_seq;
_________________________

SELECT STATEMENT Cost = 17
HASH JOIN
TABLE ACCESS FULL ASSIGNMENTS
TABLE ACCESS FULL EMPLOYEES

CBO 입장에서 보면 같네요

이 글에 대한 댓글이 총 3건 있습니다.

ANSI SQL을 사용하자는 의도로 글을 쓰신 거 같은데요..

기본적인 취지에는 동감합니다만..

모든 것을 ANSI에 맞출 필요는 없다고 생각합니다.

ANSI를 주로 주장하는 이유는 앞으로의 호환성 때문인데..

개별 DBMS에서 = 연산자는 지원하지 않고..

INNER JOIN만을 지원할 것이라고는 생각지 않습니다.. (당분간)

왜냐면 일반적인 조인(아우터조인제외)에서 = 은 너무나 명확하니까요.

사실 조인과 필터링(WHERE)을 구분한다는 건 큰 의미는 없다는 거죠..

물론 아우터 조인에선 상황이 많이 달라집니다.

오라클은 (+)를 제공하고 SQL SERVER는 *를 썼는데..

ANSI는 LEFT(RIGHT) OUTER JOIN을 쓰죠..

오라클에서 (+)는 정확하게 ANSI 처럼 작동합니다.

반면 SQL SERVER는 * 는 정확치 않은 경우가 많습니다.

그래서 MS에서도 되도록 사용하지 말라는 거구요..

반면, FULL OUTER JOIN을 써야하는 경우라면..

UNION ~ GROUP BY 방식을 쓰던가 ANSI의 FULL OUTER JOIN을

쓸 수 밖에 없겠죠..

NATURAL JOIN이나 이런 건 사실 ANSI에나 존재하는 거지..

현실적으로 사용하는 경우는 못봤습니다. 인식도 부족하고..

우선은 명확하지 않으니까요.

 

결론은 아우터 조인을 제외하곤 굳이 ANSI문법을 쓸 필요는 없다는

거죠..

 

조인이외의 부분에선

DECODE나 CASE나 큰 차이는 없죠.. 아무래도 장점이 많은 CASE가 낫겠죠.. 비교연산이 쉬우니까..

 

조금이라도 다른 DBMS호환성을 생각한다면 되도록 공통의 문법을

쓰는 정도이지..

예를 들어..

SELECT EMP_NAME = ENAME

FROM EMP

이거보단

SELECT ENAME  EMP_NAME

FROM EMP

위의 것이 더 일반적이겠죠.

 

그 보다 더 중요한 건..

각 DBMS의 특성을 최대한 이용하는 것이죠..

오라클의 CONNECT BY 기법을 호환성이 떨어진다고 쓰지 않는다거나

SQL SERVER의 TOP N QUERY 기법등을 호환성을 이유로 사용하지

않는다는 건 문제가 크단거죠..

또한 각 DBMS의 미묘한 차이도 잘 알아야 겠죠..(잠금기법의 차이 등)

 

주절주절 길어졌는데.. 딱 한가지로 정리하자면..

조인에서(아우터조인제외) 다른 DBMS와 호환성이 좋고..

성능도 같고.. 특별한 문제가 없는데.. 굳이 ANSI의 조인 방식을

써야하는 이유는 없다고 봅니다.. 단지 SQL을 쓰는 취향일뿐이지..

(순전히 개인적인 생각입니다)

m님이 2005-05-06 09:52에 작성한 댓글입니다. Edit

좋은말씀 잘 읽었습니다.

그냥 기본을 알고 각 DBMS 의 특성에 맞는걸

쓰자 이런거죠

^^;

 

석이님이 2005-05-06 10:18에 작성한 댓글입니다. Edit

ansi 스타일 조인 표기가 가독성 측면에서도 이익이 있습니다.

10개 정도의 테이블이 조인되는 쿼리같은 경우 where에 join 조건과 filter 조건이 같이 들어가게 되면 아무래도 where절이 비대해 지고, 그 쿼리를 분석하는 사람은 어디까지가 join을 위한 조건이고 어디부터가 filter를 위한 조건인지를 찾아 봐야 합니다.

또 어떤 테이블과 어떤 테이블이 어떤 컬럼으로 조인되고 있는지를 파악하는것도 ansi 스타일이 좀 더 유리하죠.

별것 아닐수도 있지만 기존 방식의 조인은 한 화면이 넘어가는 쿼리를 분석할때 좀더 신경이 쓰입니다.

 

그리고 m님, (full) outer join의 표현에 대한 이득도 언급을 하셨는데 결론에서는 '별 이득이 없다'  이네요? :-)

저같은 경우 가능하면 ansi 스타일로 통일할려고 노력하고 있답니다. outer join 을 사용할때는 ansi 스타일로 코딩하고 이외의 경우는 기존 스타일로 코딩을  하다보니 일관성이 떨어져서 보기 안좋더라구요.

 

오라클만 사용하는 경우라면 구지 ansi 방식으로 바꿔야할 필요성을  느끼지 못할수 있습니다. 하지만 다른 dbms들도 같이 다루는 상황에서는 가능한 통일시키는것이 작업하기에 수월합니다. 표준이라는게 그래서 만들어지고 발전되는 거구요.

an님이 2005-05-10 10:55에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1947구분자로 짤라 주세요. [3]
초보자
2005-05-09
2753
1946도와주세여~~ 플리쥬~~~ ㅠ.ㅠ [2]
초보여인
2005-05-06
1799
1945DateTime Comlumn을 조건으로 검색할때.... [1]
고영훈
2005-05-06
3078
1944ANSI SQL... What is it and what do you do with it? [3]
석이
2005-05-05
3712
1943EM에서 여러가지 DB를 사용자가 볼수 있게 되어 있는데 자신이 소유한 DB만 볼수 있게 하는 방법? [2]
김정운
2005-05-04
1773
1942머니에 자릿수를 찍으려고 하는데 도데체 어찌해야 하는지...ㅠㅠ [4]
swany
2005-05-04
3247
1941이번주 월요일의 날짜 구하기 [1]
초보자
2005-05-04
3899
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다