SELECT 1 SELECT Northwind Customers SELECT FROM Customers

  • Slides: 55
Download presentation

SELECT문장 - 1 SELECT문은 데이터베이스 내의 원하는 데이터를 추출 할 수 있는 문장 기본구문

SELECT문장 - 1 SELECT문은 데이터베이스 내의 원하는 데이터를 추출 할 수 있는 문장 기본구문 : Northwind 데이터베이스내의 Customers테이블을 조회하기 SELECT * FROM Customers 조건주기 : Customer. ID가 ALFKI인 데이터만 조회하기 SELECT * FROM Customers WHERE Customer. ID = 'ALFKI' 특정 컬럼만 조회 : Customers에서 Customer. ID, Company. Name만 조회하기 SELECT Customer. ID, Company. Name FROM Customers 테이블 별칭 지정 : Customers테이블에 A라는 별칭을 설정해서 조회하기 --as의 사용 SELECT * FROM Customers as A go --as의 생략 SELECT * FROM Customers A sqlhwan@hotmail. com

SELECT문장 - 2 컬럼 별칭 지정 : Customers에서 Customer. ID를 Cust. ID별칭으로 조회 --as

SELECT문장 - 2 컬럼 별칭 지정 : Customers에서 Customer. ID를 Cust. ID별칭으로 조회 --as 사용하기 SELECT Customer. ID as Cust. ID FROM Customers go --as 생략하기 SELECT Customer. ID Cust. ID FROM Customers go --as 생략하고 = 사용하기 SELECT Cust. ID = Customer. ID FROM Customers []의 사용 : Order Details 테이블 조회 --에러발생 SELECT * FROM Order Details go --빈칸이 포함된 컬럼명에도 동일하게 적용된다. SELECT * FROM [Order Details] sqlhwan@hotmail. com

SELECT문장 - 3 INTO사용 : SELECT INTO를 사용해서 Customers를 Custs로 복사 SELECT * INTO

SELECT문장 - 3 INTO사용 : SELECT INTO를 사용해서 Customers를 Custs로 복사 SELECT * INTO FROM Customers go SELECT * FROM Custs DISTINCT사용 : SELECT에 열거된 컬럼들의 중복되는 행 제거하기 SELECT DISTINCT City, Country FROM Custs FROM절의 생략 : 일반 상수, 함수의 조회 --현재 시간 SELECT GETDATE() go --수식 계산 SELECT (3 * 4) + (6 * 2) sqlhwan@hotmail. com

WHERE절의 활용 - 1 WHERE절은 테이블내의 데이터들을 걸러내는 역할을 한다. WHERE 사용 : Customers에서

WHERE절의 활용 - 1 WHERE절은 테이블내의 데이터들을 걸러내는 역할을 한다. WHERE 사용 : Customers에서 City가 London인 데이터만 조회 SELECT * FROM Customers WHERE City = 'London' 같지 않은 조건 : Customers에서 Customer. ID가 ALFKI가 아닌 데이터 조건 SELECT * FROM Customers WHERE Customer. ID <> 'ALFKI' OR 사용 : Customers에서 City가 London이거나 Madrid인 데이터만 조회 SELECT * FROM Customers WHERE City = 'London' OR City = 'Madrid' AND 사용 : Customers에서 Country가 Mexico이고 Postal. Code가 05033인 데이터 조회 SELECT FROM WHERE AND * Customers Country = 'Mexico' Postal. Code = '05033' sqlhwan@hotmail. com

WHERE절의 활용 - 2 AND와 OR의 혼합 사용 : Customers에서 City가 London이거나 Madrid이고 Contact.

WHERE절의 활용 - 2 AND와 OR의 혼합 사용 : Customers에서 City가 London이거나 Madrid이고 Contact. Title이 Sales Manager인 데이터 조회 --원치 않는 결과 SELECT * FROM Customers WHERE City = 'London' OR City = 'Portland' AND Contact. Title = 'Sales Manager' go --원치 않는 결과 SELECT * FROM Customers WHERE Contact. Title = 'Sales Manager' AND City = 'London' OR City = 'Portland' go --OR절과 AND절이 혼합으로 사용될 때는 괄호를 사용한다. SELECT * FROM Customers WHERE (City = 'London' OR City = 'Portland') AND Contact. Title = 'Sales Manager' --사유 : SQL Server는 AND절을 묶어서 같이 처리하고 나중에 OR절을 처리 -AND와 OR가 있을 때는 WHERE절의 순서가 처리 방법에 영향을 준다. -올바른 처리를 위해 괄호를 꼭 사용하도록 한다. sqlhwan@hotmail. com

WHERE절의 활용 – 3 비교연산자 사용 : Customers에서 Customer. ID가 BLAUS인 데이터 조회 SELECT

