SQL 2005(三)

添加外键约束:
比如说我们有两张表(t1,t2),都有一个公共字段s_no,这里涉及到两张表的关系,我们修改的是从表,是外键必然要引用另一张表
alter table t2
add constraint 约束名称
foreign key (s_no) references t1(s_no)--从表的公共字段s_no,引用主表的公共字段s_no
这样约束就创建完了,显然接下来我们是要往表中添加数据,到底是往哪张表添加呢?当然是往主表里面添加,因为当我们查看从表的时候它必须要有数据存在,而这时候它又是引用主表的,显然要往主表里面添加。

一、insert into t1 values(,,)--根据表中有几个字段进行添加,在表后面没有指定要插入哪个字段的值时,这里是插入一行完整的信息
还有另一种写法是在表后面指定要添加的数据:
insert into t1(s_no) values(1)
这里要提到一个是标识规范,它不是约束,而且它也不能用代码实现,在创建表的时候比如说我们给s_no一个标识规范,标识增量为1把,然后标识种子(初始值)也为1,然后我们在往表中添加数据的时候它就会以s_no递增1的形式插入,
在比如说我们想给表中的s_name添加默认值约束,而我们插入数据的时候就想以默认值的方式插入,这时候插入的这条记录它的s_name字段就会以你给定默认值显示,代码该怎么写:insert into t1 default values
然后就是update语法,

二、update t1 set s_name=‘张三’--这样子的话它是把所有s_name字段更新为张三
而我们并不是想把所有的s_name都更新,这时候就附加条件了
比如说update t1 set s_name='张三' where s_no=1
还有一点就是我们在进行数据插入跟更新的时候老是显示(1行受影响),怪烦人的
这时候不妨执行下set nocount on

再接下来是delete语法,这时候就要注意,因为我们表之间设置了外键约束,比如说我们主表有5条记录,然后从表有3条

三、delete from t1--这样是删除表中的所有数据,这时候就会出错,因为违反的外键约束,我们在删除主表数据的同时从表引用的公共数据也会删除,因为从表里面的信息必须在主表里面存在
这时候如果我们执行这样的语句:delete from t1 where s_no between 4 and 5--因为最后两条记录在从表里面没有的,这时候就不会有问题
这里还要提到另外一种删除的方式:truncate table,与delete语句相比,它效率高,所用的事务日志空间较少,它是通过释放用于存储表数据的数据页来删除数据,并在事务日志中只记录页的释放,换句话说,它删除的数据具有不可恢复性,它的删除方式是跟delete语句没有加where的情况,也是删除所有信息

四、select语句
select s_name,s_no from t1--select后面跟的是字段名
select * from t1--查看表中的所有信息
因为表中都是英文显示的,有必要时我们要给它个别名,
下面的这样几种都是可以的:select '名字'=s_name,'学号'=s_no from t1;
select s_name '名字',s_no '学号' from t1;
select s_name as '名字',s_no as '学号' from t1;
排序:默认是升序asc
select s_name,s_no from t1 order by s_no desc,通常会与top关键字连用
如select top 1 s_name,s_no from t1 order by s_no desc

以上这些是精确查询,下面的是模糊查询,必然要用到通配符,_(任意单个字符),%(任意字符)
比如说select * from t1 where s_name like '张%'--查询所有姓张的
select * from t1 where s_name like '张_'--查询姓张的只有一个字的
select * from t1 where s_name like '[张李]%'--查询出所有姓张跟姓李的
select * from t1 where s_no like '[1-4]'--查询出前四条记录
select * from t1 where s_no like '[^1-4]'--查询出这之外的记录

两张表的查询通过连接来实现:
内链接的结果集(首先要有公共字段,取公共字段的共同值)
比如说这里t1是学生信息表,t2是成绩表(有个score字段),
然后我们事先往t1插入一条记录,
select * from t1 a inner join t2 b on a.s_no=b.s_no--也就是说内链接它是把两张表中公共字段s_no相同的序号显示,而我们插入的这条记录它不会显示
外连接(左外连接,右外连接)
select * from t1 a left outer join t2 b on a.s_no=b.s_no--查询出左边这张表a的信息,包括我们之前插入的记录
那如果我只是想查询出我们之前插入的那条又该怎么写
select * from t1 a left outer join t2 b on a.s_no=b.s_no where score is null--还要注意的是这里is是个判断,不要写成等号了
右外连接又是什么样的一个结果集呢?
select * from t1 a right outer join t2 b on a.s_no=b.s_no--显示右边b表的数据,其实跟前面的内链接的查询结果一样

我们不妨用数学集合的角度来理解内链接跟左外连接,可能这样会比较好理解我是这么觉得
A={1,2,3},B={1,2,3,5}就比如说这样的两个集合
那么内链接就相当是A∩B的结果,而左外连接相当是A∪B的结果
为什么加GO的含义:把代码分成若干个批处理,它是批处理的一个结束语句,加GO的话就是说每条语句当成是单独的执行单元,也就是这么之后单元之间互不影响

接下里还有一种查询方式,我们还是拿原先那两张表为例
select * from t1,t2--这时候它会显示18行,因为原先t1有6条记录,t2有三个,也就是说是两个表的行数之积
如果说两张表都有好几百行那这时候的执行效率肯定的很低的
select * from t1,t2 where t1.s_no=t2.s_no--显示s_no编号相同的记录
select * from t1,t2 where t1.s_no<>t2.s_no--显示编号不相同的记录

下面来讲讲变量:
局部变量@,全局变量@@
全局变量它是系统已经定义好的,不用我们去手动声明而可以直接来过来用的
比如说 select @@version返回当前数据库的版本信息
declare @a int
--set @a=1
--select @a=1有这样的两种赋值方式
他们的区别是:如果是想把某张表查询得到值赋值,这时候就必须要用select,set的实现不了的,除此之外这两种赋值没什么区别的
select @a=avg(score) from t2
select @a--print @a也是可以的
go
declare @temp int
select @temp=s_no from t2
select * from t1 where s_no=@temp--这样子查询出来的是显示最后一条记录的

其实用子查询更容易实现,它事先是执行子查询的语句
select * from t1 where s_no in(select s_no from t2)
子查询里面的值:多个值的情况我就必须要用in,如果是单个值这个地方我就不能用in,要用=,>,<,这些的比较运算符来实现,in的话我们可以理解为多个或

最后,连接可能往往或某些情况下满足不了我们要实现的,这时候我们就可以像这样的用子查询来替代

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值