[MySQL] DML(3) SELECT ①

Hunie_07·약 17시간 전

SQL

목록 보기
8/8
post-thumbnail

데이터베이스 생성

# bookshopdb에 테이블 추가/변경
USE bookshopdb;

CREATE TABLE bookClient(
	clientNo VARCHAR(10) NOT NULL PRIMARY KEY,
    clientName VARCHAR(30) NOT NULL,
    clientPhone VARCHAR(15),
    clientAddress VARCHAR(40),
    clientBirth DATE,
    clientHobby VARCHAR(15),
    clientGender VARCHAR(5)
);

CREATE TABLE bookSale(
	bsNo VARCHAR(10) NOT NULL PRIMARY KEY,
    bsDate DATE,
    bsQty INT,
    clientNo VARCHAR(10) NOT NULL,
    bookNo VARCHAR(10) NOT NULL,
    CONSTRAINT FK_bookSale_clientNo FOREIGN KEY (clientNo) 
		REFERENCES bookClient(clientNo),
    CONSTRAINT FK_bookSale_bookNo FOREIGN KEY (bookNo) 
		REFERENCES book(bookNo)
);

# 기존에 생성된 book 테이블에 컬럼 추가
ALTER TABLE book 
	ADD (bookAuthor VARCHAR(20),
		 bookStock INT);
  • 최종 데이터베이스 테이블은 다음과 같다.
  • book / bookclient
  • booksale / publisher

📌 SELECT

데이터 조회(SELECT)

  • 테이블의 데이터를 조회하는 명령어
SELECT [ALL|DISTINCT] 컬럼()리스트 (*)
		FROM 테이블명
        [WHERE 검색조건()]
        [GROUP BY 열이름]
		[HAVING 검색조건()]
        [ORDER BY 얄이름[ASC|DESC]]
  • SELECT [ALL|DISTINCT] 컬럼(열)리스트 (*) : 검색할 열리스트 지정
  • WHERE 검색조건(들) : 질의 결과에 포함될 행들이 만족할 조건
  • GROUP BY 열이름 : 그룹 질의 → 특정 컬럼으로 그룹화한 후 각 그룹에 대해 1행씩 질의 결과 생성
  • HAVING 검색조건(들) : GROUP BY 절에 의해 구성된 그룹들에 대해 적용할 조건
  • ORDER BY 열이름 [ASC|DESC] : 열이름의 값을 기준으로 결과를 정령
    - ASC: 오름차순, DESC: 내림차순

SELECT문 실행순서

  • SELECT >> (5)
    DISTICT >> (6)
    FROM >> (1)
    WHERE >> (2)
    GROUP BY >> (3)
    HAVING >> (4)
    ORDER BY >> (7)

1️⃣ SELECT

# book 테이블과 bookSale 테이블 데이터 전체 조회
SELECT * FROM book;
SELECT * FROM bookSale;

2️⃣ SELECT DISTINCT

  • 중복된 레코드(행)를 한번만 출력: DISTINCT
  • 모든 레코드 출력: ALL (기본값)
SELECT DISTINCT bookName, bookPrice, bookAuthor FROM bookshopdb.book 
	WHERE bookPrice >= 30000;

# 조건에 따른 행 조회: WHERE절
-- book 테이블에서 재고량이 3~5인 도서 조회
SELECT bookName, bookPrice, bookAuthor, bookStock FROM bookshopdb.book
	WHERE bookStock >= 3 AND bookStock <= 5;

-- 중복 행은 한번만 출력(NULL 포함)
SELECT DISTINCT bookAuthor from book;

3️⃣ SELECT FROM ~ WHERE

SELECT [All|DISTINCT] FROM 테이블명 WHERE 조건식

  • WHERE 조건식에 사용되는 연산자
    1) 비교: >, <, >=, <=, =, !=
    2) 논리: AND, OR
    3) 범위: BETWEEN 시작 AND 끝
    4) 리스트에 포함여부(멤버): IN, NOT IN
    5) NULL: IS NULL, IS NOT NULL
    6) 패턴매칭: LIKE 문자열서식 (%, _) (문자열의 일부가 위치하는 데이터 검색)
	- %: ALL
    - _: 단일문자(문자하나)
    - ___: 3개 문자로 구성된 문자열
	- bookName LIKE '%파이썬%'	>> '파이썬' 문자열이 들어가있는 모든 문자열
	- bookName LIKE '파이썬%'	>> '파이썬' 문자열로 시작하는 문자열
    - bookName LIKE '%파이썬'	>> '파이썬' 문자열로 끝나는 문자열
    - bookName LIKE '%'			>> 0개 이상의 문자를 가진 문자열
    - bookName LIKE '_'			>> 단일문자
    - bookName LIKE '____'		>> 4개의 문자로 구성된 문자열

1) 비교

# 저자가 '홍길동'인 도서의 도서명, 저자 출력
SELECT bookName, bookAuthor 
	FROM bookshopdb.book 
    WHERE bookAuthor='홍길동';
    
