DataBase/Query 2007. 12. 27. 14:50
반응형
다음의 예를 보자

1) where name like 'choi%'

2) where name like '%choi'

3) where substring(name,1,3) = 'choi'


(결과)
모두 결과는 같다.
그러나 성능에 차이가 난다.

1번예는 인덱스를 탄다.

2번예는 인덱스를 타지 않는다.

3번예는 인덱스를 타지 않는다.

==> 원칙적으로 lvalue즉 colum에는 절대로 변형을 가하지 말라.
반응형
posted by choiwonwoo
:
DataBase/Query 2007. 12. 27. 14:22
반응형

EXISTS 및 NOT EXISTS로 시작하는 하위 쿼리는 교집합과 차집합이라는 두 집합 이론 작업에 사용할 수 있습니다. 두 집합의 교집합은 두 가지 원래 집합에 모두 속하는 요소를 포함하고, 차집합은 두 집합 중 첫 번째 집합에만 속하는 요소를 포함합니다.

city 열에 대해 authorspublishers 의 교집합은 저자와 출판사가 모두 있는 도시의 집합입니다.

USE pubs
SELECT DISTINCT city
FROM authors
WHERE EXISTS
   (SELECT *
   FROM publishers
   WHERE authors.city = publishers.city)

결과 집합은 다음과 같습니다.

city
--------
Berkeley

(1  적용됨)

단순 조인을 사용하여 작성할 수도 있습니다.

USE pubs
SELECT DISTINCT authors.city
FROM authors INNER JOIN publishers
ON authors.city = publishers.city

city 열에 대해 authorspublishers 의 차집합은 저자가 거주하지만 출판사는 없는 도시의 집합으로서 Berkeley를 제외한 모든 도시가 됩니다.

USE pubs
SELECT DISTINCT city
FROM authors
WHERE NOT EXISTS
   (SELECT *
   FROM publishers
   WHERE authors.city = publishers.city)

위의 쿼리는 다음과 같이 작성할 수도 있습니다.

USE pubs
SELECT DISTINCT city
FROM authors
WHERE city NOT IN
   (SELECT city 
   FROM publishers)
반응형
posted by choiwonwoo
:
DataBase/Query 2007. 12. 27. 13:48
반응형

Sub Query를 작성하다보면 이런 에러 메시지를 만나게 되는 경우가 있다.

(sample )
SELECT E.DateBegin, E.DateEnd
FROM dbo.[Event] AS E
WHERE E.EventID =( SELECT ESF.EventID
     FROM DBO.STAFF AS SF,dbo.EventStaff AS ESF
     WHERE SF.staffid = ESF.staffid )

(error)
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

==> 위의 subquery에서 값을 비교하므로 rvalue자체가 스칼라 값이어야만 한다. 그런데 위의 rvalue는 scalar값이 아니다. 이런 경우는 아래와 같이 하면 된다.

(solution)
SELECT E.DateBegin, E.DateEnd
FROM dbo.[Event] AS E
WHERE E.EventID IN ( SELECT ESF.EventID
     FROM DBO.STAFF AS SF,dbo.EventStaff AS ESF
     WHERE SF.staffid = ESF.staffid )


반응형
posted by choiwonwoo
: