SELECT는 DML 명령어로 테이블의 데이터를 읽어 출력하는 동작을 위해 사용합니다.
DML 작업 시 기존에 있는 데이터를 조회 후 데이터를 삭제하거나, 수정할 때 많이 사용됩니다.
SQL 명령어 중 사용 빈도가 높고, 옵션이 많습니다.
-- 기본 형식
SELECT 필드목록 FROM 테이블
[WHERE 조건]
[GROUP BY 그룹항목]
[HAVING 그룹조건]
[ORDER BY 정렬기준]
📌 실행 순서
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
1 - 조회할 테이블을 선택(FROM)
2 - 조건을 적용(WHERE)
3 - 그룹 지정(GROUP BY)
4 - 그룹 조건에 맞게 출력(HAVING)
5 - 해당되는 필드목록(SELECT)
6 - 정렬하여 조회(ORDER BY)
🟢 필드명
-- SELECT 필드목록 FROM 테이블명
SELECT * FROM city;
필드목록에는 테이블의 필드명을 입력하거나,
*을 통해 전체 필드를 출력하거나,
COUNT(), SUM(), AVG() 등 집계 함수를 사용하여 필드 목록을 조회할 수 있습니다.
🟢 별명지정
-- SELECT 필드명 [AS] "별명" ~
SELECT name AS "도시명", area AS "면적", popu AS "인구" FROM city;
AS 를 붙여 필드명을 별명으로 지정하여 출력할 수 있습니다.
🟢 계산값 출력
SELECT name, popu * 1000 AS "인구" FROM city;
계산식을 사용하여 테이블에 없는 정보도 만들어서 표시할 수 있습니다.
🟢 WHERE 조건
SELECT * FROM city WHERE area > 1000;
WHERE절을 통해 조건을 지정하여 해당되는 값만 조회할 수 있습니다.
주로 필드와 특정 값을 비교하는 조건문 형태로 작성하며, WHERE 절은 DELETE, UPDATE 등 명령어 내에서도 사용 가능합니다.
🟢 연산자
<NULL 비교>
WHERE 필드명 IS NULL : NULL 값 찾기
WHERE 필드명 IS NOT NULL : NULL 아닌 값 찾기
<논리연산자>
두 개 이상 조건을 동시에 검색할 때는 AND, OR 논리 연산자를 사용
WHERE popu >= 100 AND area >= 700
WHERE popu >= 100 OR area >= 700
<문자열 검색 : LIKE>
패턴으로 '부분 문자열'을 검색하기 위해 사용합니다.
SELECT * FROM city WHERE name LIKE '%천%';
SELECT * FROM city WHERE name NOT LIKE '%천';
<범위 값 : BETWEEN>
'BETWEEN 최소값 AND 최대값'으로 두 값 사이의 범위를 제한하기 위해 사용합니다.
(최소값 이상, 최대값 이하 로 지정되면 미만/초과로는 지정 불가)
대소 구분만 가능하다면 사용가능하고, 문자열, 날짜에도 사용할 수 있습니다.
SELECT * FROM staff WHERE name BETWEEN '가' AND '사';
SELECT * FROM staff WHERE joindate BETWEEN '20150101' AND '20180101';
<일치 값 : IN>
IN 연산자는 불연속적인 값 여러 개의 목록을 제공하여 이 목록과 일치하는 레코드를 검색합니다.
값 개수에 제한은 없고, LIKE와 결합해서 사용은 불가능합니다.
IN으로 일치하는 값, NOT IN으로 제외 값을 확인할 수 있습니다.
-- IN
SELECT * FROM city WHERE region IN ('경상', '전라');
-- NOT IN
SELECT * FROM city WHERE region NOT IN ('경상', '전라');
<중복 제거 : DISTINCT>
중복된 값을 제거하기 위해서는 DISTNCT를 사용합니다.
중복 제거하고자 하는 필드명 앞에 DISTNCT를 작성하면 됩니다.
SELECT DISTNCT region FROM tcity;
🟢 페이지 출력
<페이징 : LIMIT>
SQL 표준이 아닌 마리아DB에서 사용되는 방식입니다.
LIMIT 구문으로 행의 수를 제한하여 출력할 수 있습니다.
SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT [건너뛸 개수], 총 개수
-- 예시
SELECT * FROM city ORDER BY area DESC LIMIT 4;
-- 앞에서 부터 4개 데이터만 출력
✔ [건너뛸 개수], 총개수로 입력하며, 건너뛸 개수가 0일 경우는 생략이 가능합니다.
<페이징 : OFFSET FETCH>
LIMIT를 SQL 표준에서 사용할 수 있는 명령어입니다.
ORDER BY문의 옵션으로 ORDER BY문과 함께 사용해야 합니다.
SELECT ... FROM ... WHERE ... [ORDER BY 기준필드 OFFSET 건너뛸행수 ROWS FETCH NEXT 출력할행수 ROWS ONLY]
-- 예시
SELECT * FROM city ORDER BY area DESC OFFSET 0 ROWS FETCH NEXT 4 ROWS ONLY;
🟢 ORDER BY
ORDER BY는 조회된 값의 정렬 순서를 지정할 수 있습니다. (오름차순/내림차순)
별도의 정렬 순서 지정이 없을 경우 DBMS의 디폴트 순서에 따릅니다.
-- 기본형식
ORDER BY 필드 [ASC | DESC]
① ASC : 오름차순, DESC : 내림차순
(값 생략 시 오름차순(ASC))
② 두 개 이상의 기준 필드 지정 가능
→ 첫 번째 기준 필드의 값이 같으면, 두 번째 기준필드를 비교하여 정렬 순서를 결정
SELECT region, name, area, popu FROM city ORDER BY region ASC, name DESC;
-- 첫 번째 기준 필드로 정렬 후 동일 값이 있으면 두 번째 기준 필드로 정렬
③ 테이블에 존재하지 않는 계산 값을 정렬 기능으로 사용 가능
SELECT name, popu * 1000 / area FROM city ORDER BY popu * 1000 / area;
-- AS 값으로 지정
SELECT name, popu * 1000 / area AS tmp FROM city ORDER BY tmp;
🟢 GROUP BY
GROUP BY는 조건에 맞는 그룹에 대한 통계를 냅니다.
기준이 되는 필드를 적어 기준 필드가 같은 레코드를 모아 통계값을 구할 수 있습니다.
SELECT depart, AVG(salary) FROM staff GROUP BY depart;
✔ GROUP BY는 그룹핑하는 역할만 수행하며, 어떤 통계를 낼 것인지는 필드 목록의 집계 함수에 따라 변동
✔ GROUP BY는 중복 값에 대한 그룹핑을 하기 때문에 중복 값이 있을 때만 의미가 있음
✔ 기준 필드를 콤마로 구분하여 두 개 이상도 쓸 수 있음
<그룹 조건 : HAVING>
GROUP BY 조건절로 GROUP BY 다음에 오며 통계 결과 중 출력할 그룹의 조건을 지정합니다.
SELECT depart, AVG(salary) FROM staff GROUP BY depart HAVING AVG(salary) >= 340;
✔ 결과에서 HAVING 조건에 맞는 레코드만 출력
📌 WHERE과 HAVING의 차이
조건 값을 입력할 수 있는 항목으로 WHERE과 HAVING이 있지만, 이 둘의 사용 용도는 차이가 있습니다.
| 연산자 종류 | 연산자 | 설명 |
|---|---|---|
| 비교연산자 | =, >, >=, <, <= | 값 비교 연산 |
| SQL연산자 | BETWEEN a AND b | a ~ b 사이의 값 |
| IN(list) | 리스트 중 하나라도 일치하는 값 | |
| LIKE '비교문자열' | %, _ 사용 | |
| IS NULL | NULL 값인 경우 | |
| IS NOT NULL | NULL 값이 아닌 경우 | |
| 논리연산자 | AND | 조건이 true 일 때 true 결과 |
| OR | 조건 중 하나만 true여도 true 결과 | |
| NOT | 조건과 반대 결과를 돌려줌 (true ↔ false) | |
| 부정 비교연산자 | !=, ^=, <> | 같지 않은 값 |
| NOT 칼럼명 = | ~와 같지 않다 | |
| NOT 칼럼명 > | ~보다 크지 않다 | |
| 부정 SQL연산자 | NOT BETWEEN a AND b | a~b 값 사이가 아니다 |
| NOT IN (list) | list 값과 일치하지 않는다 | |
| IS NOT NULL | NULL 값을 갖지 않는다 |
📌 연산자 우선순위
() → NOT 연산자 → 비교연산자, SQL 비교연산자 → AND → OR
| 집계함수 | 설명 |
|---|---|
| COUNT(*) | * 모든 칼럼, NULL 값을 포함한 행의 수 출력 |
| COUNT(표현식) | 표현식의 값이 NULL을 제외한 행의 수 출력 |
| SUM(DISTINCT/ALL)(표현식) | 표현식의 NULL 값을 제외한 합계를 출력 |
| AVG(DISTINCT/ALL)(표현식) | 표현식의 NULL 값을 제외한 평균을 출력 |
| MAX(DISTINCT/ALL)(표현식) | 표현식의 최대값 출력 |
| MIN(DISTINCT/ALL)(표현식) | 표현식의 최소값 출력 |
✔ ALL : 디폴트 옵션, 모든 값 출력
✔ DISTINCT : 중복 값 제외
✔ COUNT(*) 외 모든 집계함수는 NULL을 무시한 통계 계산
| 문자형 함수 | 설명 |
|---|---|
| LOWER('문자열') | 문자열을 소문자로 변경 |
| UPPER('문자열') | 문자열을 대문자로 변경 |
| ASCII('문자') | 문자나 숫자를 ASCII 코드로 변경 |
| CHR/CHAR(ASCII번호) | ASCII 코드를 문자나 숫자로 변경 |
| CONCAT(문자열1, 문자열2) | 문자열 1, 문자열 2 연결 |
| SUBSTR/SUBSTRING(문자열, m(,n)) | 문자열 중 m위치에서 n개 문자 길이에 해당하는 문자 반환 |
| LENGTH/LEN(문자열) | 문자열의 개수를 숫자로 돌려줌 |
| LTRIN(문자열(지정문자)) | 문자열에서 지정 문자가 나타날 때 문자제거 |
| RTRIM(문자열(지정문자)) | |
| TRIM(지정문자 from 문자열) | 문자열에서 머리말, 꼬리말, 양쪽에 지정문자 제거 (leading, trailing, both) |
| 숫자형 함수 | 설명 |
|---|---|
| ABS(숫자) | 숫자의 절대값 반환 |
| SIGN(숫자) | 숫자가 양수, 음수, 0을 구별 |
| MOD(숫자 1, 숫자 2) | 숫자1을 2로 나눠 나머지 리턴 |
| CEIL/CEILING(숫자) | 숫자보다 크거나 같은 최소 정수 |
| FLOOR(숫자) | 숫자보다 작거나 같은 최대 정수 리턴 |
| ROUND(숫자, (m) | 숫자를 소수점 m자리에서 반올림하여 리턴 |
| TRUNC(숫자, (m) | 숫자를 소수 m자리에서 버림 |
| STN, COS, TAN | 숫자의 삼각함수를 리턴 |
| 날짜형 함수 | 설명 |
|---|---|
| SYSDATE/GETDATE() | 현재 날짜와 시간을 출력 |
| EXTRACT('YEAR'/'MONTH'/'DAY') DATEPART('YEAR'/'MONTH'/'DAY') | 날짜 데이터에서 년/월/일 데이터 출력 (시, 분, 초 가능) |
| TO_NUMBER(TO_CHAR(d, 'YYYY') YEAR(id) | 날짜 데이터에서 년/월/일 출력 (MONTH, DAY 가능) |
| NULL 함수 | 설명 |
|---|---|
| NUL(표현식 1, 표현식 2) ISNULL(표현식 1, 표현식 2) | 표현식 1의 결과값이 NULL이면 표현식 2값 출력, 표현식 데이터타입이 같아야 함 |
| NULLIF(표현식 1, 표현식 2) | 표현식 1이 표현식 2와 같으면 NULL, 같지 않으면 표현식 1을 리턴 |
| COALESCE(표현식 1, 표현식 2..) | 임의의 개수 표현식에서 NULL이 아닌 최초의 표현식 나타냄, 모든 표현식이 NULL이면 NULL을 리턴 |