61阅读

sql查询语句大全-SQL查询语句大全T-SQL

发布时间:2017-11-09 所属栏目:使用方法

一 : SQL查询语句大全T-SQL

SQL查询语句大全T-SQL

--语句功能

1、数据操作

Select--从数据库表中检索数据行和列

Insert--向数据库表添加新数据行

Delete--从数据库表中删除数据行

Update--更新数据库表中的数据

2、数据定义

CreateTABLE--创建1个数据库表

DropTABLE--从数据库中删除表

AlterTABLE--修改数据库表结构

CreateVIEW--创建1个视图

DropVIEW--从数据库中删除视图

CreateINDEX--为数据库表创建1个索引

DropINDEX--从数据库中删除索引

CreatePROCEDURE --创建1个存储过程

DropPROCEDURE--从数据库中删除存储过程

CreateTRIGGER--创建1个触发器

DropTRIGGER--从数据库中删除触发器

CreateSCHEMA--向数据库添加1个新模式

DropSCHEMA--从数据库中删除1个模式

CreateDOMAIN--创建1个数据值域

AlterDOMAIN--改变域定义

DropDOMAIN--从数据库中删除1个域

3、数据控制

GRANT--授予用户访问权限

DENY--拒绝用户访问

REVOKE--解除用户访问权限

4、事务控制

CO美眉IT--结束当前事务

ROLLBACK--中止当前事务

SETTRANSACTION--定义当前事务数据访问特征

5、程序化SQL

DECLARE--为查询设定游标

EXPLAN--为查询描述数据访问计划

OPEN--检索查询结果打开1个游标

FETCH--检索一行查询结果

CLOSE--关闭游标

PREPARE--为动态执行准备SQL 语句

EXECUTE--动态地执行SQL 语句

DESCRIBE--描述准备好的查询

6、局部变量

declare @id char(10)

--set @id = '10010001'

select @id = '10010001'

7、全局变量

---必须以@@开头

8、IF 语句

declare @x int @y int @zint

select @x = 1 @y = 2@z=3

if @x >@y

print 'x > y'--打印字符串'x > y'

else if @y >@z

print 'y >z'

else print 'z >y'

9、CASE 语句

use pangu

update employee

set e_wage =

case

when job_level = ’1’ thene_wage*1.08

when job_level = ’2’ thene_wage*1.07

when job_level = ’3’ thene_wage*1.06

else e_wage*1.05

end

10、WHILE CONTINUE BREAK语句

declare @x int @y int @cint

select @x = 1 @y=1

while @x <3

begin

print @x --打印变量x 的值

while @y <3

begin

select @c =100*@x+ @y

print @c --打印变量c 的值

select @y = @y + 1

end

select @x = @x + 1

select @y = 1

end

11、WAITFOR语句

--例 等待1 小时2 分零3 秒后才执行Select语句

waitfor delay’01:02:03’

select * from employee

--例 等到晚上11 点零8 分后才执行Select语句

waitfor time ’23:08:00’

select * from employee


12、Select语句

select *(列名)from table_name(表名) where column_name operator value

ex:(宿主)

select * from stock_informationwhere stockid =str(nid)

stockname = 'str_name'

stockname like '% find this %'

stockname like '[a-zA-Z]%' --------- ([]指定值的范围)

stockname like '[^F-M]%'--------- (^排除指定范围)

--------- 只能在使用like关键字的where子句中使用通配符)

or stockpath = 'stock_path'

or stocknumber < 1000

and stockindex = 24

not stocksex = 'man'

stocknumber between 20 and 100

stocknumber in(10,20,30)

order by stockid desc(asc) --------- 排序,desc-降序,asc-升序

order by 1,2 --------- by列号

stockname = (select stockname from stock_information where stockid= 4)

--------- 子查询

--------- 除非能确保内层select只返回1个行的值,

--------- 否则应在外层where子句中用1个in限定符

select distinct column_name formtable_name --------- distinct指定检索独有的列值,不重复

