网站首页 > 网管员之家  > 数据库 > 当前主题    站内搜索    首页  上一页  下一页  尾页  页次1/1         新用户申请  老用户登录  返回首页
作者信息   主题: SQL语言进阶学习22424

白瑞德


发表主题: 2957
发表回复: 4616
网站暂行积分: 13487


【人类幸存者】



  发表时间: 2010-11-29 15:45:21             

特别提示:本帖子在 2011-7-25 23:16:43 由用户 白瑞德 编辑过

【7.25】
浪漫烛光 www.langmanzg.com

选取排名在21-30位的数据记录,SQL语句的另外一种写法:
浪漫烛光 www.langmanzg.com

select top 20 * from biao where id not in (select top 10 id from biao)
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

【6.9】
浪漫烛光 www.langmanzg.com

几条SQL语句,平时常用,但是要让我写还真是写不出,不过这点应该注意了~
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

1,获取按照某字段排序,比如说排名在前21-30位的记录,这个实际上使用Top嵌套就可以
浪漫烛光 www.langmanzg.com

"select top 10 * from (select top 30 * from t_message where c_message_restoreno=0 "&_" and (c_message_delno is null or (c_message_delno is not null and c_message_delno=0)) order by c_message_clicknum desc) as tbl"&_" order by tbl.c_message_clicknum "
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

对应某一字段,一个升序排列,一个降序排列~
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

2,创建一个表
浪漫烛光 www.langmanzg.com

create table t_atc(c_atc_no autoincrement(1,1) primary key,c_member_no integer,c_board_id integer,c_atc_zdno integer)
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

3,增加一个列,并且设置唯一索引
浪漫烛光 www.langmanzg.com

alter table t_message add column c_message_locked integer
浪漫烛光 www.langmanzg.com

CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

【6.7】
浪漫烛光 www.langmanzg.com

DBA interview铩羽而归,痛定思痛,要沉下心来学习了……
浪漫烛光 www.langmanzg.com

几个涉及到宏观方法方面的问题:
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

1,关于临时表:
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。全局临时表的名称以两iMhQscbC!d:]0Z8B个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

例如,如果创建了 employees 表,则任何在数据库中有使用该表的安全权限的用户都可以使用该表,除非已将其删除。如果数据库会话创建了本地临时表 #employees,则仅会话可以使用该表,会话断开连接后就将该表删除。如果创建了 ##employees 全局临时表,则数据库中的任何用户均可使用该表。如果该表在您创建后没有其他用户使用,则当您断开连接时该表删除。如果您创建该表后另一个用户在使用该 表,则 SQL Server 将在您断开连接并且所有其他会话不再使用该表时将其删除。
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

2,有关数据库日志的清除
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

一,可以使用“收缩数据库”(Shrink Database)功能
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

最简单的方法
浪漫烛光 www.langmanzg.com

1、右击数据库属性窗口--故障还原模型--设为简单
浪漫烛光 www.langmanzg.com

2、右击数据库所有任务--收缩数据库
浪漫烛光 www.langmanzg.com

3、右击数据库属性窗口--故障还原模型--设为大容量日志记录
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

为了以后管理数据的方便,我们可以设置数据库自动收缩:企业管理器--服务器--右d^O|t-b.$AH键数据库--属性--选项--选择"自动收缩"。
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

二,最安全的办法
浪漫烛光 www.langmanzg.com

1、先清空日志文件:假设有一个数据库的名称是abc,我们在查询文件器里面输入dump transaction "abc" with no_log
浪漫烛光 www.langmanzg.com

2、截断事务日志:继续在查询分析器里面输入backup log "abc" with no_log
浪漫烛光 www.langmanzg.com

3、收缩数据库文件:如果不压缩abc,数据库日志的文件不会减小的!!!
浪漫烛光 www.langmanzg.com

企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在“收缩方式”里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了。
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

3,几个系统数据库的含义
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

master 数据库
浪漫烛光 www.langmanzg.com

master 数据库记录 SQL Server 系统的所有系统级别信息。它记录所有的登录帐户和系统配置设置。master 数据库是这样一个数据库,它记录所有其它的数据库,其中包括数据库文件的位置。master 数据库记录 SQL Server 的初始化信息,它始终有一个可用的最新 master 数据库备份。
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

