当前位置:文档之家› 数据库基本查询语句汇总

数据库基本查询语句汇总

在此申明
所有的 cxl
都只是一个名称,可以用任何名字替换的
Ps:本人QQ512842933 如有问题可以一起探讨。这都是自己手动输入,非转载




创建唯一约束(添加信息不能为重复,就是唯一约束)

alter table cxl
add constraint aa
unique (idcare)


创建check约束语句
alter table cxl
add constraint aa
check(tel like'0734-[0-9][0-9][0-9]')


创建默认约束 default
alter table cxl
add constraint aa
default '我爱你' for name


添加外键约束
alter table cxl
add constraint fk
foreign key ( )
references table2( )


删除外键约束
alter table cxl
drop constraint fk----这个fk就是你创建外键时候取的名字


添加主键约束
alter table cxl
add constraint pk
primary key ( )


改变主键

------先删除现有的主键,然后再改变主键(设置主键上面不能为空,不能有重复数据)


建立视图
create view v
as
select * from cxl
where


修改视图
alter view v
as
select name,age from cxl
where


更新视图记录
update v
set 列名=表达式---------set name='T-MAC' 这样视图里面name这个列的内容都变成麦蒂了



删除数据记录
delete from v where

----------在这里我说一下几个删除代码的用法
/* TRUNCATE TABLE:删除内容、释放空间但不删除定义。
DELETE TABLE :删除内容不删除定义,不释放空间。
DROP TABLE:删除内容和定义,释放空间。*/


删除试图
drop view v





事务演示(事务就是里面所有任务都成功了才能成功)
begin transaction ---------------开始事务
insert into cxl(name,age) values('刘德华','52')----------这里是事务里面插入的自定义数据
commit transaction ---------------结束事务




如何实现事务回滚(插入数据中有不能执行的,就回滚到插入以前的样子)

begin try
这里显示事务演示的代码,这里就不多弄了
end try
begin catch
rollback ---------------------回滚
end catch





保存事务(创建保存点)

begin transaction ---------------开始事务
insert into cxl(name,age) values('刘德华','52')----------这里是事务里面插入的自定义数据
save transaction save1 ---------------------------这里是创建保存点
rollback transaction save1-----------------回滚到save1
commit transaction ---------------结束事务




事务并发控制(就是设置一个统一的时间点进行)
begin tran
select * from cxl with(holdlock)----------------with(holdlock)这个意思是给查询上锁
waitfor delay '00:00:10' --------------等待10秒钟就解锁
commit tran


begin tran
update cxl set name='T-MAC' where age=31----------更新年龄为31的名字改为麦蒂
select * from cxl -------------------

-改完后查询表的内容
commit tran




创建触发器(1)(delete 触发器)

create trigger cxl------------------创建触发器名字是cxl
on student------------------------触发器在表student里面
after delete------------一旦执行删除命令,就会触发触发器
as
delete from name where age=20--当触发触发器后,就删除name表里面,年龄为20的数据


(每个触发器被激活时,系统都为它自动创建两个临时表inserted和deleted)

修改触发器

alter trigger cxl
on student
after delete
as
delete name from name where name.age=deleted.age
(最后一句的意思是:删除了student表里的数据,如果删除的那个数据年龄是25,那么触发器就自动会删除name表里的年龄为25的数据,在这里,deleted 就代表这上面的表 student删除的数据。我们在创建触发器的时候最后一句也可以直接改成这样,这样比较智能)





创建触发器(2)(insert触发器)
create trigger cxl
on student
after insert
as
select * from cxl -------这个触发器的意思就是当想student表中插入了数据,那么就会触发 显示cxl表中的所有信息






