SELECT
하나 또는 그 이상의 테이블에서 데이터를 추출하는 SQL의 데이터조작언어 중 하나
데이터베이스 중 하나 또는 그 이상의 테이블에서 데이터를 추출하기 위한 명령어
DML(Data Manipulation Language - 데이터 조작언어) 중 하나
형태
컬럼 그룹화
SELECT 컬럼 FROM 테이블 GROUP BY 그룹화할 컬럼;
조건 처리 후에 컬럼 그룹화
SELECT 컬럼 FROM 테이블 WHERE 조건식 GROUP BY 그룹화할 컬럼
컬럼 그룹화 후에 조건 처리
SELECT 컬럼 FROM 테이블 GROUP BY 그룹화할 컬럼 HAVING 조건식
조건 처리 후에 컬럼 그룹화 후에 조건 처리
SELECT 컬럼 FROM 테이블 WHERE 조건식 GROUP BY 그룹화할 컬럼 HAVING 조건식
ORDER BY가 존재하는 경우
SELECT 컬럼 FROM 테이블 [WHERE 조건식]
GROUP BY 그룹화할 컬럼 [HAVING 조건식] ORDER BY 컬럼1 [,컬럼2, 컬럼3..]
type 그룹화하여 name개수 조회 (컬럼 그룹화)
SELECT type, COUNT(name) AS cnt FROM hero_collection GROUP BY type
SELECT 컬럼 FROM 테이블
검색용도
--My_Table로 부터 모든 칼럼 조회
SELECT * FROM My_Table
--My_Table의 No_Emp, Nm_Kor, Age 칼럼 조회
SELECT No_Emp, Nm_Kor, Age FROM My_Table
WHERE
어떤 조건의 열을 불러올지 결정
--이름이 '홍길동'인 사람 검색
SELECT * FROM My_Table WHERE Nm_Kor = '홍길동'
--나이가 25살인 사원의 한국 이름과 나이 조회
SELECT Nm_Kor, Age FROM My_Table WHERE Age=25
--나이가 25살이 아닌 사원 조회
SELECT * FROM My_Table WHERE Age <> 25
--사원번호가 '0315'이고 나이가 25살보다 작거나 이름이 '홍길동'인 사원 조회
SELECT * FROM My_Table WHERE No_Emp='0315' AND (Age < 25 OR Nm_Kor = '홍길동')
--사원번호가 '0315'이거나 나이가 25살 이상이면서 이름이 '홍길동'인 사원 조회
SELECT * FROM My_Table WHERE No_Emp='0315' OR (Age >= 25 AND Nm_Kor='홍길동')
연산자 | 설명 |
= | 같다 |
<> | 같지 않다 |
!= | 같지 않다 |
< | ~보다 작다 |
<= | ~이상이다 |
> | ~보다 작다 |
>= | ~이하이다 |
!> | ~보다 크지않다 |
BETWEEN | 두 개의 특정한 값 사이 |
IS NULL | 값이 NULL이다 |
LIKE
~로 시작, 포함, 끝나는 단어
--'김'으로 시작하는 사원
SELECT * FROM My_Table WHERE Nm_Kor LIKE '김%'
--김이 중간에 들어가는 사원 조회
SELECT * FROM My_Table WHERE Nm_Kor LIKE '%김%'
--김으로 끝나는 사원의 사원번호
SELECT No_Emp FROM My_Table WHERE Nm_Kor LIKE '%김'
IN
~이거나
--나이가 20살, 24살, 26살인 사원 조회
SELECT * FROM My_Table WHERE Age IN(20, 24, 26)
--사원번호가 '0000', '0004', '0008'이고 나이가 20, 24, 28살인 사원 조회
SELECT * FROM My_Table WHERE No_Emp IN('0000', '0004', '0008') AND Age IN (20, 24, 28)
Between
~부터 ~까지
--나이가 20살~25살까지 사원조회
SELECT * FROM My_Table WHERE Age Between 20 AND 25
--사원번호가 '0000~0010'까지거나 나이가 30~40살인 사원의 이름 조회
SELECT Nm_Kor FROM My_Table WHERE (No_Emp BETWEEN '0000' AND '0010') OR (Age BETWEEN 30 AND 40)
LIMIT
개수 제한
위에서부터 자름
--나이가 가장 많은 사람 구하기
SELECT * FROM My_Table ORDER BY Age LIMIT 1
--나이가 많은 사람 중 2등부터 10명 구하기
--index 0부터 시작
SELECT * FROM My_Table ORDER BY Age LIMIT 1, 10
MIN, MAX, COUNT, SUM : 그룹함수
- 하나 이상의 행을 그룹으로 묶어 연산하여, 하나의 결과를 나타내는 함수이다.
- 그룹함수는 다른 연산자와 달리 해당 컬럼값이 NULL인 것은 제외하고 계산한다
SUM
- 해당 컬럼 값들에 대한 총합을 구하는 함수
--사원의 급여를 출력하되 단일행 함수 ROUND로 천단위 이하를 반올림
SELECT No_Emp, SAL, ROUND(SAL, -3) FROM My_Table
--그룹함수를 이용해 사원의 총 급여를 구함
SELECT SUM(SAL) FROM My_Table
AVG
- 평균을 구함
--사원 급여의 평균을 구함
SELECT AVG(SAL) FROM My_Table
MAX/MIN
- MAX : 지정한 컬럼 값 중에서 최대값을 구하는 함수
- MIN : 해당 커럼 값들의 최소값을 구하는 함수
--급여의 최대, 최소값
SELECT MAX(SAL), MIN(SAL) FROM EMP
COUNT
- 테이블에서 조건 만족하는 행위 개수를 반환하는 함수
- COUNT함수에서 특정 컬럼을 기술하는 경우 해당 컬럼 값을 갖고 있는 행의 개수를 계산하여 반환한다
- COUNT함수는 NULL값에 대한 개수를 세지 않는다
- 중복된 행까지 카운트 되는데 중복을 제거하고 싶다면 DISTINCT함수 사용
--사원들 중 커미션(COMM)을 받은 사원의 수를 구함
SELECT COUNT(COMM) FROM My_Table
--중복제거를 반영하여 담당업무의 개수구함
SELECT COUNT(DISTINCT JOB) 업무수 FROM My_Table
GROUP BY
특정 컬럼을 기준으로 그룹화하여 테이블에 존재하는 행들을 그룹별로 구분하기 위해 사용
그룹함수를 쓰되, 어떤 컬럼값을 기준으로 그룹함수를 적용할지 기술해야됨
--소속부서 번호로 그룹짓기
SELECT DEPTNO FROM My_Table GROUP BY DEPTNO
--소속 부서별 평균 급여 구하기
--그런데 이 경우에 어느 부서의 평균값인지의 정보가 결여되어져 나옴 AVG(SAL)열만 나옴
--어떤 부서의 평균인지 알아보기 위해 부서 번호도 SELECT절에 같이 기술해야됨
SELECT AVG(SAL) FROM My_Table GROUP BY DEPTNO
--위의 코드 수정
SELECT DEPTNO, AVG(SAL) FROM My_Table GROUP BY DEPTNO
--소속 부서별 급여 총액과 평균 급여
SELECT DEPTNO, SUM(SAL), AVG(SAL) FROM My_Table GROUP BY DEPTNO
--소속 부서별 최대 급여와 최소 급여를 구하는 쿼리문
SELECT DEPTNO AS 부서번호, MAX(SAL) AS 최대급여, MIN(SAL) AS 최소급여 FROM My_Table GROUP BY DEPTNO
--부서별 사원수와 커미션을 받는 사원의 수 계산
--COUNT(*)는 DEPTNO별 전체 카운트를 의미
SELECT DEPTNO, COUNT(*), COUNT(COMM) FROM My_Table GROUP BY DEPTNO
HAVING
GROUP BY 절에 의해 생성된 결과 값 중 원하는 조건에 부합하는 자료만 보고자 할 때 사용
WHERE | HAVING |
조건을 사용하여 결과를 제한 | 그룹의 결과를 제한 |
테이블에서 특정 조건에 부합하는 자료만을 검색할 때 사용 | 그룹함수를 적용해서 나온 결과값 중에서 원하는 조건에 부합하는 자료만 산출할 때 사용 |
단순 컬럼 | 그룹 함수 |
--그룹 지어진 부서별 평균 급여가 2000 이상인 부서의 번호와 부서별 평균 급여
SELECT DEPTNO, AVG(SAL) FROM My_Table GROUP BY DEPTNO
SELECT DEPTNO, AVG(SAL) FROM My_Table GROUP BY DEPTNO HAVING AVG(SAL) >= 2000
--부서의 최대값과 최소값을 구하되, 최대급여가 2900이상인 부서만 출력
SELECT DEPTNO, MAX(SAL), MIN(SAL) FROM My_Table GROUP BY DEPTNO HAVING MAX(AVG) >= 2900
ORDER BY
반환하는 열에 순서를 지정
SELECT 맨 마지막에 위치
Default값은 Ascending(오름차순)으로 ASC는 생략가능 내림차순 경우 DESC사용
--사원번호순으로 사원 출력
SELECT * FROM My_Table ORDER BY No_Emp
--3번째 열을 기준으로 정렬
SELECT * FROM My_Table ORDER BY 3
--여러 열을 기준으로 사용
-- 3번째 열을 기준으로 오름차순 정렬한 상태에서 1번째 열을 기준으로 내림차순으로 정렬
SELECT * FROM My_Table ORDER BY 3, 1 DESC;