620 likes | 900 Views
단일 테이블 조회. 단일 테이블 조회를 위한 SELECT 문을 이해한다 . 열 제약조건과 행 제약조건을 이해한다 . 결과 집합 변경 방법을 이해한다. 단일 테이블 조회. SELECT 문 개요 열 제약조건 행 제약조건 결과 집합 변경. 1. SELECT 문의 개요. 데이터베이스를 조회하는 SELECT 문의 기초 SELECT 문은 테이블에 어떤 데이터가 들어 있는지 조회하는 명령문 데이터가 저장된 테이블 (stores 테이블 ) 에서 행과 열의 일부 또는
E N D
단일 테이블 조회 단일 테이블 조회를 위한 SELECT 문을 이해한다. 열 제약조건과 행 제약조건을 이해한다. 결과 집합 변경 방법을 이해한다.
단일 테이블 조회 • SELECT 문 개요 • 열 제약조건 • 행 제약조건 • 결과 집합 변경
1. SELECT 문의 개요 • 데이터베이스를 조회하는 SELECT 문의 기초 • SELECT 문은 테이블에 어떤 데이터가 들어 있는지 조회하는 명령문 • 데이터가 저장된 테이블(stores 테이블)에서 행과 열의 일부 또는 전부를 추출해서 결과 집합(result set) 또는 레코드 집합(record set) 이라는 조회 결과를 만들어주는 명령문 • SELECT 문은 모든 SQL 명령문들 중에서 가장 중요 • 실제로 가장 많이 사용 • 개념과 작동 원리
1. SELECT 문의 개요 • 개념과 작동 원리
1. SELECT 문 개요 • BNF(Backus Normal Form) • BNF는 프로그래밍 언어의 구문을 정의하는 데 많이 사용되는 표기법 • 구문
1. SELECT 문 개요 • 기본적인SELECT 문의 구문 • 구문
2. 열 제약조건 • SELECT 문을 사용할 때 열을 제약하는 각종 조건에 대해 학습 • 현재 데이터베이스와 무관하게 SQL 쿼리를 실행하려면 데이터베이스 이름까지 함께 지정 예) FROM SalesLT.ProductCategory; FROM Adventure WorksLT.SalesLT.ProductCategory • 열 제약조건
2. 열 제약조건 • ‘*’는 열 제약이 전혀 없다는 것을 나타냄 - 이때 열들은 스키마에 정의되어 있는 순서대로 나타남 - AdventureWorksLT 내에 있는 SalesLT.ProductCategory 테이블의 모든 열을 조회 1 SELECT * 2 FROM SalesLT.ProductCategory; • 모든 열(*) 예제 1 열 제약이 없음: 모든 열을 지정 SalesLT.ProductCategory 테이블을 조회하겠다고 지정
2. 열 제약조건 1 SELECT * 2 FROM SalesLT.ProductCategory; • 모든 열(*)
2. 열 제약조건 • 모든 열(*) 대신 특정 열들의 목록 지정 가능 - SalesLT.ProductCategory 테이블의 모든 열들을 스키마에서 정의한 순서대로 나열, 실행 결과는 모든 열(*)을 지정했을 때와 같다. 1 SELECT ProductCategoryID, ParentProductCategoryID, Name, rowguid, ModifiedDate 2 FROM SalesLT.ProductCategory; • 열 목록 예제 2 모든 열을 스키마 정의 순서대로 나타나도록 지정
2. 열 제약조건 1 SELECT ProductCategoryID, ParentProductCategoryID, Name, rowguid, ModifiedDate 2 FROM SalesLT.ProductCategory; • 열 목록
2. 열 제약조건 • 집합: 공통된 특징이 있는 요소들이나 다른 것과 관련이 있는 요소들을 모아 놓은 것. 요소들 사이에는 특별한 순서가 없음 - rowguid 열 생략, Name과 ModifiedDate 열 순서 바꿈(집합에 근거하기 때문에 열 순서의 생략, 변경이 가능 1 SELECT ProductCategoryID, ParentProductCategoryID, ModifiedDate, Name 2 FROM SalesLT.ProductCategory; • 열 목록 예제 3 원하는열 목록을 원하는 순서대로 지정
2. 열 제약조건 1 SELECT ProductCategoryID, ParentProductCategoryID, ModifiedDate, Name 2 FROM SalesLT.ProductCategory; • 열 목록
2. 열 제약조건 • SELECT 문을 실행하면 SQL 서버는 결과 집합과 함께 열 머리글을 돌려줌 • 결과 집합(Result Set) • SELECT 문을 실행했을 때 SQL 서버가 돌려주는 레코드 집합 • SELECT 문 실행 후의 실행 결과에서 확인 가능 • 열 머리글(Column Heading) • 결과 집합에서의 각 필드의 이름 • 쿼리 분석기에서 SELECT 문을 실행하면 결과 창에 열 머리글이 표시 됨(가능하면 열 머리글에는 직관적인 이름을 부여) • 열 별칭 지정
2. 열 제약조건 • 보통은 열 이름이 열 머리글 • 열 머리글을 만들 때 사용하는 것이 열 별칭(column alias) • 열 별칭을 지정할 때는 column AS alias, column alias를 사용하며, 계산된 파생 열이 있을 때는 열 머리글이 없기 때문에 별도로 부여 • 열 별칭 지정
2. 열 제약조건 • column AS alias - 가장 표준적이고 권장하는 방법 - SELECT 문은 영문 열 이름들을 모두 한글 별칭으로 바꾼 것 - 별칭에 공백이나 특수 문자가 포함될 경우에는‘ ’,“ ”또는 [ ]로 둘러싸야 함(예:... AS‘우편 번호’) 1 SELECT PostalCode AS 우편번호, CountryRegion AS 국가, 2 StateProvince AS 주, City AS 시, AddressLine1 AS 주소 3 FROM SalesLT.Address; • 열 별칭 지정 예제 4 바꾸고자 하는 열 별칭 이전 열 머리글
2. 열 제약조건 1 SELECT PostalCode AS 우편번호, CountryRegion AS 국가, 2 StateProvince AS 주, City AS 시, AddressLine1 AS 주소 3 FROM SalesLT.Address; • 열 별칭 지정
2. 열 제약조건 • column alias - 앞의 column AS alias 에서 AS를 생략한 방법 - 열 이름과 별칭의 구분이 명확하지 않음 1 SELECT PostalCode 우편번호, CountryRegion 국가, 2 StateProvince 주, City 시, AddressLine1 주소 3 FROM SalesLT.Address; • 열 별칭 지정 예제 5 이전 열 머리글 바꾸고자 하는 열 별칭
2. 열 제약조건 - column alias 방법의 문제점 : SELECT 문에서 두 개의 열 사이에 쉼표를 빠뜨리면 두 번째 열(CountryRegion)이 별칭으로 바뀜 1 SELECT PostalCode CountryRegion 2 FROM SalesLT.Address; • 열 별칭 지정 예제 6
2. 열 제약조건 • 계산된 파생 열: 원래 테이블에 있던 열이 아니라 계산에 의해 새로 만들어진 열 - SELECT 문의‘OrderQty * UnitPrice * (1 - UnitPriceDiscount)’ 가 계산된 파생열 - 이 열에는 별칭을 붙이지 않으면 열 머리글이 지정되지 않음 1 SELECT OrderQty, UnitPrice, UnitPriceDiscount, 2 OrderQty * UnitPrice * (1 - UnitPriceDiscount) AS total_price 3 FROM SalesLT.SalesOrderDetail; • 열 별칭 지정 예제 7 계산된 파생 열 지정하고자 하는 열 별칭
2. 열 제약조건 1 SELECT OrderQty, UnitPrice, UnitPriceDiscount, 2 OrderQty * UnitPrice * (1 - UnitPriceDiscount) AS total_price 3 FROM SalesLT.SalesOrderDetail; • 열 별칭 지정
2. 열 제약조건 • 계산된 파생 열 전체를 ‘( )’로 둘러싸주면 구문의 의도를 명확하게 보여줄 수 있음 예) ... (OrderQty * UnitPrice * (1 - UnitPriceDiscount) ) AS total_price ... • 전체‘( )’를 생략하고 AS도 생략한 방식은 복잡한 연산식과 열 별칭 (total_price)이 뒤섞여 거의 구분되지 않음 예) ... OrderQty * UnitPrice * (1 - UnitPriceDiscount) total_price ... • 열 별칭 지정
2. 열 제약조건 • ‘alias = column’방식 • 열 별칭을 지정하는 또 다른 방식(SQL 표준 아님) • Transact-SQL에서 사용 가능 1 SELECT OrderQty, UnitPrice, UnitPriceDiscount, 2 total_price = OrderQty * UnitPrice * (1 - UnitPriceDiscount) 3 FROM SalesLT.SalesOrderDetail; • 열 별칭 지정 예제 8 계산된 파생 열 지정하고자 하는 열 별칭
2. 열 제약조건 • 상수(literal) 열: 테이블 열 값 대신 모든 레코드에 동일한 상수 값을 출력하는 열 1 SELECT OrderQty, UnitPrice, UnitPriceDiscount, 2 '합계:', OrderQty * UnitPrice * (1 - UnitPriceDiscount) 3 FROM SalesLT.SalesOrderDetail; • 상수 열 예제 9 상수 열 계산 식
2. 열 제약조건 1 SELECT OrderQty, UnitPrice, UnitPriceDiscount, 2 '합계:', OrderQty * UnitPrice * (1 - UnitPriceDiscount) 3 FROM SalesLT.SalesOrderDetail; • 상수 열
2. 열 제약조건 • [예제 9]의‘합계:’열이 상수 열 • 무의미한 상수 값이 모든 행에 중복으로 들어있기 때문에 매우 비효율적(데이터베이스에서 금기시되는 데이터 중복과도 관련 있음) • 다음과 같이 열 별칭으로 바꾸는 편이 효율적 예) ... (OrderQty * UnitPrice * (1 - UnitPriceDiscount) ) AS 합계 ... • 상수 열
2. 열 제약조건 - 문자 상수 열 외에 숫자 상수 열 지정 1 SELECT 7 AS Lucky, firstname, lastname 2 FROM SalesLT.Customer; • 상수 열 예제 10
2. 열 제약조건 • [예제 10]의 모든 레코드의 첫째 필드에 행운의(lucky) 7이 출력 - 극단적으로 모든 열이 상수 열일 경우, 아예 FROM 절이 없는 SELECT 문을 만들 수도 있다는 의미 SELECT 'Lucky', 7, '참 좋다!'; • 상수 열 예제 11
3. 행 제약조건 • SELECT 문으로 행들을 조회할 때 행을 제약하여 원하는 일부 행들만 결과집합으로 출력 • 비교 연산자 • 열(또는 변수)의 값이 특정 값과 일치하는지 또는 더 크거나 작은 지비교 하는 데 쓰임 • 비교 연산자가 포함된 연산식은 TRUE나 FALSE를 돌려줌 • 비교 연산자
3. 행 제약조건 - = 비교 연산자 사용 1 SELECT CustomerID, FirstName, MiddleName, LastName 2 FROM SalesLT.Customer 3 where FirstName = 'James'; • 비교 연산자 예제 12 FirstName이‘James’와 같은
3. 행 제약조건 1 SELECT CustomerID, FirstName, MiddleName, LastName 2 FROM SalesLT.Customer 3 where FirstName = 'James'; • 비교 연산자
3. 행 제약조건 - <= 비교 연산자 사용 1 SELECT ProductID, Name, ProductNumber, ListPrice 2 FROM SalesLT.Product 3 WHERE ListPrice <= 4.99; • 비교 연산자 예제 13 ListPrice가 4.99보다 작거나 같은
3. 행 제약조건 1 SELECT ProductID, Name, ProductNumber, ListPrice 2 FROM SalesLT.Product 3 WHERE ListPrice <= 4.99; • 비교 연산자
3. 행 제약조건 • 논리 연산자 • 연산식들을 논리적으로 결합 • 비교 연산자가 포함된 연산식은 TRUE 또는 FALSE를 돌려줌 • 비교 연산자에는 NOT → AND → OR 순의 우선순위 있음 - 논리 연산자들을 단순히 결합하면 이 우선순위에 따라 결합 순서가 결정되는데, 결합 순서를 바꾸려면‘( )’로 둘러싸야 함 • 논리 연산자
3. 행 제약조건 - 연산자 우선순위를 적용하여 논리 연산자들을 결합 - 결합 순서 - 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
3. 행 제약조건 1 SELECT ProductCategoryID, ParentProductCategoryID, Name 2 FROM SalesLT.ProductCategory 3 WHERE NOT ProductCategoryID = 8 4 AND ParentProductCategoryID = 2 5 OR Name = 'Bikes'; • 논리 연산자
3. 행 제약조건 -‘( )’로 논리 연산자들의 결합 순서를 바꿔보자 (결합 순서는OR →AND →NOT) 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 ); • 논리 연산자 예제 15 1 2 3
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 ); • 논리 연산자
3. 행 제약조건 • LIKE 연산자 • 문자열 패턴 매칭(pattern matching)을 해주는 연산자 • 소량의 문자열 검색에 많이 사용 • match_expression에는 열 또는 변수 이름이 오고, pattern에는 와일드카드 문자가 포함된 문자열 상수가 옴 < LIKE 연산자 구문> • 문자열 패턴 매칭(LIKE 연산자)
3. 행 제약조건 • 문자열 패턴 매칭(LIKE 연산자)
3. 행 제약조건 - 와일드카드 문자 %를 사용 - 다음 명령문의 실행 결과에서‘Kramer’,‘ Graff’,‘ Graham’ 은 패턴의‘Ra’와,‘ Barzdukas’는‘Ka’와 매칭 1 SELECT CustomerID, LastName 2 FROM SalesLT.Customer 3 WHERE LastName LIKE '%[CKR]a%'; • 문자열 패턴 매칭(LIKE 연산자) 예제 16 LastName이 Ca, Ka, Ra 중 하나라도 포함할 경우
3. 행 제약조건 1 SELECT CustomerID, LastName 2 FROM SalesLT.Customer 3 WHERE LastName LIKE '%[CKR]a%'; • 문자열 패턴 매칭(LIKE 연산자)
3. 행 제약조건 - 와일드카드 문자 자체를 패턴에 포함 1 IF NOT EXISTS ( 2 SELECT name 3 FROM sys.databases 4 HERE 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'); • 문자열 패턴 매칭(LIKE 연산자) 예제 17
3. 행 제약조건 -‘_’가 포함된 행 찾기 -‘ \’이 이스케이프 문자이므로‘_’가 포함된 행을 정확히 찾아냄 1 SELECT name 2 FROM Table1 3 WHERE name LIKE '%\_%' ESCAPE '\'; • 문자열 패턴 매칭(LIKE 연산자) 예제 18
3. 행 제약조건 • 기본적인 이스케이프 문자 • DBMS별로‘ESCAPE <escape character>’구 없이도 이스케이프 효과를 얻는 방법 있음 • SQL Server에서 와일드카드 문자를‘[ ]’로 둘러싸면 이스케이프가 됨즉 예) ... name LIKE '%[_]%' ... ... name LIKE '%[%]%' ... • MySQL에서는 적용 안됨 -‘ESCAPE \’구 없이도‘\’문자가 기본적인 이스케이프 문자로적용 예) ... name LIKE ‘%\_%’... ... name LIKE ‘%\%%’... • 문자열 패턴 매칭(LIKE 연산자)
3. 행 제약조건 • BETWEEN 연산자 • 최솟값과 최댓값 사이의 범위에 들어가는지 여부를 파악할 때 쓰임 • 이때 최솟값과 최댓값도 범위에 포함 • range_expression에는 열 또는 변수 이름이 옴 • 비교 및 논리 연산자를 사용하는 것보다 BETWEEN 연산자를 사용하는 것이 더 효율적 < BETWEEN 연산자 구문> <비교 및 논리 연산자 구문> • 범위 검색(BETWEEN 연산자)
3. 행 제약조건 - 숫자 데이터 형에 BETWEEN 연산자 사용 1 USE AdventureWorksLT; 2 GO 3 SELECT ProductID, Name, ListPrice 4 FROM SalesLT.Product 5 WHERE ListPrice BETWEEN 2.29 AND 4.99; • 범위 검색(BETWEEN 연산자) 예제 19 2.29 <= ListPrice <= 4.99
3. 행 제약조건 - 문자 데이터 형에 BETWEEN 연산자 사용 1 SELECT ProductID, Name, ProductNumber 2 FROM SalesLT.Product 3 WHERE ProductNumber BETWEEN 'BB-7421' AND 'BK-M18B-40'; • 범위 검색(BETWEEN 연산자) 예제 20 ‘BB-7421’<= ProductNumber <= ‘BK-M18B-40’
3. 행 제약조건 - 날짜·시각 데이터 형에 BETWEEN 연산자 사용 - DueDate가‘2001-06-14 00: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'; • 범위 검색(BETWEEN 연산자) 예제 21 2001-050-31 00:00:00.000 <= DueDate <= 2001-06-14 00:00:00.000
3. 행 제약조건 • IN 연산자 • 목록 안의 값 중 하나와 일치하는지 여부를 파악 < IN 연산자 구문> - list_expression은 열 또는 변수 이름이 옴 - value_list는 보통 쉼표로 구분된 상수 값들이 옴 예)col IN (1, 2, 4, 9) - value_list 대신에 하위 질의subquery가 올 수도 있음 • 목록 검색(IN 연산자)