혼자 공부하는 SQL 2주차

2022. 7. 18. 00:03공부/혼자 공부하는 SQL

반응형

ERD 작성

https://www.erdcloud.com/
 

ERDCloud

Draw ERD with your team members. All states are shared in real time. And it's FREE. Database modeling tool.

www.erdcloud.com

  • market_db의 각 테이블에 대한 구조와 pk, fk 등을 한눈에 보기 편리한 Erd를 작성함.
더보기
Erd 사용하는 방법...?
칼럼에 대한 정보 추가적으로 입력하는 부분
  • 완성된 테이블
market_db를 erd로 표현함
  • 자료 Export
Table Export

market_db

  • DATABASE 생성하기(market_db)
-- 만약 market_db가 존재하면 우선 삭제하기
DROP DATABASE IF EXISTS market_db;

-- market_db 생성하기
CREATE DATABASE market_db;

-- market_db 사용하기
USE market_db;
  • TABLE 생성하기(member, buy)
-- 회원 Table
CREATE TABLE member
( mem_id  	CHAR(8) NOT NULL PRIMARY KEY, -- 사용자 아이디(PK)
  mem_name    	VARCHAR(10) NOT NULL, -- 이름
  mem_number    INT NOT NULL,  -- 인원수
  addr	  	CHAR(2) NOT NULL, -- 지역(경기,서울,경남 식으로 2글자만입력)
  phone1	CHAR(3), -- 연락처의 국번(02, 031, 055 등)
  phone2	CHAR(8), -- 연락처의 나머지 전화번호(- 제외)
  height    	SMALLINT,  -- 평균 키
  debut_date	DATE  -- 데뷔 일자
);

-- 구매 Table
CREATE TABLE buy
(  num 		INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -- 순번(PK)
   mem_id  	CHAR(8) NOT NULL, -- 아이디(FK)
   prod_name 	CHAR(6) NOT NULL, --  제품이름
   group_name 	CHAR(4), -- 분류
   price     	INT  NOT NULL, -- 가격
   amount    	SMALLINT  NOT NULL, -- 수량
   FOREIGN KEY (mem_id) REFERENCES member(mem_id) -- 회원 Table의 mem_id와 FK 설정
);
  • Data INSERT하기
-- member Table
INSERT INTO member VALUES('TWC', '트와이스', 9, '서울', '02', '11111111', 167, '2015.10.19');
INSERT INTO member VALUES('BLK', '블랙핑크', 4, '경남', '055', '22222222', 163, '2016.08.08');
INSERT INTO member VALUES('WMN', '여자친구', 6, '경기', '031', '33333333', 166, '2015.01.15');
INSERT INTO member VALUES('OMY', '오마이걸', 7, '서울', NULL, NULL, 160, '2015.04.21');
INSERT INTO member VALUES('GRL', '소녀시대', 8, '서울', '02', '44444444', 168, '2007.08.02');
INSERT INTO member VALUES('ITZ', '잇지', 5, '경남', NULL, NULL, 167, '2019.02.12');
INSERT INTO member VALUES('RED', '레드벨벳', 4, '경북', '054', '55555555', 161, '2014.08.01');
INSERT INTO member VALUES('APN', '에이핑크', 6, '경기', '031', '77777777', 164, '2011.02.10');
INSERT INTO member VALUES('SPC', '우주소녀', 13, '서울', '02', '88888888', 162, '2016.02.25');
INSERT INTO member VALUES('MMU', '마마무', 4, '전남', '061', '99999999', 165, '2014.06.19');

-- buy Table
INSERT INTO buy VALUES(NULL, 'BLK', '지갑', NULL, 30, 2);
INSERT INTO buy VALUES(NULL, 'BLK', '맥북프로', '디지털', 1000, 1);
INSERT INTO buy VALUES(NULL, 'APN', '아이폰', '디지털', 200, 1);
INSERT INTO buy VALUES(NULL, 'MMU', '아이폰', '디지털', 200, 5);
INSERT INTO buy VALUES(NULL, 'BLK', '청바지', '패션', 50, 3);
INSERT INTO buy VALUES(NULL, 'MMU', '에어팟', '디지털', 80, 10);
INSERT INTO buy VALUES(NULL, 'GRL', '혼공SQL', '서적', 15, 5);
INSERT INTO buy VALUES(NULL, 'APN', '혼공SQL', '서적', 15, 2);
INSERT INTO buy VALUES(NULL, 'APN', '청바지', '패션', 50, 1);
INSERT INTO buy VALUES(NULL, 'MMU', '지갑', NULL, 30, 1);
INSERT INTO buy VALUES(NULL, 'APN', '혼공SQL', '서적', 15, 1);
INSERT INTO buy VALUES(NULL, 'MMU', '지갑', NULL, 30, 4);

