三 表操作

一 存储引擎介绍

  一、什么是存储引擎

  二、MySQL支持的存储引擎

  三、使用存储引擎

二 表介绍、创建及查询

三 数据类型

  一、类型介绍

  二、数值类型

  三、日期类型

  四、字符串类型

  五、枚举类型与集合类型

四 表完整性约束

五 修改表ALTER TABLE

六 复制表

七 删除表

一 存储引擎介绍

一、什么是存储引擎

mysql中建立的库===>文件夹

库中建立的表===>文件

现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等

数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。

存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方
法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和
操作此表的类型)

在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql
数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据
自己的需要编写自己的存储引擎

SQL 解析器、SQL 优化器、缓冲池、存储引擎等组件在每个数据库中都存在,但不是每 个数据库都有这么多存储引擎。MySQL 的插件式存储引擎可以让存储引擎层的开发人员设 计他们希望的存储层,例如,有的应用需要满足事务的要求,有的应用则不需要对事务有这 么强的要求 ;有的希望数据能持久存储,有的只希望放在内存中,临时并快速地提供对数据的查询。

二、MySQL支持的存储引擎

1 MariaDB [(none)]> show engines\G  #查看所有支持的存储引擎
2 MariaDB [(none)]> show variables like ‘storage_engine%‘; #查看正在使用的存储引擎

MySQL存储引擎介绍

 1 #InnoDB 存储引擎
 2 支持事务,其设计目标主要面向联机事务处理(OLTP)的应用。其
 3 特点是行锁设计、支持外键,并支持类似 Oracle 的非锁定读,即默认读取操作不会产生锁。 从 MySQL 5.5.8 版本开始是默认的存储引擎。
 4 InnoDB 存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样由 InnoDB 存储引擎自身来管理。从 MySQL 4.1(包括 4.1)版本开始,可以将每个 InnoDB 存储引擎的 表单独存放到一个独立的 ibd 文件中。此外,InnoDB 存储引擎支持将裸设备(row disk)用 于建立其表空间。
 5 InnoDB 通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了 SQL 标准 的 4 种隔离级别,默认为 REPEATABLE 级别,同时使用一种称为 netx-key locking 的策略来 避免幻读(phantom)现象的产生。除此之外,InnoDB 存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead) 等高性能和高可用的功能。
 6 对于表中数据的存储,InnoDB 存储引擎采用了聚集(clustered)的方式,每张表都是按 主键的顺序进行存储的,如果没有显式地在表定义时指定主键,InnoDB 存储引擎会为每一 行生成一个 6 字节的 ROWID,并以此作为主键。
 7 InnoDB 存储引擎是 MySQL 数据库最为常用的一种引擎,Facebook、Google、Yahoo 等 公司的成功应用已经证明了 InnoDB 存储引擎具备高可用性、高性能以及高可扩展性。对其 底层实现的掌握和理解也需要时间和技术的积累。如果想深入了解 InnoDB 存储引擎的工作 原理、实现和应用,可以参考《MySQL 技术内幕:InnoDB 存储引擎》一书。
 8
 9 #MyISAM 存储引擎
