데이터베이스
멤버 전체 출력문
SELECT * FROM member;주의사항
더블 클릭하여 선택된 shop_db에 적용시킨 후 사용
인덱스 생성 & 인덱스를 통한 검색
CREATE INDEX idx_member_name ON member(member_name);
- 생성완료
- 인덱스 생성 후 테이블 검색
- 인덱스 검색
- 일반적인 검색일 경우 어디를 찾아갈지 몰라서 전체 테이블을 검색
- Key Lookup은 인덱스를 통해 결과를 찾은 것
- data양이 많을 경우 인덱스를 사용하여 정보 찾기
- 즉, 책의 내용을 찾을 때 찾아보기 기능을 통해 시간 단축
SQL 기본 문법
SELECT 열 이름...
FROM 테이블 이름
WHERE 열이름 조건식(관계연산자, 논리연산자)입력/수정/삭제 기능
UPDATE: 회원의 주소나 연락처가 변경되어 정보를 수정할 때DELETE: 회원이 탈퇴해서 회원을 삭제할 때INERT: 새로 가입한 회원을 테이블에 입력! 주의사항 !
DELETE, UPDATE 전에 SELECT를 해볼 것, 지우고자 하는 데이터가 맞는지, 결과 값이 맞는지 확인하기
- 두 개의 테이블 비교
- 회원 테이블 = primary 키 / 구매 테이블 = 여러 구매 존재
- 회원 테이블 - 구매 테이블 : 1대 다
- primary키 : 중심, 유일, 중복X
- 회원 테이블에 없는 아이디가 구매를 하는 것은 불가능
- 다른 구매자가 구매를 할 경우 배송을 하는데 보낼 곳이 없는 것과 동일 (설계자의 중요성)
실습
사용 marketdb
DROP DATABASE IF EXISTS market_db; -- 만약 market_db가 존재하면 우선 삭제한다. CREATE DATABASE market_db; 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 -- 데뷔 일자 ); 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 SMALLINT NOT NULL, -- 수량 FOREIGN KEY (mem_id) REFERENCES member(mem_id) ); INSERT INTO member VALUES('TWC', '트와이스', 9, '서울', '02', '11111111', 167, '2015.10.19'); INSERT INTO member VALUES('BLK', '블랙핑크', 4, '경남', '055', '22222222', 163, '2016.08.08'); INSERT INTO member VALUES('WMN', '여자친구', 6, '경기', '031', '33333333', 166, '2015.01.15'); INSERT INTO member VALUES('OMY', '오마이걸', 7, '서울', NULL, NULL, 160, '2015.04.21'); INSERT INTO member VALUES('GRL', '소녀시대', 8, '서울', '02', '44444444', 168, '2007.08.02'); INSERT INTO member VALUES('ITZ', '잇지', 5, '경남', NULL, NULL, 167, '2019.02.12'); INSERT INTO member VALUES('RED', '레드벨벳', 4, '경북', '054', '55555555', 161, '2014.08.01'); INSERT INTO member VALUES('APN', '에이핑크', 6, '경기', '031', '77777777', 164, '2011.02.10'); INSERT INTO member VALUES('SPC', '우주소녀', 13, '서울', '02', '88888888', 162, '2016.02.25'); INSERT INTO member VALUES('MMU', '마마무', 4, '전남', '061', '99999999', 165, '2014.06.19'); 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);
where 필요한 것들만 골라서 결과를 보는 효과
select * from member where mem_name = '블랙핑크'; select * from member where mem_number = 4;
관계연산자, 논리연산자
select mem_id, mem_name from member where height <= 162;AND
select mem_name, height, mem_number from member where height >= 165 AND mem_number > 6;OR
select mem_name, height, mem_number from member where height >= 165 OR mem_number > 6;BETWEEN
select mem_name, height from member where height BETWEEN 163 AND 165;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'__핑크'; select mem_name, height from member where height > ( select height from member where mem_name = '에이핑크' );
GROUP BY절
지정한 열의 데이터들을 같은 데이터끼리 묶어서 결과 추출
ORDER BY절
결과의 값이나 개수에는 영향을 미치지 않지만, 결과가 출력되는 순서 조절
select mem_id, mem_name, debut_date from member order by debut_date;
기본 값 ASC : 오름차순
DESC : 내림차순
select mem_id, mem_name, debut_date from member order by debut_date DESC; ### 평균 키가 164 이상인 회원들이 키가 큰 순서대로 출력 select mem_id, mem_name, debut_date, height from member where height >= 164 order by height DESC; select mem_id, mem_name, debut_date, height from member where height >= 164 order by height DESC, debut_date ASC;
limit
select mem_name, debut_date from member order by debut_date limit 3; select mem_name, height from member order by height DESC limit 3,2;
중복된 결과 제거 DISTINCT
select distinct addr from member;
GROUP BY절
select mem_id, sum(amount) from buy group by mem_id; select mem_id "회원 아이디", sum(amount) "총 구매 개수" from buy group by mem_id; select mem_id '회원 아이디', sum(price * amount) '총 구매 금액' from buy group by mem_id; select avg(amount) from buy; select mem_id, avg(amount) '평균 구매 개수' from buy group by mem_id;
Having절
Group by절 다음에 나와야 함
조건 제한
select mem_id '회원 아이디', sum(price * amount) '총 구매 금액' from buy group by mem_id having sum(price*amount) > 1000; select mem_id '회원 아이디', sum(price * amount) '총 구매 금액' from buy group by mem_id having sum(price*amount) > 1000 order by sum(price*amount) DESC;
INSERT : 데이터 입력
create table hongong1 ( toy_id int, toy_name char(4), age int ); insert into hongong1 values (1,'우디',25);
자동으로 증가하는 AUTO_INCREMENT
- 열을 정의할 때 1부터 증가하는 값 입력
- AUTO_INCREMENT로 지정하는 열은 꼭 PRIMARY KEY로 지정
create table hongong2 ( toy_id int auto_increment primary key, toy_name char(4), age int ); insert into hongong2 values (NULL, '보핍',25); insert into hongong2 values (NULL, '슬링키',22); insert into hongong2 values (NULL, '렉스',21); select * from hongong2; select last_insert_id(); alter table hongong2 auto_increment = 100; insert into hongong2 values (null,'재남',35); select * from hongong2; create table hongong3 ( toy_id int auto_increment primary key, toy_name char(4), age int );
시작 숫자를 1000으로 설정 후 3씩 증가
alter table hongong3 auto_increment = 1000; set @@auto_increment_increment = 3; insert into hongong3 values (null, '토마스',20); insert into hongong3 values (null, '제임스',23); insert into hongong3 values (null, '토마스',25); select * from hongong3;
INSERT INTO ~ SELECT
select count(*) from world.city; desc world.city; select * from world.city limit 5; create table city_popul( city_name char(35), population int ); insert into city_popul select name, population from world.city;
update : 기존에 입력되어 있는 값을 수정하는 명령
update city_popul set city_name = '서울' where city_name = 'Seoul'; select * from city_popul where city_name = '서울';
명을 변경하면서 값도 0으로 설정
update city_popul set city_name = '뉴욕', population = 0 where city_name = 'New York'; select * from city_popul where city_name = '뉴욕';
delete : 데이터 삭제
delete from city_popul where city_name like 'New%'; create database netfilx_db; use neflix_db; create table moive( movie_id int, movue_title varchar(30), movie_director varchar(20), movie_star varchar(20), movie_script longtext, movie_film longblob );
인덱스
create table table1( col1 int primary key, col2 int, col3 int ); show index from table1; create table table2( col1 int primary key, col2 int unique, col3 int unique ); show index from table2; drop table if exists buy, member; create table member( mem_id char(8), mem_name varchar(10), mem_number int, addr char(2) ); insert into member values('TWC','트와이스',9,'서울'); insert into member values('BLK','블랙핑크',4,'경남'); insert into member values('WMN','여자친구',6,'경기'); insert into member values('OMY','오마이걸',7,'서울'); select * from member; alter table member add constraint primary key (mem_id); select * from member; alter table member drop primary key; alter table member add constraint primary key(mem_name); select * from member;