2023/08/08 커서
어제 제시한 문제를 해결하는 시간
[ 실습 1 ] 회원의 나이를 변수에 저장하여 출력하라.
- 변수명은 임의로 한다.
declare @a int
set @a = (select age from member where id=2)
select @2
-> 46
[ 실습 2 ] 회원의 이름을 출력하라.
declare @a vachar(10)
set @a = (select name from member where id=2)
select @a
->김태희
[ 실습 3 ] 회원의 성을 출력하라.
declare @a vachar(10)
set @a = (select substring(name1, 1)from member where id=2)
select @a
-> 김
declare @a vachar(2)
set @a = (select name from member where id=2)
select @a
-> 김
[ 실습 4 ] 회원의 나이와 이름, 성을 한꺼번에 출력하라.
- 출력결과에 Column명을 각각 나이,성,이름으로 별칭을 부여한다.
- 이름은 성을 제외한 이름만 출력한다.
declare @a int, @b varchar(2), @c vachar(10)
set @a = (select age from member where id=2)
set @b = (select name from member where id=2)
set @c = (select substring((select name from member whehre id=2),2,2))
select @a as 나이, @b as 성, @c as 이름
-> 46|김|태희
마지막줄에 select가 아닌 그냥 출력 형태만 보고싶다면 select 대신 print를 작성해도 괜찮음
--control statement
조건문이 있다. (if)
반복문도 있다. (while)
조건문
declare @var int
set @var=10
if @var > 10
begin
print'^_^'
end
else
begin
print'-_-?'
end
begin과 end사이에 들어와야하는데 그걸 종속문장(print'^_^'와 print'-_-?')이라고 한다.
if 다음에는 조건이 들어온다. 조건을 넣기 전에 변수를 먼저 10이라고 선언한다.
if에는 저장된 변수가 10보다 크니 라고 적어주었다. 그게 맞다면 종속문장이 출력된다.
else가 붙기전 조건문에서는 출력이 되지않을 것
만약 if 조건문에 10이 아니라 10보다 작은 숫자가 들어온다면 ^_^라고 출력된다.
만약 참이 아닐 때 수행하는걸 출력하고 싶다면 else를 넣는다.
if문장에서 10보다 높게 넣는다면 -_-?으로 출력이 될 것
*종속문장이 만약 한문장이라면 begin과 end를 쓸 필요 없지만 문장이 두개 이상이라면 써줘야함
declare @var int
set @var=10
if @var > 10
print'^_^'
else
print'-_-?'
쓸 필요없는건 이런느낌이다.
case 문
declare @a int, @b int
set @a=1
set @b=
case
when@a=1 then 1
when@a=2 then 2
when@a=3 then 3
end
print @b
case문은 이런식으로 작성한다. a라는 변수를 10이라고 선언해두고 b는 case를 사용해서 저렇게 작성해준다. 변수의 값을 저장하는 시점에서 case를 사용해서 when과 then을 이용해서 출력하는 것 이렇게 되면 a=1일 때 1을 출력하고 2면 2 3이면 3을 출력하라는 소리다.
반복문
declare @i int
set @i=1
while @i <= 10
begin
print 'hello world'
set @i = @i+1
end
while뒤에는 조건이 들어온다. 이 조건이 만족될 때까지 반복 실행한다.
이런식으로 작성이 된다면 hello world는 10번 출력되게 된다.
i라는 변수값은 최초에 1인데 반복문을 보게된다면 10보다 작기 때문에 참으로 실행된다. 그 값이 실행되기때문에 10까지 1씩 증가되고있다. 그렇기 때문에 10번 반복된다.
반복문을 작성할 땐 3가지가 있는데 변수의 초기식이 있어야하고, 변수의 조건식,증감식이 있어야한다.
만약 똑같은 10번 반복식을 할껀데 10에서 1로가는 식으로 바꿔주고싶다면
declare @i int
set @i=10
while @i >= 1
begin
print 'hello world'
set @i = @i-1
end
이런식으로 작성해주면 된다.
[ 실습 1 ] 주말과 평일을 구분해서 출력하라.
if datepart(dw,getdate())=7 or datepart(dw,getdate())=1
begin
print 'weekend'
end
else
begin
print 'weekday'
end
-> 오늘은 화요일이라 weekday라고 출력
[ 실습 2 ] 1~100까지의 합을 출력하라.
declare @a int, @b int
set @a=1
set @b=0
while @a<=100
begin
set @b = @b+@a
set @a=@a+1
end
print @b
->5050
[ 실습 3 ] 구구단 전체를 출력하라.
- 짝수단만 출력한다.
-2단은 2*2까지, 4단은 4*4까지...
declare @i int, @j int
set @i=2
while @i < 10
begin
set @j=1
while @j < 10
begin
print @i * @j
set @j = @j + 1
end
set @i = @i + 1
end
일단 이런식으로 작성하게 된다면 일반적인 구구단으로 만들 수 있다.
2*1, 2*2, 2*3, ...2*9 이런식으로 2단부터 시작하고 앞에 들어가는 숫자인 단에는 i라고 변수를 저장하고 뒤에들어가는 숫자인 1부터 9까지 들어가는 숫자는 j라고 변수를 저장해주고 반복문 안에 반복문을 설정해서 넣어준다.
이런식으로 넣으면 안이쁘기 때문에
print str(@i_ + '*' + convert(char(2), @j) + '=' + convert(char(2), (@i * @j) 이런식으로 작성해서 넣어줌 여기서 convert와 str은 같은 의미로 다르게 쓰이는 것 이것은 @i * @j이런식으로 쓰인다면 그냥 식으로 봐버리기 때문에 문자로 출력하기 위해서 convert와 str을 사용하는 것이고 =도 문자열로 써야하기 때문에 ''을 해주었고 문자열을 연속으로 쓰기 위해서 +을 사용했다.
declare @i int, @j int
set @i=2
while @i < 10
begin
set @j=1
while @j < 10
begin
print str(@i) + '*' + convert(char(2), @j) + '=' + convert(char(2), (@i * @j))
set @j = @j + 1
end
set @i = @i + 1
end
이런식으로 넣어주면 2*1=2 이런식으로 출력할 수 있다.
그리고 여기에 짝수단만 출력을 진행하기 위해선 맨 아래쪽에 set @i = @i +1을 2로 바꿔주면 짝수단만 나오게 된다.
모든 조건을 만족해서 실습을 완료하기 위해서 안쪽 while부분에 i가 j보다 크거나 같을 때만 실행이 되도록 설정 하기위해서 while @i >= @j을 작성해주었다. 그렇기 때문에 j가 i와 같아지게 되면 실행을 하지 않게된다.
그리고 단끼리 구분하고 편하게 보기 위해 아래쪽에 print '-------------'을 작성해줌.
--cursor
커서는 쿼리문에 의해서 반환되는 결과값들을 저장하는 메모리 공간이다.
Fetch라고 하는건 커서에서 얻어온 값을 출력하는 것. . .?
cursor은 기본적으로 이런식으로 작성이 된다.
declare @user varchar(10)
--cursor 선언
declare cur cursor for select user_id from member
--cursor 열기
open cur
--cursor을 가지고 데이터 갖고오기(tetch), 데이터 처리
fetch next from cur into @user
while @@fetch_staus=0
begin
print @user
fetch next from cur into @user
end
--@@fetch_staus=0 패치로 가져온 것의 결과인데 0은 정상적으로 가져오면 나오게 되고, 1이 나오게 되면 실패 or 결과값이 없다 2는 반환하고자 하는 로그가 없다는 것이다. 일반적으론 0으로 많이 쓴다.
--cursor 닫기
close cur
--cursor 해제
deallocate cur
이렇게 작성하게 되면 변수 수와 선택한 열 수가 일치해야하기 때문에
이런식으로 작성해주면서 열의 수를 맞춰주어서 ID와 PW를 출력할 수 있게끔 해준다.
다음 질문에 알맞은 SQL문을 작성하시오.
- Webhack DATABASE의 member TABLE를 대상으로 한다.
- Cursor를 활용해 문제를 해결한다.
[ 실습 1 ] 회원의 평균 나이를 구하라.
- 출력 결과는 "회원의 평균 나이: ??" 형식으로 출력한다.
[ 실습 2 ] 모든 회원의 nickname을 Hacker로 변경하라.
[ 실습 3 ] Webhack DATABASE의 모든 TABLE의 데이터를 변조하라.
- SQL문을 실행하려면 exec()를 활용
- Data type을 고려하여 원하는 문자열로 변조
- VMware의 Snapshot 기능을 적극 활용