본문 바로가기
PHP/DB

[DB]SQL문 작성하기 이론 및 팁

by 개발하자구 2023. 2. 15.

· 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이 아니라는 의미.