select stocknumber ,"stocknumber +10" = stocknumber + 10 from table_name

select stockname , "stocknumber" =count(*) from table_name group by stockname

--------- group by 将表按行分组,指定列中有相同的值

having count(*) = 2 --------- having选定指定的组

select *

from table1,table2

where table1.id *= table2.id-------- 左外部连接,table1中有的而table2中没有得以null表示

table1.id =* table2.id -------- 右外部连接

select stockname fromtable1

union [all] -----union合并查询结果集,all-保留重复行

select stockname fromtable2

13、insert 语句

insert into table_name(Stock_name,Stock_number) value ("xxx","xxxx")

value (select Stockname , Stocknumber fromStock_table2)---value为select语句

14、update语句

update table_name set Stockname ="xxx" [where Stockid = 3]

Stockname = default

Stockname = null

Stocknumber = Stockname + 4

15、delete语句

delete from table_name whereStockid = 3

truncate table_name -----------删除表中所有行,仍保持表的完整性

drop table table_name--------------- 完全删除表

16、alter table*** ---修改数据库表结构

alter tabledatabase.owner.table_name add column_name char(2) null.....

sp_help table_name ----显示表已有特征

create table table_name (namechar(20), age smallint, lname varchar(30))

insert into table_name select......... ----- 实现删除列的方法(创建新表)

alter table table_name dropconstraint Stockname_default ---- 删除Stockname的default约束

17、常用函数

----统计函数----

AVG--求平均值

COUNT--统计数目

MAX--求最大值

MIN--求最小值

SUM--求和

--AVG

use pangu

select avg(e_wage) asdept_avgWage

from employee

group by dept_id

--MAX

--求工资最高的员工姓名

use pangu

select e_name

from employee

where e_wage =

(select max(e_wage)

from employee)

--STDEV()

--STDEV()函数返回表达式中所有数据的标准差

--STDEVP()

--STDEVP()函数返回总体标准差

--VAR()

--VAR()函数返回表达式中所有值的统计变异数

--VARP()

--VARP()函数返回总体变异数

----算术函数----

SIN(float_expression)--返回以弧度表示的角的正弦

COS(float_expression)--返回以弧度表示的角的余弦

TAN(float_expression)--返回以弧度表示的角的正切

COT(float_expression)--返回以弧度表示的角的余切

ASIN(float_expression)--返回正弦是FLOAT 值的以弧度表示的角

ACOS(float_expression)--返回余弦是FLOAT 值的以弧度表示的角

ATAN(float_expression)--返回正切是FLOAT 值的以弧度表示的角

ATAN2(float_expression1,float_expression2)

--返回正切是float_expression1 /float_expres-sion2的以弧度表示的角

DEGREES(numeric_expression)

--把弧度转换为角度返回与表达式相同的数据类型可为

--INTEGER/MONEY/REAL/FLOAT 类型

RADIANS(numeric_expression)--把角度转换为弧度返回与表达式相同的数据类型可为

--INTEGER/MONEY/REAL/FLOAT 类型

EXP(float_expression)--返回表达式的指数值

LOG(float_expression)--返回表达式的自然对数值

LOG10(float_expression)--返回表达式的以10为底的对数值

SQRT(float_expression)--返回表达式的平方根

CEILING(numeric_expression)--返回>=表达式的最小整数返回的数据类型与表达式相同可为

--INTEGER/MONEY/REAL/FLOAT 类型

FLOOR(numeric_expression)--返回<=表达式的最小整数返回的数据类型与表达式相同可为

--INTEGER/MONEY/REAL/FLOAT 类型

ROUND(numeric_expression)--返回以integer_expression 为精度的四舍五入值返回的数据

--类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型

ABS(numeric_expression)--返回表达式的绝对值返回的数据类型与表达式相同可为

--INTEGER/MONEY/REAL/FLOAT 类型

SIGN(numeric_expression)--测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型

--与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型

PI()--返回值为π 即3.1415926535897936

