列的数据类型
整型
类型 | 取值范围 |
---|---|
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;