一些有创意的SQL语句

1.把某个字段重新生气序列(从1到n):
DECLARE @i int
Set @i = 0
Update Table1 Set @i = @i + 1,Field1 = @i

2.按成绩排名次
Update 成绩表
Set a.名次 = (
Select Count(*) + 1
From 成绩表 b
Where a.总成绩 < b.总成绩
)
From 成绩表 a

3.查询外部数据库
Select a.*
From OpenRowSet('Microsoft.Jet.OLEDB.4.0','c:\test.mdb';'admin';'',Table1) a

4.查询Excel文件
Select *
From OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 8.0')...Sheet1$

5.在查询中指定排序规则
Select * From Table1 order By Field1 COLLATE Chinese_PRC_BIN
为什么要指定排序规则呢?参见:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1633985
例,检查数据库中的Pub_Users表中是否存在指定的用户:
Select Count(*) From Pub_Users Where [UserName]='admin' And [PassWord]='aaa' COLLATE Chinese_PRC_BIN
默认比较是不区分大小写的,如果不加COLLATE Chinese_PRC_BIN,那么密码aaa与AAA是等效的,这当然与实际不符.注意的是,每个条件都要指定排序规则,上例中用户名就不区分大小写.


6.Order By的一个小技巧
order By可以指定列序而不用指定列名,在下面的例子里说明它的用处(注意,第三列未指定别名)
Select a.ID,a.Name,(Select Count(*) From TableB b Where a.ID=b.PID) From TableA a order By 3

2 ? Microsoft SQL Server 2005 Product Guide
2007-04-22T11:13:05+08:00 | rxl

推荐给学生阅读的文章,较为详细的说明了Microsoft SQL Server 2005方方面面,具有很好的学习价值,对于了解和学习Microsoft SQL Server 2005有很好的借鉴意义。

前期提供给盛浩峰和张飞进行阅读,希望他们拿出一份翻译稿件来,但是一直没有收到成效。但是他们做了一些标注,还是直接借鉴的,尽管没有看完。

盛浩峰阅读批示后的文章

张飞阅读批示后的文章


3 ? sql server 中【农历】计算方法
2007-02-02T08:00:00+08:00 | rxl

最近几天,一时兴起,开始研究农历,趁着元旦放假,把它给做出来了!拿给大家看看,我自己测试觉得没有问题,请大家看看!

1、建一表,放初始化资料
因为农历的日期,是由天文学家推算出来的,到现在只有到2049年的,以后的有了还可以加入!
Create TABLE SolarData
(
    yearId int not null,
    data char(7) not null,
    dataInt int not null
)