RAND([integer_expression])--用任选的[integer_expression]做种子值得出0-1 间的随机浮点数

18、字符串函数

ASCII()--函数返回字符表达式最左端字符的ASCII 码值

CHAR()--函数用于将ASCII 码转换为字符

--如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回1个NULL 值

LOWER()--函数把字符串全部转换为小写

UPPER()--函数把字符串全部转换为大写

STR()--函数把数值型数据转换为字符型数据

LTRIM()--函数把字符串头部的空格去掉

RTRIM()--函数把字符串尾部的空格去掉

LEFT(),RIGHT(),SUBSTRING()--函数返回部分字符串

CHARINDEX(),PATINDEX()--函数返回字符串中某个指定的子串出现的开始位置

SOUNDEX() --函数返回1个四位字符码

--SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0值

DIFFERENCE()--函数返回由SOUNDEX 函数返回的2个字符表达式的值的差异

--0 2个SOUNDEX 函数返回值的第1个字符不同

--1 2个SOUNDEX 函数返回值的第1个字符相同

--2 2个SOUNDEX 函数返回值的第一二个字符相同

--3 2个SOUNDEX 函数返回值的第一二3个字符相同

--4 2个SOUNDEX 函数返回值完全相同

QUOTENAME()--函数返回被特定字符括起来的字符串

REPLICATE()--函数返回1个重复character_expression 指定次数的字符串

REVERSE()--函数将指定的字符串的字符排列顺序颠倒

REPLACE()--函数返回被替换了指定子串的字符串

SPACE()--函数返回1个有指定长度的空白字符串

STUFF()--函数用另一子串替换字符串指定位置长度的子串

19、数据类型转换函数----

CAST() 函数语法如下

CAST() ( AS [ length ])

CONVERT() 函数语法如下

CONVERT() ([ length ], [,style])

select cast(100+99 as char)convert(varchar(12), getdate())

运行结果如下

------------------------------------------

199 Jan 152000

20、日期函数----

DAY()--函数返回date_expression 中的日期值

MONTH()--函数返回date_expression 中的月份值

YEAR()--函数返回date_expression 中的年份值

DATEADD( , ,)

--函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期

DATEDIFF( , ,)

--函数返回2个指定日期在datepart 方面的不同之处

DATENAME( , )--函数以字符串的形式返回日期的指定部分

DATEPART( , )--函数以整数值的形式返回日期的指定部分

GETDATE() --函数以DATETIME的缺省格式返回系统当前的日期和时间

21、系统函数----

APP_NAME()--函数返回当前执行的应用程序的名称

COALESCE() --函数返回众多表达式中第1个非NULL表达式的值

COL_LENGTH(<'table_name'>,<'column_name'>)--函数返回表中指定字段的长度值

COL_NAME(,) --函数返回表中指定字段的名称即列名

DATALENGTH()--函数返回数据表达式的数据的实际长度

DB_ID(['database_name'])--函数返回数据库的编号

DB_NAME(database_id)--函数返回数据库的名称

HOST_ID()--函数返回服务器端计算机的名称

HOST_NAME()--函数返回服务器端计算机的名称

IDENTITY([, seed increment]) [AScolumn_name])

--IDENTITY() 函数只在Select INTO语句中使用用于插入1个identity column列到新表中

ISDATE()--函数判断所给定的表达式是否为合理日期

ISNULL(, ) --函数将表达式中的NULL值用指定值替换

ISNUMERIC()--函数判断所给定的表达式是否为合理的数值

NEWID()--函数返回1个UNIQUEIDENTIFIER 类型的数值

NULLIF(, )

--NULLIF 函数在expression1与expression2 相等时返回NULL 值若不相等时则返回expression1 的值