기본 SELECT문

SELECT 칼럼명 FROM Table명; // SELECT 칼럼명 FROM Database명.Table명;

SELECT 칼럼명 FROM Table명 WHERE 조건;
  • WHERE 조건 없이 SELECT하기
-- member Table 조회하기
-- 전체 칼럼 조회하기
SELECT * FROM member;
-- mem_name 칼럼만 조회하기
SELECT mem_name FROM member;
-- addr, debut_date, mem_name 칼럼 조회하기
SELECT addr, debut_date, mem_name FROM member;
-- addr, debut_date, mem_name 칼럼 조회하기
/*
    alias 사용하기
    - AS 사용
    - 바로 별칭 입력
    - "별칭" 입력
*/
SELECT addr 주소, debut_date "데뷔 일자", mem_name as 이름 FROM member;
  • WHERE 조건 사용하기
-- mem_name 칼럼으로 조건 추가하기
SELECT * FROM member WHERE mem_name = '블랙핑크';

-- mem_number 칼럼으로 조건 추가하기
SELECT * FROM member WHERE mem_number = 4;
  • 관계연산자, 논리연산자 사용
-- 관계연산자 <= 사용하여 mem_id, mem_name 칼럼만 조회하기
SELECT mem_id, mem_name 
FROM member 
WHERE height <= 162;

-- AND 연산자 사용하여 mem_name, height, mem_number 칼럼만 조회하기
SELECT mem_name, height, mem_number 
FROM member 
WHERE height >= 165 AND mem_number > 6;

-- OR 연산자 사용하여 mem_name, height, mem_number 칼럼만 조회하기
SELECT mem_name, height, mem_number 
FROM member 
WHERE height >= 165 OR mem_number > 6;
  • BETWEEN ~ AND
-- 관계연산자 >=, <=와 AND 연산자 사용하여 mem_name, height 칼럼만 조회하기
SELECT mem_name, height 
FROM member 
WHERE height >= 163 AND height <= 165;

-- 위의 코드를 BETWEEN 사용하여 mem_name, height 칼럼만 조회하기
SELECT mem_name, height 
FROM member 
WHERE height BETWEEN 163 AND 165;
  • IN()
-- OR 연산자 여러 개 사용하여 mem_name, addr 칼럼만 조회하기
SELECT mem_name, addr 
FROM member 
WHERE addr = '경기' OR addr = '전남' OR addr = '경남';

-- 위의 코드를 IN() 사용하여 mem_name, addr 칼럼만 조회하기
SELECT mem_name, addr 
FROM member 
WHERE addr IN('경기', '전남', '경남');
  • LIKE
-- % 사용하기
/*
LIKE '우%'
- 검색하는 칼럼의 데이터에서
- 맨 앞글자는 '우'
- 그 뒷글자는 무엇이든 허용 가능함.

예시) '우주소녀'
*/
SELECT * 
FROM member 
WHERE mem_name LIKE '우%';

-- _ 사용하기
/*
LIKE '__핑크'
- 검색하는 칼럼의 데이터에서
- 앞 두 글자는 무엇이든 상관없음
- 맨 뒤 2글자는 '핑크'만 허용함.
    
예시) '에이핑크', '블랙핑크'
*/
SELECT * 
FROM member 
WHERE mem_name LIKE '__핑크';

추가 SELECT문

  • 기본 문법
SELECT 칼럼명 FROM 테이블명
WHERE 조건식
GROUP BY 칼럼명 HAVING 조건식
ORDER BY 칼럼명
LIMIT 숫자

-- ASC(오름차순) / DESC(내림차순)

ORDER BY

  • 예시 SQL문
-- debut_date가 빠른 순서대로 출력하기
SELECT mem_id, mem_name, debut_date
FROM member
ORDER BY debut_date;

