sql学习进程

一.DDL(data define language)

1.create database:

create database test
on
(
 name=test_dat,
 filename='c:\test.mdf',
 size=5MB,
 maxsize=25MB,
 filegrowth=5MB

)
log on
(
 name=test_log,
 filename='c:\test.log',
 size=5MB,
 maxsize=10MB,
 filegrowth=5%
)

 

2.alter datebase:

A. 向数据库中添加文件

下例创建数据库,并更改该数据库以添加一个 5 MB 大小的新数据文件。

USE master
GO
CREATE DATABASE Test1 ON
(
 NAME = Test1dat1, 
 FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\t1dat1.ndf',
 SIZE = 5MB,
 MAXSIZE = 100MB,
 FILEGROWTH = 5MB
)
GO
ALTER DATABASE Test1 
ADD FILE 
(
 NAME = Test1dat2,
 FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\t1dat2.ndf',
 SIZE = 5MB,
 MAXSIZE = 100MB,
 FILEGROWTH = 5MB
)
GO
B. 向数据库中添加由两个文件组成的文件组

下例在示例 A 中所创建的 Test1 数据库中创建一个文件组,并将两个 5 MB 的文件添加到该文件组。然后下例将 Test1FG1 设置为默认文件组。

USE master
GO
ALTER DATABASE Test1
ADD FILEGROUP Test1FG1
GO

ALTER DATABASE Test1 
ADD FILE 
( NAME = test1dat3,
  FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\t1dat3.ndf',
  SIZE = 5MB,
  MAXSIZE = 100MB,
  FILEGROWTH = 5MB),
( NAME = test1dat4,
  FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\t1dat4.ndf',
  SIZE = 5MB,
  MAXSIZE = 100MB,
  FILEGROWTH = 5MB)
TO FILEGROUP Test1FG1

ALTER DATABASE Test1
MODIFY FILEGROUP Test1FG1 DEFAULT
GO
C. 向数据库中添加两个日志文件

下例向数据库中添加两个 5 MB 大小的日志文件。

USE master
GO
ALTER DATABASE Test1 
ADD LOG FILE 
( NAME = test1log2,
  FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\test2log.ldf',
  SIZE = 5MB,
  MAXSIZE = 100MB,
  FILEGROWTH = 5MB),
( NAME = test1log3,
  FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\test3log.ldf',
  SIZE = 5MB,
  MAXSIZE = 100MB,
  FILEGROWTH = 5MB)
GO
D. 从数据库中删除文件

下例将示例 B 中添加到数据库 Test1 中的一个文件删除。

USE master
GO
ALTER DATABASE Test1 
REMOVE FILE test1dat4
GO
E. 更改文件

下例将示例 B 中添加到数据库 Test1 中的一个文件增加大小。

USE master
GO
ALTER DATABASE Test1 
MODIFY FILE
   (NAME = test1dat3,
   SIZE = 20MB)
GO
F. 将主文件组设置为默认文件组

假定原来另一个文件组设置为默认文件组,下例将主文件组设置为默认文件组。

USE master
GO
ALTER DATABASE MyDatabase 
MODIFY FILEGROUP [PRIMARY] DEFAULT
GO
 

 

3.drop database:

drop database  test1,test2

 

 

4.create table:

create table test

(

id int primary key not null,

name nvarchar(30),

sex bit,

describ nvarchar(500)

)

 

5.alter table:

alter table test

add column sys_instime datetime,

drop column sys_instime

alter column sys_instime year

 

      6.drop table:

     drop table test

     7.truncate table:删除表中的数据连同日志,即如果使用id为自增长,则删除之后id将从0开始

      truncate table test

 

    8.create index:(事先排序,如字典中的索引)

    唯一索引:create unique index i_name

    on test(name desc,sex)

    聚集索引:create clustered index i_name on test(name)

   非聚集索引:create nonclustered index i_name on test(name)

   复合索引:create index i_nameage on test(name,age)

    9.drop index:

    drop index test.i_name

二.DML(data manage language)

select:

where子句通配符:like '%a' "%a%" '_a' '[ab]%'(以ab开头的) '[^ab]'(不以ab开头的)

top:

select top 1 * from test;

select top 50 percent * from test;

    in:

select  * from test where age in(1,2)(年龄在一,2之间)

not in :一样用法

 

多表查询:

1.直接引用两个表:select * from test a,test1 b where a.cid=b.cid

2.join:select * from test a inner join test1 b on b.cid=a.cid

full join 左右两个表的所有记录以及他们的匹配情况。

3.union:合并查询结果集,distinct相同记录

union all:不 distinct相同记录

 

数据导入和备份:

1.select * into test_bak  from test (单表导入)

