MySQL - 3.1&2 SQL 기본 문법 - SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT;

govlKH·2023년 6월 23일
0

SQL

목록 보기
3/17

3.1 SELECT ~ FROM ~ WHERE

market_db 만들기

DROP DATABASE IF EXISTS market_db; -- 만약 market_db가 존재하면 우선 삭제한다.
CREATE DATABASE market_db;
  • DB사용
USE market_db;
  • 회원 테이블 만들기
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  -- 데뷔 일자
);
  • 회원 테이블에 정보 입력
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');
  • DB에서 테이블 SELECT
SELECT * FROM member;

SELECT ~ FROM ~ WHERE

  • 기본적인 select
USE market_db;
SELECT * FROM member WHERE mem_name='블랙핑크';
만약 다른 DB에서 가져오고 싶다면?
SELECT * FROM market_db.member
	WHERE mem_name='블랙핑크';
    (주로 사용하지는 않음)

=> AS를 통한 별칭

SELECT addr AS 주소, height 키, debut_date AS "데뷔 일자" FROM member;
  • 조건을 통한 선택 AND OR
SELECT mem_id AS id, mem_name 이름, height 키, mem_number "멤버 수" FROM member 
	WHERE (height > 160 AND height <= 165) OR mem_number > 8;

  • 잘 기억이 나지 않을 때 : LIKE
    %부터 쭉 (여러 글자)
SELECT * FROM member
	WHERE mem_name LIKE '우%';

'_'하나가 한 글자

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

3.2 좀 더 깊게 알아보는 SELECT 문

< 순서를 잘 외우기! >

SELECT 열_이름
	FROM 테이블_이름
    WHERE 조건식
    GROUP BY 열_이름
    HAVING 조건식
    ORDER BY 열_이름
    LIMIT 숫자;
  • ORDER BY - 정보는 바뀌지 않고 순서만 바뀌는 것
SELECT mem_id, mem_name, debut_date 
   FROM member 
   ORDER BY debut_date DESC; - 기본이 ASC

-> 만약 동률이 존재하여 그 다음 order을 지정해주고 싶다면?

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

  • 위의 몇 개만 보고 싶다 : LIMIT
데뷔 순으로 상위 3개
SELECT mem_name, debut_date
   FROM member
   ORDER BY debut_date
   LIMIT 3;
   
3번째부터 2개 행 보기
SELECT mem_name, height
   FROM member
   ORDER BY height DESC
   LIMIT 3,2;
  • 중복된 것들을 없애고 unique하게 하나씩 보고 싶을 땐? DISTINCT
SELECT DISTINCT addr FROM member;

굳이 똑같은 지역을 볼 필요 없으니, 하나씩만 뭐가 있나 보자!

  • 그룹으로 묶어서 보고 싶을 땐? GROUP BY
    집계 함수 표

    (혼공 SQL 교재)
멤버 아이디 별로 총 구매 개수 구하기
SELECT mem_id, SUM(amount) AS total_mount
	FROM buy 
    GROUP BY mem_id;


총 개수도 좋지만, 총 구매 금액 순은?

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

  • 행의 개수 : COUNT
모든 행 개수
SELECT COUNT(*) FROM member;

핸드폰이 있는 행 개수 (비어있는 것은 세지 X)
SELECT COUNT(phone1) "연락처가 있는 회원" FROM member;
  • GROUP 함수에서 조건을 걸고 싶을 때는? HAVING을 사용
순서가 SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY 이기에
GROUP BY한 것에 조건을 걸고 싶으면 지나간 WHERE이 아닌, HAVING을 이용

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

profile
수학과 대학원생. 한 걸음씩 꾸준히

0개의 댓글