DML
| 유형 | 설명 |
|---|
SELECT | 칼럼에 저장된 데이터 조회 |
INSERT | 칼럼에 데이터 추가 |
UPDATE | 칼럼에 저장된 데이터 수정 |
DELETE | 칼럼에 저장된 데이터 삭제 |
SELECT 명령어
SELECT [ALL | DISTINCT] 속성명1, 속성명2 [AS 별칭], ...
FROM 테이블명1, ...
[WHERE 조건]
[GROUP BY 속성명1, ...]
[HAVING 그룹조건]
[ORDER BY 속성 [ASC | DESC]];
SELECT 절
- ALL : 모든 튜플 검색 (중복 허용)
- DISTINCT : 중복된 속성 조회될 경우 한개만 검색 (중복 비허용)
- AS : 속성명 별칭 사용 가능
- 그 외
| 문법 | 설명 |
|---|
| IFNULL(컬럼, ‘값’) | 조회 시 컬럼의 값이 NULL이면 ‘값’으로 치환하여 반환 |
| DATE_FORMAT(컬럼, 형식) | %Y : 4자리 연도 (2023) %y : 2자리 연도 (23) %m : 2자리 월 (01-12) %d : 2자리 일 (01-31) %H : 24시간 형식 (00-23) %i : 분 (00-59) %s : 초 (00-59) |
| LEFT(문자열, 길이) | 문자열의 왼쪽부터 길이 개수만큼 문자열 반환 |
| SUBSTRING(문자열, 시작위치, 길이) | 문자열의 시작위치부터 길이 개수만큼 문자열 반환 |
CASE WHEN 조건1 THEN 값1 WHEN 조건2 THEN 값2 WHEN 조건3 THEN 값3 ELSE 값4 END | 조건1 만족시 값1 반환 조건2 만족시 값2 반환 조건3 만족시 값3 반환 모두 만족하지 않으면 4 반환 ※ END로 CASE문이 끝났음을 명시해야 함 |
| FLOOR(나눗셈연산) | 나눗셈 연산에 대한 몫 |
| MOD(나눗셈연산) | 나눗셈 연산에 대한 나머지 |
| ROUND(숫자, N) | 숫자를 반올림하여 N째 자리까지 출력 EX. ROUND(123.24,1) ⇒ 123.2 |
| |
- MAX를 함부로 쓰면 안되는 이유
FOOD_PRODUCT 테이블에서 가격이 제일 비싼 식품의 식품 ID, 식품 이름, 식품 코드, 식품분류, 식품 가격을 조회하는 SQL문을 작성해주세요.
SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, MAX(PRICE) AS PRICE
FROM FOOD_PRODUCT;
=> 틀린 이유
: PRICE만 MAX값이 나오고 나머지 컬럼에 대해서는 0번째 행의 값이 나옴
MAX PRICE인 행 - P0051 맛있는배추김치 CD_KC00001 김치 19000
0번째 행 - P0001 맛있는라면 CD_ND00001 면 3780
WHERE 절
- 검색 조건 서술
- 컬럼명에는 따옴표 생략, 속성값에는 따옴표 작성
- 문법
| 연산자 | 설명 |
|---|
| <>, != | 값이 다름 |
| BETWEEN 값1 AND 값2 | 컬럼 >= 값1 AND 컬럼 <= 값2 |
| IN, NOT IN (값1, 값2, …) | 포함 여부 |
| LIKE | % : 0개 이상의 문자열과 일치 |
| [] : 1개 이상의 문자와 일치 / ex. [AB]% : A 또는 B로 시작하는 문자열 |
| [^] : 1개 이상의 문자와 불일치 |
| _ : 특정 위치의 1개 문자와 일치 |
| IS NULL, IS NOT NULL | 컬럼이 [NULL인 데이터 / NULL이 아닌 데이터] 조회 |
GROUP BY 절
- 속성값을 그룹으로 분류
- 예제 급여테이블
| 이름 | 직책 | 부서 | 급여 |
|---|
| 김철수 | 차장 | 마케팅 | 5000 |
| 한유리 | 차장 | 전산 | 4800 |
| 신짱구 | 사원 | 마케팅 | 2500 |
| 이훈이 | 사원 | 마케팅 | 2700 |
SELECT 부서, SUM(급여) AS 급여합계
FROM 급여
GROUP BY 부서;
SELECT 직책, 부서, SUM(급여) AS 급여합계
FROM 급여
GROUP BY 직책, 부서;
| 직책 | 부서 | 급여합계 |
|---|
| 차장 | 마케팅 | 5000 |
| 차장 | 전산 | 4800 |
| 사원 | 마케팅 | 5200 |
HAVING 절
- GROUP BY에 의해 분류한 후
그룹에 대한 조건 지정
- 예제 급여테이블
| 이름 | 직책 | 부서 | 급여 |
|---|
| 김철수 | 차장 | 마케팅 | 5000 |
| 한유리 | 차장 | 전산 | 4800 |
| 신짱구 | 사원 | 마케팅 | 2500 |
| 이훈이 | 사원 | 마케팅 | 2700 |
SELECT 직책, 부서, SUM(급여) AS 급여합계
FROM 급여
GROUP BY 직책, 부서
HAVING SUM(급여) >= 5000;
| 직책 | 부서 | 급여합계 |
|---|
| 차장 | 마케팅 | 5000 |
| 사원 | 마케팅 | 5200 |
ORDER 절
- 속성값을 정렬
- EX.
ORDER BY 학점 DESC, 이름 ASC;
- 학점에 대해 내림차순 정렬
- 같은 값이 존재할 경우 이름에 대해 오름차순 정렬
LIMIT 절
JOIN 명령어
: 두 개 이상의 테이블을 연결하여 데이터 검색
INNER JOIN
공통 존재 컬럼의 값이 같은 경우를 추출
- FROM 테이블1 A [INNER] JOIN 테이블2 B ON 조인조건
OUTER JOIN
- LEFT OUTER JOIN
왼쪽 테이블의 모든 데이터 + 오른쪽 테이블의 동일 데이터
- RIGHT OUTER JOIN
- 왼쪽 테이블의 동일 데이터 +
오른쪽 테이블의 모든 데이터
- FULL OUTER JOIN
왼쪽 테이블의 모든 데이터 + 오른쪽 테이블의 모든 데이터
CROSS JOIN
SELF JOIN
예제
[도서]
| 책번호 | 책명 |
|---|
| 111 | 운영체제 |
| 222 | 자료구조 |
| 555 | 컴퓨터구조 |
[도서가격]
| 책번호 | 가격 |
|---|
| 111 | 20000 |
| 222 | 25000 |
| 333 | 10000 |
| 444 | 15000 |
SELECT A.책번호, A.책명, B.가격
FROM 도서 A JOIN 도서가격 B
ON A.책번호 = B.책번호;
| A.책번호 | A.책명 | B.가격 |
|---|
| 111 | 운영체제 | 20000 |
| 222 | 자료구조 | 25000 |
SELECT A.책번호, A.책명, B.책번호, B.가격
FROM 도서 A LEFT JOIN 도서가격 B
ON A.책번호 = B.책번호;
| A.책번호 | A.책명 | B.책번호 | B.가격 |
|---|
| 111 | 운영체제 | 111 | 20000 |
| 222 | 자료구조 | 222 | 25000 |
| 555 | 컴퓨터구조 | | |
SELECT A.책번호, A.책명, B.책번호, B.가격
FROM 도서 A RIGHT JOIN 도서가격 B
ON A.책번호 = B.책번호;
| A.책번호 | A.책명 | B.책번호 | B.가격 |
|---|
| 111 | 운영체제 | 111 | 20000 |
| 222 | 자료구조 | 222 | 25000 |
| NULL | NULL | 333 | 10000 |
| NULL | NULL | 444 | 15000 |
SELECT A.책번호, A.책명, B.책번호, B.가격
FROM 도서 A FULL JOIN 도서가격 B
ON A.책번호 = B.책번호;
| A.책번호 | A.책명 | B.책번호 | B.가격 |
|---|
| 111 | 운영체제 | 111 | 20000 |
| 222 | 자료구조 | 222 | 25000 |
| NULL | NULL | 333 | 10000 |
| NULL | NULL | 444 | 15000 |
| 555 | 컴퓨터구조 | NULL | NULL |
SELECT A.책번호, A.책명, B.가격
FROM 도서 A CROSS JOIN 도서가격 B;
| A.책번호 | A.책명 | B.책번호 | B.가격 |
|---|
| 111 | 운영체제 | 111 | 20000 |
| 111 | 운영체제 | 222 | 25000 |
| 111 | 운영체제 | 333 | 10000 |
| 111 | 운영체제 | 444 | 15000 |
| 222 | 자료구조 | 111 | 20000 |
| 222 | 자료구조 | 222 | 25000 |
| 222 | 자료구조 | 333 | 10000 |
| 222 | 자료구조 | 444 | 15000 |
| 555 | 컴퓨터구조 | 111 | 20000 |
| 555 | 컴퓨터구조 | 222 | 25000 |
| 555 | 컴퓨터구조 | 333 | 10000 |
| 555 | 컴퓨터구조 | 444 | 15000 |
[도서]
| 책번호 | 책명 | 선수과목_책번호 |
|---|
| 111 | 운영체제 | 222 |
| 222 | 자료구조 | 555 |
| 555 | 컴퓨터구조 | NULL |
SELECT A.책번호, A.책명, B.책번호, B.책명
FROM 도서 A SELF JOIN 도서 B
ON A.선수과목_책번호 = B.책번호;
| A.책번호 | A.책명 | B.책번호 | B.책명 |
|---|
| 111 | 운영체제 | 222 | 자료구조 |
| 222 | 자료구조 | 555 | 컴퓨터구조 |
서브쿼리
: SQL문 안에 포함된 또 다른 SQL문
→ 알려지지 않은 기준을 위한 검색을 위해 사용
FROM 절 서브쿼리
SELECT MAX(가격) AS 가격
FROM 도서가격 A,
(SELECT 책번호
FROM 도서
WHERE 책명='자료구조') B
WHERE A.책번호 = B.책번호;
WHERE 절 서브쿼리
SELECT MAX(가격) AS 가격
FROM 도서가격
WHERE 책번호 IN (SELECT 책번호
FROM 도서
WHERE 책명='자료구조');
집합 연산자
UNION
UNION ALL
INTERSECT
MINUS
예제
[EMP 테이블]
| EMPNO | ENAME | JOB | SAL |
|---|
| 1001 | 홍길동 | 대리 | 1000 |
| 1002 | 임꺽정 | 과장 | 1500 |
| 1003 | 장길산 | 차장 | 2000 |
| 1004 | 강은미 | 부장 | 2500 |
SELECT ENAME
FROM EMP
WHERE SAL <= 2000
UNION
SELECT ENAME
FROM EMP
WHERE SAL >= 1500;
SELECT ENAME
FROM EMP
WHERE SAL <= 2000
UNION ALL
SELECT ENAME
FROM EMP
WHERE SAL >= 1500;
SELECT ENAME
FROM EMP
WHERE SAL <= 2000
INTERSECT
SELECT ENAME
FROM EMP
WHERE SAL >= 1500;
SELECT ENAME
FROM EMP
WHERE SAL <= 2000
UNION
SELECT ENAME
FROM EMP
WHERE SAL >= 1500;
INSERT 명령어
INSERT INTO 학생(학번, 성명, 학년, 수강과목)
VALUES (6677, '장길산', 3, '수학');
UPDATE 명령어
UPDATE 학생
SET 주소 = '인천'
WHERE 이름 = '장길산';
학생 테이블에서 이름이 ‘장길산’인 튜플의 주소를 ‘인천’으로 변경
DELETE 명령어
DELETE FROM 학생
WHERE 이름 = '장길산';
학생 테이블에서 이름이 ‘장길산’인 튜플 삭제
다중 행 연산자
| 연산자 | 설명 |
|---|
| IN | 리턴되는 값 중 조건에 해당하는 값이 있으면 참 |
| ANY | 서브쿼리에 의해 리턴되는 값들 중 조건을 만족하는 값 1개 이상이면 참 |
| ALL | 서브쿼리에 의해 리턴되는 모든 값이 조건 값을 만족해야만 참 |
| EXISTS | 서브쿼리의 결과 중 메인쿼리 비교 조건을 만족하는 값 하나라도 존재하면 참 |
집계 함수
| 집계 함수 | 설명 |
|---|
| COUNT | 줄 수 반환 |
| SUM | 합계 계산 |
| AVG | 평균 계산 |
| MAX | 최댓값 계산 |
| MIN | 최솟값 계산 |
| STDDEV | 표준편차 계산 |
| VARIANCE | 분산 계산 |