22、数学函数

  1.绝对值

  S:select abs(-1)value

  O:select abs(-1) value fromdual

  2.取整(大)

  S:select ceiling(-1.001)value

  O:select ceil(-1.001) value fromdual

  3.取整(小)

  S:select floor(-1.001)value

  O:select floor(-1.001) valuefrom dual

  4.取整(截取)

  S:select cast(-1.002 as int)value

  O:select trunc(-1.002) valuefrom dual

  5.四舍五入

  S:select round(1.23456,4) value1.23460

  O:select round(1.23456,4) valuefrom dual 1.2346

  6.e为底的幂

  S:select Exp(1) value2.7182818284590451

  O:select Exp(1) value from dual2.71828182

  7.取e为底的对数

  S:select log(2.7182818284590451)value 1

  O:select ln(2.7182818284590451)value from dual; 1

  8.取10为底对数

  S:select log10(10) value1

  O:select log(10,10) value fromdual; 1

  9.取平方

  S:select SQUARE(4) value16

  O:select power(4,2) value fromdual 16

  10.取平方根

  S:select SQRT(4) value2

  O:select SQRT(4) value from dual2

  11.求任意数为底的幂

  S:select power(3,4) value81

  O:select power(3,4) value fromdual 81

  12.取随机数

  S:select rand() value

  O:selectsys.dbms_random.value(0,1) value from dual;

  13.取符号

  S:select sign(-8) value-1

  O:select sign(-8) value fromdual -1

  ----------数学函数

  14.圆周率

  S:Select PI() value3.1415926535897931

  O:不知道

  15.sin,cos,tan参数都以弧度为单位

  例如:select sin(PI()/2) value得到1(SQLServer)

  16.Asin,Acos,Atan,Atan2返回弧度

  17.弧度角度互换(SQLServer,Oracle不知道)

  DEGREES:弧度-〉角度

  RADIANS:角度-〉弧度

  ---------数值间比较

  18. 求集合最大值

  S:select max(value) valuefrom

  (select 1 value

  union

  select -2 value

  union

  select 4 value

  union

  select 3 value)a

  O:select greatest(1,-2,4,3)value from dual

  19. 求集合最小值

  S:select min(value) valuefrom

  (select 1 value

  union

  select -2 value

  union

  select 4 value

  union

  select 3 value)a

  O:select least(1,-2,4,3) valuefrom dual

  20.如何处理null值(F2中的null以10代替)

  S:select F1,IsNull(F2,10) valuefrom Tbl

  O:select F1,nvl(F2,10) valuefrom Tbl

  --------数值间比较

  21.求字符序号

  S:select ascii('a')value

  O:select ascii('a') value fromdual

  22.从序号求字符

  S:select char(97)value

  O:select chr(97) value fromdual

  23.连接

  S:select '11'+'22'+'33'value

  O:select CONCAT('11','22')||33value from dual

  23.子串位置 --返回3

  S:select CHARINDEX('s','sdsq',2)value

  O:select INSTR('sdsq','s',2)value from dual

  23.模糊子串的位置--返回2,参数去掉中间%则返回7

  S:selectpatindex('%d%q%','sdsfasdqe') value

  O:oracle没发现,但是instr可以通过第四霾问刂瞥鱿执问?BR>  select INSTR('sdsfasdqe','sd',1,2) valuefrom dual 返回6

  24.求子串

  S:select substring('abcd',2,2)value

  O:select substr('abcd',2,2)value from dual

  25.子串代替 返回aijklmnef

  S:Select STUFF('abcdef', 2, 3,'ijklmn') value

  O:Select Replace('abcdef','bcd', 'ijklmn') value from dual

  26.子串全部替换

  S:没发现

  O:selectTranslate('fasdbfasegas','fa','我' ) value from dual

  27.长度

  S:len,datalength

  O:length

  28.大小写转换 lower,upper

  29.单词首字母大写

  S:没发现

  O:select INITCAP('abcd dsaf df')value from dual

  30.左补空格(LPAD的第1个参数为空格则同space函数)

  S:select space(10)+'abcd'value

  O:select LPAD('abcd',14) valuefrom dual

  31.右补空格(RPAD的第1个参数为空格则同space函数)

  S:select 'abcd'+space(10)value

  O:select RPAD('abcd',14) valuefrom dual

  32.删除空格

  S:ltrim,rtrim

  O:ltrim,rtrim,trim

  33. 重复字符串

  S:select REPLICATE('abcd',2)value

  O:没发现

  34.发音相似性比较(这2个单词返回值一样,发音相同)

  S:Select SOUNDEX ('Smith'),SOUNDEX ('Smythe')

  O:Select SOUNDEX ('Smith'),SOUNDEX ('Smythe') from dual

  SQLServer中用SelectDIFFERENCE('Smithers', 'Smythers') 比较soundex的差

  返回0-4,4为同音,1最高

