第一篇:SQL中forXML语句用法总结
-------raw模式:raw模式将查询结果集中的每一行转换为带有通用标识符row或可能提供元素名称的xml元素。(将查询结果集中的每一行转换为row元素的属性或row元素的子无素)-------------行集中非Null的每列值都将映射为row元素的一个属性--------------------------
select top 10 *
from mixtureMeasureMonitor
for xml raw
---将elements指令添加到for xml子句,则行集中非null的每列值都将映射为row元素的一个子元素
-----------
select top 10 *
from mixtureMeasureMonitor
for xml raw,elements
----在指定elements指令的同时指定xsinil选项,则将行集中为null的每例值映射为具有属性xsi:nil=“true”的一个元素
---------------------------
select top 10 *
from mixtureMeasureMonitor
for xml raw,elements XSINIL
-Auto模式根据查询确定返回的xml的形式--------------
select pmm.id,pmm.ppId,pp.MixPropNo,pmm.criterion
from mixtureMeasureMonitor as pmm inner join
produceProportion as pp on pp.id=pmm.ppid and pp.cOrgID=pmm.cOrgID tOption as tp on tp.cValue=pmm.Criterion inner join
where tp.ckey='Criterion '
for xml auto
select
pmm.id,pp.MixPropNo,pmm.ppId,pmm.criterion,pmm.temperatureMark,pmm.remark
from mixtureMeasureMonitor as pmm inner join
produceProportion as pp on pp.id=pmm.ppid and pp.cOrgID=pmm.cOrgID tOption as tp on tp.cValue=pmm.Criterion inner join
where tp.ckey='Criterion '
for xml auto,elements xsinil
-----------------explicit模式:使用RAW和AUTO模式不能很好地控制从查询结果生成的XML的形状。但是,对于要从查询结果生成的XML,EXPLICIT模式会提供非常好的灵活性-----------------------
select
pp.MixPropNo,pmm.id,pmm.ppId,pmm.criterion,pmm.temperatureMark,pmm.remark
from mixtureMeasureMonitor as pmm inner join
produceProportion as pp on pp.id=pmm.ppid and pp.cOrgID=pmm.cOrgID tOption as tp on tp.cValue=pmm.Criterion inner join
where tp.ckey='Criterion '
for xml explicit
-------------------------OPENXML语句,对XML文件进行查询,然后返回指定的XML中的结果集数据---------------------------
/*openxml(idoc int [in],rowpattern nvarchar[in],[flags byte [in]])
[WITH(SchemaDeclaration|TableName)]
Idoc:XML文档的内部表示形式的文档句柄
RowPattern:XPath模式,用来标识要作为行处理的节点
Flags:指示应在XML数据和关系行集间使用映射,以及应如何填充溢出列
SchemaDeclaration:窗体的架构定义
TableName:如果具有所需架构的表已经存在且不要求列模式,则为给定的表名*/ DECLARE @idoc int
declare @doc varchar(2000)
set @doc='
'
EXEC sp_xml_preparedocument @idoc output,@doc
select *
from openxml(@idoc,'/ROOT/Customer',1)
with(CustomerID varchar(10),ContactName varchar(20))/*path()括号内的参数是控制节点名称的,不指定括号时控制节点默认是row。rooot选项来添加单个顶级元素*/
------------------path选项不带()时,默认控制节点是row,其他字段元素都是row元素的子元素----------
select ID ,name
from MtrlBaseName
for xml path
--------------------------ID,name是product标签的子标签---------------select ID ,name
from MtrlBaseName
for xml path('Product'),root('ProductExport')
------------------ID是Product标签的属性,name是Product标签的内容-----------------------------
select ID [@ID],name as [*]
from MtrlBaseName
for xml path('Product'),root('ProductExport')
------------------ID,name是Product标签的属性
----
select ID [@ID],name as [@name]
from MtrlBaseName
for xml path('Product'),root('ProductExport')
第二篇:SQL语句经典总结
SQL语句经典总结
一、入门
1、说明:创建数据库
CREATE DATABASE database-name2、说明:删除数据库 drop database dbname
3、说明:备份sql server---创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'---开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)根据已有的表创建新表:
A:create table tab_new like tab_old(使用旧表创建新表)
B:create table tab_new as select col1,col2„ from tab_old definition only
5、说明:删除新表 drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col)说明:删除主键: Alter table tabname drop primary key(col)
8、说明:创建索引:create [unique] index idxname on tabname(col„.)删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement 删除视图:drop view viewname
10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围
插入:insert into table1(field1,field2)values(value1,value2)删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’---like的语法很精妙,查资料!排序:select * from table1 order by field1,field2 [desc] 总数:select count as totalcount from table1 求和:select sum(field1)as sumvalue from table1平均:select avg(field1)as avgvalue from table1 最大:select max(field1)as maxvalue from table1 最小:select min(field1)as minvalue from table1
11、说明:几个高级查询运算词 A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时(EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时(INTERSECT ALL),不消除重复行。注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、left(outer)join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c B:right(outer)join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。C:full/cross(outer)join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
12、分组:Group by: 一张表,一旦分组 完成后,查询后只能得到组相关的信息。
组相关的信息:(统计信息)count,sum,max,min,avg 分组的标准)
在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据 在selecte统计函数中的字段,不能和普通的字段放在一起;
13、对数据库进行操作:
分离数据库: sp_detach_db;附加数据库:sp_attach_db 后接表明,附加需要完整的路径名 14.如何修改数据库的名称:
sp_renamedb 'old_name', 'new_name'
二、提升
1、说明:复制表(只复制结构,源表名:a 新表名:b)(Access可用)法一:select * into b from a where 1<>1(仅用于SQlServer)法二:select top 0 * into b from a
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b)(Access可用)insert into b(a, b, c)select d,e,f from b;
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径)(Access可用)insert into b(a, b, c)select d,e,f from b in ‘具体数据库’ where 条件 例子:..from b in '“&Server.MapPath(”.“)&”data.mdb“ &”' where..2
4、说明:子查询(表名1:a 表名2:b)select a,b,c from a where a IN(select d from b)或者: select a,b,c from a where a IN(1,2,3)
5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate)adddate from table where table.title=a.title)b
6、说明:外连接查询(表名1:a 表名2:b)select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
7、说明:在线视图查询(表名1:a)select * from(SELECT a,b,c FROM a)T where t.a > 1;
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 select * from table1 where time between time1 and time2 select a,b,c, from table1 where a not between 数值1 and 数值2
9、说明:in 的使用方法
select * from table1 where a [not] in(‘值1’,’值2’,’值4’,’值6’)
10、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists(select * from table2 where table1.field1=table2.field1)
11、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where.....12、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
13、说明:一条sql 语句搞定数据库分页
select top 10 b.* from(select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc)a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 具体实现:
关于数据库分页:
declare @start int,@end int @sql nvarchar(600)set @sql=’select top’+str(@end-@start+1)+’+from top’+str(@str-1)+’Rid from T where Rid>-1)’ exec sp_executesql @sql
注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引)
T where rid not in(select
14、说明:前10条记录
select top 10 * form table1 where 范围
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)select a,b,c from tablename ta where a=(select max(a)from tablename tb where tb.b=ta.b)
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA)except(select a from tableB)except(select a from tableC)
17、说明:随机取出10条数据
select top 10 * from tablename order by newid()
18、说明:随机选择记录 select newid()
19、说明:删除重复记录
1),delete from tablename where id not in(select max(id)from tablename group by col1,col2,...)2),select distinct * into temp from tablename delete from tablename
insert into tablename select * from temp 评价: 这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作
3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段 alter table tablename--添加一个自增列
add column_b int identity(1,1)delete from tablename where column_b not in(select max(column_b)from tablename group by column1,column2,...)alter table tablename drop column column_b
20、说明:列出数据库里所有的表名
select name from sysobjects where type='U' // U代表用户
21、说明:列出表里的所有的列名
select name from syscolumns where id=object_id('TableName')
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end)FROM tablename group by type 显示结果:
type vender pcs 电脑 A 1
电脑 A 1 光盘 B 2 光盘 A 2 手机 B 3 手机 C 3
23、说明:初始化表table1 TRUNCATE TABLE table1
24、说明:选择从10到15的记录
select top 5 * from(select top 15 * from table order by id asc)table_别名 order by id desc
三、技巧 1、1=1,1=2的使用,在SQL语句组合时用的较多
“where 1=1” 是表示选择全部 “where 1=2”全部不选,如:
if @strWhere!='' begin set @strSQL = 'select count(*)as Total from [' + @tblName + '] where ' + @strWhere end else begin set @strSQL = 'select count(*)as Total from [' + @tblName + ']' end 我们可以直接写成 错误!未找到目录项。
set @strSQL = 'select count(*)as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere
2、收缩数据库--重建索引 DBCC REINDEX DBCC INDEXDEFRAG--收缩数据和日志 DBCC SHRINKDB DBCC SHRINKFILE
3、压缩数据库
dbcc shrinkdatabase(dbname)
4、转移数据库给新用户以已存在用户权限
exec sp_change_users_login 'update_one','newname','oldname' go
5、检查备份集
RESTORE VERIFYONLY from disk='E:dvbbs.bak'
6、修复数据库
ALTER DATABASE [dvbbs] SET SINGLE_USER GO DBCC CHECKDB('dvbbs',repair_allow_data_loss)WITH TABLOCK GO ALTER DATABASE [dvbbs] SET MULTI_USER GO
7、日志清除 SET NOCOUNT ON DECLARE @LogicalFileName sysname, @MaxMinutes INT, @NewSize INT
USE tablename--要操作的数据库名
SELECT @LogicalFileName = 'tablename_log',--日志文件名 @MaxMinutes = 10,--Limit on time allowed to wrap log.@NewSize = 1--你想设定的日志文件的大小(M)Setup / initialize DECLARE @OriginalSize int SELECT @OriginalSize = size FROM sysfiles WHERE name = @LogicalFileName SELECT 'Original Size of ' + db_name()+ ' LOG is ' + CONVERT(VARCHAR(30),@OriginalSize)+ ' 8K pages or ' + CONVERT(VARCHAR(30),(@OriginalSize*8/1024))+ 'MB' FROM sysfiles WHERE name = @LogicalFileName CREATE TABLE DummyTrans(DummyColumn char(8000)not null)
DECLARE @Counter INT, @StartTime DATETIME, @TruncLog VARCHAR(255)SELECT @StartTime = GETDATE(), @TruncLog = 'BACKUP LOG ' + db_name()+ ' WITH TRUNCATE_ONLY' DBCC SHRINKFILE(@LogicalFileName, @NewSize)EXEC(@TruncLog)--Wrap the log if necessary.WHILE @MaxMinutes > DATEDIFF(mi, @StartTime, GETDATE())--time has not expired
AND @OriginalSize =(SELECT size FROM sysfiles WHERE name = @LogicalFileName)AND(@OriginalSize * 8 /1024)> @NewSize BEGIN--Outer loop.SELECT @Counter = 0 WHILE((@Counter < @OriginalSize / 16)AND(@Counter < 50000))BEGIN--update INSERT DummyTrans VALUES('Fill Log')DELETE DummyTrans SELECT @Counter = @Counter + 1 END EXEC(@TruncLog)END SELECT 'Final Size of ' + db_name()+ ' LOG is ' + CONVERT(VARCHAR(30),size)+ ' 8K pages or ' + CONVERT(VARCHAR(30),(size*8/1024))+ 'MB' FROM sysfiles WHERE name = @LogicalFileName DROP TABLE DummyTrans SET NOCOUNT OFF
8、说明:更改某个表
exec sp_changeobjectowner 'tablename','dbo'
9、存储更改全部表
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch @OldOwner as NVARCHAR(128), @NewOwner as NVARCHAR(128)AS DECLARE @Name as NVARCHAR(128)DECLARE @Owner as NVARCHAR(128)DECLARE @OwnerName as NVARCHAR(128)DECLARE curObject CURSOR FOR select 'Name' = name, 'Owner' = user_name(uid)from sysobjects where user_name(uid)=@OldOwner order by name OPEN curObject FETCH NEXT FROM curObject INTO @Name, @Owner WHILE(@@FETCH_STATUS=0)BEGIN if @Owner=@OldOwner begin set @OwnerName = @OldOwner + '.' + rtrim(@Name)
exec sp_changeobjectowner @OwnerName, @NewOwner end--select @name,@NewOwner,@OldOwner FETCH NEXT FROM curObject INTO @Name, @Owner END close curObject deallocate curObject GO
10、SQL SERVER中直接循环写入数据 declare @i int set @i=1 while @i<30 begin insert into test(userid)values(@i)set @i=@i+1 end 案例:
有如下表,要求就裱中所有沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格:
Name score Zhangshan 80
Lishi 59 Wangwu 50
Songquan 69
while((select min(score)from tb_table)<60)begin update tb_table set score =score*1.01 where score<60
if(select min(score)from tb_table)>60 break else continue end
数据开发-经典
1.按姓氏笔画排序:
Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多2.数据库加密: select encrypt('原始密码')
select pwdencrypt('原始密码')select pwdcompare('原始密码','加密后密码')= 1--相同;否则不相同 encrypt('原始密码')select pwdencrypt('原始密码')select pwdcompare('原始密码','加密后密码')= 1--相同;否则不相同 3.取回表中字段: declare @list varchar(1000), @sql nvarchar(1000)select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A' set @sql='select '+right(@list,len(@list)-1)+' from 表A' exec(@sql)4.查看硬盘分区: EXEC master..xp_fixeddrives 5.比较A,B表是否相等: if(select checksum_agg(binary_checksum(*))from A)=(select checksum_agg(binary_checksum(*))from B)print '相等' else print '不相等' 6.杀掉所有的事件探察器进程: DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid)FROM master.dbo.sysprocesses WHERE program_name IN('SQL profiler',N'SQL 事件探查器')EXEC sp_msforeach_worker '?' 7.记录搜索: 开头到N条记录
Select Top N * From 表
N到M条记录(要有主索引ID)Select Top M-N * From 表 Where ID in(Select Top M ID From 表)Order by ID Desc---N到结尾记录
Select Top N * From 表 Order by ID Desc 案例
例如1:一张表有一万多条记录,表的第一个字段 RecID 是自增长字段,写一个SQL语句,找出表的第31到第40个记录。
select top 10 recid from A where recid not in(select top 30 recid from A)分析:如果这样写会产生某些问题,如果recid在表中存在逻辑索引。
select top 10 recid from A where„„是从索引中查找,而后面的select top 30 recid from A则在数据表中查找,这样由于索引中的顺序有可能和数据表中的不一致,这样就导致查询到的不是本来的欲得到的数据。解决方案
1,用order by select top 30 recid from A order by ricid 如果该字段不是自增长,就会出现问题 2,在那个子查询中也加条件:select top 30 recid from A where recid>-1
例2:查询表中的最后以条记录,并不知道这个表共有多少数据,以及表结构。
set @s = 'select top 1 * from T
where pid not in(select top ' + str(@count-1)+ ' pid from T)' print @s
exec sp_executesql
@s 9:获取当前数据库中的所有用户表
select Name from sysobjects where xtype='u' and status>=0 10:获取某一个表的所有字段
select name from syscolumns where id=object_id('表名')select name from syscolumns where id in(select id from sysobjects where type = 'u' and name = '表名')两种方式的效果相同
11:查看与某一个表相关的视图、存储过程、函数
select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%' 12:查看当前数据库中所有存储过程
select name as 存储过程名称 from sysobjects where xtype='P' 13:查询用户创建的所有数据库
select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')或者
select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01 14:查询某一个表的字段和数据类型
select column_name,data_type from information_schema.columns where table_name = '表名' 15:不同服务器数据库之间的数据操作--创建链接服务器
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 '--查询示例
select * from ITSV.数据库名.dbo.表名--导入示例
select * into 表 from ITSV.数据库名.dbo.表名--以后不再使用时删除链接服务器
exec sp_dropserver 'ITSV ', 'droplogins '
--连接远程/局域网数据(openrowset/openquery/opendatasource)--
1、openrowset--查询示例
select * from openrowset('SQLOLEDB ', 'sql服务器名 ';'用户名 ';'密码 ',数据库名.dbo.表名)
--生成本地表
select * into 表 from openrowset('SQLOLEDB ', 'sql服务器名 ';'用户名 ';'密码 ',数据库名.dbo.表名)
--把本地表导入远程表
insert openrowset('SQLOLEDB ', 'sql服务器名 ';'用户名 ';'密码 ',数据库名.dbo.表名)select *from 本地表--更新本地表 update b set b.列A=a.列A from openrowset('SQLOLEDB ', 'sql服务器名 ';'用户名 ';'密码 ',数据库名.dbo.表名)as a inner join 本地表 b on a.column1=b.column1--openquery用法需要创建一个连接--首先创建一个连接创建链接服务器
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '--查询
select * FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')--把本地表导入远程表
insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')select * from 本地表--更新本地表 update b set b.列B=a.列B FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')as a inner join 本地表 b on a.列A=b.列A
--
3、opendatasource/openrowset SELECT * FROM opendatasource('SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').test.dbo.roy_ta--把本地表导入远程表
insert opendatasource('SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名 select * from 本地表
SQL Server基本函数
SQL Server基本函数 1.字符串函数 长度与分析用
1,datalength(Char_expr)返回字符串包含字符数,但不包含后面的空格
2,substring(expression,start,length)取子串,字符串的下标是从“1”,start为起始位置,length为字符串长度,实际应用中以len(expression)取得其长度
3,right(char_expr,int_expr)返回字符串右边第int_expr个字符,还用left于之相反
4,isnull(check_expression , replacement_value)如果check_expression為空,則返回replacement_value的值,不為空,就返回check_expression字符操作类
5,Sp_addtype 自定義數據類型
例如:EXEC sp_addtype birthday, datetime, 'NULL' 6,set nocount {on|off} 使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。
SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。SET NOCOUNT 为 OFF 时,返回计数
常识
在SQL查询中:from后最多可以跟多少张表或视图:256 在SQL语句中出现 Order by,查询时,先排序,后取
在SQL中,一个字段的最大容量是8000,而对于nvarchar(4000),由于nvarchar是Unicode码。
SQLServer2000同步复制技术实现步骤
一、预备工作
1.发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户--管理工具--计算机管理--用户和组--右键用户
--新建用户
--建立一个隶属于administrator组的登陆windows的用户(SynUser)2.在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作: 我的电脑--D: 新建一个目录,名为: PUB--右键这个新建的目录--属性--共享
--选择“共享该文件夹”--通过“权限”按纽来设置具体的用户权限,保证第一步中创建的用户(SynUser)具有对该文件夹的所有权限
--确定
3.设置SQL代理(SQLSERVERAGENT)服务的启动用户(发布/订阅服务器均做此设置)开始--程序--管理工具--服务--右键SQLSERVERAGENT--属性--登陆--选择“此账户”--输入或者选择第一步中创建的windows登录用户名(SynUser)--“密码”中输入该用户的密码
4.设置SQL Server身份验证模式,解决连接时的权限问题(发布/订阅服务器均做此设置)企业管理器
--右键SQL实例--属性
--安全性--身份验证
--选择“SQL Server 和 Windows”
--确定
5.在发布服务器和订阅服务器上互相注册 企业管理器
--右键SQL Server组
--新建SQL Server注册...--下一步--可用的服务器中,输入你要注册的远程服务器名--添加--下一步--连接使用,选择第二个“SQL Server身份验证”--下一步--输入用户名和密码(SynUser)
--下一步--选择SQL Server组,也可以创建一个新组--下一步--完成
6.对于只能用IP,不能用计算机名的,为其注册服务器别名(此步在实施中没用到)
(在连接端配置,比如,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP)开始--程序--Microsoft SQL Server--客户端网络实用工具--别名--添加
--网络库选择“tcp/ip”--服务器别名输入SQL服务器名
--连接参数--服务器名称中输入SQL服务器ip地址
--如果你修改了SQL的端口,取消选择“动态决定端口”,并输入对应的端口号
二、正式配置
1、配置发布服务器
打开企业管理器,在发布服务器(B、C、D)上执行以下步骤:(1)从[工具]下拉菜单的[复制]子菜单中选择[配置发布、订阅服务器和分发]出现配置发布和分发向导(2)[下一步] 选择分发服务器 可以选择把发布服务器自己作为分发服务器或者其他sql的服务器(选择自己)
(3)[下一步] 设置快照文件夹
采用默认servernamePub(4)[下一步] 自定义配置
可以选择:是,让我设置分发数据库属性启用发布服务器或设置发布设置 否,使用下列默认设置(推荐)
(5)[下一步] 设置分发数据库名称和位置 采用默认值(6)[下一步] 启用发布服务器 选择作为发布的服务器(7)[下一步] 选择需要发布的数据库和发布类型(8)[下一步] 选择注册订阅服务器(9)[下一步] 完成配置
2、创建出版物
发布服务器B、C、D上
(1)从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令(2)选择要创建出版物的数据库,然后单击[创建发布](3)在[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)(4)单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型, SQLSERVER允许在不同的数据库如 orACLE或ACCESS之间进行数据复制。但是在这里我们选择运行“SQL SERVER 2000”的数据库服务器
(5)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表 注意: 如果前面选择了事务发布 则再这一步中只能选择带有主键的表(6)选择发布名称和描述
(7)自定义发布属性 向导提供的选择:
是 我将自定义数据筛选,启用匿名订阅和或其他自定义属性 否 根据指定方式创建发布(建议采用自定义的方式)(8)[下一步] 选择筛选发布的方式
(9)[下一步] 可以选择是否允许匿名订阅
1)如果选择署名订阅,则需要在发布服务器上添加订阅服务器
方法: [工具]->[复制]->[配置发布、订阅服务器和分发的属性]->[订阅服务器] 中添加 否则在订阅服务器上请求订阅时会出现的提示:改发布不允许匿名订阅 如果仍然需要匿名订阅则用以下解决办法
[企业管理器]->[复制]->[发布内容]->[属性]->[订阅选项] 选择允许匿名请求订阅 2)如果选择匿名订阅,则配置订阅服务器时不会出现以上提示(10)[下一步] 设置快照 代理程序调度(11)[下一步] 完成配置
当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库 有数据
srv1.库名..author有字段:id,name,phone, srv2.库名..author有字段:id,name,telphone,adress
要求:
srv1.库名..author增加记录则srv1.库名..author记录增加
srv1.库名..author的phone字段更新,则srv1.库名..author对应字段telphone更新--*/
--大致的处理步骤
--1.在 srv1 上创建连接服务器,以便在 srv1 中操作 srv2,实现同步
exec sp_addlinkedserver 'srv2','','SQLOLEDB','srv2的sql实例名或ip' exec sp_addlinkedsrvlogin 'srv2','false',null,'用户名','密码' go--2.在 srv1 和 srv2 这两台电脑中,启动 msdtc(分布式事务处理服务),并且设置为自动启动
。我的电脑--控制面板--管理工具--服务--右键 Distributed Transaction Coordinator--属性--启动--并将启动类型设置为自动启动 go
--然后创建一个作业定时调用上面的同步处理存储过程就行了
企业管理器--管理
--SQL Server代理--右键作业--新建作业
--“常规”项中输入作业名称--“步骤”项
--新建
--“步骤名”中输入步骤名
--“类型”中选择“Transact-SQL 脚本(TSQL)”--“数据库”选择执行命令的数据库
--“命令”中输入要执行的语句: exec p_process--确定--“调度”项--新建调度
--“名称”中输入调度名称
--“调度类型”中选择你的作业执行安排--如果选择“反复出现”--点“更改”来设置你的时间安排
然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行
设置方法: 我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择“自动启动”--确定.--3.实现同步处理的方法2,定时同步
--在srv1中创建如下的同步处理存储过程 create proc p_process as--更新修改过的数据
update b set name=i.name,telphone=i.telphone from srv2.库名.dbo.author b,author i where b.id=i.id and(b.name <> i.name or b.telphone <> i.telphone)
--插入新增的数据
insert srv2.库名.dbo.author(id,name,telphone)select id,name,telphone from author i where not exists(select * from srv2.库名.dbo.author where id=i.id)
--删除已经删除的数据(如果需要的话)delete b from srv2.库名.dbo.author b where not exists(select * from author where id=b.id)go
第三篇:经典实用SQL语句总结
经典实用SQL语句大全总结
[编辑语言]2015-05-26 19:56
本文导航
1、首页2、11、说明:四表联查问题:
本文是经典实用SQL语句大全的介绍,下面是该介绍的详细信息。下列语句部分是Mssql语句,不可以在access中使用。SQL分类:
DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)首先,简要介绍基础语句:
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库 drop database dbname
3、说明:备份sql server---创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'---开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)根据已有的表创建新表:
A:create table tab_new like tab_old(使用旧表创建新表)B:create table tab_new as select col1,col2… from tab_old definition only
5、说明:
删除新表:drop table tabname
6、说明:
增加一个列:Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:
添加主键:Alter table tabname add primary key(col)说明:
删除主键:Alter table tabname drop primary key(col)
8、说明:
创建索引:create [unique] index idxname on tabname(col….)删除索引:drop index idxname 注:索引是不可更改的,想更改必须删除重新建。
9、说明: 创建视图:create view viewname as select statement 删除视图:drop view viewname
10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围
插入:insert into table1(field1,field2)values(value1,value2)删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’---like的语法很精妙,查资料!排序:select * from table1 order by field1,field2 [desc] 总数:select count * as totalcount from table1 求和:select sum(field1)as sumvalue from table1平均:select avg(field1)as avgvalue from table1 最大:select max(field1)as maxvalue from table1 最小:select min(field1)as minvalue from table1
11、说明:几个高级查询运算词 A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时(EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时(INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接 A、left outer join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c B:right outer join: 右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。其次,大家来看一些不错的sql语句
1、说明:复制表(只复制结构,源表名:a 新表名:b)(Access可用)法一:select * into b from a where 1<>1 法二:select top 0 * into b from a
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b)(Access可用)insert into b(a, b, c)select d,e,f from b;
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径)(Access可用)insert into b(a, b, c)select d,e,f from b in ‘具体数据库’ where 条件 例子:..from b in '“&Server.MapPath(”.“)&”data.mdb“ &”' where..4、说明:子查询(表名1:a 表名2:b)select a,b,c from a where a IN(select d from b)或者: select a,b,c from a where a IN(1,2,3)
5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate)adddate from table where table.title=a.title)b
6、说明:外连接查询(表名1:a 表名2:b)select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
7、说明:在线视图查询(表名1:a)select * from(SELECT a,b,c FROM a)T where t.a > 1;
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
select * from table1 where time between time1 and time2 select a,b,c, from table1 where a not between 数值1 and 数值2
9、说明:in 的使用方法
select * from table1 where a [not] in(‘值1’,’值2’,’值4’,’值6’)
10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists(select * from table2 where table1.field1=table2.field1)
11、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where.....12、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
13、说明:一条sql 语句搞定数据库分页
select top 10 b.* from(select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc)a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
14、说明:前10条记录
select top 10 * form table1 where 范围
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)select a,b,c from tablename ta where a=(select max(a)from tablename tb where tb.b=ta.b)
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表(select a from tableA)except(select a from tableB)except(select a from tableC)
17、说明:随机取出10条数据
select top 10 * from tablename order by newid()
18、说明:随机选择记录 select newid()
19、说明:删除重复记录
Delete from tablename where id not in(select max(id)from tablename group by col1,col2,...)20、说明:列出数据库里所有的表名
select name from sysobjects where type='U'
21、说明:列出表里的所有的
select name from syscolumns where id=object_id('TableName')
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end)FROM tablename group by type 显示结果: type vender pcs 电脑 A 1 电脑 A 1 光盘 B 2 光盘 A 2 手机 B 3 手机 C 3
23、说明:初始化表table1 TRUNCATE TABLE table1
24、说明:选择从10到15的记录
select top 5 * from(select top 15 * from table order by id asc)table_别名 order by id desc 随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:
Randomize RNumber = Int(Rnd*499)+1 While Not objRec.EOF If objRec(“ID”)= RNumber THEN...这里是执行脚本...end if objRec.MoveNext Wend 这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了? 采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的 recordset,如下所示:
Randomize RNumber = Int(Rnd*499)+ 1 SQL = “SELECT * FROM Customers WHERE ID = ” & RNumber set objRec = ObjConn.Execute(SQL)Response.WriteRNumber & “ = ” & objRec(“ID”)& “ ” & objRec(“c_email”)不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。
再谈随机数
现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:
SQL = “SELECT * FROM Customers WHERE ID = ” & RNumber & “ OR ID = ” & RNumber2 & “ OR ID = ” & RNumber3 假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码):
SQL = “SELECT * FROM Customers WHERE ID BETWEEN ” & RNumber & “ AND ” & RNumber & “+ 9” 注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。随机读取若干条记录,测试过
Access语法:SELECT top 10 * From 表名 ORDER BY Rnd(id)Sql server:select top n * from 表名 order by newid()mysql select * From 表名 Order By rand()Limit n Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)语法 select table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where...使用SQL语句 用...代替过长的字符串显示 语法: SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field)FROM tablename;Conn.Execute说明 Execute方法
该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:
1.执行SQL查询语句时,将返回查询得到的记录集。用法为: Set 对象变量名=连接对象.Execute(“SQL 查询语言”)Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。
2.执行SQL的操作性语言时,没有记录集的返回。此时用法为: 连接对象.Execute “SQL 操作性语句” [, RecordAffected][, Option] ·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。
·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。
·BeginTrans、RollbackTrans、CommitTrans方法 这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。
事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。
BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。
SQL语句大全精要 2006/10/26 13:46 DELETE 语句
DELETE语句:用于创建一个删除查询,可从列在 FROM 子句之中的一个或多个表中删除记录,且该子句满足 WHERE 子句中的条件,可以使用DELETE删除多个记录。
语法:DELETE [table.*] FROM table WHERE criteria 语法:DELETE * FROM table WHERE criteria='查询的字' 说明:table参数用于指定从其中删除记录的表的名称。
criteria参数为一个表达式,用于指定哪些记录应该被删除的表达式。可以使用 Execute 方法与一个 DROP 语句从数据库中放弃整个表。不过,若用这种方法删除表,将会失去表的结构。不同的是当使用 DELETE,只有数据会被删除;表的结构以及表的所有属性仍然保留,例如字段属性及索引。
以上就是精品学习网提供的关于经典实用SQL语句大全的内容,希望对大家有所帮助。
第四篇:SQL语句总结
SQL语句总结
一、插入记录
1. 插入固定的数值
语法:
INSERT[INTO]表名[(字段列表)]VALUES(值列表)
示例1:
Insert into Students values('Mary’,24,’mary@163.com’)
若没有指定给Student表的哪些字段插入数据:<情况一>表示给该表的所有字段插入数据,根据数据的个数,可以得知Students表中一共有3个字段<情况二>表中有4个字段,其中一个字段是标识列。
示例2:
Insert into Students(Sname,Sage)values(‘Mary’,24)
指定给表中的Sname,Sage两个字段插入数据。注意事项:
1)该命令运行一次向表中插入1条记录。无法实现向已存在的某记录中插入一个数据
2)如果不指定给哪些字段插入数值,则应注意值列表的值个数
3)插入数据时,注意值的数据类型要与对应的字段数据类型匹配
4)插入数据时,如果没有给值的字段必须保证允许其为空
5)插入数据时,要注意字段中的一些约束
2. 插入的记录集为一个查询结果
语法:
INSERTINTO表名[(字段列表)]SELECT 字段列表 FROM表WHERE条件 示例1:
InsertintoTeacherselectSname,Sage,SemailfromStudent
从Student表中查询三个字段的全部记录,插入Teacher表,没有指定Teacher表的具体字段,表示给Teacher表的全部字段插入数值
示例2:
InsertintoTeacherselectSname,Sage,SemailfromStudentwhereSage>25
从Student表中查询三个字段的部分记录,插入Teacher表
示例3:
InsertintoTeacher(tid,tname)selectSname , SagefromStudent 从Student表中查询两个字段的全部记录,插入到Teacher表中的tid,tname字段 注意事项:
查询表的字段要和插入表的字段数据类型一一对应
3. 生成表查询
语法:
SELECT字段列表INTO新表名FROM原表WHERE条件
示例1:
SelectSname,Sage,SemailintonewStudentfrom Studentwhere Sage<20 从Student表中查询出年龄小于20岁的学生的记录生成新表newStudent
共6页当前第1页
示例2:
Select Sname,Sage,SemailintonewStudentfromStudentwhere 1=2
利用Student表的表结构生成新表newStudent,newStudent表中记录为空
注意事项:
执行该语句时,确保数据库中不存在into关键字后面的指定的表名
二、删除记录
1)删除满足条件的记录
语法:
DELETEFROM表名WHERE条件
示例1:
DeletefromStudentwhereSage<20
从Student表中删除年龄小于20岁的学生的记录
示例2:
DeletefromStudent
没有设置条件,删除Student表的全部记录
2)删除表的全部记录
语法:
TRUNCATETABLE表名
示例:
TruncatetableStudent
删除表Student中的全部记录,约束依然存在三、修改记录
语法:
UPDATE表名SET字段=新值WHERE条件
示例1:
UpdateStudentsetSemail=’Email’+SemailwhereSemailisnotnull
把有email的学员的email地址变为原先的地址前加上‘Email’字符串
示例2:
UpdateStudentsetSage=Sage+1
把所有记录的Sage变为原先的值加1,例如过一年学生要长一岁
四、查询记录
1. 基本查询
语法:
SELECT字段列表FROM表
示例1:
SelectsName,sAge,sEmailfromStudents
从Students表中查询3个字段的所有的记录
示例2:
Select*fromStudents
从Students表中查询所有字段的所有的记录(字段列表位置写*代表查询表中所有字段)
2. 带WHERE子句的查询
语法:
SELECT字段列表FROM表WHERE条件
示例1:
SelectSNamefromStudentswhereSage>23
查询Students表中年龄大于23的学员的姓名
3. 应用别名
语法1:
SELECT字段列表AS别名„„
示例1:
SelectSNameas学员姓名,sAgeas学员年龄fromStudents
将查询的两个字段分别用中文别名显示
语法2:
SELECT别名=字段„„
示例2:
Select学员姓名=sName, 学员年龄=sAgefromStudents
注意事项:
别名可以是英文,也可以是中文,别名可以用单引号引起,也可以不引
4. 使用常量(利用‘+’连接字段和常量)
示例:
SelectsName+’的年龄是’+convert(varchar(2),sAge)as 学员信息
from Students
从Students表中查询,将学员的姓名和年龄信息与一个常量连接起来,显示为一个字段,该字段以“学员信息”为别名
5. 限制返回的行数
语法1:
SELECTTOPN字段列表 FROM表
示例1:
Select top 3sName,sAgefromStudents
查询Students表的前三条记录
语法2:
SELECTTOPNPERCENT字段列表FROM表
示例2:
Selecttop30percentsName,sAge from Students
查询Students表的前30%条记录
6. 排序
语法:
SELECT字段列表FROM表WHERE条件ORDER BY字段ASC/DESC 示例1:
Select*fromStudentswhere sAge>20order by sAge
查询年龄大于20岁的学员信息,并且按照年龄升序排序(若不指定升降序,默认为升序)示例2:
Select*fromStudentsorder by sNamedesc
查询所有学生的所有信息,并按照学生的姓名降序排序
7. 模糊查询
1)Like:通常与通配符结合使用,适用于文本类型的字段
示例1:
Select * from StudentswheresNamelike ‘张_’
查询Students表中张姓的,两个字名的学生信息
示例2:
Select * from StudentswheresNamelike ‘张%’
查询Students表中张姓的学生的信息
示例3:
Select * from StudentswheresEmaillike ‘%@[a-z]%’
查询Students表中,Semail字段‘@’后的第一个字符为小写英文字母的学生信息 示例4:
Select * from StudentswherestuNamelike ‘%@[^a-z]%’
查询Students表中,Semail字段‘@’后的第一个字符不是小写英文字母的学生信息
2)Between „and„:用于查询条件为一个字段介于两个值之间
示例:
Select * from Students where Sage between 20and25
查询学员年龄在20到25之间的学员信息
3)In:用于查询某个字段在值列表中出现作为条件
示例:
Select*fromStudentswhereScityin(‘大连’,’沈阳’,’北京’)查询学员的城市在大连,沈阳或北京的学员信息,等价于如下功能:
Select * from Students where Scity=’大连’or Scity=’沈阳’or Scity=’北京’
4)Isnull:用于查询某个字段为空作为条件
示例:
Select * from Students where Semail is null
查询学员的email为空的学员信息
Select * from Students where semail is not null
查询学员的email不为空的学员信息
8. 聚合函数(所有函数自动忽略空值)
1)Sum():统计某字段的和,用于数值型数据
示例:
Select sum(Sage)as 学员的年龄和 from Student
统计Students表中所有学员的年龄总和,显示结果为一个字段一条记录
2)Avg():统计某字段的平均值,用于数值型数据
示例:
Select avg(Sage)as 学员的平均年龄fromStudents
统计Students表中所有学员的年龄的平均值,显示结果为一个字段一条记录
3)Max():统计某字段的最大值,用于数值,文本,日期型
4)Min():统计某字段的最小值,用于数值,文本,日期型
示例:
Select max(Sage)as 最大年龄 , min(Sage)as 最小年龄from Students
查询Students表中的学员的最大年龄和最小年龄,显示结果为两个字段一条记录
5)Count():统计某字段的记录数或者表的记录数
示例1:
Select count(Semail)as email的数量 fromStudents
查询Students表中,有email的学员的数量。Count(字段)代表统计字段的记录数 示例2:
Select count(*)as学员的数量fromStudents
查询Students表中的记录数,count(*)代表统计表的记录数
9. 分组与聚合函数
语法:
SELECT字段1,聚合函数(字段)AS别名
FROM表
WHERE条件1
GROUP BY字段1
HAVING条件2
ORDER BY字段
注意事项: 1)此语法格式用于对表中按照某个字段分类之后,对每类中的某个数据进行统计
2)分组的字段应该是包含大量重复数据的字段
3)只有出现的group by后的字段,才可以独立出现在select后
4)Where条件用于在分组之前进行对记录的过滤
5)Having条件用于对分组之后的记录集进行条件过滤
6)Orderby总是出现在最后,对最终的结果集进行排序
示例1:
SelectSsex,avg(Sage)as平均年龄fromStudent
Group by Ssex
统计Student表中男生和女生的平均年龄。按照性别分组,分为男生和女生两组,统计每组中年龄的平均值
示例2:
SelectSsex,avg(Sage)as平均年龄fromStudents
WhereSemail is not null
Group by Ssex
统计具有email的学员中,男生和女生的平均年龄。先根据Smail字段进行条件过滤,过滤掉没有email的学员,对有email的学员分为男生和女孩两组,统计每组中年龄的平均值
示例3:
SelectSdate,count(*)as人数
FromStudents
Group by Sdate
Havingcount(*)>10
统计每天报名的人数,并显示出报名人数多于10人的记录。先按照报名的日期进行分组,统计出每天的报名人数,再在分组之后的记录集上进行条件过滤,留下人数超过10人的记录。
示例4:
SelectSdate,count(*)as人数
From Students
Where xueli=’大专’
Group by Sdate
Having by count(*)>10
查询大专学历的学员中,每天报名的人数,并显示多于10人的记录。先按照学历为大专的条件进行过滤,把是大专的学员按照报名日期进行分组,统计每组的报名人数,再把分组之后的记录集进行再次过滤,显示出报名人数多于10人的信息
10. 多表查询 注意事项:
1)能够进行多表联接查询的表中必须包含有公共字段,两个表的公共字段不要求字段名相同,但数据类型必须相同,功能相同,且两个字段中要包含相同记录
2)最常用的联接为内联接
1)内联接
SELECT字段列表
FROM表1INNERJOIN表2
ON表1.公共字段=表2.公共字段
返回两个表基于公共字段有相同记录的匹配结果
SELECT字段列表
FROM表1INNERJOIN表2
ON表1.公共字段<>表2.公共字段
返回两个表的交叉联接的结果与相等条件的内联的差集
2)外联接
(1)左外联接
SELECT字段列表
FROM左表LEFTJOIN右表
ON左表.公共字段=右表.公共字段
返回内联的结果加上左表的剩余记录
(2)右外联接
SELECT字段列表
FROM左表RIGHTJOIN右表
ON左表.公共字段=表2.公共字段
返回内联的结果加上右表的剩余记录
(3)完整外联接
SELECT字段列表
FROM表1FULLJOIN表2
ON表1.公共字段=表2.公共字段
返回内联的结果加上左表的剩余和右表的剩余
3)交叉联接
SELECT字段列表
FROM表1CROSSJOIN表2
返回结果集的数目为表1的记录数*表2的记录数,表1中的每一条记录分别和表2中的每条记录进行匹配
4)自联接
SELECT字段列表
FROM表1AS别名1INNERJOIN表1AS别名2
ON别名1.公共字段=别名2.公共字段
第五篇:SQL语句 SELECT LIKE like用法详解
SQL语句 SELECT LIKE like用法详解 在SQL结构化查询语言中,LIKE语句有着至关重
要的作用。LIKE语句的语法格式是:select * from 表名 where 字段名 like 对
应值(子串),它主要是针对字符型字段的,它的作用是在一个字符型字段列中检索包含对
应子串的。A:% 包含零个或多个字符的任意字符串:
1、LIKE'Mc%' 将搜索以字母 Mc 开
头的所有字符串(如 McBadden)。
2、LIKE'%inger' 将搜索以字母 inger 结尾的所有字符
串(如 Ringer、Stringer)。
3、LIKE'%en%' 将搜索在任何位置包含字母 en 的所有字符串
(如 Bennet、Green、McBadden)。B:_(下划线)任何单个字符:LIKE'_heryl' 将搜索以
字母 heryl 结尾的所有六个字母的名称(如 Cheryl、Sheryl)。C:[ ] 指定范围([a-f])或
集合([abcdef])中的任何单个字符: 1,LIKE'[CK]ars[eo]n' 将搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。
2、LIKE'[M-Z]inger' 将搜索以字符串 inger 结
尾、以从 M 到 Z 的任何单个字母开头的所有名称(如 Ringer)。D:[^] 不属于指定范
围([a-f])或集合([abcdef])的任何单个字符:LIKE'M[^c]%' 将搜索以字母 M 开头,并且
第二个字母不是 c 的所有名称(如MacFeather)。E:* 它同于DOS命令中的通配符,代
表多个字符:c*c代表cc,cBc,cbc,cabdfec等多个字符。F:?同于DOS命令中的?通配符,代表单个字符 :b?b代表brb,bFb等 G:# 大致同上,不同的是代只能代表单个数字。k#k
代表k1k,k8k,k0k。F:[!] 排除 它只代表单个字符下面我们来举例说明一下:例
1,查询name字段中包含有“明”字的。select * from table1 where name like '%明%'例2,查询name字段中以“李”字开头。select * from table1 where name like '李*'例3,查询name字段中含有数字的。select * from table1 where name like '%[0-9]%'例4,查询name字段中含有小写字母的。select * from table1 where name like '%[a-z]%'例5,查询name字段中不含有数字的。select * from table1 where name like '%[!0-9]%'以上例子能列出什么值来显而易见。但在这里,我们着重要说明的是通配符“*”与“%”的区别。很多朋友会问,为什么我在以上查询时有个别的表示所有字符的时候用
“%”而不用“*”?先看看下面的例子能分别出现什么结果:select * from table1 where
name like '*明*'select * from table1 where name like '%明%'大家会看到,前
一条语句列出来的是所有的记录,而后一条记录列出来的是name字段中含有“明”的记录,所以说,当我们作字符型字段包含一个子串的查询时最好采用“%”而不用“*”,用“*”的时候只在开头或者只在结尾时,而不能两端全由“*”代替任意字符的情况下。