GSI

--===============================================================--
-- OUTER JOIN
--===============================================================--
-- OUTER JOIN에는 LEFT, RIGHT, FULL 을 OUTER JOIN에 추가할 수 있다.

-- LEFT OUTER JOIN의 의미를 "왼쪽 테이블의 것은 모두 출력 되어야 한다.
-- 정도로 해석하면 된다.
select U.userid, U.name, B.prodName, U.addr, U.mobile1 + U.mobile2 as [연락처]
from userTbl U
 left outer join buyTbl B
  on U.userid = B.userid
 order by U.userid

/* 결과
userid   name       prodName addr 연락처
-------- ---------- -------- ---- -----------
AJH      안정환        책        강원   NULL
CJC      최진철        모니터      제주   0190000000
CJC      최진철        메모리      제주   0190000000
CJC      최진철        운동화      제주   0190000000
CJC      최진철        운동화      제주   0190000000
JJJ      조재진        NULL     충북   0193333333
KNI      김남일        NULL     경북   0166666666
LCS      이천수        모니터      인천   0114444444
LYP      이용표        NULL     전북   NULL
PJS      박지성        NULL     서울   0111111111
PJY      박주영        운동화      경기   0112222222
PJY      박주영        노트북      경기   0112222222
PJY      박주영        청바지      경기   0112222222
SJK      송종국        NULL     경기   0189999999
SKH      설기현        책        서울   0118888888
SKH      설기현        청바지      서울   0118888888
SKH      설기현        책        서울   0118888888
*/
-- 위와 같이 NULL의 정보도 같이 출력되는 것을 볼 수 있다.
-- left outer join 을 left join으로만 기록해도 된다.

--
select U.userid, U.name, B.prodName, U.addr, U.mobile1 + U.mobile2 as [연락처]
from buyTbl B
 right outer join userTbl U
  on U.userid = B.userid
 order by U.userid

-- 결과는 위와 같다.

--

Posted by gsi
:

해당 UI의 버튼을 누를때 팝업창이 뜨고 싶다면
아래의 코드를 버튼 이벤트에 추가해 주어야 합니다.

조금 다른 부분이라면 aspx 파일을 팝업창으로 사용한다는 것이다.

protected void Button1_Click(object sender, EventArgs e)
    {
        StringBuilder strBuilder = new StringBuilder();

        strBuilder.Append("<script language='javascript'>");
        strBuilder.Append("w=810;h=620;");
        strBuilder.Append("x=Math.floor( (screen.availWidth-(w+12))/2 );y=Math.floor( (screen.availHeight-(h+30))/2 );");
        strBuilder.Append("window.open('Default2.aspx', '',");
        strBuilder.Append("'height='+h+',width='+w+',top='+y+',left='+x+',scrollbars=no,resizable=no');");
        strBuilder.Append("</script>");

        if (!ClientScript.IsClientScriptBlockRegistered("PopupScript"))
        {
            ClientScript.RegisterClientScriptBlock(this.GetType(), "PopupScript", strBuilder.ToString());
        }
    }
** 이때 StringBuilder 는 System.Text 네임스페이스를 추가해 주어야 합니다.

해당 팝업은 Web Form으로 추가 한 다음에
UI를 구성하시면 됩니다.
그리고 여기서 입력 또는 닫기 버튼을 통한 윈도우창 닫는 방법은 아래의 자바스크립트 코드를 추가해 주어야 합니다.

<script type="text/javascript">
 function submitComment()
    {
        var oForm = document.commentToComment; -- 보내기 위한 데이터가 존재하는 폼
        oForm.submit();  -- 다른 웹 페이지로 post 데이터를 보낸다.
        self.close(); -- 현재 창을 닫는다.
    }
</script>
Posted by gsi
:

--============================================================--
-- INNER JOIN
--============================================================--
use sqlDB
go

-- inner join 사용
-- 구매 테이블 중에 LCS 라는 아이디를 가진 사람이 구매한 물건을
-- 발송하기 위해서 이름/주소/연락처 등을 조인해서
-- 검색하려면 아래와 같이 사용
select *
from buyTbl
 inner join userTbl
  on buyTbl.userid = userTbl.userid
where buyTbl.userid='LCS'