23、日期函数

  35.系统时间

  S:select getdate()value

  O:select sysdate value fromdual

  36.前后几日

  直接与整数相加减

  37.求日期

  S:selectconvert(char(10),getdate(),20) value

  O:select trunc(sysdate) valuefrom dual

  se(www.61k.com)lectto_char(sysdate,'yyyy-mm-dd') value from dual

  38.求时间

  S:selectconvert(char(8),getdate(),108) value

  O:selectto_char(sysdate,'hh24:mm:ss') value from dual

  39.取日期时间的其他部分

  S:DATEPART 和 DATENAME 函数(第1个参数决定)

  O:to_char函数 第二个参数决定

  参数---------------------------------下表需要补充

  year yy, yyyy

  quarter qq, q (季度)

  month mm, m (m O无效)

  dayofyear dy, y(O表星期)

  day dd, d (d O无效)

  week wk, ww (wk O无效)

  weekday dw (O不清楚)

  Hour hh,hh12,hh24 (hh12,hh24S无效)

  minute mi, n (n O无效)

  second ss, s (s O无效)

  millisecond ms (O无效)

  ----------------------------------------------

  40.当月最后一天

  S:不知道

  O:select LAST_DAY(sysdate) valuefrom dual

  41.本星期的某一天(比如星期日)

  S:不知道

  O:Select Next_day(sysdate,7)vaule FROM DUAL;

  42.字符串转时间

  S:可以直接转或者selectcast('2004-09-08'as datetime) value

  O:Select To_date('2004-01-0522:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;

  43.求两日期某一部分的差(比如秒)

  S:selectdatediff(ss,getdate(),getdate()+12.3) value

  O:直接用2个日期相减(比如d1-d2=12.3)

  Select (d1-d2)*24*60*60 vauleFROM DUAL;

  44.根据差值求新的日期(比如分钟)

  S:select dateadd(mi,8,getdate())value

  O:Select sysdate+8/60/24 vauleFROM DUAL;

  45.求不同时区时间

  S:不知道

  O:SelectNew_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;

  -----时区参数,北京在东8区应该是Ydt-------

  AST ADT 大西洋标准时间

  BST BDT 白令海标准时间

  CST CDT 中部标准时间

  EST EDT 东部标准时间

  GMT 格林尼治标准时间

  HST HDT 阿拉斯加—夏威夷标准时间

  MST MDT 山区标准时间

  NST 纽芬兰标准时间

  PST PDT 太平洋标准时间

  YST YDT YUKON标准时间

二 : sql查询语言:sql查询语言-SQL简介,sql查询语言-SQL查询语句大全

SQL(STructured Query Language)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

SQL(STructured Query Language)是1种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
SQL同时也是数据库脚本文件的扩展名。
SQL是高级的非过程化编程语言,允许用户在高层数据结构上工作。他不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统可以使用相同的SQL语言作为数据输入与管理的接口。它以记录集合作为操作对象,所有SQL语句接受集合作为输入,返回集合作为输出,这种集合特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语句可以嵌套,这使他具有极大的灵活性和强大的功能,在多数情况下,在其他语言中需要1大段程序实现的功能只需要1个SQL语句即可达到目的,这也意味着用SQL语言可以写出非常复杂的语句。

[www.61k.com]sql查询语句大全_sql查询语言 -SQL简单介绍

SQL是英文Structured Query Language的缩写,意思为结构化查询语言。SQL语言的主要功能就是同各种数据库建立联系,进行沟通。按照ANSI(美国国家标准协会)的规定,SQL被作为关系型数据库管理系统的标准语言。SQL语句可以用来执行各种各样的操作,例如更新数据库中的数据,从数据库中提取数据等。目前,绝大多数流行的关系型数据库管理系统,如Oracle,Sybase,Microsoft SQL Server,Access等都采用了SQL语言标准。虽然很多数据库都对SQL语句进行了再开发和扩展,但是包括Select, Insert, Update, Delete, Create,以及Drop在内的标准的SQL命令仍然可以被用来完成几乎所有的数据库操作。

结构化查询语言(Structured Query Language)最早是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的1种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言得到了广泛的应用。如今无论是像Oracle、Sybase、Informix、SQL Server这些大型的数据库管理系统,还是像Visual Foxporo、PowerBuilder这些PC上常用的数据库开发系统,都支持SQL语言作为查询语言。

SQL Server

SQL Server是1个关系数据库管理系统它最初是由Microsoft Sybase 和Ashton-Tate三家公司共同开发的于1988 年推出了第1个OS/2 版本在Windows NT 推出后Microsoft与Sybase 在SQL Server 的开发上就分道扬镳了Microsoft 将SQL Server 移植到Windows NT 系统上专注于开发推广SQL Server 的Windows NT 版本Sybase 则较专注于SQL Server在UNIX操作系统上的应用在本书中介绍的是Microsoft SQL Server 以后简称为SQL Server或MS SQL Server .

SQL Server 2000 是Microsoft 公司推出的SQL Server 数据库管理系统的最新版本该版本继承了SQL Server 7.0 版本的优点同时又比它增加了许多更先进的功能具有使用方便可伸缩性好与相关软件集成程度高等优点可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2000 的大型多处理器的服务器等多种平台使用.

SQL语言包含四个部分:

1.数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句。
DDL 用于定义和管理物件,例如资料库、资料表以及检视表,DDL 陈述式通常包括每个物件的CREATE、ALTER 以及 DROP 命令

2.数据操作语言(DML),例如:INSERT、UPDATE、DELETE语句。
DML 利用 INSERT、SELECT、UPDATE 及 DELETE 等陈述式来操作资料库物件所包含的资料。

3.数据查询语言(DQL),例如:SELECT语句。
UPDATE 陈述式用来更新或改变一列或多列中的值。

4.数据控制语言(DCL),例如:GRANT、REVOKE、CO美眉IT、ROLLBACK等语句。

DCL是用来管理数据库的语言。包含管理权限及数据更改。

sql查询语句大全_sql查询语言 -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子句中最多可指定25六个表或视图,它们之间用逗号分隔。
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询2个表中的cityid时应使用下面语句格式加以限定:

SELECT username,citytable.cityid
FROM usertable,citytable
WHERE usertable.cityid=citytable.cityid

在FROM子句中可用以下2种格式为表或视图指定别名:
表名 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子句可包括各种条件运算符:
比较运算符(大小比较):>、>=、=、、!>、!=10 AND age、>=、、!。
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 条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或2个边接表(全外连接)中的所有数据行。如下面使用左外连接将论坛内容和作者信息连接起来:

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 子句,它返回被连接的2个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第1个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。例,titles表中有六类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等于6*8=48行。
SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY type

三 : 经典SQL语句大全数据库插入删除更新查询语句

一、基础

1、说明:创建数据库
CREATE DATABASEdatabase-name
2、说明:删除数据库
drop database dbname

3、说明:备份sqlserver
--- 创建备份数据的 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] [primarykey],col2 type2 [not null],..)

