· update, delete 써서 수정하거나 지우고자 할 때는 where 조건 절에 id를 사용한다.
· INSTR 함수 = LIKE (‘%%’)
문자열에서 원하는 문자를 찾을 때 사용.
ex) where c.pname like '% %' = Instr(c.pname, ‘냉장고’)
· update문 쓸 때 서브쿼리 쓸 시, alias 주지 말자
· mysql에서 쿼리문을 쓸 때 문자(string)타입은 항상 큰 따옴표가 아니라 작은따옴표 ‘ ’를 적어야한다.
· 컬럼을 합칠 때 컬럼명을 통일시켜야함으로 알리아스(alias)를 모든 sql문 컬럼에 전부 다 적용해야한다.
그래야 합쳐짐.
· mysql문의 if 문 쓰는 방법
if (조건문, 참일 때 값, 거짓일 때 값)
· min(indate) : 오래된 날짜
· max(indate) : 최신 날짜
< CONCAT 함수 >
문자열을 합치는 연산자
ex) CONCAT(c.pname,' ',c.psize)
< LEFT JOIN >
- 왼쪽 테이블을 중심으로 오른쪽의 테이블을 매치시킨다.
ex) 2023년 매입매출을 보여주세요 (날짜, 구분, 거래처명, 제품명, 제품규격, 수량, 단가 합계)
SELECT a.indate, a.type, b.cname, c.pname, c.psize, a.cnt, a.total
FROM zpan as a LEFT JOIN zcompany as b on a.cid = b.id
LEFT JOIN zproduct as c on a.pid = c.id
where a.indate BETWEEN '2023-01-01' and '2023-12-31';
ex) 4개 테이블 조인
SELECT b.indate, a.cname, c.psize, b.type, d.method
FROM zcompany as a LEFT JOIN zpan as b on a.id = b.cid
LEFT JOIN zproduct as c on b.pid = c.id
LEFT JOIN zmoney as d on d.cid = a.id;
< RIGHT JOIN>
- 오른쪽 테이블을 중심으로 왼쪽의 테이블을 매치시키다.
ex) 2023년 매입매출을 보여주세요 (날짜, 구분, 거래처명, 제품명, 제품규격, 수량, 단가 합계)
SELECT b.indate, b.type, a.cname, c.pname, c.psize, b.cnt, b.total
FROM zcompany as a RIGHT JOIN zpan as b on a.id = b.cid
RIGHT JOIN zproduct as c on b.pid = c.id
where indate>= '2023-01-01';
< Union all >
쿼리 결과 합치기
select _____________
union all
select _____________
이 때 중요한 점. union 할 컬럼 개수가 같아야한다.
한쪽 테이블에 대조할 컬럼이 없는 경우 ''을 기입하여 개수를 맞춰준다
ex)
select indate, type, cid, pid from zpan;
union all
select cid, '', cname, '' from zcompany;
유의사항 :
· 우리는 회사명을 결과적으로 보여줘야하지만, 과정속에서는 id 번호를 가지고 SQL문 코드를 작성한다
· 그룹화도 회사id번호를 가지고 함.
그룹화를 하지 않으면 각각 id마다의 결과값이 아닌 랜덤의 한 개 결과값만 출력한다.
· union 을 할때는 필드 개수를 맞춰주는게 중요.
union 할 때 각 select문마다 알리아스(alias)를 써주는 이유는 합친후의 컬럼 이름을 동일하게 맞춰주는 용도로 사용하기 때문이지 그 이외의 의미는 없다.
· 서브쿼리는 ()안에 넣어서 사용하며 다른 쿼리 내부에 포함된 쿼리를 의미한다.
한 줄로 결과값을 표현하자고자 할때는 select절에 서브쿼리를 사용할 수 있다.
ex)
SELECT T1.C1 ,(SELECT AVG(T2.C1) FROM TEMP2 T2) FROM TEMP1 T1;
· left 조인은 select 절에 표시해줘야할 컬럼정보가 from절의 테이블에 없는경우, 다른 테이블에서 가져와서 select절에 보여줘야 할 때에만 사용
left join 할 때 자주 착각하는거.
ex)SELECT zcom.cname, SUM(t1) from ( ... ) as k LEFT JOIN zcompany as zcom on k.s1 = zcom.id
여기서 'k와 zcompany가 left join을 한다.' 기 때문에 as k LEFT JOIN zcompany as zcom on 까지가 join 구문이다.
on 뒤의 k.s1 = zcom.id 는 where절 조건일뿐이지, left join과는 상관없음.
select절에 zcom.cname을 쓰지 않으면 left join을 쓸 이유가 없음.
ex)
update zcompany
SET tmoney=smoney + IFNULL((SELECT sum(zpan.total) FROM zpan WHERE zpan.cid=zcompany.id and zpan.type='매출'),0)
- IFNULL((SELECT sum(zpan.total) FROM zpan WHERE zpan.cid=zcompany.id and zpan.type='매입'),0)
- IFNULL((SELECT sum(zmoney.money) FROM zmoney WHERE zmoney.cid=zcompany.id and zmoney.type='입금'),0)
+ IFNULL((SELECT sum(zmoney.money) FROM zmoney WHERE zmoney.cid=zcompany.id and zmoney.type='지급'),0);
· having 절은 '서브쿼리, where절 group by를 지나 select 까지 완성된 결과값'에 대한 조건을 걸 수 있는 문장.
ex) <> 0
는 0이 아니라는 의미.
'PHP > DB' 카테고리의 다른 글
[DB] DB sql문 1 (0) | 2023.02.17 |
---|---|
[DB] DB sql문 (group by, union all) (0) | 2023.02.17 |
[DB]테이블 및 칼럼(필드) 생성 시 고려할 사항 (0) | 2023.02.15 |
[PHP][DB]PHP로 DB를 연결해 HTML로 쏴주는 게시판 만들기 (0) | 2023.02.13 |
[PHP][DB] PHP에서 select구문 작성 (0) | 2023.02.13 |