10 不支持事务、表锁设计、支持全文索引,主要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本之前是默认的存储引擎(除 Windows 版本外)。数据库系统 与文件系统一个很大的不同在于对事务的支持,MyISAM 存储引擎是不支持事务的。究其根 本,这也并不难理解。用户在所有的应用中是否都需要事务呢?在数据仓库中,如果没有 ETL 这些操作,只是简单地通过报表查询还需要事务的支持吗?此外,MyISAM 存储引擎的 另一个与众不同的地方是,它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,这与 大多数的数据库都不相同。
11
12 #NDB 存储引擎
13 年,MySQL AB 公司从 Sony Ericsson 公司收购了 NDB 存储引擎。 NDB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC 集群,不过与 Oracle RAC 的 share everything 结构不同的是,其结构是 share nothing 的集群架构,因此能提供更高级别的 高可用性。NDB 存储引擎的特点是数据全部放在内存中(从 5.1 版本开始,可以将非索引数 据放在磁盘上),因此主键查找(primary key lookups)的速度极快,并且能够在线添加 NDB 数据存储节点(data node)以便线性地提高数据库性能。由此可见,NDB 存储引擎是高可用、 高性能、高可扩展性的数据库集群系统,其面向的也是 OLTP 的数据库应用类型。
14
15 #Memory 存储引擎
16 正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重 启或发生崩溃,表中的数据都将消失。它非常适合于存储 OLTP 数据库应用中临时数据的临时表,也可以作为 OLAP 数据库应用中数据仓库的维度表。Memory 存储引擎默认使用哈希 索引,而不是通常熟悉的 B+ 树索引。
17
18 #Infobright 存储引擎
19 第三方的存储引擎。其特点是存储是按照列而非行的,因此非常 适合 OLAP 的数据库应用。其官方网站是 http://www.infobright.org/,上面有不少成功的数据 仓库案例可供分析。
20
21 #NTSE 存储引擎
22 网易公司开发的面向其内部使用的存储引擎。目前的版本不支持事务, 但提供压缩、行级缓存等特性,不久的将来会实现面向内存的事务支持。
23
24 #BLACKHOLE
25 黑洞存储引擎,可以应用于主备复制中的分发主库。
26
27 MySQL 数据库还有很多其他存储引擎,上述只是列举了最为常用的一些引擎。如果 你喜欢,完全可以编写专属于自己的引擎,这就是开源赋予我们的能力,也是开源的魅 力所在。

三、使用存储引擎

方法1:建表时指定

1 MariaDB [db1]> create table innodb_t1(id int,name char)engine=innodb;
2 MariaDB [db1]> create table innodb_t2(id int)engine=innodb;
3 MariaDB [db1]> show create table innodb_t1;
4 MariaDB [db1]> show create table innodb_t2;

方法2:在配置文件中指定默认的存储引擎

1 /etc/my.cnf
2 [mysqld]
3 default-storage-engine=INNODB
4 innodb_file_per_table=1

查看

1 [[email protected] db1]# cd /var/lib/mysql/db1/
2 [[email protected] db1]# ls
3 db.opt  innodb_t1.frm  innodb_t1.ibd  innodb_t2.frm  innodb_t2.ibd

练习

创建四个表,分别使用innodb,myisam,memory,blackhole存储引擎,进行插入数据测试

 1 MariaDB [db1]> create table t1(id int)engine=innodb;
 2 MariaDB [db1]> create table t2(id int)engine=myisam;
 3 MariaDB [db1]> create table t3(id int)engine=memory;
 4 MariaDB [db1]> create table t4(id int)engine=blackhole;
 5 MariaDB [db1]> quit
 6 [[email protected] db1]# ls /var/lib/mysql/db1/ #发现后两种存储引擎只有表结构,无数据
 7 db.opt  t1.frm  t1.ibd  t2.MYD  t2.MYI  t2.frm  t3.frm  t4.frm
 8
 9 #memory,在重启mysql或者重启机器后,表内数据清空
10 #blackhole,往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录

二 表介绍、创建及查询

表介绍

表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段

创建表

#语法:
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);

#注意:
1. 在同一张表中,字段名是不能相同
2. 宽度和约束条件可选
3. 字段名和类型是必须的
MariaDB [(none)]> create database db1 charset utf8;

MariaDB [(none)]> use db1;

MariaDB [db1]> create table t1(
    -> id int,
    -> name varchar(50),
    -> sex enum(‘male‘,‘female‘),
    -> age int(3)
    -> );

MariaDB [db1]> show tables; #查看db1库下所有表名

MariaDB [db1]> desc t1;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| id    | int(11)               | YES  |     | NULL    |       |
| name  | varchar(50)           | YES  |     | NULL    |       |
| sex   | enum(‘male‘,‘female‘) | YES  |     | NULL    |       |
| age   | int(3)                | YES  |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+

