[혼공SQL] 2주차 - Ch03 SQL 기본 문법

cup-wan·2024년 1월 14일
0

1) 기본 중에 기본 SELECT ~ FROM ~ WHERE

SELECT 는 말 그대로 데이터를 선택하는 문법이다. 사용자가 원하는 데이터를 선택(조회)하는 문법이기에 가장 많이 사용된다.

실습 데이터 알아보기

1. DROP DATABASE / CREATE DATABASE

DROP DATABASE IF EXISTS market_db; -- 만약 market_db가 존재하면 우선 삭제한다.
CREATE DATABASE market_db;
  • DROP DATABASE : 데이터베이스 삭제, IF EXISTS가 붙으면 기존에 이미 데이터베이스가 있을 때만 DROP문을 실행한단 뜻
  • CREATE DATABASE : 데이터베이스 생성

2. USE / VARCHAR

USE market_db;
CREATE TABLE member -- 회원 테이블
( mem_id  		CHAR(8) NOT NULL PRIMARY KEY, -- 사용자 아이디(PK)
  mem_name    	VARCHAR(10) NOT NULL, -- 이름
  ...
);
  • USE market_db; : 사용할 DB 선택 ➡️ 1주차의 SCHEMAS 패널에서 데이터베이스 더블 클릭해 선택한 것과 동일
  • VARCHAR : 1주차에 사용한 CHAR은 고정형, VARCHAR은 가변형이다. 후에 더욱 자세히 설명

3. AUTO INCREMENT / INSERT

  CREATE TABLE buy -- 구매 테이블
(  num 		INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -- 순번(PK)
...
)
INSERT INTO member VALUES('TWC', '트와이스', 9, '서울', '02', '11111111', 167, '2015.10.19');
  • AUTO_INCREMENT : 자동으로 1씩 증가하는 숫자를 입력
  • INSERT : 데이터를 입력해주는 것

기본 조회하기 : SELECT ~ FROM

1. SELECT 문의 기본 형식