msdb 数据库
浪漫烛光 www.langmanzg.com

msdb 数据库供 SQL Server 代理程序调度警报和作业以及记录操作员时使用。
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

4,SQL语句锁定效率低下的位置
浪漫烛光 www.langmanzg.com

…………
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

5,当新增一条记录后,如何获得这条记录的自增量类型列(标识列)的值
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

有如下方法:
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

select ident_current('aa')--标识当前值
浪漫烛光 www.langmanzg.com

select ident_incr('aa')--标识增量
浪漫烛光 www.langmanzg.com

select ident_seed('aa')--标识种子
浪漫烛光 www.langmanzg.com

--aa为表名
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

6,记录数位千万数量级的数据表,如何加快查询速度?
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

不太明白所提的问题,查找了几个,学习下~
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

1、升级硬件
浪漫烛光 www.langmanzg.com

2、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。
浪漫烛光 www.langmanzg.com

3、扩大服务器的内存
浪漫烛光 www.langmanzg.com

4、增加服务器CPU个数
浪漫烛光 www.langmanzg.com

5、对于大的数据库不要设置数据库自动增长,它会降低服务器的性能
浪漫烛光 www.langmanzg.com

6、在查询Select语句中用Where字句限制返回的行数,避免表扫描,如果返回不必要的数据,浪费了服务器的I/O资源,加重了网络的负担降低性能。如果表很大,在25LeX!Gu'VH.|ve表扫描的期间将表锁住,禁止其他的联接访问表,后果严重。
浪漫烛光 www.langmanzg.com

7、查询时不要返回不需要的行、列
浪漫烛光 www.langmanzg.com

8、用select top 100 / 10 Percent 来限制用户返回的行数或者SET ROWCOUNT来限制操作的行
浪漫烛光 www.langmanzg.com

9、在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数
浪漫烛光 www.langmanzg.com

10、一般在GROUP BY 个HAVING字句之前就能剔除多余的行,所以尽量不要用它们来做剔除行的工作。他们的执行顺序应该如下最优:
浪漫烛光 www.langmanzg.com

   select的Where字句选择所有合适的行,Group By用来分组个统计行,Having字句用来剔除多余的分组。这样Group By 个Having的开销小,查询快.对于大的数据行进行分组和Having十分消耗资源。如果Group BY的目的不包括计算,只是分组,那么用Distinct更快
浪漫烛光 www.langmanzg.com

11、一次更新多条记录比分多次更新每次一条快,就是说批处理好
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

------------------------------------------------------------------------
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

