SELECT문은 데이터베이스로부터 저장되어 있는 데이터를 검색하는데 사용합니다.
[Syntax]
SELECT [ALL | DISTINCT] [row_limitation] {*, column [alias],...} FROM table_name [WHERE condition] [ORDER BY {column | integer} [ASC | DESC]]
- ALL | DISTINCT : 전체 행을 가져오거나(ALL) 중복되는 행을 제거(DISTINCT)하는 옵션 - * : 테이블의 모든 컬럼을 출력 - table_name : 질의 대상 테이블명 - condition : 조건을 만족하는 행들만 검색 - ORDER BY : 질의 결과 정렬을 위한 옵션(ASC:오름차순(Default),DESC내림차순)
SQL문의 작성 방법
- SQL 문장은 대소문자를 구별하지 않습니다.
- SQL 문장은 한 줄 또는 여러 줄에 입력될 수 있습니다.
- 일반적으로 키워드는 대문자로 입력합니다. 다른 모든 단어, 즉 테이블 이름, 열 이름은 소문자로 입력합니다.(권장)
- 여러 개의 SQL 문을 실행하는 경우 ';' 을 사용하거나 명령문 마지막 행 다음에 go 명령을 사용합니다. - 하나의 SQL 문을 실행하는 경우는 세미콜론(;) 이나 go 문을 생략가능하다.
SELECT emp_id 사번, emp_fname as 성명 FROM employee WHERE dept_id = 100
사번 성명 ------------------- 102 'Fran' 105 'Matthew' 160 'Robert'
emp_id 와 emp_fname 은 각각 사번과 성명이라는 컬럼 별칭(alias)으로 만들어 출력했습니다. alias를 사용할 때 as라는 키워드를 사용해도 되고, 생략할수도 있습니다.
|
WHERE 절에서 사용될 수 있는 연산자
연산자 |
설 명 |
BETWEEN a AND b |
a와b사이의 데이터를 출력 합니다.(a, b값 포함) |
NOT BETWEEN a AND b |
a와b사이에 있지않은 데이터를 출력 합니다 |
LIKE |
문자 형태로 일치하는 데이터를 출력 합니다 |
NOT LIKE |
문자 형태와 일치하지 않는 데이터를 출력 합니다. |
IS NULL |
ULL값을 가진 데이터를 출력 합니다. |
IS NOT NULL |
NULL값을 갖지 않는 데이터를 출력 합니다 |
IN (list) |
list의 값 중 어느 하나와 일치하는 데이터를 출력 합니다. |
NOT IN (list) |
list의 값과 일치하지 않는 데이터를 출력 합니다. | BETWEEN 연산자
SELECT emp_id, emp_fname, salary FROM employee WHERE salary BETWEEN 20000 AND 50000
--> 급여가 20000 에서 50000 사이인 사원만 출력
emp_id emp_fname salary ------------------------------------------- 102 Fran 45700.000 129 Philip 38500.000 184 Melissa 36490.000
| IN 연산자
SELECT emp_id, emp_fname, salary FROM employee WHERE emp_id IN ( 102, 249 )
--> 사번이 102, 249 인 사원의 사번화 성명 출력
emp_id emp_fname ---------------------------- 102 Fran 249 Rodrigo | NOT IN 연산자
SELECT emp_id, emp_fname FROM employee WHERE emp_id NOT IN ( 102, 249 )
--> 사번이 102, 249 번이 아닌 사원의 사번화 성명 출력
emp_id emp_fname ---------------------------- 105 Matthew 129 Philip 148 Julie | LIKE 연산자 - 검색 STRING 값에 대한 와일드 카드 검색을 위해서 LIKE연산자를 사용 합니다. - LIKE 연산자는 대소문자 구분 - % : 여러개의 문자열을 나타내는 와일드 카드 - _ : 하나의 문자를 나타내는 와일드카드 - [] : 해당 범위에 들어간 문자열을 나타내는 와일드카드 - [^] : 해당하는 범위의 문자를 제외한 문자를 나타내는 와일드 카드
구 분 |
설 명 |
LIKE ‘Red%’ |
컬럼이 'Red'로 시작하는 데이터만 검색 |
LIKE ‘%A’ |
컬럼이 'A'로 끝나는 데이터만 검색 |
LIKE ‘%KIM%’ |
컬럼에 'KIM'이라는 문자가 있는 데이터만 검색 |
LIKE ‘%K%M%’ |
컬럼에 'K' 문자와 'I'문자가 있는 데이터만 검색 |
LIKE ‘_A%’ |
컬럼에 'A' 문자가 두 번째 위치한 데이터만 검색 |
LIKE 'sm[iy]th' |
컬럼값이 'smith', 'smyth' 인 경우만 검색 |
LIKE 'sm[a-r]th' |
컬럼값이 smath,smbth,smcth,…,smrth 범위에 해당하는 값 |
LIKE 'sm[a-zA-Z]th' |
컬럼값이 smath,…,smzth, smAth,…,smZth 범위에 해당하는 값으로 대소문자를 구분하지 않고 조회하는 경우 |
LIKE '[^a-r]ough' |
컬럼값이 첫글자가 소문자 a에서 r까지의 글자를 제외한 문자tough은 해당되나 rough, bougth는 해당되지 않는다. |
SELECT emp_id, emp_fname FROM employee WHERE upper(emp_fname) LIKE '%A%'
--> 'A' 문자가 들어있는 사원 정보를 보여줍니다. upper() 라는 함수를 이용 emp_fname 컬럼값을 대문자로 변환 후 검색.
emp_id emp_fname ---------------------------- 102 Fran 105 Matthew 184 Melissa 191 Jeannette |
관계연산자
연산자 |
설 명 |
a = b |
컬럼 a 값이 b 와 같은 경우 |
a > b, a >= b |
컬럼 a 가 b 보다 큰경우, a 가 b보다 같거나 큰 경우 |
a < b, a<= b |
컬럼 a 가 b 보다 작은경우, a 가 b보다 같거나 작은 경우 |
조건a AND 조건b |
조건a와 조건b 가 모두 true(참) 인 경우. |
OR |
조건a나 조건b 둘 중 하나가 true(참) 인 경우 |
!, !>, !<, !=, !>=, !<= |
! 연산자가 사용되는 경우 해당 조건의 반대의 경우 |
Some(list) 또는 Any(list) |
- 다른 관계연사자와 결합되어서 사용 - list에 해당하는 여러개의 값을 가지고 비교연산을 한다. |
Exists(list) |
list 에 해당하는 결과가 하나라도 있으면 True 를 리턴 |
AND 연산자
SELECT emp_id, emp_fname FROM employee WHERE dept_id = 100 AND emp_id > 500
--> 부서 코드가 100 인 조건과 사번이 500 보다 큰 조건, 두가지 조건을 모두 만족하는 직원들을 검색.
emp_id emp_fname ---------------------------- 501 David 529 Dorothy 582 Peter 604 Albert | OR 연산자
SELECT emp_id, emp_fname FROM employee WHERE dept_id = 100 OR dept_id = 200
--> 부서 코드가 100 이거나 200 인 부서의 사원들을 검색
emp_id emp_fname ---------------------------- 102 Fran 105 Matthew 160 Robert |
Some, Any연산자
- Some 연산자나 Any 연산자나 동일한 기능을 제공 - 다른 관계연산자와 결합된 형태로 사용
SELECT id, cust_id FROM sales_order WHERE order_date > SOME(SELECT ship_date FROM sales_order_items WHERE id = 2005)
--> sub-query 에서 조회된 결과들 중 가장 큰 값(<)을 선택해서 조건에 사용한다.
id cust_id -------------------- 2007 106 2008 107 2009 108
* 참고로 위의 예문은 아래와 같이 조회하더라도 동일한 결과를 얻을 수 있다 SELECT id, cust_id FROM sales_order WHERE order_date > (SELECT MAX(ship_date) FROM sales_order_items WHERE id = 2005)
|
Exists 연산자
SELECT fname, lname FROM customer WHERE EXISTS (SELECT * FROM sales_order)
--> 판매기록이 있는 모든 고객명 출력
fname lname ----------------------------- Almen de Joie Grover Pendelton Ling Ling Andrews Bubba Murphy |
ORDER BY (ASC[오름차순], DESC[내림차순]) - ORDER BY 절은 데이터의 정렬을 위해 사용합니다. - ASE, DESC를 지정하지 않는 경우 ASC[오름차순]이 디폴트값이다.
SELECT emp_id, emp_fname FROM employee WHERE dept_id = 100 ORDER BY emp_id ASC
또는 SELECT emp_id, emp_fname FROM employee WHERE dept_id = 100 ORDER BY 1 ASC
emp_id emp_fname ---------------------------- 102 Fran 105 Matthew 160 Robert
- ORDER BY 절에서 직접 컬럼명 또는 Alias를 지정하지 않고 컬럼을 순서에 해당하는 정수 값을 사용해도 된다. 이 경우 첫 번째 컬럼의 순서는 1 이다
| |