들어가기에 앞서
SQL문은 기본적인 문법, 실습 위주의 학습을 통해 빠르게 익힐 수 있다
꾸준하고 반복적인 학습을 하면 실력이 빠르게, 좋은 방향으로 늘어날 것이라 생각한다
SQL문 관련 기능/특성
- F5 >> 전체 실행
- F9 >> 한 줄 실행
- -- >> 주석 처리
SQL 문의 기본 요소
SELECT keyword
FROM keyword
WHERE keyword;
이 구조가 거의 모든 곳에 쓰인다 할 수 있다
여기서 SELECT, FROM, WHERE이 DB의 어느 부분을 맡고 있는 지를 알고 가면 문제를 해결할 때 조금은 쉬워진다
하지만 이 모든 행위들은 기반이 되는 데이터가 있어야 학습이 가능하다는 것
이미 만들어져 있는 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에 무슨 내용이 들어있는지 알고 싶다면? ( 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 뒤에는 조건문이 온다.
그런데.. 여기 책 순서가 제멋대로인 것 같아 혹시 알파벳 순으로 볼 순 없을까?
SELECT *
FROM Book
ORDER BY bookname; (내림차순 >> ; 전에 DESC)
위의 식처럼, 문장의 끝에 ORDER BY 문을 쓰면 된다
죄송합니다 손님, 찾으시는 고객께서 전화번호를 등록해두지 않았네요
간혹 데이터를 보다가 DB에서 Null이라는 칸을 본 적이 있을 것이다
Null은 비어있음을 뜻하는 말로 값이 아니라는 것을 인지해두자
그래서 위와 같은 상황에서 Null을 찾아내려면 다음과 같은 SQL문이 필요하다
SELECT *
FROM Customer
Where
phone IS NULL; (반대의 경우 IS NOT 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문제를 풀어보자!
↓ ↓ ↓
'Development Study > Backend' 카테고리의 다른 글
[SQL] 일주일 뒤에 풀어보는 SQL ( SELECT함수 ~ 집계 함수 ) (2) | 2022.10.14 |
---|---|
[SQL] 연습 문제 ( SELECT함수 ~ 집계 함수 ) (0) | 2022.10.08 |
[GoormIDE/SQL]DB를 외부에서 접속 해보자 (0) | 2022.10.07 |
[GoormIDE] 데이터를 관리해보자 - 2 (나만의 USER, DB만들기) (2) | 2022.10.07 |
[GoormIDE] 데이터를 관리해보자 - 1 (컨테이너 생성) (0) | 2022.10.02 |