创建和显示表
create database 数据库名 default charset=utf8; -> 声明默认编码;
show databases; 展示数据库中的表
show create table 表名 \G; 展示创建表的SQL语句,同时其中auto_increment=N,N为下一个插入数据的自增序列值(\G表示竖着显示)
show session/global variables 条件。 显示对话/全局变量。
创建表
create table 表名(
列名 数据类型 是否为空 自增 主键;
....
声明外键;
声明主键(另一种创建主键方式,适用于多主键);
声明唯一 -> 最后一行无";"
) engine = innodb auto_increment=N default charset=utf8; ->声明创建表的引擎和默认编码,其中innodb 特点为支持事务,可以进行回滚操作。以及自增的起始值和步长。
例子:
create table score(
sid int not null auto_increment primary key,
student_id int,
course_id int,
number int,
constraint fk_score_student foreign key student_id references student(sid),
constraint fk_score_course foreign key course_id references course(cid),
unique uni (student_id,course_id),
primary key (sid)(与第一行的primary key 可替换)
) engine = innodb auto_increment =N default charset=utf8;
数据类型
整形:int、tinyint、bigint
小数:float, double, demical -> 前两者为固定的一定小数点后精度,decimal则是基于字符串的原理进行存储,
可指定具体位数,demical(m,n) m表示所有的有效位数,n则表示小数点后的位数。
字符串:char、varchar-> char(n), varchar(n),均可表示长度最大为n的字符串。其中char,会将长度小于n的字符串补充至n位,varchar则不会。
优缺点:char 检索速度快,varchar 节省空间。
优化数据库方法: 定长的列往前放置,不定长的列向后放置。
原因: 在拿去数据时,对一行中的各列,char数据类型可以直接跳过n位,选取下一个列。而varchar则需要对后续的几位
进行遍历,直至该列数据结束。
text、mediumtext、longtext,用于表示最大长度位(2的16、24、32次方)-1 长度的字符串。
日期: ①DATE('YYYY-MM-DD') ②TIME('HH:MM:SS') ③ YEAR('YYYY') ④DATETIME('YYYY-MM-DD HH:MM:SS') ⑤TIMESTAMP('YYYYMMDD HHMMSS')
二进制数据:带有关键词Blog的类型
枚举:enum,例子: size ENUM(‘small','medium','large','x-large','xx-large') 从枚举其中只能选择一个数
集合:set, 例子 col SET('a','b','c','d') 从集合中可以选择多个数,相互之间用’,'隔开
主键 PRIMARY KEY:
特性①主键不一定为单列②主键具有唯一性(在多列时,只需要多列具有唯一性即可) ③主键不可为NULL。
声明方式:1. 列名......primary key
2. primary key ('列名','列名')
自增 AUTO_INCREMENT:
自增起始值
1.在创建表时 设置 auto_increment=N(结尾处,并非列的定义中)
2.alter table 表名 auto_increment = N。 将该表的自增序列值更改为N。
自增步长
show session/global variables like 'auto_increment'; 查看会话/全局变量值
set session/global auto_increment_increment=N; 设置会话/全局变量(测试结果发现auto_increment_offset似乎并不能改变表内的自增起始值,仍以表内auto_increment值为标准)
自增步长只能通过改变 session/global中 auto_increment_increment 变量进行修改。
而与auto_increment相关的变量包括:①auto_increment_increment,②auto_increment_offset,前者表示增加的步长,后者表示起始值。
session 与 global
可以使用 show session/global variables like 'auto_incre%' 的方式进行查看。其中session 为对话级别,仅在当前登录的对话有效。global 为全局级别,在下次登陆时时仍然有效。
唯一索引 UNIQUE:
unique 索引名 (列名,列名);
①约束性:要求唯一,若为多列,则表示为多列唯一;②索引特性:加快索引的速度。
与主键相比: 相同处:两者均要求唯一; 不同处:主键不可以为NULL,而唯一索引则存在NULL。
外键 FOREIGN KEY:
constraint 外键名 foreign key (本表列名,本表列名...) references 外表(列名), 外表(列名)...
constraint fk_student_course foreign key (sid) references course(student_id);
外键应用:①一对一,②一对多,③多对多等多种形式。
外键的意义:①在一对一和一对多的情况下,如果某一列只有固定几个值,直接使用字符串进行记录,会增大所需的存储空间,而使用外键用ID记录可以减少所需的存储空间。此外,也可以增加新的值。
②在多对多情况下,除了上述意义外,直接在原表中增加一列,尽管可以使用”a,b,c,d“方式,但这种情况下,在进行双向的检索时便需要遍历,将外键建表则可以极大地加快检索速度。