SELECT select_expr
	[FROM table_references]
    [WHERE where_condition]
    [GROUP BY {col_name / expr / position}
    [HAVING where_condition]
    [ORDER BY {col_name / expr / position}
    [LIMIT {[offset,] row_count / row_count OFFSET offset}]

되게 복잡해 보이니 조금 쉽게 해석..? 해보자

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

이게 SELECT의 전부이다. (CH03 ~ CH04)
이번엔 SELECT, FROM, WHERE에 대해 알아보자

2. SELECT와 FROM

USE market_db;
SELECT * FROM member;

SELECT 열_이름 FROM 테이블_이름

  • USE는 앞에서 설명, 내가 앞으로 작성할 쿼리를 적용할 데이터베이스를 선택
  • SELECT 내가 원하는 열 FROM 테이블 이름
    • "*" 은 전체를 의미
    • FROM 뒤의 member는 원래 maket_db.member 이지만 데이터베이스를 USE를 통해 선택했기 때문에 member(테이블 이름)만 작성 가능

특정한 조건만 조회하기: SELECT ~ FROM ~ WHERE

1. SELECT ~ FROM ~의 한계

쿠팡에서 고객을 매번 SELECT로 불러오면 매번 너무 많은 결과를 출력해야한다 ➡️ 조건을 추가해서 원하는 데이터만 SELECT하면 되겠다

2. 기본적인 WHERE절

SELECT * FROM member WHERE mem_name='블랙핑크';

SELECT 열_이름 FROM 테이블_이름 WHERE 조건식

  • SELECT ~ FROM ~ : 앞에서 설명한 내용과 동일
  • WHERE mem_name='블랙핑크';
    • 조건이 mem_name='블랙핑크'
    • mem_name이 CHAR이기 때문에 작은 따옴표 사용
    • 만약 조건이 숫자형이라면 작은따옴표 필요 X
    SELECT * FROM member WHERE mem_number = 4;

3. 관계 연산자, 논리 연산자의 사용

  • 관계 연산자 ( <, <=, >, >=, = )
SELECT mem_id, mem_name
	FROM member
    WHERE height <= 162;

조회(SELECT) ➡️ mem_id, mem_name, 열 이름
어디서?(FROM) ➡️ member, 테이블 이름
조건(WHERE) ➡️ height가 162 이하

  • 논리 연산자 (AND, OR, NOT...)
SELECT mem_name, height, mem_number
	FROM member
    WHERE height >= 165 AND mem_number > 6;

조회(SELECT) ➡️ mem_name, height, mem_number, 열 이름
어디서?(FROM) ➡️ member, 테이블 이름
조건(WHERE) ➡️ height가 165 이상 그리고 mem_number가 6 초과

4. BETWEEN ~ AND

  • AND 사용
SELECT mem_name, height
	FROM member
    WHERE height >= 163 AND height <= 165;

조회(SELECT) ➡️ mem_name, height, 열 이름
어디서?(FROM) ➡️ member, 테이블 이름
조건(WHERE) ➡️ height가 163 이상 그리고 height가 165 이하 = height가 163~165 사이였으면 좋겠어요!

  • 범위 조건 BETWEEN ~ AND 사용
SELECT mem_name, height
	FROM member
    WHERE height BETWEEN 163 AND 165;

AND만 사용했을 때와 결과는 똑같다

5. IN()

  • OR 사용
SELECT mem_name, addr
	FROM member
    WHERE addr = '경기' OR addr = '전남' OR addr = '경남';

조회(SELECT) ➡️ mem_name, addr, 열 이름
어디서?(FROM) ➡️ member, 테이블 이름
조건(WHERE) ➡️ addr이 경기 또는 addr이 전남 또는 addr이 경남

숫자로 구성된 데이터는 BETWEEN ~ AND 사용해서 간결했는데 문자 데이터는 어떻게 할까?

  • IN() 사용
SELECT mem_name, addr
	FROM member
    WHERE addr IN('경기', '전남', '경남')

결과는 OR 사용 시와 같지만 훨씬 간편하게 사용 가능하다
조건식에서 여러 문자 중 하나에 포함되는지 비교할 때 IN()

6. LIKE

  • 문자 일부 글자 검색 시 LIKE 사용
  • '우%' ➡️ '우'로 시작, 뒤에는 아무거나(%)
  • 한 글자 매치 = '_' (언더바) 사용
    • '__핑크' = 앞에 두 글자 아무거나 + 핑크
    • '_왕' = 앞에 한 글자 아무거나 + 왕
SELECT *
	FROM member
    WHERE mem_name LIKE '우%'

SELECT *
	FROM member
    WHERE mem_name LIKE '__핑크'


2) 좀 더 깊게 알아보는 SELECT 문

ORDER BY

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

ORDER BY 열 이름
LIMIT 숫자

ORDER BY는 결과값을 어떤 순서로 출력할지 조절

1. ASC, DESC

  • ASC : Ascending, 오름차순, Default값 = 생략 가능
  • DESC : Descending, 내림차순
SELECT mem_id, mem_name, debut_date
	FROM member
    ORDER BY debut_date DESC;

2. WHERE / ORDER BY 순서

  • SQL은 작성 순서대로 실행
  • WHERE 앞에 ORDER BY가 있으면
    • ORDER BY로 순서 정렬
    • WHERE 조건에 맞게 찾아서 다시 난장판 -> 오류
  • WHERE 뒤에 ORDER BY가 있으면
    • WHERE 조건에 맞게 데이터 찾음
    • ORDER BY로 조건에 맞는 데이터 정렬 -> 성공

➡️ 결론 : WHERE이 ORDER BY보다 앞에 있어야 한다.

3. 정렬 조건 다수

SELECT mem_id, mem_name, debut_date, height
	FROM member
	WHERE height >= 164
	ORDER BY height DESC, debut_date ASC;

  • 트와이스와 잇지의 키가 167로 똑같음
  • 키가 같으면 debut_date에 따라 정렬하고 싶음
    • 먼저 키에 정렬 조건
    • 그 다음 데뷔날 정렬 조건

4. 출력 개수 제한 : LIMIT

SELECT mem_name, height
	FROM member
	ORDER BY height DESC
	LIMIT 3, 2;

LIMIT 시작, 개수

  • 정렬하고 내가 원하는 개수만큼만 데이터를 뽑고 싶음
  • 키를 내림차순으로 정렬
  • LIMIT 3, 2;
    • 3번째 부터 2개를 뽑아주세요

5. 중복 결과 제거 : DISTINCT

1) 그냥 지역 SELECT

