PROGRAMMING WORKSHOP

Skip Navigation Links. Skip Navigation Links.

Access와 Excel의 연동_8|
SQL - Select,Where(조건절)

몇가지 키워드를 알면 DB에서 보고 싶은 것을 마음대로 가져오고
분석도하고 흥미로와진다
VB.Net에서 LINQ언어는 SQL언어보다도 더 발전된 흥미로운 것이지만
SQL언어를 익숙하게 하는 것이 DB를 마음대로 다룰수 있는 방법이다
정보관리라고 하는 것은
정보를 입력하고 (Insert)
정보를 편집수정하고(Update)
정보를 불러오고,조회하고(Select)
정보를 삭제하고(Delete)
가 기본인 것이고, Insert,Update,Select,Delete라는 단어는 SQL의 기본단어들이다

그리고 VBA프로그래밍에서 경험하였듯이
항상 어떤 작업이던 조건이라는 것이 쫓아다닌다
삭제(Delete)를 하기는 하는데 어떤 휠드의 어떤값이 어떠할때 삭제하라 라는 조건이 붙을 것이고
수정(Update)를 할때도 역시 어떤 휠드의 어떤값이 어떠할때 라는 조건이 붙을 것이고
조회(Select)를 할때도 역시 어떤 휠드의 어떤값이 어떠할때 라는 조건이 붙어서
해당 정보를 갖여 오라고 할 것이다
입력(Insert)를 하는 경우는 조건없이 그냥 입력하면 되는 것이고
문제는 어떤 조건이 어떠할때라는 것을 SQL에서 표현하는 키워드가 있다는 것일것이고
이것을 알면 되는 것이다
VBA에서 논리식을 질리도록 하여서 이것은 거저 먹는 것이다
단지 WHERE라는 키워드만 붙이면 된다
WHERE 어떤휠드값>100
빨강색에 들어가는 논리식은 If문에서 워크시트수식의 논리식에서
수도 없이 이미 사용한 것이다
아하..어떤 휠드값이 100보다 크면 처리하라는 것이구나... 그냥 WHERE를 하나 붙이는구나....
몇자 툭툭 입력하여 보고 싶은 정보를 훅훅 가져 오는 것을 보고 부러워하였다면
정말 별것도 아닌것에 맛이 갔던 것일 것이다
VBA에서 죄다 배운 것이다
뭔소린지 모르면 VBA의 내공이 아직 머리속에 자동화되지 않은 상태이니
VBA에 좀더 집중하시고...

그러니
SELECT A휠드,B휠드,C휠드
FROM 테이블Q
WHERE A휠드>100

아하..테이블Q에서(FROM) 여러개의 휠드가있겠지만, A휠드,B휠드,C휠드만을 가져 온다(SELECT)
조건은 A휠드가 100보다 크면 가져 오라는 것이로구나..

너무 쉽다..거저 먹는 것이다
SELECT B휠드,C휠드,D휠드
FROM 테이블Q
WHERE A휠드>100

라고 해도 상관없이 A휠드는 조건만 준것이고 가져오는 것은 A휠드를 제외한
다른 휠드를 가져와도 되는 것이고..

휠드를 모두 가져오고 싶은데 일일이 휠드명을 입력하기 싫으면

SELECT *
FROM 테이블Q
WHERE A휠드>100

와 같이 *문자를 사용하면 되는 것이고

여기에 정렬을 하고 싶다면
어떤 휠드를 기준으로 정렬을 할 것인지를 주면 된다
정렬의 키워드는 ORDER BY

SELECT *
FROM 테이블Q
WHERE A휠드>100
ORDER BY B휠드


특별한 조치가 없이 위와 같이하면 B휠드를 오름차로 정리한다
하지만 내림차로 하고 싶다면 내림차표시를 주면 된다

SELECT *
FROM 테이블Q
WHERE A휠드>100
ORDER BY B휠드 DESC


내림차는 DESC , 오름차는 ASC
아마도 엑셀에서 정렬작업을 하거나 휠터작업을 마우스로 하는 것 보다도
훨씬간단하고 정렬의 갯수도 제한없이 할수 있는 것이고

SELECT *
FROM 테이블Q
WHERE A휠드>100
ORDER BY B휠드 DESC, A휠드 ASC


좀더 WHERE절(Clause)을 보면...조건식을 넣는 곳이라고 했으니..
VBA에서의 논리연산자, 워크시트함수에서는 논리함수등이 모두 역시 적용된다

SELECT * FROM 테이블Q
WHERE 휠드A='서울' AND (휠드B='사과' OR 휠드B='오렌지')

휠드A값은 서울이고, 휠드B값이 사과이거나 휠드B값이 오렌지일때..

