[혼공스] Chapter 03

·2024년 1월 14일
0
post-thumbnail

2주차 진도(1/8 ~ 1/14) : Chapter 03

실수로 나가기를 누르는바람에 정리한 내용들이 다 사라졌다...
임시저장을 잘 눌러야겠다...ㅠㅠㅠㅠㅠㅠㅠㅠㅠ


추가 업데이트 (2024.01.16.화)
없어진 것 보고 힘빠져서 정리를 멈췄지만 그래도 기록을 해야할 것 같아서 내용을 추가합니다.
족장님이 말씀하신대로 SQLD 시험 준비를 해보려고 합니다.
아직 신청기간이 아니라서 그 전까지 혼공스로 열심히 공부해보겠습니다!!


✅ 기본 미션

p. 138의 확인 문제 2번 풀고 인증하기

✅ 선택 미션

데이터 입력, 삭제하는 기본 형식 작성하기

데이터 입력 기본 형식

INSERT INTO {테이블 이름} [(열1, 열2, ...)] VALUES (값1, 값2, ...)

데이터 삭제 기본 형식

DELETE FROM {테이블 이름} WHERE {조건};


추가 업데이트 (2024.01.16.화)


(03-1) SELECT ~ FROM ~ WHERE


👷 데이터베이스 구축

1️⃣ 데이터베이스 만들기

DROP DATABASE IF EXISTS {DB 이름};
CREATE DATABASE {DB 이름};
  • DROP DATABASE : DB 삭제
  • CREATE DATABASE : DB 생성

2️⃣ 테이블 만들기

USE {DB 이름};
CREATE TABLE {테이블 이름}
( 열_1 		INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
  열_2    	VARCHAR(10) NOT NULL,
  ...
);
  • USE : DB 선택 (SELECT문 실행 위해 원하는 DB 반드시 지정)
    • ❗️MySQL 워크벤치 재시작 또는 새 쿼리 창 열면 USE 재지정 필요
  • CREATE TABLE : 테이블 생성
  • AUTO_INCREMENT : 자동으로 숫자 입력 (자동 숫자 증가)

3️⃣ 데이터 입력하기

INSERT INTO {테이블 이름} VALUES('{열1 값}', '{열2 값}', ...);
  • INSERT INTO : 데이터 입력
  • 자료형에 따른 값 입력 방법
    • CHAR, VARCHAR, DATE → 작은따옴표로 값 묶기
    • INT → 작은따옴표 없이 그냥 적기
      • AUTO_INCREMENT → 자동 입력되므로 값에 NULL 적기

4️⃣ 데이터 조회하기

  • 테이블 이름 표현 방식
    1. 원칙 : 'DB_이름.테이블_이름'
    2. 지정된 DB 이용 시 : '테이블_이름'만

⬇️ 기본 조회 형식

SELECT 
	{열 이름}
    FROM {테이블 이름}
    WHERE {조건식}
    

⬇️ 복잡 조회 형식

SELECT 
	{열 이름}
    FROM {테이블 이름}
    WHERE {조건식}
    GROUP BY {열 이름}
    HAVING {조건식}
    ORDER BY {열 이름}
    LIMIT {숫자}
;

⭐️ 열 이름 별칭(alias)

