SELECT문
select 문은 데이터 조회를 위해서 사용하는 구문이다.
문법 사용 방식
select (열 이름) from (테이블 이름) where(조건식) group by(열 이름) having(조건식) order by(열 이름) limit 숫자;
위의 문법에서 wherem group by, having, order by, limit 는 생략이 가능하다.
SELECT * FROM member;
select
테이블에서 데이터를 가져올 때 사용하는 예약어이다.
*(asterisk) : 일반적으로 "모든 것"을 의미하며 위 예시에서는 열 이름이 들어갈 자리에 사용되어 "모든 열"을 의미한다.
from
데이터를 가져올 테이블을 지정할 때 사용하는 예약어 이다.
member
조회할 테이블의 이름이다.
위 문장의 뜻은 member 테이블에서 모든 열의 내용을 가져와라 라는 뜻이다.

문장을 실행하면 이런 결과값이 출력된다.
원칙적으로는 데이터베이스.테이블의 형태로 작성해야 한다.
하지만 계속 작성하기에는 오타같은 실수를 할 수 있어서 사용할 데이터베이스를 지정해줄 수 있다.
use market_db;
저 문장으로 데이터베이스를 지정한다.
필요한 열만 가져오기
member 에서 mem_name 가져오기
select mem_name from member;

컬럼 명으로 필요한 열의 정보만 가져올 수 있다.
만약 여러 열을 가져오고 싶으면 콤마로 연결해서 가져올 수 있다.
기존 테이블의 열 순서는 상관없이 보고싶은 순서대로 열을 나열한다.
select addr, debut_date, mem_name from member;

기존 열 순서와 다르지만 본인이 지정한 순서대로 컬럼들이 보이게 된다.
열 이름에 별칭 지어주기
열 이름 다음에 지정하고 싶은 별칭을 지정한다. 만약 지정하고 싶은 별칭에 공백이 있으면 따옴표로 묶어서 표시한다.
select addr 주소, debut_date "데뷔 일자", mem_name from member;

본인이 지정하고 싶은 별칭으로 컬럼명이 변경된것을 확인할 수 있다.
특정 조건에 맞는 데이터만 조회하기
실무에서는 많은 데이터를 다루기 때문에 조건을 설정을 안하고 모두 가져오면 컴퓨터에 부하가 걸릴 수 있다.
따라서 그 부하 문제를 해결하기 위해서 조건을 설정하고 그 조건에 맞는 데이터만 가져온다.
문법 사용 방식
select (열 이름) from (테이블 이름) where 조건식;
select * from member where mem_name = "블랙핑크";

조건에 맞는 1개의 열만 나오는 것을 확인할 수 있다.
관계 연산자, 논리 연산자
where 로 조건식을 작성할 때 연산자를 사용해서 조건을 줄 수 있다.
연산자를 사용해서 조건식을 작성할 때 숫자로 표현된 데이터에만 사용할 수 있다.
select mem_id, mem_name, height from member where height <= 162;

height의 값이 162 보다 작거나 같은 열들만 나오게 된다.
논리 연산자를 사용해서 여러 조건을 만족하도록 할 수 있다.
select mem_name, height, mem_number from member where height >= 165 and mem_number > 6;

위에서 설정한 height의 값이 165 보다 크거나 같고 mem_number 가 6보다 큰 열들만 출력된다.
select mem_name, height, mem_number from member where height >= 165 or mem_number > 6;

위에서 설정한 height값이 165 보다 크거나 같은 열과 mem_number 가 6보다 큰 열들을 모두 출력하게 된다.
between
select mem_name, height from member where 163 <= height and height <= 165;

방금 사용한 논리 연산자로도 표현이 가능하지면 저 문장의 가독성이 떨어지므로 between 예약어를 사용하는 것이 좋다.
문법 사용 방법
between a and b
select mem_name, height from member where height between 163 and 165;

같은 역할을 수행하지만 가독성이 더좋은 between 을 주로 사용한다.
in
select mem_name, addr from member where addr = "경기" or addr="전남" or addr = "경남";

방금 사용한 논리 연산자로도 표현이 가능하지면 저 문장의 가독성이 떨어지고 유지보수도 하기 힘들기 때문에 in 예약어를 사용하는 것이 좋다.
문법 사용 방식
where (컬럼 명) in (값1, 값2, 값3, ...)
select mem_name, addr from member where addr in ("경기", "전남", "경남");

like
1. 문자열 일부 검색
select * from member where mem_name like "%이%";

%는 앞이나 뒤에 사용이 가능하다.
% 는 어떤 값이 들어올지 모를 때 사용한다.
2. 글자 수 매치
select * from member where mem_name like"__핑크";

언더바(_) 하나당 하나의 문자열이 들어가는 형식이다.
% 와는 다르게 언더바 하나당 하나의 문자열이 들어가기 때문에 찾으려는 글자 수가 언더바보다 많거나 적다면 그 값은 출력되지 않는다.
order by
데이터 베이스에서 select 문에 사용하는 문법으로 정렬을 하기 위해서 사용한다.
정렬 옵션
- ASC : 오름차순 정렬
- DESC : 내림차순 정렬
만약 order by를사용하고 정렬 옵션을 따로 작성하지 않는다면 오름차순으로 정렬 된다.
select mem_id, mem_name, debut_date from member order by debut_date;

