SELECT TABLE_NAME,  COLUMN_NAME, DATA_TYPE,
      CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE, COLUMN_DEFAULT
      FROM INFORMATION_SCHEMA.COLUMNS
   WHERE DATA_TYPE LIKE '%char'  and DATA_TYPE not in ('nvarchar' , 'nchar')
    --group by TABLE_NAME
      ORDER BY TABLE_NAME

아시는 분들은 잘 아시겠지만, 초보 분들을 위해...

LEFT OUTER JOIN 에 대해 그냥 실험하듯이 몇 가지를 해 보았습니다.

그냥 재미로 보시면 될 듯 하네요.

먼저 테이블을 두 개 만들어 보겠습니다.

CREATE TABLE dbo.TB_A

(SEQ1 INT,

DATA1 VARCHAR(1000)

);

CREATE TABLE dbo.TB_B

(SEQ2 INT,

DATA2 VARCHAR(1000)

);

SEQ1, DATA1 SEQ2, DATA2 로 되어 있는 간단한 테이블입니다.

여기에 데이터를 삽입합니다.

INSERT INTO TB_A VALUES (1,'테이블A1'), (2,'테이블A2'), (3,'테이블A3'), (4,'테이블A4'), (5,'테이블A5');

INSERT INTO TB_B VALUES (1,'테이블B1'), (3,'테이블B3'), (5,'테이블B5');

1번 테이블엔 다섯 개의 Row, 2번 테이블엔 세 개의 Row가 있습니다.

1. INNER JOIN해 보면 다음과 같습니다.

1.jpg

SELECT A.*, B.*

FROM TB_A A INNER JOIN TB_B B ON A.SEQ1 = B.SEQ2

당연히 세 개의 결과만 나오죠.

2. 그럼 LEFT OUTER JOIN에서 위와 같은 조건으로 해봅니다.

2.jpg

SELECT A.*, B.*

FROM TB_A A LEFT OUTER JOIN TB_B B ON A.SEQ1 = B.SEQ2

, 첫번째 테이블의 모든 것과 두번째 테이블에서 SEQ2이 매치되는 것만 보여주죠. 당연한 이야기입니다.

3. 그럼 이제 조건을 좀 바꿔보겠습니다.

3.jpg

SELECT A.*, B.*

FROM TB_A A LEFT OUTER JOIN TB_B B ON A.SEQ1 = B.SEQ2

WHERE A.DATA1 LIKE'%4'

테이블 14가 들어간 Row는 하나 뿐이므로WHERE 조건에 일치하는 것을 먼저 가져오고 나니 두 번째 테이블엔 매치되는 게 없습니다.

4. 그렇다면 저것을 JOIN 조건으로 올리게 되면 어떻게 될까요?

4.jpg

SELECT A.*, B.*

FROM TB_A A LEFT OUTER JOIN TB_B B ON A.SEQ1 = B.SEQ2 AND A.DATA1 LIKE '%4'

아까랑 많이 다릅니다. 이는 일단 기본적으로 테이블1에 있는 모든 것을 가져온 뒤 조건에 맞는 것을 찾기 때문입니다.

5. 그럼, 조건에 맞는 것이 있을 때는 어떻게 될까요?

6.jpg

SELECT A.*, B.*

FROM TB_A A LEFT OUTER JOIN TB_B B ON A.SEQ1 = B.SEQ2 AND B.DATA2 LIKE '%3'

이제 좀 달라졌죠? JOIN조건에 맞는 것이 없을 때와 있을 때는 위와 같이 차이가 납니다.

6. 4.번과 다른 조건으로 한 번 더 봅니다.

5.jpg

SELECT A.*, B.*

FROM TB_A A LEFT OUTER JOIN TB_B B ON A.SEQ1 = B.SEQ2 AND B.DATA2 LIKE '%4'

어라? 결과가 4번과 같습니다이는 결국 테이블2에서 매치되는 조건이 없기 때문입니다.

7. 가장 주의해야 할 사항은 지금 보여드리는 쿼리입니다.

7.jpg

SELECT A.*, B.*

FROM TB_A A LEFT OUTER JOIN TB_B B ON A.SEQ1 = B.SEQ2

WHERE B.DATA2 LIKE'%3'

LEFT OUTER JOIN임에도 불구하고 두 번째 테이블의 컬럼 조건을 WHERE절에 쓰면

해당 조건에 맞는 데이터를 먼저 걸러내게 됩니다.

아마실제로 원했던 것은 5.번과 같이 먼저 첫번째 테이블의 모든 결과를 가져온 뒤, 두번째 테이블 조건에 일치하는 것을 찾으려고 했을 것입니다.

계속 쳐다보면 더 헷갈릴 수도 있으니원리를 찾아보시면 좋을 듯 합니다. ^^.


안녕하세요...

오늘은 CTE를 사용해서 복잡한 JOIN 구문을 좀 알기 쉽고 편리하게 처리해 볼까 합니다.

먼저 원문입니다.

SELECT

AA.SalesOrderID, AA.SalesLastYear, AA.Bonus, AA.Comment,

