SQL语法
1.基本语法
(1)插入
INSERT mytable (first_column,second_column,third_column)
VALUES (‘some data’,’some more data’,’yet more data’)
(2)修改
UPDATE mytable SET first_column=’Updated!’
Second_column=’Updated!’
Third_column=’Updated!’
WHERE first_column=’Update Me1’
(3)一次插入多条语句
INSERT mytable (first_column,second_column)
SELECT another_first,another_second
FROM anothertable
WHERE another_first=’Copy Me!’
SELECT * INTO newtable FROM mytable
SELECT first_column INTO newtable
FROM mytable
WHERE second_column=’Copy Me!’
(4)求平均数
SELECT AVG(vote) ‘the_average’ FROM opinion
(5)distinct(唯一性,不重复)
SELECT COUNT(DISTINCT au_lname) FROM authors(不同名字的作者的数目)
(6)求和
SELECT SUM(purchase_amount) FROM orders
(7)最大值
SELECT MAX(vote) FROM opinion
(8)最小值
SELECT MIN(vote) FROM opinion(所有值中的最小值)
(9)其它例子
SELECT username FROM opinion WHERE vote>6 and vote<11
SELECT username FROM opinion WHERE vote BETWEEN 7 AND 10
SELECT username FROM opinion WHERE vote=1 or vote
SELECT username FROM opinion WHERE vote IN (1,10)
SELECT vote FROM opinion WHERE username IN (‘Bill Gates’,’President Clinton’)
SELECT vote FROM opinion WHERE username NOT IN (‘Bill Gates’,’President Clinton’)
SELECT username FROM opinion WHERE vote NOT BETWEEN 7 and 10
(10)convert()格式转化
SELECT CONVERT(CHAR(8),price)+’US Dollars’ FROM orders
SELECT ‘The vote is’+CONVERT(CHAR(1),vote) FROM opinion
(11)通配符((%代表0个或多个字符)):
SELECT SITE_name FROM site_directory WHERE site_desc LIKE ‘%trading cark%’
(12)[]用来匹配处在指定范围内的单个字符
SELECT site_name FROM site_directory WHERE site_name LIKE ‘[A-M]%’
(13)以A,B或C开头
SELECT site_name FROM site_directory WHERE site_name LIKE ‘[ABC]%’
取出那些首字母在C到F之间,或者以字母Y开头的站点:
SELECT site_name FROM site_directory WHERE site_name LIKE ‘[C-FY]%’
(14)脱字符(^)来排除特定的字符。例如,要得到那些名字不以Y开头的站点
SELECT site_name FROM site_directory WHERE site_name LIKE ‘[^Y]%’
(15)下划线字符(_)只代表单个字符
SELECT site_name FROM site_directory WHERE site_name LIKE ‘M_crosoft’
注意:
如果你想匹配百分号或下划线字符本身,你需要把它们括在方括号中。如果你想匹配连字符(-),应把它指定为方括号中的第一个字符。如果你想匹配方括号,应把它们也括在方括号中。例如,下面的语句返回所有其描述中包含百分号的站点:
SELECT site_name FROM site_directory WHERE site_desc LIKE ‘%[%]%’
(16)删除空格
有两个函数,TTRIM()和LTRIM(),可以用来从字符串中剪掉空格。函数LTRIM()去除应该字符串前面的所有空格;函数RTRIM()去除一个字符串尾部的所有空格。这里有一个任何使用函数RTRIM()的例子:
SELECT RTRIM(site_name) FROM site_directory
(17)操作日期
通过函数GETDATE(),你可以获得当前的日期和时间。返回当前日期和时间 返回如下的结果:
SELECT GETDATE()
显然,如果你将来使用这个函数,你得到的日期将比这个时间晚,或者梗早。
函数GETDATE()可以用来作为DATEDIME()型字段的缺省值。这对插入记录时保存当时的时间是有用的。例如,假设有一个表用来保存你站点上的活动日志。每当有一个访问者访问到你的站点时,就在表中添加一条新记录,记下访问者的名字,活动,和进行访问的时间。要建立一个表,其中的记录包含有当前的日期和时间,可以添加一个DATETIME型字段,指定其缺省值为函数GETDATE()的返回值,就象这样:
CREATE TABLE site_log (
username VARCHAR(40),
useractivity VARCHAR(100),
entrydate DATETIME DEFAULT GETDATE())
函数GETDATE()的返回值在显示时只显示到秒。实际上,SQL Sever内部时间可以精确到毫秒级(确切地说,可以精确到3.33毫秒)
得到不同格式的日期和时间,你需要使用函数CONVERT()
SELECT CONVERT(VARCHAR(30),GETDATE(),9)
注意例子中数字9的使用。这个数字指明了在显示日期和时间时使用哪种日期和时间格式。当这个语句执行时,将显示如下的日期和时间
表11.1 日期和时间的类型
类型值 标准 输出
0 Default mon dd yyyy hh:miAM
1 USA mm/dd/yy
2 ANSI yy.mm.dd
3 British/French dd/mm/yy
4 German dd.mm.yy
5 Italian dd-mm-yy
6 - dd mon yy
7 - mon dd,yy
8 - hh:mi:ss
9 Default + milliseconds--mon dd yyyy
hh:mi:ss:mmmAM(or )
10 USA mm-dd-yy
11 JAPAN yy/mm/dd
12 ISO yymmdd
13 Europe Default + milliseconds--dd mon yyyy
hh:mi:ss:mmm(24h)
14 - hh:mi:ss:mmm(24h)
类型0,9,和13总是返回四位的年。对其它类型,要显示世纪,把style值加上100。类型13和14返回24小时时钟的时间。类型0,7,和13返回的月份用三位字符表示(用Nov代表November).
对表11.1中所列的每一种格式,你可以把类型值加上100来显示有世纪的年(例如,00年将显示为2000年)。例如,要按日本标准显示日期,包括世纪,你应使用如下的语句:
SELECT CONVERT(VARCHAR(30),GETDATE(),111)
在这个例子中,函数CONVERT()把日期格式进行转换,显示为1997/11/30
抽取日期和时间
SELECT site_name ‘Site Name’,
DATEPART(mm,site_entrydate) ‘Month Posted’ FROM site_directory
函数DATEPART()的参数是两个变量。第一个变量指定要抽取日期的哪一部分;第二个变量是实际的数据。在这个例子中,函数DATEPART()抽取月份,因为mm代表月份。下面是这个SELECT 语句的输出结果:
函数DATEPART()的返回值是一个整数。你可以用这个函数抽取日期的各个不同部分
表11.2 日期的各部分及其简写
日期部分 简写 值
year yy 1753--9999
quarter qq 1--4
month mm 1--12
day of year dy 1--366
day dd 1--31
week wk 1--53
函数DATENAME()和函数DATEPART()接收同样的参数。但是,它的返回值是一个字符串,而不是一个整数。
主键:primary key
sql 循环插入
declare @i int
set @i=1
while @i<=(select count(distinct(userid)) from sys_UserRight)
begin
insert sys_UserRight(UserID,RightID,bBrowse,bAppend,bEdit,bDelete,bPrint,bImport,bExport)
values ( @i,'608','1','1','1','1','1','1','1')
set @i = @i+1
end
declare @i int
set @i=200
while @i>=200 and @i<700
begin
update sys_rightdata set parentid=-
(
select ParentID from sys_rightdata where ParentID=@i and ParentID>=200 and ParentID<700
)
in (select ParentID from sys_rightdata where ParentID=@i and ParentID>=200 and ParentID<700)
where ParentID>=200 and ParentID<700
set @i=@i+1
end
层别视图
create view vset_VerifyType
as
SELECT typekey,typeno,typename,parentkey,typelevel,typenote ,
(select typeno from set_VerifyType
where typekey=a.parentkey) as Parentno,
(select typename from set_verifytype
where typekey=a.parentkey) as parentname
FROM set_VerifyType as a
go
3.取字符
substring(logo, 1, 10) substring('abcdef', 2, 3) (bcd)
substring(字段,第1个位置,共几个位置)
if @MeasValue>@maxXbar begin set @maxXbar=@MeasValue end
Page.ClientScript.RegisterClientScriptBlock()
2.修改主键
ALTER TABLE dbo.table1 ADD CONSTRAINT
PK_table1 PRIMARY KEY CLUSTERED
(
col1,
col2
)
1.sql 分页
declare @pageIndex int,@pageSize int--pageIndex 最小值为0 ,Pos小值为1 ,sys_RightData 数据库名字
set @pageIndex=0;
set @pageSize=10;
select RightName ,Pos
from (
select RightName, ROW_NUMBER() OVER (order by RightID) as Pos from sys_RightData
) as T
where T.Pos >= @pageIndex*@pageSize+1 and T.Pos <(@pageIndex+1)*@pageSize+1
2.嵌套循环
--本脚本任意执行
declare @UserID int,@Max int,@RightID int--@UserID,@RightID变量,@Max 为@UserID的最大值
set @UserID=(select top 1 UserID from [sys_UserRight] order by userid asc)
set @Max=(select top 1 UserID from [sys_UserRight] order by userid desc)
while @UserID<=@Max
begin
set @RightID=1551
while @RightID >1550 and @RightID<1556
begin
INSERT INTO [sys_UserRight]([UserID],[RightID],[bBrowse],[bAppend],[bEdit],[bDelete],[bPrint],[bImport],[bExport])
VALUES(@UserID,@RightID,'True','True','True','True','True','True','True')
set @RightID=@RightID+1
end
set @UserID=@UserID+1
while @UserID not in (select distinct(UserID) from [sys_UserRight]) and @UserID<@Max+1
begin set @UserID=@UserID+1 end
end
3.取得服务器上的所有数据库(单层循环)
declare @dbid int,@max int,@name nvarchar(20)--@name为数据库名
set @dbid=1
set @max=(select max(dbid) from sysdatabases)
while @dbid<=@max
begin
set @name=(select name from master.dbo.sysdatabases where dbid=@dbid)
set @dbid=@dbid+1
if @name in ('Customer','ReportServer','ReportServerTempDB','master','model','msdb','tempdb')
begin continue end--排除的数据库
select @name
end