[SQL] SELECT / 함수

아임펭·2024년 5월 17일

SQL

목록 보기
6/9

1. SELECT

1) 데이터 조회

SELECT는 DML 명령어로 테이블의 데이터를 읽어 출력하는 동작을 위해 사용합니다.

DML 작업 시 기존에 있는 데이터를 조회 후 데이터를 삭제하거나, 수정할 때 많이 사용됩니다.

SQL 명령어 중 사용 빈도가 높고, 옵션이 많습니다.

2) 사용 형식

-- 기본 형식
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)

3) SELECT문 옵션

🟢 필드명

-- 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 '%천';
  • 패턴
    % : 복수개의 문자와 대응
    (%자리에는 임의 개수의 임의 문자)
    %A% : 위치 상관 없이 불러옴
    A% : A로 시작하는 것을 들고옴
    %A : A로 끝나는 것을 들고옴
    _ : 하나의 문자 대응
    [ ] : [ ] 안의 문자
    [^] : [^] 안에 포함된 문자 리스트에 포함되지 않는 하나의 문자와 대응

<범위 값 : 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이 있지만, 이 둘의 사용 용도는 차이가 있습니다.

  • WHERE
    조건을 제한하는 목적으로 해당되지 않은 조건은 결과 값에 포함을 하지 않습니다. 꼭 필요한 계산만 하여 데이터 과부하를 줄일 수 있습니다.
  • HAVING
    출력 시 출력을 제한 하는 용도로 조건에 대한 값은 있지만 그 값에 대한 출력만 제한합니다.

2. 함수

1) 연산자

연산자 종류연산자설명
비교연산자=, >, >=, <, <=값 비교 연산
SQL연산자BETWEEN a AND ba ~ b 사이의 값
IN(list)리스트 중 하나라도 일치하는 값
LIKE '비교문자열'%, _ 사용
IS NULLNULL 값인 경우
IS NOT NULLNULL 값이 아닌 경우
논리연산자AND조건이 true 일 때 true 결과
OR조건 중 하나만 true여도 true 결과
NOT조건과 반대 결과를 돌려줌
(true ↔ false)
부정 비교연산자!=, ^=, <>같지 않은 값
NOT 칼럼명 =~와 같지 않다
NOT 칼럼명 >~보다 크지 않다
부정 SQL연산자NOT BETWEEN a AND ba~b 값 사이가 아니다
NOT IN (list)list 값과 일치하지 않는다
IS NOT NULLNULL 값을 갖지 않는다

📌 연산자 우선순위
() → NOT 연산자 → 비교연산자, SQL 비교연산자 → AND → OR

2) 집계함수(Aggregate Function)

집계함수설명
COUNT(*)* 모든 칼럼, NULL 값을 포함한 행의 수 출력
COUNT(표현식)표현식의 값이 NULL을 제외한 행의 수 출력
SUM(DISTINCT/ALL)(표현식)표현식의 NULL 값을 제외한 합계를 출력
AVG(DISTINCT/ALL)(표현식)표현식의 NULL 값을 제외한 평균을 출력
MAX(DISTINCT/ALL)(표현식)표현식의 최대값 출력
MIN(DISTINCT/ALL)(표현식)표현식의 최소값 출력

✔ ALL : 디폴트 옵션, 모든 값 출력
✔ DISTINCT : 중복 값 제외
✔ COUNT(*) 외 모든 집계함수는 NULL을 무시한 통계 계산

3) 문자형 함수

문자형 함수설명
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)

4) 숫자형 함수

숫자형 함수설명
ABS(숫자)숫자의 절대값 반환
SIGN(숫자)숫자가 양수, 음수, 0을 구별
MOD(숫자 1, 숫자 2)숫자1을 2로 나눠 나머지 리턴
CEIL/CEILING(숫자)숫자보다 크거나 같은 최소 정수
FLOOR(숫자)숫자보다 작거나 같은 최대 정수 리턴
ROUND(숫자, (m)숫자를 소수점 m자리에서 반올림하여 리턴
TRUNC(숫자, (m)숫자를 소수 m자리에서 버림
STN, COS, TAN숫자의 삼각함수를 리턴

5) 날짜형 함수

날짜형 함수설명
SYSDATE/GETDATE()현재 날짜와 시간을 출력
EXTRACT('YEAR'/'MONTH'/'DAY')
DATEPART('YEAR'/'MONTH'/'DAY')
날짜 데이터에서 년/월/일 데이터 출력
(시, 분, 초 가능)
TO_NUMBER(TO_CHAR(d, 'YYYY')
YEAR(id)
날짜 데이터에서 년/월/일 출력
(MONTH, DAY 가능)

6) NULL 관련 함수

NULL 함수설명
NUL(표현식 1, 표현식 2)
ISNULL(표현식 1, 표현식 2)
표현식 1의 결과값이 NULL이면 표현식 2값 출력, 표현식 데이터타입이 같아야 함
NULLIF(표현식 1, 표현식 2)표현식 1이 표현식 2와 같으면 NULL, 같지 않으면 표현식 1을 리턴
COALESCE(표현식 1, 표현식 2..)임의의 개수 표현식에서 NULL이 아닌 최초의 표현식 나타냄, 모든 표현식이 NULL이면 NULL을 리턴
profile
I'm peng

0개의 댓글