갈림길 이정표

SQL 문법 및 개념 훈련 연습 본문

Programming Language/SQL (Maria DB)

SQL 문법 및 개념 훈련 연습

이몽뇽 2020. 7. 31. 20:18

SQL 문법 & 처리 순서

 SELECT
            column(s)
 FROM
                table(s)
 WHERE
        condition(s)
 GROUP BY
             column(s)
 HAVING
  aggregate function condition(s)
 ORDER BY
             column(s)
⑤ 데이터(레코드)
조회
테이블 확인 ② 조건에 맞는
데이터 추출
③ 묶음 출력
(그룹화)
④ 조건에 맞는
그룹 추출
⑥ 특정 column
오름/내림 차순
~을 출력하라  어떤 테이블에서 ~ 조건에 맞는 분류된
데이터 종류따라
그룹함수 조건
만족시키는 그룹
~ 순으로

 

그렇다면 나도 처리 순서 대로 생각하면 되지 않을까? 🤔

 테이블 확인 ② 조건에 맞는
데이터 추출
③ 묶음 출력
(그룹화)
④ 조건에 맞는
그룹 추출
⑤ 데이터(레코드)
조회
⑥ 특정 column
오름/내림 차순
어떤 테이블에서 ~ 조건에 맞는 분류된
데이터 종류따라
그룹함수 조건
만족시키는 그룹
~을 출력하라 ~ 순으로
더보기

FROM 테이블 확인
    - 필요시 JOIN 가능
      (FROM 테이블1.명 JOIN 테이블2.명 ON (연결할)칼럼1from테이블1.명 = 칼럼2from테이블2.명)
② WHERE 조건에 맞는 데이터 추출
③ GROUP BY 묶음 출력 (그룹화)
④ HAVING 그룹 조건 (aggregate function)에 맞는 그룹 추출
- COUNT, MAX, MIN, AVG, SUM, VARIANCE (분산), STDDEV (표준편차)
※ COUNT (NULL 제외 하고 셈 ⇒ ∴ * 이 더 정확)
※ 따라서 AVG 할 때도 nvl() 써서 NULL을 0으로 취급한 후 계산 해야함.
※ MIN, MAX:
여러 건의 데이터를 입력 받아서 순서대로 정렬 후 그 중에 최대/최소 값을 추출이 원리 때문에 시간이 오래 걸리는 함수 중 하나, 인덱스를 활용하는 것을 적극 권장

  • 반드시 하나의 값만을 반환한다.
  • NULL 값은 무시된다.
  • NULL 값이 무시되지 않으려면 NVL, NVL2와 같은 함수를 이용한다.
  • GROUP BY 설정 없이 일반 컬럼과 기술될 수 없다.            (출처: keep-cool.tistory.com/37)

 

⑤ SELECT 데이터(레코드)조회
    - 조회할 데이터가 다른 테이블에서 참조하는 값이면 같은 형태와 값을 가진 칼럼들이 존재한다면 JOIN 가능
    - 
⑥ ORDER BY 특정 column 오름/내림 차순


예제 문제 : 

+------+--------+--------+------+----------+----------+
| 사번 | 이름   | 부서   | 직급 | 근무년수 | 고객확보 |
+------+--------+--------+------+----------+----------+
|    1 | 홍두깨 | 총무부 | 이사 |       11 | O        |
|   29 | 박가희 | 총무부 | 사원 |        3 | X        |
+------+--------+--------+------+----------+----------+

 

 

 

 

자주 쓰이는 OPERATER

 

한번이라도 쓰인 OPERATER

 

DISTINCT

  • WHAT? 같은 칼럼 내 중복되지 않는 레코드 나열
  • WHEN? 칼럼에 존재하는 모든 레코드 종류를 알고 싶을 때 (결국 GROUP BY 기능이랑 같음)
  • WHERE? SELECT 뒤에 바로
더보기

ex. DB 데이터 중 직급의 종류를 모두 알고 싶어 (NULL 포함)

MariaDB [test]> SELECT jikwon_jik FROM jikwon GROUP BY jikwon_jik;
+------------+
| jikwon_jik |
+------------+
| NULL       |
| 과장       |
| 대리       |
| 부장       |
| 사원       |
| 이사       |
+------------+
6 rows in set (0.001 sec)

MariaDB [test]> SELECT DISTINCT jikwon_jik FROM jikwon;
+------------+
| jikwon_jik |
+------------+
| 이사       |
| 부장       |
| 과장       |
| 대리       |
| NULL       |
| 사원       |
+------------+
6 rows in set (0.001 sec)

ex. DB 데이터 중 성별과 직급 조합의 모든 경우의 수를 알고 싶어

MariaDB [test]> SELECT DISTINCT jikwon_gen, jikwon_jik FROM jikwon ORDER BY jikwon_gen;
+------------+------------+
| jikwon_gen | jikwon_jik |
+------------+------------+
| 남         | 과장       |
| 남         | 대리       |
| 남         | 부장       |
| 남         | 사원       |
| 남         | 이사       |
| 여         | NULL       |
| 여         | 과장       |
| 여         | 대리       |
| 여         | 부장       |
| 여         | 사원       |
+------------+------------+
10 rows in set (0.001 sec)

※ DISTINCT 와 GROUP BY 차이
DISTINCT: 그룹핑 만 해줌
(고유 기능: COUNT() 함수로 데이터 종류 수를 알고 싶을 때 SELECT COUNT(DISTINCT jikwon_jik) FROM jikwon;)
GROUP BY: 그룹핑 + 정렬 같이 해줌 (두가지 기능이 있으니 더 느린 처리 속도)
(고유 기능: COUNT 외 SELECT 집계함수() 되어 있는 경우)

LIMIT 숫자

  • WHAT? 상단열 부터 출력값(보여지는 값) 개수 제한 (LIMIT 5; [= 상위 5열까지의 결과만 출력]
  • WHEN? ORDER BY 오름차순, 내림차순 과 같이 쓰면 좋음
  • WHERE? 보통 맨 오른쪽 끝쪽에 쓴다

 

헷갈리는 개념:

 

ANY vs. ALL

더보기

엇 상반된 개념 이네 ⇒ ANY (최소값 보다 큰 ... , 최대값 보다 작은 ...)
엇 비슷한 개념 이네 ⇒ ALL (최소값 보다 작은 ... , 최대값 보다 큰...)
~ 값보다 작은  <ANY,ALL (SELECT ...)
~ 값보다 큰  >ANY,ALL (SELECT ...)

Comments