在了解语法之前,我们必须先熟悉在SSMS上的操作,例如附加数据库、分离数据库、备份数据库,如何去建表、如何添加约束等等。
除此之外,我们还必须了解四种不同的数据完整性准则。
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. 自定义完整性:指所涉及的数据值必须满足某些业务条件,你设置了什么约束,就必须满足这些约束。
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 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 * from 表
--从指定的表中选择所有列的数据,并放在一个结果集中
例如,我们想将Student表中所有学生的所有信息都查出来,就可以这样写···
select * from Student
那如果我只想要该表中的StudentNo和StudentName怎么办?
select StudentNo,StudentName from Student
有些表中可能会返回相同的值,如果我们只希望返回那些不会重复的值怎么办?加个关键字distinct
select distinct StudentNo,StudentName from Student
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:云都小生