--插入数据
Insert INTO
SolarData Select 1900,'0x04bd8',19416 UNION ALL Select 1901,'0x04ae0',19168
UNION ALL Select 1902,'0x0a570',42352 UNION ALL Select 1903,'0x054d5',21717
UNION ALL Select 1904,'0x0d260',53856 UNION ALL Select 1905,'0x0d950',55632
UNION ALL Select 1906,'0x16554',91476 UNION ALL Select 1907,'0x056a0',22176
UNION ALL Select 1908,'0x09ad0',39632 UNION ALL Select 1909,'0x055d2',21970
UNION ALL Select 1910,'0x04ae0',19168 UNION ALL Select 1911,'0x0a5b6',42422
UNION ALL Select 1912,'0x0a4d0',42192 UNION ALL Select 1913,'0x0d250',53840
UNION ALL Select 1914,'0x1d255',119381 UNION ALL Select 1915,'0x0b540',46400
UNION ALL Select 1916,'0x0d6a0',54944 UNION ALL Select 1917,'0x0ada2',44450
UNION ALL Select 1918,'0x095b0',38320 UNION ALL Select 1919,'0x14977',84343
UNION ALL Select 1920,'0x04970',18800 UNION ALL Select 1921,'0x0a4b0',42160
UNION ALL Select 1922,'0x0b4b5',46261 UNION ALL Select 1923,'0x06a50',27216
UNION ALL Select 1924,'0x06d40',27968 UNION ALL Select 1925,'0x1ab54',109396
UNION ALL Select 1926,'0x02b60',11104 UNION ALL Select 1927,'0x09570',38256
UNION ALL Select 1928,'0x052f2',21234 UNION ALL Select 1929,'0x04970',18800
UNION ALL Select 1930,'0x06566',25958 UNION ALL Select 1931,'0x0d4a0',54432
UNION ALL Select 1932,'0x0ea50',59984 UNION ALL Select 1933,'0x06e95',28309
UNION ALL Select 1934,'0x05ad0',23248 UNION ALL Select 1935,'0x02b60',11104
UNION ALL Select 1936,'0x186e3',100067 UNION ALL Select 1937,'0x092e0',37600
UNION ALL Select 1938,'0x1c8d7',116951 UNION ALL Select 1939,'0x0c950',51536
UNION ALL Select 1940,'0x0d4a0',54432 UNION ALL Select 1941,'0x1d8a6',120998
UNION ALL Select 1942,'0x0b550',46416 UNION ALL Select 1943,'0x056a0',22176
UNION ALL Select 1944,'0x1a5b4',107956 UNION ALL Select 1945,'0x025d0',9680
UNION ALL Select 1946,'0x092d0',37584 UNION ALL Select 1947,'0x0d2b2',53938
UNION ALL Select 1948,'0x0a950',43344 UNION ALL Select 1949,'0x0b557',46423
UNION ALL Select 1950,'0x06ca0',27808 UNION ALL Select 1951,'0x0b550',46416
UNION ALL Select 1952,'0x15355',86869 UNION ALL Select 1953,'0x04da0',19872
UNION ALL Select 1954,'0x0a5d0',42448 UNION ALL Select 1955,'0x14573',83315
UNION ALL Select 1956,'0x052d0',21200 UNION ALL Select 1957,'0x0a9a8',43432
UNION ALL Select 1958,'0x0e950',59728 UNION ALL Select 1959,'0x06aa0',27296
UNION ALL Select 1960,'0x0aea6',44710 UNION ALL Select 1961,'0x0ab50',43856
UNION ALL Select 1962,'0x04b60',19296 UNION ALL Select 1963,'0x0aae4',43748
UNION ALL Select 1964,'0x0a570',42352 UNION ALL Select 1965,'0x05260',21088
UNION ALL Select 1966,'0x0f263',62051 UNION ALL Select 1967,'0x0d950',55632
UNION ALL Select 1968,'0x05b57',23383 UNION ALL Select 1969,'0x056a0',22176
UNION ALL Select 1970,'0x096d0',38608 UNION ALL Select 1971,'0x04dd5',19925
UNION ALL Select 1972,'0x04ad0',19152 UNION ALL Select 1973,'0x0a4d0',42192
UNION ALL Select 1974,'0x0d4d4',54484 UNION ALL Select 1975,'0x0d250',53840
UNION ALL Select 1976,'0x0d558',54616 UNION ALL Select 1977,'0x0b540',46400
UNION ALL Select 1978,'0x0b5a0',46496 UNION ALL Select 1979,'0x195a6',103846
UNION ALL Select 1980,'0x095b0',38320 UNION ALL Select 1981,'0x049b0',18864
UNION ALL Select 1982,'0x0a974',43380 UNION ALL Select 1983,'0x0a4b0',42160
UNION ALL Select 1984,'0x0b27a',45690 UNION ALL Select 1985,'0x06a50',27216
UNION ALL Select 1986,'0x06d40',27968 UNION ALL Select 1987,'0x0af46',44870
UNION ALL Select 1988,'0x0ab60',43872 UNION ALL Select 1989,'0x09570',38256
UNION ALL Select 1990,'0x04af5',19189 UNION ALL Select 1991,'0x04970',18800
UNION ALL Select 1992,'0x064b0',25776 UNION ALL Select 1993,'0x074a3',29859
UNION ALL Select 1994,'0x0ea50',59984 UNION ALL Select 1995,'0x06b58',27480
UNION ALL Select 1996,'0x055c0',21952 UNION ALL Select 1997,'0x0ab60',43872
UNION ALL Select 1998,'0x096d5',38613 UNION ALL Select 1999,'0x092e0',37600
UNION ALL Select 2000,'0x0c960',51552 UNION ALL Select 2001,'0x0d954',55636
UNION ALL Select 2002,'0x0d4a0',54432 UNION ALL Select 2003,'0x0da50',55888
UNION ALL Select 2004,'0x07552',30034 UNION ALL Select 2005,'0x056a0',22176
UNION ALL Select 2006,'0x0abb7',43959 UNION ALL Select 2007,'0x025d0',9680
UNION ALL Select 2008,'0x092d0',37584 UNION ALL Select 2009,'0x0cab5',51893
UNION ALL Select 2010,'0x0a950',43344 UNION ALL Select 2011,'0x0b4a0',46240
UNION ALL Select 2012,'0x0baa4',47780 UNION ALL Select 2013,'0x0ad50',44368
UNION ALL Select 2014,'0x055d9',21977 UNION ALL Select 2015,'0x04ba0',19360
UNION ALL Select 2016,'0x0a5b0',42416 UNION ALL Select 2017,'0x15176',86390
UNION ALL Select 2018,'0x052b0',21168 UNION ALL Select 2019,'0x0a930',43312
UNION ALL Select 2020,'0x07954',31060 UNION ALL Select 2021,'0x06aa0',27296
UNION ALL Select 2022,'0x0ad50',44368 UNION ALL Select 2023,'0x05b52',23378
UNION ALL Select 2024,'0x04b60',19296 UNION ALL Select 2025,'0x0a6e6',42726
UNION ALL Select 2026,'0x0a4e0',42208 UNION ALL Select 2027,'0x0d260',53856
UNION ALL Select 2028,'0x0ea65',60005 UNION ALL Select 2029,'0x0d530',54576
UNION ALL Select 2030,'0x05aa0',23200 UNION ALL Select 2031,'0x076a3',30371
UNION ALL Select 2032,'0x096d0',38608 UNION ALL Select 2033,'0x04bd7',19415
UNION ALL Select 2034,'0x04ad0',19152 UNION ALL Select 2035,'0x0a4d0',42192
UNION ALL Select 2036,'0x1d0b6',118966 UNION ALL Select 2037,'0x0d250',53840
UNION ALL Select 2038,'0x0d520',54560 UNION ALL Select 2039,'0x0dd45',56645
UNION ALL Select 2040,'0x0b5a0',46496 UNION ALL Select 2041,'0x056d0',22224
UNION ALL Select 2042,'0x055b2',21938 UNION ALL Select 2043,'0x049b0',18864
UNION ALL Select 2044,'0x0a577',42359 UNION ALL Select 2045,'0x0a4b0',42160
UNION ALL Select 2046,'0x0aa50',43600 UNION ALL Select 2047,'0x1b255',111189
UNION ALL Select 2048,'0x06d20',27936 UNION ALL Select 2049,'0x0ada0',44448

