DDL
很久很久以前学习mysql的笔记记录,很随意,但都是自己记录的,希望对需要的人有所帮助。
本文使用word2013编辑并发布
Postbird | There I am , in the world more exciting!
Postbird personal website .www.ptbird.cn
创建表table
建表的过程就是声明列的过程
列的类型 列的属性。(既能放下内容又不浪费空间,速度还要快)
列的类型及其属性:
create table XXX(
->列1 类型 属性 值
->列2 类型 属性 值)charset utf8 engine myisam;
数值型(整型 浮点型 定点型)
字符串型(char varchar text)
日期时间型(2010-2-3 14:26:23)
数值-整型:int(4字节)
bigint int mediumint smallint tinyint
整型列的可选参数
unsigned 默认是有符号的 可以设定为无符号
zerofill M 适合用于学号编码等固定宽度的数字 可以从0填充到固定宽度M
zerofill决定列为unsigned
alter table t1 add sn tinyint(5) zerofill; (5)->(M)
数值-浮点型:
float(M,D)
M:精度总位数 D: 小数点后面的位数
double
有精度的损失
数值-定点型:
decimal(M,D):
没有精度的损失,更精确
字符-char varchar text blob enum set:
char(M): 定长
char(10); 就算是没有10个字符,也占10个字符的长度
查找方便 每次查找,只需要向后查10长度,利用率可能达到100
varcahr(M):变长
varchar(10); 最长10的字符,
前面有标志,通过标志(1-2个字节)查找,利用率不可能100%
M比较短,用char,比较长用varchar
char 不够M字符,存储的时候,向右不空格,取出时,去掉空格。varchar后面的空格不会丢掉
text(); 文本类型
blob(); 是二进制类型,用来存储图像,音频等二进制信息;
blob 不会考虑字符集,不会丢失信息。(不同的字符集可能过滤掉一个信息)
enum();枚举类型 定义好 值在某几个枚举范围内的一个
例如 gender()性别 只能是 男 或者 女;
set();集合的意思 可以一次选几个(区别enum);
日期时间 Year Date Time datetime 时间戳:
Year(1字节) 95/1995 (1901-2155)
Date 日期 1995-12-31 (1000/01/01->9999/12/31)
Time 时间 13:25:12 (-838:59:59->838:59:59)
Datetime 日期时间 1995-12-31 13:25:12 (1000/01/01 00:00:00->9999/12/31 23:59:59)
时间戳 timestamp:1970/01/01 00:00:00 到当前的秒数
一般存注册时间或者发布时间用时间戳 因为datetime虽然直观,但是计算不方便。
列的默认值:
null 查询不方便,索引效率低 实用中避免列的值是 null
声明 列的值不是null not null default XXX;
主键与自增:
primary key 主键:能够区分每一行,不重复
auto_increment: 一张表上只能有一个自增列,自增列必须加索引 index/key;
建表案例:
将定长不定长分离,将常用不常用分离。
列的删除,增加,修改:
新增列:
alter table 表名 add 列名 列类型 列属性 位置默认在最后;
alter table 表名 add 列名 列类型 列属性 after 列名;
删除列:
alter table 表名 drop column 列名;
修改列属性:
alter table 表名 change 列名 新列名 新属性;
alter table 表名 modify 列名 新属性;(不能改列名)
视图 View:
视图 view:view又被称为虚拟表,view是sql的查询结果
create view 名字 as select name from user3;
select * from 名字;
作用:
权限控制可以使用 某几个列允许查询,其他列不允许,通过视图开放其中的一列或几列
简化复杂的查询
如果 view虚拟表和物理表是相对应的,相当于一个坐标轴的(x,y)都是相对应的。
可以 修改物理表 能够影响到view虚拟表,view虚拟视图可以修改,并且修改view会影响物理表
如果 view虚拟表是物理表计算的结果
那么 修改物理表 虚拟表会改变,修改虚拟表不会影响到物理表。
视图的algorithm:
算法:merge(合并):
对于简单查询形成的 view,再对view查询时
建视图语句+查视图的语句----->查物理表的语句
这种视图只是存一个语句
create algorithm=merage view v1 as .........
算法:temptable:
视图的语句本身比较复杂,很难和查询视图的语句合并,mysql可以先执行视图的创建语句
把结果形成内存中的临时表,然后在对临时表进行查询形成新的view
create algorithm=temptable view v1 as.......
针对表,视图的相关操作:
show tables; 查看当前数据库下有哪些表(view包括在其中)
desc 表名; 查看表,view的结构
drop table 表名; 删除表
drop view 视图名; 删除视图
show create table 表名; 查看表的创建过程(也可以查看view创建过程)
show create view 视图名; 产看 view创建过程
show table statu s \G;查看表的详细信息(\G竖直显示)
show table status where name='表名' \G;(查看某一张表的信息)
rename table 旧表名 to 新表名; 更改表名
delete from 表名; 删除表中的所有数据 (但是再次建立表的时候 自增长的信息不会丢失)
truncate 表名; 删除表同时初始化所有信息包括自增长;