MariaDB [db1]> select id,name,sex,age from t1;
Empty set (0.00 sec)

MariaDB [db1]> select * from t1;
Empty set (0.00 sec)

MariaDB [db1]> select id,name from t1;
Empty set (0.00 sec)

 1 MariaDB [db1]> insert into t1 values
 2     -> (1,‘lucy‘,18,‘female‘),
 3     -> (2,‘anna‘,19,‘female‘)
 4     -> ;
 5 MariaDB [db1]> select * from t1;
 6 +------+------+------+--------+
 7 | id   | name | age  | sex    |
 8 +------+------+------+--------+
 9 |    1 | lucy |   18 | female   |
10 |    2 | anna |   19 | female |
11 +------+------+------+--------+
12
13
14
15 MariaDB [db1]> insert into t1(id) values
16     -> (3),
17     -> (4);
18 MariaDB [db1]> select * from t1;
19 +------+------+------+--------+
20 | id   | name | age  | sex    |
21 +------+------+------+--------+
22 |    1 | lucy |   18 | female   |
23 |    2 | anna |   19 | female |
24 |    3 | NULL | NULL | NULL   |
25 |    4 | NULL | NULL | NULL   |
26 +------+------+------+--------+

往表中插入数据

注意:表中的最后一个字段不要加逗号

查询

 1 MariaDB [db1]> describe t1; #查看表结构,可简写为desc 表名
 2 +-------+-----------------------+------+-----+---------+-------+
 3 | Field | Type                  | Null | Key | Default | Extra |
 4 +-------+-----------------------+------+-----+---------+-------+
 5 | id    | int(11)               | YES  |     | NULL    |       |
 6 | name  | varchar(50)           | YES  |     | NULL    |       |
 7 | sex   | enum(‘male‘,‘female‘) | YES  |     | NULL    |       |
 8 | age   | int(3)                | YES  |     | NULL    |       |
 9 +-------+-----------------------+------+-----+---------+-------+
10
11
12 MariaDB [db1]> show create table t1\G; #查看表详细结构,可加\G

三 数据类型

一、类型介绍

存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的。

mysql常用数据类型概览

 1 #1. 数字:
 2     整型:tinyinit  int  bigint
 3     小数:
 4         float :在位数比较短的情况下不精准
 5         double :在位数比较长的情况下不精准
 6             0.000001230123123123
 7             存成:0.000001230000
 8
 9         decimal:(如果用小数,则用推荐使用decimal)
10             精准
11             内部原理是以字符串形式去存
12
13 #2. 字符串:
14     char(10):简单粗暴,浪费空间,存取速度快
15         root存成root000000
16     varchar:精准,节省空间,存取速度慢
17
18     sql优化:创建表时,定长的类型往前放,变长的往后放
19                     比如性别           比如地址或描述信息
20
21     >255个字符,超了就把文件路径存放到数据库中。
22             比如图片,视频等找一个文件服务器,数据库中只存路径或url。
23
24
25
26 #3. 时间类型:
27     最常用:datetime
28
29
30 #4. 枚举类型与集合类型

二、数值类型

1、整数类型

整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT

作用:存储年龄,等级,id,各种号码等

 1 ========================================
 2         tinyint[(m)] [unsigned] [zerofill]
 3
 4             小整数,数据类型用于保存一些范围的整数数值范围:
 5             有符号:
 6                 -128 ~ 127
 7             无符号:
 8 ~ 255
 9