根据已有的表创建新表:
A:create table tab_new like tab_old(使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_olddefinition only
5、说明:删除新表
drop table tabname

6、说明:增加一个列
Alter table tabname add column coltype

列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键Alter table tabname add primarykey(col)
说明:删除主键: Alter table tabname dropprimary key(col)
8、说明:创建索引create [unique] index idxname ontabname(col….)
删除索引:drop indexidxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as selectstatement
删除视图:drop viewviewname
10、说明:几个简单的基本的sql语句
选择:
select * fromtable1 where 范围
插入:insertinto table1(field1,field2) values(value1,value2)
删除:delete from table1 where范围
更新
:update table1set field1=value1 where 范围
查找:select * from table1 wherefield1 like ’%value1%’ ---like的语法很精妙,查资料!
排序:select * fromtable1 order by field1,field2 [desc]
总数:select count astotalcount from table1
求和:select sum(field1) assumvalue from table1
平均:select avg(field1) asavgvalue from table1
最大:select max(field1) asmaxvalue from table1
最小:select min(field1) asminvalue from table1
11、说明:几个高级查询运算词
A: UNION 运算符

UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自TABLE2。
B: EXCEPT运算符
EXCEPT
运算符通过包括所有在 TABLE1 中但不在TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPTALL),不消除重复行。
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 ONa.a = b.c
B:right (outer)join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full/cross(outer) join
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
12、分组:Groupby:
一张表,一旦分组完成后,查询后只能得到组相关的信息。
组相关的信息:(统计信息) 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 awhere 1<>1(仅用于SQlServer)
法二:selecttop 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 awhere 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,(selectmax(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 (SELECTa,b,c FROM a) T where t.a > 1;

8、说明:between的用法,between限制查询数据范围时包括了边界值,notbetween不包括
select * fromtable1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and数值2

9、说明:in的使用方法
select * from table1where a [not] in (‘值1’,’值2’,’值4’,’值6’)

10、说明:两张关联表,删除主表中已经在副表中没有的信息
delete fromtable1 where not exists ( select * from table2 wheretable1.field1=table2.field1 )

11、说明:四表联查问题:
select * froma left inner join b on a.a=b.b right inner join c on a.a=c.c innerjoin d on a.a=d.d where .....

12、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排wheredatediff('minute',f开始时间,getdate())>5

13、说明:一条sql语句搞定数据库分页
select top 10 b.* from (select top 20主键字段,排序字段 from 表名 orderby 排序字段 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 notin(select top’+str(@str-1)+’Rid from T whereRid>-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 tawhere a=(select max(a) from tablename tb wheretb.b=ta.b)

16、说明:包括所有在TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except(select a from tableC)

17、说明:随机取出10条数据
select top10 * from tablename order bynewid()

18、说明:随机选择记录
selectnewid()

19、说明:删除重复记录
1),
delete fromtablename where id not in (select max(id) from tablename group bycol1,col2,...)
2),select distinct * into temp fromtablename
delete from tablename
insert into tablenameselect * from temp
评价: 这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作
3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段

alter table tablename
--添加一个自增列
add column_b intidentity(1,1)
delete from tablename where column_b notin(
select max(column_b) from tablename group bycolumn1,column2,...)
alter table tablename drop column column_b

20、说明:列出数据库里所有的表名
selectname from sysobjects where type='U' // U代表用户

21、说明:列出表里的所有的列名
selectname from syscolumns where id=object_id('TableName')

22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select中的case。
select type,sum(casevender when 'A' then pcs else 0 end),sum(case vender when 'C' thenpcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROMtablename 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的记录
selecttop 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” 是表示选择全部 “where1=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 安定 '+ @strWhere2、收缩数据库
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE

3、压缩数据库
dbccshrinkdatabase(dbname)

4、转移数据库给新用户以已存在用户权限
execsp_change_users_login 'update_one','newname','oldname'
go

5、检查备份集
RESTORE VERIFYONLYfrom 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 wraplog.
@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() + ' WITHTRUNCATE_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、说明:更改某个表
execsp_changeobjectowner 'tablename','dbo'

9、存储更改全部表

CREATE PROCEDUREdbo.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、SQLSERVER中直接循环写入数据
declare @iint
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((selectmin(score) fromtb_table)<60)

begin

update tb_table set score=score*1.01

wherescore<60

if (selectmin(score) fromtb_table)>60

break

else

continue

end

数据开发-经典


1.按姓氏笔画排序:
Select * From TableName Order By CustomerNameCollate Chinese_PRC_Stroke_ci_as //从少到多

2.数据库加密:
select encrypt('原始密码')
select pwdencrypt('原始密码')
select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同encrypt('原始密码')
select pwdencrypt('原始密码')
select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同

3.取回表中字段:
declare @listvarchar(1000),
@sql nvarchar(1000)
select @list=@list+','+b.name from sysobjects a,syscolumns b wherea.id=b.id and a.name='表A'
set @sql='select'+right(@list,len(@list)-1)+' from 表A'
exec (@sql)

4.查看硬盘分区:
EXECmaster..xp_fixeddrives

5.比较A,B表是否相等:
if (selectchecksum_agg(binary_checksum(*)) from A)
=
(select checksum_agg(binary_checksum(*)) from B)
print '相等'
else
print '不相等'

6.杀掉所有的事件探察器进程:
DECLARE hcforeachCURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROMmaster.dbo.sysprocesses
WHERE program_name IN('SQL profiler',N'SQL 事件探查器')
EXEC sp_msforeach_worker '?'

7.记录搜索:
开头到N条记录
Select Top N * From表
-------------------------------
NM条记录(要有主索引ID)
Select Top M-N * From 表 Where ID in (Select Top M ID From表) Order by ID Desc
----------------------------------
N到结尾记录
SelectTop N * From 表 Order by IDDesc
案例
例如1:一张表有一万多条记录,表的第一个字段RecID 是自增长字段, 写一个SQL语句,找出表的第31到第40个记录。

select top 10 recid from A where recid not in(select top 30recid from A)

分析:如果这样写会产生某些问题,如果recid在表中存在逻辑索引。

select top 10 recid from A where……是从索引中查找,而后面的select top 30recid fromA则在数据表中查找,这样由于索引中的顺序有可能和数据表中的不一致,这样就导致查询到的不是本来的欲得到的数据。

解决方案

1, 用order byselect top 30 recid from A order by ricid如果该字段不是自增长,就会出现问题

2,在那个子查询中也加条件:select top 30 recid from A whererecid>-1

例2:查询表中的最后以条记录,并不知道这个表共有多少数据,以及表结构。
set @s = 'select top 1 * from T wherepid not in (select top ' + str(@count-1) + ' pid fromT)'

print @s execsp_executesql @s

9:获取当前数据库中的所有用户表
select Name from sysobjects where xtype='u' andstatus>=0

10:获取某一个表的所有字段
select namefrom syscolumns where id=object_id('表名')

select name from syscolumns where id in (selectid from sysobjects where type = 'u' and name = '表名')

两种方式的效果相同

11:查看与某一个表相关的视图、存储过程、函数
selecta.* from sysobjects a, syscomments b where a.id = b.id and b.textlike '%表名%'

12:查看当前数据库中所有存储过程
selectname as 存储过程名称 from sysobjects where xtype='P'

13:查询用户创建的所有数据库
select * from master..sysdatabases D where sid notin(select sid from master..syslogins wherename='sa')
或者
select dbid, name AS DB_NAME frommaster..sysdatabases where sid<> 0x01

14:查询某一个表的字段和数据类型
select column_name,data_type frominformation_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 ', 'DataSource=ip/ServerName;User ID=登陆名;Password=密码 ').test.dbo.roy_ta

--把本地表导入远程表

insert opendatasource( 'SQLOLEDB ', 'DataSource=ip/ServerName;User ID=登陆名;Password=密码').数据库.dbo.表名

select * from 本地表

SQLServer基本函数

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查询语句大全-SQL查询语句大全T-SQL
本文地址: http://www.61k.com/1102184.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1