SQL을 공부해보자

sun_ovo·2024년 11월 4일

SQL

목록 보기
1/1

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 부서;
부서급여합계
마케팅10200
전산4800
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;
    1. 학점에 대해 내림차순 정렬
    2. 같은 값이 존재할 경우 이름에 대해 오름차순 정렬

LIMIT 절

  • EX. LIMIT N;
    • 상위부터 N개의 레코드만 출력

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컴퓨터구조

[도서가격]

책번호가격
11120000
22225000
33310000
44415000
  • 내부 조인
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운영체제11120000
222자료구조22225000
555컴퓨터구조
  • 오른쪽 외부 조인
SELECT A.책번호, A.책명, B.책번호, B.가격
FROM 도서 A RIGHT JOIN 도서가격 B
ON A.책번호 = B.책번호;
A.책번호A.책명B.책번호B.가격
111운영체제11120000
222자료구조22225000
NULLNULL33310000
NULLNULL44415000
  • 완전 외부 조인
SELECT A.책번호, A.책명, B.책번호, B.가격
FROM 도서 A FULL JOIN 도서가격 B
ON A.책번호 = B.책번호;
A.책번호A.책명B.책번호B.가격
111운영체제11120000
222자료구조22225000
NULLNULL33310000
NULLNULL44415000
555컴퓨터구조NULLNULL
  • 교차 조인
SELECT A.책번호, A.책명, B.가격
FROM 도서 A CROSS JOIN 도서가격 B;
A.책번호A.책명B.책번호B.가격
111운영체제11120000
111운영체제22225000
111운영체제33310000
111운영체제44415000
222자료구조11120000
222자료구조22225000
222자료구조33310000
222자료구조44415000
555컴퓨터구조11120000
555컴퓨터구조22225000
555컴퓨터구조33310000
555컴퓨터구조44415000
  • 셀프 조인

[도서]

책번호책명선수과목_책번호
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 테이블]

EMPNOENAMEJOBSAL
1001홍길동대리1000
1002임꺽정과장1500
1003장길산차장2000
1004강은미부장2500
  • UNION
SELECT ENAME
FROM EMP
WHERE SAL <= 2000
UNION
SELECT ENAME
FROM EMP
WHERE SAL >= 1500;
ENAME
임꺽정
장길산
  • UNION ALL
SELECT ENAME
FROM EMP
WHERE SAL <= 2000
UNION ALL
SELECT ENAME
FROM EMP
WHERE SAL >= 1500;
ENAME
홍길동
임꺽정
장길산
임꺽정
장길산
강은미
  • INTERSECT
SELECT ENAME
FROM EMP
WHERE SAL <= 2000
INTERSECT
SELECT ENAME
FROM EMP
WHERE SAL >= 1500;
ENAME
임꺽정
장길산
  • MINUS
SELECT ENAME
FROM EMP
WHERE SAL <= 2000
UNION
SELECT ENAME
FROM EMP
WHERE SAL >= 1500;
ENAME
홍길동

INSERT 명령어

INSERT INTO 학생(학번, 성명, 학년, 수강과목)
VALUES (6677, '장길산', 3, '수학');
  • 숫자는 따옴표 X, 문자는 따옴표 O

UPDATE 명령어

UPDATE 학생
SET 주소 = '인천'
WHERE 이름 = '장길산';
  • 학생 테이블에서 이름이 ‘장길산’인 튜플의 주소를 ‘인천’으로 변경

DELETE 명령어

DELETE FROM 학생
WHERE 이름 = '장길산';
  • 학생 테이블에서 이름이 ‘장길산’인 튜플 삭제

다중 행 연산자

연산자설명
IN리턴되는 값 중 조건에 해당하는 값이 있으면 참
ANY서브쿼리에 의해 리턴되는 값들 중 조건을 만족하는 값 1개 이상이면 참
ALL서브쿼리에 의해 리턴되는 모든 값이 조건 값을 만족해야만 참
EXISTS서브쿼리의 결과 중 메인쿼리 비교 조건을 만족하는 값 하나라도 존재하면 참

집계 함수

집계 함수설명
COUNT줄 수 반환
SUM합계 계산
AVG평균 계산
MAX최댓값 계산
MIN최솟값 계산
STDDEV표준편차 계산
VARIANCE분산 계산
profile
개발자의 기초 다지기 ₍ ᐢ. ̫ .ᐢ ₎

0개의 댓글