BB.AddressID, BB.CustomerID, BB.AccountNumber,

CC.SalesOrderID, CC.SalesPersonID, CC.ShipDate

FROM

(

SELECT

A.SalesOrderID, A.OrderDate, A.Comment, A.SalesPersonID, A.ShipDate, A.CustomerID,

B.Bonus, B.CommissionPct, B.SalesLastYear, B.SalesQuota

FROM Sales.SalesOrderHeader A, Sales.SalesPerson B

WHERE A.SalesPersonID = B.SalesPersonID

AND A.SalesOrderID >= 70000

) AA

LEFT OUTER JOIN

(SELECT

A.CustomerID, A.AccountNumber, A.CustomerType,

B.AddressID, B.AddressTypeID

FROM Sales.Customer A, Sales.CustomerAddress B

WHERE A.CustomerID = B.CustomerID

AND A.CustomerID >= 1 AND A.CustomerID <= 20

) BB

ON AA.CustomerID = BB.CustomerID

LEFT OUTER JOIN

(

SELECT

A.SalesOrderID, A.OrderDate, A.Comment, A.SalesPersonID, A.ShipDate, A.CustomerID,

B.SalesOrderDetailID, B.ProductID, B.OrderQty

FROM Sales.SalesOrderHeader A, Sales.SalesOrderDetail B

WHERE A.SalesOrderID = B.SalesOrderID

AND A.SalesOrderID >= 70000

) CC

ON AA.CustomerID = CC.CustomerID

;

보시는 바와 같이 굵은 줄 친 부분 글씨를 유심히 보지 않으면 JOIN 구문 찾기가 쉽지 않습니다. 이것이 CTE를 사용하지 않은 Sub Query 원문이고요.

만약 이것이 여러 개라면 더더욱 복잡해 지겠지요?

그러면 CTE를 사용해서 정리해 보겠습니다.

WITH AA

AS

(

SELECT

A.SalesOrderID, A.OrderDate, A.Comment, A.SalesPersonID, A.ShipDate, A.CustomerID,

B.Bonus, B.CommissionPct, B.SalesLastYear, B.SalesQuota

FROM Sales.SalesOrderHeader A, Sales.SalesPerson B

WHERE A.SalesPersonID = B.SalesPersonID

AND A.SalesOrderID >= 70000

),

BB AS

(SELECT

A.CustomerID, A.AccountNumber, A.CustomerType,

B.AddressID, B.AddressTypeID

FROM Sales.Customer A, Sales.CustomerAddress B

WHERE A.CustomerID = B.CustomerID

AND A.CustomerID >= 1 AND A.CustomerID <= 20

),

CC AS

(

SELECT

A.SalesOrderID, A.OrderDate, A.Comment, A.SalesPersonID, A.ShipDate, A.CustomerID,

B.SalesOrderDetailID, B.ProductID, B.OrderQty

FROM Sales.SalesOrderHeader A, Sales.SalesOrderDetail B

WHERE A.SalesOrderID = B.SalesOrderID

AND A.SalesOrderID >= 70000

)

SELECT

AA.SalesOrderID, AA.SalesLastYear, AA.Bonus, AA.Comment,

BB.AddressID, BB.CustomerID, BB.AccountNumber,

CC.SalesOrderID, CC.SalesPersonID, CC.ShipDate

FROM

AA LEFT OUTER JOIN BB ON AA.CustomerID = BB.CustomerID

LEFT OUTER JOIN CC ON AA.CustomerID = CC.CustomerID

;

각각 With로 시작하고,

Alias와 , 를 사용한 것 외에는 별 다를 것이 없지만.

FROM 절 아래로 JOIN 구문을 내림으로써 훨씬 보게 좋게 JOIN 확인이 가능합니다. ^^.

간단한 팁이지만, 부득이하게 Sub Query가 많아질 경우 JOIN 관계를 알아보기 힘들게 되므로,

이럴 때 쓰시면 편리하실 듯 하네요. ^^

이상입니다.


* Oracle START WITH ~ CONNECT BY MSSQL 처리하기.

 

# Oracle

SELECT   LEVEL, CATE_ID, LTRIM (SYS_CONNECT_BY_PATH (CATE_NAME, ' > '), ' > ') || ' > ' AS CATE_NAME

      FROM TBL_CATEGORY

START WITH CATE_ID = 1

CONNECT BY PRIOR CATE_ID = PARENT_CATE_ID

 

 

 

# SQL Server

WITH CTE_TABLE

AS

(

       SELECT 1 AS LEVEL, A.CATE_ID, PARENT_CATE_ID, CATE_NAME, CONVERT(VARCHAR(100), CAST(A.CATE_NAME as VARCHAR(100)) + ' > ') AS CATE_NAME

       FROM dbo.TBL_CATEGORY A

       WHERE A.CATE_ID = 1

 

       UNION ALL

      

       SELECT LEVEL + 1, M.CATE_ID, M.PARENT_CATE_ID, M.CATE_NAME, CONVERT(VARCHAR(100), N.CATE_NAME + ' > ' + CAST(M.CATE_NAME AS VARCHAR(100)) + ' > ' ) AS CATE_NAME

       FROM dbo.TBL_CATEGORY M JOIN CTE_TABLE N ON M.PARENT_CATE_ID = N.CATE_ID

)