WHERE절의 활용 – 3 비교연산자 사용 : Customers에서 Customer. ID가 BLAUS인 데이터 조회 SELECT * FROM Customers WHERE Customer. ID = 'BLAUS' 비교연산자 사용 : Orders에서 Freight가 50이상인 데이터 조회 SELECT * FROM Orders WHERE Freight >= 50 비교연산자 사용 : Orders에서 Freight가 50미만인 데이터 조회 SELECT * FROM Orders WHERE Freight < 50 비교연산자 사용 : Orders에서 Freight가 50이상 80이하인 데이터 조회 SELECT * FROM Orders WHERE Freight >= 50 AND Freight <= 80 BETWEEN 사용 : Orders에서 Freight가 50이상 80이하인 데이터 조회 SELECT * FROM Orders WHERE Freight BETWEEN 50 AND 80 sqlhwan@hotmail. com

WHERE절의 활용 - 6 LIKE 사용 : Customers에서 Customer. ID의 두번째 글자가 A부터 D사이인

WHERE절의 활용 - 6 LIKE 사용 : Customers에서 Customer. ID의 두번째 글자가 A부터 D사이인 데이터 --[]안의 문자 사이에 –는 문자의 범위를 지정한다. SELECT * FROM Customers WHERE Customer. ID LIKE '_[A-D]%' LIKE 사용 : Customers에서 Customer. ID의 두번째 글자가 O가 아닌 데이터 SELECT * FROM Customers WHERE Customer. ID LIKE '_[^O]%' --※ 첫문자에 검색패턴(_)이 오면 해당 컬럼의 인덱스를 사용할 수 없다. LIKE 사용 : Customers에서 Cusomter. ID의 두번째 글자가 N 네번째 글자가 U인 데이터 조회 SELECT * FROM Customers WHERE Customer. ID LIKE '_N_U%' LIKE의 부정 : Customers에서 Customer. ID의 두번째 글자가 O가 아닌 모든 데이터 SELECT * FROM Customers WHERE Customer. ID LIKE '_[O]%' sqlhwan@hotmail. com

WHERE절의 활용 - 7 IN의 사용 : Customers에서 City가 London, Madrid, Bern인 데이터 조회

WHERE절의 활용 - 7 IN의 사용 : Customers에서 City가 London, Madrid, Bern인 데이터 조회 SELECT * FROM Customers WHERE City IN ('London', 'Madrid', 'Bern') NULL의 검색 : Customers에서 Region이 NULL인 데이터 검색 --NULL의 검색은 IS NULL연산을 사용한다. SELECT * FROM Customers WHERE Region IS NULL의 검색 : Customers에서 Region이 NULL이 아닌 데이터 검색 --NULL이 아닌 데이터 검색은 IS NOT NULL연산을 사용한다. SELECT * FROM Customers WHERE Region IS NOT NULL sqlhwan@hotmail. com

WHERE절의 활용 - 8 여러가지 조건들의 혼합 SELECT FROM WHERE AND * Customers as

WHERE절의 활용 - 8 여러가지 조건들의 혼합 SELECT FROM WHERE AND * Customers as A A. City IN ('London', 'Madrid', 'Bern') (A. Customer. ID LIKE '[CE]%' OR A. Country = 'Spain') A. Company. Name >= 'E' sqlhwan@hotmail. com

ORDER BY절의 사용 - 1 ORDER BY는 데이터를 정렬하기 위해 사용된다. ORDER BY는 DESC(내림차순)와

ORDER BY절의 사용 - 1 ORDER BY는 데이터를 정렬하기 위해 사용된다. ORDER BY는 DESC(내림차순)와 ASC(오름차순)의 두 가지 정렬 방법이 있다 ASC, DESC를 표시하지 않으면 기본적으로 ASC로 정렬이 된다. ORDER BY 사용하기 : Customers테이블을 Customer. ID순으로 정렬 SELECT * FROM Customers ORDER BY Customer. ID ORDER BY 사용하기 : Customers에서 Country이름이 A로 시작하는 데이터 에 대해서 Country는 내림차순, City는 오름차순, Customer. ID는 내림차 순 으로 정렬 SELECT Country, City, Customer. ID, * FROM Customers WHERE Country LIKE 'A%' ORDER BY Country DESC, City ASC, Customer. ID DESC sqlhwan@hotmail. com

ORDER BY절의 사용 - 2 ORDER BY 사용하기 : Customers에서 Country와 City를 붙여서 하나의

