Sql增删改查(包含Sql Server基础知识)


作者:云都小生


简述



Sql是一种标准的语言,几乎在所有的数据库中,如何访问、操作数据,都是遵循Sql的标准。

在了解语法之前,我们必须先熟悉在SSMS上的操作,例如附加数据库、分离数据库、备份数据库,如何去建表、如何添加约束等等。

除此之外,我们还必须了解四种不同的数据完整性准则。


基本知识



主流的数据库有微软的Sql server、Sun的Oracle、IBM的DB2,还有一个Mysql。

Sql server有两种验证,一种是Windows集成验证,另一种是Sql server身份验证。只要你是在Windows操作系统下,就可以通过Windows账户进行登录。但是如果你想从网络上访问数据库,就需要Sql server身份验证。

在Sql server中的系统数据库有四个,分别是Master,它保存在Sql server上所有数据库的信息,非常重要;Model模型数据库,用来创建新数据库的模版;Tempdb临时数据库,存放一些临时信息;Msdb主要做的是数据库备份、代理等工作。

数据库文件分为三种,.mdf后缀是主数据文件,有且仅有一个;.ndf是次数据文件,可以用0~n个;.ldf是日志文件,至少有一个。

数据完整性:

1. 实体完整性:每张表必须有一个主键,主键的值不能为空,而且必须是唯一;

2. 域完整性:指的是列的值必须满足某些条件限制,例如数据类型、是否为空等;

3. 引用完整性:被引用的表主键值和引用表的外键必须一致;

4. 自定义完整性:指所涉及的数据值必须满足某些业务条件,你设置了什么约束,就必须满足这些约束。


增加一张新表



首先,如果我们想从一张表中copy一些数据,然后放到一张新创建的表,这种方式怎么办?

select 列
into 新表
from 旧表
[where] 条件

例如从Student中copy出StudentName和Phone列,新创建一张表Tongxunlu然后把这些数据放进去

select StudentName,Phone
into Tongxunlu
from Student

创建一张新表的标准语法

create table 表名
(
    列名 数据类型 可否为空
);

create table Crad
(
    Cardno nvarchar(8) not null
);


添加数据



添加单条数据的语法是:

insert into 表 [列名]
values [值列表]

例如在Studennt中插入数据,Student表的结构是这样的。

StudentNo   StudentName     Age
1           云都小生          18
2           玉涵             18
3           Sam              18

insert into Student
values ('拽熊',12)

由于StudnetNo是标识列,所以我们不用管它。

那么如果表中某些列允许null值或者有默认值,我们该怎么添加呢?我们先假设Age列有默认值是18。

insert into Student
values ('黑鬼',default)

没错,可以用default来填补该位置,那允许null的怎么办?

StudentNo   StudentName     Age     Address
1           云都小生         18       广州
2           玉涵            18        广州
3           Sam             18       广州

insert into Student
values ('豆芽',18,null)

当然了,我们还可以写出指定的列,只为那些不可以为空的列赋值。

insert into Student([StudentName],[Age])
values('可可',18)

这个语法可以用来为部分列赋值。

向一次性插入多行数据怎么办?

insert into 表
select 值列表 union
select 值列表 union
select 值列表

记住,最后一行数据的最后面是没有union的。

insert into Student
select '主播',18,珠海 union
select '王二蛋',17,湖南 union
select '电锅',20,江西

如果想从一张表中copy数据到另外一张表怎么办?

insert into 新表
select 列
from 表
[where] 条件

使用这种语法的前提是这张表已经存在了,如果我们希望从Student表中,把StudentName和Phone提取出来放在通讯录表中怎么办?

insert into tongxunlu
select StudentName,Phone
from Student

当然还有一种语法,可以在这张表不存在的前提下,创建这张表并插入数据,不过请到创建新表那部分看。


删除数据



删除数据有两种语法,一种是 delete,另一种是 truncate table

delete from 表
where 条件