10             PS: MySQL中无布尔值,使用tinyint(1)构造。
11
12
13
14 ========================================
15         int[(m)][unsigned][zerofill]
16
17             整数,数据类型用于保存一些范围的整数数值范围:
18             有符号:
19                     -2147483648 ~ 2147483647
20             无符号:
21 ~ 4294967295
22
23
24
25 ========================================
26         bigint[(m)][unsigned][zerofill]
27             大整数,数据类型用于保存一些范围的整数数值范围:
28             有符号:
29                     -9223372036854775808 ~ 9223372036854775807
30             无符号:
31  ~  18446744073709551615

  1 =========有符号和无符号tinyint==========
  2 #tinyint默认为有符号
  3 MariaDB [db1]> create table t1(x tinyint); #默认为有符号,即数字前有正负号
  4 MariaDB [db1]> desc t1;
  5 MariaDB [db1]> insert into t1 values
  6     -> (-129),
  7     -> (-128),
  8     -> (127),
  9     -> (128);
 10 MariaDB [db1]> select * from t1;
 11 +------+
 12 | x    |
 13 +------+
 14 | -128 | #-129存成了-128
 15 | -128 | #有符号,最小值为-128
 16 |  127 | #有符号,最大值127
 17 |  127 | #128存成了127
 18 +------+
 19
 20
 21
 22 #设置无符号tinyint
 23 MariaDB [db1]> create table t2(x tinyint unsigned);
 24 MariaDB [db1]> insert into t2 values
 25     -> (-1),
 26     -> (0),
 27     -> (255),
 28     -> (256);
 29 MariaDB [db1]> select * from t2;
 30 +------+
 31 | x    |
 32 +------+
 33 |    0 | -1存成了0
 34 |    0 | #无符号,最小值为0
 35 |  255 | #无符号,最大值为255
 36 |  255 | #256存成了255
 37 +------+
 38
 39
 40
 41 ============有符号和无符号int=============
 42 #int默认为有符号
 43 MariaDB [db1]> create table t3(x int); #默认为有符号整数
 44 MariaDB [db1]> insert into t3 values
 45     -> (-2147483649),
 46     -> (-2147483648),
 47     -> (2147483647),
 48     -> (2147483648);
 49 MariaDB [db1]> select * from t3;
 50 +-------------+
 51 | x           |
 52 +-------------+
 53 | -2147483648 | #-2147483649存成了-2147483648
 54 | -2147483648 | #有符号,最小值为-2147483648
 55 |  2147483647 | #有符号,最大值为2147483647
 56 |  2147483647 | #2147483648存成了2147483647
 57 +-------------+
 58
 59
 60
 61 #设置无符号int
 62 MariaDB [db1]> create table t4(x int unsigned);
 63 MariaDB [db1]> insert into t4 values
 64     -> (-1),
 65     -> (0),
 66     -> (4294967295),
 67     -> (4294967296);
 68 MariaDB [db1]> select * from t4;
 69 +------------+
 70 | x          |
 71 +------------+
 72 |          0 | #-1存成了0
 73 |          0 | #无符号,最小值为0
 74 | 4294967295 | #无符号,最大值为4294967295
 75 | 4294967295 | #4294967296存成了4294967295
 76 +------------+
 77
 78
 79
 80
 81 ==============有符号和无符号bigint=============
 82 MariaDB [db1]> create table t6(x bigint);
 83 MariaDB [db1]> insert into t5 values
 84     -> (-9223372036854775809),
 85     -> (-9223372036854775808),
 86     -> (9223372036854775807),
 87     -> (9223372036854775808);
 88
 89 MariaDB [db1]> select * from t5;
 90 +----------------------+
 91 | x                    |
 92 +----------------------+
 93 | -9223372036854775808 |
 94 | -9223372036854775808 |
 95 |  9223372036854775807 |
 96 |  9223372036854775807 |
 97 +----------------------+
 98
 99
