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);