ORDER BY절의 사용 - 2 ORDER BY 사용하기 : Customers에서 Country와 City를 붙여서 하나의 컬럼으로 조회하고 나머지 정보들을 조회 SELECT A. Country + '' + A. City as 'Country. City', A. * FROM Customers as A ORDER BY A. Country + A. City go --또는 다음과 같이 SELECT되는 곳의 위치를 숫자로 지정할 수 있다. --위치는 SELECT절의 왼쪽부터 1로 시작된다. SELECT A. Country + '' + A. City as 'Country. City', A. * FROM Customers as A ORDER BY 1 sqlhwan@hotmail. com

INNER JOIN의 사용 - 1 INNER JOIN은 두개의 테이블에 대해 조건에 만족하는 결과들끼리 결합시

INNER JOIN의 사용 - 1 INNER JOIN은 두개의 테이블에 대해 조건에 만족하는 결과들끼리 결합시 키는 방법이며 일반적인 JOIN을 뜻한다. 값이 같은 데이터끼리 결합 : Customers와 Orders에서 Customer. ID가 같은 데이터끼라 결합 --오류 : 두 개의 테이블 모두 Customer. ID가 있으므로 테이블명이나 별칭 입력필 수 SELECT Customer. ID, Order. ID FROM Customers JOIN Orders ON Customers. Customer. ID = Orders. Customer. ID go --FROM절 뒤에 조인될 테이블들이 오고 두 테이블 사이에 JOIN문장이 온다. --그 뒤에 ON을 적어주고 JOIN의 조건을 열거한다. --만약에 SELECT *를 하게 된다면 두테이블의 모든 결과가 출력된다. SELECT Customers. Customer. ID, Orders. Order. ID FROM Customers JOIN Orders ON Customers. Customer. ID = Orders. Customer. ID go --Customers쪽의 결과만 보고 싶다면 Customers. *를 하도록 한다. --별칭을 사용한다면 더 쉽게 사용할 수 있다. SELECT A. *, B. Employee. ID FROM Customers as A JOIN Orders as B ON A. Customer. ID = B. Customer. ID sqlhwan@hotmail. com

INNER JOIN의 사용 - 2 Customers와 Orders에서 Customer. ID가 같은 데이터끼리 결합 이해하기 Customers

INNER JOIN의 사용 - 2 Customers와 Orders에서 Customer. ID가 같은 데이터끼리 결합 이해하기 Customers as A Orders as B Customer. ID Company. Name Contact. Name … Order. ID Customer. ID Employee. ID … ALFKI Alfreds Futterki Maria Anders … 10643 ALFKI 6 … BERGS Berglunds snabb Christina Berg … 10692 ALFKI 4 … PARIS Paris spécialit Marie Bertrand … 10308 ANATR 7 … LEHMS Lehmanns Marktst Renate Messner … 10278 BERGS 8 … … 10284 LEHMS 4 … … JOIN Condition : ON A. Customer. ID = B. Customer. ID JOIN Result A. Customer. ID B. Order. ID … ALFKI 10643 … ALFKI 10692 … ANATR 7 … BERGS 8 … LEHMS 4 … … 양쪽 테이블에서 같은 Customer. ID를 가진 데이터들끼리 결합한다. A테이블의 PARIS는 B에 없으므로 조인 후 사라지게 된다. Customer. ID가 ALFKI인 데이터는 A에는 한 건, B에는 두 건이므로 조인 시 A 쪽의 데이터가 두 건이 되어 B와 동 일 sqlhwan@hotmail. com 한 레코드 수를 만들어 결합하게 된

INNER JOIN의 사용 - 4 JOIN의 사용 : Orders테이블과 Employees테이블을 Employee. ID가 동일한 데이터끼리

INNER JOIN의 사용 - 4 JOIN의 사용 : Orders테이블과 Employees테이블을 Employee. ID가 동일한 데이터끼리 조인을 해서 Orders의 Order. ID와 Employees의 First. Name이 나오도록 한다. SELECT A. Order. ID, B. First. Name FROM Orders A JOIN Employees B ON A. Employee. ID = B. Employee. ID JOIN과 WHERE의 동시 사용 : Employees 중에서 First. Name이 M으로 시작하 는 모든 직원들이 접수한 Orders내용을 조회 SELECT A. * FROM Orders A JOIN Employees B ON A. Employee. ID = B. Employee. ID WHERE B. First. Name LIKE 'M%' sqlhwan@hotmail. com

OUTER JOIN의 사용 - 2 RIGHT OUTER JOIN의 수행 : Customers의 모든 데이터에 대해

