마트철수

[044] SQL 기초 / SQL 고급 본문

KB IT's Your Life/교육

[044] SQL 기초 / SQL 고급

마트스 2024. 7. 10. 18:12

 

2024.07.10(수)
 
MySQL 2일차
 
해당 단원은 직접 코드를 작성해보는 게 중요할 것 같다.

 

  1. 어려웠던 부분 체크해서 다시 복습하기
  2. 노트북에도 DB 구축해두기

 


 
이것이 MySQL이다
 

PART01 MySQL 설치 및 DB 구축과정 미리 실습하기

  • CH01 DBMS 개요와 MySQL 소개
  • CH02 MySQL 설치
  • CH03 MySQL 전체 운영 실습

PART02 MySQL 기본

  • CH04 데이터베이스 모델링
  • CH05 MySQL 유틸리티 사용법
  • CH06 SQL 기본
  • CH07 SQL 고급

PART03 MySQL 고급

  • CH08 테이블과 뷰
  • CH09 인덱스
  • CH10 스토어드 프로그램
  • CH11 전체 텍스트 검색과 파티션

CH06 SQL 기본

 

SELECT문

특정 조건의 데이터만 조회

  • BETWEEN... AND: 범위 내의 값을 조회
WHERE age BETWEEN 20 AND 30;
  • IN( ): 여러 값을 OR로 연결하여 조회
WHERE addr IN ('경남', '전남', '경북');
  • LIKE ex) WHERE name LIKE '김%';
WHERE name LIKE '김%';

 

서브쿼리(SubQuery, 하위쿼리)

  • 단일형 서브쿼리: 쿼리문 안에 또 다른 쿼리문이 들어 있는 형태
SELECT * FROM employees WHERE dept_id = (SELECT dept_id FROM departments WHERE dept_name = 'Sales');

 

  • 다중행 쿼리: 서브쿼리의 결과가 둘 이상이 되면 에러 발생 → ANY, ALL, SOME 연산자 사용
  • ANY: 하나라도 만족하면 가능
WHERE salary > ANY (SELECT salary FROM employees WHERE dept_id = 10);
  • ALL: 모두 만족해야 함
WHERE salary > ALL (SELECT salary FROM employees WHERE dept_id = 10);

 

데이터 정렬: ORDER BY

  • 원하는 순서대로 정렬하여 출력
ORDER BY name ASC, age DESC;

 

중복 제거: DISTINCT

  • 중복된 값은 하나만 남김
SELECT DISTINCT addr FROM usertbl;

 

출력 개수 제한: LIMIT

  • 상위 N개만 출력
LIMIT 5;
  • 시작과 개수 지정
LIMIT 0, 5;

 

테이블 복사: CREATE TABLE ... SELECT

  • 새로운 테이블 생성과 동시에 데이터 복사
CREATE TABLE new_tbl AS SELECT * FROM old_tbl;

 

GROUP BY 및 HAVING 그리고 집계 함수

GROUP BY절

  • 집계 함수와 함께 사용하여 효율적인 데이터 그룹화
SELECT userID, SUM(amount) FROM buytbl GROUP BY userID;

 

HAVING 절

  • GROUP BY 결과에 조건 추가
SELECT userID, SUM(amount) FROM buytbl GROUP BY userID HAVING SUM(amount) >= 1000;

 

집계 함수

  • COUNT
SELECT COUNT(*) FROM usertbl;

 

  • ROLLUP: 중간 합계 또는 총합 계산
SELECT userID, SUM(amount) FROM buytbl GROUP BY userID WITH ROLLUP;

 

데이터의 변경을 위한 SQL문

데이터의 삽입: INSERT

  • 데이터를 테이블에 삽입
INSERT INTO testTbl1 (col1, col2, col3) VALUES (val1, val2, val3);

 

데이터의 수정: UPDATE

  • 기존 데이터를 수정
UPDATE testTbl1 SET col1 = val1, col2 = val2 WHERE condition;

 