데뷔 일자로 정렬을 시킨 것이다.
member 에서 키가 164 이하인 회원들 키의 내림차순으로 정렬하기
select * from member where height >= 164 order by height DESC;

키의 순서대로 정렬이 되어서 나오게 된다.
limit
출력하려는 갯수의 숫자가 너무 많은 경우 출력 갯수를 제한하기 위해서 사용한다.
select * from member limit 3;

select * from 으로 전체조회를 했지만 limit 3으로 조건을 주었기 때문에 총 3개의 결과값만 출력되게 된다.
중복 제거하기
데이터에는 수많은 중복값이 있을 수 있다. 따라서 중복값이 많이 출력이 되지만 이러한 중복값은 출력이 안되게 할 수 있다.
이때 distinct 를 작성하고 보고싶은 열을 작성하면 겹치는 값들은 출력이 되지 않는다.
select distinct addr from member order by addr asc;

분명 addr 은 총 10개의 값이 있었지만 중복되는 값들을 보이지 않게 했기 때문에 겹치지않는 값들만 출력해서 총 5개의 값이 나오게 된다.
새로운 테이블 생성
CREATE TABLE buy
( num INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
mem_id CHAR(8) NOT NULL,
prod_name CHAR(6) NOT NULL,
group_name CHAR(4) ,
price INT NOT NULL,
amount SMALLINT NOT NULL,
FOREIGN KEY (mem_id) REFERENCES member(mem_id)
);
INSERT INTO buy VALUES(NULL, 'BLK', '지갑', NULL, 30, 2);
INSERT INTO buy VALUES(NULL, 'BLK', '맥북프로', '디지털', 1000, 1);
INSERT INTO buy VALUES(NULL, 'APN', '아이폰', '디지털', 200, 1);
INSERT INTO buy VALUES(NULL, 'MMU', '아이폰', '디지털', 200, 5);
INSERT INTO buy VALUES(NULL, 'BLK', '청바지', '패션', 50, 3);
INSERT INTO buy VALUES(NULL, 'MMU', '에어팟', '디지털', 80, 10);
INSERT INTO buy VALUES(NULL, 'GRL', 'SQL기초', '서적', 15, 5);
INSERT INTO buy VALUES(NULL, 'APN', 'SQL기초', '서적', 15, 2);
INSERT INTO buy VALUES(NULL, 'APN', '청바지', '패션', 50, 1);
INSERT INTO buy VALUES(NULL, 'MMU', '지갑', NULL, 30, 1);
INSERT INTO buy VALUES(NULL, 'APN', 'SQL기초', '서적', 15, 1);
INSERT INTO buy VALUES(NULL, 'MMU', '지갑', NULL, 30, 4);
group by
그룹화를 시킬 때 사용한다.
방금 위에서 만든 buy 테이블에서 각 멤버가 구매한 물품의 총 갯수를 알고싶을 때
select mem_id, sum(amount) from buy group by mem_id;

방금 실행한 코드 처럼 같은 값으로 저장된 열들을 그룹화해서 나타날 때 사용한다.
sum()
sum 함수는 같은 열들을 그룹화 할때 합쳐진 열들의 value값을 더할 때 사용한다.
select mem_id "회원 아이디", sum(price * amount) "총합" from buy group by mem_id;

price 와 amount 값을 곱한 이후 나온 값들을 모두 더한 값이 나오게 된다.
avg()
avg 함수는 같은 열들을 그룹화 할때 합쳐진 열들의 value 값을 더한 이후 합쳐진 열들의 갯수로 나누어 평균을 구할 때 사용한다.
select mem_id "회원 아이디", avg(amount) "평균 구매 개수" from buy group by mem_id;

amount 로 총 갯수를 구한 다음 값이 합쳐진 열들의 갯수만큼 나누어 평균을 구한값이 나오게 된다.
count()
count 함수는 같은 열들을 그룹화 할 때 합쳐진 열들의 갯수를 구할 때 사용한다.
select count(*) from member;

총 열의 갯수를 반환 해준다.
having
group by 를 사용한 이후 조건을 추가하고 싶을 때 사용한다.
select mem_id "회원 아이디", sum(price * amount) "총 구매 금액" from buy group by mem_id;
위 데이터에서 총 구매액이 1000 이상인 회원에게만 사은품을 증정하려 한다면
조건을 추가하기 위해서 having을 사용해야 한다.
그 이유는 group by 에서는 집계함수를 사용할 수 없기 때문이다.
select mem_id "회원 아이디", sum(price * amount) "총 구매 금액" from buy group by mem_id having sum(price * amount) >= 1000;

group by 에서 having으로 조건을 주어서 총 구매 금액이 1000 이상인 고객의 데이터만 찾을 수 있다.
'데이터베이스' 카테고리의 다른 글
| MySQL 데이터 수정 (0) | 2023.05.15 |
|---|---|
| MySQL 데이터 추가 (1) | 2023.05.15 |
| MySQL 데이터베이스, Table 생성하기 (0) | 2023.05.11 |
| 데이터베이스 (0) | 2023.05.11 |
| MariaDB 테이블 (0) | 2022.10.09 |