Development Study/Backend

[SQL] 저장된 데이터를 원하는 대로 찾아보자 ( SELECT ~ 집계 함수 )

  • -
728x90

들어가기에 앞서

SQL문은 기본적인 문법, 실습 위주의 학습을 통해 빠르게 익힐 수 있다

꾸준하고 반복적인 학습을 하면 실력이 빠르게, 좋은 방향으로 늘어날 것이라 생각한다


SQL문 관련 기능/특성

  • F5        >>     전체 실행
  • F9        >>      한 줄 실행
  • --          >>      주석 처리

SQL 문의 기본 요소

SELECT keyword

FROM keyword

WHERE keyword;

이 구조가 거의 모든 곳에 쓰인다 할 수 있다

 

여기서 SELECT, FROM, WHEREDB의 어느 부분을 맡고 있는 지를 알고 가면 문제를 해결할 때 조금은 쉬워진다

SELECT가 선택하려는 부분
FROM에서 불러오려는 부분
WHERE이 가져오려는 위치

하지만 이 모든 행위들은 기반이 되는 데이터가 있어야 학습이 가능하다는 것

이미 만들어져 있는 SQL문을 통해 자료를 불러오도록 하겠다

SQL문 보기

더보기

/* 이름: 실습 DB.sql */
/* 설명 */
 

/* 실습 DB 자료 생성 */


CREATE TABLE Book (
  bookid      INTEGER PRIMARY KEY,
  bookname    VARCHAR(40),
  publisher   VARCHAR(40),
  price       INTEGER 
);

CREATE TABLE  Customer (
  custid      INTEGER PRIMARY KEY,  
  name        VARCHAR(40),
  address     VARCHAR(50),
  phone       VARCHAR(20)
);

CREATE TABLE Orders (
  orderid INTEGER PRIMARY KEY,
  custid  INTEGER ,
  bookid  INTEGER ,
  saleprice INTEGER ,
  orderdate DATE,
  FOREIGN KEY (custid) REFERENCES Customer(custid),
  FOREIGN KEY (bookid) REFERENCES Book(bookid)
);

INSERT INTO Book VALUES(1, 'History of football', 'good sports', 7000);
INSERT INTO Book VALUES(2, 'Soccer girl', 'Namusoo', 13000);
INSERT INTO Book VALUES(3, 'Understanding of Football', 'DaeHan Media', 22000);
INSERT INTO Book VALUES(4, 'Golf Bible', 'DaeHan Media', 35000);
INSERT INTO Book VALUES(5, 'Figure skating Book', 'Good sports', 8000);
INSERT INTO Book VALUES(6, 'Weightlifting step-by-step', 'Good sports', 6000);
INSERT INTO Book VALUES(7, 'Memories of baseball', 'IsangMedia', 20000);
INSERT INTO Book VALUES(8, 'Play baseball', 'IsangMedia', 13000);
INSERT INTO Book VALUES(9, 'Olympic Story', 'SamsungDang', 7500);
INSERT INTO Book VALUES(10, 'Olympic Champions', 'Pearson', 13000);

INSERT INTO Customer VALUES (1, 'Park JiSung', 'England Manchester', '000-5000-0001');
INSERT INTO Customer VALUES (2, 'Kim Yuna', 'SouthKorea Seoul', '000-6000-0001');  
INSERT INTO Customer VALUES (3, 'Jang Miran', 'SouthKorea Gangwondo', '000-7000-0001');
INSERT INTO Customer VALUES (4, 'Choo Sinsu', 'Cleveland, USA', '000-8000-0001');
INSERT INTO Customer VALUES (5, 'Park Seri', 'SouthKorea Daejeon',  NULL);