# 가격이 30000원 이상인 도서의 도서명, 가격, 재고 출력
SELECT bookName, bookPrice, bookStock 
	FROM bookshopdb.book 
    WHERE bookPrice >= 30000;

2) 논리

# 저자가 '홍길동'이면서 재고가 3권이상인 도서 정보 출력
SELECT * 
	FROM bookshopdb.book 
    WHERE bookAuthor='홍길동' AND bookStock >= 3;

# 저자가 '홍길동' 또는 '성춘향'인 도서 정보 출력
SELECT * 
	FROM bookshopdb.book 
    WHERE bookAuthor='홍길동' OR bookAuthor='성춘향';

3) BETWEEN AND

# 도서 가격이 25000원에서 35000원인 도서명, 도서가격 검색 1
SELECT bookName, bookPrice 
	FROM bookshopdb.book 
    WHERE bookPrice BETWEEN 25000 AND 30000; 

# 도서 가격이 25000원에서 35000원인 도서명, 도서가격 검색 2
SELECT bookName, bookPrice 
	FROM bookshopdb.book 
    WHERE bookPrice >= 25000 AND bookPrice <= 30000;

4) 리스트에 포함

# 출판사가 '좋은출판사'와 '강남출판사'인 도서의 도서이름, 저자 출력

-- publisher 에서 해당 출판사의 pubNo 확인
SELECT * FROM publisher
	WHERE pubName='좋은출판사' OR pubName='강남출판사';
    
SELECT bookName, bookAuthor, pubNo
	FROM bookshopdb.book
    WHERE pubNo IN (1, 2);
    
# 출판사이름이 '좋은출판사'가 아닌 도서의 도서명, 출판사번호 출력
SELECT bookName, pubNo
	FROM bookshopdb.book
    WHERE pubNo NOT IN (1);

5) 조건

# clientHobby 가 NULL 인 데이터 조회
SELECT * 
	FROM bookshopdb.bookclient 
    WHERE clientHobby IS NULL;

# 빈 문자열과 NULL 값은 다르게 취급
SELECT * 
	FROM bookshopdb.bookclient 
    WHERE clientHobby = '';

# 빈 문자열을 NULL로 변경
UPDATE bookClient SET clientHobby=NULL WHERE clientHobby='';

# clientHobby 가 NULL 이 아닌 데이터 조회
SELECT * 
	FROM bookshopdb.bookclient 
    WHERE clientHobby IS NOT NULL;

6) 패턴매칭

# 1990년대 출생한 고객의 이름과 생일 출력 1
SELECT clientName, clientBirth 
	FROM bookshopdb.bookclient 
    WHERE clientBirth LIKE '199%';

# 1990년대 출생한 고객의 이름과 생일 출력 2
SELECT clientName, clientBirth 
	FROM bookshopdb.bookclient 
    WHERE clientBirth >= '1990-01-01' AND clientBirth <= '1999-12-31';
    
# 이름이 네글자인 고객 정보 출력
SELECT * 
	FROM bookshopdb.bookclient 
    WHERE clientName LIKE '____';

4️⃣ ORDER BY

데이터 정렬 : ORDER BY절

  • 가장 마지막에 실행
  • 정렬 방식: ASC(오름차순) | DESC(내림차순)
# 도서명 오름차순으로 도서 검색
SELECT * 
	FROM bookshopdb.book 
    ORDER BY bookName ASC;

# 도서명 내림차순으로 도서 검색    
SELECT * 
	FROM bookshopdb.book 
    ORDER BY bookName ASC;

# 최근 발행일 순서로 도서 검색
SELECT *
	FROM bookshopdb.book
    ORDER BY bookDate DESC;
  • LIMIT : 출력 개수 설정
  • LIMIT OFFSET : 출력 시작 위치 설정
# LIMIT: 출력 개수 제한
SELECT *
	FROM bookshopdb.book
    ORDER BY bookDate DESC
    LIMIT 5;
    
# LIMIT OFFSET: 시작 위치 변경
SELECT *
	FROM bookshopdb.book
    ORDER BY bookDate DESC
    LIMIT 5 OFFSET 3;		# 4번째부터 5개
    
# LIMIT 시작, 개수
SELECT *
	FROM bookshopdb.book
    ORDER BY bookDate DESC
    LIMIT 0, 5; 			# 1번째부터 5개
    
SELECT *
	FROM bookshopdb.book
    ORDER BY bookDate DESC
    LIMIT 10, 3; 			# 11번째부터 3개
    
# 정렬의 조건이 두개 이상인 경우
-- 재고수량을 기준으로 내림차순으로 정렬,
-- 재고수량이 동일한 경우 최근 발행일 순으로 정렬
SELECT *
	FROM bookshopdb.book
    ORDER BY bookStock DESC, bookDate DESC;	

0개의 댓글