Create FUNCTION fn_GetLunar(@solarDay DATETIME)   
RETURNS varchar(10)--datetime

AS   
BEGIN   
DECLARE @solData int   
DECLARE @offset int   
DECLARE @iLunar int   
DECLARE @i INT    
DECLARE @j INT    
DECLARE @yDays int   
DECLARE @mDays int   
DECLARE @mLeap int   
DECLARE @mLeapNum int   
DECLARE @bLeap smallint   
DECLARE @temp int   
   
DECLARE @YEAR INT    
DECLARE @MONTH INT   
DECLARE @DAY INT   
     
DECLARE @OUTPUTDATE varchar(10) --DATETIME   

--保证传进来的日期是不带时间   
SET @solarDay=cast(@solarDay AS char(10))   
SET @offset=CAST(@solarDay-'1900-01-30' AS INT)

   
--确定农历年开始   
SET @i=1900   
--SET @offset=@solData   
WHILE @i<2050 AND @offset>0   
BEGIN   
    SET @yDays=348   
    SET @mLeapNum=0   
    Select @iLunar=dataInt FROM SolarData Where
yearId=@i   
   
    --传回农历年的总天数   
    SET @j=32768   
    WHILE @j>8   
    BEGIN   
      IF @iLunar & @j >0   
        SET @yDays=@yDays+1   
      SET @j=@j/2   
    END   
   
    --传回农历年闰哪个月 1-12 , 没闰传回 0   
    SET @mLeap = @iLunar & 15   
   
    --传回农历年闰月的天数 ,加在年的总天数上   
    IF @mLeap > 0   
    BEGIN   
      IF @iLunar & 65536 > 0   
        SET @mLeapNum=30   
      ELSE    
        SET @mLeapNum=29   
   
      SET @yDays=@yDays+@mLeapNum   
    END   
       
    SET @offset=@offset-@yDays   
    SET @i=@i+1   
END   
     
IF @offset <= 0   
BEGIN   
    SET @offset=@offset+@yDays   
    SET @i=@i-1   
END   
--确定农历年结束     
SET @YEAR=@i   

--确定农历月开始   
SET @i = 1   
Select @iLunar=dataInt FROM SolarData Where
yearId=@YEAR

--判断那个月是润月   
SET @mLeap = @iLunar & 15   
SET @bLeap = 0  

WHILE @i < 13 AND @offset > 0   
BEGIN   
    --判断润月   
    SET @mDays=0   
    IF (@mLeap > 0 AND @i = (@mLeap+1) AND @bLeap=0)   
    BEGIN--是润月   
      SET @i=@i-1   
      SET @bLeap=1   
      --传回农历年闰月的天数   
      IF @iLunar & 65536 > 0   
        SET @mDays = 30   
      ELSE    
        SET @mDays = 29   
    END   
    ELSE   
    --不是润月   
    BEGIN   
      SET @j=1   
      SET @temp = 65536    
      WHILE @j<
=@i   
      BEGIN   
        SET @temp=@temp/2   
        SET @j=@j+1   
      END   
   
      IF @iLunar & @temp > 0   
        SET @mDays = 30   
      ELSE   
        SET @mDays = 29   
    END   
     
    --解除闰月
    IF @bLeap=1 AND @i= (@mLeap+1)
      SET @bLeap=0

    SET @offset=@offset-@mDays   
    SET @i=@i+1   
