Sql注意点

2769 ワード

1.Set、Selectの割り当て
SELECT文を用いてSET命令に代わる主な利点は、一つの操作で複数の変数に同時に値を割り当てることができることである。次のSELECT文を実行して、SELECT文によって与えられた変数はどのような操作にも使えます。
 
declare@num 1 int@num 2 int@reult 1 int@result 2 int
select@num 1=144、@num 2=121
select@result 1=sqrt(@num 1)、@reult 2=sqrt(@num 2)
select@result 1,@result 2
 
一つのselect文で複数の変数に値を割り当てるのは、複数のSETコマンドを使うより効率がいいです。一つ以上の値をパラメータに選択する制限は、変数の割当値とデータ検索操作を同時に行うことができません。これは上の例ではSELECT文を使って変数を充填し、別のSELECT文を使って変数中のデータを検索する原因です。例えば、次のスクリプトは動作できません。
 
declare@Restock Name varhar(50)
select ProductId,@Restock Name=Name+':+ProductNumber FROMProduct.Product
 
 このスクリプトは以下のエラーを発生します。メッセージ141、レベル15、状態1、第2行
2.  特定の並べ替えの書き方
--1.  MessageType       id(59、107、62、18、66、65)  
select
* from MessageType where class_id=31 order by charindex(ltrim(id),'59,107,62,18,66,65') --2. 、 , id
select * from tb_users order by case when username like '% %' then 0 when username like '% %' then 1 else 2 end,id
3.  top 100 percentの使い方
select top 30*from data where title='&title 1&'order by id descはもともと「where条件」に合う記録集の「前30条」を選ぶのです。
しかし、このSQL文については、文にwhereとtop文が同時に存在し、where条件列は適切なインデックスではなく、プログラム実行は全表スキャンであり、まずwhere条件に合った記録を検索することであり、ここのtop制限は虚構となります。全表が百万レベル以上のデータテーブルであれば、このような簡単な判断では、データベースを破棄する可能性があります。
ですから、まず「where条件」に該当する記録をサブクエリーで絞り出してから、スクリーニング結果集の中からtop 30を選ぶ必要があります。
SQLルールでは、サブクエリーにorderがあるとTOPが必要となりますので、SELECT TOP 100 PERCENTで限定します。top 100 percentは条件に合ったデータ項目を絞り出すことを保証するためです。そうでなければ、エラー:メッセージ1033、レベル15、状態1、第5行は同時にTOPを指定しない限り、ORDER BYサブフレーズはビュー、埋め込み関数、派生表、サブクエリで無効になります。デフォルトでは、サブクエリー、関数、ビューでorder byを使ってみたら、以下のようにエラーが表示されます。
create view dbo.VUsers
as
    select id,username from tb_users order by id
go
一つの表に対するselectは実は一つの表を返すのではなく、一つの游び标なのです。解決策:
select top 100 percent id,username from tb_users order by id,username desc
参照:http://www.cnblogs.com/ziyeyimeng/articles/2099188.html