개발/sqld

[SQL/2과목] SELECT문과 구구절절...

2ivii 2025. 8. 17. 01:27

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 '비교연산자'의 경우 %나 _랑 쓴다했는데 %는 자리수 제한 없는 모든 이란 의미고, _는 하나 당 한 자리수라는 의미다.

 

  1. % 활용
    • '문자열%' : 특정 단어로 시작하는 값 찾기
    • '%문자열' : 특정 단어로 끝나는 값 찾기
    • '%문자열%' : 특정 단어를 포함하는 값 찾기
  2. _활용
    • '_문자%' : 두번째 글자가 해당 문자인 값 찾기. 뒤를 %처리했으니까 뒤따르는건 상관없다
    • '___' : _의 개수만큼의 글자 길이 값 찾기

뭔느낌인지 와닿았을거라고 믿는다!

 

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