美文网首页
深入浅出MySQL(二)

深入浅出MySQL(二)

作者: 憨憨二师兄 | 来源:发表于2020-04-02 22:22 被阅读0次

MySQL中的数据类型

整数型

浮点型

M是数字的总位数 D是小数点后面的位数 ;(M,D) 可以省略 但是如果省略则会根据硬件允许的限制来保存值。
FLOAT和DOUBLE是浮点数,DECIMAL则是定点数,定点数内部以字符串的形式进行存储,所以更加精确。

字符串类型


字符串类型中:
CHAR为定长型字符串;VARCHAR为变长型字符串。其中,M为定义的长度,即:CHAR定义了多少个字节就为多少个字节的长度;而VARCHAR存储的字节为L(length)+1,即:VARCHAR存储的字节数为实际长度+1个字节,其中多出的1个字节用来保存实际使用了多大的长度。
如:
保存一个字符串'kim'
定义一个CHAR(10)和VARCHAR(10)来保存这个字符串。
CHAR会用10个字节来存储这个字符串;而VARCHAR虽然定义了10个字节,但是实际上会用3+1个字节来进行存储。但是CHAR的效率要高于VARCHAR,CHAR相当于拿空间换时间,VARCHAR相当于拿时间换空间。
另外,CHAR默认在存储数据的时候会用空格填充到指定长度;而在检索的时候会去掉后面的空格,测试如下:

-- 测试CHAR和VARCHAR
-- CHAR的效率高于VARCHAR CHAR相当于拿空间换时间,VARCHAR相当于拿时间换空间
CREATE TABLE test_str(
    a CHAR(5),
    b VARCHAR(5)
);
INSERT test_str(a,b) VALUES(' 123 ',' 123 ');
SELECT CONCAT('*',a,'*'),CONCAT('*',b,'*') FROM test_str;
-- 在查询的时候,CHAR会自动抹去后面的空格
+-------------------+-------------------+
| CONCAT('*',a,'*') | CONCAT('*',b,'*') |
+-------------------+-------------------+
| * 123*            | * 123 *           |
+-------------------+-------------------+

时间类型


时间类型的测试如下:

-- 测试TIME类型
-- HH:MM:SS[D HH:SS:SS]
CREATE TABLE test_time(
    a TIME
);
INSERT test_time(a) VALUES('12:23:45');
INSERT test_time(a) VALUES('2 12:23:45'); -- 相当于60:23:45
INSERT test_time(a) VALUES('22'); -- 相当于22秒
INSERT test_time(a) VALUES('2 22'); -- 相当于70:00:00

INSERT test_time(a) VALUES(NOW());
INSERT test_time(a) VALUES(CURRENT_TIME);

-- 测试DATE类型YYYY-MM-DD YYYYMMDD
CREATE TABLE test_date(
    a DATE
);

INSERT test_date(a) VALUES('2020-04-01');
INSERT test_date(a) VALUES('20200401');
INSERT test_date(a) VALUES(NOW());
INSERT test_date(a) VALUES(CURRENT_DATE);

-- 测试DATETIME
CREATE TABLE test_datetime(
    a DATETIME
);
INSERT test_datetime(a) VALUES('2020-04-01 22:05:48');
INSERT test_datetime(a) VALUES(NOW());

-- 测试TIMESTAMP
CREATE TABLE test_timestamp(
    a TIMESTAMP
);
INSERT test_timestamp(a) VALUES('1978-10-23 12:12:12');
-- 如果插入CURRENT_TIMESTAMP
-- 或者插入NULL
-- 或者什么也不写
-- 或者插入NOW()
-- 则会得到当前系统日期和时间

INSERT test_timestamp(a) VALUES(CURRENT_TIMESTAMP);
INSERT test_timestamp(a) VALUES(NULL);
INSERT test_timestamp(a) VALUES(NOW());
INSERT test_timestamp VALUES();

-- 测试YEAR
CREATE TABLE test_year(
    a YEAR
);
INSERT test_year(a) VALUES('2020');

MySQL中的完整性约束条件

PRIMARY KEY 和 AUTO_INCREMENT

PRIMARY KEY
主键,标识着记录的唯一性,值不能重复,一个表只能有一个主键,且自动禁止为空
AUTO_INCREMENT
自动增长,只能用于数值列,而且要配合索引进行使用;默认起始值从1开始增长,每次增长1
主键和自增长的测试如下:

-- 测试主键 
CREATE TABLE test_primary_key(
    id INT UNSIGNED PRIMARY KEY,
    username VARCHAR(20)
);

-- PRIMARY KEY 可以省略为 KEY 
CREATE TABLE test_primary_key1(
    id INT UNSIGNED KEY,
    username VARCHAR(20)
);

-- 也可以这样定义主键
CREATE TABLE test_primary_key2(
    id INT UNSIGNED,
    username VARCHAR(20),
    PRIMARY KEY(id)
);

