数据库学习入门
数据库对于程序员来说是一个必备的技能,我也开始了数据的学习,看的教程比较老,是郝斌的sqlsever基础教程,用的数据库是sqlsever2008.
说起数据库,之前仿照的医药项目已经开始陆陆续续接触到了,所以也去3wschool上补过一些常用的 sql命令语句。现在是系统的学习一遍,算是巩固和加强吧。
先谈一下我对数据库的理解吧,数据库顾名思义是数据的集合,具体的是由一张张数据表组成的,而各个数据表是相互独立却可以通过各种关系来联系起来的,比如外键表。sqlsever其实是客户端来对库进行操作的 如果对一个库删除 那个实际的库也会消失。数据库也有很多软件,有mysql,Sqlsever和oracle等等。
数据库和数据结构的区别?
数据库是对硬盘数据进行操作
数据结构是对内存数据进行操作
数据库的安装是比较麻烦的,一不小心就系统报错导致数据库无法运行,这时候重装系统就比较麻烦了,所以重要的事说三遍,数据库安装要慎重,慎重,慎重。网上有具体的sqlsever2008安装教程
接下来就是对数据库的一些操作介绍了。
1.数据库用户名的添加和修改,可以通过数据库的安全性来添加。
2.数据库的创建直接右击数据库(新建数据库即可)创建数据库会保存在两个文件里,一个是...mdf 是用来存储数据的,另一个是...ldf是存储操作的,比如谁谁谁在什么时候对该数据库进行了什么操作,比如增删查改。
3.数据库的添加可以右击数据库然后附加mdf文件即可。
4.数据库的删除。如果在sqlsever对数据库进行删除的话,实际的数据库也会消失。
5.数据库的备份。
a.分离法有两个方法一个是右击要备份的那个数据库然后右击任务点击分离即可,直接点分离然后框框都打勾就行。会生成mdf和ldf文件,默认保存在c盘的位置。如果不修改的话,创建数据库分离数据库得到的文件都会存放在那里。
b.生成脚本 在需要修改的数据的框框打勾然后一直点下一步最后完成即可
一个表中主键扮演着很重要的角色,是用来唯一标识数据项的。
主键一般都是和数据无关额外的创建一个列 无意义的编号int identity代表自增。
有人会问为什么要用int型的无意义的数字来标识一个数据呢 难道其他数据项不可以吗?那我只能问你,你说 用一个数字来标识一条数据方便还是一条字符串方便。而且一般我们都会设置主键是identity代表自增的主键,因为毫无规律的数字是很难记忆的,也不直观。
create table student
(
student_id int primary key identity(100,5),
student_name nvarchar(20) not null
)
student_id是自动增长的主键 从100开始 每次增长5
insert into student values(’ 李四’)
可以直接这样插入 因为student_id是主键可以直接忽略
表中删除数据又插入数据会导致主键不连续递增 这种情况是不重要的,即使主键不连续递增,也是可以的
也有人问 主键和唯一键有什么区别呢?
主键定义:
能够唯一标识一个事物的一个或者多个字段的组合被称为主键
1主键是不可以赋null空值的,而唯一键可以。
2主键是无意义的数据外的数据,是用来标识数据的,而唯一键是数据,而且是用来防止数据重复项的。
主键的注意 :
主键通常是整数,不建议使用字符串
主键的值通常不允许修改,除非本记录被删除
主键不要定义成id 而要定义表名id或者表名_id
要用代理主键,不要用业务主键意思就是:
任何一张表,强烈建议不要使用有业务含义的字段充当主键 我们通常都是再表中单独 添加一个整型的编号充当主键字段
还有外键
也是很重要的,外键是表与表之间连接的枢纽,如果a表有数据来自b表,那a表称为外键表,外键在a表里,b表为主键表。 外键表的值来自于b表的主键
一对多的关系就是a的主键作为b的外键,b的外键可以重复
外键的定义:
如果一个表中的若干字段是来自于另外若干个表的主键或唯一键
则这若干字段就是外键
注意:
外键通常是来自于另外表的主键而不是唯一键,因为唯一键可能是null
外键不一定是来自另外的表,也可能是来自于本表的主键
比如一张表中的员工是主键 对应的上司字段是外键来自于本身的主键
建表
1、菜单
2、建表语句
create table 表名(
字段 类型 [not null,primary key, auto_increment]
... ...
)
eg:
create table test(
id int primary key auto_increment,
name varchar(50) not null,
sex varchar(2),
tel varchar(50),
remark text
)
删除表
drop table 表名;
插入语句
1、菜单
2、插入语句
insert into 表名(列名1,列名2...) values(值1,值2,....)
eg:
insert into test(name,sex,tel,remark) values('张六忌','女','251314','这是备注')
3、插入语句注意事项:
a、values和列名一一对象
b、value值和字段类型匹配
c、主键不能插入值
查询语句
select 列名1,列名2 from 表名 where 条件
1、关系运算符
> < = >= <= <> !
2、逻辑运算符
and or not
3、模糊查询
like:约等于
_:一个字符
%:任意个字符
删除语句
delete from 表名 where 条件
修改语句
update 表名 set 列名=值 where 条件
去除重复(distinct)
select distinct ress from hist
between…and…(包含)
查询工资在8500到9000之间的员工信息(两种)
select * from emp where sar between 8500 and 9000
select * from emp where sar>=8500 and sar<=9000
in(匹配内容列表)
查询部门号是1,2,3这三个部门的所有员工
select * from emp where did in(1,2,3)
select * from emp where did=1 or did=2 or did=3
查询主键是1,4,7的员工信息
select * from emp where eid in(1,4,7)
select * from emp where eid=1 or eid=4 or eid=7
聚合函数(count,sum,max,min,avg)
查询总共有多少个员工
#select count(*) from emp
select count(eid) from emp
#select count(ename) from emp
select count(1) from emp
#select count(900) from emp
查询所有员工的工资总和
select sum(sar) 工资总和 from emp
查询最高的工资
select max(sar) from emp
查询最低的工资
select min(sar) from emp
查询平均工资
select sum(sar)/count(eid) from emp
select avg(sar) from emp
查询所有员工的最高、最低、平均工资,工资的总和
select max(sar) max_sar,min(sar) min_sar,avg(sar)
avg_sar,sum(sar) sum_sar from emp
分组统计
查询每个部门的平均工资
select did,avg(sar) from emp group by did
查询每个部门的平均工资,只显示大于7000的数据
select did,avg(sar) avg_sar from emp group by did having avg_sar>7000
查询每个部门的女性员工的平均工资
select did,avg(sar) from emp where sex=’m’ group by did
查询每个部门的平均工资,只显示大于5000的数据,并且按平均工资排序
select did,avg(sar) avg_sar from emp group by did having avg_sar>5000 order by avg_sar
注意:分组查询是,select后的字段必须包含在聚合函数或 GROUP BY 子句中
分组---->过滤----->排序
group by--->having--->order by
9、多表查询
子查询(一个select中嵌套了另一个select)
查询研发部的所有员工
#select did from dept where dname=’研发部’
#select * from emp where did=4
select * from emp where did=(
select did from dept where dname=’研发部’
)
查询研发部和市场部的所有员工
select * from emp where did in(
select did from dept where dname in(‘研发部’,’市场部’)
)
select * from emp where did in(
select did from dept where dname=’研发部’ or dname=’市场部’
)
nvarchar() 类型支持国际化长度可变的字符
主键命名
主键是针对一个表的, 而不是针对一个字段,因为主键是唯一的,一个表只能有一个主键。
a. 一般主键命名: 主键的命名为 pk_TableName。
b. 复合主键: ” pk_ ” + “ 字段名 ”
e.g.: constraint pk_StudentCourse Primary key(Stud_Id, Cour_Id)
主键pk_StudentCourse,包含了两个字段 Stud_Id 和 Cour_Id
外键命名
外键的命名为 fk_外键所在的表名外键引用的表名 。因为外键所在的表为从表,所以上式可以写为 fk 从表名_主表名 。
check约束 check是对数据项限定范围的约束
Create table ss3 check约束
(
name3 nvarchar(20) not null constraint pk_ss3 primary key,
cc int check(cc>=10 and cc<=20)
)
insert into ss3 values('saz',22)
default是添加默认值的约束
create table ss4
(
name nvarchar(20) not null constraint pk_ss4 primary key,
sex nchar(1) default('男')
)
添加唯一键 可以为null值但只是其中一列为null 因为null也算一个值 在sqlsever 在oracle则可以多个null
unique可以和not null一起使用 这样子 就是不为空的唯一键
create table ss5
( //给主键命名
name nvarchar(20) constraint pk_ss5 primary key, 、
//设置默认值
sex nchar(1) default 's',
//age数据设定范围
age int check(age>20),
//不为空的唯一值
address nvarchar(20) unique not null
//设置的外键
xx nvarchar(20) constraint fk_ss2_ss1 foreign key references ss1(name)
)
insert into ss5(name,address) values('sd',null)
如果insert into ss5(不填) values(全部数据项都要填,即使它被设定是默认值)
如果insert into ss5(哪几项)values(对应填哪几项,省略的都是以null形式填入,如果unique not null 或者是主键被忽略了 那么就会报错,因为这两项都不允许填入控制)
exists返回真或者假
查询没有工作经历的员工信息,要求用not exists
select e.* from emp e where not exists(
select 1 from hist h where h.eid=e.eid
)
exists用于数据量大的 in用于数据量小的
Union和union all的区别?
前者去重,后者不去重
数据库包涵三种关系:
1.一对一
2.一对多
3.多对多
先看2 一对多关系 这就是一个外键表就可以表达了 外键表的外键表示多 而对应的主键表的主键是一
再看3 是这三种关系中最复杂的。
很多人想不到该怎么解释这种关系
所以需要再额外新建一个表来表示他们的关系 ,看一下代码一目了然:
create table banji
(
banji_id int primary key,
banji_num int not null,
banji_name nvarchar(20)
)
create table jiaoshi
(
jiaoshi_id int primary key,
jiaoshi_name nvarchar(20)
)
create table banji_jiaoshi_mAPPing
(
banji_id int constraint fk_banji_id foreign key references banji(banji_id),
jiaoshi_id int foreign key references jiaoshi(jiaoshi_id),
kecheng nvarchar(20)
constraint pk_banji_id_jiaoshi_id primary key (banji_id,jiaoshi_id,kecheng)
)
这是班级和老师的数据表 第三张是这两者之间的关系表也是那两张表的外键表。
班级id和老师id是外键 班级id和老师id和课程组成了该表的主键 这点注意:写法和其他主键的写法不同constraint pk_banji_id_jiaoshi_id primary key (banji_id,jiaoshi_id,kecheng)
数据库关系图也是很重要的一个东西 可以很直观的看到各个表之间的关系 当你接触一个新的数据库的时候 可以选择这个方法来了解这些数据的关系 如图所示:
表中钥匙的标志表示该字段是主键 有人会问 一个表中不是只有一个主键吗那为什么banji__laoshi__mapping 中有三个主键。 原因是因为这三个字段组合起来才是主键,所以他们都是主键的一部分。如果把表与表之间的外键关系删掉会导致外键表的数据丢失吗 答案是 不会的。 还有图中的 表和表之间是用两个圈加钥匙组成的 那哪个是主键哪个是外键呢 ? 我是这么理解的 banji_laoshi_mapping 的钥匙指向banji 意思就是它中的某些数据是取自banji 那么它就是外键表,banji就是主键表 这么理解记忆比较好
问题:
先删主键表还是外键表?
答案是:先删外键表
如果先删除主键表,会报错,因为这会导致外键表的数据引用失败
查询要掌握的:
- 1.计算列
- 2.distinct
- 3.between
- 4.in
- 5.top
- 6.null
- 7.order by
- 8.模糊查询
- 9.聚合函数
- 10.group by
- 11.having
- 12.连接查询
- 定义
-分类
内连接 (最重要)
外连接
完全连接
交叉连接
自连接
联合
13.嵌套查询
注意:
在写SQL语句时,经常需要查询不在某个表、不等于某些值的记录,SQL Server中提供了not in来实现这个功能,但是,如果not in 后面的值有NULL值时,就会返回错误的结果,即没有任何结果返回,所以SQL中在使用not in时需要特别留意。
当数据库已经创建好后
添加约束要用
ALTER TABLE Persons //ALTER和ADD是重点
ADD UNIQUE (Id_P)
还有 新建查询里面 go是分隔作用 意思就是执行完上一步才能执行下一步 有先后顺序
还有一些知识没怎么学习:
1.事务
2.索引
3.存储过程
4.游标
5.TL_SQL
6.触发器
数据库是如何存储数据的
字段 记录 表 约束(主键 外键 唯一键 非空 check default 触发器)
数据库是如何操作数据的
insert update delete T-SQL 存储过程 函数 触发器
查询 :
内连接 (核心)
左右连接
视图
事务
更新:
2018.6.28:
这学期刚学习了数据库
写了份数据库的实验报告:
https://blog.csdn.net/qq_38409944/article/details/80424093
最后设计了一个学生选课系统的数据库 可以参考下:
https://blog.csdn.net/qq_38409944/article/details/80830620
2018.7.15更新:
由于学javaweb,便也学习了Mysql,不过数据库的内容基本一致,没啥大差别。
Mysql学习笔记
Mysql存储过程学习笔记
mysql权限问题
Mysql数据备份和还原
MySQL服务无法启动 and MySQL忘记密码 and MYSQL编码问题解决方案
相关阅读
数据库 “数据库”是以一定方式储存在一起、能够多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。 【基本
出于复试的必要性,很努力地复习了数据库的内容,大学没好好学习的东西,后期都是要花费大量的时间去弥补的。很多东西都是逝去了才知道
一、树型关系的数据表 不少程序员在进行数据库设计的时候都遇到过树型关系的数据,例如常见的类别表,即一个大类,下面有若干个子类,某
使用PreparedStatement操作mysql数据库出现中文乱码问
背景: 在使用PreparedStatement执行setString(4, "我是中文");后,通过debug发现中文变成了???;这个肯定是编码问题,然后通过字符串和字
powerdesign建Oracle数据库设置某个属性值自增
两种方式,一种是通过执行PowerDesign生成的触发器语句,一种是通过SqlDeveloper内创建触发器,但是两种方法使用之前都需要创建序列seq