OUTER JOIN의 사용 - 2 RIGHT OUTER JOIN의 수행 : Customers의 모든 데이터에 대해 Orders 정보 를 보여주도록 RIGHT OUTER JOIN을 수행 --OUTER JOIN 앞에 명시된 RIGHT는 OUTER JOIN연산자를 기준으로 오른쪽의 --테이블이 주체가 된다는 것을 뜻한다. SELECT * FROM Orders A RIGHT OUTER JOIN Customers B ON A. Customer. ID = B. Customer. ID --Customers가 RIGHT OUTER JOIN의 오른쪽에 있으므로 모든 결과가 나오게 된다. FULL OUTER JOIN의 수행 : Customers와 Orders에 대해 FULL OUTER JOIN을 수행 --FULL OUTER JOIN은 FULL OUTER JOIN연산자의 양쪽의 모든 테이블들이 --주체가 된다. SELECT * FROM Customers A FULL OUTER JOIN Orders B ON A. Customer. ID = B. Customer. ID OUTER JOIN과 INNER JOIN이 한 문장에 여러 번 사용해야 할 때도 하나씩 결합해 간다면 원하는 결과를 쉽게 추려 낼 수 있을 것이다. sqlhwan@hotmail. com

OUTER JOIN의 사용 - 3 LEFT, RIGHT, FULL OUTER JOIN의 수행 결과 Students as

OUTER JOIN의 사용 - 3 LEFT, RIGHT, FULL OUTER JOIN의 수행 결과 Students as A Subjects as B SID Name SID Subject 1 류일환 1 영어 2 김대웅 5 수학 3 조은경 3 과학 4 정재훈 3 컴퓨터 4 영어 5 수학 A. SID A. Name B. SID B. Subject 1 류일환 1 영어 2 김대웅 NULL 3 조은경 3 과학 3 조은경 3 컴퓨터 4 정재훈 4 영어 LEFT OUTER JOIN RIGHT OUTER JOIN FULL OUTER JOIN A. SID A. Name B. SID B. Subject 1 류일환 1 영어 NULL 5 수학 3 조은경 3 과학 3 조은경 3 컴퓨터 4 정재훈 4 영어 NULL 5 수학 A. SID A. Name B. SID B. Subject 1 류일환 1 영어 2 김대웅 NULL 5 수학 3 조은경 3 과학 3 조은경 3 컴퓨터 4 정재훈 4 영어 NULL 5 수학 sqlhwan@hotmail. com NULL

GROUP BY와 집계함수의 사용 - 2 GROUP BY와 COUNT() : Customers에서 각 City별 Customer의

GROUP BY와 집계함수의 사용 - 2 GROUP BY와 COUNT() : Customers에서 각 City별 Customer의 수 집계 SELECT City, COUNT(*) FROM Customers GROUP BY City GROUP BY와 MAX() : Orders에서 각 Customer. ID별 최근의 주문일 조회 SELECT Customer. ID, MAX(Order. Date) FROM Orders GROUP BY Customer. ID GROUP BY와 MIN() : Orders에서 각 Customer. ID별 최초의 주문일 조회 SELECT Customer. ID, MIN(Order. Date) FROM Orders GROUP BY Customer. ID GROUP BY와 SUM() : Orders에서 각 Customer. ID별 Freight의 합 SELECT Customer. ID, SUM(Freight) FROM Orders GROUP BY Customer. ID GROUP BY와 AVG() : Orders에서 각 Customer. ID별 Freight의 평균 SELECT Customer. ID, AVG(Freight) FROM Orders GROUP BY Customer. ID sqlhwan@hotmail. com

GROUP BY와 집계함수의 사용 - 3 GROUP BY와 집계함수의 이해하기 Orders as B Cust.

GROUP BY와 집계함수의 사용 - 3 GROUP BY와 집계함수의 이해하기 Orders as B Cust. ID Prod. ID Qty Price Order. Date JO A 0001 1 1500 20030101 LEE A 0001 1 1500 20030102 JUNG A 0022 2 500 20030102 B 0001 1 1000 20030104 LEE B 0001 1 1000 20030104 A 0022 2 500 20030102 JUNG B 0003 1 1000 20030105 KIM A 0001 3 1500 20030110 B 0003 2 1000 20030120 JUNG B 0003 2 1000 20030120 A 0001 3 1500 20030110 GROUP BY Cust. ID 수행 JUNG KIM Cust. ID별 주문수(COUNT(*)) Cust. ID별 최근 주문일(MAX(Order. Date)) Cust. ID별 최초 주문일(MIN(Order. Date)) Cust. ID별 Price의 합(SUM(Price)) Cust. ID별 Price의 평균(AVG(Price)) sqlhwan@hotmail. com

GROUP BY와 집계함수의 사용 - 4 각 고객별 주문 건수 집계하기 : Customers테이블과 Orders테이블을