END   
   
IF @offset <= 0   
BEGIN   
    SET @offset=@offset+@mDays   
    SET @i=@i-1   
END   

--确定农历月结束     
SET @MONTH=@i
   
--确定农历日结束     
SET @DAY=@offset   
   
-- SET @OUTPUTDATE=CAST((CAST(@YEAR AS VARCHAR(4))+'-'+CAST(@MONTH AS VARCHAR(2))+'-'+CAST(@DAY AS VARCHAR(2))) AS

DATETIME)   
SET @OUTPUTDATE=CAST(@YEAR AS VARCHAR(4))+right('00'+CAST(@MONTH AS VARCHAR(2)),2)+right('00'+CAST(@DAY AS VARCHAR

(2)),2)   
RETURN @OUTPUTDATE
END  
GO

--调用方法
select dbo.fn_GetLunar(getdate())

--删除测试
drop function fn_GetLunar
drop table SolarData

4 ? SQL查询语句精华使用简要
2007-02-02T07:58:18+08:00 | rxl

一、 简单查询
  简单的Transact-SQL查询只包括选择列表、FROM子句和Where子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。
  例如,下面的语句查询testtable表中姓名为"张三"的nickname字段和email字段。

  Select nickname,email
  FROM testtable
  Where name='张三'

  (一) 选择列表

  选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。

  1、选择所有列

  例如,下面语句显示testtable表中所有列的数据:

  Select *
  FROM testtable

  2、选择部分列并指定它们的显示次序

  查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。
  例如:

  Select nickname,email
  FROM testtable

  3、更改列标题

  在选择列表中,可重新指定列标题。定义格式为:
  列标题=列名
  列名 列标题
  如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:

  Select 昵称=nickname,电子邮件=email
  FROM testtable

  4、删除重复行

  Select语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINCT选项时,对于所有重复的数据行在Select返回的结果集合中只保留一行。

  5、限制返回的行数

  使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。
  例如:

  Select TOP 2 *
  FROM testtable
  Select TOP 20 PERCENT *
  FROM testtable

  (二)FROM子句

  FROM子句指定Select语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。
  在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:

  Select username,citytable.cityid
  FROM usertable,citytable
  Where usertable.cityid=citytable.cityid

  在FROM子句中可用以下两种格式为表或视图指定别名:
  表名 as 别名
  表名 别名

  (二) FROM子句

  FROM子句指定Select语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。
  在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:

  Select username,citytable.cityid
  FROM usertable,citytable
  Where usertable.cityid=citytable.cityid

  在FROM子句中可用以下两种格式为表或视图指定别名:
  表名 as 别名
  表名 别名
  例如上面语句可用表的别名格式表示为:

  Select username,b.cityid
  FROM usertable a,citytable b
  Where a.cityid=b.cityid

  Select不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。

  例如:

  Select a.au_fname+a.au_lname
  FROM authors a,titleauthor ta
  (Select title_id,title
  FROM titles
  Where ytd_sales>10000
  ) AS t
  Where a.au_id=ta.au_id
  AND ta.title_id=t.title_id

  此例中,将Select返回的结果集合给予一别名t,然后再从中检索数据。

(三) 使用Where子句设置查询条件

  Where子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:

  Select *
  FROM usertable
  Where age>20

  Where子句可包括各种条件运算符:
  比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!<
  范围运算符(表达式值是否在指定的范围):BETWEEN...AND...
  NOT BETWEEN...AND...
  列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2......)
  NOT IN (项1,项2......)
  模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE
  空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL
  逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR

  1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30
  2、列表运算符例:country IN ('Germany','China')
  3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、varchar、text、ntext、datetime和smalldatetime等类型查询。
  可使用以下通配字符:
  百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。
  下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。
  方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
  例如:
  限制以Publishing结尾,使用LIKE '%Publishing'
  限制以A开头:LIKE '[A]%'
  限制以A开头外:LIKE '[^A]%'

  4、空值判断符例Where age IS NULL

  5、逻辑运算符:优先级为NOT、AND、OR

  (四)查询结果排序

  使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为:
  ORDER BY {column_name [ASC|DESC]} [,...n]
  其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排
  序。
  例如:

  Select *
  FROM usertable
  ORDER BY age desc,userid ASC

  另外,可以根据表达式进行排序。

  二、 联合查询

  UNION运算符可以将两个或两个以上上Select语句的查询结果集合合并成一个结果集合显示,即执行联合查询。UNION的语法格式为:

  select_statement
  UNION [ALL] selectstatement
  [UNION [ALL] selectstatement][...n]

  其中selectstatement为待联合的Select查询语句。

  ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一行。

  联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。

  在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型。

  在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:

  查询1 UNION (查询2 UNION 查询3)

你可能感兴趣的:(sql语句)