--简单总结一下sql吧,知识点比较全面,也很简单,比较适合初学者和像我一样基础偏差的同学吧
sp_helpdb MyDB--查询数据库
alter database mydb modify name=youdb--修改数据库名称
alter database youdb modify name=mydb
alter database mdb--修改数据库文件大小
modify file
(
name=mydb_dat,
size=8MB,
filegrowth=1mb
)
alter database mdb--增加数据库文件组
add file
(
filename='F:\练习\serql server\mdb\mdb_dat1.ndf',
name=mydb1_dat,
size=7MB,
filegrowth=2mb
)
drop database mdb--删除数据库
exec sp_detach_db mdb --分离数据库
exec sp_attach_db mdb,'F:\练习\serql server\mdb\mdb_dat2.mdf'--附加数据库
backup database mdb to --备份数据库
disk='D:\data\beifen_dat.dat' with name='backup'
restore database mdb from --还原数据库
disk='D:\data\beifen_dat.dat' with replace
backup database ABC to --备份数据库
disk='D:\beifen_dat.dat' with name='backup'
use mdb--新建表
create table sales
(
order_no int not null,
order_date datetime not null,
ship_date datetime not null
)
select*from sales--查看表
drop table sales--删除表
create table sells --创建表里的行value
(
number int ,
name varchar(20),
price money ,
amount as number*price,
indate as getdate(),
usename as user_name()
)
select *from sells
exec sp_addtype nameType ,'nvarchar(20)', 'NOT NULL'--自定义数据类型
exec sp_droptype nametype --删除自定义类型
create table sell--使用自定义数据类型
(
id int not null,
col1 nametype
)
select*from sell
insert into sell values(123,'猪')--放入value
create table a--创建表
(
[no] int not null,
col1 nametype,
price money,
amount as [no]*price,
indate as getdate(),
usename as user_name()
)
select*from a
insert into a values(123,'猪',3 )--放入value
declare @t table --表变量,执行完生命周期结束
(
col1 int ,
col2 varchar(10)
)
insert into @t values (1,'你好')
select *from @t
alter table a --添加列
add id int null,
email char(20) null
alter table a --修改列的取值
alter column email varchar(10)null
alter table employee--删除列
drop column email
create table customers--创建表时添加主键,customerno为自动增长
(
CustomerNo int identity primary key,
CustomerName varchar(30) not null
)
select *from customers
insert into customers values ('猪')
alter table a--在现有表中添加主键
add constraint pk_no
primary key (no)
create table orders --使用外键创建一个表
(
OrderID int identity primary key ,
Customerno int not null foreign key references Customers(customerno)
)
insert into orders values ( 1)
select *from av where customerno=1 --视图联系两个表(通过外键)
create table shippers--创建唯一约束
(
shipperid int identity not null
primary key ,
phoneno varchar(14)not null unique
)
select *from shippers
alter table shippers--在已存在表中创建唯一约束
add constraint AK_shippersphoneno
unique(phoneno)
--check约束
--限制列为合适的数字 between 1 and 2
--合适的格式--like ''
--限制一个字段为特定列表in(‘ups’,‘fed ex’,‘ups’)
--价格必须为正--unitPrice>=0
--在同一行中引用另外一行 shipDate<=GetDate())
alter table customers--check约束
Add constraint cn_customerdateinsystem
Check
(Dateinsystem<=GetDate())
create table shipper--创建默认值
(
shipperid int identity not null primary key ,
dateinsystem smalldatetime not null default getdate()
)
alter table customers --在已存在的表中穿件默认值
Add constraint cn_customerdefaultinsystem
default getdate() for dateinsystem
select *from products
select productID, productname ,categoryID,unitprice from products--根据字段名查一个表的字段信息
--like只可用于:char,nchar,varchar,nvarchar,datetime
--通配符的种类
--% 0或多个字符窜
--_任何单个字符
--【】在指定区域或集合内的任何单个字符
--【^】不再指定区域或集合内的任何单个字符
select productname from products--练习like
where productname like 'ch% '
select productname from products
where productname like '[^c,A]%'
select productname from products
where productname like '[c][^h,_]%'
--优先级 not,and,or
select productid ,productname,supplierid,unitprice from products--使用逻辑运算符
where (productname like 'T%' or productid =46)
and(unitprice>16)
select productid from products --检索一定范围内的值
where productid between 1 and 5
select*from suppliers
select supplierid ,companyname,country from suppliers--使用值列表作为搜索条件
where country in ('usa','japan')
select companyname ,country,fax--查询companyname和fax字段,fax为null的字段
from suppliers where fax is null
select *from orders order by employeeid--根据列排序
select employeeid, orderid ,customerid,orderdate,shipregion from orders
where shipregion is null order by employeeid
select orderid ,customerid,orderdate,shipregion from orders--倒序
where shipregion is null order by orderid desc
select *from suppliers
select country from suppliers order by country
select distinct country from suppliers order by country--使用distinct关键字查询列并去除重复值
select top 10 supplierid ,companyname,contactname, country from suppliers order by country --根据国家列的前十个找出列的相关信息
select top 10 country ,fax from suppliers where fax is not null order by country
select top 50 percent country ,fax from suppliers where fax is null order by country --top n percent
--avg 计算表达式中的平均值
--count 表达式中值的数目
--count(*)所选择行的数目
--max 表达式中的最大值 min 表达式中的最小值 sum计算表达式中所有值的和
--stdev样本标准差 staevp填充标准偏差 var样本方差 varp总体方差
select top 10 *from [order details]
select * from [order details]
select * from [order details] order by productid
select top 10 productid ,sum(quantity)as quantitysum --聚合函数
from [order details ] group by productid order by productid
select count(*) productid from [order details] group by productid--按productid分组,并计算行数
select productid ,sum(quantity), count(*)productid from [order details] group by productid order by productid--按产品编号得出产品销售总额和总数
select productid ,sum(quantity), count(*)productid from [order details] group by productid having sum(quantity)>1000 order by productid--having给出范围,注意having的位置
select *from customers
select*from employees
insert customers select--将employees表的信息插入到customers表中
substring (firstname,1,3)+substring(lastname,1,2),lastname,firstname,title,address,city,
region,postalcode,country,homephone,null
from employees
select customerid from customers where customerid in ('Nanda','Andfu')
select *from products--创建一个临时表,并把查询部分数据插入到临时表中,注意要制定临时表名
select productname as products,unitprice as price ,
(unitprice*0.1) as tax
into #pricetable from products
select *from #pricetable
select*from shippers--两种向shippers表单个字段插入数据的方法
insert shippers values('Fitch & Mather',null)
insert shippers (companyname)
values ('Fitch & Mather')
select * from shippers
where companyname = 'Fitch & Mather'
create table lianxi--在delete语句中加入where语句,否则将删除所有行,可使用top限制删除的行
( stuno int identity primary key,
stugrade int not null,
stuage int not null
)
insert lianxi values(1,7)
insert lianxi values(2,8)
insert lianxi values(3,9)
insert lianxi values(4,10)
select *from lianxi
delete lianxi--删除表中所有行,删除后添加数据只能从删除前的行数开始递增,delete直接加表名
delete lianxi where stugrade=2
delete top(5) from lianxi --删除前几行 top后的行数得加上括号
drop table lianxi
truncate table lianxi --删除表中的所有行,删除后添加数据仍从0开始自动增长,truncate还得加上table关键字
update lianxi--更新表的字段数据
set stugrade=(stugrade+1),stuage=(stuage+2)
create table nianxi
( no int identity primary key,
grade int not null,
age int not null
)
insert nianxi values(1,7)
insert nianxi values(2,8)
insert nianxi values(3,9)
insert nianxi values(4,10)
select *from nianxi
select *from lianxi
select lianxi.*,nianxi.no from lianxi inner join nianxi on lianxi.stuno=nianxi.no--内连接将两个表的信息根据一个或几个相同字段记录匹配在一起
select lianxi.*,nianxi.* from lianxi inner join nianxi on lianxi.stuno=nianxi.no
select*from authors--多表内连接查询
select*from titleauthor
use pubs
select a.au_lname+', '+a.au_fname as author,t.title from authors a
join titleauthor ta on a.au_id=ta.au_id join titles t on t.title_id=ta.title_id
use northwind
select *from lianxi where stuno in (1,2)--in关键字进行子查询,返回子查询条件的所有数据
select*from lianxi where exists(select*from nianxi where grade =6)--子查询,如果括号里为真的话就返回这个前面表的信息,否则只返回前面表的字段
select orderid,freight from orders where freight >--Any表示如果返回值中至少有一个值 的比较为真,就满足搜索条件
any (select sum(unitprice)from [order details] group by orderid)
--类型转换函数
--cast(expression as data_type )
--convert (data_type,expression[,style] convert还提供一些日期格式的转换
select 'the sudent age is '+cast(stuage as varchar(10))as age--cast类型转换,注意插入字符窜的用法
from lianxi where stugrade in(1,3)
--索引
--创建唯一索引,可强制值的唯一性 ;在创建了索引的列上修改数据,将自动更新相关联的索引
--聚集索引clustered,根据键值对行排序,每个表只有一个聚集索引
----键值的唯一性可通过unique关键字显式维护
----聚集索引会自动排列键值的顺序
--非聚集索引,键值包含指向表中存储位置的指针
----若未指定索引类型,则默认为非聚集索引,每个表最多有249个非聚集索引,nonclustered
--适合建立索引
--------------经常被查询搜索的列,如where子句中的列
--------------在Order By子句中使用的列
--------------外键或主键列
--------------值惟一的列
--------------常以排序形式访问的列
--唯一索引确保索引列上的数据都是唯一的,不包含重复值,unique,当向唯一索引的表插入数据时,数据库会检查新添加的值,如果重复则不能添加
--定义了primary key约束和unique 约束的列自动创建唯一索引
create unique index stuindex--为表的某个字段创建唯一索引
on lianxi(stugrade)
select*from lianxi
insert lianxi values(4,10)--唯一索引的字段数据重复,不允许插入
delete lianxi where stugrade=5
create unique index stuindex1 on lianxi(stugrade,stuage)--为两个字段加上唯一索引
create table lianxi1--对上面聚集索引定义做的一个小例子,聚集索引会自动根据数据行的键值排序
( stuno int not null ,
stugrade int not null,
stuage int not null
)
create unique clustered index stuindex on lianxi1 (stuno )--括号后面加上desc为倒序
insert lianxi1 values(6,7,2)
insert lianxi1 values(4,12,3)
insert lianxi1 values(5,8,1)
insert lianxi1 values(3,11,13)
insert lianxi1 values(2,10,4)
insert lianxi1 values(1,9,5)
select*from lianxi1
exec sp_helpindex lianxi1 --查询索引
drop index lianxi1.stuindex--删除索引
--视图是一种虚拟表,对用户只显示特定数据,创建视图得注意权限问题,最好使用一个特定的命名规则来区分视图和表
--create view 语句不能包含compute或compute by子句,也不能包含into关键字
--仅当使用top关键字时,create view语句才能包括order by 子句
--视图不能引用临时表,不能超过1024列
select *from view_1
select *from nianxi
create table lianxi2
( stuno int not null foreign key references lianxi1(stuno) ,
stuphone int not null,
stuemail int not null
)
insert lianxi2 values(6,111111,712)
insert lianxi2 values(3,43333,123)
insert lianxi2 values(1,2222,83)
insert lianxi2 values(4,33333,111)
insert lianxi2 values(2,4555,103)
insert lianxi2 values(5,3666,91)
select *from lianxi1--使用视图通过外键将两个表联系起来,注意改下别名
select*from lianxi2
select*from view_1 order by stuno
select dbo.lianxi1.*, dbo.lianxi2.stuphone, dbo.lianxi2.stuemail--上面的视图就相当于这里的内连接
from dbo.lianxi1 inner join
dbo.lianxi2 on dbo.lianxi1.stuno = dbo.lianxi2.stuno
--创建视图
create view view_student as select stuno ,stuphone from lianxi2
select*from view_student
drop view view_student
--在视图上如果想创建一个索引,必须先实现一个唯一聚集索引
--数据改变时,唯一聚集索引会自动更新
insert lianxi1 values(7,12,5)
insert lianxi2 values(7,22222,3333)
create view dbo.view_student with schemabinding--为视图创建唯一聚集索引
as select stuno ,stuphone from dbo.lianxi2
create unique clustered index stuindex on dbo.lianxi2(stuno)
--事务
-- begin transaction 标记显式连接事务的起始点
--commit transaction 或commit work
----如果没有遇到错误,可使用该语句成功的结束事务
----该事务中的所有数据修改在数据库中都永久有效
----事务占用的资源将被释放
--rollback transaction 或rollback work
----用来清除遇到的错误
----该事务修改的所有数据都返回到事务开始的状态
----事务占用的资源也将释放
begin transaction--加入异常处理
begin try
insert into lianxi1 values (10,3,4)
insert into lianxi1 values (2,3,4)
commit transaction
end try
begin catch
print 'false'
rollback transaction--遇到错误回滚到当前状态
end catch
select *from lianxi1
--存储过程
declare @pic float --申明变量
select @pic=sum(stuage)from lianxi1
if @pic >20
begin print 'more 20'
end
else
begin
print'less 20'
end
select stuno ,stuage%2 as grade, age= --case语句
case stuage%2
when 1 then 'good'
when 2 then 'well'
else 'great'
end
from lianxi1
declare @i int --while循环,声明变量
set @i=1
while @i<10
begin
print @i
set @i=@i+1
end
waitfor delay'00:00:05' print '5 second past' --等待5秒钟之后再打印
waitfor time '09:58' print 'the time is 9:58'--等待到特定的时间执行操作
waitfor delay'00:00:05' select*from lianxi1
--try catch 不能跨越多个批处理,不能跨越多个t-sql语句块,例不能跨越两个begin。。end语句块,且不能跨越if。。else构造
begin try
select 1/0
end try
begin catch
select
error_number() as errornumber,--返回错误号
error_severity() as errorseverity,--返回严重性
error_state() as errorstate,--返回错误状态号
error_procedure()as errorprocedure,--返回出现错误的存储过程或触发器的名称
error_line() as errorline,--返回导致错误的例程号的行号
error_message() as errormessage --返回错误信息的完整文本
end catch
create procedure cunchu as select*from lianxi1 --创建存储过程
exec cunchu--执行存储过程
drop procedure cunchu1--删除存储过程
--修改存储过程
alter procedure cunchu as select stuno ,stuage from lianxi1
create procedure cunchu1--创建有参的存储过程吗
@no int ,
@grade int output ,--声明为output参数,用于后面请求输出
@age int output
as select @age=stuage ,@grade=stugrade from lianxi1 where stuno=@no --根据编号,查找学生的年纪和年龄
declare @grade int , @age int --执行存储过程得先申明上面存储过程的变量
exec cunchu1 5 ,@grade output,@age output--执行存储过程,output请求输出参数
print @age --打印,注意打印格式(分开打印)
print @grade
--------用户定义函数
--标量函数:返回一个标量(单值)结果,可以在任何需要他们返回值的数据类型的地方使用
--表值函数:返回table数据类型,只能用在select语句的from子句中
--内置函数:系统提供的,既可以返回标量的,也可以返回table数据类型
--create function 数据库名.架构名.函数名(参数)
--函数创建时使用schemabinding选项进行架构绑定,创建后所引用的数据库对象不能被更改
--alter function更改函数,使用心得函数定义来代替原来的函数定义,drop function 删除自定义函数
--创建标量函数
create function dbo_dateformat (@indate datetime ,@separator char(1))
returns nchar(20) as
begin
return
convert(nvarchar(20),datepart(mm,@indate))
+@separator +convert(nvarchar(20),datepart(dd,@indate))
+@separator +convert(nvarchar(20),datepart(yy,@indate))
end
select dbo.dbo_dateformat(getdate(),'|')--select,print 两种使用自定义函数打印参数结果
print dbo.dbo_dateformat(convert(datetime,'2007-7-7'),':')
drop function dbo_dateformat
--触发器
--触发器是一种特殊的存储过程,与表紧密相连,可以看做表定义的一部分,当用户修改指定表或试图中的数据时,触发器会自动运行
--create trigger 触发器名字
--on 表名或视图名
--with encryption
--{for|after|instead of}{delete|insert|update}--for和after的作用相同,都是在触发器指定的事件之后,第二个括号里的操作可以有多个
--as 操作sql语句
select*from roc
drop table roc
create table roc --创建一个日志记录表
(
id int identity primary key ,
stuno int ,
stugrade int ,
stuage int ,
date as getdate()
)
create trigger lianxi1_insert --创建触发器,一旦基表执行相应操作(本例操作为insert),则触发器向日志表里添加相应操作记录
on
lianxi1--触发器一旦创建,则基表和日志表里的表名,字段名都不能更改
after insert--这里只是一个insert例子
as
begin
declare @stuno int ,@stugrade int ,@stuage int
select @stuno=stuno ,@stugrade=stugrade,@stuage=stuage from inserted
insert into roc values ( @stuno, @stugrade, @stuage)
end
insert into lianxi1 values (12,4,2)
insert into lianxi1 values (13,5,2)
insert lianxi1 values (15,4,2)
select*from roc
select *from lianxi1
--累死了,根据老师的课件及自己的理解总结一下,真是相当累,不过收获还是相当大的,
--很适合自己以及和我一样基础偏差的同学,简单总结一下,努力加油吧