-- debut_date가 늦은 순서대로 출력하기
SELECT mem_id, mem_name, debut_date
FROM member
ORDER BY debut_date DESC;


-- -----------------------------------------------------------
-- 오류나는 상황 확인하기
-- SELECT ~ FROM ~ WHERE 후에 GROUP BY나 ORDER BY 사용하기
-- -----------------------------------------------------------

-- 오류 발생
SELECT mem_id, mem_name, debut_date, height
FROM member 
ORDER BY height DESC
WHERE height >= 164;

-- 오류 해결
SELECT mem_id, mem_name, debut_date, height
FROM member 
WHERE height >= 164
ORDER BY height DESC;
  • LIMIT : 출력의 개수를 제한하기
-- 3개의 결과만 출력하기
SELECT * FROM member 
LIMIT 3;

-- ORDER BY를 한 결과에서 3개만 출력하기
SELECT mem_name, debut_date FROM member
ORDER BY debut_date
LIMIT 3;

-- ORDER BY를 한 결과 3번째부터 4개만 출력하기
-- ※ 0부터 시작하기 때문에 3번째가 2임.
SELECT mem_name, debut_date FROM member
ORDER BY debut_date
LIMIT 2,4;
  • DISTINCT : 중복된 결과를 제거하기
-- addr만 출력
SELECT addr FROM member;

-- addr 기준으로 정렬해서 출력
SELECT addr FROM member ORDER BY addr;

-- addr 데이터 중에서 중복된 데이터 제거 후 출력
SELECT DISTINCT addr FROM member;

GROUP BY

  • 집계 함수
SUM() -- 합계
AVG() -- 평균
MIN() -- 최소값
MAX() -- 최대값
COUNT() -- 행의 개수
COUNT(DISTINCT) -- 행의 개수(중복 제외)
  • HAVING
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액" FROM buy 
GROUP BY mem_id   
-- HAVING 사용 시에는 칼럼명 중 Alias 앞에 부분을 모두 입력해줘야 한다!
-- HAVING은 GROUP BY 뒤에 사용해야 함.
HAVING SUM(price*amount) > 1000;

INSERT / UPDATE / DELETE

INSERT

INSERT INTO 테이블명 (칼럼명) VALUES ()
-- 칼럼명 적지 않고 INSERT하기
INSERT INTO member VALUES('TWC', '트와이스', 9, '서울', '02', '11111111', 167, '2015.10.19');

-- 칼럼명 적고 INSERT하기
INSERT INTO member(mem_id, mem_name, mem_number, addr, phone1, phone2, height, debut_date) 
VALUES('TWC', '트와이스', 9, '서울', '02', '11111111', 167, '2015.10.19');

 

UPDATE

UPDATE 테이블명 SET 칼럼명=값 WHERE 조건;
-- city_name이 Seoul -> 서울
UPDATE city_popul
SET city_name = '서울'
WHERE city_name = 'Seoul';

-- city_name이 New York -> 뉴욕
-- city_name이 New York인 데이터에서 population을 0으로 변경
UPDATE city_popul
SET city_name = '뉴욕', population = 0
WHERE city_name = 'New York';

 

DELETE

DELETE FROM 테이블 WHERE 조건;
-- 'New' 글자로 시작하는 도시 삭제하기
DELETE FROM city_popul
WHERE city_name LIKE 'New%';

p.138 ~ p.139 확인문제

1. SELECT문에서 사용되는 절

  • SELECT -> FROM -> WHERE -> ORDER BY -> LIMIT;

2 -1. SELECT * FROM member ORDER BY height;

2 -1. SELECT * FROM member LIMIT 5,2;

2 -1. SELECT DISTINCT phone1 FROM member;

 

3. ORDER BY 절에서 오름차순을 위한 예약어는 ASC이고, 내림차순을 위한 예약어는 DESC다.

 

4. LIMIT에 대한 문법 -> LIMIT 0,3,5는 문법에 어긋남.

 

5. DISTINCT

  • 조회된 결과에서 중복된 것은 한 개만 남기며, SELECT문의 열 이름 앞에 붙여준다.

6. GROUP BY의 집계 함수

  • HAVING()은 WHERE 조건과 유사함. // GROUP BY와 같이 사용됨. // 집계함수가 아님.
728x90
반응형