Download presentation
Presentation is loading. Please wait.
Published byCorey Ryan Modified 6년 전
1
단일 테이블 조회를 위한 SELECT 문을 이해한다. 열 제약조건과 행 제약조건을 이해한다. 결과 집합 변경 방법을 이해한다.
2
단일 테이블 조회 SELECT 문 개요 열 제약조건 행 제약조건 결과 집합 변경
3
1. SELECT 문의 개요 개념과 작동 원리 데이터베이스를 조회하는 SELECT 문의 기초
데이터가 저장된 테이블(stores 테이블)에서 행과 열의 일부 또는 전부를 추출해서 결과 집합(result set) 또는 레코드 집합(record set) 이라는 조회 결과를 만들어주는 명령문 SELECT 문은 모든 SQL 명령문들 중에서 가장 중요 실제로 가장 많이 사용
4
1. SELECT 문의 개요 개념과 작동 원리
5
1. SELECT 문 개요 구문 BNF(Backus Normal Form)
6
1. SELECT 문 개요 구문 기본적인SELECT 문의 구문
7
2. 열 제약조건 열 제약조건 SELECT 문을 사용할 때 열을 제약하는 각종 조건에 대해 학습
현재 데이터베이스와 무관하게 SQL 쿼리를 실행하려면 데이터베이스 이름까지 함께 지정 예) FROM SalesLT.ProductCategory; FROM Adventure WorksLT.SalesLT.ProductCategory
8
SalesLT.ProductCategory 테이블을 조회하겠다고 지정
2. 열 제약조건 모든 열(*) ‘*’는 열 제약이 전혀 없다는 것을 나타냄 - 이때 열들은 스키마에 정의되어 있는 순서대로 나타남 - AdventureWorksLT 내에 있는 SalesLT.ProductCategory 테이블의 모든 열을 조회 1 SELECT * 2 FROM SalesLT.ProductCategory; 예제 1 열 제약이 없음: 모든 열을 지정 SalesLT.ProductCategory 테이블을 조회하겠다고 지정
9
2. 열 제약조건 모든 열(*) 1 SELECT * 2 FROM SalesLT.ProductCategory;
10
모든 열을 스키마 정의 순서대로 나타나도록 지정
2. 열 제약조건 열 목록 모든 열(*) 대신 특정 열들의 목록 지정 가능 - SalesLT.ProductCategory 테이블의 모든 열들을 스키마에서 정의한 순서대로 나열, 실행 결과는 모든 열(*)을 지정했을 때와 같다. 1 SELECT ProductCategoryID, ParentProductCategoryID, Name, rowguid, ModifiedDate 2 FROM SalesLT.ProductCategory; 예제 2 모든 열을 스키마 정의 순서대로 나타나도록 지정
11
2. 열 제약조건 열 목록 1 SELECT ProductCategoryID, ParentProductCategoryID, Name, rowguid, ModifiedDate 2 FROM SalesLT.ProductCategory;
12
2. 열 제약조건 열 목록 집합: 공통된 특징이 있는 요소들이나 다른 것과 관련이 있는
요소들을 모아 놓은 것. 요소들 사이에는 특별한 순서가 없음 - rowguid 열 생략, Name과 ModifiedDate 열 순서 바꿈(집합에 근거하기 때문에 열 순서의 생략, 변경이 가능 1 SELECT ProductCategoryID, ParentProductCategoryID, ModifiedDate, Name 2 FROM SalesLT.ProductCategory; 예제 3 원하는 열 목록을 원하는 순서대로 지정
13
2. 열 제약조건 열 목록 1 SELECT ProductCategoryID, ParentProductCategoryID, ModifiedDate, Name 2 FROM SalesLT.ProductCategory;
14
2. 열 제약조건 열 별칭 지정 SELECT 문을 실행하면 SQL 서버는 결과 집합과 함께 열 머리글을 돌려줌
결과 집합(Result Set) SELECT 문을 실행했을 때 SQL 서버가 돌려주는 레코드 집합 SELECT 문 실행 후의 실행 결과에서 확인 가능 열 머리글(Column Heading) 결과 집합에서의 각 필드의 이름 쿼리 분석기에서 SELECT 문을 실행하면 결과 창에 열 머리글이 표시 됨(가능하면 열 머리글에는 직관적인 이름을 부여)
15
2. 열 제약조건 열 별칭 지정 보통은 열 이름이 열 머리글
열 머리글을 만들 때 사용하는 것이 열 별칭(column alias) 열 별칭을 지정할 때는 column AS alias, column alias를 사용하며, 계산된 파생 열이 있을 때는 열 머리글이 없기 때문에 별도로 부여
16
2. 열 제약조건 열 별칭 지정 column AS alias - 가장 표준적이고 권장하는 방법
- SELECT 문은 영문 열 이름들을 모두 한글 별칭으로 바꾼 것 - 별칭에 공백이나 특수 문자가 포함될 경우에는‘ ’,“ ”또는 [ ]로 둘러싸야 함(예: ... AS‘우편 번호’) 1 SELECT PostalCode AS 우편번호, CountryRegion AS 국가, 2 StateProvince AS 주, City AS 시, AddressLine1 AS 주소 3 FROM SalesLT.Address; 예제 4 이전 열 머리글 바꾸고자 하는 열 별칭
17
2. 열 제약조건 열 별칭 지정 1 SELECT PostalCode AS 우편번호, CountryRegion AS 국가, 2 StateProvince AS 주, City AS 시, AddressLine1 AS 주소 3 FROM SalesLT.Address;
18
2. 열 제약조건 열 별칭 지정 column alias - 앞의 column AS alias 에서 AS를 생략한 방법
- 열 이름과 별칭의 구분이 명확하지 않음 1 SELECT PostalCode 우편번호, CountryRegion 국가, 2 StateProvince 주, City 시, AddressLine1 주소 3 FROM SalesLT.Address; 예제 5 이전 열 머리글 바꾸고자 하는 열 별칭
19
2. 열 제약조건 열 별칭 지정 예제 6 - column alias 방법의 문제점 : SELECT 문에서 두 개의 열 사이에
쉼표를 빠뜨리면 두 번째 열(CountryRegion)이 별칭으로 바뀜 1 SELECT PostalCode CountryRegion 2 FROM SalesLT.Address; 예제 6
20
2. 열 제약조건 열 별칭 지정 계산된 파생 열: 원래 테이블에 있던 열이 아니라 계산에 의해 새로 만들어진 열
- SELECT 문의‘OrderQty * UnitPrice * (1 - UnitPriceDiscount)’ 가 계산된 파생열 - 이 열에는 별칭을 붙이지 않으면 열 머리글이 지정되지 않음 1 SELECT OrderQty, UnitPrice, UnitPriceDiscount, 2 OrderQty * UnitPrice * (1 - UnitPriceDiscount) AS total_price 3 FROM SalesLT.SalesOrderDetail; 예제 7 계산된 파생 열 지정하고자 하는 열 별칭
21
2. 열 제약조건 열 별칭 지정 1 SELECT OrderQty, UnitPrice, UnitPriceDiscount, 2 OrderQty * UnitPrice * (1 - UnitPriceDiscount) AS total_price 3 FROM SalesLT.SalesOrderDetail;
22
2. 열 제약조건 열 별칭 지정 계산된 파생 열 전체를 ‘( )’로 둘러싸주면 구문의 의도를 명확하게 보여줄 수 있음
예) ... (OrderQty * UnitPrice * (1 - UnitPriceDiscount) ) AS total_price ... 전체‘( )’를 생략하고 AS도 생략한 방식은 복잡한 연산식과 열 별칭 (total_price)이 뒤섞여 거의 구분되지 않음 예) ... OrderQty * UnitPrice * (1 - UnitPriceDiscount)
23
2. 열 제약조건 열 별칭 지정 ‘alias = column’방식 예제 8
열 별칭을 지정하는 또 다른 방식(SQL 표준 아님) Transact-SQL에서 사용 가능 1 SELECT OrderQty, UnitPrice, UnitPriceDiscount, 2 total_price = OrderQty * UnitPrice * (1 - UnitPriceDiscount) 3 FROM SalesLT.SalesOrderDetail; 예제 8 계산된 파생 열 지정하고자 하는 열 별칭
24
2. 열 제약조건 상수 열 상수(literal) 열: 테이블 열 값 대신 모든 레코드에 동일한 상수 값을 출력하는 열 예제 9
1 SELECT OrderQty, UnitPrice, UnitPriceDiscount, 2 '합계:', OrderQty * UnitPrice * (1 - UnitPriceDiscount) 3 FROM SalesLT.SalesOrderDetail; 예제 9 상수 열 계산 식
25
2. 열 제약조건 상수 열 1 SELECT OrderQty, UnitPrice, UnitPriceDiscount,
3 FROM SalesLT.SalesOrderDetail;
26
2. 열 제약조건 상수 열 [예제 9]의‘합계:’열이 상수 열 무의미한 상수 값이 모든 행에 중복으로 들어있기 때문에 매우
비효율적(데이터베이스에서 금기시되는 데이터 중복과도 관련 있음) 다음과 같이 열 별칭으로 바꾸는 편이 효율적 예) ... (OrderQty * UnitPrice * (1 - UnitPriceDiscount) ) AS 합계 ...
27
2. 열 제약조건 상수 열 - 문자 상수 열 외에 숫자 상수 열 지정 1 SELECT 7 AS Lucky, firstname, lastname 2 FROM SalesLT.Customer; 예제 10
28
2. 열 제약조건 상수 열 [예제 10]의 모든 레코드의 첫째 필드에 행운의(lucky) 7이 출력
- 극단적으로 모든 열이 상수 열일 경우, 아예 FROM 절이 없는 SELECT 문을 만들 수도 있다는 의미 SELECT 'Lucky', 7, '참 좋다!'; 예제 11
29
3. 행 제약조건 비교 연산자 SELECT 문으로 행들을 조회할 때 행을 제약하여 원하는 일부 행들만 결과집합으로 출력
열(또는 변수)의 값이 특정 값과 일치하는지 또는 더 크거나 작은 지 비교 하는 데 쓰임 비교 연산자가 포함된 연산식은 TRUE나 FALSE를 돌려줌
30
FirstName이‘James’와 같은
3. 행 제약조건 비교 연산자 - = 비교 연산자 사용 1 SELECT CustomerID, FirstName, MiddleName, LastName 2 FROM SalesLT.Customer 3 where FirstName = 'James'; 예제 12 FirstName이‘James’와 같은
31
3. 행 제약조건 비교 연산자 1 SELECT CustomerID, FirstName, MiddleName, LastName 2 FROM SalesLT.Customer 3 where FirstName = 'James';
32
3. 행 제약조건 비교 연산자 예제 13 - <= 비교 연산자 사용
1 SELECT ProductID, Name, ProductNumber, ListPrice 2 FROM SalesLT.Product 3 WHERE ListPrice <= 4.99; 예제 13 ListPrice가 4.99보다 작거나 같은
33
3. 행 제약조건 비교 연산자 1 SELECT ProductID, Name, ProductNumber, ListPrice 2 FROM SalesLT.Product 3 WHERE ListPrice <= 4.99;
34
3. 행 제약조건 논리 연산자 논리 연산자 연산식들을 논리적으로 결합
비교 연산자가 포함된 연산식은 TRUE 또는 FALSE를 돌려줌 비교 연산자에는 NOT → AND → OR 순의 우선순위 있음 - 논리 연산자들을 단순히 결합하면 이 우선순위에 따라 결합 순서가 결정되는데, 결합 순서를 바꾸려면‘( )’로 둘러싸야 함
35
3. 행 제약조건 논리 연산자 예제 14 - 연산자 우선순위를 적용하여 논리 연산자들을 결합
- 결합 순서 - NOT →AND →OR ( NOT 연산자 때문에‘ProductCategoryID = 8’행이 제외, OR 연산자 때문에‘ProductCategoryID = 1’행이 추가 ) 1 SELECT ProductCategoryID, ParentProductCategoryID, Name 2 FROM SalesLT.ProductCategory 3 WHERE NOT ProductCategoryID = 8 4 AND ParentProductCategoryID = 2 5 OR Name = 'Bikes'; 예제 14 1 2 3
36
3. 행 제약조건 논리 연산자 1 SELECT ProductCategoryID, ParentProductCategoryID, Name 2 FROM SalesLT.ProductCategory 3 WHERE NOT ProductCategoryID = 8 4 AND ParentProductCategoryID = 2 5 OR Name = 'Bikes';
37
3. 행 제약조건 논리 연산자 예제 15 -‘( )’로 논리 연산자들의 결합 순서를 바꿔보자
(결합 순서는OR →AND →NOT) 1 SELECT ProductCategoryID, ParentProductCategoryID, Name 2 FROM SalesLT.ProductCategory 3 WHERE NOT ( 4 ProductCategoryID = 8 5 AND ( ParentProductCategoryID = 2 OR Name = 'Bikes' 8 ) 9 ); 예제 15 1 2 3
38
3. 행 제약조건 논리 연산자 1 SELECT ProductCategoryID, ParentProductCategoryID, Name 2 FROM SalesLT.ProductCategory 3 WHERE NOT ( 4 ProductCategoryID = 8 5 AND ( 6 ParentProductCategoryID = 2 7 OR Name = 'Bikes' 8 ) 9 );
39
3. 행 제약조건 문자열 패턴 매칭(LIKE 연산자) LIKE 연산자
문자열 패턴 매칭(pattern matching)을 해주는 연산자 소량의 문자열 검색에 많이 사용 match_expression에는 열 또는 변수 이름이 오고, pattern에는 와일드카드 문자가 포함된 문자열 상수가 옴 < LIKE 연산자 구문>
40
3. 행 제약조건 문자열 패턴 매칭(LIKE 연산자)
41
3. 행 제약조건 문자열 패턴 매칭(LIKE 연산자) 예제 16 - 와일드카드 문자 %를 사용
- 다음 명령문의 실행 결과에서‘Kramer’,‘ Graff’,‘ Graham’ 은 패턴의‘Ra’와,‘ Barzdukas’는‘Ka’와 매칭 1 SELECT CustomerID, LastName 2 FROM SalesLT.Customer 3 WHERE LastName LIKE '%[CKR]a%'; 예제 16 LastName이 Ca, Ka, Ra 중 하나라도 포함할 경우
42
3. 행 제약조건 문자열 패턴 매칭(LIKE 연산자)
1 SELECT CustomerID, LastName 2 FROM SalesLT.Customer 3 WHERE LastName LIKE '%[CKR]a%';
43
3. 행 제약조건 문자열 패턴 매칭(LIKE 연산자) 예제 17 - 와일드카드 문자 자체를 패턴에 포함
1 IF NOT EXISTS ( 2 SELECT name 3 FROM sys.databases 4 WHERE name = N'Test1DB' 5 ) 6 CREATE DATABASE Test1DB; 7 GO 8 USE Test1DB; 9 GO 10 IF OBJECT_ID('Table1', 'U') IS NOT NULL 11 DROP TABLE Table1; 12 GO 13 CREATE TABLE Table1 14 ( 15 id int NOT NULL, 16 name varchar(20) NULL, 17 CONSTRAINT PK_Table1 PRIMARY KEY (id) 18 ); 19 GO 20 INSERT Table1 VALUES (1, 'abcdef'); 21 INSERT Table1 VALUES (2, 'abc_def'); 22 INSERT Table1 VALUES (3, 'abc%def'); 예제 17
44
3. 행 제약조건 문자열 패턴 매칭(LIKE 연산자) 예제 18 -‘_’가 포함된 행 찾기
-‘ \’이 이스케이프 문자이므로‘_’가 포함된 행을 정확히 찾아냄 1 SELECT name 2 FROM Table1 3 WHERE name LIKE '%\_%' ESCAPE '\'; 예제 18
45
3. 행 제약조건 문자열 패턴 매칭(LIKE 연산자) 기본적인 이스케이프 문자
DBMS별로‘ESCAPE <escape character>’구 없이도 이스케이프 효과를 얻는 방법 있음 SQL Server에서 와일드카드 문자를‘[ ]’로 둘러싸면 이스케이프가 됨 즉 예) ... name LIKE '%[_]%' ... ... name LIKE '%[%]%' ... MySQL에서는 적용 안됨 -‘ESCAPE \’구 없이도‘\’문자가 기본적인 이스케이프 문자로 적용 예) ... name LIKE ‘%\_%’... ... name LIKE ‘%\%%’...
46
3. 행 제약조건 범위 검색(BETWEEN 연산자) BETWEEN 연산자
최솟값과 최댓값 사이의 범위에 들어가는지 여부를 파악할 때 쓰임 이때 최솟값과 최댓값도 범위에 포함 range_expression에는 열 또는 변수 이름이 옴 비교 및 논리 연산자를 사용하는 것보다 BETWEEN 연산자를 사용하는 것이 더 효율적 < BETWEEN 연산자 구문> <비교 및 논리 연산자 구문>
47
3. 행 제약조건 범위 검색(BETWEEN 연산자) 예제 19 - 숫자 데이터 형에 BETWEEN 연산자 사용
1 USE AdventureWorksLT; 2 GO 3 SELECT ProductID, Name, ListPrice 4 FROM SalesLT.Product 5 WHERE ListPrice BETWEEN 2.29 AND 4.99; 예제 19 2.29 <= ListPrice <= 4.99
48
3. 행 제약조건 범위 검색(BETWEEN 연산자) 예제 20 - 문자 데이터 형에 BETWEEN 연산자 사용
1 SELECT ProductID, Name, ProductNumber 2 FROM SalesLT.Product 3 WHERE ProductNumber BETWEEN 'BB-7421' AND 'BK-M18B-40'; 예제 20 ‘BB-7421’<= ProductNumber <= ‘BK-M18B-40’
49
3. 행 제약조건 범위 검색(BETWEEN 연산자) 예제 21 - 날짜·시각 데이터 형에 BETWEEN 연산자 사용
- DueDate가‘ :00:00.001’이라면 결과 집합에서 제외될 것(각 날짜의 0시~0시까지만 범위에 포함되기 때문 1 SELECT PurchaseOrderDetailID, DueDate 2 FROM AdventureWorks.Purchasing.PurchaseOrderDetail 3 WHERE DueDate BETWEEN '5/31/2001' AND '6/14/2001'; 예제 21 :00: <= DueDate <= :00:00.000
50
3. 행 제약조건 목록 검색(IN 연산자) IN 연산자 목록 안의 값 중 하나와 일치하는지 여부를 파악
- list_expression은 열 또는 변수 이름이 옴 - value_list는 보통 쉼표로 구분된 상수 값들이 옴 예) col IN (1, 2, 4, 9) - value_list 대신에 하위 질의subquery가 올 수도 있음
51
3. 행 제약조건 목록 검색(IN 연산자) - IN 연산자를 사용해 목록 검색 1 SELECT PostalCode, StateProvince, City 2 FROM SalesLT.Address 3 WHERE StateProvince IN ('Idaho', 'New Mexico', 'South Dakota'); 예제 22 StateProvince가 이 셋 중 하나일 경우
52
3. 행 제약조건 목록 검색(IN 연산자) - 비교 및 논리 연산자를 사용해 목록 검색 - 실행 결과는 IN 연산자를 사용한 것과 같으나 훨씬 비효율적 1 SELECT PostalCode, StateProvince, City 2 FROM SalesLT.Address 3 WHERE StateProvince = 'Idaho' 4 OR StateProvince = 'New Mexico' 5 OR StateProvince = 'South Dakota'; 예제 23 StateProvince가 이 셋 중 하나일 경우 [예제 22]와 의미는 같지만 다른 표현
53
3. 행 제약조건 NULL 비교(IS 연산자) NULL은 실제 연산 시 일반적인 연산자처럼 사용하면, 결과는
NULL에 대한 연산을 하려면 특수한 연산자 IS 또는IS NOT만 사용 해야 함 - NULL을 포함한 데이터 확인 1 SELECT ProductCategoryID, ParentProductCategoryID 2 FROM SalesLT.ProductCategory; 예제 24
54
3. 행 제약조건 범위 검색(BETWEEN 연산자) 예제 25 -‘= NULL’을 사용해 데이터 비교
1 SELECT ProductCategoryID, ParentProductCategoryID 2 FROM SalesLT.ProductCategory 3 WHERE ParentProductCategoryID = NULL; 예제 25 NULL을 = 로 비교하면 실패
55
3. 행 제약조건 범위 검색(BETWEEN 연산자) 예제 26 -‘IS NULL’을 사용해 데이터 비교
1 SELECT ProductCategoryID, ParentProductCategoryID 2 FROM SalesLT.ProductCategory 3 WHERE ParentProductCategoryID IS NULL; 예제 26 NULL을 IS로 비교하면 정확한 결과가 나옴
56
3. 행 제약조건 범위 검색(BETWEEN 연산자) 예제 27 -‘IS NOT NULL’을 사용해 데이터 비교
- 정확한 결과 나옴 1 SELECT ProductCategoryID, ParentProductCategoryID 2 FROM SalesLT.ProductCategory 3 WHERE ParentProductCategoryID IS NOT NULL; 예제 27 NULL이 아닐 경우
57
3. 결과 집합 변경 행 정렬(ORDER BY 절) 행들을 특정 열(들)을 기준으로 정렬 할 때 ORDER BY 절 사용
order_by_expression : 정렬할 열 지정. 열 형식은 열 이름 또는 그 별칭, 연산식 또는 그 별칭, 위치를 나타내는 정수 등으로 지정 ASC | DESC : ASC는 오름차순 정렬, DESC는 내림차순 정렬을 지정 - 기본적으로 오름차순이므로 ASC는 생략해도 무관. ASC나 DESC는 하나의 열에만 적용 order_by_expression : 이 구문이 여러 개 나올 때는 첫 번째 것이 1차 정렬 키, 두 번째 것이 2차 정렬 키 등과 같이 적용
58
3. 행 제약조건 행 정렬(ORDER BY 절) 예제 28 - 열 이름으로 정렬 수행
1 SELECT ListPrice, ProductID, Name 2 FROM SalesLT.Product 3 WHERE ProductID <= 716 4 ORDER BY ListPrice DESC, ProductID; 예제 28 ListPrice를 기준으로 내림차순으로 정렬하고, ListPrice가 같을 경우 ProductID를 기준으로 오름차순으로 정렬
59
3. 행 제약조건 행 정렬(ORDER BY 절) 예제 29 - 위치를 나타내는 정수로 정렬 수행
- ORDER BY 절의 1은 첫 번째 열 ListPrice를, 2는 두 번째 열 ProductID를 가리킴 1 SELECT ListPrice, ProductID, Name 2 FROM SalesLT.Product 3 WHERE ProductID <= 716 4 ORDER BY 1 DESC, 2; 예제 29 열 목록의 첫째 열을 기준으로 내림차순으로 정렬하고, 첫째 열이 같을 경우 둘째 열을 기준으로 오름차순으로 정렬
60
3. 행 제약조건 중복 행 제거(DISTINCT) 중복된 레코드들을 하나씩만 나타나게 하려면 열 목록에 DISTINCT를 사용
DISTINCT : 열(column)이 여러 개 있을 때 모든 열을 조합한 값이 중복되지 않도록 함 DISTINCT가 포함된 SELECT 문에 ORDER BY 절이 있을 경우에는 정렬하는 열들이 열 목록에 반드시 나타나야 함(DISTINCT가 없을 경우에는 제약이 없음)
61
3. 행 제약조건 중복 행 제거(DISTINCT) 예제 30 - 열 하나에 중복 행 제거
1 SELECT DISTINCT StateProvince 2 FROM SalesLT.Address; 예제 30 StateProvince값이 중복되지 않게
62
3. 행 제약조건 중복 행 제거(DISTINCT) 예제 31 - 여러 열에 중복 행 제거
- 세 열을 조합한 값을 유일하게 해줌(각각의 열은 중복가능) - ORDER BY 절에 포함된 LastName, Suffic, Title 열들은 목록에도 반드시 나타나야 함 1 SELECT DISTINCT LastName, Suffix, Title 2 FROM AdventureWorksLT.SalesLT.Customer 3 ORDER BY LastName, Suffix, Title; 예제 31 세 열을 조합한 값이 중복되지 않게 열 목록에 있는 열들
Similar presentations