7,如何设置数Rrp!(Qvd=据库备份策略,使其可以回溯某个时间点的数据?
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

对于服务器数据的备份是比较麻烦的事情,如果每天或者经常要手工去备份自然是很痛苦的事情。这里我介绍一种通过sql server的作业调度来建立自动备份的方法:
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

1、进入企业管理器中->管理->sql server代理->作业;
浪漫烛光 www.langmanzg.com

2、新建作业,作业名称随便取,例如:data备份,所有者选择sa,当然你也可以选择其他用户,前提是该用户有执行作业的权限;
浪漫烛光 www.langmanzg.com

3、点击步骤标签,进入步骤面板。新建步骤,步骤名可以随便填写,如步骤1,类型和数据库默认,不需要修改。命令中写入以下语句:
浪漫烛光 www.langmanzg.com

BACKUP DATABASE [数据库名] TO  DISK = N'F:\data\数据库备份' WITH  NOINIT ,  NOUNLOAD ,  NAME = N'数据库 备份',  NOSKIP ,  STATS = 10,  NOFORMAT
浪漫烛光 www.langmanzg.com

注意:需要修改的地方,数据库名,DISK=(这里需要填写路径和你的数据库备份的名称)后面的Name=可以随便填写。
浪漫烛光 www.langmanzg.com

4、点击调度标签,进入调度面板,新建调度,名称随便填写,选择反复出现,点更X*Le:ysp5改可以选择你想要执行任务的随意调度。如每天,每2天,每星期,每月等。根据需要自己设置;
浪漫烛光 www.langmanzg.com

5、确定后,不要忘记一件事情,在你刚才建立的工作上点右键,启动工作,如果你的工作没有问题,将会提示执行成功,并有相对应的备份文件在你的磁盘上出现;
浪漫烛光 www.langmanzg.com

6、还有一个重要的问题就是你的sql server agent服务器已经启动。
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

如果我们需要根据每天的日期来生成一个新的备份,以便我们区别备份文件。这时,我们需要修改一下刚才的sql语句。参考实例: declare @filename nvarchar(100) set @filename='F:\AddIn\备份\data'+convert(char(10),getdate(),112) print @filename BACKUP DATABASE [addin] TO DISK = @filename WITH NOINIT , NOUNLOAD , NAME = N'addin 备份', NOSKIP , STATS = 10, NOFORMAT
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

-------------------------------------------------------
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

实现自动差异备份:
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

重要 当使用 BACKUP 语句的 FORMAT 子句或 INIT 子句时,一定要十分小心,因为它们会破坏以前存储在备份媒体中的所有备份。
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

示例
浪漫烛光 www.langmanzg.com

下例为 MyNwind 数据库创建一个完整的数据库备份和一个差异数据库备份。
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

-- Create a full database backup first.
浪漫烛光 www.langmanzg.com

BACKUP DATABASE MyNwind  
浪漫烛光 www.langmanzg.com

  TO MyNwind_1  
浪漫烛光 www.langmanzg.com

  WITH INIT
浪漫烛光 www.langmanzg.com

GO
浪漫烛光 www.langmanzg.com

-- Time elapses.
浪漫烛光 www.langmanzg.com

-- Create a differential database backup, appending the backup
浪漫烛光 www.langmanzg.com

-- to the backup device containing the database backup.
浪漫烛光 www.langmanzg.com

BACKUP DATABASE MyNwind
浪漫烛光 www.langmanzg.com

  TO MyNwind_1
浪漫烛光 www.langmanzg.com

  WITH DIFFERENTIAL
浪漫烛光 www.langmanzg.com

GO
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

================================================================================
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

【3.2】
浪漫烛光 www.langmanzg.com

select * from book where 1=1  SQL查询语句的含义
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

加上 1=1 的条件是为多个查询设计的,这样语句就可以逐渐加 and ... and ...
浪漫烛光 www.langmanzg.com

select * from book where 1=1 and id=2 and name='fish'
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

select * from book where 1=1
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

select * from book 一样。
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

写这个where 1=1 目的是为了sql语句条件拼接。
浪漫烛光 www.langmanzg.com

经常有复杂条件查询,查询的条件是可选的,所以有不加任何条件的时候。这时为了避免出现select * from book where(后面条件没选)出现,加上1=1,就比较通用了.
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

【2.14】
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

用IN,EXISTS和外连接进行双表查询的方法及效率比较:
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

(1) select * from t1 where object_id not in ( select object_id from t2);
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

(2) select * from t1 where not exists
浪漫烛光 www.langmanzg.com

  (select null from t2 where t2.object_id = t1.object_id);
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

Null在这里的目的,这里只是有没有符合条件的记录,对SELE的FIELDS没什么意义!
浪漫烛光 www.langmanzg.com

不用Null,应该也是可以的!
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

(如果是肯定性判断,可以这样写:
浪漫烛光 www.langmanzg.com

select * from t1 where exists(select 1 from t2 where t2.object_id=t1.object_id)
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

(3)select * from t1, t2
浪漫烛光 www.langmanzg.com

  where t1.object_id = t2.object_id and t2.object_id IS NULL;
浪漫烛光 www.langmanzg.com

(注意!这里不能直接用t1.object_id<>t2.object_id,是会产生错误的)
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

效率来说,根据不同的情况区分:
浪漫烛光 www.langmanzg.com

简单的说,外表数据量大内表小数据量时用IN,外表数据量小里内表数据量大时用EXISTS,查询原理不一样
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

【2.12】
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

如何删除数据表中的重复记录,其中一种方法
浪漫烛光 www.langmanzg.com


浪漫烛光 www.langmanzg.com

1、将重复的记录记入temp1表
浪漫烛光 www.langmanzg.com

select [标志字段id],count



  每当你几乎快被困难击倒,丧失斗志的时候,你就想想背后还有无数等你倒下捅刀子的SB,就充满了力量。
新用户注册   返回首页
首页  上一页  下一页  尾页  页次1/1   转到第