SELECT SQL
SELECT SQL의 구조
SELECT Predicate [테이블 명.] 속성명1, [테이블명 .] 속성명2, ···
FROM 테이블명1, 테이블명2, ···
[WHERE 조건]
[GROUP BY 속성명1, 속성명2, ···]
[HAVING 조건]
[ORDER BY 속성명[ASC | DESC]];
SELECT 절 - 검색하여 불러올 속성(열) 또는 속성을 이용한 수식을 지정함
Predicate - 불러올 튜플 수를 제한할 명령어를 기술함
구분 | 내용 |
ALL | 모든 튜플을 검색할 때 지정하는 것으로, 주로 생략함 |
DISTINCT | 중복된 튜플이 있으면 그 중 첫 번째 한 개만 검색함 |
DISTINCTROW | 중복된 튜플을 제거하고 한 개만 검색하지만 선택된 속성의 값이 아닌, 튜플 전체를 대상으로 함 |
FROM 절 - 질의에 의해 검색될 데이터들을 포함하는 테이블명을 기술함
WHERE 절 - 검색할 조건을 기술함
구분 | 내용 |
비교 연산자 | =, <>, >, >=, <, <=, IN |
논리 연산자 | NOT, AND, OR |
LIKE | 대표문자를 이용해 지정된 속성의 값이 문자패턴과 일치하는 튜플만 검색함 |
SQL에서 사용하는 대표문자
문자 | 내용 |
* 또는 % | 모든 문자를 대표 |
? 또는 _ | 한 자리 문자를 대표 |
# | 한 자리 숫자를 대표 |
연산자 종류
종류 | 연산자 | 우선순위 |
산술연산자 | X, /, +, - | 왼쪽에서 오른쪽으로 갈수록 낮아짐 |
관계연산자 | =, <>, >, >=, <, <= | 모두 같음 |
논리연산자 | NOT, AND, OR | 왼쪽에서 오른쪽으로 갈수록 낮아짐 |
산술, 관계, 논리연산자가 함께 사용되었을 때는 산술 > 관계 > 논리 순으로 우선순위
연산자 순서로 연산자 우선순위가 정해짐
SELECT, FROM, WHERE 해보기
SELECT * FROM 수강생 WHERE 과목 = '수학'
AND 주소 = '학교'
수강생 테이블에서 과목이 수학이고 주소가 학교인 모든 튜플을 조회
SELECT * FROM 수강생 WHERE 이름 LIKE '신%'
수강생 테이블에서 이름이 '신'으로 시작하는 모든 튜플을 조회
SELECT * FROM 수강생 WHERE 수강료 BETWEEN 40 AND 80
수강생 테이블에서 수강료가 40이상 80이하인 모든 튜플을 조회
SELECT * FROM 수강생 WHERE 과목 IS NULL
수강생 테이블에서 과목이 NULL인 모든 튜플을 조회
GROUP BY 절 - 특정 속성을 기준으로 그룹화하여 검색할 때 그룹화할 속성을 지정함
종류 | 내용 |
COUNT(속성명) | 그룹별 튜플 수를 구하는 함수 |
MAX(속성명) | 그룹별 최대값을 구하는 함수 |
MIN(속성명) | 그룹별 최소값을 구하는 함수 |
SUM(속성명) | 그룹별 합계를 구하는 함수 |
AVG(속성명) | 그룹별 평균을 구하는 함수 |
IS NULL | 조건을 지정하는 WHERE 절에서 속성의 값이 NULL인 것을 검색함 |
IS NOT NULL | 조건을 지정하는 WHERE 절에서 속성의 값이 NULL이 아닌 것을 검색함 |
HAVING 절 - GROUP BY와 함께 사용되며, 그룹에 대한 조건을 지정함
ORDER BY 절 - 특정 속성을 기준으로 정렬하여 검색할 때 사용함
종류 | 내용 |
ASC | 오름차순으로 정렬 |
DESC | 내림차순으로 정렬 |
(생략) | 생략된 경우에는 오름차순으로 정렬 |
ORDER BY, HAVING 해보기
SELECT * FROM 수강생 WHERE 과목 = '데이터베이스'
ORDER BY 이름 DESC
수강생 테이블에서 과목이 데이터베이스인 튜플 이름 기준 내림차순으로 조회
SELECT 과목 COUNT(*) AS 수강생수
FROM 수강생
WHERE 수강료 >= 100
GROUP BY 과목
HAVING COUNT(*)>=2
수강생 테이블에서 수강료가 100이상인 과목별 수강생이 2명 이상인 수강생수 조회
기본 검색 해보기
SELECT * FROM 사원;
SELECT 사원.* FROM 사원;
SELECT 이름, 부서, 생일, 주소, 기본급 FROM 사원;
SELECT 사원.이름, 사원.부서, 사원.생일, 사원.주소, 사원.기본급 FROM 사원;
<사원> 테이블의 모든 튜플을 조회
SELECT DISTINCT 부서
FROM 사원;
<사원> 테이블에서 부서만 검색하되, 같은 부서는 한 번만 조회
SELECT Trim(이름), "월급은" AS 이름, 기본급+10 AS 기본급
FROM 사원
종류 | 내용 |
Trim | 문자열의 좌우 공백을 제거하는 함수 |
LTrim | 문자열의 왼쪽 공백만 제거할 때 사용함 |
RTrim | 문자열의 오른쪽 공백만 제거할 때 사용함 |
<사원> 테이블에서 이름에 문자열 “월급은”, 기본급에 10을 더한 값을 조회
(이름 속성에 있을지 모르는 좌우 공백을 모두 제거)
조건 지정 검색 해보기
SELECT *
FROM 사원
WHERE 부서 = '기획'
<사원> 테이블에서 부서가 ‘기획’이고, 기본급이 110보다 큰 튜플을 조회
SELECT *
FROM 사원
WHERE 부서 = '기획' OR 부서 = '인터넷'
SELECT *
FROM 사원
WHERE 부서 IN ('기획', '인터넷');
<사원> 테이블에서 부서가 ‘기획’이거나 ‘인터넷’인 튜플을 조회
SELECT *
FROM 사원
WHERE 이름 LIKE '김%';
<사원> 테이블에서 이름의 첫 번째 글자가 ‘김’인 모든 튜플을 조회
SELECT *
FROM 사원
WHERE 기본급 BETWEEN 85 AND 95;
<사원> 테이블에서 기본급이 85에서 95 사이인 튜플을 조회
SELECT *
FROM 사원
WHERE 주소 IS NULL;
<사원> 테이블에서 주소가 NULL인 튜플을 조회
정렬 검색 해보기
SELECT *
FROM 사원
WHERE 부서 = '기획'
ORDER BY 이름;
<사원> 테이블에서 부서가 '기획'인 튜플을 검색, 이름을 기준으로 오름차순 조회
SELECT *
FROM 사원
ORDER BY 부서 ASC, 이름 DESC;
<사원> 테이블의 모든 튜플들을 검색, 부서를 기준으로 오름차순 정렬하고
정렬된 같은 부서에 대해서는 이름을 기준으로 내림차순 조회
그룹 검색 해보기
SELECT 부서, COUNT(*) AS 사원수
FROM 사원
WHERE 기본급>=100
GROUP BY 부서
HAVING COUNT(*) >=2;
<사원> 테이블에서 기본급이 100 이상인 사원이 2명 이상인 부서의 부서명과 사원수를 조회
하위 질의
SELECT 이름, 주소
FROM 사원
WHERE 이름 IN (SELECT 이름 FROM 여가활동 WHERE 취미='나이트댄스');
<여가활동> 테이블에서 취미가 ‘나이트댄스’인 사원 이름을 조회 후
<사원> 테이블에서 해당 사원의 이름과 주소를 검색
SELECT *
FROM 사원
WHERE 이름 NOT IN (SELECT 이름 FROM 여가활동);
여가활동을 하지 않는 사원들을 조회
복수 테이블 검색
SELECT 사원.이름, 사원.부서, 여가활동.취미, 여가활동.경력
FROM 사원, 여가활동
WHERE 여가활동.경력 >= 10 AND 사원.이름 = 여가활동.이름;
경력이 10년 이상인 사원의 이름, 부서, 취미, 경력을 조회
통합(UNION) 질의
SELECT *
FROM 임원
UNION SELECT *
FROM 직원;
<임원> 테이블과 <직원>테이블 같은 레코드가 중복되지 않게 조회