主要目标是在了解用户软件操作需求的基础上,提炼、总结、归纳出对数据库的需求。主要内容,数据库的存储结构、表中数据及其依赖关系、设计方案的优化与规范、视图等其他数据库对象的设计。注意:本课题讨论研究的是关系型数据库MySQL。
1,数据库管理系统(Database Management System,DBMS)是在文件管理系统基础上发展起来的数据管理技术,它建立在操作系统的基础上,对数据操作语句进行统一的管理和控制,并维护数据库的安全性和完整性,是数据库系统的核心组成部分
2,数据库:(DataBase,简称 DB)是存放数据的仓库,是相互关联的数据的集合。
3,SQL 语言:是结构化查询语言(Structured Query Language),是一种专门操作数据库中数据的语言。
4,在关系型数据库管理系统中主要包含以下这些存储结构:数据库、数据表、列、行、冗余、主键、外键、 复合键、索引、参照完整性。
列(字段):一列(数据元素) 包含了相同意义和相同类型的一组数据,在数据库中称为属性或字段。字段又包括字段名和字段值两个部分。
行(记录):一行是一组相关数据的集合,在数据库中称为元组或记录。
冗余:是指同一个数据在系统中多次重复出现。
主键:主键是某个(些)字段的特性,它要求主键中涉及到的字段取值必须是唯一且不能为空的,用来唯一标
识表中的每条记录。RDBMS规定一个数据表中只能包含一个主键
外键:外键用于关联两个表。表之间的外键关系有:一对一;一对多;多对多的关系
索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构
一个结构良好的数据库在软件运行时可以提高数据的存取效率、有效的降低数据冗余、增强数据的共享性和一致性。
1,完成数据库的设计:
分析需求
概念结构设计:要设计E-R 图 ,其三大要素是:实体、属性和关系。
数据库的逻辑设计:将 E-R 图转化为关系模型。并确定表中的字段名、数据类型、主键、 约束、表间关系。
数据库的物理设计
数据库设计优化
2,实体-关系模型(E-R图)介绍
实体(数据的载体)–>属性(实体的某些特征)–>关系
3,利用 E-R 模型进行逻辑设计
数据库设计阶段,可以利用生成的 E-R 模型导出表结构和表间关系。
模型中的实体映射表
模型中的属性映射为表中的字段
模型中的关系映射为表间关系
4,设计原则
5,实现数据库的规范化
MySQL 是一个轻量级、免费开源的关系型数据库管理系统。主要得益于其源码开源、体积小、速度快、总体拥有成本低、可移植性好等优点。
1,MySQL相关服务
[root@localhost ~]# systemctl start mysqld #启动
[root@localhost ~]# systemctl stop mysqld #停止
[root@localhost ~]# systemctl status mysqld #查看状态
[root@localhost ~]# systemctl restart mysqld #重启
2,登录MySQL
# 格式为:mysql -h 主机名或 IP 地址 -u 用户名 -p 用户密码
-h:要连接的主机名或IP地址
-u:要登录的用户
-p:登录时的用户密码(注意:p后没有空格)
[root@localhost ~]# mysql -uroot -p1
3,给root用户修改登录密码
`方法1,使用bin目录下的mysqladmin命令修改密码`
[root@localhost ~]# mysqladmin -uroot -p123 password 1
`方法2,进入MySQL的命令窗口后,使用set password命令修改密码`
SET PASSWORD FOR 用户名= PASSWORD '新密码' ;
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('1');
`方法3,进入MySQL的命令窗口后,使用update命令`
mysql> use mysql;
mysql> update user set authentication_string=password('1') where user='root' and host='localhost';
mysql> FLUSH PRIVILEGES;
4,使用常用命令
#默认的结束符为英文的‘;’
mysql> delimiter $ #改成$为结束符
exit和quit命令:为退出MySQL服务器。
status命令:查看当前MySQL服务器的信息。
use命令:进入某数据库。
主要目标是在数据库设计的基础上创建与操作数据库,为以后数据的存储和访问奠定基础。
建库完整语句
CREATE DATABASE [IF NOT EXISTS] db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
create database:建库
if not exists:不存就建
db_name:库名
[default]character set:指定建库的默认字符集
charset_name:字符集名称,常用utf8字符集
[default] collate:库排列规则 (是在字符集内用于比较字符的一套规则 可以控制 select
查询时 where 条件大小写是否敏感的规则。)
collation_name:排列规则名称
show character set:查看字符集名
show collation:查看可用的排列规则名
mysql> create database if not exists xsgl
mysql> default character set utf8
mysql> default collate utf8_general_ci;
#1,查看所有数据库
mysql> show databases;
#2,查看数据库的定义( show create database 数据库名称)
mysql> show create database xsgl;
#1,使用数据库
格式:use 库名;
mysql> use xsgl;
Database changed
#2,修改库默认字符集和排列规则(与create相似)
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
#3,删除库
格式:DROP DATABASE db_name; #每次只能删除一个
主要目标是在已创建好的数据库中根据前期设计出来的表结构来创建各个数据表和表中
约束,为以后的数据存储和操作奠定基础。
数据表从纵向划分是由若干个字段组成,每个字段都包括字段名、数据类型、长度、数据约束、默认值等信息。数据表从横向划分是由若干条记录组成,每条记录包含了一个
实体的所有字段值,描述了该实体的全部信息。
1,数据类型决定了数据的取值范围、存储方式与占用的空间大小以及能够对其进行的一组合法操作;在 MySQL 中常用的数据类型包括数值类型、字符串类型、日期和 时间类型、复合类型等。
2,数值类型:有整数类型和浮点数类型
在 MySQL 中支持的 5 个主要整数类型是 TINYINT、SMALLINT、MEDIUMINT、INT 和 BIGINT;
MySQL 支持的三个浮点类型是 FLOAT、DOUBLE 和 DECIMAL 类型。
3,字符串类型:MySQL 提供了 10 种基本字符串类型。
4,日期和时间类型:分为简单的日期、 时间类型,混合的日期、时间类型
1,从数据的逻辑存储结构上讲,表是数据库中真正存储数据的单元,是用户在数据库管理系统中操作数据
的主要对象。而从数据的物理存储结构上讲,表中的数据又是存放到它所对应的若干个物理文件中,这些文
件是真实存在于磁盘上的,它们的位置是由 MySQL 系统自动安排的。
2,存储引擎(也称表类型)
包括处理事务安 全表的引擎和处理非事务安全表的引擎
在 MySQL 系统中包括的存储引擎有:innodb 存储引擎、myisam 存储引擎、ndb 存储引擎、memory 存储
引擎、archive 存储引擎、maria 存储引擎
例如存储引擎innodb,“.frm”文件是表结构定义文件,“.ibd”文件是存储数据、索引和插入缓冲等信息的文件
#show engines; 查看引擎
#show create table 表名; 查看某表引擎
#SELECT * FROM 表名; 显示表中记录(字段的值)
3,建表
先选择一个数据库再在数据库中创建数据表(use 库名;)
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options] [select_statement]
temporary:临时表
tbl_name:表名
#[create_definition]:关键字段 ***
col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] [KEY] [COMMENT 'string']
col_name:段名
type:字段数据类型
[not null|null]:字段是否允许为空
[default default_value]:默认值
auto_increment:自动增长列【只有整型列才能设置此属性】
[unique [key] | [primary] [key]:字段是否为唯一键或主键
[comment 'string']:描述性文字
#table_options:新建表的一些属性设置
engine | type = engine_name:为表指定引擎
auto_increment = value:为表设置初始的 AUTO_INCREMENT 值
[default] character set charset_name [collate collation_name]:指定默认的字符集合与排列规则
default character set:字符集
default collate:排列规则
comment = 'string':表的注释,最长 60 个字符。
#select_statement:该选项表示新建的表是基于已有的查询结果集创建的
4,创建Student 表和Course 表
#学生表
create table if not exists Student
(StuID char(8),
StuName varchar(10),
StuSex char(2),
StuBirthday date,
Native varchar(20) comment '籍贯',
National char(6) comment '民族',
Telephone char(11),
ClassID char(10)
);
#课程表
create table Course
(CourseID char(8),
CourseName varchar(25),
CourseNature char(10) comment '课程性质',
Credit tinyint(1) comment '学分',
CourseRemark text comment '备注' )
engine=innodb
default character set utf8
default collate utf8_general_ci;
1,查看表结构
show tables; #查看库中的所有表(不包括临时表)
show create table 表名; #查看表的定义
describe | desc 表名; #查看表结构(某个表的各个字段的定义)
2,添加新的信息
#插入两条数据
mysql> insert into Student values('150101','张林浩','男','1997-01-12','河北保定','汉族','15831282200','mb1501');
mysql> insert into Student values('150102','赵申','男','1996-03-24','河北石家庄','汉族','15903120000','cp1502');
mysql> select * from 表名;
select子语句:用在create table中
#作用:可以将查询结果集中的数据插入到新表中(新旧表的数据是相同的)
格式:create table 表名 字段的定义列表 as select 语句
例如:
mysql> create table newStu select *from Student;
Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0
#如果在创建新表的同时,只想复制表结构而不想复制数据,那么可以使用 create table 新表名 like 旧表名。 这样创建的新表与旧表的结构、空值、索引、约束等完全相同,但是数据不会复制。(只有结构没有数据)
mysql> create table newStu1 like newStu;
Query OK, 0 rows affected (0.02 sec)
3,使用默认值
CREATE TEMPORARY TABLE IF NOT EXISTS 表名 #默认属性是可以改的
#创建教师表
create table Teacher
(TeacherID char(10),
TeacherName varchar(8),
TeacherSex char(2)default'女',
TeacherBirthday date,
Telephone char(11),
DepartmentID char(8)
);
#向表中插入数据(没有添加性别是因为在写架构时默认了的)
mysql> insert into Teacher(TeacherID,TeacherName,TeacherBirthday,Telephone,DepartmentID)
values('221100135','刘怡然','1977-02-12','13483217762','');
mysql> insert into Teacher values('221100146','刘亚军',default,'1977-05-06','13784426958','');
4,drop table语句-删表
可以一次删除多个表
格式:
drop table [if exists] 表名 1,表名 2,...
#例如删除newStu表
mysql> drop table newStu;
Query OK, 0 rows affected (0.06 sec)
#alter table 语句的总体格式如下:
alter table 表名
add column 字段名 字段的定义 [first | after 字段名] --添加新字段
|alter [column] 字段名 {set default 默认值|drop default} --设置默认值或删除默认值
|change [column] 旧的字段名 新的字段名 字段的定义 --修改字段的名称或字段的定义
|modify [column] 字段名 字段的新定义 --修改字段的定义
|drop [column] 字段名 --删除字段
|rename to 新表名 --为表重命名(rename table 旧表名 to 新表名)
数据库中的数据并不是杂乱无章的、随意的保存在表中的,数据会因业务逻辑的原因具有一些约束和限制,也就是说数据要保证它的合理性、正确性和完整性.类似于这样对字段取值的限制,我们称之为约束
表中的约束可以在创建表的同时为字段定义约束,也可以在创建表之后为字段增加约束
(可以在 create table语句中定义约束也可以在 alter table 语句中增加约束。)
#约束的统一格式:
[constraint 约束名] 约束关键字及定义语句
1,create table语句中定义约束
约束是对表中字段取值的限制,因此约束是定义在表结构中的
将只限制一个字段的约束称为字段级约束,一般直接定义在被约束的字段后面;
同时限制多个字段取值的约束,称为表级约束,需要在所有约束字段定义完成后才能定义表级约
束,因此表级约束一般定义在表结构的最后。
#使用 create table 语句定义表结构的同时定义约束
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(字段 n 数据类型 [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [约束定义语句] [COMMENT 'string'],
[[constraint 约束名] 约束定义语句] )
[table_options] [select_statement]
表结构的最后,作为单独的一部分定义,此时可以使用 constraint 关键字为约束命名。
义、 自动增长列、其他约束的定义、字段的描述性文字。
2,alter table 语句增加约束
ALTER TABLE 表名 ADD CONSTRAINT 约束名 约束定义语句
3,创建部门表和成绩表的主键约束
主键约束是限制表中的字段取值不能重复并且不能为空。表中的类似于编号这样的字段被定义为主键约束。
[constraint 约束名] primary key [(字段名)]
#主键约束的关键字是“primary key;约束在字段后约束可略,且不能为约束命名;后定义约束不略,且能 为约束命名; pk_id
#创建系部表(直接将约束定义在字段后面)
mysql> create table Department (DepartmentID char(8),primary key(DepartmentID),
DepartmentName varchar(20) );
#还是系部表(字段定义完成后,再单独定义约束)
create table Department
(DepartmentID char(8),
primary key(DepartmentID),
DepartmentName varchar(20)
);
#插入数据验证
insert into Department values('1311001','信息工程系');
组合主键中的每个字段允许有重复值,但是组合在一起不能重复,而且组合中的每个字段都不能取空值
[constraint 约束名] primary key [(字段名 1, 字段名 2,…, 字段名 n)]
#创建成绩表
create table Score
(StuID char(8),
CourseID char(8),
ExamScore int,
PartScore int,
primary key(StuID,CourseID)
);
#插入数据验证
insert into Score values('150101','10101',98,91);
组合主键只能定义为表级约束,定义在表的最后或被约束字段定义完成之后。
4,唯一约束
唯一键约束,又称替代键约束,它限制了被约束字段取值的唯一性,即字段值不能重复,但是允许为空 值 null,一个表中可以有多个唯一键约束
#格式:
[constraint 约束名] unique [(字段名)]
说明:当唯一键约束直接建立在字段后面的时候,“unique”关键字后面的字段名必须省略。
#创建专业信息表
create table Major (MajorID char(8)primary key, MajorName varchar(20)unique, DepartmentID char(8));
#插入信息验证有效性
insert into Major values('67001','移动通信开发','1311007');
5,创建学生表和教室信息表的非空约束
不允许为空约束是指限制一个字段的取值不允许有空值,即不能取 null 值
格式:在被约束的字段定义的数据类型的后面增加 not null 关键字即可,非空约束只能定义在当前字段的后面
#创建教室信息表(教室编号为主键约束,教室类型为非空约束)
create table Classroom (ClassroomID varchar(10)primary key, ClassroomType varchar(20)not null, PersonNumber int, Place varchar(20));
#插入数据验证有效性
insert into Classroom values('cm001','多媒体教室','100','a104');
6,创建教师表和点名表的检查约束
rchar(20)unique, DepartmentID char(8));
#插入信息验证有效性
insert into Major values(‘67001’,‘移动通信开发’,‘1311007’);
5,创建学生表和教室信息表的**非空约束**
- 不允许为空约束是指限制一个字段的取值不允许有空值,即**不能取 null 值**
- 格式:在被约束的字段定义的数据类型的后面增加 not null 关键字即可,**非空约束只能定义在当前字段的后面**
```shell
#创建教室信息表(教室编号为主键约束,教室类型为非空约束)
create table Classroom (ClassroomID varchar(10)primary key, ClassroomType varchar(20)not null, PersonNumber int, Place varchar(20));
#插入数据验证有效性
insert into Classroom values('cm001','多媒体教室','100','a104');
6,创建教师表和点名表的检查约束