SELECT * FROM CTE_TABLE

;


DBA 면접 질문

 

1. RDBMS가 뭔가요?

2. 정규화가 뭔가요?

3. 각 정규형의 차이점은 무엇인가요? (1, 2, 3차 등)

4. 저장 프로시저는 무엇인가요?

5. 트리거는 무엇인가요?

6. 뷰는 무엇인가요?

7. 인덱스는 무엇인가요?

8. 클러스터드 인덱스와 넌클러스터드 인덱스의 차이는 무엇인가요?

9. 테이블에 설정될 수 있는 인덱스 형태들은 어떤 형태들이 있나요?

10. 커서는 무엇인가요?

11. DBCC 명령어는 어떤것들을 사용해 보았나요?

12. 연결된 서버는 무엇인가요?

13. 데이터 정렬(Collation)은 무엇인가요?

14. 데이터 정렬 종류는 어떤 것들이 있나요?

15. 프라이머리 키와 유니크 키의 차이는 무엇인가요?

16. 일대일, 일대다, 다대다 관계의 테이블 설계는 어떻게 하나요?

17. NOLOCK이 무엇인가요?

18. DELETE 명령어와 TRUNCATE 명령어의 차이는 무엇인가요?

19. Sql Server에서 지원하는 조인방식은 어떤 것들이 있나요?

20. HAVING 절과 WHERE 절과의 차이는 무엇인가요?

21. 서브쿼리가 무엇인가요?

22. 서브쿼리의 결과 종류는 어떤 것들이 있나요?

23. 프로파일러는 무엇인가요?

24. 사용자정의함수는 무엇인가요?

25. 사용자정의함수의 결과 종류는 어떤 것들이 있나요?

26. SQL Server TCP/IP 포트는 무엇인가요? 바꿀 수 있나요?

27. SQL Server의 인증 모드는 어떤것이 있나요? 바꿀 수 있나요?

28. SQL Server 로긴 유저와 암호는 어디에 저장되어 있나요?

29. SQL Server의 버전 정보를 확인할 수 있는 명령어는 무엇인가요?

30. SQL server 에이전트는 무엇인가요?

31. 저장프로시저는 재귀호출이 될까요? 몇단계까지 가능할까요?

32. @@ERROR 는 무엇인가요?

33. RAISERROR 는 무엇인가요..?

34. 로그전달은 무엇인가요?

35. 지역 임시 테이블과 전역 임시 테이블의 차이는 무엇인가요?

36. DB이름을 바꿀 수 있는 명령어는 무엇인가요?

37. sp_configure 명령어는 무엇인가요?

38. 복제의 종류는 어떤것들이 있는지 차이점을 설명해주세요.

39. SQL Server 설치시 추가되는 서비스들은 어떤 것들이 있나요?

40. 유저의 권한 변경 키워드 3개는 무엇이 있나요?

41. SET QUOTED_IDENTIFIER의 의미는 무엇인가요?

42. STUFF함수와 REPLACE함수와의 차이는 무엇인가요?

43. master 데이터베이스를 어떻게 재구축하나요?

44. 각 시스템데이터베이스들의 기능들은 무엇인가요?

45. 프라이머리키와 포린키는 무엇인가요?

46. 무결성이 무엇인가요? 제약 조건들에 대해서 설명해주세요.

47. 관계형 테이블의 속성은 무엇인가요?

48. 반정규화가 무엇인가요?

49. 어떻게 @@ERROR @@ROWCOUNT 를 한번에 얻을 수 있나요?

50. Identity 컬럼이 무엇인가요?

51. 스케쥴 잡이 무엇인가요?

52. 어떤 인덱스도 가지고 있는 않은 테이블을 무엇이라고 부르고 무슨 목적으로 사용하나요?

53. BCP는 무엇인가요? 어떤 경우에 사용하나요?

54. JOIN절 대신에 서브쿼리를 대체할 수 있나요?

55. 오라클과 같은 다른 DBMS에 연결할 수 있나요?

56. 테이블이 사용중인 인덱스는 어떻게 알 수 있나요?

57. 다른 인스턴스로 테이블이나 스키마, 뷰 등을 복사하려면 어떻게 해야 하나요?

58. 셀프 조인이 무엇인가요?

59. 크로스 조인이 무엇인가요?

60. 가상 테이블에 트리거를 사용할 수 있나요?

61. 저장프로시저의 장점들을 설명해주세요.

62. 데이터웨어하우징이 무엇인가요?

63. OLTP가 무엇인가요?

64. XML은 어떻게 사용하나요?

65. 실행계획이 무엇인가요? 당신은 언제 사용하는지 어떻게 보는지 설명해주세요.

원문 : http://www.sqler.com/402338#19

+ Recent posts