delete删除的是指定表中满足条件的数据行,这里必须清楚,删除的是整行数据,而不是列!

例如我们像删除Student表中,成绩Score小于0的数据。

delete from Student
where Score < 0

这样就会删除满足条件的数据行,当然delete也可以用来删除表中所有的行,不过要慎重!

delete from 表

而truncate table比较简单粗暴,是清空整个表的数据。

truncate table 表

例如清空整个Student中的数据

truncate table Student

delete和truncate的区别在于,如果表中有标识列(自动增长列),delete删除某条数据后,下一条增加的数据会从标识列的最大值开始递增。然而,truncate刚好相反,用trucate清空数据后,标识列会重新开始计数。


修改数据



修改数据的语法很容易

updata 表
set 列 = 值
[where]

例如将Student中年龄为17的,都修改成18岁

updata Student
set Age = 18
where Age = 17


简单查询语法——select



我们使用 select在数据库中选取数据,并把结果放在一个表中(即结果集)。

select * from 表
--从指定的表中选择所有列的数据,并放在一个结果集中

例如,我们想将Student表中所有学生的所有信息都查出来,就可以这样写···

select * from Student

那如果我只想要该表中的StudentNo和StudentName怎么办?

select StudentNo,StudentName from Student

有些表中可能会返回相同的值,如果我们只希望返回那些不会重复的值怎么办?加个关键字distinct

select distinct StudentNo,StudentName from Student


分组查询和查询排序



先来看这样一个问题,如果我们需要统计Student表中不同年级的人数,这个时候就需要用到分组查询的语法了—— group by

select 年级 = GradeId, 人数 = count(*)
from Student
group by GradeId

group by用来按照对某个列不同的值进行分组。

如果想对查询结果进行排序,我们需要用order by的语法。

select * from Student
order by Age

上面这个例子是按照Age从小到大的顺序,选取Student表中的数据。默认是从小到大进行排序ASC|DESC

select * from Student
order by Age ASC

这个与上面那个例子的效果相同,如果想从大到小排序,可以这样。

select * from Student
order by Age DESC

还有一种情况,我让数据按照年龄进行排序了,但是我继续对这些有相同年龄的人,按照年级进行排序。

select * from Student
order by Age,GradeId

这样写,当有相同年龄的数据时,就按照GradeId进行排序。


内外连接查询



有时候我们想要同时查询两张或多张表的信息,这个时候就需要连接查询,而连接查询有很多种方式,适用于不同的情况。

如果想要把学员信息和成绩都打印出来

select Student.StudentName,Result.Score
from Student,Result

把Student和Result所有信息都打印出来,上面这种方式叫内连接。

INNER JOIN语法,用来筛选出多张表中有对应值的数据,换句话说,就是筛选出不同表中的交集,把有交集的数据选取出来。

select Student.StudentName,Result.Score
from Student
INNER JOIN Result
on Student.No = Result.No

on后面加的是多张表有关联的数据。

还有一个左连接和右连接。

左连接会筛选出左表右表有关联的数据,然后再把左边剩下的其他数据也选取出来,原本没有的那些列都置为Null。

这里写图片描述

select 列
from 左表
LEFT OUTER JOIN 右表
ON 两张表中有关联的条件

或者

select 列
from 左表
left join 右表
on 两张表中有关联的条件

右连接与左连接相反,筛选出两张表关联的数据,然后把右表剩下的其他数据选取出来,多出来的列填补NULL。语法跟左连接差不多。

这里写图片描述

select 列
from 左表
right join 右表
on 两张表中有关联的条件

最后还有一个FULL查询,无论是左表还是右表,都要查出来。

SELECT 列
FROM 左表
FULL OUTER JOIN 右表
ON 两张表中有关联的条件

看图你就懂了。

这里写图片描述

基本的增删改查操作就是这些了,多做练习~

2017/12/27 20:17:37 @Author:云都小生

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值