关系型的数据库
数据库的基本知识:
基于两维表。
一个实体就是一个对象。
一行数据就是一条记录。
列(字段)。
数据库里有表(一个数据库中可以有多张表)。一张表中可以有多行多列。基于这张表,可以向这个表中添加数据,修改表中的数据,删除表中的数据,以及从表中检索数据(查询)。
win+r --激活数据库
services.msc--ms SQL Server --启动
知道服务的情况下:
net start mssqlserver
启动
net stop mssqlserver
关闭
连接到服务器
本地的服务器
第一种 .
第二种 (local)
第三种 localhost
.Mdf 主数据文件 master datavsse file
.Ldf 日志文件 second
数据库最终以磁盘上的文件的形式来体现
数据库名 .mdf 数据度名 _log.ldf
.ndf 次数据库文件 logger database file
四种完整性
域完整性 --------保证该列的值符合要求。
实体完整性--------保证该行的数据是唯一的
引用完整性---------表与表之间的关系,比如有A表和B表,B表中的数据参考了A表中的数据。
自定义完整性--------要用触发器,函数。
如何确保表中的数据是唯一的,三种方法:
第一种-----primary key 主键约束
第二种-----unique 唯一约束
第三种-----identity( ,)标识列
域完整性的约束方法:限制数据类型、检查约束、外键约束、默认值、非空约束
常用数据类型:
char --固定长度 当我们明确的知道该列的长度时,优先使用char(长度),因为在查询时速度快。(因为对于char类型是一次性的从头到尾去匹配)
varchar --可变长度 字符类型
datetime --日期,时间类型
int --数字类型
money --货币类型
image --图片类型
bit --值只能是1或0(0表示false,1表示true).
引用完整性:使用外键来表示。
引用完整性,一定涉及两张表,一是主键表(主表)和外键表(从表)。
外键字段的值参考(引用)主键表中主键字段的值。
如果主键字段中没有该值,则外键表中的外键字段就不能使用此值,如果使用了,就会发生与外键约束相冲突。即,外键字段使用的值一定要在主键表中的主键字段中存在。
永远是在多的一方创建外键。
如:一个学生可以有多个成绩,则在多的一方(成绩表)中创建外键。
如:一个部门有多个员工,需要员工表中创建外键来标识员工属于哪个部门。
如:一个班级有多个学生,需要在学生表中创建一个外键来标识学生所属的班级。
约束:
1,主键约束 primary key—————可以让表中的每行的值不相同【在一张表中只能有一个主键约束】
主键约束的列的值不能为NULL,且主键约束的列的值不能重复(相同)
2,检查约束 check()—————可以让某列的值符合给定的要求
3,默认约束 default—————该列的默认值(如性别:男)
4,非空约束 not null—————该列的值不能为NUll
5,唯一约束 unique—————唯一的区分表中的一行【在一张表中可以有多个唯一约束】
在索引/键中设置
6,外键约束 foreign key —————外键表中的外键列的值参考主键表中主键列的值。在实际运行中要加 references
区别表中的一行在SQL Server中有3种方式
1,主键约束
2,唯一约束
3,使用标志列
check约束:
例如1:年龄要求 15到40岁之间
写法1: empAge>=15 and empAge<=40
写法2: empAge between 15 and 40
例如2:性别要求 女或男
empSex=‘女’ or empSex=‘男’
当表中没有合适的列做为主键时,我们可以使用标识列来唯一区分表中的一行。
标识列的特性:
1,种子
2,增量
标识列是自动生成的,在插入数据时不需要(不能)在该列上输入数据。
一个列可以是标识列,同时还可以是主键,两个互不影响的。
在一张表中,主键约束只能有一个,外键约束有多个
数据库基本操作语言
增 insert
删 delete truncate
改 update
查 select
Sqlserver使用T-SQL进行数据库级的编程
在oracle中使用pl/sql进行数据库中的编程
DDL: 数据定义语言,第一个D叫数据,第二个D叫定义
凡是以CREATE,DROP,ALTER 都叫数据定义语言。
DML: 数据操作语言,里面有 增 删 改
DCL: 数据控制语言, grant-授权, revoke-回收
DQL: 数据查询语言,select-查询。
逻辑运算符:
AND 并且
OR 或
NOT 取反
查询语句: select * from 表名
添加语法: insert into 表名(列名1,列名2…)values(值1,值2…)
注意:如果是字符类型,日期类型,就需要加‘’(单引号)
如果给表中所有的列插入的话,表名后的列名可以不用书写
insert into 表名 values(值1,值2…)
{<-标识列 identity()不需要显示的插入值->}
{<-如果给某些列插入值时,可以省略列名:但是要插入的值的顺序一定与列的值要一至->}
一次性的向表中插入多条数据
1, select …into –查询表中的数据放到别一个新表中(新表必须不存在)
语法:
select 要查询的列名(如果是多列要用逗号隔开)
into 新的表名(要求:此新表名必须不存在)
from 旧表名
2, insert …select (要在用此语句之前先把新表建好)
语法:
insert into 表名(列名1,列名2...)
select 要查询的列名
from 旧表名
3, union
语法:
insert into表名(列名1,列名2...)
select 值1,值2... union
select 值1,值2... union
select 值1,值2...
更新
update 更新(注意:可能更新0条数据,但没有语法错误)
语法:
update 表名
set 列名1-值2,列名2-值2...
where 条件 #(如果不加where 条件就会更新所有的数据)
update可以更新一列或多列,但是至少要更新一列。
删除数据
1,delete
语法:
delete
from 表名
where 条件
作用:
删除表中所有的数据
2,truncate
语法:
truncate table 表名#(不加where条件,不合语法)
作用:
删除表中所有的数据
以上两种删除方法的区别在于:
truncate 删除与delete同样的数据时,速度更快。因为truncate不写日志。
如果使用truncate 删除表中的数据时,在没语法错误的情况下一定是删除所有数据。而delete则会因为where条件的判定结果而删除数据
查询
产生一个虚拟表,此表只存在于内存中,此表中的数据来自于数据库中真实的表。
查询的语法:
简单的语法:
select 要查询的列名 #(如果有多个列,列与列之间用逗号隔开)
from 表名 #(如果是多表,表名与表名之间要用逗号隔开)
where 条件 #(如果是多条件,使用and或or来连接)
order by 排序 #(可以按单列排,也可以按多列排)
select 跟*表示所有的列名。
查询时给列起别名
写法1: 列名 as 别名
写法2: 列名 别名
写法3: 别名 = 列名
查询时给表起别名
写法1:给表起别名 表名as别名
写法2:给表起别名 表名 别名
查询时的排序(默认是升序–asc ,desc表示降序)
语法 :
查询语句 order by 列名 asc/desc
排序:3种:
1,按单列排序
2,按多列排序
3,按别名排序
查询时:空值的查询/非空值的查询
select 列名
from 表名
where 列名 is not null
select 列名
from 表名
where 列名 is null
范围查询
select *
from 表名
where 条件范围
in查询
select 列名
from 表名
where 列名 in(条件1,条件2)
过滤重复的值
select distinct 列名
from 表名
查询时加入常量值
select 列名,值 as 列名
from 表名
–查询固定的行数
select top 数字 列名 from 表名
--top 数字
select top 数字 percent 列名 from 表名
--top 百分比
模糊查询
下划线:_表示一个字符
%:表示0个,一个或多个字符
语法: like ‘’
select 列名
from 表名
where LEN(列名)=长度
Select 列名
from 表名
where 列名 like '条件'
聚合函数
1,count() 统计个数
2,sum() 求合
3,avg() 求平均值
4,max() 求最大值
5,min() 求最小值
以上的5个聚合函数的特点:返回单值
注意:sum(),avg(),max(),min()只针对数字而言,如果是null值则会被忽略掉.
字符串函数
charindex() 从第二个参数中找第一个参数.
charindex(expression1,expression2,[Strat_location])
找到了就是具体的索引
找不到就是0
–0,迪卡尔积 : A表的记录数*B表的记录数,迪卡尔积中的部分数据是错误的数据
select * --表示学生表中所有的字段加上成绩表中的所有的字段
from 表名1,表名2
连接查询
1,内连接查询
写法1:
select --要查询的列名
from 表名1,表名2,表名3...
where 条件(一般都是根据主外键关系的等值条件)
写法2:
select 列名
from 表名1
inner join 表名2
on 条件1
inner join 表名3
on 条件2
2,外连接查询
左外连接查询
语法:
select 列名
from 表名1 --即左表
left join 表名2 --右表
on
左外中左表的数据将全部显示出来
右表中的数据与左表中的数据匹配
如果能匹配上就显示出来
如果不能匹配,右表中的数据就显示为null
右外连接查询
语法:
select 列名
from 表名1 --即左表
right join 表名2 --右表
on
右表中的数据全部显示
左表中的数据与右表中的数据进行匹配
如果成功则会显示
如果不匹配则会在左表相应的位置显示null值
3,分组查询
注意:在分组查询中,select 后面跟着的只能是两种:
1,分组的列
2,聚合函数
语法:
select 列名
from 表名
where 分组前的条件
GROUPING by 分组的列
having 分组后的条件
order by 排序
注:
1,分组的列只能是分组的列或聚合函数
2,可以按一列或多列(group by a,b)分组
3,having:要分组之后加条件
4,order by:一定是在语法最后出现
4,交叉连接查询
语法:
select 列名
from 表名1
cross join 表名2
where 条件
5,完全连接查询
语法:
select 列名
from 表名
full join 表名2
on 条件
每张表中的数据都会全部显示出来.
6,其它的查询:
并
交
差
在数据库的设计当中:
如果表与表之间是一对一的关系的话,可以设计为,一张表(一定有数据的冗余),也可以为两张表(减少冗余,某种程序上来说查询速度会提高)。
外键字段的数据类型和长度必须和主键一样,否则就会创建失败