SELECT
- DB를 조회하는 가장 기본적인 명령문
- 데이터가 저장된 테이블에서 행과 열 전체 또는 일부를 추출해서 결과 집합(레코드 집합) 이라는 조회 결과를 보여줌
작동 원리
현재 아래와 같은 Customer 이라는 테이블이 있다.
위의 테이블에 나는 Title이 Mr.인 행들에 대하여 CustomerID, Title, Firstname, Phone 값만 추출하고 싶다. 추출후의 결과를 보면 다음과 같다.
이와 같이 SELECT 명령문은 해당 테이블 전체를 가져올 수도 있고 사용자가 원하는 특정 부분만을 추출할 수 있다.
열 제약 조건
모든 열
- 가장 단순한 형태의 SELECT 문이다.
- '*' 문자를 사용한다. (해당 문자는 제약이 없다는 뜻으로 모든 열을 명시)
USE AdventureWorksLT 명령어는 "AdventureWorksLT" 라는 데이터베이스를 사용하겠다고 선언한 것이다.
SELECT * FROM ~~ 명령어는 "SalesLT.ProductCategory" 테이블의 모든 열을 조회하는 명령문이다.
* 만약 USE Adven~~ 부분을 사용하지 않을 경우 SELECT * FROM AdventureWorksLT.SalesLT.ProductCategory 라고 명령문을 수정해야 한다.
특정 열
- 특정 열만 조회하고 싶을 때는 '*' 대신 조회를 할 열의 이름을 적으면 된다.
- 복수 이상의 열을 조회하려면 ','로 구분한다.
보는것과 같이 특정 열만 조회할 수도 있다. 물론 조회하는 열은 반드시 테이블 내의 순서대로 나열할 필요는 없다.
즉, 위의 사진에서 Name과 rowguid 열의 순서를 아래와 같이 바꿔도 무방하다.
열 별칭 지정
- SELECT 문을 실행하면 SQL 서버는 결과 집합과 함께 열 머리글을 돌려준다.
- 결과 집합 : SELECT 문을 실행했을 때 SQL 서버가 돌려주는 레코드 집합
- 열 머리글 : 결과 집합에서의 각 필드의 이름
- 보통은 열 이름이 열 머리글이다.
- 열 별칭은 column AS alias와 column alias가 사용된다
- 또한 계산된 파생열에는 열 머리글이 없기 때문에 별도로 부여해야 한다.
column AS alias
- 표준적, 권장되는 방법이다.
- 설정한 별칭에 공백이나 특수 문자가 포함될 경우에는 '', '' 또는 []로 둘러싸야 한다.
이전 열 머리글 ==> 바꾼 별칭
- City ==> 도시
- StateProvince ==> 주
- CountryRegion ==> 나라
- PostalCode ==> 우편 번호
column alias
- AS를 생략한 방법이다.
- 사용법은 위의 사진 명령에서 AS를 빼면 된다.
- 추천하지 않는 이유는, SELECT 문에서 두 개의 열 사이에 쉼표를 빠트리면 두 번째 열이 별칭으로 바뀌는 문제가 발생한다.
아래의 사진을 보도록 한다.
조회되는 내용 자체는 City 이지만 별칭이 PostalCode로 되어 있어서 이해가 잘 되지 않는다. 이러한 문제점 때문에 가급적 AS를 사용하기를 권장한다.
특정 행위에 의해 파생된 열에 별칭 지정
- 계산식에 의해 우선 열을 하나 파생후 AS를 이용하여 별칭을 지정해보자.
계산되어 파생되는 열을 구분하기 위해 개행과 '( )'로 둘러싸주면 구문의 의도를 명확하게 보여 줄 수 있다. 물론 개행이나 둘러싸는 거나 필수 조건은 아니지만
가독성을 위해서라면 하는 것이 좋다.
상수 열
- 상수열이란 테이블 열 값 대신 모든 레코드에 동일한 상수 값을 출력하는 열이다.
- 무의미한 상수 값이 모든 행에 중복으로 들어아기 때문에 매우 비효율적이다.
- 별칭으로 (AS 사용) 바꾸는 방식이 훨씬 좋다.
- 아래의 예에서는 '합계:' 라는 것이 바로 상수열이다. (모든 행에 들어가기 때문에 비효율적!)
* 물론 상수열 값은 숫자 또한 가능하다.
행 제약 조건
- DB를 운영할수록 행 수는 점점 늘어나기 마련인데, SELECT 문으로 이런 모든 행을 조회핳 필요는 없다.
- 따라서 일반적으로는 행을 제약하여 원하는 일부 행들만 결과 집합으로 출력하게 된다.
비교 연산자
- 비교 연산자는 열(변수)의 값이 특정 값과 일치하는지, 더 크거나 작은지 비교하는데 사용된다.
- 비교 연산자가 포함된 연삭식은 반드시 TRUE나 FALSE를 돌려준다.
- 비교 연산자의 종류에는 다음과 같은 것들이 있다.
연산자 |
설명 |
A = B |
A와 B가 같음 |
A > B |
A가 B보다 큼 |
A < B |
A가 B보다 작음 |
A >= B |
A가 B보다 크거나 같음 |
A <= B |
A가 B보다 작거나 같음 |
A <> B |
A와 B가 같지 않음 |
ListPrice가 4.99 보다 같거나 작은 행만 출력
FirstName이 'James'인 행만 출력
논리 연산자
- 논리 연사자는 연산식들을 논리적으로 결합하는데 사용된다,
- 비교 연산자가 포함된 논리식은 TRUE나 FALSE를 돌려준다.
- 비교 연산자가 사용되면 논리 연사자의 우선순위는 다음과 같다.
NOT -> AND -> OR
- 논리 연산자들을 단순히 결합하면 위의 우선순위에 따라 결합 순서가 결정되는데, 결합 순서를 바꾸려면 '()'로 둘러싸면 된다.
- 논리 연산자에는 다음과 같은 것들이 있다.
연산자 |
설명 |
NOT A |
연산식 A가 TRUE면 FALSE를, FALSE면 TRUE를 돌려준다. (부정) |
A AND B |
연산식 A와 B 둘다 TRUE일 때만 TRUE를 돌려준다 |
A OR B |
연산식 A와 B 중 한개라도 TRUE이면 TRUE를 돌려준다. |
위의 명령어문을 하나씩 파해쳐 보면서 우선 순위에 대한 조건을 알아보자.
우선 우선 순위는 NOT -> AND - > OR 순이다.
조건 1. NOT ==> 제품 번호가 8 이 아니고
조건 2. AND ==> 조건 1을 만족하면서 분류 번호가 2
조건 3. OR ==> 혹은 제품명이 'Bikes'
인 행을 조회한다.
이전 명령과는 연산자들의 순서가 똑같지만 괄호에 의해 우선순위가 바뀌었다.
우선 순위는 OR -> AND -> NOT 순이다.
조건 1. OR ==> 분류 번호가 2 거나, 제품명이 'Bikes' 이고
조건 2. AND ==> 조건 1을 만족하면서 제품 번호가 8 인 행
조건 3. NOT ==> 조건 2을 만족하는 행이 아닌 다른 모든
행을 조회한다.
문자열 패턴 매칭
- LIKE 연산자를 사용한다.
- 사용 구문은 다음과 같다.
match_expression [ NOT ] LIKE pattern [ ESCAPE <escape character> ]
- match_expression에는 주로 열 또는 변수 이름이 온다.
- pattern 에는 와일드카드 문자가 포함된 문자열이 온다.
- 와일드카드 문자는 다음과 같다.
와일드카드 문자 |
설명 |
예제 |
% |
문자가 0개 이상인 문자열 |
WHERE product LIKE '%database%' => product 열의 어이든지 'database'가 포함된 행 |
_ (밑줄) |
단일 문자 |
WHERE f_name LIKE '_oon' => f_name 열이 'oon'으로 끝나고 4문자로 구성되는 모든 행 ( aoon, boon, coon 등) |
[ ] |
지정된 범위 또는 집합에 있는 단일 문자 |
WHERE l_name LIKE '[C-J]ean' => l_name 열이 'ean'으로 끝나고 C와 J 사이의 단일 문자로 시작되는 모든 행 ( Cean, Fean, Hean 등) |
[^] |
지정된 범위 또는 집합에 없는 단일 문자 |
WHERE l_name LIKE 'te[^l]%' => l_name 열이 'te'로 시작하고 그 다믐에 오는 문자가 'l'이 아닌 모든 행 |
LastName이 Cean, Dean, Eean, Fean, Gean, Hean, Iean, Jean 중 하나라도 포함하는 행을 조회
name이 _를 포함하고 있는 행을 조회
* 위의 쿼리에서 알아두어야 할 것은 ESCAPE 부분이다. 알다 싶이 _ (밑줄) 은 위의 표에서 보다 싶이 와일드 카드에 속하기 때문에 일반적으로 어떤 형태로던지 간에
조회가 불가능하다. 비단 _(밑줄) 뿐만 아니라 모든 와일드카드 문자의 조회가 불가능하다.
따라서 와일드카드 문자열이 포함된 행을 조회하려면 이스케이프 문자 \(백스페이스)를 사용해야 한다.
이스케이스 문자는 뒤에 오는 문자열을 문자열 그 자체로 순수하게 인식하라는 뜻으로 사용된다. (대부분의 언어에서 존재함)
범위 검색 ( BETWEEN 연산자 )
- BETWEEN 연산자는 최솟값과 최댓값 사이의 범위에 들어가는지 여부를 파악할 때 사용한다.
- 사용 구문은 다음과 같다.
range_expression [ NOT ] BETWEEN min_value AND max_value
- range_expression에는 주로 열 또는 변수 이름이 온다.
- range_expression은 숫자 데이터 형을 많이 사용하는데 문자, 날짜, 시각 데이터형도 간혹 사용한다.
- 날짜, 시각 데이터 형에서는 자정을 기점으로 최솟값 또는 최댓값 날짜의 포함 여부를 결정한다.
ListPrice가 2.99 이상 4.49 이하인 행
ProductNumber가 BB-7421 부터 BK-M18B-40 까지에 포함되는 행
DueDate가 2001년 5월 31일 부터 2001년 6월 14일까지인 행
목록 검색 ( IN 연산자 )
- IN 연산자는 목록 안의 값 중 하나와 일치하는지 여부를 파악하는데 사용한다.
- 사용 구문은 다음과 같다.
list_expression [ NOT ] IN ( value_list | subquery )
- list_expression은 주로 열 또는 변수 이름이 온다.
- value_list는 보통 쉼표로 구분된 값들이 온다.
- value_list 대신에 하위 질의가 올 수도 있다.
StateProvince가 Idaho, New Mexico, South Dakota 중 하나인 행을 조회한다.
IN 연산자를 이용하면 간단하게 끝나지만 IN을 사용하지 않을 경우 아래 주석 부분을 보다 싶이 반복적인 부분이 들어가기 때문에 훨씬 비효율적이다.
NULL 비교 ( IS, IS NOT 연산자 )
- NULL에 대한 연산을 일반 연산(AND, OR, NOT, <, >, <=, >=, <>) 처럼 수행할 경우에는 항상 결과값이 NULL이 된다.
- 따라서 NULL에 대한 연산은 특수 연산자인 IS, IS NOT 연산자를 사용해야 한다.
ParentProductCategoryID가 NULL인 행
ParentProductCategoryID가 NULL이 아닌 행
'Study > 데이터 베이스' 카테고리의 다른 글
[DBMS 강의 - 07] 테이블 조회_3 (0) | 2014.03.11 |
---|---|
[DBMS 강의 - 06] 테이블 조회_2 (0) | 2014.03.08 |
[DBMS 강의 - 04] 데이터 형식 (0) | 2014.03.04 |
[DBMS 강의 - 03] SQL (0) | 2014.03.04 |
[DBMS 강의 - 02] 데이터베이스 종류 (0) | 2014.03.04 |