MySQL中的数据类型,列选项,视图


列的数据类型

整型

类型 取值范围
tinyint -128 - 127
smallint -32768 - 32767(几万)
mediumint -8388608 - 8388607(几百万)
integer -2147484468 - 2147483647(几十亿)
bigint -9223372036854775808 - 9223372036854775807(天文数字)

小数类型

decimal[精度,小数位数]
小数位数是定数;数值是什么就是什么,不会进行类似于四舍五入,不会存储近似值。

浮点类型

float[长度,小数位数]
double[长度,小数位数]
float的小数位数不是固定的;超出存储范围,近似值进行存储。

小结:

  • decimal用来存精确值、定数。
  • float存储可以四舍五入的。

位类型

bit[(长度)]
场景:
这里写图片描述

字符串类型

  • char 0-255
  • varchar 0-65535 (长度指的是字符的长度。最常用varchar)
  • long varchar:2^24-1
  • longtext:4G个字符

日期类型

  • date 3字节
  • datetime 8字节
  • time 3字节
  • timestamp 4字节
  • year[(2) | (4)] 1字节

二进制大对象类型

  • binary: 255个字符
  • varbinary :65535个字符
  • blob: 65535字符 ,比如存储照片
  • long varbinary: 2的24次方减1个字符
  • long blob: 2的32次方-1个字符

数字列上的列选项

  • unsigned:无符号的,表示只允许正数。
  • zerofill:填充0
  • auto_increment:自动增长。只适应于整数类型。一个表中只有一个列可以是自动增长的。

这里写图片描述

临时表

临时表是一张表,用来临时保存一些数据。它只对创建它的用户可见。当会话结束时,MySQL自动删除临时表。
保存这些数据的时候,尽量少的占用资源,删除数据的时候,尽量少的占用资源。
临时表的核心:建立和删除表以及里面的数据时,消耗资源非常小。
例:创建临时表sumpenalties,保存所有罚款的总和。

CREATE TEMPORARY TABLE sumpenalties(
total DECIMAL(10,2)
); 

CTAS举例

if not exit :强制不显示出错消息。

这里写图片描述

根据已有的表创建新表

结构一样。
create table copy_teams LIKE teams;(空表,不带数据)
create table copy_teams_1 AS select * from teams;(带数据)
--》PS:这个SELECT可以非常非常的复杂

default

这里写图片描述
这里写图片描述

表选项

例26: 创建表city_names,其主键列从10开始编号。

CREATE TABLE city_names(
  seqno INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
  NAME VARCHAR(30) NOT NULL
) AUTO_INCREMENT = 10;

INSERT INTO city_names VALUES(NULL,'北京');
INSERT INTO city_names VALUES(NULL,'上海');
INSERT INTO city_names VALUES(NULL,'天津');
SELECT * FROM city_names;

这里写图片描述
可以看到,序号是从10开始的。

comment:给表添加注释

CREATE TABLE mycomm(
column_a  INTEGER
) COMMENT '测试表';

约束,非空,主键,唯一键

约束的类型

  • NOT NULL:非空约束,强烈建议使用,这个列上不能有空值。
  • UNIQUE:唯一性约束。这个列的值唯一,可以有多个空值。一个表可以有多个unique。
  • PRIMARY KEY:主键约束,一个表只有一个,这个列的数值唯一。不能为空。
  • FOREIGN KEY:外键约束。
  • CHECK:检查约束

约束定义的时间:

  • 使用CREATE TABLE语句
  • 表已经创建完了,使用ALTER TABLE语句

外键约束

  • 外键是一个约束
  • 外键约束什么呢?
    • 一个表的一个列的数值来自于另外一个表的一个列的数值,成绩表里面的学号这个列里面的所有的数值(学号),来自于学生表里面的学号这个列里面的数值。
  • 外键引用的一定是另外一个表的主键或者唯一键。

on delete(update)

外键约束

  • 1.从表insert数据,会检查主表,看一下外键列的数据是否来自于主键列。
  • 2.对主表进行delete时,检查外表,看一下外表中是否引用了主表中要删除的数据。

只要有引用,主表就受到了限制。
主表删除数据,子表引用了主表的数据。