VBA에서 쌓아온것이 그대로 확장이 되는 것이다
문자열값을 비교할때는 홑따옴표(')를 붙이는 것을 잊으면 안된다
바로 이런 부분에서 SQL문을 편집하면서 머리를 쥐어뜯는 부분이다
문자열값과 숫자값을 받드시 구분하여야 한다

VBA에서 연산자 LIKE를 자주사용해보셨다면 다행인것이
WHERE절의 조건에서도 역시 LIKE라는 키워드가 사용된다

SELECT 휠드A FROM 테이블Q
WHERE 휠드A값 Not Like '713*' And 휠드A값 Not Like '714*' And 휠드A Not Like '281*'

휠드A가 전화번호등 일련번호를 문자열로 보관할 일일때
앞의 숫자(문자로 표현된)값이 앞자리몇개만 조건을 주고 나머지는 아무값이나 상관없다고 할때
와일드 문자(*)를 사용한다, 이것도 물론 VBA에서 하였던것과 같다..

하지만 이문자는 Access가 아닌 MS-SQL같은 DB에서는 %를 사용한다
WHERE 휠드A값 Not Like '713%' And 휠드A값 Not Like '714%' And 휠드A Not Like '281%'

그냥 참고로 알아두었다가 억세스에서 MS-SQL등으로 마이그레이션시킬때는 알아야 할 것이다

억세스의 쿼리디자인창에서 작성된 SQL문을 보면

SELECT 테이블Q.[B휠드],테이블Q.[C휠드],테이블Q.[D휠드]
FROM 테이블Q
WHERE 테이블Q.[A휠드]>100

와 같이 테이블명이 붙고 쩜찍고 [ ] 괄호로 휠드명을 둘러쌓고 표현된다
이것은 휠드 A, 휠드 B와 같이 중간에 빈문자가 있거나
휠드_1, 휠드_2, 휠드_3 등과같이 숫자와 특수문자등이 열결된 휠드명을
이해하지 못하고 에러를 내는 경우가 많다 , 그래서 안전을 위하여 항상 휠드명을
[] 괄호로 쌓아주는 것이 바람직하다
에러가 날때, 에러메시지를 잘 읽어보고 아하..휠드명을 인식못하는구나??!! 정도를
알아야 한다, 그래서 수정을 하게 되니까..
테이블명을 붙여서 작성된 이유는 DB는 관계형DB이기때문에 테이블이
여러개 연결되는 것으로 전제하고 작업을 하는 것이다
그래서 테이블이 하나이더라도 테이블명이 명시적으로 붙는 것이다
여러분이 이것을 복사하여 붙여 넣기를 하고 VBA에서 활용을 할때 테이블명을 없애도 좋고
[]를 없애도 좋다, 휠드명이 특수하지 않는한..

WHERE절(조건절)에서 하나 또 중요한 것이 있다
문자정보는 홑따옴표를 붙여 준다고 했고 , 숫자는 그냥 전달하면 되지만
날짜나 시간정보는 어떻게 전달할 것인가??? 가 중요한 것이다

SELECT A휠드,B휠드,C휠드
FROM 테이블Q
Where (A휠드 >= #03/09/2015#) and (A휠드 < #03/19/2015#)

이 #표시는 새로 생긴것이 아니고 VBA에서도 이미 사용하고 있는 것이다
직접실행창에
?month(#2016/3/3#)
라고 입력하면 해당일자의 월값을 자연스럽게 얻는 것을 볼수 있으니,
이미 VBA에서 사용하던 부호인것이다

혹은 위의 날자를 ...
WHERE Format(A휠드,"yyyy-mm-dd")>='2015-03-09' AND Format(A휠드,"yyyy-mm-dd")<'2015-03-19'

와 같이 DB의 휠드값을 문자열로 바꾼후 날짜정보를 문자열로 비교하여도 되고
상황에 따라서 여러분들의 VBA에 내공으로 처리가 되게 된다

와 같이 #문자로 날짜정보나 시간정보를 감싸준다
아래와 같이 버튼 3개를 추가하고
1)애완동물콤보상자에서 선택된 애완동물의 진료내용을 모두 보게 하고
2)진료방법콤보상자에서 선택된 진료방법으로 진료한 내용을 전부 보도록 하고
3)어떤 애완동물이 어떤 진료방법으로 진료를 받았는지 모두 보도록 하는 SQL문을 작성해보자
요령만 알면 정말 별것도 아닌 것이로구나..라는 것을 점점 알아가게 된다
그리고 UserForm의 목록상자는 열머리가 보이게 하려면
워크시트의 테이블을 RowSource속성에 해당 테이블 범위주소를 사용하고
열머리를 사용하겠다는 속성값을 주어야 한다
화일에 설명이 있으니 차근 차근 보시면 된다



Range개체의 CopyFromRecordset 메소드의 쓰임새도 잘 관찰하시도록..

***[LOG-IN]***