SELECT addr FROM member;


정렬 X 중복 O

2) 정렬 ORDER BY

SELECT addr FROM member ORDER BY addr;

정렬 O, 중복 O

3) 중복 제거 DISTINCT

SELECT DISTINCT addr FROM member;


정렬 X, 중복 X

4) 정렬 + 중복 제거

SELECT DISTINCT addr FROM member ORDER BY addr;

정렬 O, 중복 X


GROUP BY 절

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

GROUP BY 열 이름
HAVING 조건식

GROUP BY는 어떤 그룹으로 묶어주는 역할

1. 집계 함수

함수명설명
SUM()합계
AVG()평균
MIN()최소값
MAX()최대값
COUNT()행의 개수
COUNT(DISTINCT)행의 개수(중복 제거)

2. GROUP BY 활용

SELECT mem_id, SUM(amount) FROM buy GROUP BY mem_id;

SELECT 열 이름, SUM(amount) : 열 이름, SUM(amount) 조회
FROM buy : 테이블 buy에서
GROUP BY mem_id : mem_id로 묶어서

  • SUM(amount) "총 구매 개수" ➡️ 열 이름 "총 구매 개수"로 변경 가능
  • SUM(price*amount) "총 구매 금액" ➡️ 집계 함수 안에서 계산 가능
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
	FROM buy GROUP BY mem_id;

3. HAVING 절

SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
	FROM buy GROUP BY mem_id;

여기에서 총 구매액 1000이상인 회원에게 사은품을 증정하려고 하면?? ➡️ WHERE 사용해야하나?

SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
	FROM buy 
    WHERE SUM(price*amount) > 1000;
    GROUP BY mem_id;

➡️ 오류 발생 : WHERE은 집계 함수 사용 불가능

GROUP BY에 조건을 추가하려면 HAVING을 사용

SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
	FROM buy 
    GROUP BY mem_id
    HAVING SUM(price*amount) > 1000;

만약 순서를 지정하고 싶으면 ORDER BY 추가하면 됨


3) 데이터 변경을 위한 SQL문

데이터 입력: INSERT

1. INSERT 기본

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

  • 테이블 뒤의 열은 생략 가능
    • 만약 생략했다면, 생성한 테이블의 모든 열에 맞는 VALUE를 넣어야함
    • 예를 들어 id(INT), nameCHAR) 라면, VALUE는 (1, '구구') 가 되야한다는 의미
  • 만약 입력하고 싶지 않다면 NULL 값 사용

2. 자동으로 증가하는 AUTO_INCREMENT

toy_id INT AUTO_INCREMENT PRIMARY KEY

열을 지정할 때 1부터 증가하는 값을 입력해줌
!!!!!!!!!!!!무조건 PRIMARY KEY!!!!!!!!!!!!로 지정해야함

  • 100부터 시작하고 싶어요
    • AUTO_INCREMENT=100; 지정해주면 100부터 시작
  • 1씩 증가가 아니라 3씩 증가하고 싶어요
    • @@auto_increment_increment라는 시스템 변수(MySQL 자체 설정값)을 설정해줘야함
    • SET @@auto_increment_increment=3;
CREATE TABLE honghong3 (
	toy_id INT AUTO_INCREMENT PRIMARY KEY,
    toy_name CHAR(4),
    age INT);