데이터의 삭제: DELETE FROM

  • 데이터를 삭제
DELETE FROM testTbl1 WHERE condition;

 

조건부 데이터 입력, 변경

에러 발생 처리

  • 기본 키 중복 또는 값의 타입 불일치 시 에러 발생 가능
  • 대용량 데이터 처리 시 에러 발생하지 않은 구문만 실행

CRUD 기초

  • CREATE: 데이터 삽입 (INSERT)
  • READ: 데이터 조회 (SELECT)
  • UPDATE: 데이터 수정 (UPDATE)
  • DELETE: 데이터 삭제 (DELETE)

 

CH07.1 SQL 고급 - 데이터타입, 내장함수

 

MYSQL의 데이터 형식

숫자 데이터 형식

  • INT, FLOAT, DOUBLE 등

출처: 이것이 MySQL이다

 

문자 데이터 형식

 

  • CHAR(n), VARCHAR(n): 대소문자 구분 없음
  • BINARY(n), VARBINARY(n): 대소문자 구분

 

출처: 이것이 MySQL이다

 

실습

 

SQL 실습 절차

  1. sqldb TEMP 폴더에 파일 넣기
  2. File 탭에서 SQL 파일 열기
  3. '번개' 아이콘으로 실행
  4. SCHEMAS 새로고침

추가 예제

OR 사용 예제 + IS NOT NULL 사용 예제 + GROUP BY 사용 예제

-- OR을 사용해야 둘 중 하나만 만족해도 출력 가능
SELECT name, height
FROM usertbl
WHERE height = (SELECT MAX(height) FROM usertbl) OR height = (SELECT MIN(height) FROM usertbl);

-- SELECT COUNT(*) AS '휴대폰이 있는 사용자' FROM usertbl
-- WHERE mobile1 IS NOT NULL;
SELECT COUNT(mobile1) AS '휴대폰이 있는 사용자' FROM usertbl;

-- ~~ 별이 나오면 GROUP BY 예상 가능
SELECT userID AS '사용자', SUM(amount*price) AS '총구매액'
FROM buytbl
GROUP BY userID;

 

HAVING 사용 예제

 

-- 총 구매액이 1,000 이상인 사용자만 출력하세요
-- WHERE절은 그룹화하기 전에 필터링하는 작업이다
-- 따라서 그룹화된 데이터에 조건을 추가하려면 HAVING을 사용해야한다.
SELECT userID AS '사용자', SUM(amount*price) AS '총구매액'
FROM buytbl
GROUP BY userID
HAVING SUM(price*amount) >= 1000;

 

내장 함수 예제

  • LENGTH(), UPPER(), ROUND()
-- country 테이블 각 레코드의 Name 칼럼의 글자수를 표시하시오.
SELECT length(NAME) FROM country;

-- country 테이블의 나라명(Name 칼럼)을 앞 세글자만 대문자로 표시하시오)
-- UPPER: 특정 글자를 대문자로 변경
-- MID: 문자열 추출(문자열, 시작 위치, 길이), 시작 위치는 1부터 시작
SELECT UPPER(MID(name,1,2)) FROM country;

-- country 테이블의 기대수명을 소수점 첫째자리에서 반올림해서 표시하시오
-- ROUND: 반올림(반올림할 값, 몇째 자리에서 반올림할지) 
SELECT name AS '이름', round(lifeexpectancy, 1) as '기대수명' FROM country;

 

실습에서 헷갈렸던 예제

 

1. WHERE절은 그룹핑 하기 전에 적용됨!

별칭으로 정렬불가능 → SUM(POPULATION) 그대로 써야함

 

 

2. Having절

  • WHERE와 비슷한 개념으로 조건 제한하는 것인지만, 집계 함수에 대해서 조건을 제한하는 것
  • 꼭 GROUP BY절 다음에 나와야 함 (순서 바뀌면 안됨)