select a.name,b.age into test_bak from test a inner join test1 b on b.pid=a.pid ;或者(where a.pid=b.pid)(多表导入)

同时也可以指定导入到其他数据库:select * into test_bak in test3.mdf  from test

2.insert into test_bak select * from test

3.从其他表中导入数据更新现有数据:

update test a set a.remark=b.remark from test1 b where a.cid=b.cid 

 

4.函数:

sqlserver 内建日期函数:

  getdate():

  datepart():d=datepart(qq,getdate())(季度),datepart(dy,getdate())一年中第几天,

datepart(ww,getdate())(第几周),datepart(dw,getdate())一周中第几天,

 

datepart 缩写
yy, yyyy
季度 qq, q
mm, m
年中的日 dy, y
dd, d
wk, ww
星期 dw, w
小时 hh
分钟 mi, n
ss, s
毫秒 ms
微妙 mcs
纳秒 ns
datepart 缩写
yy, yyyy
季度 qq, q
mm, m
年中的日 dy, y
dd, d
wk, ww
星期 dw, w
小时 hh
分钟 mi, n
ss, s
毫秒 ms
微妙 mcs
纳秒 ns

dateadd:在日期中加减。

select dateadd(yy,-2,getdate())

datediff():返回两个日期之间相差的年数,月数,日数,由datepart参数决定

select datediff(mm,'2010-1-1','2010-2-1')

convert().

select convert(nvarchar(30),getdate(),23)

year:

select year/month/day(getdate())

 

Sql null:

select isnull(name,'') from test

cast:

cast(name as nvarchar(30))

exp:求e的n次方

EXP(0)

log:求对数

log10:求底为10对数

square:求平方

sqrt:求平方根

STR:SQRT可以将数值型转换为字符型资料,允许控制小数的格式。
    语法:STR(float_expression[,length[,decimal]])
    变量:length:想要的字符串的总长度。缺省为10。
     decimal:是小数点右边的位数。四舍五入。如果不写长度则为取整,小数后四     
             舍五入。
left:从左边取多少位

left(name,3)从左起取三个。

right:从右边取多少位

right(name,3)

REVERSE:REVERSE返回字符串表达式的倒序。
    语法:REVERSE(character_expression)
    例如:REVERSE(‘PAM’)结果为‘MAP’
LTRIM:LTRIM删除字符表的前导空格。
    语法:LTRIM(character_expression)
         变量是字符表达式。
RTRIM:RTRIM删除字符表的后继空格。
    语法:RTRIM(character_expression)
         变量是字符表达式。

NULLIF:如果一对表达式相等,NULLIF函数就返回NULL,如果它们不相等,NULLIF函数就返回第一个表达式的值。
  语法:NULLIF(expression1,expression2)
  变量:expression可以数值型,也可以是字符串。
  例如:SELECT NULLIF(134,135)返回值为134。
PI:PI函数返回pi的值3。1415926
REPLACE:REPLACE用串表达式3取代串表达式1中的表达式2。
  语法:REPLACE(‘string1’,‘string2’,‘string3’)
  例如:SELECT REPLACE(‘mydog’,‘dog’,‘car’)
STUFF:替换指定位置的字符。
    语法:STUFF(character_expression,start,length,character_expression)

例如:select stuff('abcdefg',5,1,'1')

substring:返回指定位置的字符。从第五个开始,去一个,即结果为e,取两个的话,结果为ef

例如:select substring('abcdefg',5,1)

 

replicate:重复字符串个数

如:select replicate('a',5)

SQL Server 数据类型

Character 字符串:

 

数据类型 描述 存储
char(n) 固定长度的字符串。最多 8,000 个字符。 n
varchar(n) 可变长度的字符串。最多 8,000 个字符。  
varchar(max) 可变长度的字符串。最多 1,073,741,824 个字符。  
text 可变长度的字符串。最多 2GB 字符数据。  

Unicode 字符串:

 

数据类型 描述 存储
nchar(n) 固定长度的 Unicode 数据。最多 4,000 个字符。  
nvarchar(n) 可变长度的 Unicode 数据。最多 4,000 个字符。  
nvarchar(max) 可变长度的 Unicode 数据。最多 536,870,912 个字符。  
ntext 可变长度的 Unicode 数据。最多 2GB 字符数据。  

Binary 类型:

 

数据类型 描述 存储
bit 允许 0、1 或 NULL  
binary(n) 固定长度的二进制数据。最多 8,000 字节。  
varbinary(n) 可变长度的二进制数据。最多 8,000 字节。  
varbinary(max) 可变长度的二进制数据。最多 2GB 字节。  
image 可变长度的二进制数据。最多 2GB。  

Number 类型:

 

