(6)MySQL_기본문법
서브쿼리(Sub Query)
- 다른 쿼리 내부에 포함되어 있는 select 문을 의미
- 서브쿼리를 포함하고 있는 쿼리를 외부쿼리라고 부르고, 서브쿼리는 내부쿼리라고도 부름
- 서브쿼리는 괄호()로 감싸져서 표현
- 서브쿼리는 메인쿼리 컬럼 사용이 가능하여, 메인쿼리는 서브쿼리 컬럼을 사용하지 못함
- select, where, from, having 절 등에서 사용할 수 있음
where 절 서브쿼리
select * from product
where price > (select price from product where code = '100001');
select 절
- 코드, 이름, 가격, 전체 데이터의 가격중 가장 큰 값을 출력하는 쿼리
- 서브쿼리를 사용
select code, name, price, (select max(price) from product) max
from product;
create table orders(
no int not null,
userid varchar(20) not null,
product varchar(100) not null,
cnt int default 1,
regdate datetime default now(),
foreign key(userid) references member(userid)
);
insert into orders(no, userid,product,cnt) values (1, 'apple','사과',3);
insert into orders(no, userid,product,cnt) values (2, 'apple','꿀사과',2);
insert into orders(no, userid,product,cnt) values (3, 'banana','바나나',5);
insert into orders(no, userid,product,cnt) values (4, 'banana','딸바',1);
insert into orders(no, userid,product,cnt) values (5, 'orange','오렌지',2);
insert into orders(no, userid,product,cnt) values (6, 'berry','블루베리',3);
상품을 최소 2번 이상 구입한 회원의 id, 이름, 성별을 출력
서브쿼리 사용
select userid, username, gender, address1
from member
where userid
in (select userid from orders group by userid having count(no) >= 2);
상품을 2번 이상 구입한 사용자의 아이디, 상품 구입횟수, 시도이름를 출력
서브쿼리를 사용
select userid,count(no) as ocnt from orders group by userid having count(no)>=2; #이것을 하나의 테이블로이용
select m.userid,t.ocnt,substring(m.address1,1,3) as address from member as m
right outer join
(select userid,count(no) as ocnt from orders group by userid having count(no)>=2) as t
on m.userid =t.userid ;
orders와 동일한 형태의 테이블을 생성
create table orders2(
no int not null,
userid varchar(20) not null,
product varchar(100) not null,
cnt int default 1,
regdate datetime default now(),
foreign key(userid) references member(userid)
);
- 테이블 복사
insert into orders2(select * from orders);
- 다른방법
create table orders3(select * from orders);
MySQL 문자열 함수
- concat: 복수의 문자열을 연결해주는 함수
select concat('안녕','하세요') as concat;
select concat(address1, ' ',address2, ' ', address3) 주소 from member;
left, right: 왼쪽 또는 오른쪽에서 길이만큼 문자열을 가져옴
select left('ABCDEFGHIJKLMN',5);
select right('ABCDEFGHIJKLMN',5);
substring: 문자열의 일부를 가져옴
substring(문자열, 시작위치, 길이)
select substr('ABCDEFGHIJKLMN',5,5);
select substr(address1,1,3) as 주소 from member where userid='orange';
char_length: 문자열의 길이를 반환
select char_length('ABCDEFGHIJKLMN');
select char_length(email) as len from member;
lpad, rpad: 왼쪽 또는 오른쪽의 해당 길이만큼 늘리고 빈 공간을 채울 문자열을 반환
select lpad('ABCDEFG', 10,'0');
select lpad(point,5,0) from member;
ltrim, rtrim, trim: 왼쪽 또는 오른쪽 모든 공백을 제거
select ltrim(' ABCDEFGH IJKLMN ');
replace: 문자열에서 특정 문자열을 변경
- replace(문자열, 대상, 바꿀 문자열)
select replace('ABCDEFGH','CD','✔');