【2 - 数据库是如何存储数据的】Sql Server - 郝斌(字段、记录、表;图形化界面及sql语句建表;六种约束;一对一、一对多、多对多、数据库关系图;主外键)
课程地址:数据库 SQLServer 视频教程全集(99P)| 22 小时从入门到精通_哔哩哔哩_bilibili
目录
数据库是如何解决数据存储问题的
1. 表的相关数据
2. create table 命令
通过图形化界面建表和主外键约束
通过SQL命令建表和主外键约束
3. 什么是约束
分类
主键和唯一键区别
4. 表和约束的区别
5. 什么是关系
(1)一对一
(2)一对多
(3)多对多
数据库关系图
6. 主键
7. 外键
下次课程预告
数据库是如何解决数据存储问题的
- 事物是怎么存的
- 事物和事物之间的关系是怎么存的
关系型数据库:用一张二维表来表示事物和事物之间的关系
- 数据库的二维表是关系型的,Java的类是面向对象的,用 hibernate 来完成两者之间的映射;若数据库也是面向对象的,就不需要hibernate了
- 关系型数据库的思想里,表只模拟属性,并不模拟操作,操作是以命令的方式存在的;Java里, 对象 = 属性 + 操作
1. 表的相关数据
- 字段/属性/列:用来模拟一个事物某一个静态的特征
- 记录/元组/行:字段的组合,表示的是某一个具体的事物
- 表:记录的组合,表示的是同一类事物的集合
表和字段、记录的关系:字段是事物的属性,记录是事物本身,表是事物的集合
表由记录组成,记录由字段组成
- 主键:能够唯一标识一个事物的属性(编号,只起到标识作用,无现实意义),没有主键会导致数据冗余
- 外键:一个表中的字段来自另一个表,即事物与事物之间的联系
2. create table 命令
建表之前先建库:数据库 - 新建数据库 - 数据库名称:test - 确定
通过图形化界面建表和主外键约束
nvarchar:国际化(national)编码的可变的(vary)字符串(char)
(n表示国际化,对汉字也支持)
先建员工表的时候,不能有部门编号这个字段,因为还没有建部门表,需要后面再添加
员工表(emp):
dbo 表示以系统的身份来登录的,即当前用户本身
部门表(dept):
多对一,是在多的一方去建外键
在emp表上增加外键dept_id:
右键 - 设计
右击 - 关系 - 添加
确定后保存,发现报以下错:
解决办法:
SQL Server不允许保存更改_将来官御天的博客-CSDN博客_sqlserver不允许保存更改
工具 - 选项 - 设计器 - 取消勾选 “阻止保存要求重新创建表的更改”
再保存即可
删除表时:先删外键表(若有一个表,它有一列是来自于另一个表,则该表为外键表,即含有外键字段的表),后删主键表
通过SQL命令建表和主外键约束
create table dept( -- 先建主键表dept_id int primary key,dept_name nvarchar(100) not null,dept_address nvarchar(100)
)create table emp( -- 再建外键表
-- 不能写成{emp_id int primary key, -- 若想定义主键约束的名字:emp_id int constraint pk_emp_id_hahaha primary keyemp_name nvarchar(20) not null, -- n:国际化,支持汉字;var:vary,变量;char:字符(支持汉字,字符长度随着输入的实际长度变化的类型,最大长度为20)emp_sex nchar(1),dept_id int foreign key references dept(dept_id) -- 外键约束名字:fk_dept_id_heihei
)
在定义表的最后一个字段时,Oracle后面不能加逗号,但是SQL Server加不加逗号都可以。 故 create table 最后一个字段的后面建议不要写逗号
3. 什么是约束
- 在存储数据时添加一些限制,保证数据合理
- 添加的限制都是有名字的,没有指定的话,会有默认值
定义:对一个表中的属性操作的限制
分类
- 主键约束(实体完整性):不允许重复元素,避免了数据的冗余,且不允许为空
- 外键约束(引用完整性):要求数据必须来自另外一个表。通过外键约束从语法上保证了本事物所关联的其他事物一定是存在的(事物和事物之间的关系是通过外键来体现的)
- default 约束(默认约束):保证事物的属性一定有一个值,如:sex nchar(1) default ('男'),或写成:sex nchar(1) default '男'
- check 约束:要求数据必须属于某个范围,保证事物属性的取值在合法的范围之内,如:salary int check (salary>=1000 and salary<=8000)
- not null 约束(非空约束):要求用户必须为该属性赋一个值,否则语法出错。可以与unique约束组合使用,如:stu_name nvarchar(200) unique not null
- unique 约束(唯一约束):保证了事物属性的取值不允许重复,但允许其中有且仅有一列为空,即 unique 约束修饰的列不允许多列为空(SQL Server);但Oracle中允许有多列为空。与主键的区别:主键非空且唯一,而 unique允许为空。如:stu_name nvarchar(200) unique
create table student(stu_id int primary key,stu_sal int check (stu_sal>=1000 and stu_sal<=8000),stu_sex nchar(1) default('男') -- ()可以省略,在数据库中字符串必须用''括起来
)insert into student(stu_id,stu_sal) values (1,1000) -- sex会默认为男
insert into student values (2,1000) -- 会报错,列名或所提供值的数目与表定义不匹配
insert into student values (3,1000,'女') -- 可以
问题:unique 键是否允许多列为空?
答案:SQL Server只允许一个 unique列为空,Oracle允许多个 unique列为空
如果一个字段不写 null,也不写 not null,即默认允许为空,用户可以不给该字段赋值
如果用户没有为该字段赋值,则该字段的值默认是 null
问题:null 和 default 的区别?
- 相同点:都允许用户不赋值
- 不同点:null 修饰的字段若用户不赋值则默认为null,default 修饰的字段若用户不赋值则默认为 default 指定的那个值
设置字体:
- SQL Server:工具 - 选项 - 环境 - 字体和颜色
- Oracle:工具 - 首选项 - 代码编辑器 - 字体
设置行号:
- 工具 - 选项 - 文本编辑器 - Transact-SQL - 勾选行号
第三方工具:PowerDesigner(可以大批量生成多张多字段的表)
数据库里单引号是用来标识字符串的,双引号是用来模拟对象(表/约束/列/计算列/临时表等)的名字的
主键和唯一键区别
- 不要用业务逻辑字段(业务主键)当主键
- 添加没有任何实际意义的编号(其实不是属性)当主键(代理主键)
- 用业务上有实际含义的、不允许重复的属性当唯一键
- 主码可以设置成自增:stu_id int primary key identity
删表
drop table student
当新建查询时,默认数据库是 master(系统库,不能修改与删除,新建的自己库的数据要借助系统库来维护、运行、管理),应切换到自己所需的表的数据库底下
4. 表和约束的区别
数据库是通过表来解决事物的存储问题的
数据库是通过约束来解决事物取值的有效性和合法性的问题的
建表的过程就是指定事物属性及事物属性各种约束的过程
5. 什么是关系
关系:表和表之间的联系
- 实现方式:通过设置不同形式的外键来体现表和表之间不同的关系
- 分类:三种,一对一,一对多/多对一,多对多
假设是A表和B表
(1)一对一
三种情况
- 关联的实体都共享同样的主键
- 其中一个实体通过外键关联到另一个实体的主键,但必须在外键列上添加一个唯一的约束
- 通过外键表来表示两个实体之间的关系,即通过一个单独的表来实现
既可以把表A的主键充当表B的外键,也可以把表B的主键充当表A的外键
(2)一对多
一对多,在多的一方添加外键
把表A的主键充当表B的外键,或者说,把A表的主键添加到B表,来充当B表的外键
(3)多对多
如班级和老师、学生和老师的关系
多对多必须通过单独的一张表(第三张表)来表示。这张表至少有两列,均为外键,分别来自A表和B表,其整体可能为主键,可能还会添加一些因为A和B有关系而产生的附加字段
- 班级(班级ID,班级人数)
- 老师(老师ID,老师姓名)
- 必须通过单独的一张表来表示班级和老师的关系:授课(班级ID,老师ID,课程名)
- 假定一个老师对一个班级只能上一门课,则授课的主键为(班级ID,老师ID)
- 若一个老师对一个班级可以上多门课,则授课的主键为(班级ID,老师ID,课程名)
- 两个外键:班级ID,老师ID
-- 班级表
create table banji( -- class和Java的类关键字一样,库里的数据调用内存,由Java或其他语言做处理,然后由页面显示,或处理完之后再写入回库里banji_id int primary key,banji_num int not null,banji_name nvarchar(100)
)-- 教师表
create table teacher(teacher_id int primary key,teacher_name nvarchar(200)
)-- 第三张表 用来模拟班级和教师的关系
create table banji_teacher_mapping(banji_id int constraint fk_banji_id foreign key references banji(banji_id),teacher_id int foreign key references teacher(teacher_id),course nvarchar(20),constraint pk_banji_id_teacher_id_course primary key (banji_id, teacher_id,course)-- 外键可以多个,主键只允许有一个
)
一个表不一定有外键,但一定有主键
数据库关系图
作用:查询哪几个表之间有没有一对一、一对多、多对多的关系
新建 - 按住Ctrl 选中所需要的多个表 - 添加
从数据库中删除关系后,banji_teacher_mapping表中是否还有 banji_id 字段?
- 删关系只是删除 banji_teacher_mapping表中 banji_id 字段的外键约束
- 并不删除 banji_id 字段本身
字段上的限制或约束删除后,字段还保留着
主键数据是不能删的,但可以选择级联删除(删除主键数据的同时,把外键限制也删除,即表与表之间的关系被删除了)
数据库主要研究的是:外存(硬盘)上数据的存储和操作
- 数据库语言(第四代语言)写的都是命令,不需要考虑内部的实现机理。但通过重命令只能执行某一类型的操作,另外的操作无法实现,可以用包含循环、选择、顺序(有流程控制)的TL-SQL(SQL Server)或 PLSQL(Oracle)来实现,但这种语言不能跨平台使用;另一种方法是用高级语言操作,先把库里的数据调入内存,操作完之后再回写进数据库
客户端 - 服务器 - 后台数据库
- 编程/高级语言(第三代语言),有for循环、if语句等等。C是面向过程(变量,结构体,枚举类型类存储)的;Java和C#是面向对象的;C++是混合语言,既面向过程又面向对象
- 机器语言(第一代语言):0101
- 汇编语言(第二代语言),把01直译成一些英文单词,机器指令/汇编指令,一一匹配
C、SQL:数据和操作是分开的
C++、Java、C#:数据和操作是整合在一起的,形成类
6. 主键
定义:能够唯一标识一个事物的一个字段或者多个字段的组合,被称为主键
附注:含有主键的表叫做主键表
设计主键要注意的问题:
- 主键通常都是整数,不建议使用字符串当主键(如果主键是用于集群式服务,才可以考虑用字符串当主键,一般是UUID)
集群式服务:跨数据库服务,用户的请求需要通过多个数据库并发访问才能完成这个请求
- 主键的值通常都不允许修改,除非本记录被删除
- 主键不要定义成 id,而要定义成 表名id 或者 表名_id
- 要用代理主键,不要用业务主键(任何一张表,强烈建议不要使用有业务含义的字段充当主键,通常都是在表中单独添加一个整型的编号充当主键字段)
- 主键是否连续增长不是十分重要
7. 外键
定义:如果一个表中的若干个字段是来自另外若干个表的主键或唯一键,则这若干个字段就是外键
注意:
- 外键通常是来自另外表的主键而不是唯一键,因为唯一键可能为null
- 外键不一定来自另外的表,也可能来自本表的主键,如员工表中同时有两个字段:员工ID(主键)和上司ID(外键),上司ID就来自于员工ID
- 含有外键的表叫外键表,外键字段来自的那一张表叫做主键表
问题:先删主键表还是外键表?
- 先删外键表。如果先删主键表,会报错,因为这会导致外键表中的数据引用失败
下次课程预告
- 查询(最重要,难度最大)
- 计算列
- distinct(不允许重复)
- between(在某个范围)
- in(属于若干个孤立的值)
- top(最前面的若干个记录):专属于SQL Server的语法,不可移植到其他数据库
- null(空值)
- order by(以某个字段排序)
- 模糊查询(搜索时经常使用)
- 聚合函数(多行记录返回至一个值,通常用于统计分组的信息)
- group by(分组)
- having(对分组之后的信息进行过滤)
- 连接查询
- 嵌套查询
【2 - 数据库是如何存储数据的】Sql Server - 郝斌(字段、记录、表;图形化界面及sql语句建表;六种约束;一对一、一对多、多对多、数据库关系图;主外键)相关推荐
- 【3 - 查询】Sql Server - 郝斌(计算列、distinct、between、in、top、null、order by、模糊查询、聚合函数[主要是count()函数] )
课程地址:数据库 SQLServer 视频教程全集(99P)| 22 小时从入门到精通_哔哩哔哩_bilibili 目录 查询(最重要,难度最大) (一)大纲 (二)Scott 表 下载与导入SQ ...
- 【4 - 分组】Sql Server - 郝斌(分组group by、过滤having、聚合函数max() / count()、排序order by、select语句的执行顺序)
课程地址:数据库 SQLServer 视频教程全集(99P)| 22 小时从入门到精通_哔哩哔哩_bilibili 目录 group by(分组) group by a,b 的用法 having( ...
- SQL Server对Xml字段的操作
T-Sql操作Xml数据 一.前言 SQL Server 2005 引入了一种称为 XML 的本机数据类型.用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列:此外,还允许带有变量和 ...
- 达梦数据库(DM8)常用功能总结-图形化界面
目录 所需软件 准备工作 一.将dm8和odbc复制到/opt文件夹 二.检查glibc所需环境配置 三.配置DM工具路径(可选) 图形化操作 一.创建账户和文件夹,并配置文件打开参数 二.安装达梦数 ...
- 数据库入门教程(SQL Server 2005)----数据库是如何存储数据的
作者: 大蜀黍946 数据库是如何存储数据的---外键:来自 主键:唯一的标识或者说区分开一个事物. 外键:能够标识事物之间的联系.数据来自外部 1.表的相关数据 字段:用来模拟事物的某一个静态特征. ...
- C# 数据库dataGridView刷新数据和主外键判断
本文主要讲诉在使用VS2012+SQL Server数据库做系统中,通常会遇到几个问题.使用dataGridView控件在修改.删除.插入数据后,怎样刷新数据显示操作后的结果.同时在对数据操作时通常会 ...
- sql外键需要输入吗_关于sql:为什么在没有连接的情况下可以联接,为什么需要主-外键关系?...
如果我们可以从两个表中获取数据而又没有主键和外键关系,那为什么我们需要这个规则? 你能用合适的例子清楚地解释我吗? 这是一个测试数据库,不要介意不良的结构. 表的结构: ** TABLE - 'tes ...
- sql向数据库表中插入列,sql给表的列添加说明,sql添加主外键约束,增加列,增加字段
规则代码 use 数据库名--向表中插入列alter table 表名 add 列名 类型go--给表的列添加说明 execute sp_addextendedproperty 'MS_Descrip ...
- mysql 删除表数据_主外键关联表的数据删除策略
说个题外话,我从来没想过会被拼多多这款软件所魔怔,他的这种社交营销的能力,实在是太强了,在怂恿之下,开始给儿子拼个这个, 各位有空帮砍下,https://w.url.cn/s/AzlPAB9,或者扫下 ...
最新文章
- JSP实现网上招标系统
- 使Mybatis开发变得更加轻松的增强工具 — Ourbatis
- vscode从原有分支上新建_GitHub+VSCode 打造稳定、快速、高效、免费图床
- 类中的关键字public、protected、private究竟是什么意思?
- 移动用户体验设计中的原型应用
- 修改python的pip下载源
- 【华为云技术分享】DAS文件上传组件的进化
- 【LeetCode】7. Reverse Integer
- 能搞垮你的不止是同行
- windows安装安卓开发环境Eclipse+SDK+ADT
- 将html代码部署到阿里云服务器,并进行域名解析,以及在部署过程中遇到的问题和解决方法
- Java 类与对象的初始化
- 【Typecho插件】SakuraLoad
- IIS 访问页面出现500 – 内部服务器错误的解决方案
- ImportError: sys.meta_path is None, Python is likely shutting down 解决方案
- homebrew php 扩展,Mac homebrew-1.5以后安装php扩展的方法
- ESP32-C3入门教程 基础篇(六、TIMG 硬件定时器 与 软件定时器)
- 【翻译】CVPR2022: Pyramid Grafting Network for One-Stage High ResolutionSaliency Detection
- 如何解决:error: failed to push some refs to
- 汽车之家的后台怎么统计对比记录的,怎么做数据分析?
热门文章
- c语言结账程序设计,c语言餐饮结账管理系统设计.doc
- 2019 年天津科技大学电子设计竞赛:算法与策略-----B题
- 关于行人检测中的常用数据集
- **在一个字符串中寻找另外一个字符串**
- 从零开始开发一个自动抓取教务系统课表等信息并动态显示的安卓课程表APP,原理分析及功能实现完美教程
- 计算机微格教学心得体会,微格教学心得体会6篇_微格教学体会报告
- uniapp里自定义底部导航
- Angelababy代言《神魔》:不仅仅是打明星牌
- 世界战争2HTML5小游戏,[娱乐][PCD]SkyWarsReloaded —— 天空战争小游戏全新归来![1.8-1.13.2]...
- Redis实现分布式锁实现