(对于数据库stu,创建一个触发器,student 表中插入的学生的年龄不能大于35,如果大于35,禁止插入数据,并在客户端显示‘'学生年纪不能大于35)

create trigger cxl
on student
after insert
as
if(select age from inserted)>35
begin
print '学生年纪不能大于35岁'
rollback transaction
end





创建触发器(3)(update触发器)

对于数据库stu,创建一个触发器,禁止修改student 表中的学号,并在客户端显示‘不能修改学号’

create trigger cxl
on student
after update
as
if update(sno)
begin
print '不能修改学号'
rollback transaction
end



创建触发器(4)(instead of 触发器)
对于数据库stu,创建一个触发器,不允许对student删除或修改记录时,同时客户端显示‘不允许增加或修改记录’

create trigger cxl
on student
instead of delete,update
as
print '不允许增加或修改记录'





暂停使用触发器
disable trigger cxl
on student


重新使用触发器
enable trigger cxl
on student



查看触发器基本信息 sp_help cxl

删除触发器 drop trigger cxl





SQL函数(自定义函数)
create function cxl (@a int ,@b int)
returns int ---------------------返回值是int类型
as
begin
declare @c int
set @c =@a+@b
return @c


下面我们来看看怎么调用这个我们定义的函数
declare @a1 int, @b1 int, @c1 int
select @a1=1 , @b1=2 , @c1=数据库名字.dbo.cxl(@a1,@b1)
print cast (@c1 as varchar(10) )--------因为@

c1是int类型,如果要打印出来,我们就要转为 varchar类型,所以这里用到了cast
end






创建表值函数

create function cxl(@classname varchar(20))
returns table
as
return(select * from student where classname=@classname)



调用这个表值函数
select * from cxl ('计信1034')



删除函数
drop function cxl




创建存储过程
create proc cxl
as
begin
select * from student
end


执行上面简单的存储过程

exec 数据库名字.dbo.cxl


修改存储过程
alter proc cxl
as
begin
select * from student where name='T-MAC'
end




带有参数的存储过程

create proc cxl
@classname varchar(20),
@age int
as
begin
select * from student where classname=@classname and age=@age
end




来看点稍微复杂点带有传出参数的存储过程(这里介绍的是利用 output,如果需要其他方法请自己百度 )
create proc cxl
@classname varchar(20),
@age int,
@maxscore int output, ---------output代表着传出参数
@avgscore int output,
@count int output
as
begin
select * from student where classname=@classname,
select * from student where age>@age,
select @maxscore=max(chinese) from student where classname=@classname and age>@age
select @avgscore=avg(chinese) from student where classname=@classname and age>@age
select @count=count(*) from student where classname=@classname and age>@age

end



如何调用上面稍微复杂的存储过程
declare @max1 int
declare @avg1 int
declare @count1 int
exec 数据库名字.dbo.cxl '计信1034',18,@max1 output,@avg1 output,@count putput

select '最高分'=@max1, '平均分'=@avg,'满足条件的人数'=@count1




删除存储过程
drop proc cxl


重命名存储过程
exec sp_rename 'cxl','newcxl'


监控存储过程
exec sp_monitor




申明游标
declare cxl cursor for------------申明一个游标cxl,类型为cursor
select * from student ----------------把查到的所有内容放到游标里
//for read only ---------------------这是申明为只读游标

for update of name----------这个我们就是申明一个可以更新的游标,并且规定了更新字段name



游标变量
declare @cxll cursor ---------------cursor 类型是游标类型
set @cxll=cxl




如何读取游标
open cxl
fetch next from cxl-----------------fetch意思就是拿、取
close cxl

释放游标
deallocate cxl




删除多余的数据(思路是,先查询不重复的记录插入到临时表中,然后把现有的表记录清空,然后再把临时表中的记录导入到现有的表中)
select distinct * into

#cxl from student
delete from student
select * into student from #cxl



条件删除

delete from cxl where name='T-MAC'


case表达式

select * ,sex=
case
when sex=‘true’ then sex='男'
when sex=‘false’ then sex='女'
end
from sudent




前面学习的都较难理解,现在中场休息,我们来学学简单的

创建数据库
create database cxl
on
(
name='cxl.mdf'
filename='e:\cxl.mdf'
size=5MB,
maxsize=10MB,
filegrowth=10%
)


新建表
create table cxl
(
id int primary key
name char(10) not null
)


修改数据库(增加一个数据库文件)
alter database cxl
add file
(
name='cxll.mdf',
filename='e:\cxll.mdf',
size=6MB
)



移除上面我们添加的数据库文件(数据库文件是存储数据的)
alter database cxl
remove file cxl.mdf



修改数据库名
exec sp_renamedb 'cxl','cxl2'

修改数据表名称
exec sp_rename 'cxl','cxl3'

修改数据库表
alter table cxl
add name char(20) default 'T-MAC'---------------------这样就添加了一个name字段,字段默 认为T-MAC


修改数据表字段
alter table cxl
alter column name varchar(20)-------把name数据类型改成了varchar


删除数据表字段
alter table cxl
drop column name ----------------------删除name字段


删除数据表
drop table cxl

如何往数据表中插入数据
insert into 数据表( ) values ( )



申明变量
declare @cxl varchar(50)
set @cxl='https://www.doczj.com/doc/7a13408620.html,'
print @cxl



全局变量

print @@identity --------------意思就是表中最后一次插入的值id是多少就返回多少

print @@servername ----------------------本地数据库服务的名称




删除表
if exists (select * from dbo.sysobjects where name='student')
drop table student
(上面的意思是,如果存在表student,那么就删除。dbo.sysobjects 这个是数据库中所有的表)




自定义数据类型
exec sp_addtype cxl, 'char(5)', 'not null'--------创建一个自定义类型cxl,这个类型是在原有的 char类型上,加了一个条件,not null



if语句进行条件判断(求三个数中最大值)
declare @a int
declare @b int
declare @c int
set @a=111
set @b=222
set @c=333
declare @cxl int
if (@a>@b)
set @cxl=@a
else
set @cxl=@b
if (@cxl>@c)
print @cxl
else
print @c






循环语句(1加到100)

declare @sum int
declare @i int
set @i=1
set @sum=0
while (@i<101)
begin

if(@i=50)---------------------------------如果i=50,那么就结束循环
break
set @sum=@sum+@i

set @i=@i+1
if(@i=5)----------------------如果i=5,那么就跳过5,直接执行i=6
continue
print @i-------------------------------------每次都打印i值的变化
end
print @sum






goto语句

declare @a int
select @a=100
flage1;------------------------这个目的是做个标记
print @a
select @a=@a+1
while @a<105 goto flage1---------如果@a<105,就让它返回到flage1






局部临时表

create table #cxl
(
id int
name varchar(50)
)


select * into #cxl from student -------------把student表中所有记录插入到临时表中



全局临时表
create table ##cxl

全局临时表就是所有用户都可以访问的,局部临时表就只是创建人可以使用





in运算符(查询年龄18、19、25岁的人)
select * from student where age in (18,19,25)

限制返回行数
select top(10) * from student

随机查询(随机查询三条记录)
select top(3) * from student order by newid()----order by newid()这个是随机查询



去除重复记录
select distinct * from student



显示行号
select 查询行号=identity( int,1,1), * into #cxl from student
select * from #cxl ----------这里利用了临时表



子查询
select * from news where classid in (select id from newclass where parentid=1 )



模糊查询
select * from student where name like '曹%'

select * from student where name like '刘%[^王]'-----------刘开头,不以王结尾的名字


中括号匹配
select * from student where tel like '0734-[0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
select * from student where name like '[lcz]%'
select * from student where age l ike '[^1-1]_'
select * from student where (name+classname like '%[一刚]%')-------------多个字符的匹配查询



转义字符
select * from student where name like '%100/%%' escape'/'-------------查询姓名为fly100%的人



空值转为实际值(也就是用到case语句)
select *,english=
case
begin
when english is null then '暂无成绩'
when english is not null then cast (english as varchar(10)) --------cast是转数据类型
end
from student



con
vert 函数

select convert (varchar(20),getdate(),101) as 时间格式---------第一个参数是数据类型,中间的是主关键字,最后一个是显示的形式,比如101,显示的日期就是mon,ddyy(这个是把日期类型转变为字符)



select convert(daetime,'2012-03-30') as 当前日期



去除字符串尾部空格
select rtrim('无聊的函数 ') as title------------去除右边空格
select ltrim(' 无聊的函数')as title -----------------

去除左边空格



截取字符长度

select substring('512842933@https://www.doczj.com/doc/7a13408620.html,',1,9) as title-------从第一个开始截图,截图九个字符



字符串中插入另一个字符串
select stuff ('512842@https://www.doczj.com/doc/7a13408620.html,',7,0,'933')as title ------------------从第7个字符开始,删除0个 字符,添加了933



返回字符串的长度

select len ('512842933') as title



大小写转换
select lower ('CXL') as title---------------全部转为小写
select upper ('cxl') as title---------------全部转为大写

select lower(name) as newname from student



去掉字符串中特殊符号
select replace ('刘德华刘德华刘德华','刘','')-------------把刘替换成空



返回一个字符在另一个字符串中的位置
select charindex ('@','512842933@https://www.doczj.com/doc/7a13408620.html,',) as title -------------@在邮箱中的位置
这个函数可以和substring函数一起用




日期相关的函数
select getdate() as time ----------------------获取系统当前时间
select year/month/day(getdate()) as time---------获取年或月或日
select convert (varchar(20),getdate(),8) as time---------只提取时间




如何查询今天星期几
select datename(dw , getdate()) as title ----------------dw等于weekday
select datename(ww,'2013-03-30')as title


year=yy quarter=qq(一刻钟)
month=mm dayofyear=dy(一年当中第几天)
day=dd week=wk
weekday=dw hour=hh
minute=mi second=ss
ww=一年当中第几周




计算两个日期之间天数差
select datediff(day,'2012-03-30','2013-03-30') as 相差天数


delete from student where datediff(yy,entime,getdate()) >3-------------删除时间差大于三 年的数据



增加指定天数

select dateadd (d ,3,entime)as 新的入学时间 from student-------------增加了3天



字段排序
select * from student order by name collate chinese_prc_stroke_cs_as_ks_ws----------姓氏笔画进行排序

select * from student order by age asc, id desc-------先按年龄排序,然后按id排序


select * from student order by name collate chinses_prc_cs_as -----------按照首字母排序




动态排序
declare @cxl int
set @cxl=1
select * from student order by case @cxl
when 1 then chinese
when 2 then math
end




聚合函数(对一组的值进行计算,返回一个值)
求一个班全部同

学的语文成绩总和
select sum(chinese) from student



count函数

select count(*) from studen where classname='计信1034'---------------班级一共有多少人


select count(distinct classname) from student--------------统计有多少个班级



求一个表里的最小大值
select min(age) from student -----------------------年龄最小的
select max(age) from student -----------------------年龄最大的
select * from student where age(select min(age) from student)




having 字句

select classname,count(classname) as 班级人数 from student group by classname having count(classname) >2 order by 班级人数 ------------having只运用于聚合函数




批量插入
insert into cxl
select 1,'刘德华',1961
union select 1,'刘德华',1961
union select 1,'刘德华',1961 --------------------这样就可以批量插入数据了





更新列值
update cxl set name='cxl' where name='T-MAC'


update cxl set classname=classname+'1' where id=1





相关主题
文本预览
相关文档 最新文档