-- 复合主键,可以使多个字段共同作为主键
CREATE TABLE test_primary_key3(
    id INT UNSIGNED,
    courseId INT UNSIGNED,
    username VARCHAR(20),
    email VARCHAR(50),
    PRIMARY KEY(id,courseId)
);

-- 测试AUTO_INCREMENT
CREATE TABLE test_auto_increment(
    id INT UNSIGNED KEY AUTO_INCREMENT,
    username VARCHAR(20)
);

UNSIGNED和ZEROFILL

UNSIGNED
无符号,没有负数即,从0开始
ZEROFILL
零填充,当显示长度不够的时候可以使用前补0的效果,填充至指定的长度

-- 测试零填充 ZEROFILL
CREATE TABLE test_zerofill(
    a TINYINT ZEROFILL,
    b SMALLINT ZEROFILL,
    c MEDIUMINT ZEROFILL,
    d INT ZEROFILL,
    e BIGINT ZEROFILL
);

INSERT test_zerofill(a,b,c,d,e) VALUES(1,1,1,1,1);

显示效果如下:

+------+-------+----------+------------+----------------------+
| a    | b     | c        | d          | e                    |
+------+-------+----------+------------+----------------------+
|  001 | 00001 | 00000001 | 0000000001 | 00000000000000000001 |
+------+-------+----------+------------+----------------------+

NOT NULL

NOT NULL 非空约束,在插入值的时候,这个字段必须要给值,值不能为空值
测试程序如下:

-- 测试NOT NULL
CREATE TABLE test_not_null(
    a VARCHAR(20),
    b VARCHAR(20) NOT NULL
);
INSERT test_not_null(a,b) VALUES(NULL,'haha');

显示结果为:

+------+------+
| a    | b    |
+------+------+
| NULL | haha |
+------+------+

DEFAULT

DEFAULT 默认值,如果插入记录没有给字段赋值,则使用默认值
测试程序如下:

-- 测试DEFAULT
CREATE TABLE test_default(
    id INT UNSIGNED AUTO_INCREMENT KEY,
    username VARCHAR(20) NOT NULL,
    age TINYINT UNSIGNED DEFAULT 18,
    email VARCHAR(50) NOT NULL
);
INSERT test_default(username,email) VALUES('C','123456@qq.com');

显示结果为:

+----+----------+------+---------------+
| id | username | age  | email         |
+----+----------+------+---------------+
|  1 | C        |   18 | 123456@qq.com |
+----+----------+------+---------------+

UNIQUE KEY

UNIQUE KEY即唯一索引,代表唯一性。一个表中有多个字段是唯一索引,值不能重复,NULL除外
测试如下:

-- 测试 UNIQUE KEY
CREATE TABLE test_unique(
    id INT UNSIGNED AUTO_INCREMENT KEY,
    username VARCHAR(20) NOT NULL UNIQUE KEY,
    email VARCHAR(50) UNIQUE,
    card CHAR(18) UNIQUE
); 
-- NJLL值不算重复
INSERT test_unique(username,email,card) VALUES('A',NULL,NULL);
INSERT test_unique(username,email,card) VALUES('B',NULL,NULL);

结果如下:

+----+----------+-------+------+
| id | username | email | card |
+----+----------+-------+------+
|  1 | A        | NULL  | NULL |
|  2 | B        | NULL  | NULL |
+----+----------+-------+------+

FOREIGN KEY

FOREIGN KEY 外键约束,后面再说\

创建完整的用户表

利用MySQL数据类型和完整性约束条件可以创建一个完整的用户表

-- user
CREATE TABLE IF NOT EXISTS `user`(
    `id` INT UNSIGNED AUTO_INCREMENT KEY COMMENT '用户编号',
    `username` VARCHAR(20) NOT NULL UNIQUE COMMENT '用户名',
    `password` CHAR(32) NOT NULL COMMENT '密码',
    `email` VARCHAR(50) NOT NULL UNIQUE COMMENT '邮箱',
    `age` TINYINT UNSIGNED NOT NULL DEFAULT 18 COMMENT '年龄',
    `sex` ENUM('男','女','保密') NOT NULL DEFAULT '保密' COMMENT '性',
    `tel` CHAR(11) NOT NULL UNIQUE COMMENT '电话',
    `addr` VARCHAR(50) NOT NULL DEFAULT '北京' COMMENT '地址',
    `card` CHAR(18) NOT NULL UNIQUE COMMENT '身份证号',
    `married` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '0代表未结婚,1代表已婚',
    `salary` FLOAT(8,2) NOT NULL DEFAULT 0 COMMENT '薪水'
)ENGINE = INNODB DEFAULT CHARSET = UTF8;

相关文章

网友评论

      本文标题:深入浅出MySQL(二)

      本文链接:https://www.haomeiwen.com/subject/eaoguhtx.html