/* 결과
num         userid   prodName ... birthYear   addr mobile1 mobile2  height
----------- -------- -------- --------- ----------- ------ -------- ---------- ----------- ---- ------- -------- ------
3           LCS      모니터   ...  1983        인천   011     4444444  179
*/

-- 아이디/이름/구매물품/주소/연락처만 추출
select buyTbl.userid, name, prodName, addr, mobile1 + mobile2 as [연락처]
from buyTbl
 inner join userTbl
  on buyTbl.userid = userTbl.userid

-- select userid << 이렇게 하면 buyTbl, userTbl에 userid가 있기 때문에
-- 오류가 납니다. 정확하게 명시를 해야 합니다.
-- >> buyTbl.userid 로 적어야 합니다.

/* 결과
userid   name       prodName addr 연락처
-------- ---------- -------- ---- -----------
PJY      박주영        운동화      경기   0112222222
PJY      박주영        노트북      경기   0112222222
LCS      이천수        모니터      인천   0114444444
CJC      최진철        모니터      제주   0190000000
PJY      박주영        청바지      경기   0112222222
CJC      최진철        메모리      제주   0190000000
*/

-- WHERE로 JOIN을 처리 할 수 있다.
select buyTbl.userid, name, prodName, addr, mobile1 + mobile2 as [연락처]
from buyTbl, userTbl
where buyTbl.userid = userTbl.userid

/* 결과
userid   name       prodName addr 연락처
-------- ---------- -------- ---- -----------
PJY      박주영        운동화      경기   0112222222
PJY      박주영        노트북      경기   0112222222
LCS      이천수        모니터      인천   0114444444
CJC      최진철        모니터      제주   0190000000
PJY      박주영        청바지      경기   0112222222
CJC      최진철        메모리      제주   0190000000
*/

-- 테이블에 별칭을 붙인다.
select B.userid, U.name, B.prodName, U.addr, U.mobile1 + U.mobile2 as [연락처]
from buyTbl B, userTbl U
where B.userid = U.userid

/* 결과
userid   name       prodName addr 연락처
-------- ---------- -------- ---- -----------
PJY      박주영        운동화      경기   0112222222
PJY      박주영        노트북      경기   0112222222
LCS      이천수        모니터      인천   0114444444
CJC      최진철        모니터      제주   0190000000
PJY      박주영        청바지      경기   0112222222
CJC      최진철        메모리      제주   0190000000
*/

-- LCS 아이디의 사용자가 구매한 정보를 보여주는 쿼리
select B.userid, U.name, B.prodName, U.addr, U.mobile1 + U.mobile2 as [연락처]
from buyTbl B
 inner join userTbl U
  on B.userid = U.userid
where B.userid = 'LCS'

/* 결과
userid   name       prodName addr 연락처
-------- ---------- -------- ---- -----------
LCS      이천수        모니터      인천   0114444444
*/

-- 전체 회원들이 구매한 목록을 모두 출력하자.
-- 그리고 결과를 정렬해보자.
select U.userid, U.name, B.prodName, U.addr, U.mobile1 + U.mobile2 As [연락처]
from userTbl U
 inner join buyTbl B
  on U.userid = B.userid
order by U.userid

/* 결과
userid   name       prodName addr 연락처
-------- ---------- -------- ---- -----------
AJH      안정환        책        강원   NULL
CJC      최진철        메모리      제주   0190000000
CJC      최진철        모니터      제주   0190000000
CJC      최진철        운동화      제주   0190000000
CJC      최진철        운동화      제주   0190000000
LCS      이천수        모니터      인천   0114444444
PJY      박주영        청바지      경기   0112222222
PJY      박주영        운동화      경기   0112222222
PJY      박주영        노트북      경기   0112222222
SKH      설기현        책        서울   0118888888
SKH      설기현        청바지      서울   0118888888
SKH      설기현        책        서울   0118888888
*/

-- 위의 결과에는 구매 테이블에 대한 목록이다.
-- 하지만 구매를 하지 않은 나머지 회원은 나타나지 않는다.

-- 쇼핑몰에서 한번이라도 구매한 기록이 있는 우수회원들에게
-- 감사의 안내문을 발송하도록 하자. 라는 경우에
-- DISTINCT 를 사용한다.
select distinct U.userid, U.name, U.addr
from userTbl U
 inner join buyTbl B
  on U.userid = B.userid
order by U.userid