100
101 MariaDB [db1]> create table t6(x bigint unsigned);
102 MariaDB [db1]> insert into t6 values
103     -> (-1),
104     -> (0),
105     -> (18446744073709551615),
106     -> (18446744073709551616);
107
108 MariaDB [db1]> select * from t6;
109 +----------------------+
110 | x                    |
111 +----------------------+
112 |                    0 |
113 |                    0 |
114 | 18446744073709551615 |
115 | 18446744073709551615 |
116 +----------------------+
117
118
119
120
121 ======用zerofill测试整数类型的显示宽度=============
122 MariaDB [db1]> create table t7(x int(3) zerofill);
123 MariaDB [db1]> insert into t7 values
124     -> (1),
125     -> (11),
126     -> (111),
127     -> (1111);
128 MariaDB [db1]> select * from t7;
129 +------+
130 | x    |
131 +------+
132 |  001 |
133 |  011 |
134 |  111 |
135 | 1111 | #超过宽度限制仍然可以存
136 +------+

验证

注意:为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关,存储范围如下

其实我们完全没必要为整数类型指定显示宽度,使用默认的就可以了

默认的显示宽度,都是在最大值的基础上加1

int的存储宽度是4个Bytes,即32个bit,即2**32

无符号最大值为:4294967296-1

有符号最大值:2147483648-1

有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的

最后:整形类型,其实没有必要指定显示宽度,使用默认的就ok

2、浮点型

定点数类型  DEC等同于DECIMAL  

浮点类型:FLOAT DOUBLE

作用:存储薪资、身高、体重、体质参数等

 1 ======================================
 2 #FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
 3
 4 定义:
 5         单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
 6
 7 有符号:
 8            -3.402823466E+38 to -1.175494351E-38,
 9            1.175494351E-38 to 3.402823466E+38
10 无符号:
11            1.175494351E-38 to 3.402823466E+38
12
13
14 精确度:
15            **** 随着小数的增多,精度变得不准确 ****
16
17
18 ======================================
19 #DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
20
21 定义:
22            双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
23
24 有符号:
25            -1.7976931348623157E+308 to -2.2250738585072014E-308
26            2.2250738585072014E-308 to 1.7976931348623157E+308
27
28 无符号:
29            2.2250738585072014E-308 to 1.7976931348623157E+308
30
31 精确度:
32            ****随着小数的增多,精度比float要高,但也会变得不准确 ****
33
34 ======================================
35 decimal[(m[,d])] [unsigned] [zerofill]
36
37 定义:
38           准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。
39
40
41 精确度:
42            **** 随着小数的增多,精度始终准确 ****
43            对于精确数值计算时需要用此类型
44            decaimal能够存储精确值的原因在于其内部按照字符串存储。

 1 mysql> create table t1(x float(256,31));
 2 ERROR 1425 (42000): Too big scale 31 specified for column ‘x‘. Maximum is 30.
 3 mysql> create table t1(x float(256,30));
 4 ERROR 1439 (42000): Display width out of range for column ‘x‘ (max = 255)
 5 mysql> create table t1(x float(255,30)); #建表成功
 6 Query OK, 0 rows affected (0.02 sec)
 7
 8 mysql> create table t2(x double(255,30)); #建表成功
 9 Query OK, 0 rows affected (0.02 sec)
10
11 mysql> create table t3(x decimal(66,31));
12 ERROR 1425 (42000): Too big scale 31 specified for column ‘x‘. Maximum is 30.
13 mysql> create table t3(x decimal(66,30));
14 ERROR 1426 (42000): Too-big precision 66 specified for ‘x‘. Maximum is 65.
15 mysql> create table t3(x decimal(65,30)); #建表成功
16 Query OK, 0 rows affected (0.02 sec)
17
18 mysql> show tables;
19 +---------------+
20 | Tables_in_db1 |
21 +---------------+
22 | t1            |
23 | t2            |
24 | t3            |
25 +---------------+
26 rows in set (0.00 sec)
27
28
29
30 mysql> insert into t1 values(1.1111111111111111111111111111111); #小数点后31个1
31 Query OK, 1 row affected (0.01 sec)
32
33 mysql> insert into t2 values(1.1111111111111111111111111111111);
34 Query OK, 1 row affected (0.00 sec)
35
36 mysql> insert into t3 values(1.1111111111111111111111111111111);
37 Query OK, 1 row affected, 1 warning (0.01 sec)
38
39 mysql> select * from t1; #随着小数的增多,精度开始不准确
40 +----------------------------------+
41 | x                                |
42 +----------------------------------+
43 | 1.111111164093017600000000000000 |
44 +----------------------------------+
45 row in set (0.00 sec)
46
47 mysql> select * from t2; #精度比float要准确点,但随着小数的增多,同样变得不准确
48 +----------------------------------+
49 | x                                |
50 +----------------------------------+
51 | 1.111111111111111200000000000000 |
52 +----------------------------------+
53 row in set (0.00 sec)
54
55 mysql> select * from t3; #精度始终准确,d为30,于是只留了30位小数
56 +----------------------------------+
57 | x                                |
58 +----------------------------------+
59 | 1.111111111111111111111111111111 |
60 +----------------------------------+
61 row in set (0.00 sec)

