2과목 1장에 대해서 이어서 포스팅 해보겠다. 이번 주제는 select문과 내부 절들.. 구구절절... 포스팅해보겠다.

SELECT 문
SELECT문
전 포스팅에서 언급했던것처럼, SELECT문은 데이터베이스 내에 들어있는 데이터를 조회하거나 검색하기 위한 명령어이다.
SELECT문은 6개의 절로 구성되어있다.
SELECT 컬럼명 | 함수
FROM 테이블명
WHERE 조건식
GROUP BY 컬럼명
HAVING 그룹조건식
ORDER BY 컬럼명 [ASC|DESC];
각 절은 위에같은 순서대로 작성해야된다! GROUP BY랑 HAVING은 바뀔 수는 있긴한데 위의 순서로 쓰는게 일반적이다. 근데 구문을 읽을때, 즉 실행할때는 이 순서로 읽지 않는다!
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY순이다.
어떤 테이블에서,, 어떤 조건을 걸어서 맞는 행에서,, 어떤 컬럼 기준으로 그룹핑하고,, 어떤 조건을 걸어서,, 최종적으로 고르고,,, 그걸 정렬 이런느낌!
alias
alias는 뜻 그대로 별칭을 주는 건데, SELECT문에서 별칭을 붙이는 것이다 예를 들어, SELECT name FROM employee AS e라는 구문이 있다면, employee라는 테이블에 e라는 별칭을 지어준 것이다! AS는 생략 가능하며, FROM employee e라고도 쓸 수 있다!
DISTINCT
DISTINCT는 SELECT문에서 중복된 데이터가 있는 경우 한 건으로 처리해서 출력한다. 디폴트 옵션은 ALL로, DISTINCT를 적어주지 않으면 그냥 중복된 데이터가 있어도 모두 출력된다. 예시를 하나 봐보자.
SELECT DISTINCT department_id
FROM employees;
이렇게 DISTINCT를 SELECT 뒤에 달아주면, employees테이블에서 특정 열에 중복된 값을 제거한 채로 결과를 낸다!
WHERE 절
WHERE절
WHERE절은 테이블의 데이터 중 원하는 조건에 맞는 데이터만 조회하고싶은 경우 사용한다. 필터링을 하는 것이기 때문에 여러 조건을 동시에 전달하는 것도 가능하다! AND나 OR로 조건 연결을 한다.
WHERE절은 FROM절 다음에 위치하며, 조건식은 아래 내용으로 구성된다.
- 칼럼 명 : 보통 조건식의 좌측에 위치
- 비교연산자
- 문자, 숫자, 표현식 : 보통 조건식의 우측에 위치
- 비교 컬럼명 : JOIN 사용시
SELECT age
FROM users
WHERE age >= 30
이 구문에서 WHERE절을 보면, 이제 age라는 컬럼이 WHERE뒤에 먼저 오고, >= 비교연산자 이후 숫자가 온다! 쪼인은 나중에 봐보자
연산자 종류
겁나게 많다. 표로 봐보자
| 구분 | 연산자 | 연산자의 의미 |
| 비교연산자 | = | 같다. |
| > | 보다 크다. | |
| >= | 보다 크거나 같다. | |
| < | 보다 작다. | |
| <= | 보다 작거나 같다. | |
| SQL연산자 | BETWEEN a AND b | a와 b의 값 사이에 있으며 되고, a랑b값은 포함이다. |
| IN (list) | 리스트에 있는 값 중에서 어느 하나라도 일치하면 된다. | |
| LIKE '비교문자열' | 비교문자열과 형태가 일치하면 된다.(%,_ 사용) | |
| IS NULL | NULL값인 경우 | |
| 논리연산자 | AND | 앞에있는 조건과 뒤에 있는 조건이 참이면 결과도 참 |
| OR | 앞뒤의 조건 중 하나만 참이면 결과도 참 | |
| NOT | 뒤에 오는 조건에 반대되는 결과를 되돌려준다. | |
| 부정비교연산자 | != | 같지않다. |
| ^= | 같지않다. | |
| <> | 같지않다. | |
| NOT 칼럼명 = | ~ 와 같지 않다. | |
| NOT 칼럼명 > | ~보다 크지 않다. | |
| 부정 SQL연산자 | NOT BETWEEN a AND b | a와b의 값 사이에 있지 않는거고, a랑b값도 포함하지 않는다. |
| NOT IN (list) | list값과 일치하지 않는다. | |
| IS NOT NULL | NULL 값을 갖지 않는다. |
주의사항으로는 Oracle은 문자 상수의 경우 대소문자를 구분하는데 MSSQL의 경우에는 기본적으로 문자상수의 대소문자를 구분하지 않는다! 활용법은 문제를 풀면서 터득해라.. 제일 안와닿았던 LIKE에 대해서만 간단히 설명하겠다!
LIKE 연산자
LIKE '비교연산자'의 경우 %나 _랑 쓴다했는데 %는 자리수 제한 없는 모든 이란 의미고, _는 하나 당 한 자리수라는 의미다.
- % 활용
- '문자열%' : 특정 단어로 시작하는 값 찾기
- '%문자열' : 특정 단어로 끝나는 값 찾기
- '%문자열%' : 특정 단어를 포함하는 값 찾기
- _활용
- '_문자%' : 두번째 글자가 해당 문자인 값 찾기. 뒤를 %처리했으니까 뒤따르는건 상관없다
- '___' : _의 개수만큼의 글자 길이 값 찾기
뭔느낌인지 와닿았을거라고 믿는다!
NULL의 연산
연산을 할 때, NULL도 잘 신경써야된다. NULL의 연산은 일반적인 값의 연산과 매우 다르게 동작한다!!
- NULL에 다른 숫자를 더하거나 빼는 등 산술연산을 하면, 그 결과는 항상 NULL이다.
- NULL값과의 비교 연산은 False를 리턴한다.
- 실은 원칙적으로는 모두 Unknown이다. SQL의 논리체계는 3값 논리(True, False, Unknown)이기 때문이다.
- 근데 WHERE절에서는 True가 아닌 값들은 모두 제외하기때문에, Unknwon이나 False나 모두 제외되기때문에 설명 편의상 그냥 노랭이책에서는 False를 리턴한다고 말한다고한다.
- 특정 값보다 크다 또는 적다라고 표현할 수 없다.
- NULL을 찾을 때에는 IS NULL이나 IS NOT NULL을 써야된다!
- Oracle에서는 빈문자열('')를 NULL과 동일하게 취급하지만, MSSQL에서는 빈문자열('')과 NULL은 다른 값으로 구분한다.
GROUP BY 절, HAVING 절
GROUP BY절
각 행을 특정 조건에 따라 그룹으로 분리하여 계산하도록 하는 구문식이다.
- GROUP BY절에 그룹을 지정할 컬럼을 전달하며 그룹 연산에 제외할 대상이 있다면 WHERE절에서 미리 해당 행을 제외한다.
- GROUP BY절을 통해 소그룹별 기준을 정하고, SELECT 절에 집계 함수를 사용한다. 이때, SELECT에는 GROUP BY에서 정한 소그룹 또는 집계함수만이 올 수 있다.
- alias 사용이 불가하다
HAVING절
그룹 함수 결과를 조건으로 사용할 때 사용하는 절이다.
- WHERE절로는 그룹을 제한할 수 없으므로(왜냐면 GROUP BY보다 WHERE이 먼저 수행되니까) HAVING절로 조건을 표시한다.
- HAVING절이 GROUP BY보다 먼저 올 수는 있긴한데 뒤에 쓰는게 대다수 권장~~
예시
예시 간단하게 보여주고 넘어가겠따
SELECT department, AVG(salary) AS "평균 급여"
FROM employees
GROUP BY department
HAVING AVG(salary) >= 5000;
employees라는 테이블에서 department로 GROUP BY를 했다 그러면 department는 컬럼별로 그룹이 생길거다. 예를들어 department에 '인사팀', '개발팀', '마케팅팀'이 있다면 얘네 끼리 그룹을 만드는거다. 근데 이제 HAVING절로 조건을 건다. salary의 평균이 5000이상인 그룹, 즉 department 그룹만 고르는거다! 그럼 걔네들만 조회를 하는 것이다.
ORDER BY 절
ORDER BY절
조회된 결과를 특정 열의 값을 기준으로 정렬할 때 사용된다. SELECT ... FROM .. ORDER BY [정렬기준 열] [ASC | DESC] 와 같은 형태로 쓰이며 당연히 뒤에는 오름차순인지 내림차순인지이다! ASC 즉 오름차순이 디폴트이다.
특징
- 기본적인 정렬 순서는 오름차순이다
- 숫자형 데이터 타입은 오름차순으로 정렬했을 경우에 가장 작은 값부터 출력된다
- 날짜형 데이터 타입은 오름차순으로 정렬했을 경우 날짜 값이 가장 이른 값이 먼저 출력된다
- 오라클에서는 NULL값을 가장 큰 값으로 간주하여 오름차순으로 정렬했을 경우에는 가장 마지막에, 내림차순으로 정렬했을 경우에는 가장 먼저 위치한다
- MSSQL에서는 NULL값을 가장 작은 값으로 간주하여 오름차순으로 정렬했을 경우에는 가장 먼저, 내림차순으로 정렬했을 경우에는 가장 마지막에 위치한다
이번 포스팅에서는 SELECT문과 여러 절들에 대해 살펴봤다 ~ 다음엔 이제 함수들에 대해 정리해보겠다!
'개발 > sqld' 카테고리의 다른 글
| [SQL/2과목] 조인이란? (5) | 2025.08.21 |
|---|---|
| [SQL/2과목] 함수(1) - 단일행함수 (0) | 2025.08.20 |
| [SQL/2과목] 관계형 데이터베이스 개요 (3) | 2025.08.16 |
| [SQL/1과목] 함수종속성이란? (1) | 2025.08.12 |
| [SQL/1과목] 정규화란? (2) | 2025.08.11 |