SQL Server 查询语句

1,比较NULL值

SELECT OrderDate,SalesOrderNumber,CustomerID,Subtotal FROM Sales.SalesOrderHeader WHERE CurrencyRateID is null

or       .....from Sales.SalesOrderHeader WHERE CurrencyRateID=null

选择不是NULL值的行: select OrderDate,SalesOrderNumber,CustomerID,Subtotal,TaxAmt from Sales.SalesORderHeader

  WHERE NOT  CurrencyRateID is null

2,使用case语句

  select a,b,c,d,

    case when e<25 then 'soft'

       when e between 25 and 700 then 'normal'

       else 'hard'

    end WW

from salse.salesorderheader   where shipdate='20010708'

3,使用搜索参数

select a,b,c

from table1 where YEAR(shipdate)=2001 and MONTH(shipdate)=7

or    ....  from table1 where shipdate between '20010701' and '20010731'

二、从多个表中选择数据

1,使用别名:

  select A.id,A.name,B.info  from table1 A,table2 B  WHERE A.id=B.id AND A.sid=43234

2,使用INNER JOIN语法

  select A.id,A.name,B.info from table1 A INNER JOIN table2 B ON A.id=B.id where A.sid=432432

3,使用2个以上的表  (INNER JOIN  inner join)

  select A.id,A.Name,B.[Primary],B.ModifiedDate,C.LargePhotoFileName

  from table1 A INNER JOIN table2 B INNER JOIN table3 C

     ON B.ProductPhotoID=C.ProductPhotoID        --on 代表怎样把不同的表按照顺序连接起来。

       ON A.ProductID=B.ProductID

  where B.ModifiedDate<='20000101'

4,使用LEFT JOIN

  厂商表与特定的产品表关联,但是新收购的公司没有与任何产品关联,但是查询时也要显示没有关联的厂商,使用INNER JOIN的话没有关联任何产品的厂商就不会显示,可以使用LEFT JOIN ,left join 会显示左表中的所有记录,另外加上右表中您需要的数据。针对一个特定的行,假如不存在一个关系,那么右表中的所有列回返回一个NULL值。

  select a.VenderID,a.AccountNumber,a.[Name],

     c.ProductID,c.[Name]

  from table1 a left join table2 b inner join table3 c

      on b.ProductID=c.ProductID

      on a.VendorID=b.VendorID

     where c.ProductID is null

5,使用RIGHT JOIN

  保留右边的所有列

6,full join  保留2个表所有行

三、读取单一值

1,聚合函数

  聚合函数(aggregate function)帮助我们获得值得汇总,其中包括COUNT,SUM,AVG,MAX和MIN函数。聚合函数要与group by 子句配合起来使用。

  select count(*) numofelements  from  table1.

  select count(*) numofelements,max(orderdate) LastSaleDate from table1.

 yuselect A.班级编号,A.班级名称,COUNT(*) 学生人数,(MAX(B.学号)) 学号
             from 班级信息 A inner join 学生信息 B on A.班级编号=B.班级编号
             group by A.班级编号,A.班级名称
             order by A.班级名称

2,配置函数

@@Datefirst            返回代表一周的第一天的一个整数

@@DBTS            当前数据库的最后一个时间戳

@@LANGID,@@LANGUAGE    实际连接的默认语言

@@LOCKTIMEOUT        锁定超时值

@@NESTLEVEL        嵌套级别

@@ SPID          连接标识符,会话ID

3,游标函数

  游标函数用于管理游标(cursor),常用的游标函数:@@FETCH_STATUS。返回0标识上一个FETCH语句成功。-1表示失败。-2表示值不存在。

4,日期和时间函数

  SELECT YEAR('2006/02/03'),MONTH('20000101'),DAY('20100901')

  GETDATE() 和GETUTCDATE()  可以返回日期和时间。

  datepart()和 datename()  分别获取时间的不同部分(小时或分钟),以及日或者月的名称。

  执行日期运算符,dateadd()和datediff()。。

5,数学函数

  abs()  绝对值 , square() 平方根  , power(expression, y) 返回给定表达式乘指定次方的值 ,  exp():返回指数值 , floor() 大于数的最小整数 ,  cos()返回指定表达式中以弧度表示的指定角的三角余弦。

6,元数据函数

  元数据(metadate)函数用于获得有关数据库和数据库对象的信息。

  databaseproperty('master' ,'IsAnisiNullDefault')     datebasepropertyex('master', 'collation').

7,安全函数

  current_user(),   is_member()    ,    is_srvrolemember()

  is_srvrolemember('sysadmin') 判断一个组或者角色的成员。

8,字符串函数

  select left('a123456789bcd',2),right('a123456789bcd',4),substring('a123456789bcd',4,4),STUFF('abcdef123456789', 3, 3, 'ijklmn'),REPLICATE('0a', 4)

  lower('FDGHERH'),reverse('ABCDEFGHIJK'),upper('abcdefghijk') , replicate()

9,系统函数

  select cast('1234' AS int),convert(datetime,'20060201',112)   110 120 121

  declare @i int
set @i=0
begin try
 select 10/@i

end try
begin catch
select line=ERROR_LINE(),
 [Message]=ERROR_MESSAGE(),
 errnumber=ERROR_NUMBER(),
 [procedure]=ERROR_PROCEDURE(),
 serverity=ERROR_SEVERITY(),
 [state]=ERROR_STATE()
end catch

系统函数:

@@identity        当前连接上插入的最后一个标识符,包含触发器