验证

3、位类型(了解)

BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写默认为1位。
注意:对于位字段需要使用函数读取
    bin()显示为二进制
    hex()显示为十六进制

 1 MariaDB [db1]> create table t9(id bit);
 2 MariaDB [db1]> desc t9; #bit默认宽度为1
 3 +-------+--------+------+-----+---------+-------+
 4 | Field | Type   | Null | Key | Default | Extra |
 5 +-------+--------+------+-----+---------+-------+
 6 | id    | bit(1) | YES  |     | NULL    |       |
 7 +-------+--------+------+-----+---------+-------+
 8
 9 MariaDB [db1]> insert into t9 values(8);
10 MariaDB [db1]> select * from t9; #直接查看是无法显示二进制位的
11 +------+
12 | id   |
13 +------+
14 |     |
15 +------+
16 MariaDB [db1]> select bin(id),hex(id) from t9; #需要转换才能看到
17 +---------+---------+
18 | bin(id) | hex(id) |
19 +---------+---------+
20 | 1       | 1       |
21 +---------+---------+
22
23 MariaDB [db1]> alter table t9 modify id bit(5);
24 MariaDB [db1]> insert into t9 values(8);
25 MariaDB [db1]> select bin(id),hex(id) from t9;
26 +---------+---------+
27 | bin(id) | hex(id) |
28 +---------+---------+
29 | 1       | 1       |
30 | 1000    | 8       |
31 +---------+---------+

验证

三、日期类型

DATE TIME DATETIME TIMESTAMP YEAR

作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等

 1 YEAR
 2             YYYY(1901/2155)
 3
 4         DATE
 5             YYYY-MM-DD(1000-01-01/9999-12-31)
 6
 7         TIME
 8             HH:MM:SS(‘-838:59:59‘/‘838:59:59‘)
 9
10         DATETIME
11
12             YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59    Y)
13
14         TIMESTAMP
15
16             YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)

 1 ============year===========
 2 MariaDB [db1]> create table t10(born_year year); #无论year指定何种宽度,最后都默认是year(4)
 3 MariaDB [db1]> insert into t10 values
 4     -> (1900),
 5     -> (1901),
 6     -> (2155),
 7     -> (2156);
 8 MariaDB [db1]> select * from t10;
 9 +-----------+