GROUP BY와 집계함수의 사용 - 4 각 고객별 주문 건수 집계하기 : Customers테이블과 Orders테이블을 사용 SELECT A. Customer. ID, COUNT(*) FROM Customers A JOIN Orders B ON A. Customer. ID = B. Customer. ID GROUP BY A. Customer. ID go --Northwind의 Customers를 변경하지 않았다면 실제 데이터는 총 91건이다. --하지만 위의 결과는 89건이다. 이유는 Customer. ID가 PARIS, FISSA인 --데이터에 대해 한 건의 Order도 없기 때문이다. --다음을 실행해서 두 건의 데이터가 없음을 확인하자. SELECT A. Customer. ID, COUNT(*) FROM Customers A JOIN Orders B ON A. Customer. ID = B. Customer. ID WHERE A. Customer. ID IN ('PARIS', 'FISSA') GROUP BY A. Customer. ID --결과가 한 건도 없다. 이 것은 Orders 테이블에 위 두 ID에 대한 데이터가 --한 건도 없기 때문에 두 건은 조인에 참여하지 못했기 때문이다. sqlhwan@hotmail. com

SUB QUERY의 사용 - 2 SELECT절 서브쿼리 SELECT절에 괄호로 묶인 새로운 쿼리문을 만든다. 서브쿼리에서는

SUB QUERY의 사용 - 2 SELECT절 서브쿼리 SELECT절에 괄호로 묶인 새로운 쿼리문을 만든다. 서브쿼리에서는 단일값을 돌려줘야 한다. SELECT절 서브쿼리의 사용 : Orders의 각 Order의 Freight와 총 Freight 와 Freight중 최고 금액을 출력하는 쿼리 DECLARE @MAXFreight as int, @Tot. Freight as int SELECT FROM Orders @MAXFreight = MAX(Freight), @Tot. Freight = SUM(Freight) SELECT Order. ID, Freight, @MAXFreight, @Tot. Freight FROM Orders go --위의 두 문장으로 된 쿼리를 다음과 같이 한 문장으로 바꿀 수 있다. SELECT Order. ID, Freight, (SELECT MAX(Freight) FROM Orders) as MAXFreight, (SELECT SUM(Freight) FROM Orders) as Tot. Freight WHERE Orders --두 문장을 한 문장으로 줄였지만 실제로 성능에 도움을 주지 못한다. 단일값 : 한 줄의 로우, 한 개의 컬럼, 또는 여러 개의 컬럼을 하나로 합쳐서 한 개의 값으로 만들어진 값을 말한다. sqlhwan@hotmail. com

SUB QUERY의 사용 - 3 SELECT절 서브쿼리가 틀린 경우 : 두 줄 이상의 로우를