数据类型 描述 存储
tinyint 允许从 0 到 255 的所有数字。 1 字节
smallint 允许从 -32,768 到 32,767 的所有数字。 2 字节
int 允许从 -2,147,483,648 到 2,147,483,647 的所有数字。 4 字节
bigint 允许介于 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之间的所有数字。 8 字节
decimal(p,s)

固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。

p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。

s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。

5-17 字节
numeric(p,s)

固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。

p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。

s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。

5-17 字节
smallmoney 介于 -214,748.3648 和 214,748.3647 之间的货币数据。 4 字节
money 介于 -922,337,203,685,477.5808 和 922,337,203,685,477.5807 之间的货币数据。 8 字节
float(n) 从 -1.79E + 308 到 1.79E + 308 的浮动精度数字数据。参数 n 指示该字段保存 4 字节还是 8 字节。float(24) 保存 4 字节,而 float(53) 保存 8 字节。n 的默认值是 53。 4 或 8 字节
real 从 -3.40E + 38 到 3.40E + 38 的浮动精度数字数据。 4 字节

Date 类型:

 

数据类型 描述 存储
datetime 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 3.33 毫秒。 8 bytes
datetime2 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 100 纳秒。 6-8 bytes
smalldatetime 从 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度为 1 分钟。 4 bytes
date 仅存储日期。从 0001 年 1 月 1 日 到 9999 年 12 月 31 日。 3 bytes
time 仅存储时间。精度为 100 纳秒。 3-5 bytes
datetimeoffset 与 datetime2 相同,外加时区偏移。 8-10 bytes
timestamp 存储唯一的数字,每当创建或修改某行时,该数字会更新。timestamp 基于内部时钟,不对应真实时间。每个表只能有一个 timestamp 变量。  

其他数据类型:

 

数据类型 描述
sql_variant 存储最多 8,000 字节不同数据类型的数据,除了 text、ntext 以及 timestamp。
uniqueidentifier 存储全局标识符 (GUID)。
xml 存储 XML 格式化数据。最多 2GB。
cursor 存储对用于数据库操作的指针的引用。
table 存储结果集,供稍后处理。

 

 合计函数:

where 不能与合计函数一起使用,所以引入having:

select name,sum(age) from test group by name  having sum(age)=14

lower()小写,upper()大写,substring(column,start,length),len()取长度,round(column,保留位数)四舍五入函数

 

三.高级应用:

存储过程:begin ,end相当于花括号而已

例3、create procedure goods_ordersum
           @goodsname varchar(20),//输入参数
           @ordersum money output//输出参数
as
  sql_statements
例4、create procedure goods_order2//默认值
                         @goodsname varchar(20)=null
as
  sql_statements

触发器:

限制:1、在调用CREATE TRIGGER语句时,它必须为批中的第一个语句。
2、        触发器的基表不能为视图。
3、        WRITETEXT语句和TRUNCATE TABLE语句对触发表的资料操作不能激活触发器。
4、        由于触发器的主要用是检查和修改资料,所以在触发器不要使用能够返回结果集合的要SELECT语句和变量赋值语句。如果确实需要在触发器对变量赋值,应在触发器定义开始部分使用SET NOCOUNT语句禁止SQL SERVER返回结果集合。

例如:

create trigger tr_test on test
for insert,delete,update

as
set nocount on
update test set age=2

 

函数:只返回一个结果集

如:create function dbo.getname()

(

    id as int

)

returns nvarchar(4000)

as

begin

sql_statements

end

游标:对表中的指定列进行操作

DECLARE _cursor CURSOR SCROLL FOR --定义游标,并让其指向查询出来的记录
SELECT subname FROM bzk_school_position a,bzk_school_sp b
where b.school_per_cid=@cid and b.position_cid=a.cid
OPEN _cursor--打开游标

 

FETCH NEXT FROM _cursor INTO @subname--把游标指向的第一个记录赋给中间变量
WHILE @@FETCH_STATUS = 0--当游标指向不为空的时候,循环
BEGIN
    set @result=@result+@subname+'、'--把每次循环的值依次累加给返回变量
    FETCH NEXT FROM _cursor INTO @subname --游标指向下一个记录
END
CLOSE _cursor--关闭游标
DEALLOCATE _cursor--释放游标

 

 

系统存储过程:sp_tables/columns 查sql帮助

 

事务处理:

begin tran//开始事务处理

declare @error1 int  //设置变量接收异常
set @error1=0     //初始化为0
delete...
set @error=@@error+@error1 //累加异常
delete...
set  @error=@@error+@error1 //累加异常
if @error<>0        //如果有异常 回滚
rollback tran
else
commit tran         //否则提交
go

你可能感兴趣的:(sql,SQL Server,qq,Microsoft,Go)