INSERT INTO Orders VALUES (1, 1, 1, 6000, STR_TO_DATE('2014-07-01','%Y-%m-%d')); 
INSERT INTO Orders VALUES (2, 1, 3, 21000, STR_TO_DATE('2014-07-03','%Y-%m-%d'));
INSERT INTO Orders VALUES (3, 2, 5, 8000, STR_TO_DATE('2014-07-03','%Y-%m-%d')); 
INSERT INTO Orders VALUES (4, 3, 6, 6000, STR_TO_DATE('2014-07-04','%Y-%m-%d')); 
INSERT INTO Orders VALUES (5, 4, 7, 20000, STR_TO_DATE('2014-07-05','%Y-%m-%d'));
INSERT INTO Orders VALUES (6, 1, 2, 12000, STR_TO_DATE('2014-07-07','%Y-%m-%d'));
INSERT INTO Orders VALUES (7, 4, 8, 13000, STR_TO_DATE( '2014-07-07','%Y-%m-%d'));
INSERT INTO Orders VALUES (8, 3, 10, 12000, STR_TO_DATE('2014-07-08','%Y-%m-%d')); 
INSERT INTO Orders VALUES (9, 2, 10, 7000, STR_TO_DATE('2014-07-09','%Y-%m-%d')); 
INSERT INTO Orders VALUES (10, 3, 8, 13000, STR_TO_DATE('2014-07-10','%Y-%m-%d'));

-- 여기는 3장에서 사용되는 Imported_book 테이블
CREATE TABLE Imported_Book (
  bookid      INTEGER,
  bookname    VARCHAR(40),
  publisher   VARCHAR(40),
  price       INTEGER 
);

INSERT INTO Imported_Book VALUES(21, 'Zen Golf', 'Pearson', 12000);
INSERT INTO Imported_Book VALUES(22, 'Soccer Skills', 'Human Kinetics', 15000);
commit;

붙여 넣고 전체 실행을 한 번만 한다 ( F5 )

실행 이후 생긴 실습용 DB

이후 한 번 생성한 DB를 수정하지는 않을 것이기에 에디터를 비워준다

 

원하는 DB에 무슨 내용이 들어있는지 알고 싶다면? ( SELECT/FROM문 )

SELECT keyword1

FROM keyword2;

형식의 SQL문을 작성하면 된다

 

keyword1 >> 선택하려는 데이터의 어떤 부분(세로줄)을 가져올 것인지에 대한 부분, *(아스타)의 경우 모든 항목을 불러온다

keyword2 >> 어떤 데이터 집합을 가져올 것인지에 대한 부분, 이 DB에는 Book, Customer 등이 존재한다

 

정상적으로 데이터가 들어있는지 확인을 해 보도록 하겠다 ( SQL문 낱개 실행 >> F9 )

주의사항 >> 테이블에서 검색하려는 FROM 뒤의 항목은 대소문자까지 구분하기 때문에

            오류가 났다면 혹시 대소문자 문제가 아닌가도 생각해 보도록 하자 

SELECT *

FROM Book;

 

SELECT *

FROM Customer;

 

SELECT *

FROM Imported_Book;

 

SELECT *

FROM Orders;

정상적으로 들어가있는 모습이다

SELECT * 가 너무 많은 정보를 보여줘서 싫다면?? ( SELECT/FROM문 2 )

자신이 원하는 칼럼(Column)의 정보만 보고 싶다면 어떻게 할까?

SELECT bookid

FROM Book;

실행 결과

위처럼 SELECT 뒤에 원하는 칼럼명을 적어주면 된다

콤마( , )를 이용해서 여러 칼럼을 동시에 볼 수 있다

칼럼명은 대소문자를 구분하지 않는다

SELECT bookid, bookname

FROM Book;

실행 결과

책이 많이 있다는 것은 알겠어 하지만 나는 20000원밖에 없는 걸?

이런 상황일 때 WHERE을 통해 데이터를 제한하여 조회할 수 있다.

일종의 필터와 같은 역할을 하는 것이다

SELECT *

FROM Book

WHERE

price <= 20000;

 

여기서 알 수 있듯이, WHERE 뒤에는 조건문이 온다.