10 | born_year |
11 +-----------+
12 |      0000 |
13 |      1901 |
14 |      2155 |
15 |      0000 |
16 +-----------+
17
18
19 ============date,time,datetime===========
20 MariaDB [db1]> create table t11(d date,t time,dt datetime);
21 MariaDB [db1]> desc t11;
22 +-------+----------+------+-----+---------+-------+
23 | Field | Type     | Null | Key | Default | Extra |
24 +-------+----------+------+-----+---------+-------+
25 | d     | date     | YES  |     | NULL    |       |
26 | t     | time     | YES  |     | NULL    |       |
27 | dt    | datetime | YES  |     | NULL    |       |
28 +-------+----------+------+-----+---------+-------+
29
30 MariaDB [db1]> insert into t11 values(now(),now(),now());
31 MariaDB [db1]> select * from t11;
32 +------------+----------+---------------------+
33 | d          | t        | dt                  |
34 +------------+----------+---------------------+
35 | 2017-07-25 | 16:26:54 | 2017-07-25 16:26:54 |
36 +------------+----------+---------------------+
37
38
39
40 ============timestamp===========
41 MariaDB [db1]> create table t12(time timestamp);
42 MariaDB [db1]> insert into t12 values();
43 MariaDB [db1]> insert into t12 values(null);
44 MariaDB [db1]> select * from t12;
45 +---------------------+
46 | time                |
47 +---------------------+
48 | 2017-07-25 16:29:17 |
49 | 2017-07-25 16:30:01 |
50 +---------------------+
51
52
53
54 ============注意啦,注意啦,注意啦===========
55 1. 单独插入时间时,需要以字符串的形式,按照对应的格式插入
56 2. 插入年份时,尽量使用4位值
57 3. 插入两位年份时,<=69,以20开头,比如50,  结果2050
58                 >=70,以19开头,比如71,结果1971
59 MariaDB [db1]> create table t12(y year);
60 MariaDB [db1]> insert into t12 values
61     -> (50),
62     -> (71);
63 MariaDB [db1]> select * from t12;
64 +------+
65 | y    |
66 +------+
67 | 2050 |
68 | 1971 |
69 +------+
70
71
72
73 ============综合练习===========
74 MariaDB [db1]> create table student(
75     -> id int,
76     -> name varchar(20),
77     -> born_year year,
78     -> birth date,
79     -> class_time time,
80     -> reg_time datetime);
81
82 MariaDB [db1]> insert into student values
83     -> (1,‘lucy‘,"1995","1995-11-11","11:11:11","2017-11-11 11:11:11"),
84     -> (2,‘anna‘,"1997","1997-12-12","12:12:12","2017-12-12 12:12:12"),
85     -> (3,‘luna‘,"1998","1998-01-01","13:13:13","2017-01-01 13:13:13");
86
87 MariaDB [db1]> select * from student;
88 +------+------+-----------+------------+------------+---------------------+
89 | id   | name | born_year | birth      | class_time | reg_time            |
90 +------+------+-----------+------------+------------+---------------------+
91 |    1 | lucy |      1995 | 1995-11-11 | 11:11:11   | 2017-11-11 11:11:11 |
92 |    2 | anna |      1997 | 1997-12-12 | 12:12:12   | 2017-12-12 12:12:12 |
93 |    3 | luna  |      1998 | 1998-01-01 | 13:13:13   | 2017-01-01 13:13:13 |
94 +------+------+-----------+------------+------------+---------------------+

验证

1 在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。下面就来总结一下两种日期类型的区别。
2
3 1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。
4
5 2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,操作系统以及客户端连接都有时区的设置。
6
7 3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。
8
9 4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。

datetime与timestamp的区别

原文地址:https://www.cnblogs.com/eric_yi/p/8469385.html

时间: 2024-07-29 00:04:31

三 表操作的相关文章

MYSQL基础笔记(三)-表操作基础

数据表的操作 表与字段是密不可分的. 新增数据表 1 Create table [if not exists] 表名( 2 字段名 数据类型, 3 字段名 数据类型, 4 字段n 数据类型 --最后一行不需要加逗号 5 )[表选项]; If not exists:如果表名不存在,那么就创建,否则不执行创建代码,实现检查功能. 表选项:控制表的表现 1.字符集:charset/character 具体字符集:--保证表中数据存储的字符集. 2.校对集:collate 具体校对集: 3.存储引擎:e

oracle系列(三)表操作基础

