SQL/MS-SQL

열공~ 정원혁 교재(SQL 2000) 베끼기 그리고 요약(2)

박은주 2008. 4. 21. 21:35

열공~ 정원혁 교재(SQL 2000) 베끼기 그리고 요약(2)
 
Name    강사  
 
 sql_exam_until_p108.sql  ( Size : 5.0 KB )
부지런히 타이프 하세용....

베끼면 늘지 않습니다. 일일이 타이픙하시는 것이 좋습니다.

#########################################################

 

---------------------- 교과서  p.108 까지의  내용입니다. -------

use pubs;


select * from titles;

select title_id, title from titles where title LIKE '%computer%'

select title_id, title from titles where title LIke 'computer%'

select patindex('%mi%','James Mike');

select patindex('M[^c]%','Mcathur');

select patindex('M[^c]%','Mike');

select patindex('M[^c]%','M');  -- 틀리기 쉽다고 주의하랍니다.

-- patindex는 해당되는 패턴이 다음 문자열에 있는지를 알려줍니다.

select title_id from sales order by title_id;

select distinct title_id from sales order by title_id;

-- ** DISTINCT는 중복된 행(레코드)를 제외시킨다.

-- ** where 절을 사용할 경우 "*" 을 사용하지 말라!

--      이유 : 무척이나 많은 부하(overhead)를 가지고 온다.

-- **  연산자 앞에 컬럼만 오도록 한다.


select title_id, price from titles where price * 1.1 < 20.00 order by price;

select title_id, price from titles where price < 20.00 / 1.1 order by price;

-- where 절에 사용하는 컬럼은 무조건 연산자 왼쪽에 두고 더 이상의 가공을 하지않도록 하는 것이 좋은 습관이다.

-- 그 이유는 NOT을 사용하지 말라는 것과 같다. 즉, 컬럼에 대해 어떤 가공이 있게 되면, 그 컬럼에 색인이 있다고 하더라도 색인을 아예 사용할 수 없게 된다.


select title_id, pubdate, datepart(yy, pubdate) as [연도] from titles where price < 20.00 / 1.1 order by price;

-- 위의 예를 잘못된 경우. 주의할 것은 날짜 컬럼 !

select title_id, pubdate, datepart(yy, pubdate) as [연도] from titles where year(pubdate) = 1991;

-- 우선적으로는 datepart(yy,...)는 year()와 같다! 위와 같은 경우는 색인이 있어도 사용할 수 없다. (늦다). 다음과 같이 수정하여야 한다.

select title_id, pubdate, year (pubdate) as [연도] from titles where pubdate between '1991.1.1' and ' 1991.12.31'  23:59:59.999;

-- 위의 경우는 문제가 발생....?!

--최종 버전은?

SET dateformat 'ymd'
go

select title_id, pubdate, datepart(yy, pubdate) from titles where pubdate between '1991.1.1' and '1991.12.31'

-- 참고로 SET dateformat은 "입력"에만 영향을 미친다. 출력을 원하는 경우는 convert() 를 사용하여야 한다.


-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
-----------------------  적절한 ()와 띄워쓰기 -------------------------------------------------
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------

--1)

select title_id, price, pub_id from titles where title_id like 'BU%' or ( pub_id = '1389' and price = 19.99 );


--2)

select title_id, price, pub_id from titles where (title_id LIKE 'BU%' or pub_id = '1389')  and price = 19.99;


--3)

select title_id, price, pub_id from titles where title_id LIKE 'BU%'    OR pub_id = '1389' and price = 19.99;

-- 3)의 결과는 1)과 같다. 이유는 연산자 우선순위 때문이다. 3)의 결과는 띄워쓰기를 보아서는 OR이 먼저 될 것 같지만, 그렇지 않다.

----------------------
----------------------
-- 교과서 p.105 하단부 --
----------------------
----------------------

create table #t1
(

     t datetime
)

go

insert #t1 values ('91.1.1');

insert #t1 values ('1/1/91');

-- 이러한 경우에는 아래와 같은 에러메시지가 발생한다.

---- 서버: 메시지 242, 수준 16, 상태 3, 줄 1
---- char 데이터 형식을 datetime 데이터 형식으로 변환하는 중 datetime 값 범위를 벗어났습니다.
---- 문이 종료되었습니다.

---- 또한 #t1 과 같은 것은 임시 테이블이다.
---- 엔터프라이즈 관리자(EM)에서 새로고침을 하더라도 전혀 변화가 반영되지 않습니다.

set dateformat mdy

insert #t1 values ('1/1/91');

select * from #t1; -- 이렇게 해보면 가상테이블(t1)에 가상 레코드가 추가된 것을 알 수 있다.

set dateformat ymd; -- 이렇게 하면 원상복귀가 된다.


--------------------------------------------

select 10 / 4 + 10 % 3 * 5;  -- 연산자 우선순위 !

declare @i tinyint; -- 변수를 선언

set @i = 254;  -- 변수를 초기화.

select @i + 2; -- 결과?

--------------------------------------------

declare @f float; --  변수 선언

set @f= 0.00001;  -- 변수 초기화

select @f + 0.999999;  -- 결과?

--------------------------------------------

declare @f numeric (28, 26); -- 변수 선언

set @f = 0.00000000000000000000001; -- 변수 초기화

select @f + 0.999999999999999999999; -- 결과?

--------------------------------------------

set dateformat mdy;

declare @d datetime;

set @d = '4/27/99';

select @d;


-- 결과는 1999-04-27 00:00:00.000  식으로 출력됨.

----------------------

declare @d datetime;

set @d = '99.4.27';

select @d;

--- 결과는 ?

--- 서버: 메시지 242, 수준 16, 상태 3, 줄 3
--- char 데이터 형식을 datetime 데이터 형식으로 변환하는 중 datetime 값 범위를 벗어났습니다.
--- (1개 행 적용됨)

----------------------

set dateformat ymd;

declare @d datetime;

set @d = '99.4.27';

select @d;


-- 결과는?

-- 1999-04-27 00:00:00.000 

---------------------- 여기까지가 교과서  p.108 내용입니다. -------
[이 게시물은 486i님에 의해 2008-04-17 15:59:19 예제노트 활용도100%에서 이동 됨]
[이 게시물은 486i님에 의해 2008-04-21 15:10:08 MS-SQL에서 이동 됨]