SUB QUERY의 사용 - 3 SELECT절 서브쿼리가 틀린 경우 : 두 줄 이상의 로우를 돌려줄 경우 --다음은 오류가 발생된다. SELECT Order. ID, Freight, (SELECT Freight FROM Orders) as Friehgt. List FROM Orders go --Freight에 집계함수를 사용해서 한 개의 값만을 돌려주도록 해야 한다. SELECT Order. ID, Freight, (SELECT Freight FROM Orders) as Friehgt. List FROM Orders SELECT절 서브쿼리가 틀린 경우 : 두 개 이상의 값을 돌려줄 경우 --다음은 오류가 발생된다. SELECT Order. ID, Freight, (SELECT MAX(Freight), MIN(Freight) FROM Orders go --위의 쿼리는 다음과 같은 방식으로 변경함으로써 서브쿼리에서 --두 개의 컬럼 값을 하나의 컬럼 값으로 돌려 줄 수 있다. SELECT Order. ID, Freight, (SELECT CAST(MAX(Freight) as varchar(10)) + '|' + CAST(MIN(Freight) as varchar(10)) FROM Orders) as [MIN|MAX] FROM Orders sqlhwan@hotmail. com

SUB QUERY의 사용 - 5 SELECT절 상관서브쿼리가 틀린 경우 : Customers테이블의 복사본을 만들어 Customer.

SUB QUERY의 사용 - 5 SELECT절 상관서브쿼리가 틀린 경우 : Customers테이블의 복사본을 만들어 Customer. ID를 중복시킨 후 Orders의 주문별 Company. Name을 알아보는 상관 서브쿼리를 만들어 본다. IF OBJECT_ID('Custs') IS NOT NULL DROP TABLE Custs SELECT * INTO Custs FROM Customers --Customer. ID가 ALFKI인 데이터가 두 건이 되도록 INSERT를 수행한다. INSERT Custs SELECT * FROM Custs WHERE Customer. ID = 'ALFKI' go --상관 서브쿼리를 실행한다. 오류가 발생될 것이다. SELECT (SELECT Company. Name FROM Custs as B WHERE B. Customer. ID = A. Customer. ID) as Company. Name, A. * FROM Orders as A go --이 쿼리는 일부 실행결과를 내보내게 되는데 이유는 상관 서브쿼리가 외부 --결과에 영향을 받기 때문이다. 다음과 같은 쿼리는 오류가 없다. SELECT (SELECT Company. Name FROM Custs as B WHERE B. Customer. ID = A. Customer. ID) as Company. Name, A. * FROM Orders as A WHERE A. Customer. ID <> 'ALFKI' sqlhwan@hotmail. com

SUB QUERY의 사용 - 7 상관서브쿼리 이해하기 SELECT (SELECT MAX(Order. Date) FROM Orders as

SUB QUERY의 사용 - 7 상관서브쿼리 이해하기 SELECT (SELECT MAX(Order. Date) FROM Orders as B WHERE B. Cust. ID = A. Cust. ID) as Recent. Date, A. * FROM Custs as A Orders as B Cust. ID Name 2 1 PARK 박재규 8 7 NAM 남동현 JUNG 정재훈 KIM 김대웅 16 3 9 4 5 10 11 12 6 14 15 Cust. ID Prod. ID Price Order. Date PARK A 0001 1500 20030101 NAM A 0001 1500 20030102 JUNG A 0022 500 20030102 NAM B 0001 1000 20030104 JUNG B 0003 1000 20030105 Results KIM A 0001 1500 20030110 Cust. ID Name Recent. Date JUNG B 0003 1000 20030120 PARK 박재규 20030101 NAM 남동현 20030104 … … … Custs를 읽어가면서 각 데이터마다 Orders에 가서 해당 Cust. ID의 최근 주문 일자를 찾아온다 sqlhwan@hotmail. com 13

SUB QUERY의 사용 - 9 파생된 테이블 이해하기 SELECT B. *, A. * FROM

SUB QUERY의 사용 - 9 파생된 테이블 이해하기 SELECT B. *, A. * FROM Custs A JOIN (SELECT A. Cust. ID, COUNT(*) as CNT FROM Ords as A JOIN [Ord. Dets] as B ON A. Ord. ID = B. Ord. ID GROUP BY A. Cust. ID) as B ON A. Cust. ID = B. Cust. ID Results Orders as A B. Cust. ID B. CNT A. Cust. ID A. Name Ord. Dets as B Ord. ID Prod. ID Price 1 A 0001 1500 1 A 0002 1500 PARK 2 PARK 박재규 Cust. ID Order. Date 2 A 0022 500 JUNG 3 JUNG 정재훈 PARK 1 20030101 3 B 0001 1000 KIM 2 KIM 김대웅 JUNG 2 20030102 3 B 0003 1000 Custs A JOIN (. . ) as B ON A. Ord. ID = B. Ord. ID JUNG 3 20030105 4 A 0001 1500 KIM 4 20030110 4 B 0003 1000 FROM Custs as A Sub. Results as B Cust. ID Name Cust. ID CNT PARK 박재규 PARK 2 JUNG 정재훈 JUNG 3 KIM 김대웅 KIM 2 (SELECT FROM sqlhwan@hotmail. com A. Cust. ID, COUNT(*) as CNT Ords as A JOIN [Ord. Dets] as B ON A. Ord. ID = B. Ord. ID GROUP BY A. Cust. ID) as B

SUB QUERY의 사용 - 11 WHERE절 서브쿼리 이해하기 SELECT * FROM Orders as A

SUB QUERY의 사용 - 11 WHERE절 서브쿼리 이해하기 SELECT * FROM Orders as A WHERE Ord. ID IN (SELECT FROM WHERE Ord. ID Ord. Dets as B Prod. ID LIKE 'B%') Orders as A Ord. Dets as B Ord. ID Prod. ID Price Cust. ID Order. Date 1 A 0001 1500 PARK 1 20030101 Results 1 A 0002 1500 JUNG 2 20030102 Cust. ID Order. Date 2 A 0022 500 JUNG 3 20030105 JUNG 2 20030102 3 B 0001 1000 KIM 4 20030110 3 B 0003 1000 4 A 0001 1500 4 B 0003 1000 sqlhwan@hotmail. com

SUB QUERY의 사용 - 12 WHERE절 상관서브쿼리 WHERE절에 사용되는 상관서브쿼리이다. 여러 로우를 돌려 줄

SUB QUERY의 사용 - 12 WHERE절 상관서브쿼리 WHERE절에 사용되는 상관서브쿼리이다. 여러 로우를 돌려 줄 수 있다. (WHERE절에 EXISTS, IN연산만 가능) 여러 컬럼을 돌려 줄 수 있다. (WHERE절에 EXISTS만 가능) • EXISTS연산은 데이터의 존재 여부를 따지는 연산이다. • EXISTS의 사용 : Orders에 주문이 존재하는 Customers의 조회 SELECT * FROM Customers as A WHERE EXISTS(SELECT * FROM Orders as B WHERE B. Customer. ID = A. Customer. ID) --EXISTS의 부정을 사용해서 존재하지 않는 데이터만 찾아 낸다. SELECT * FROM Customers as A WHERE NOT EXISTS(SELECT * FROM Orders as B WHERE B. Customer. ID = A. Customer. ID) sqlhwan@hotmail. com

SUB QUERY의 사용 - 13 EXISTS 이해하기 SELECT * FROM Custs as A WHERE

SUB QUERY의 사용 - 13 EXISTS 이해하기 SELECT * FROM Custs as A WHERE EXISTS(SELECT FROM WHERE Custs as A * Orders as B B. Cust. ID = A. Cust. ID) Orders as A Cust. ID Name Cust. ID Order. Date PARK 박재규 PARK 1 20030101 JUNG 정재훈 JUNG 2 20030102 LEE 이보현 JUNG 3 20030105 KIM 김대웅 KIM 4 20030110 Results PARK 5 20030112 Cust. ID Name JUNG 6 20030112 PARK 박재규 JUNG 정재훈 KIM 김대웅 EXISTS는 존재여부만 확인을 하기 때문에 서브쿼리에 있는 데이터중에 조건에 맞는 데이터만 찾으면 나머지 데이터를 검색하지 않는다. sqlhwan@hotmail. com

SUB QUERY의 사용 - 14 NOT EXISTS 이해하기 SELECT * FROM Custs as A

SUB QUERY의 사용 - 14 NOT EXISTS 이해하기 SELECT * FROM Custs as A WHERE EXISTS(SELECT FROM WHERE Custs as A * Orders as B B. Cust. ID = A. Cust. ID) Orders as A Cust. ID Name Cust. ID Order. Date PARK 박재규 PARK 1 20030101 JUNG 정재훈 JUNG 2 20030102 LEE 이보현 JUNG 3 20030105 KIM 김대웅 KIM 4 20030110 Results PARK 5 20030112 Cust. ID Name JUNG 6 20030112 LEE 이보현 sqlhwan@hotmail. com

TOP의 활용 - 2 TOP 대신 SET ROWCOUNT의 사용 : Customers의 데이터중 10건만 조회

TOP의 활용 - 2 TOP 대신 SET ROWCOUNT의 사용 : Customers의 데이터중 10건만 조회 --SET ROWCOUNT를 사용하면 다음과 같다. SET ROWCOUNT 10 SELECT * FROM Customers SET ROWCOUNT 0 --ROWCOUNT를 초기화 시킨다. • TOP의 사용 : Customers의 정보중에 50%만 조회하기 SELECT TOP 50 * FROM Customers TOP과 ORDER BY의 사용 : Orders의 고객별 Order Details의 Unit. Price합계 를 구해서 합계중 최상위 10명만 조회 SELECT TOP 10 A. Customer. ID, SUM(B. Unit. Price) FROM Orders as A JOIN [Order Details] as B ON A. Order. ID = B. Order. ID GROUP BY A. Customer. ID ORDER BY SUM(B. Unit. Price) DESC --해당 고객의 ID만 얻었을 뿐, 해당 고객의 정보를 얻기 위해서는 Customers테이블 --과 조인을 해야만 한다. sqlhwan@hotmail. com

TOP의 활용 - 3 TOP과 서브쿼리의 사용 : Unit. Price의 합계가 최상위인 고객 10명의

TOP의 활용 - 3 TOP과 서브쿼리의 사용 : Unit. Price의 합계가 최상위인 고객 10명의 모든 고객정보를 보고자 한다. --GROUP BY와 SELECT에 보고자 하는 컬럼을 모두 기술해야만 한다. SELECT TOP 10 A. Customer. ID, SUM(C. Unit. Price), A. Company. Name, A. Address FROM Customers as A JOIN Orders as B ON A. Customer. ID = B. Customer. ID JOIN [Order Details] as C ON B. Order. ID = C. Order. ID GROUP BY A. Customer. ID, A. Company. Name, A. Address ORDER BY SUM(C. Unit. Price) DESC go --GROUP BY에 컬럼 기술을 피하기 위해 MAX, MIN등의 집계함수를 사용 할 수 있다. SELECT TOP 10 A. Customer. ID, SUM(C. Unit. Price), MAX(A. Company. Name) as Company. Name, MAX(A. Address) as Address FROM Customers as A JOIN Orders as B ON A. Customer. ID = B. Customer. ID JOIN [Order Details] as C ON B. Order. ID = C. Order. ID GROUP BY A. Customer. ID ORDER BY SUM(C. Unit. Price) DESC go --위 두 쿼리의 단점은 해당 고객의 모든 정보를 보고 싶을 때 모든 컬럼을 기술해야 --한다는 것이다. --개선 방법은 서브쿼리를 사용하는 것이다. sqlhwan@hotmail. com

TOP의 활용 - 4 TOP과 서브쿼리의 사용 : Unit. Price의 합계가 최상위인 고객 10명의

TOP의 활용 - 4 TOP과 서브쿼리의 사용 : Unit. Price의 합계가 최상위인 고객 10명의 모든 고객정보를 보고자 한다. --다음과 같은 IN을 사용한 WHERE절의 서브쿼리를 사용해본다. SELECT * FROM Customers WHERE Customer. ID IN (SELECT TOP 10 A. Customer. ID FROM Orders as A JOIN [Order Details] as B ON A. Order. ID = B. Order. ID GROUP BY A. Customer. ID ORDER BY SUM(B. Unit. Price) DESC) go --위 쿼리의 또 다른 문제는 서브쿼리에 있는 SUM(B. Unit. Price)를 보여 줄 수 없다는 --것이다. 다음과 같이 WHERE절의 서브쿼리를 FROM절의 파생된 테이블로 옮겨서 해결 --가능하다. SELECT B. *, A. * FROM Customers as A JOIN (SELECT TOP 10 A. Customer. ID, SUM(B. Unit. Price) as Tot. Unit FROM Orders as A JOIN [Order Details] as B ON A. Order. ID = B. Order. ID GROUP BY A. Customer. ID ORDER BY SUM(B. Unit. Price) DESC) as B ON A. Customer. ID = B. Customer. ID sqlhwan@hotmail. com

CASE의 활용 – 2 CASE문은 쿼리내에서 IF구실을 하는 문법이다. CASE문의 사용 : Orders에서 VINET이란

CASE의 활용 – 2 CASE문은 쿼리내에서 IF구실을 하는 문법이다. CASE문의 사용 : Orders에서 VINET이란 Customer. ID는 Freight에 대해 10% 가산을 하고자 한다. SELECT A. Customer. ID, CASE A. Customer. ID WHEN 'VINET' THEN A. Freight + (A. Freight * 0. 1) ELSE A. Freight END as Freight FROM Orders as A CASE문의 순서 : Orders에서 VINET에 대해 첫 번째 WHEN에서 Freight에 대해 10%가산을 받게 하고, 두 번째 WHEN에서 20%가산을 받게 할 경우, 몇 %의 가산을 받을 것인가? SELECT A. Customer. ID, CASE A. Customer. ID WHEN 'VINET' THEN A. Freight + (A. Freight * 0. 1) WHEN 'VINET' THEN A. Freight + (A. Freight * 0. 2) ELSE A. Freight END as Freight FROM Orders as A --SQL은 CASE절을 위에서부터 검색해서 제일 처음 만족하는 것을 발견하면 해당 --컬럼에 대해 더 이상 CASE절을 탐색하지 않는다. sqlhwan@hotmail. com

CASE의 활용 – 3 CASE WHEN, THEN 사이에 여러 조건 사용하기 : Orders에서 해당

CASE의 활용 – 3 CASE WHEN, THEN 사이에 여러 조건 사용하기 : Orders에서 해당 주문의 총 Unit. Price이가 100이상이고, 아직 선적되지 않은(Shipped. Date가 NULL) 데이터들에 대해 처리요망으로 표시해서 조회 SELECT CASE WHEN A. Shipped. Date IS NULL AND (SELECT SUM(B. Unit. Price) FROM [Order Details] as B WHERE B. Order. ID = A. Order. ID) >= 100 THEN '처리요망' ELSE '' END, A. * FROM Orders as A ORDER BY 1 DESC CASE WHEN, THEN 사이에 여러 조건 사용하기 : Customers를 조회하는데 해당 고객의 주문이 존재할 경우 주문 존재라고 표시해서 조회 SELECT CASE WHEN EXISTS(SELECT * FROM Orders as B WHERE B. Customer. ID = A. Customer. ID) THEN '주문존재' ELSE '' END, A. * FROM Customers as A ORDER BY 1 sqlhwan@hotmail. com

CASE의 활용 – 4 중첩된 CASE문 : Customers와 Orders의 정보를 조회하는데 Berlin에서 1997년 10월

CASE의 활용 – 4 중첩된 CASE문 : Customers와 Orders의 정보를 조회하는데 Berlin에서 1997년 10월 3일에 주문된 데이터에 대해 베를린 특정일 주문이란 표시해 서 조회 SELECT CASE WHEN A. City = 'Berlin' THEN CASE WHEN B. Order. Date = '1997 -10 -03 00: 00. 000' THEN '베를린 특정일 주문' ELSE '' END, A. *, B. * FROM Customers as A JOIN Orders as B ON A. Customer. ID = B. Customer. ID ORDER BY 1 DESC sqlhwan@hotmail. com