enum枚举、set

create table t1(id int,name varchar(10),sex enum('男','女'));      --》只能取男或者女
desc t1;
insert into t1 values(1,'张三','男');
insert into t1 values(2,'李四','女');
insert into t1 values(3,'张三','M');

–》会报错,因为只能是’男’或者’女’!

这里写图片描述

enum和set的异同

不同:

  • set(‘one’,’two’,’three’,’four’); –》可以同时取其中的多个。
  • enum(‘男’,’女’)); –》只能取男或者女

相同点:

  • 都是对数据库的规范;
  • 后面都不接数据类型

check约束

check(id>100);

check约束的括号里面可以是巨复杂的表达式。

alter、drop table的风险

删除表以前:

  • 1.确认这个表没有人在使用,确实是一个废除的表。
  • 2.确认是这个数据库的表,别删错了别的表。

(建议:status看一下此时的状态!!再删!)

删除临时表要加temporary:

这里写图片描述

表的修改操作

alter修改表的操作

  • 1.增加一个列
  • 2.删除一个列
  • 3.修改一个列的数据类型 varchar-int
  • 4.修改一个列的数据类型的宽度 varchar(10) varchar(20)

添加一个新列时,默认是加在最后。

mysql>alter table t1 add COLUMN b_date date not null after name;

–》在name列后面添加一个新列b_date
这里写图片描述

删除列的语句

mysql>alter table t1 drop column b_date;
--》删除b_date列

修改列的数据类型

mysql>alter table t1 modify sex int;
--》把sex列的数据类型宽度

修改列的数据类型的宽度

mysql>alter table t1 modify sex varchar(10);
--》把sex列的宽度改为varchar(10);

对表进行约束的添加和删除

联合主键、几个列合起来形成一个主键。

风险分析

  • 1.数据字典级别改一下。速度快。
  • 2.对100万个数据块进行修改。速度慢。在十分钟的时间里是不能操作的。

视图

视图基本定义

  • 视图是一个逻辑表,它本身并不包含数据。通过它,可以展现基表的部分数据。
  • 用来创建视图的表叫做基表BASE TABLE
  • 视图是作为一个SELECT语句保存在数据字典中的。

视图语法

-CREATE  [OR REPLACE] VIEW view_name [(column_list)]    
-AS  select_statement  
- [WITH [CASCADED | LOCAL] CHECK OPTION]
-OR REPLACE:如果视图已经存在则替换它

视图基本功能

  • 查询接口
  • 权限控制
create view v_players as
select 语句

视图别名

create or replace view 视图名(别名,......)
as select 
字段,......
from 表名

通过视图修改表

此方法不常用。
例:
从视图中cplayers中删除联盟会员号码为6524的球员 。

DELETE FROM cplayers
WHERE leagueno=‘6524’; 

因为视图本身没有数据,因此对视图进行的dml操作最终都体现在基表中。

with check option约束

对于可以执行DML操作的视图,定义时可以带上WITH CHECK OPTION约束。该约束的作用是:对视图所做的DML操作的结果,不能违反视图的WHERE条件的限制 。
例:创建视图,包含1960年之前出生的所有球员(老兵)。

CREATE OR REPLACE VIEW veterans
AS SELECT *
FROM players
WHERE birth_date < '1960-01-01'
WITH CHECK OPTION;

视图权限

示例1:以用户newroot执行:

CREATE USER  'demo'@'%'   IDENTIFIED BY 'demo'; 

创建视图,视图的定义者是demo

CREATE OR REPLACE
   DEFINER='demo'@'%'
   SQL SECURITY DEFINER
VIEW cplayers  
AS SELECT playerno,leagueno
       FROM players
     WHERE leagueno IS NOT NULL; 

把视图的select权限授给demo :

GRANT SELECT ON tennis.cplayers  TO  'demo'@'%' ;

例:以用户newroot执行:

CREATE OR REPLACE
  SQL SECURITY  DEFINER
VIEW cplayers  
AS SELECT playerno,leagueno
     FROM players
    WHERE leagueno IS NOT NULL;
posted @ 2017-11-08 21:01  斯言甚善  阅读(736)  评论(0编辑  收藏  举报