WHERE 뒤에 올 수 있는 조건들

그런데.. 여기 책 순서가 제멋대로인 것 같아 혹시 알파벳 순으로 볼 순 없을까?

SELECT *

FROM Book

ORDER BY bookname; (내림차순 >> ; 전에 DESC)

위의 식처럼, 문장의 끝에 ORDER BY 문을 쓰면 된다

 

DESC쓰기 전(좌), DESC쓴 후(우)

죄송합니다 손님, 찾으시는 고객께서 전화번호를 등록해두지 않았네요

Null

간혹 데이터를 보다가 DB에서 Null이라는 칸을 본 적이 있을 것이다

Null비어있음을 뜻하는 말로 값이 아니라는 것을 인지해두자

그래서 위와 같은 상황에서 Null을 찾아내려면 다음과 같은 SQL문이 필요하다

SELECT *

FROM Customer

Where

phone IS NULL; (반대의 경우 IS NOT NULL을 입력한다)

NULL값이 있는 로우만 출력된 모습을 볼 수 있다

 

혹시 여기 baseball이 들어가는 책이 있지 않나요??

서점에 갔을 때 이름이 완전히 기억이 나지 않아 부분적으로만 찾아야 했을 때가 있을 것이다

이런 기능이 SQL문에도 존재하는데, 이를 와일드 문자라고 부른다

와일드 문자는 다음과 같이 사용할 수 있다

WHERE 칼럼명 LIKE '일치하는 항목 이름'

WHERE 칼럼명 LIKE '연결 문자 1' + '연결 문자 2'

WHERE 칼럼명 LIKE '% 포함되어야 하는 글자%'

WHERE 칼럼명 LIKE '_녕'처럼 두 번째 글자가 명이어야 하는 단어 EX) 안녕, 안녕 등 상관없음

WHERE 칼럼명 LIKE '[0-5]%' 0~5로 시작하는 문자열

WHERE 칼럼명 LIKE '[^0-5]%' 0~5로 시작하지 않는 문자열

 

그러고 보니 우리가 거래하고 있는 출판사는 몇 군데였더라??

이 DB에는 수많은 책, 책을 출판한 출판사들이 적혀있다

하지만 한 출판사가 하나의 책만 출판하는 것은 아닐 테니

이때 필요한 것은 무엇일까??

 

같은 출판사들을 하나씩만 남기는 중복제거 함수와 ( SELECT + DISTINCT )

남은 출판사들을 세는 집계 함수가 필요할 것이다 ( 여기서는 COUNT가 들어간다 )

 

집계 함수란? 

SELECT + 집계 함수 형식으로 쓰이는 함수로 

여러 데이터들을 집계해서 나오는 (최대, 최소, 평균, 합계 등) 값을 말한다

SUM()         >>       합계

AVG()          >>       평균

COUNT()     >>       합산

MAX()          >>       최대

MIN()           >>       최소

 

SELECT COUNT(DISTINCT(publisher)) Sum_Publisher

FROM Book;

 

SELECT문 끝에 적어둔 Sum_Publisher은 일종의 주석으로

결과를 출력할 때 반영해서 출력된다

반영 전에는 이게 무엇인지 알기 힘들다
반영되어 출력된 모습

자, 이제 이론을 잘 둘러보았을 것이라 믿는다

다음 글에서는 문제를 통해 SQL문을 직접 써보면서 더욱 깊이 이해를 하는 시간을 가져볼 것이다

SQL문제를 풀어보자!
↓   ↓   
 

[SQL] 연습 문제 ( SELECT함수 ~ 집계 함수 )

이 포스팅은 이전 글과 연계되어있다. 혹시 보고오지 못했다면 먼저 읽고 문제를 풀어보는 것을 추천한다 이전 글 보고오기 [SQL] 저장된 데이터를 원하는 대로 찾아보자 ( SELECT ~ 집계 함수 ) 들

time-map-installer.tistory.com

 

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.