열공~ 정원혁 교재(SQL 2000) 베끼기 그리고 요약(2)
열공~ 정원혁 교재(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에서 이동 됨]