/* 결과
userid   name       addr
-------- ---------- ----
AJH      안정환        강원 
CJC      최진철        제주 
LCS      이천수        인천 
PJY      박주영        경기 
SKH      설기현        서울 
*/

-- 이 내용은 바로위의 내용에서 중복되는 목록을
-- DISTINCE로 해서 하나로 묶어 주는 역활을 한다.

-- 위의 결과를 EXISTS 문을 사용해서도 동일한 결과를 낼 수 있다.
-- 내부적으로 JOIN보다 복잡하여 성능이 떨어지므로 권장은 하지 않는다.
select U.userid, U.name, U.addr
from userTbl U
 where exists(
  select *
  from buyTbl B
  where U.userid = B.userid
 )

/* 결과
userid   name       addr
-------- ---------- ----
AJH      안정환        강원 
CJC      최진철        제주 
LCS      이천수        인천 
PJY      박주영        경기 
SKH      설기현        서울 
*/

-- ★★"학생 동아리"생성 후에 해야함..

-- 학생 테이블, 동아리 테이블, 학생동아리을 이용해서 학생을 기준으로
-- 학생 이름/지역/가입한 동아리/동아리명으로 출력해 보도록 하자.
select s.stdName, S.addr, C.clubName, C.roomNo
 from stdTbl S
 inner join stdclubTbl SC
  on S.stdName = SC.stdName
 inner join clubTbl C
  on SC.clubName = C.clubName
order by S.stdName

/* 결과
stdName    addr clubName   roomNo
---------- ---- ---------- ------
박지성        서울   바둑         102호
박지성        서울   축구         103호
안정환        강원   봉사         104호
이천수        인천   축구         103호
이천수        인천   봉사         104호
조재진        충북   축구         103호
*/

-- 동아리를 기준으로 가입한 학생의 목록을 출력
select C.clubName, C.roomNo, S.stdName, S.addr
from stdTbl S
 inner join stdclubTbl SC
  on SC.stdName = S.stdName
 inner join clubTbl C
  on SC.clubName = C.clubName
order by C.clubName
/* 결과
clubName   roomNo stdName    addr
---------- ------ ---------- ----
바둑         102호   박지성        서울 
봉사         104호   이천수        인천 
봉사         104호   안정환        강원 
축구         103호   박지성        서울 
축구         103호   조재진        충북 
축구         103호   이천수        인천 
*/

-- 외부 조인은 조인의 조건에 만족되지 않는 행까지도 포함시키는 것
--

Posted by gsi
:

숫자형 데이터 형식

-       숫자형 데이터 형식은 정수, 실수 등의 숫자를 표현한다.

데이터 형식

바이트 수

숫자 범위

   

BIT

1

0 또는 1

Boolean형인 참(True), 거짓(False)에 사용

INT

4

-21 ~ +21

정수

SMALLINT

2

-32,768~32,767

정수

TINYINT

1

0 ~ 255

양의 정수

BIGINT

8

-263 ~ +263-1

정수

DECIMAL(p,[s])

5 ~ 17

N/A

고정 정밀도(p)와 배율(s)을 가진 숫자형, ) decimal(5,2)는 전체 자리수를 5자리로 하되, 그 중 소수점 이하를 2자리로 하겠다는 의미

NUMERIC

5 ~ 17

N/A

DECIMAL과 동일한 데이터 형식

REAL

4

 

FLOAT(24)와 동일

FLOAT[(p)]

4 ~ 8

 

P 25미만이면 4바이트, 25이상이면 8바이트의 크기를 할당

MONEY

8

-263 ~ +263-1

화폐 단위로 사용

SMALLMONEY

4

-21 ~ +21

화폐 단위로 사용

 

문자형 데이터 형식

데이터 형식

바이트 수

   

CHAR[(n)]

0~8000

고정길이 문자형

NCHAR[(n)]

0~8000

글자로는 0~4000, 유니코드 고정길이 문자형

VARCHAR[(n)]

0~231-1 (2GB)

가변길이 문자형, SQL Server 2005 이전 버전은 0~8000

NVARCHAR[(n)]

0~231-1

글자로는 0~230-1, 유니코드 가변길이 문자형

TEXT[(n)]

0~231-1 (2GB)

SQL Server 2005 이전 버전에서는 8000자가 넘는 글자의 경우에 사용하였으나, SQL Server 2005 에서는 VARCHAR(MAX)를 대신 사용할 것을 권장

