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