ALTER TABLE honghong3 AUTO_INCREMENT=1000;
SET @@auto_increment_increment=3;

1000부터 시작하는 id + 3씩 증가하는 id ➡️ 설정 확인

3. INSERT INTO ~ SELECT

INSERT INTO 테이블이름 (열이름1, 열_이름2, ...)
SELECT문;

데이터 백만개 INSERT할 생각에 머리가 아픔
그런데 데이터가 이미 다른 테이블에 저장되어 있다면?
그럴 때 사용하는 문법

💡주의할 점
열의 개수를 맞추는 것이 중요.
만약 내가 만든 테이블의 열 개수가 SELECT 문의 열 개수가 안맞으면 오류 발생


데이터 수정: UPDATE

1. UPDATE 기본

UPDATE 테이블_이름
SET 열1=값1, 열2=값2, ...
WHERE 조건 ;

영어로 SEOUL로 작성한 것을 한글 서울로 바꾸고 싶을 때

UPDATE city_popul
	SET city_name = '서울'
    WHERE city_name = 'SEOUL'
  • city_popul이라는 테이블을 수정할 것
  • city_name 열을 서울로 변경할 것이다
  • city_name이 SEOUL인 것만 (조건)

💡만약 WHERE 절이 없다면?
당연히 모든 열이 와바박 바뀌기 때문에 주의해야한다.
WHERE(조건)절이 없는 UPDATE라면 두번 세번 생각해보고 실행해야한다.


데이터 삭제: DELETE

1. DELETE 기본

DELETE FROM 테이블_이름 WHERE 조건;

city_name이 New로 시작하는 모든 것을..삭제하고싶다!

DELETE FROM city_popul
	WHERE city_name LIKE 'New%';
  • city_popul 이란 테이블에서 삭제할거에요
  • city_name이 New로 시작하는 모든 행을 삭제
  • DELETE는 조금 위험하기 때문에 LIMIT을 걸기도 한다

2. DELETE, DROP, TRUNCATE

셋 다 삭제하는 문법이지만 다르다

1) DELETE

  • WHERE절을 사용해 테이블에 있는 데이터를 하나하나 삭제
  • 처리속도 늦고, 퍼포먼스 안좋음 ➡️ 원하는 데이터를 골라 삭제하고 싶을 때 사용
  • 데이터를 삭제해도 데이터가 있던 Storage는 Release되지 않음
  • DELETE된 데이터는 COMMIT 명령어 사용 전이면 ROLLBACK 명령어로 되돌릴 수 있음

2) DROP

  • 테이블 자체를 날려버림
  • 해당 테이블의 모든 것이 사라짐
  • 자동 COMMIT 되기 때문에 이미 지우면 돌릴 수 없다

3) TRUNCATE

  • 전체 데이터를 한번에 삭제
  • 최초 생성 시 Storage만 남기고, 데이터가 있던 Storage는 Release 됨
  • 자동 COMMIT 명령어라 이미 지운 데이터는 되돌릴 수 없음

출처


2주차 과제

Q1)

  1. SELECT * FROM member ___ height;
    ORDER BY는 결과값을 어떤 순서로 출력할지 조절
    ➡️ ORDER BY

  2. SELECT * FROM member ___ 5,2;
    LIMIT 시작, 개수 -> LIMIT 5, 2 : 5번째 부터 2개 조회
    ➡️ LIMIT

  3. SELECT ___ phone1 FROM member;
    중복 결과 제거 : DISTINCT
    ➡️ DISTINCT

Q2)

  1. 데이터 입력

    INSERT INTO 테이블이름 (열이름1, 열_이름2, ...)
    SELECT문;

  2. 데이터 삭제

    DELETE FROM 테이블_이름 WHERE 조건;


2주차 우수 혼공족이 되어버린 나

흑흑 감사합니다 더 열심히 할게요 ㅠㅠ

profile
아무것도 안해서 유죄 판결 받음

0개의 댓글