'DataBase/Query'에 해당되는 글 3건
1) where name like 'choi%'
2) where name like '%choi'
3) where substring(name,1,3) = 'choi'
(결과)
모두 결과는 같다.
그러나 성능에 차이가 난다.
1번예는 인덱스를 탄다.
2번예는 인덱스를 타지 않는다.
3번예는 인덱스를 타지 않는다.
==> 원칙적으로 lvalue즉 colum에는 절대로 변형을 가하지 말라.
EXISTS 및 NOT EXISTS로 시작하는 하위 쿼리는 교집합과 차집합이라는 두 집합 이론 작업에 사용할 수 있습니다. 두 집합의 교집합은 두 가지 원래 집합에 모두 속하는 요소를 포함하고, 차집합은 두 집합 중 첫 번째 집합에만 속하는 요소를 포함합니다.
city 열에 대해 authors 및 publishers 의 교집합은 저자와 출판사가 모두 있는 도시의 집합입니다.
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 열에 대해 authors 및 publishers 의 차집합은 저자가 거주하지만 출판사는 없는 도시의 집합으로서 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)
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 )