支持的数据类型: 字符型char 定长 最大2000varchar2() 变长 最大4000clob 字符型大对象 最大4G 数字型number范围 -10的38次方到10的+38次方;number(5,2) 一个小数,有效位5个,小数点后2个数字number(5) 表示一个5位的整数 日期类型datetimestamp 二进制数据blob 保密性较高,存入数据库/其他情况,保持在文件服务器,数据库只存文件路径 建表: create table student( stuId varchar2(1

数据库之表操作,数据操作

注意的几点:1.如果你在cmd中书命令的时候,输入错了就用\c跳出 2.\s查看配置信息 一.操作文件夹(库) 增:create database db1 charset utf8; 删:drop database db1; 改:alter database db1 charset gbk; 查:show databases; #查看所有的数据库 show create database db1; #查看db1数据库 二.操作文件(表) 切换到文件夹下:use db1 增:create tabl

多表操作

## 多表操作 (DBUtils框架)## # 基本概念 即数据库中一对多及多对多的表之间的操作: # 基本开发步骤: >> 添加jar包: >> 添加Util工具类: >> 添加domain中的基础类: |-- customer |-- orders |-- 添加素材中的表: >> 分析问题: |-- 类与类之间没有外键关系: |-- 那么如何完成表与表之间的关联呢? |-- 类与类之间有的关系 |-- 继承: |-- 包含与引用: |-- 可以通过一个L

python 全栈 数据库 (三) python操作数据库

python 操作MYSQL数据库主要有两种方式: 使用原生模块:pymysql ORM框架:SQLAchemy 一.pymysql 1.1下载安装模块 第一种:cmd下:执行命令下载安装:pip3 install pymysql 第二种:IDE下pycharm python环境路径下添加模块 1.2使用操作 #导入模块 import pymysql #建立连接通道,建立连接填入(连接数据库的IP地址,端口号,用户名,密码,要操作的数据库,字符编码) conn = pymysql.connect

前端学数据库之多表操作

× 目录 [1]准备工作 [2]多表更新 [3]两步更新[4]连接[5]无限级表 前面的话 上一篇博文中介绍了子查询的相关内容,最后我们将查询结果存储到一个新的数据表中.下面我们将接着子查询的案例,详细介绍数据库中的多表操作 准备工作 在上一篇博文,我们将详细数据存储到tdb_goods数据表中,将详细数据中的类别信息存储到tdb_goods_cates数据表中 接下来,我们要研究如何通过tdb_goods_cates数据表来更新tdb_goods表 多表更新 多表更新类似于单表更新 UPDAT

【读书笔记】C#高级编程 第二十四章 文件和注册表操作

(一)文件和注册表 对于文件系统操作,相关的类几乎都在System.IO名称空间中,而注册表操作由System.Win32名称空间中的类来处理. (二)管理文件系统 System.MarshalByRefObject--这是.NET类中用于远程操作的基对象类,它允许在应用程序域之间编组数据. FileSystemInfo--这是表示任何文件系统对象的基类. FileInfo和File--这些类表示文件系统上的文件. DirectoryInfo和Directory--这些类表示文件系统上的文件夹.

ACM-线性表操作

线性表操作 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte总提交:2795            测试通过:589 描述 线性表是n个元素的有序集合(n30),n是线性表中元素的个数,称为线性表的长度.可以用一组地址连续的存储单元依次存储线性表中元素,采用这种存储方式的线性表称为顺序表. 请在顺序表上实现运算,实现顺序表的逆置,删除表中所有元素值等于x的元素. 输入 三组数据,顺序表元素类型分别为整型.字符型和实型. 每一组第一行给出

c# 注册表操作,创建,删除,修改,判断节点是否存在

用.NET下托管语言C#操作注册表,主要内容包括:注册表项的创建,打开与删除.键值的创建(设置值.修改),读取和 删除.判断注册表项是否存在.判断键值是否存在. 准备工作: 1:要操作注册表,我们必须要引入必要的命名空间: C#代码    using Microsoft.Win32; 在这个命名空间里面包含了许多注册表相关的类,足够我们使用了~~ 2:命名空间里面提供了一个类:RegistryKey 利用它我们可以定位到注册表最开头的分支: ClassesRoot,CurrentUser,Use