ident_current('table1')      选择表的最后一个标识符

scope_identity()      当前范围内最后一个标识符(不包含标识符)

10,系统统计函数

@@CPU_BUSY返回从SQL Server 上次启动以来花费的工作时间。

11,排名函数

三、设计和使用标量UDF

1,设计不访问表或者视图的UDF

create function States(@idState tinyint)

returns nvarchar(15)

as

begin

  return ( case @idState when 0 then N'Stock Pending'

           when 1 then N'Prepared'

          when 2 then N'On truck'

          when 3 then N'In warehouse'

          when 4 then N'Finished'

        else N'unknown'

      end)

  end

go

select dbo.states(0),dbo.States(1),dbo.States(100)

这个函数States返回状态描述。

2,设计要访问表或者视图的UDF

还可以用UDF来访问表

create function MostRecentSaleByCustomer(@CustomerID int)

RETURNS INT

AS

begin

  declare @SalesOrderId int

  select top 1 @SalesOrderId=SalesOrderId

  from Sales.SalesOrderHeader

  where Customer=@CustomerID

  order by OrderDate desc

return @SalesOrderId

end

go

select * from Sales.SalesOrderHeader where SalesOrderId=dbo.MostRecentSaleByCustomer(676)

UDF 无法被‘查询优化器’优化。所以不要用标量函数选取太多行。

四、设计和使用存储过程

1,使用输出参数

create proc ReturnAVowel (@WhatVowel tinyint,@Vowel char(1) output)

as

begin

  select @Vowel= case @WhatVowel  when 1 then 'A'

                    when 2 then 'E'

                    when 3 then 'I'

                    when 4 then 'O'

                    when 5 then 'U'

                    else null

          end

end

使用该存储过程:

declare @Vowel char(1)

EXEC ReturnAWowel 1,@Vowel output

select 'Vowel'=@Vowel

五、通过一个视图来封装查询

1,创建一个视图:

create view Sales.ProductSales

as

select ******

go

2,通过视图来更新数据

create view view1

as

select id,name from tabel1

go

update view1

set name='Jack' where id=34

go

3,分区视图

将不同的表放在不同的数据库实例中,可以创建一个视图来合并左右这些表,并通过INSTEAD of 触发器来管理对数据库的修改。为了查询一个远程实例的数据库,您应当在访问远程实例之前创建一个链接服务器。

下面将操作一个名为ISAN的链接服务器,它链接到另一个SQL Server 实例,后者存储了一个TestPartitionedViews数据库。

create database TestPartitionViews

go

use TestPartitionedViews

go

create table USA_Customers(CustomerID int,CustomerName varchar(200),Region varchar(20))

go

create view Customers

as

Select * from USA_Customers

union

select * from ISAN.TestPartiationedViews.dbo.EMEA_Customers

go

union 用于合并两个查询结果集得基本规则:

  1,所有查询的列数和列的顺序必须相同。

  2,数据类型必须兼容。

4,混合来自表和视图中的数据

select table1.a,table1.b,view1.c,view1.d from table1 inner join

5,在客户端应用程序中操作视图

访问视图,像表一样访问。

chapter 9 使用可编程对象来检索数据

用户自定义函数、存储过程、

1,从一个简单的问题开始

select ISNULL(AVG(TotalDue),0) as Amount

from Sales.SalesOrderHeader

where(CustomerID=23)

2,理解标量UDF

UDF必须是确定性的(deteministic).

create function GetAvgGust(@CustomerID int)

return money

as

begin

declare @ Amount Money

set @Amount=0

select @Amount=AVG(TotalDue)

from Sales.SalesOrderHeader

where (CustomerID=@CustomerID)

return ISNULL(@Amount ,0)

end

调用:PRINT dbo.GetAvgCust(23)

3,使用内联UDF 内联UDF没有begin 和end

内联UDF视为一个参数化的SELECT查询或者一个参数化的视图。

create function fun1

return table

as

select * from table1

where(table1.id=1)

4,使用表值UDF

表值(table-valued)UDF 是能返回一个表的UDF。由于在函数本身中定义了表的架构,所以返回的表不需要基于其他数据库表。

create function dbo.GetInterest(@NumPeriod int,@PercentInterest money)

returns @InterestTable Table

(

Num int,

I money

)

as

begin

  declare @n int

  set @N=0

  declare @ITot=money

  set @ITot=1

  while @n<@NumPeriods

  Begin

    set @N=@N+1

    set @ITot=@ITot*(1+(@PercentInterest/100))

    insert into @InterestTable Values(@N,@ITot)

  end

  return

end

表值UDF的构建是在return子句之后定义。表值UDF是视图的一个很好的替代物,因为它接受参数,而且可以包含几个复杂的语句。

5,存储过程

create procedure DeleteCity(@City_ID int)

as

begin

  delete from cities where city_ID=@City_ID

end

调用存储过程:

EXEC DeleteCity 1

9.3 CLR UDF 和过程

create function calcFact(@N int)

  returns float

as

begin

  declare @r float

  set @R=1

  declare @I int

  set @I=1

  while @I<=@N

  begin

    set @R=@R*@I

    set @I=@I+1

  end

  return @R

end

chapter 10 修改数据

insert into table1 (dsf,dfe,fef,ew,gef) values('werwe','ewrew','werw')

如果所有的列都定义了默认值,可以用

Insert into table1 default values.

posted on 2011-04-07 22:02  Henry_Wang  阅读(1493)  评论(0编辑  收藏  举报

导航