[실습용 데이터베이스 구축 코드]
-- 데이터베이스 만들기
DROP DATABASE IF EXISTS market_db;
CREATE DATABASE market_db;
-- 회원 테이블(member) 만들기
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 -- 데뷔 일자
);
-- 구매 테이블(buy) 만들기
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 SAMLLINT NOT NULL, -- 수량
FOREIGN KEY (mem_id) REFERENCES member(mem_id)
);
-- 데이터 입력하기 (1-2개만 예시로)
INSERT INTO member VALUES ('TWC', '트와이스', 9. '서울', '02', '11111111', 167, '2015.10.19');
INSERT INTO buy VALUES (NULL, 'BLK', '지갑', NULL, 30, 2);
-- 데이터 조회하기
SELECT * FROM MEMBER;
SELECT * FROM BUY;
1. USE 문
SELECT 문을 실행하기 전 사용할 데이터베이스를 지정하는 것
- MySQL 워크벤치를 재시작하거나 쿼리 창을 새로 열면 다시 USE를 실행해야 함
- 테이블을 지정할 수는 없음
USE market_db;
2. SELECT 문
1) SELECT + 검색하고 싶은 속성의 이름 나열
- ALL : 결과 테이블의 튜플의 중복 허용 (생략 가능)
- DISTINCT : 결과 테이블의 튜플의 중복을 허용하지 않도록 지정
- 별칭 (alias) : 열 이름 다음에 지정하고 싶은 별칭을 입력. 별칭에 공백이 있으면 큰따옴표(")로 묶어줌
SELECT addr 주소, debut_date "데뷔 일자", mem_name
FROM member;
2) FROM + 검색하고 싶은 속성이 있는 테이블 이름 나열
3) WHERE + 조건을 만족하는 데이터만 검색
- 관계 연산자 : >, <, >=, <=
SELECT mem_id, mem_name
FROM member
WHERE height <= 162;
- 논리 연산자 : AND, OR, NOT
SELECT mem_name, height, mem_number
FROM member
WHERE height >= 165 AND mem_number > 6;
SELECT mem_name, height, mem_number
FROM member
WHERE height >= 165 OR mem_number > 6;
- 범위에 있는 값 : BETWEEN ~ AND
SELECT mem_name, height
FROM member
WHERE height BETWEEN 163 AND 165;
- 집합 연샨자 : IN, NOT IN
IN은 조건식에서 여러 문자 중 하나에 포함되는지 비교할 때 간결하게 사용할 수 있음
SELECT mem_name, addr
FROM member
WHERE addr IN ('경기', '전남', '경남');
- 문자열의 일부 글자를 검색하려면 LIKE 사용 ★
SELECT *
FROM member
WHERE mem_name LIKE '우%';
SELECT *
FROM member
WHERE mem_name LIKE '__핑크';
- NULL을 이용한 검색
IS NULL : 특정 속성의 값이 널 값인지 비교 / IS NOT NULL : 특정 속성의 값이 널 값이 아닌지 비교
이때, 검색 조건에서 널 값은 다른 값과 크기를 비교하면 결과가 모두 거짓이 됨 !!
※ 서브쿼리 : SELECT 안에 또 다른 SELECT 문을 사용할 수 있음
4) GROUP BY 절
그룹으로 묶어주는 역할을 함. 주로 집계함수와 함께 사용
집계 함수(aggregate function)는 열 함수(column function)라고도 부르며, 특정 속성 값을 통계적으로 계산한 결과를 검색하기 위해 집계 함수를 이용함. 이때, 속성의 값이 실제로 변경되는 것은 아니고, 결과 테이블에서만 계산 결과가 출력됨.
+) COUNT(DISTINCT) : 행의 개수를 세는데 중복은 1개만 인정
단, 널인 속성 값은 제외하고 계산 ★
WHERE 절에서는 사용할 수 없고, SELECT 절이나 HAVING 절에서만 사용 가능 ★
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
FROM buy
GROUP BY mem_id;
열 이름의 별칭은 AS 키워드를 이용해 결과 테이블에서 속성의 이름을 바꾸어 출력 가능함 (생략 가능한 옵션). 필드 제목이 길거나 계산식에 의해 복잡할 때 사용하면 좋고, 별칭에 공백이 있으면 작은따옴표(’’)로 묶음. 대부분 공백 있든 없든 묶어 쓰길 권장.
5) HAVING 절
HAVING은 집계 함수에 관련된 조건을 제한하고, 무조건 GROUP BY 다음에 나옴.
(WHERE 절에서는 집계 함수를 사용할 수 없음)
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
FROM buy
GROUP BY mem_id
HAVING SUM(price*amount) > 1000
ORDER BY SUM(price*amount) DESC;
6) ORDER BY 절
결과의 값이나 개수에 대해서는 영향을 미치지 않지만, 결과가 출력되는 순서를 조절함
ASC는 오름차순(기본값), DESC는 내림차순 정렬
SELECT mem_id, mem_name, debut_date
FROM member
ORDER BY debut_date;
SELECT mem_id, mem_name, debut_date
FROM member
ORDER BY debut_date DESC;
정렬 기준은 1개 열이 아니라 여러 개 열로 지정할 수 있음 (쓴 순서대로 정렬되는 기준에 있어 우선순위!)
SELECT mem_id, mem_name, debut_date
FROM member
ORDER BY height DESC, debut_date ASC;
- LIMIT : 출력하는 개수를 제한 → LIMIT 시작, 개수 형태로 사용
- DISTINCT : 조회된 결과에서 중복된 데이터를 1개만 남김
※ 여러 가지 요소가 중첩된 SQL 문의 실행 순서 예시
SELECT custid, COUNT(*) AS 도서수량 (5)
FROM Orders (1)
WHERE saleprice >= 8000 (2)
GROUP BY custid (3)
HAVING count(*) > 1 (4)
ORDER BY custid; (6)
'Database > MySQL' 카테고리의 다른 글
[MySQL] 조인(Join) (1) | 2023.12.22 |
---|---|
[MySQL] 데이터 형식 (숫자, 문자, 날짜형) (0) | 2023.12.22 |
[MySQL] 데이터 변경을 위한 SQL문 : INSERT, UPDATE, DELETE (0) | 2023.12.11 |
[MySQL] 실전용 SQL 미리 맛보기 (0) | 2023.12.08 |
[MySQL] 데이터베이스와 SQL (1) | 2023.12.07 |