SELECT addr 주소, debut_date "데뷔 일자", mem_name FROM member;
  • 열 이름 다음에 별칭 작성
  • 별칭에 공백 O → 큰따옴표(")로 묶기

🌟 WHERE절 작성하기

  • 조회 결과에 특정 조건 추가해 원하는 데이터만 보고 싶을 때 사용

1️⃣ 관계 연산자 사용

SELECT mem_id, mem_name
	FROM member
    WHERE height <= 162;
  • 숫자 표현 데이터에 범위 지정 시 사용
  • 크다/작다/같다 등 지정
  • <, <=, >, >=, = 등

2️⃣ 논리 연산자 사용

SELECT mem_id, height, mem_name
	FROM member
    WHERE height <= 162 AND mem_number > 6;
  • 관계 연산자 2개 이상 나올 시 참/거짓 판별
  • AND : 2가지 이상의 조건 만족하도록 사용
  • OR : 2가지 이상의 조건 중 하나만 만족해도 되도록 사용

3️⃣ BETWEEN ~ AND

SELECT mem_id, mem_name
	FROM member
    WHERE height BETWEEN 163 AND 165;
  • 조건식에서 숫자 범위 사용 시 더 편리

4️⃣ IN()

SELECT mem_name, addr
	FROM member
    WHERE addr IN('경기', '전남', '경남');
  • 크다/작다 범위 지정할 수 없는 데이터의 경우 이용
  • OR 반복하는 것보다 더 편리

5️⃣ LIKE

SELECT *
	FROM member
    WHERE mem_name LIKE '우%';
  • 문자열 일부 글자 검색 시 사용
  • % : 모두 허용 시 사용
SELECT *
	FROM member
    WHERE mem_name LIKE '__핑크';
  • 언더바(_) : 한 글자 매치 위해 사용 → 2글자 = 언더바 2개


🌟 서브 쿼리(subquery, 하위 쿼리)

  • SELECT 안에 또 다른 SELECT 들어가는 것
  • 장점 : 하나의 SQL만 관리하면 되므로 간단해짐

이용 예시

  1. 평균 키(height) 알아내기 → 아래의 쿼리문으로 평균 키가 164임을 알아냄
SELECT height 
	FROM member 
    WHERE mem_name = '에이핑크';
  1. 164보다 평균 키(height)가 큰 회원 조회하기
SELECT mem_name, height 
	FROM member 
	WHERE height > 164;
  1. 2개의 쿼리문 합치기
SELECT mem_name, height 
	FROM member 
    WHERE height > (SELECT height FROM member WHERE mem_name = '에이핑크');



(03-2) SELECT문 심화


🌟 ORDER BY절

  • 결과 값이나 개수에 대해 영향 미치지 ❌
  • 결과 출력 순서 조절 ⭕️

1️⃣ 사용 예시

SELECT {열1}, {열2}, ...
	FROM {테이블 이름}
    ORDER BY {정렬 기준 열} DESC;
  • 정렬 방법
    • 기본값 : ASC → Ascending, 오름차순
    • 맨 뒤에 DESC 붙이기 → Descending, 내림차순

2️⃣ ORDER BY절 + WHERE절

SELECT {열1}, {열2}, ...
	FROM {테이블 이름}
    WHERE {조건식}
    ORDER BY {정렬 기준 열} DESC;
  • 함께 사용 ⭕️ → 순서 중요!!!
  • ❗️반드시 WHERE절 뒤에 ORDER BY절❗️

3️⃣ 정렬 기준 여러 개 지정

SELECT {열1}, {열2}, ...
	FROM {테이블 이름}
    WHERE {조건식}
    ORDER BY {첫번째 정렬 기준 열} DESC, {두번째 정렬 기준 열} ASC;
  • 첫번째 지정 열로 정렬 후, 동일할 경우 다음 지정 열로 정렬


🌟 LIMIT

  • 출력 개수 제한

형식

SELECT {열1}, {열2}, ...
	FROM {테이블 이름}
    WHERE {조건식}
    ORDER BY {정렬 기준 열} DESC
    LIMIT {시작}, {개수};
  • LIMIT 3 == LIMIT 0, 3
  • LIMIT {시작}, {개수} == LIMIT {개수} OFFSET {시작}


🌟 DISTINCT

SELECT DISTINCT {중복 제거 원하는 열} FROM member;
  • 조회 결과에서 중복 데이터 1개만 남김 = 중복 결과 제거


🌟 GROUP BY

  • 그룹 묶어주는 역할
  • 집계 함수 + GROUP BY절 → 데이터 그룹화(grouping)

⭐️ 집계 함수 (aggregate function)

SUM() 			-- 합계
AVG() 			-- 평균
MIN() 			-- 최소값
MAX() 			-- 최대값
COUNT() 		-- 행 개수 세기
COUNT(DISTINCT) -- 중복 1개만 인정해 행 개수 세기

사용 예시 1

SELECT {그룹 묶고 싶은 열}, SUM({집계 원하는 열}) 
	FROM {테이블 이름} 
    GROUP BY {그룹 묶고 싶은 열};

사용 예시 2 : 별칭 이용

SELECT {그룹 묶고 싶은 열} "{별칭}", SUM({집계 원하는 열}) "{별칭}"
	FROM {테이블 이름} 
    GROUP BY {그룹 묶고 싶은 열};

⭐️ HAVING절

  • WHERE과 비슷한 개념으로 조건 제한 → 집계 함수WHERE절에 나타날 수 ❌
  • 집계 함수에 대한 조건 제한
  • ❗️순서 반드시 GROUP BY절 + HAVING절❗️
SELECT {그룹 묶고 싶은 열} "{별칭}", SUM({집계 원하는 열}) "{별칭}"
	FROM {테이블 이름} 
    GROUP BY {그룹 묶고 싶은 열};
    HAVING {SUM({집계 원하는 열})에 부여하고 싶은 조건}
    ORDER BY {정렬 원하는 열} DESC;


(03-3) 데이터 변경 SQL문


🌟 INSERT

INSERT INTO {테이블 이름} [(열1, 열2, ...)] VALUES (값1, 값2, ...)
  • 테이블에 행 데이터 입력하는 기본적 SQL문
  • 열 순서 바꿔서 입력 또는 특정 열만 입력할 경우 → 열 이름 & 값을 원하는 순서로 작성

여러 개 INSERT문 한줄로 작성

INSERT INTO {테이블 이름} VALUES (값1, 값2, ...), (값3, ...), (값4, ...);

⭐️ AUTO_INCREMENT

  • 열 정의 시 1부터 증가하는 값 자동 입력
  • ❗️반드시 그 열을 PRIMARY KEY로 지정❗️
  • INSERT 시 해당 열 없다고 생각해 입력 → NULL값으로 채우기

현재 어느 숫자까지 증가되었는지 확인

SELECT LAST_INSERT_ID();

AUTO_INCREMENT 입력되는 다음 값을 100부터 시작

ALTER TABLE {변경하려는 테이블 이름} AUTO_INCREMENT=100;

AUTO_INCREMENT 입력되는 값 3씩 증가

SET @@auto_increment_increment=3; -- 증가값 3으로 지정

📖 시스템 변수

  • MySQL이 자체적으로 가지고 있는 설정값 저장된 변수
  • 앞에 @@ 붙음 → 값 확인하려면 SELECT @@{시스템변수} 실행
  • 전체 시스템 변수 종류 확인 → SHOW GLOBAL VARIABLES 실행

⭐️ INSERT INTO ~ SELECT

INSERT INTO {테이블 이름} (열1, 열2, ...)
	SELECT {넣고 싶은 데이터 조회하는 구문};
  • 다른 테이블 데이터 한 번에 입력
  • ❗️SELECT 문 열 개수 = INSERT할 테이블 열 개수❗️

DESC(Describe) 명령

DESC {DB 이름}.{테이블 이름};
  • 테이블 구조 출력 명령어
  • CREATE TABLE 어떻게 했는지 예상 가능


🌟 UPDATE

UPDATE {테이블 이름}
	SET {열1}={값1}, {열2}={값2}, ...
    WHERE {조건: 변경하고 싶은 열과 값 지정};
  • 기존 입력 값 수정
  • WHERE 생략 가능

⭐️ WHERE 없는 UPDATE

UPDATE {테이블 이름}
	SET {열1}={값1}, {열2}={값2}, ...;
  • ❗️WHERE 생략 시 테이블의 모든 행의 값 변경❗️

사용 예시: 인구 열을 보기 쉽게 10,000으로 나누기

UPDATE city_popul
	SET population = population / 10000;


🌟 DELETE

DELETE FROM {테이블 이름} WHERE {조건};
  • 행 단위 삭제
  • ❗️UPDATE처럼 WHERE절 생략 시, 전체 행 데이터 삭제❗️

⭐️ DELETE, DROP, TRUNCATE : 대용량 테이블 삭제

DELETE FROM {테이블 이름} WHERE {조건};
  • 빈 테이블 남김
  • 삭제 제일 오래 걸림
DROP {테이블 이름} WHERE {조건};
  • 테이블 자체 삭제
  • 순식간 삭제
TRUNCATE {테이블 이름} WHERE {조건};
  • DELETE와 동일 → 빈 테이블 남김
  • 매우 빠름 → 대량 행 데이터 모두 삭제 시, DELETE보다 훨씬 효율적

0개의 댓글