共计 36564 个字符,预计需要花费 92 分钟才能阅读完成。
这篇文章主要讲解了“常用的 SQL 查询语句大全”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“常用的 SQL 查询语句大全”吧!
一、基础
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份 sql server
— 创建 备份数据的 device
USE master
EXEC sp_addumpdevice disk , testBack , c:\mssql7backup\MyNwind_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..
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
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 T where rid not in(select top’+str(@str-1)+’Rid from T where Rid -1)’
exec sp_executesql @sql
注意:在 top 后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid 为一个标识列,如果 top 后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top 的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引)
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) [下一步] 设置快照文件夹
采用默认 \\servername\Pub
(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 查询语句关键字方法
distinct 关键字
显示没有重复记录的商品名称,商品价格和商品类别列表。
select distinct ware_name,price from t_ware;
使用计算列
查询所有商品价格提高 20% 后的价格。
select ware_id,ware_name,price*1.2 from t_ware;
列的别名
a) 不使用 as
select ware_id,ware_name,price*1.2 as price_raise from t_ware;
b) 使用 as
select ware_id,ware_name,price*1.2 price_raise from t_ware;
使用逻辑表达式
a) not
显示商品价格不大于 100 的商品
select ware_id,ware_name,price,category_id from t_ware where not price
b) and
显示商品价格大于 100 且商品类别编号为 5 的商品
select ware_id,ware_name,price,category_id from t_ware where not price
c) or
显示商品类别编号为 5 或 6 或 7 的商品
select ware_id,ware_name,price,category_id from t_ware where category_id=5 or category_id=6 or category_id=7;
使用 between 关键字
显示商品价格在 200 元至 1000 元之间的商品(留心一下,是半开区间还是封闭区间?)
select ware_id,ware_name,price,category_id from t_ware where price between 200 and 1000;
使用 in 关键字
显示商品类别为 5,6,7 且价格不小于 200 元的商品
select ware_id,ware_name,price,category_id from t_ware where category_id in (5,6,7) and price =200;
使用 like 子句进行模糊查询
a) %(百分号)表示 0 到 n 个任意字符
select ware_id,ware_name,price,category_id from t_ware where ware_name like % 纯棉 %
b) _(下划线)表示单个的任意字符
select ware_id,ware_name,price,category_id from t_ware where ware_name like % 长袖_恤 %
转义字符 escape 的使用
select ware_id,ware_name,price,category_id from t_ware where ware_name like %\%% escape \
使用 order by 给数据排序
select * from t_ware_category where parent_id=0 order by seq;
select * from t_ware_category where parent_id=0 order by seq asc;
select * from t_ware_category where parent_id=0 order by seq desc;
rownum
a) 查询前 20 条商品记录
select ware_id,ware_name,price from t_ware where rownum
b) 查询第 11 条至第 20 条记录
select ware_id,ware_name,price from t_ware where rownum =10 and ware_id not in (select ware_id from t_ware where rownum =10);
常用统计函数
a) sum() 返回一个数字列或计算列的总和
select sum(price) from t_ware;
b) avg()对一个数字列或计算列求平均值
c) min()返回一个数字列或一个数字表达式的最小值
d) max()返回一个数字列或一个数字表达式的最大值
e) count()返回满面足 select 语句中指定的条件的记录值
多表查询和笛卡儿乘积
查询商品编号,商品名称,商品价格和商品类别名称
select t_ware.ware_id,t_ware.ware_name,t_ware.price,t_ware_category.category_name from t_ware,t_ware_category where t_ware.category_id=t_ware_category.category_id;
使用 join
a) 左连接
select t_ware.ware_id,t_ware.ware_name,t_ware.price,t_ware_category.category_name from t_ware left join t_ware_category on t_ware.category_id=t_ware_category.category_id;
select w.ware_id,w.ware_name,w.price,wc.category_name from t_ware w left join t_ware_category wc on w.category_id=wc.category_id;
b) 右连接
select t_ware.ware_id,t_ware.ware_name,t_ware.price,t_ware_category.category_name from t_ware left join t_ware_category on t_ware.category_id=t_ware_category.category_id;
使用 union
select ware_id,ware_name from t_ware where ware_name like %T 恤 % union select ware_id,ware_name from t_ware where ware_name like % 手提包 %
使用 group by
a) 统计每个二级类别下有多少商品,以及商品总价值
select w.category_id,wc.category_name,count(w.ware_id),sum(w.price) from t_ware w left join t_ware_category wc on w.category_id=wc.category_id group by w.category_id,wc.category_name;
b) 统计每个一级类别下有多少商品,以及商品总价值
select wc2.category_id,wc2.category_name,sum(w.price) from t_ware w left join t_ware_category wc on w.category_id=wc.category_id left join t_ware_category wc2 on wc.parent_id=wc2.category_id group by wc2.category_id,wc2.category_name;
使用 having 对结果进行筛选
select w.category_id,wc.category_name,count(w.ware_id),sum(w.price) from t_ware w left join t_ware_category wc on w.category_id=wc.category_id group by w.category_id,wc.category_name having sum(w.price) 1000;
SQL 查询语句精华使用简要
一、简单查询
简单的 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)
三、连接查询
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型
数据库管理系统的一个标志。
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行
查询。
连接可以在 SELECT 语句的 FROM 子句或 WHERE 子句中建立,似是而非在 FROM 子句中指出连接时有助于
将连接操作与 WHERE 子句中的搜索条件区分开来。所以,在 Transact-SQL 中推荐使用这种方法。
SQL-92 标准所定义的 FROM 子句的连接语法格式为:
FROM join_table join_type join_table
[ON (join_condition)]
其中 join_table 指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一
个表操作的连接又称做自连接。
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接 (INNER JOIN) 使用比
较运算符进行表间某 (些) 列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。
外连接分为左外连接 (LEFT OUTER JOIN 或 LEFT JOIN)、右外连接(RIGHT OUTER JOIN 或 RIGHT JOIN)
和全外连接 (FULL OUTER JOIN 或 FULL JOIN) 三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表 (左外连接时)、右表(右外连接时) 或两个表 (全外连接时) 中所有符合搜索条件的
数据行。
交叉连接 (CROSS JOIN) 没有 WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
连接操作中的 ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑
运算符等构成。
无论哪种连接都不能对 text、ntext 和 image 数据类型列进行直接连接,但可以对这三种列进行间接
连接。例如:
SELECT p1.pub_id,p2.pub_id,p1.pr_info
FROM pub_info AS p1 INNER JOIN pub_info AS p2
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)
(一)内连接
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分
三种:
1、等值连接:在连接条件中使用等于号 (=) 运算符比较被连接列的列值,其查询结果中列出被连接
表中的所有列,包括其中的重复列。
2、不等连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些
运算符包括、=、=、、!、! 和。
3、自然连接:在连接条件中使用等于 (=) 运算符比较被连接列的列值,但它使用选择列表指出查询
结果集合中所包括的列,并删除连接表中的重复列。
例,下面使用等值连接列出 authors 和 publishers 表中位于同一城市的作者和出版社:
SELECT *
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
又如使用自然连接,在选择列表中删除 authors 和 publishers 表中重复列 (city 和 state):
SELECT a.*,p.pub_id,p.pub_name,p.country
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
(二) 外连接
内连接时,返回查询结果集合中的仅是符合查询条件 (WHERE 搜索条件或 HAVING 条件) 和连接条件
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表 (左外
连接时)、右表 (右外连接时) 或两个边接表 (全外连接) 中的所有数据行。
如下面使用左外连接将论坛内容和作者信息连接起来:
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
ON a.username=b.username
下面使用全外连接将 city 表中的所有作者以及 user 表中的所有作者,以及他们所在的城市:
SELECT a.*,b.*
FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username
(三)交叉连接
交叉连接不带 WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
例,titles 表中有 6 类图书,而 publishers 表中有 8 家出版社,则下列交叉连接检索到的记录数将等
于 6 *8=48 行。
SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY type
SQL 查询语句精华大全
一、简单查询
简单的 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 别名
表名 别名
例如上面语句可用表的别名格式表示为:
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)
三、连接查询
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型
数据库管理系统的一个标志。
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行
查询。
连接可以在 SELECT 语句的 FROM 子句或 WHERE 子句中建立,似是而非在 FROM 子句中指出连接时有助于
将连接操作与 WHERE 子句中的搜索条件区分开来。所以,在 Transact-SQL 中推荐使用这种方法。
SQL-92 标准所定义的 FROM 子句的连接语法格式为:
FROM join_table join_type join_table
[ON (join_condition)]
其中 join_table 指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一
个表操作的连接又称做自连接。
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接 (INNER JOIN) 使用比
较运算符进行表间某 (些) 列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。
外连接分为左外连接 (LEFT OUTER JOIN 或 LEFT JOIN)、右外连接(RIGHT OUTER JOIN 或 RIGHT JOIN)
和全外连接 (FULL OUTER JOIN 或 FULL JOIN) 三种。与内连接不同的是,外连接不只列出与连接条件相匹
配的行,而是列出左表 (左外连接时)、右表(右外连接时) 或两个表 (全外连接时) 中所有符合搜索条件的
数据行。
交叉连接 (CROSS JOIN) 没有 WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
连接操作中的 ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑
运算符等构成。
无论哪种连接都不能对 text、ntext 和 image 数据类型列进行直接连接,但可以对这三种列进行间接
连接。例如:
SELECT p1.pub_id,p2.pub_id,p1.pr_info
FROM pub_info AS p1 INNER JOIN pub_info AS p2
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)
(一)内连接
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分
三种:
1、等值连接:在连接条件中使用等于号 (=) 运算符比较被连接列的列值,其查询结果中列出被连接
表中的所有列,包括其中的重复列。
2、不等连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些
运算符包括、=、=、、!、! 和。
3、自然连接:在连接条件中使用等于 (=) 运算符比较被连接列的列值,但它使用选择列表指出查询
结果集合中所包括的列,并删除连接表中的重复列。
例,下面使用等值连接列出 authors 和 publishers 表中位于同一城市的作者和出版社:
SELECT *
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
又如使用自然连接,在选择列表中删除 authors 和 publishers 表中重复列 (city 和 state):
SELECT a.*,p.pub_id,p.pub_name,p.country
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
(二) 外连接
内连接时,返回查询结果集合中的仅是符合查询条件 (WHERE 搜索条件或 HAVING 条件) 和连接条件
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表 (左外
连接时)、右表 (右外连接时) 或两个边接表 (全外连接) 中的所有数据行。
如下面使用左外连接将论坛内容和作者信息连接起来:
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
ON a.username=b.username
下面使用全外连接将 city 表中的所有作者以及 user 表中的所有作者,以及他们所在的城市:
SELECT a.*,b.*
FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username
(三)交叉连接
交叉连接不带 WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
例,titles 表中有 6 类图书,而 publishers 表中有 8 家出版社,则下列交叉连接检索到的记录数将等
于 6 *8=48 行。
SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY typeSQL 核心语句 (非常实用的几个技巧) 插入数据
向表中添加一个新记录,你要使用 SQL INSERT 语句。这里有一个如何使用这种语句的例子:
INSERT mytable (mycolumn) VALUES (‘some data’)
这个语句把字符串’some data’插入表 mytable 的 mycolumn 字段中。将要被插入数据的字段的名字在第一个括号中指定,实际的数据在第二个括号中给出。
INSERT 语句的完整句法如下:
INSERT [INTO] {table_name|view_name} [(column_list)] {DEFAULT VALUES |
Values_list | select_statement}
如果一个表有多个字段,通过把字段名和字段值用逗号隔开,你可以向所有的字段中插入数据。假设表 mytable 有三个字段 first_column,second_column, 和 third_column。下面的 INSERT 语句添加了一条三个字段都有值的完整记录:
INSERT mytable (first_column,second_column,third_column)
VALUES (‘some data’,’some more data’,’yet more data’)
注意
你可以使用 INSERT 语句向文本型字段中插入数据。但是,如果你需要输入很长的字符串,你应该使用 WRITETEXT 语句。这部分内容对本书来说太高级了,因此不加讨论。要了解更多的信息,请参考 Microsoft SQL Sever 的文档。
如果你在 INSERT 语句中只指定两个字段和数据会怎么样呢?换句话说,你向一个表中插入一条新记录,但有一个字段没有提供数据。在这种情况下,有下面的四种可能:
如果该字段有一个缺省值,该值会被使用。例如,假设你插入新记录时没有给字段 third_column 提供数据,而这个字段有一个缺省值’some value’。在这种情况下,当新记录建立时会插入值’some value’。
如果该字段可以接受空值,而且没有缺省值,则会被插入空值。
如果该字段不能接受空值,而且没有缺省值,就会出现错误。你会收到错误信息:
The column in table mytable may not be null.
最后,如果该字段是一个标识字段,那么它会自动产生一个新值。当你向一个有标识字段的表中插入新记录时,只要忽略该字段,标识字段会给自己赋一个新值。
注意
向一个有标识字段的表中插入新记录后,你可以用 SQL 变量 @@identity 来访问新记录
的标识字段的值。考虑如下的 SQL 语句:
INSERT mytable (first_column) VALUES(‘some value’)
INSERT anothertable(another_first,another_second)
VALUES(@@identity,’some value’)
如果表 mytable 有一个标识字段,该字段的值会被插入表 anothertable 的 another_first 字段。这是因为变量 @@identity 总是保存最后一次插入标识字段的值。
字段 another_first 应该与字段 first_column 有相同的数据类型。但是,字段 another_first 不能是应该标识字段。Another_first 字段用来保存字段 first_column 的值。
删除记录
要从表中删除一个或多个记录,需要使用 SQL DELETE 语句。你可以给 DELETE 语句提供 WHERE 子句。WHERE 子句用来选择要删除的记录。例如,下面的这个 DELETE 语句只删除字段 first_column 的值等于’Delete Me’的记录:
DELETE mytable WHERE first_column=’Deltet Me’
DELETE 语句的完整句法如下:
DELETE [FROM] {table_name|view_name} [WHERE clause]
在 SQL SELECT 语句中可以使用的任何条件都可以在 DELECT 语句的 WHERE 子句中使用。例如,下面的这个 DELETE 语句只删除那些 first_column 字段的值为’goodbye’或 second_column 字段的值为’so long’的记录:
DELETE mytable WHERE first_column=’goodby’OR second_column=’so long’
如果你不给 DELETE 语句提供 WHERE 子句,表中的所有记录都将被删除。你不应该有这种想法。如果你想删除应该表中的所有记录,应使用第十章所讲的 TRUNCATE TABLE 语句。
注意
为什么要用 TRUNCATE TABLE 语句代替 DELETE 语句?当你使用 TRUNCATE TABLE 语句时,记录的删除是不作记录的。也就是说,这意味着 TRUNCATE TABLE 要比 DELETE 快得多。
更新记录
要修改表中已经存在的一条或多条记录,应使用 SQL UPDATE 语句。同 DELETE 语句一样,UPDATE 语句可以使用 WHERE 子句来选择更新特定的记录。请看这个例子:
UPDATE mytable SET first_column=’Updated!’WHERE second_column=’Update Me!’
这个 UPDATE 语句更新所有 second_column 字段的值为’Update Me!’的记录。对所有被选中的记录,字段 first_column 的值被置为’Updated!’。
下面是 UPDATE 语句的完整句法:
UPDATE {table_name|view_name} SET [{table_name|view_name}]
{column_list|variable_list|variable_and_column_list}
[,{column_list2|variable_list2|variable_and_column_list2}…
[,{column_listN|variable_listN|variable_and_column_listN}]][WHERE clause]
注意
你可以对文本型字段使用 UPDATE 语句。但是,如果你需要更新很长的字符串,应使用 UPDATETEXT 语句。这部分内容对本书来说太高级了,因此不加讨论。要了解更多的信息,请参考 Microsoft SQL Sever 的文档。
如果你不提供 WHERE 子句,表中的所有记录都将被更新。有时这是有用的。例如,如果你想把表 titles 中的所有书的价格加倍,你可以使用如下的 UPDATE 语句:
你也可以同时更新多个字段。例如,下面的 UPDATE 语句同时更新 first_column,second_column, 和 third_column 这三个字段:
UPDATE mytable SET first_column=’Updated!’
Second_column=’Updated!’
Third_column=’Updated!’
WHERE first_column=’Update Me1’
技巧
SQL 忽略语句中多余的空格。你可以把 SQL 语句写成任何你最容易读的格式。
用 SELECT 创建记录和表
你也许已经注意到,INSERT 语句与 DELETE 语句和 UPDATE 语句有一点不同,它一次只操作一个记录。然而,有一个方法可以使 INSERT 语句一次添加多个记录。要作到这一点,你需要把 INSERT 语句与 SELECT 语句结合起来,象这样:
INSERT mytable (first_column,second_column)
SELECT another_first,another_second
FROM anothertable
WHERE another_first=’Copy Me!’
这个语句从 anothertable 拷贝记录到 mytable. 只有表 anothertable 中字段 another_first 的值为’Copy Me!’的记录才被拷贝。
当为一个表中的记录建立备份时,这种形式的 INSERT 语句是非常有用的。在删除一个表中的记录之前,你可以先用这种方法把它们拷贝到另一个表中。
如果你需要拷贝整个表,你可以使用 SELECT INTO 语句。例如,下面的语句创建了一个名为 newtable 的新表,该表包含表 mytable 的所有数据:
SELECT * INTO newtable FROM mytable
你也可以指定只有特定的字段被用来创建这个新表。要做到这一点,只需在字段列表中指定你想要拷贝的字段。另外,你可以使用 WHERE 子句来限制拷贝到新表中的记录。下面的例子只拷贝字段 second_columnd 的值等于’Copy Me!’的记录的 first_column 字段。
SELECT first_column INTO newtable
FROM mytable
WHERE second_column=’Copy Me!’
使用 SQL 修改已经建立的表是很困难的。例如,如果你向一个表中添加了一个字段,没有容易的办法来去除它。另外,如果你不小心把一个字段的数据类型给错了,你将没有办法改变它。但是,使用本节中讲述的 SQL 语句,你可以绕过这两个问题。
例如,假设你想从一个表中删除一个字段。使用 SELECT INTO 语句,你可以创建该表的一个拷贝,但不包含要删除的字段。这使你既删除了该字段,又保留了不想删除的数据。
如果你想改变一个字段的数据类型,你可以创建一个包含正确数据类型字段的新表。创建好该表后,你就可以结合使用 UPDATE 语句和 SELECT 语句,把原来表中的所有数据拷贝到新表中。通过这种方法,你既可以修改表的结构,又能保存原有的数据。
jsp 连接数据库:
%@ page language= java import= java.util.*, java.sql.* pageEncoding= GB18030 %
%
String username = request.getParameter(username
String password = request.getParameter(password
String password2 = request.getParameter(password2
Class.forName(com.mysql.jdbc.Driver
Connection conn = DriverManager.getConnection(jdbc:mysql://localhost/bishe , root , admin
String sqlQuery = select count(*) from user where username = ?
PreparedStatement psQuery = conn.prepareStatement(sqlQuery);
psQuery.setString(1, username);
ResultSet rs = psQuery.executeQuery();
rs.next();
int count = rs.getInt(1);
if(count 0) {
response.sendRedirect(registerFail.jsp
psQuery.close();
conn.close();
return;
}
String sql = insert into user values (null, ?, ?)
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
ps.executeUpdate();
ps.close();
conn.close();
response.sendRedirect(registerSuccess.jsp
%
javaBean 数据库连接:
Class.forName(com.mysql.jdbc.Driver
Connection conn = DriverManager.getConnection(jdbc:mysql://localhost/spring , root , bjsxt
String sql = insert into user values (null, ?, ?)
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, u.getUsername());
ps.setString(2, u.getPassword());
ps.executeUpdate();
ps.close();
conn.close();
hibernate 数据操作
Configuration cfg = new Configuration().configure();
factory = cfg.buildSessionFactory().openSession();
Session session = HibernateUtil.getSession();
// 开启事务
session.beginTransaction();
// 保存数据
session.save(p);
// 事务提交
session.getTransaction().commit();
// 关闭 session
HibernateUtil.closeSession(session);
select(选择) 字段 from (表名) where(筛选条件)
group by(字段名,按什么分组) having (条件, 在每组中筛选)
order by (排序)
—————- 局部变量 ————–
声明:
declare @name varchar(30)– 声明一个存放学生名称的变量,最多存放 30 个字符
declare @age int
————— 全局变量 —————–
输出:
print 服务器的名称:+@@servername
select @@servername as 是服务器的名称
print 当前错误号:+@@error(错误的: 将 varchar 值 当前错误号:转换为数据类型为 int 的列时发生语法错误。)
print 当前错误号: +convert(varchar(5),@@error)(正确)
—————if-else 语句 —————-
declare @myavg float
select @myavg=AVG(writtenExam) from stuMarks
print 本班平均分 +convert(varchar(5),@myavg)
if(@myavg 70) —(begin-end 相当于 java 中的{})
begin
print 本班笔试成绩优秀,前三名的成绩为:
select top 3 * from stuMarks order by writtenExam desc
end
else
begin
print 本班笔试成绩较差, 后三名的成绩为:
select top 3 * from stuMarks order by writtenExam [asc]
end
—————-while 循环语句 ————-
declare @n int
while(1=1)– 条件永远成立
begin
select @n=count(*) from stuMarks where writtenExam 60 – 统计不及格的人数
if(@n 0)
update stuMarks set writtenExam=writtenExam+2 – 每人加 2 分
else
break – 退出循环
end
print 加分后的成绩如下:
select * from stuMarks
—————–case 多分支语句 ————-
select * from stuMarks – 原始数据
print ABCDE 五级显示成绩如下:
select stuNo, 成绩 =case
when writtenExam 60 then E
when writtenExam between 60 and 69 then D
when writtenExam between 70 and 79 then C
when writtenExam between 80 and 89 then B
else A
end
from stuMarks
—————–go 批处理语句 ——————
use Master
go
create table stuInfo
(
id int not null,
name varchar(20)
)
go
—————–in 和 not in 子查询 ——————–
in 查询:
select stuName from stuInfo
where stuNo in (select stuNo from stuMarks where writtenExam=60)
not in 查询:
select stuName from stuInfo
where stuNo not in (select stuNo from stuMarks)
go
——————exists 和 not exists 子查询 ————
exists 子查询:
1、if exists(select * from sysdatabases where name= stuDB)
drop database stuDB
go
2、if exists(select * from stuMarks where writtenExam 80)
begin
print 本班有人笔试成绩高于 80 分,每人只加 2 分,加分后的成绩如下:
update stuMarks set writtenExam=writtenExam+2
select * from stuMarks
end
else
begin
print 本班无人笔试成绩高于 80 分,每人可以加 5 分,加分后的成绩如下:
update stuMarks set writtenExam=writtenExam+5
select * from stuMarks
end
go
not exists 子查询:
if not exists(select * from stuMarks where writtenExam 60 and labExam 60)
begin
print 本班无人通过考试,试题偏难,每人加 3 分,加分后的成绩如下:
update stuMarks set writtenExam=writtenExam+3,labExam=labExam+3
select * from stuMarks
end
else
begin
print 本班考试成绩一般,每人只加 1 分,加分后的成绩如下:
update stuMarks set writtenExam=writtenExam+1,labExam=labExam+1
select * from stuMarks
end
感谢各位的阅读,以上就是“常用的 SQL 查询语句大全”的内容了,经过本文的学习后,相信大家对常用的 SQL 查询语句大全这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!