NTEXT[(n)]

 

TEXT의 유니코드형, 마찬가지로 SQL Server 2005에서는 NVARCHAR(MAX)를 사용할 것을 권장

BINARY[(n)]

0~8000

고정길이의 이진 데이터 값

VARBINARY[(n)]

0~231-1

가변길이의 이진 데이터 값, SQL Server 2005 이전 버전은 0~8000

IMAGE[(n)]

0~231-1

SQL Server 2005 이전 버전에서는 8000자가 넘는 이진 데이터의 경우에 사용하였으나, SQL Server 2005에서는 VARBINARY(MAX)를 대신 사용할 것을 권장

 

시간과 날짜 데이터 형식

데이터 형식

바이트 수

   

DATETIME

8

1753/1/1~9999/12/31까지 저장, 정확도는 1/1000초 단위까지

SMALLDATETIME

4

1900/1/1~2079/1/6까지 저장, 정확도는 분 단위까지

 

기타 데이터 형식

데이터 형식

바이트 수

   

TIMESTAMP

8

VARBINARY(8)과 동일하며 데이터베이스 내에서 자동으로 생성된 고유 이진 숫자를 표시한다. SQL Server 내부적으로 사용되는 것이라서 신경을 쓸 필요는 없다.

WORVERSION

8

TIMESTAMP와 동일

SYSNAME

128

NVARCHAR(128)과 동일하며 데이터베이스 개체의 이름에 사용된다. 이 또한 SQL Server 내부적으로 사용된다.

CURSOR

1

T-SQL 커서를 변수로 처리함

TABLE

 

테이블 자체를 저장, 임시 테이블과 비슷한 기능.

UNIQUEIDENTIFIER

16

복제(Replication)에서 사용되는 자료형으로, 유일성을 보장하기 위한 GUID 값을 저장함.

SQL_VARIANT

 

다른 데이터 형식의 저장이 가능한 데이터형(예외도 있음)

XML

 

XML 데이터를 저장하기 위한 형식, SQL Server 2005에서 새로 나옴

 

l  char/nchar 형식(Character)은 고정길이 문자형으로 자릿수가 고정되어 있다. 예를 들어, char(100)‘ABC’ 3바이트만 저장해도, 100바이트를 모두 확보한 후에 앞에 3바이트를 사용하고 뒤의 97바이트는 낭비하게 되는 결과가 나온다. Varchar 형식(Variable Character)은 가변길이 문자형으로 varchar(100)‘ABC’ 3바이트를 저장할 경우에 3바이트만 사용하게 된다. 그래서 공간을 효율적으로 운영할 수 있다. 하지만, 대용량 데이터베이스를 사용하는 경우에는 4글자 미만을 저장하게 될 경우에는 char/nchar 형식으로 설정하는 것이 INSERT/UPDATE 시에 더 좋은 성능을 발휘한다.

l  한글(유니코드)를 저장하기 위해서 char varchar 형식으로 정의할 경우에는 2배의 자릿수를 준비해야 한다. , 최대 3글자의 한글을 저장하고자 한다면 char(6) 또는 varchar(6)로 데이터 형식을 지정해야 한다. 한글은 2바이트의 자리를 차지하기 때문이다. 이러한 문제를 간단히 하려면 nchar 이나 nvarchar 형식을 사용하기 바란다. 이 데이터 형식은 한글뿐 아니라 다른 나라의 언어의 문제가지 해결해 준다. 예를 들어, nchar(3)으로 지정하면 한글이든 영문이든 무조건 3글자를 지정할 수 있어서 더 단순하고 명확하게 문자 데이터를 입력할 수 있다.
 
하지만 만약 한글(유니코드)을 저장하지 않을 것이 확실하다면 nchar/nvarchar보다, char/varchar가 더 공간을 적게 차지해서 성능향상에 도움이 된다. 대용량 데이터베이스에서는 더욱 그렇다.

 

Posted by gsi
:

--============================================================--
-- DELETE
--============================================================--
-- 행 단위 삭제
USE tempDB
DELETE testTbl3 WHERE Fname='Kim'

-- 테이블을 남겨 놓고 모든 내용을 삭제할때
DELETE FROM bigTbl1
TRUNCATE TABLE bitTbl3

-- 테이블을 그대로 삭제할때
DROP table bitTbl2

Posted by gsi
: