mysql架构

mysql是一个开源的数据库管理系统,它相对于oracle更加地轻量、成本低

mysql的整体架构大体包括以下几个方面:

1)主体结构

2)物理文件组成

3)sql逻辑模块组成

4)sql逻辑模块协调工作

储存引擎

存储引擎就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎就是指表的类型。数据库的存储引擎决定了表在计算机中的存储方式

MyISAM存储引擎:

不支持事务、也不支持外键,优势是访问速度快,对事务完整性没有要求,以select,insert为主的应用基本上可以用这个引擎来创建表

其存储文件有3种

.frm 描述表结构

.MYD文件储存表的数据

.MYI文件存储表的索引

支持3种不同的存储格式,分别是:静态表;动态表;压缩表

静态表:表中的字段都是非变长字段,这样每个记录都是固定长度的,优点存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多(因为存储时会按照列的宽度定义补足空格)ps:在取数据的时候,默认会把字段后面的空格去掉,如果不注意会把数据本身带的空格也会忽略。

动态表:记录不是固定长度的,这样存储的优点是占用的空间相对较少;缺点:频繁的更新、删除数据容易产生碎片,需要定期执行OPTIMIZE TABLE或者myisamchk-r命令来改善性能

压缩表:因为每个记录是被单独压缩的,所以只有非常小的访问开支

InnoDB存储引擎

该存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM引擎,写的处理效率会差一些,并且会占用更多的磁盘空间以保留数据和索引。

支持自动增长列,支持外键约束

MEMORY存储引擎

Memory存储引擎使用存在于内存中的内容来创建表。每个memory表只实际对应一个磁盘文件,格式是.frm。memory类型的表访问非常的快,因为它的数据是放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失掉。

MEMORY存储引擎的表可以选择使用BTREE索引或者HASH索引,两种不同类型的索引有其不同的使用范围

3.字符集  字符序   character  , collation

给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这个数值就是字符的编码(Character Encoding)。

给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集

 

字符序是指在同一字符集内字符之间的比较规则。只有确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系。每个字符序唯一对应一种字符集,一个字符集可以对应多种字符序,其中有一个是默认字符序

 

数据库设计原则

1一对一设计原则

2、独特命名原则:减少重复,维护数据唯一性

3、双向使用原则

 

总结 建表+约束的sql

创建表create table 表名

CREATE TABLE xi(
xiid int PRIMARY key,      主键约束
xiname int UNIQUE,        唯一性约束
xizhuren int not NULL,       非空约束
xixiao char(20) CHECK(xixiao in('南湖校区','浑南校区')),    检查性约束
classid int,
CONSTRAINT fk_class FOREIGN key(classid) REFERENCES class(classname),外键约束
sex enum(‘男’,’女’),       枚举类型
sname varchar(10) default ‘zhangsan’,    设定默认值
sid int auto_increment not null  自增
)

 

 

 

1.创建表date_test,包含列d,类型为date型。试向date_test表中插入两条记录,一条当前系统日期记录,一条记录为“1998-08-18”。

CREATE TABLE date_test(d date)
INSERT INTO date_test(d)
VALUES(CURDATE())
INSERT into date_test(d)
VALUES('1998-08-18')

2.创建与dept表相同表结构的表dtest,将dept表中部门编号在40之前的信息插入该表。
create table dtest as select * from dept where deptno<40;

3.创建与emp表结构相同的表empl,并将其部门编号为前30号的员工信息复制到empl表。
create table emp1 as select * from emp where deptno<30;

4.试为学生表student增加一列学生性别gender 默认值 “女”。
ALTER TABLE student add gender VARCHAR(10) DEFAULT '女'
5.试修改学生姓名列数据类型为定长字符型10位。
alter table student modify name char(10)

 

 

 

 

1.简述5种约束的含义。

    1、not null 非空约束:主要作用为约束列值不能为空

    2、primary key 主键约束:约束列值唯一且不能为空

    3、foreign key 外键约束:约束列值与父项相关

    4、unique 唯一约束:约束列值必须唯一

5、check 检查约束:在列上必须有一个满足条件

2.创建学生关系sc,包括属性名:

    --  选课流水号 数值型 主键;

    --  学生编号 非空 外键

    --  课程编号 非空 外键;

    --  成绩 0-100之间;

CREATE TABLE sc(
scid INT PRIMARY key,
studentno int,
CONSTRAINT fk_studentno FOREIGN key(studentno) REFERENCES student(id),
classid int,
CONSTRAINT fk_class FOREIGN key(classid) REFERENCES class(classname),
grade int CHECK (grade BETWEEN 0 and 100)
)

 

3

创建copy_emp,要求格式同emp表完全一样,不包含数据

CREATE TABLE copy_emp SELECT * FROM emp WHERE 1=2

4

创建copy_dept,要求格式同dept表完全一样,不包含数据

-- CREATE TABLE copy_dept SELECT *FROM dept WHERE 1=2

5

设置copy_emp表中外键deptno,引用copy_dept中deptno,语句能否成功,为什么? ALTER TABLE copy_emp ADD CONSTRAINT pk_deptno PRIMARY KEY(deptno) REFERENCES copy_dept(deptno); 不能,引用的需要是主键

6

设置copy_dept表中主键deptno

ALTER TABLE copy_dept ADD CONSTRAINT pk_deptno PRIMARY KEY(deptno);