distinct 会将所有null视为一项
group by 将所有null值视为一项
count 不会计算null值项,count(null)=0
select count(
) from (select count(
) as num from library_books group by stayLibraryHallCode) temp;
输出结果是3229
select COUNT(DISTINCT stayLibraryHallCode) from library_books;
输出结果是3228
原因就是COUNT(DISTINCT stayLibraryHallCode)中有null值项+0,count(*)中null值项+1,所以结果肯定少1
distinct 会将所有null视为一项 group by 将所有null值视为一项 count 不会计算null值项,count(null)=0select count() from (select count() as num from library_books group by stayLibraryHallCode) temp; 输出结果是3229 select COUNT...
--- 创建 备份数据的 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 total
count
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 11(仅用于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 > 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 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
begin
set @strSQL = 'select
count
(*) as Total from [' + @tblName + ']'
我们可以直接写成
错误!未找到目录项。
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'
5、检查备份集
RESTORE VERIFYONLY from disk='E:\dvbbs.bak'
6、修复数据库
ALTER DATABASE [dvbbs] SET SINGLE_USER
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
ALTER DATABASE [dvbbs] SET MULTI_USER
7、日志清除
SET NO
COUNT
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 @
Count
er 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 @
Count
er = 0
WHILE ((@
Count
er < @OriginalSize / 16) AND (@
Count
er < 50000))
BEGIN -- update
INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans
SELECT @
Count
er = @
Count
er + 1
EXEC (@TruncLog)
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 NO
COUNT
OFF
8、说明:更改某个表
exec sp_changeobjectowner 'tablename','dbo'
9、存储更改全部表
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
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
-- select @name,@NewOwner,@OldOwner
FETCH NEXT FROM curObject INTO @Name, @Owner
close curObject
deallocate curObject
10、SQL SERVER中直接循环写入数据
declare @i int
set @i=1
while @i<30
begin
insert into test (userid) values(@i)
set @i=@i+1
有如下表,要求就裱中所有沒有及格的成績,在每次增長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 score60
break
continue
数据开发-经典
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 '相等'
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,is
null
( check_expression , replacement_value )如果check_expression為空,則返回replacement_value的
值
,不為空,就返回check_expression字符
操作
类
5,Sp_addtype 自定義數據類型
例如:EXEC sp_addtype birthday, datetime, '
NULL
'
6,set no
count
{on|off}
使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。SET NO
COUNT
设置是在执行或运行时设置,而不是在分析时设置。
SET NO
COUNT
为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。
SET NO
COUNT
为 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
,'用户名','密码'
--2.在 srv1 和 srv2 这两台电脑中,启动 msdtc(分布式事务处理服务),并且设置为自动启动
。我的电脑--控制面板--管理工具--服务--右键 Distributed Transaction Coordinator--属性--启动--并将启动类型设置为自动启动
--然后创建一个作业定时调用上面的同步处理存储过程就行了
企业管理器
--SQL Server代理
--右键作业
--新建作业
--"常规"项中输入作业名称
--"步骤"项
--"步骤名"中输入步骤名
--"类型"中选择"Transact-SQL 脚本(TSQL)"
--"数据库"选择执行命令的数据库
--"命令"中输入要执行的语句: exec p_process
--"调度"项
--新建调度
--"名称"中输入调度名称
--"调度类型"中选择你的作业执行安排
--如果选择"反复出现"
--点"更改"来设置你的时间安排
然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行
设置方法:
我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.
--3.实现同步处理的方法2,定时同步
--在srv1中创建如下的同步处理存储过程
create proc p_process
--更新修改过的数据
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)
alter table user modify tel varchar(15) default ‘02087654321’;
修改tel列的位置,在第一列显示
alter table user modify tel varchar(15) default '02087654321' first;
修改tel列的位置,在指定列之后显示
alter table user modify tel varchar(15) default '02087654321' after age;
注意:alter modify不支持一次修改多个列,但是Oracle支持多列修改
但是MySQL可以通过多个modify的方式完成:
alter table user
modify tel varchar(15) default '02087654321' first,
modify name varchar(20) after tel;
11、 删除指定字段
alter table user drop photo;
12、 重命名表数据
alter table user rename to users;
字段重命名
alter table users change name u_name varchar(10);
alter table users change sex u_sex varchar(10) after u_name;
如果需要改变列名建议使用change,如果需要改变数据类型和显示位置可以使用modify
13、 删除表
drop table users;
drop删除表会删除表结构,表对象将不存在数据中;数据也不会存在;表内的对象也不存在,如:索引、视图、约束;
truncate删除表
truncate都被当成DDL出来,truncate的作用就是删除该表里的全部数据,保留表结构。相当于DDL中的delete语句,
但是truncate比delete语句的速度要快得多。但是truncate不能带条件删除指定数据,只会删除所有的数据。如果删除的表有外键,
删除的速度类似于delete。但新版本的MySQL中truncate的速度比delete速度快。
MySQL中约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息;
约束主要完成对数据的检验,保证数据库数据的完整性;如果有相互依赖数据,保证该数据不被删除。
常用五类约束:
not
null
:非空约束,指定某列不为空
unique: 唯一约束,指定某列和几列组合的数据不能重复
primary key:主键约束,指定某列的数据不能重复、唯一
foreign key:外键,指定该列记录属于主表中的一条记录,参照另一条数据
check:检查,指定一个表达式,用于检验指定数据
MySQL不支持check约束,但可以使用check约束,而没有任何效果;
根据约束数据列限制,约束可分为:
单列约束:每个约束只约束一列
多列约束:每个约束约束多列数据
MySQL中约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息;
1、 not
null
约束
非空约束用于确保当前列的
值
不为
空值
,非空约束只能出现在表对象的列上。
Null
类型特征:
所有的类型的
值
都可以是
null
,
包括
int、float等数据类型
空字符串“”是不等于
null
,0也不等于
null
create table temp(
id int not
null
,
name varchar(255) not
null
default ‘abc’,
sex char
null
上面的table加上了非空约束,也可以用alter来修改或增加非空约束
增加非空约束
alter table temp
modify sex varchar(2) not
null
;
取消非空约束
alter table temp modify sex varchar(2)
null
;
取消非空约束,增加默认
值
alter table temp modify sex varchar(2) default ‘abc’
null
;
2、 unique
唯一约束是指定table的列或列组合不能重复,保证数据的唯一性。虽然唯一约束不允许出现重复的
值
,但是可以为多个
null
同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束的时候,如果不给唯一约束名称,就默认和列名相同。
唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束。
MySQL会给唯一约束的列上默认创建一个唯一索引;
create table temp (
id int not
null
,
name varchar(25),
password varchar(16),
--使用表级约束语法,
constraint uk_name_pwd unique(name, password)
表示用户名和密码组合不能重复
添加唯一约束
alter table temp add unique(name, password);
alter table temp modify name varchar(25) unique;
alter table temp drop index name;
3、 primary key
主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现
空值
;如果的多列组合的主键约束,
那么这些列都不允许为
空值
,并且组合的
值
不允许重复。
每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。MySQL的主键名总是PRIMARY,
当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
create table temp(
/*主键约束*/
id int primary key,
name varchar(25)
create table temp2(
id int not
null
,
name varchar(25),
pwd varchar(15),
constraint pk_temp_id primary key(id)
组合模式:
create table temp2(
id int not
null
,
name varchar(25),
pwd varchar(15),
constraint pk_temp_id primary key(name, pwd)
alter删除主键约束
alter table temp drop primary key;
alter添加主键
alter table temp add primary key(name, pwd);
alter修改列为主键
alter table temp modify id int primary key;
设置主键自增
create table temp(
id int auto_increment primary key,
name varchar(20),
pwd varchar(16)
auto_increment自增模式,设置自增后在插入数据的时候就不需要给该列插入
值
了。
4、 foreign key 约束
外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。
也就是说从表的外键
值
必须在主表中能找到或者为空。
当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,
然后才可以删除主表的数据。还有一种就是级联删除子表数据。
注意:外键约束的参照列,在主表中引用的只能是主键或唯一键约束的列,假定引用的主表列不是唯一的记录,
那么从表引用的数据就不确定记录的位置。同一个表可以有多个外键约束。
创建外键约束:
create table classes(
id int auto_increment primary key,
name varchar(20)
create table student(
id int auto_increment,
name varchar(22),
constraint pk_id primary key(id),
classes_id int references classes(id)
通常先建主表,然后再建从表,这样从表的参照引用的表才存在。
表级别创建外键约束:
create table student(
id int auto_increment primary key,
name varchar(25),
classes_id int,
foreign key(classes_id) references classes(id)
上面的创建外键的方法没有指定约束名称,系统会默认给外键约束分配外键约束名称,命名为student_ibfk_n,
其中student是表名,n是当前约束从1开始的整数。
指定约束名称:
create table student(
id int auto_increment primary key,
name varchar(25),
classes_id int,
/*指定约束名称*/
constraint fk_classes_id foreign key(classes_id) references classes(id)
多列外键组合,必须用表级别约束语法:
create table classes(
id int,
name varchar(20),
number int,
primary key(name, number)
create table student(
id int auto_increment primary key,
name varchar(20),
classes_name varchar(20),
classes_number int,
/*表级别联合外键*/
foreign key(classes_name, classes_number) references classes(name, number)
删除外键约束:
alter table student drop foreign key student_ibfk_1;
alter table student drop foreign key fk_student_id;
增加外键约束
alter table student add foreign key(classes_name, classes_number) referencesclasses(name, number);
自引用、自关联(递归表、树状表)
create table tree(
id int auto_increment primary key,
name varchar(50),
parent_id int,
foreign key(parent_id) references tree(id)
级联删除:删除主表的数据时,关联的从表数据也删除,则需要在建立外键约束的后面增加on deletecascade
或on delete set
null
,前者是级联删除,后者是将从表的关联列的
值
设置为
null
。
create table student(
id int auto_increment primary key,
name varchar(20),
classes_name varchar(20),
classes_number int,
/*表级别联合外键*/
foreign key(classes_name, classes_number) references classes(name, number) on deletecascade
5、 check约束
MySQL可以使用check约束,但check约束对数据验证没有任何作用。
create table temp(
id int auto_increment,
name varchar(20),
age int,
primary key(id),
/*check约束*/
check(age > 20)
上面check约束要求age必须大于0,但没有任何作用。但是创建table的时候没有任何错误或警告。
索引是存放在模式(schema)中的一个数据库对象,索引的作用就是提高对表的检索查询速度,
索引是通过快速访问的方法来进行快速定位数据,从而减少了对磁盘的读写
操作
。
索引是数据库的一个对象,它不能独立存在,必须对某个表对象进行依赖。
提示:索引保存在information_schema数据库里的STATISTICS表中。
创建索引方式:
自动:当表上定义主键约束、唯一、外键约束时,该表会被系统自动添加上索引。
手动:手动在相关表或列上增加索引,提高查询速度。
删除索引方式:
自动:当表对象被删除时,该表上的索引自动被删除
手动:手动删除指定表对象的相关列上的索引
索引类似于书籍的目录,可以快速定位到相关的数据,一个表可以有多个索引。
创建索引:
create index idx_temp_name on temp(name);
组合索引:
create index idx_temp_name$pwd on temp(name, pwd);
删除索引:
drop index idx_temp_name on temp;
视图就是一个表或多个表的查询结果,它是一张虚拟的表,因为它并不能存储数据。
视图的作用、优点:
限制对数据的访问
让复杂查询变得简单
提供数据的独立性
可以完成对相同数据的不同显示
创建、修改视图
create or replace view view_temp
select name, age from temp;
通常我们并不对视图的数据做修改
操作
,因为视图是一张虚拟的表,它并不存储实际数据。如果想让视图不被修改,可以用with check option来完成限制。
create or replace view view_temp
select * from temp
with check option;
修改视图:
alter view view_temp
select id, name from temp;
删除视图:
drop view view_temp;
显示创建语法:
show create view v_temp;
Ø DML语句
DML主要针对数据库表对象的数据而言的,一般DML完成:
插入新数据
修改已添加的数据
删除不需要的数据
1、 insert into 插入语句
insert into temp values(
null
, ‘jack’, 25);
主键自增可以不插入,所以用
null
代替
insert into temp(name, age) values(‘jack’, 22);
在表面后面带括号,括号中写列名,values中写指定列名的
值
即可。当省略列名就表示插入全部数据,
注意插入
值
的顺序和列的顺序需要保持一致。
Set方式插入,也可以指定列
insert into temp set id = 7, name = 'jason';
MySQL中外键的table的外键引用列可以插入数据可以为
null
,不参照主表的数据。
使用子查询插入数据
insert into temp(name) select name from classes;
insert into temp values(
null
, ‘jack’, 22), (
null
, ‘jackson’ 23);
2、 update 修改语句
update主要完成对数据的修改
操作
,可以修改一条或多条数据。修改多条或指定条件的数据,需要用where条件来完成。
修改所有数据
update temp set name = ‘jack2’;
所有的数据的name会被修改,如果修改多列用“,”分开
update temp set name = ‘jack’, age = 22;
修改指定条件的记录需要用where
update temp set name = ‘jack’ where age > 22;
3、 delete 删除语句
删除table中的数据,可以删除所有,带条件可以删除指定的记录。
删除所有数据
delete from temp;
删除指定条件数据
delete from temp where age > 20;
Ø select 查询、function 函数
select查询语句用得最广泛、功能也最丰富。可以完成单条记录、多条记录、单表、多表、子查询等。
1、 查询某张表所有数据
select * from temp;
*代表所有列,temp代表表名,不带条件就查询所有数据
2、 查询指定列和条件的数据
select name, age from temp where age = 22;
查询name和age这两列,age 等于22的数据。
3、 对查询的数据进行运算
操作
select age + 2, age / 2, age – 2, age * 2 from temp where age – 2 > 22;
4、 concat函数,字符串连接
select concat(name, ‘-eco’) from temp;
concat和
null
进行连接,会导致连接后的数据成为
null
5、 as 对列重命名
select name as ‘名称’ from temp;
as也可以省略不写,效果一样
如果重命名的列名出现特殊字符,如“‘”单引号,那就需要用双引号引在外面
select name as “名’称” from temp;
6、 也可以给table去别名
select t.name Name from temp as t;
7、 查询常量
类似于SQL Server
select 5 + 2;
select concat('a', 'bbb');
8、
distinct
去掉重复数据
select
distinct
id from temp;
多列将是组合的重复数据
select
distinct
id, age from temp;
9、 where 条件查询
大于>、大于等于>=、小于<、小于等于<=、等于=、不等于<>
都可以出现在where语句中
select * from t where a > 2 or a >= 3 or a < 5 or a <= 6 or a = 7 or a <> 0;
10、 and 并且
select * from temp where age > 20 and name = ‘jack’;
查询名称等于jack并且年龄大于20的
11、 or 或者
满足一个即可
select * from tmep where name = ‘jack’ or name = ‘jackson’;
12、 between v and v2
大于等于v且小于等于v2
select * form temp where age between 20 and 25;
13、 in 查询
可以多个条件 类似于or
select * from temp where id in (1, 2, 3);
查询id在括号中出现的数据
14、 like 模糊查询
查询name以j开头的
select * from temp where name like ‘j%’;
查询name包含k的
select * from temp where name like ‘%k%’;
escape转义
select * from temp where name like ‘/_%’ escape ‘/’;
指定/为转义字符,上面的就可以查询name中包含“_”的数据
15、 is
null
、is not
null
查询为
null
的数据
select * from temp where name is
null
;
查询不为
null
的数据
select * from temp where name is not
null
;
16、 not
select * from temp where not (age > 20);
取小于等于20的数据
select * from temp where id not in(1, 2);
17、 order by
排序,有desc、asc升序、降序
select * from temp order by id;
默认desc排序
select * from temp order by id asc;
select * from temp order by id, age;
Ø function 函数
函数的作用比较大,一般多用在select查询语句和where条件语句之后。按照函数返回的结果,
可以分为:多行函数和单行函数;所谓的单行函数就是将每条数据进行独立的计算,然后每条数据得到一条结果。
如:字符串函数;而多行函数,就是多条记录同时计算,得到最终只有一条结果记录。如:sum、avg等
多行函数也称为聚集函数、分组函数,主要用于完成一些统计功能。MySQL的单行函数有如下特征:
单行函数的参数可以是变量、常量或数据列。单行函数可以接受多个参数,但返回一个
值
。
单行函数就是它会对每一行单独起作用,每一行(可能包含多个参数)返回一个结果。
单行函数可以改变参数的数据类型。单行函数支持嵌套使用:内层函数的返回
值
是外层函数的参数。
单行函数可以分为:
类型转换函数;
流程控制语句;
加密解密函数;
1、 char_length字符长度
select char_length(tel) from user;
2、 sin函数
select sin(age) from user;
select sin(1.57);
3、 添加日期函数
select date_add('2010-06-21', interval 2 month);
interval是一个关键字,2 month是2个月的意思,2是数
值
,month是单位
select addDate('2011-05-28', 2);
在前面的日期上加上后面的天数
4、 获取当前系统时间、日期
select curdate();
select curtime();
5、 加密函数
select md5('zhangsan');
6、
Null
处理函数
select if
null
(birthday, 'is
null
birthday') from user;
如果birthday为
null
,就返回后面的字符串
select
null
if(age, 245) from user;
如果age等于245就返回
null
,不等就返回age
select is
null
(birthday) from user;
判断birthday是否为
null
select if(is
null
(birthday), 'birthday is
null
', 'birthday not is
null
') from user;
如果birthday为
null
或是0就返回birthday is
null
,否则就返回birthday not is
null
;类似于三目运算符
7、 case 流程函数
case函数是一个流程控制函数,可以接受多个参数,但最终只会返回一个结果。
select name,
(case sex
when 1 then '男'
when 0 then '女'
else '火星人'
) sex
from user;
组函数就是多行函数,组函数是完成一行或多行结果集的运算,最后返回一个结果,而不是每条记录返回一个结果。
1、 avg平均
值
运算
select avg(age) from user;
select avg(
distinct
age) from user;
2、
count
记录条数统计
select
count
(*),
count
(age),
count
(
distinct
age) from user;
3、 max 最大
值
select max(age), max(
distinct
age) from user;
4、 min 最小
值
select min(age), min(
distinct
age) from user;
5、 sum 求和、聚和
select sum(age), sum(
distinct
age) from user;
select sum(if
null
(age, 0)) from user;
6、
group
by 分组
select
count
(*), sex from user
group
by sex;
select
count
(*) from user
group
by age;
select * from user
group
by sex, age;
7、 having进行条件过滤
不能在where子句中过滤组,where子句仅用于过滤行。过滤
group
by需要having
不能在where子句中用组函数,having中才能用组函数
select
count
(*) from user
group
by sex having sex <> 2;
Ø 多表查询和子查询
数据库的查询功能最为丰富,很多时候需要用到查询完成一些事物,而且不是单纯的对一个表进行
操作
。而是对多个表进行联合查询,
MySQL中多表连接查询有两种规范,较早的SQL92规范支持,如下几种表连接查询:
等
值
连接
非等
值
连接
广义笛卡尔积
SQL99规则提供了可读性更好的多表连接语法,并提供了更多类型的连接查询,SQL99支持如下几种多表连接查询:
使用using子句的连接
使用on子句连接
全部连接或者左右外连接
SQL92的连接查询
SQL92的连接查询语法比较简单,多将多个table放置在from关键字之后,多个table用“,”隔开;
连接的条件放在where条件之后,与查询条件直接用and逻辑运算符进行连接。如果条件中使用的是相等,
则称为等
值
连接,相反则称为非等
值
,如果没有任何条件则称为广义笛卡尔积。
广义笛卡尔积:select s.*, c.* from student s, classes c;
等
值
:select s.*, c.* from student s, classes c where s.cid = c.id;
非等
值
:select s.*, c.* from student s, classes c where s.cid <> c.id;
select s.*, c.name classes from classes c, student s where c.id = s.classes_id ands.name is not
null
;
SQL99连接查询
1、交叉连接cross join,类似于SQL92的笛卡尔积查询,无需条件。如:
select s.*, c.name from student s cross join classes c;
2、自然连接 natural join查询,无需条件,默认条件是将2个table中的相同字段作为连接条件,如果没有相同字段,查询的结果就是空。
select s.*, c.name from student s natural join classes c;
3、using子句连接查询:using的子句可以是一列或多列,显示的指定两个表中同名列作为连接条件。
如果用natural join的连接查询,会把所有的相同字段作为连接查询。而using可以指定相同列及个数。
select s.*, c.name from student s join classes c using(id);
4、 join … on连接查询,查询条件在on中完成,每个on语句只能指定一个条件。
select s.*, c.name from student s join classes c on s.classes_id = c.id;
5、 左右外连接:3种外连接,left [outer] join、right [outer] join,连接条件都是通过用on子句来指定,条件可以等
值
、非等
值
。
select s.*, c.name from student s left join classes c on s.classes_id = c.id;
select s.*, c.name from student s right join classes c on s.classes_id = c.id;
子查询就是指在查询语句中嵌套另一个查询,子查询可以支持多层嵌套。子查询可以出现在2个位置:
from关键字之后,被当做一个表来进行查询,这种用法被称为行内视图,因为该子查询的实质就是一个临时视图
出现在where条件之后作为过滤条件的
值
子查询注意点:
子查询用括号括起来,特别情况下需要起一个临时名称
子查询当做临时表时(在from之后的子查询),可以为该子查询起别名,尤其是要作为前缀来限定数据列名时
子查询用作过滤条件时,将子查询放在比较运算符的右边,提供可读性
子查询作为过滤条件时,单行子查询使用单行运算符,多行子查询用多行运算符
将from后面的子查询当做一个table来用:
select * from (select id, name from classes) s where s.id in (1, 2);
当做条件来用:
select * from student s where s.classes_id in (select id from classes);
select * from student s where s.classes_id = any (select id from classes);
select * from student s where s.classes_id > any (select id from classes);
Ø
操作
符和函数
1、 boolean只判断
select 1 is true, 0 is false,
null
is unknown;
select 1 is not unknown, 0 is not unknown,
null
is not unknown;
2、 coalesce函数,返回第一个非
null
的
值
select coalesce(
null
, 1);
select coalesce(1, 1);
select coalesce(
null
, 1);
select coalesce(
null
,
null
);
3、 当有2个或多个参数时,返回最大的那个参数
值
select greatest(2, 3);
select greatest(2, 3, 1, 9, 55, 23);
select greatest('D', 'A', 'B');
4、 Least函数,返回最小
值
,如果有
null
就返回
null
值
select least(2, 0);
select least(2, 0,
null
);
select least(2, 10, 22.2, 35.1, 1.1);
5、 控制流函数
select case 1 when 1 then 'is 1' when 2 then 'is 2' else 'none' end;
select case when 1 > 2 then 'yes' else 'no' end;
6、 ascii字符串函数
select ascii('A');
select ascii('1');
7、 二进制函数
select bin(22);
8、 返回二进制字符串长度
select bit_length(11);
9、 char将
值
转换成字符,小数取整四舍五入
select char(65);
select char(65.4);
select char(65.5);
select char(65.6);
select char(65, 66, 67.4, 68.5, 69.6, '55.5', '97.3');
10、 using改变字符集
select charset(char(0*65)), charset(char(0*65 using utf8));
11、 得到字符长度char_length,character_length
select char_length('abc');
select character_length('eft');
12、 compress压缩字符串、uncompress解压缩
select compress('abcedf');
select uncompress(compress('abcedf'));
13、 concat_ws分隔字符串
select concat_ws('#', 'first', 'second', 'last');
select concat_ws('#', 'first', 'second',
null
, 'last');
Ø 事务处理
开始事务:start transaction
提交事务:commit
回滚事务:rollback
设置自动提交:set autocommit 1 | 0
atuoCommit系统默认是1立即提交模式;如果要手动控制事务,需要设置set autoCommit 0;
这样我们就可以用commit、rollback来控制事务了。
在一段语句块中禁用autocommit 而不是set autocommit
start transaction;
select @result := avg(age) from temp;
update temp set age = @result where id = 2;
select * from temp where id = 2;//
值
被改变
rollback;//回滚
select * from temp where id = 2;//变回来了
在此期间只有遇到commit、rollback,start Transaction的禁用autocommit才会结束。然后就恢复到原来的autocommit模式;
不能回滚的语句
有些语句不能被回滚。通常,这些语句
包括
数据定义语言(DDL)语句,比如创建或取消数据库的语句,
和创建、取消或更改表或存储的子程序的语句。
您在设计事务时,不应包含这类语句。如果您在事务的前部中发布了一个不能被回滚的语句,
则后部的其它语句会发生错误,在这些情况下,通过发布ROLLBACK语句不能 回滚事务的全部效果。
一些
操作
也会隐式的提交事务
如alter、create、drop、rename table、lock table、set autocommit、starttransaction、truncate table 等等,
在事务中出现这些语句也会提交事务的
事务不能嵌套事务
事务的保存点
Savepoint pointName/Rollback to savepoint pointName
一个事务可以设置多个保存点,rollback可以回滚到指定的保存点,恢复保存点后面的
操作
。
如果有后面的保存点和前面的同名,则删除前面的保存点。
Release savepoint会删除一个保存点,如果在一段事务中执行commit或rollback,则事务结束,所以保存点删除。
Set Transaction设计数据库隔离级别
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
本语句用于设置事务隔离等级,用于下一个事务,或者用于当前会话。
在默认情况下,SET TRANSACTION会为下一个事务(还未开始)设置隔离等级。
如果您使用GLOBAL关键词,则语句会设置全局性的默认事务等级,
用于从该点以后创建的所有新连接。原有的连接不受影响。使用SESSION关键测可以设置默认事务等级,
用于对当前连接执行的所有将来事务。
默认的等级是REPEATABLE READ全局隔离等级。
select 1+1; # 单行注释
select 1+1; -- 单行注释
select 1 /* 多行注释 */ + 1;
Ø 基本数据类型
操作
select 'hello', '"hello"', '""hello""', 'hel''lo', '/'hello';
select "hello", "'hello'", "''hello''", "hel""lo", "/"hello";
select 'This/nIs/nFour/nLines';
select 'hello / world!';
select 'hello /world!';
select 'hello // world!';
select 'hello /' world!';
Ø 设置数据库mode模式
SET sql_mode='ANSI_QUOTES';
create table t(a int);
create table "tt"(a int);
create table "t""t"(a int);
craate talbe tab("a""b" int);
Ø 用户变量
set @num1 = 0, @num2 = 2, @result = 0;
select @result := (@num1 := 5) + @num2 := 3, @num1, @num2, @result;
Ø 存储过程
创建存储过程:
delimiter //
create procedure get(out result int)
begin
select max(age) into result from temp;
end//
调用存储过程:
call get(@temp);
查询结果:
select @temp;
删除存储过程:
drop procedure get;
查看存储过程创建语句:
show create procedure get;
select…into 可以完成单行记录的赋
值
:
create procedure getRecord(sid int)
begin
declare v_name varchar(20) default 'jason';
declare v_age int;
declare v_sex bit;
select name, age, sex into v_name, v_age, v_sex from temp where id = sid;
select v_name, v_age, v_sex;
call getRecord(1);
函数类似于存储过程,只是调用方式不同
例如:select max(age) from temp;
创建函数:
create function addAge(age int) returns int
return age + 5;
使用函数:
select addAge(age) from temp;
删除函数:
drop function if exists addAge;
drop function addAge;
显示创建语法:
show create function addAge;
声明游标:declare cur_Name cursor for select name from temp;
打开游标:open cur_Name;
Fetch游标:fetch cur_Name into @temp;
关闭游标:close cur_Name;
CREATE PROCEDURE cur_show()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE v_id, v_age INT;
DECLARE v_name varchar(20);
DECLARE cur_temp CURSOR FOR SELECT id, name, age FROM temp;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur_temp;
REPEAT
FETCH cur_temp INTO v_id, v_name, v_age;
IF NOT done THEN
IF is
null
(v_name) THEN
update temp set name = concat('test-json', v_id) where id = v_id;
ELSEIF is
null
(v_age) THEN
update temp set age = 22 where id = v_id;
END IF;
END IF;
UNTIL done END REPEAT;
CLOSE cur_temp;
Ø 触发器
触发器分为insert、update、delete三种触发器事件类型
还有after、before触发时间
创建触发器:
create trigger trg_temp_ins
before insert
on temp for each row
begin
insert into temp_log values(NEW.id, NEW.name);
end//
删除触发器:
drop trigger trg_temp_ins
LINQ to SQL语句(1)之Where
LINQ to SQL语句(2)之Select/
Distinct
LINQ to SQL语句(3)之
Count
/Sum/Min/Max/Avg
LINQ to SQL语句(4)之Join
LINQ to SQL语句(5)之Order By
LINQ to SQL语句(6)之
Group
By/Having
LINQ to SQL语句(7)之Exists/In/Any/All/Contains
LINQ to SQL语句(8)之Concat/Union/Intersect/Except
LINQ to SQL语句(9)之Top/Bottom和Paging和SqlMethods
LINQ to SQL语句(10)之Insert
LINQ to SQL语句(11)之Update
LINQ to SQL语句(12)之Delete和使用Attach
LINQ to SQL语句(13)之开放式并发控制和事务
LINQ to SQL语句(14)之
Null
语义和DateTime
LINQ to SQL语句(15)之String
LINQ to SQL语句(16)之对象标识
LINQ to SQL语句(17)之对象加载
LINQ to SQL语句(18)之运算符转换
LINQ to SQL语句(19)之ADO.NET与LINQ to SQL
LINQ to SQL语句(20)之存储过程
LINQ to SQL语句(21)之用户定义函数
LINQ to SQL语句(22)之DataContext
LINQ to SQL语句(23)之动态查询
LINQ to SQL语句(24)之视图
LINQ to SQL语句(25)之继承
例如这样一个表,我想统计email和passwords都不相同的记录的条数 复制代码 代码如下: CREATE TABLE IF NOT EXISTS `test_users` ( `email_id` int(11) unsigned NOT
NULL
auto_increment, `email` char(100) NOT
NULL
, `passwords` char(64) NOT
NULL
, PRIMARY KEY (`email_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ; INSERT INTO `te
https://blog.csdn.net/huangpei2008/article/details/5307860
distinct
some 返回
值
中含有
null
count
some 中没有计算
null
count
(
distinct
some)中去重之后计算不包含
null
的总数量
先说结论:使用
count
distinct
计算两列联合去重时,若有任何一列为
null
那么
count
计数时就会略过这一条。
如:
count
(
distinct
a,b) 若a或者b中有一个是
null
,那么这一行就不会参与计数
平台:hive、mysql都是如此
1、给一张测试表如下:
表名设为test,注意第三行的name是
null
,
空值
select * from errorinfo
select
count
(1) from errorinfo
select
distinct
info from errorinfo
select
count
(
distinct
info) from errorinfo
distinct
会将所有
NULL
合并为一项
count
(
distinct
)会将
NULL
除去。
distinct
字段出现
null
1.
distinct
中字段出现
null
时,会使得计算结果不准确。原因有1. 所有的
null
值
会被归并到一项;2.
count
结果并不会统计
null
项
SELECT
DISTINCT
id, value FROM table;
2.可以使用coalesce函数解决
SELECT
DISTINCT
(coalesce(ID, 0), coalesce(value, 0)) FROM table;
3.关于
distinct
与
group
by
disticnt会让所有数据sh
数据分析-淘宝⽤户⾏为分析 ⼀、项⽬背景和⽬的 ⼀、项⽬背景和⽬的 项⽬数据来源于,通过此项⽬学习电商数据分析的指标与数据分析的基本⽅法。 ⼆、分析维度 ⼆、分析维度 根据现有数据及分析⽬的,从四个维度进⾏分析: 第⼀个维度:⽤户购物情况整体分析 以PV、UV、平均访问量、跳失率等指标,分析⽤户最活跃的⽇期及活跃时段,了解⽤户⾏为习惯 第⼆个维度:商品购买情况分析 从成交量、⼈均购买次数、复购率等指标,探索⽤户对商品的购买偏好,了解商品的销售规律 第三个维度:⽤户⾏为转化漏⽃分析 从收藏转化率、购物车转化率、成交转化率,对⽤户⾏为从浏览到购买进⾏漏⽃分析 第四个维度:参照RFM模型,对⽤户进⾏分类,找出有价
值
的⽤户 三、分析正⽂ 三、分析正⽂ 分析步骤如下: 提出问题------理解数据------数据清洗------构建模型------数据可视化 (⼀)提出问题 ⽤户最活跃的⽇期及时段 ⽤户对商品有哪些购买偏好 ⽤户⾏为间的转化情况 ⽤户分类,哪些是有价
值
的⽤户 (⼆)理解数据 ⽤户⾏为类型⼜分为四种: pv:商品详情页pv,等价于点击 buy:商品购买 cart:商品加⼊购物车 fav:收藏 (三)数据清洗 包含数据导⼊(采⽤Navicat)、缺失
值
处理、⼀致化处理、异常
值
处理(2017.11.25到2017.12.3⽇内的数据) (四)构建模型 1.⽤户购物情况整体分析 1.1 这9天⾥PV(浏览量),返回结果是:2027221 select
count
(behavior_type) as 浏览量 from User_Behavior where behavior_type='pv'; 1.2 这9天⾥UV(⽤户数),返回结果是:22099 select
count
(
distinct
user_id)as ⽤户数 from User_Behavior; 1.3 平均访问量是: 2027221/22099 = 91.7 即每个⽤户平均访问了91个页⾯。 1.4 跳失率计算: 跳失率:只有点击⾏为的⽤户/总⽤户数 select
count
(
distinct
user_id) from User_Behavior where user_id not in (select
distinct
user_id from User_Behavior where behavior_type='fav') and user_id not in (select
distinct
user_id from User_Behavior where behavior_type='cart') and user_id not in (select
distinct
user_id from User_Behavior where behavior_type='buy'); 只有点击⾏为的⽤户数量为1253,故跳失率 = 1253/22099 = 0.0567,跳失率不⾼,说明店铺的商品详情页还是能吸引到⽤户的进⾏ 下⼀步⾏为。 1.5 每天访问量/访客数情况 select dates,
count
(behavior_type)as 访问量 from User_Behavior where behavior_type='pv'
group
by dates; 1.6 每天的访客数情况: select dates,
count
(
distinct
user_id) as 访客数 from User_Behavior
group
by dates; 1.7 每个时段访问量/访客数 alter table User_Behavior add column hours varchar(25) not
null
; update User_Behavior set hours=left(times,2); select a.hours,a.访问量,b.访客数 from (select hours,
count
(behavior_type)as 访问量 from User_Behavior where behavior_type='pv'
group
by hours)a inner join (select hours,
count
(
distinct
user_id) as 访客数 from User_Behavior
group
by hours)b on a.hours=b.hours; 可以看出访客数与访问量趋势⼤致⼀致,17 - 22时达到访客⾼峰,猜测是下班后进⾏购物放松。1-7时⼤多数⼈处于睡眠休息阶段故访客 与访问量较少。 1.8 不同时段成交量 select hours,
count
(behavior_type)as 成交量 from User_Behavi
文章目录数据准备
null
空值
处理
空值
''
空值
null
count
与
distinct
union与
distinct
sum与
null
重复
值
处理
group
by、
distinct
与row_number互换
-- 建表
CREATE TABLE IF NOT EXISTS TEST01.A
ID VARCHAR(50) COMMENT 'ID号' -- 01
,NUMS
由于Oracle在
count
()的时候,并不计算
null
(
空值
)部分,所以和
空值
结合起来进行统计的时候还是有一些意思。
count
这个函数应用的太频繁,有必要深究一番。
测试表格及其数据:
SQL> desc student;
Name Type
Null
able Default Comments
<h3>回答1:</h3><br/>
count
distinct
和
group
by 是 SQL 中常用的两个聚合函数。
count
distinct
用于计算某一列中不同
值
的数量,例如:
SELECT
COUNT
(
DISTINCT
column_name) FROM table_name;
group
by 则是将数据按照某一列的
值
进行分组,并对每组进行聚合计算,例如:
SELECT column_name,
COUNT
(*) FROM table_name
GROUP
BY column_name;
这样可以得到每个不同的 column_name
值
的数量。