5

数据库

昨日内容回顾

# 【一】数据存储的演变过程
# 【1】存储方式是基于内存存储 ----> 断电消失不能持久化存储
# 【2】基于文件存储 ---> 基于文本文件存储 (不方便管理和展示) ---> 基于json文件存储数据 ---> 将数据组织成指定的格式
# 【3】学了软件开发规范 ---> 对每一个文件夹进行了功能的划分 ---> 存储数据的目录是 db(database) ---> data ---> 存储文件
# 【4】基于TCP的客户端和服务端开发一个自己的远程服务存储和下载服务端 ---> 在服务端存储数据 书写指令 , 在客户端向服务端发送指令下载或上传数据

# 【二】数据库
# 数据库其实就是一个远程存储和组织数据的服务端#3
# 因为存储数据可以存储在内存中或者存储在文件中(持久化和临时存储) ---> 两大类数据库

# 【1】关系型数据库
# 持久存储数据
# 数据能持久化存储到本地
# 利用表关系来组织相应的数据
# 丰富的查询和修改方式(语句)
# MySQL、Oracle、postgresql ...

# 【2】非关系型数据库
# 能临时存储数据的数据库
# 数据是临时存储在内存中
# 利用 K:V 键值对来存储数据
# 只能进行简单的增删查该无法兼容更复杂的操作
# Redis、MongoDB ...

# 【3】数据库的应用场景
# 就是为了更加方便的存储数据
# 实现团队对数据的共享和操作

# 【三】SQL语句的由来
# 【1】SQL语句的诞生
# 既然数据库就是客户端和服务端的关系
# 操作服务端就需要执行指定的命令
# 因为一开始大家都没有意识,谁操作谁就开发一门语言区操作他(高度自定制) # A select B search C check
# 于是为了统一约束操作数据库的语法和命令就诞生了一门语言 : SQL
# 【2】SQL语句的操作分类
# (1)数据定义语言 ddl
# 创建 create
# 删除 drop
# 修改 alter
# (2)数据操纵语言 dml
# 查询 select
# 插入 insert
# 更新 update
# 删除 delete
# (3)数据控制语言 dcl
# 确认 commit
# 回滚 rollback
# 赋予操作权限 grant
# 取消操作权限 remove

# 【3】几个重要的概念
# 库 database 存储和组织数据的容器 相当于文件夹
# 表 table 存储数据和组织数据的载体 相当于文件
# 表头 header 整张表的表头字段 相当于表头字段
# 记录 record 一条条的数据 相当于数据
# 表单 form 字段标题+数据 相当于文件中的表头+一行行的数据

# 【五】MySQL的安装和注意事项
# 【1】安装
# 访问MySQL官网 --> 点击download --> MySQL Community (GPL) Downloads » ---> MySQL Community Server --> 选择版本和系统
# 【2】安装
# 下载完成以后会看到一个压缩包
# 将压缩包解压 ---> 可以对文件夹名名字进行重命名(看着不舒服) ---> 和Python解释器一样命名带版本
# 创建一个 my.ini 文件 ----> 增加配置 (直接复制) ---> 记得更改掉里面的数据目录 datadir 安装目录
# 创建一个data文件夹
# 【3】初始化
# 记得将MySQL安装目录的bin目录添加到环境变量中 ---> 为了在任意位置都能找到MySQL的客户端 ---> 不加就在MySQL的bin目录下启动 客户端或服务端
# mysqld --initialize --console ---> 得到一串临时密码 0---> 记住
# 注册系统服务 mysqld --install ---> 你会看到自己的服务列表中增加了一个 MySQL服务
# 注销系统服务 mysqld --remove ---> 系统服务删除
# 启动MySQL服务 net start mysql
# 停止MySQL服务 net stop mysql
# 【4】登入MySQL
# 方式一: mysql -uroot -p ---> enter 输入密码 登入
# 方式二:mysql -h 127.0.0.1 -P 3306 -uroot -p 以指定IP和端口登入
# 方式三:mysql -uroot -p123456
# 【5】登入进去以后 --> 修改密码
# 修改密码
# alter user 'root'@'localhost' identified by '123456';
# 刷新权限
# flush privileges;

# 如果忘记密码如何修改密码?
# 首先要停止MySQL服务 net stop mysql
# 启动一个调表后的MySQL服务 mysqld --skip-grant-tables ---> 程序卡主
# 重新启动一个终端 输入 mysql -uroot -p 直接回车
# 先刷新权限 flush privileges;
# 在修改密码 alter user 'root'@'localhost' identified by '123456';
# 不要忘了在刷新权限  flush privileges;
# 退出服务
# 再启动MySQL服务

# 【6】退出客户端
# quit / exit

# 【七】SQL基础操作语法
# 每一句SQL语句的结尾必须有分隔符 , 没有分隔符默认是一句话
# SQL语句可以换行并且不会指定

# 【1】操作数据库 database
# (1)创建数据库
# create database 数据库名字;
# 创建出来的编码格式继承自配置文件中的编码格式
# 查看自己数据库的编码格式 lanten1 ---> 不兼容中文
# (2)查看所有数据库
# show databases;
# (3)删除数据库
# drop database 数据库名字;
# 【2】操作数据表 table
# 每一个字段之间用英文的逗号隔开 , 但是最后一个字段不允许放逗号
# 字段名和字段类型必须有,字段长度和约束条件非必须,因为有的字段默认自带长度
# (0)操作表必须先切换库
# use 数据库名字;
# (1)创建表
# create table 表名(字段名 字段类型(长度) 约束条件, 字段名 字段类型(长度) 约束条件);
# (2)查询表
# 查询当前所在库
# select database();
# 查看当前表的所有字段信息
# describe 表名;
# desc 表名;
# 为了更加好看 格式化输出
# desc 表名\G;
# 查看当前表的建表语句
# show create table 表名;
# 在输出的内容里面还会有当前表的存储引擎以及编码格式
# (3)修改表
# 修改表的字段或者字段类型
# alter table 表名 modify 字段名 字段类型(宽度); # 只能需改类型不能修改名字
# alter table 表名 change 字段名 字段类型(宽度); # 只能需改类型不能修改名字
# 修改表的名字
# alter table 表名 rename 表名 ;
# 追加字段
# 直接追加在末尾
# alter table 表名 add 字段名 字段类型;
# 追加到指定字段名末尾
# alter table 表名 add 字段名 字段类型 after 字段名;
# 追加到所有字段头部
# alter table 表名 add 字段名 字段类型 first;
# (4)删除指定字段
# alter table 表名 drop 字段名;
# 【3】操作数据 record
# (1)查看数据
# 当前表下的所有数据
# select * from 表名;
# 根据过滤条件筛选数据
# select * from 表名 where 字段名=字段值;
# (2)相表中插入数据
# insert into 表名(字段名) values(字段值); # 可以不按照位置传 , 但是要和前面的字典名对应上
# insert into 表名 values(字段值); # 一定要和表中的字段的位置对应上
# (3)修改数据
# update 表名 set 字段名=新值 where 字段名=字段值;
# (4)删除数据
# delete from 表名 where 字段名=字段值; # 按照指定的过滤条件删除数据 , 注意会删除掉所有符合条件的数据
# delete from 表名; # 相当于清空当前数据表中的所有数据

# 【4】提醒
# 不要轻易的使用 drop , 因为删除掉数据库或者数据表 ---> 无法找回

今日内容

【一】储存引擎

#【一】MySQL的四种储存引擎
#【1】 Innodb
# 默认存储引擎 5.5版本之后都用这个
#【2】myisam
# 是5.5版本之前的默认储存引擎
# 速度比 Innodb快,但是数据安全性较弱
#【3】memory
# 内存引擎
# 数据全部都存储再内存当中,一旦重启那么数据就会丢失
#【4】blackhole
# 黑洞引擎
# 往里面存储的任何数据都会被清空

#【二】如何查看所有的引擎:
# show engines;
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.10 sec)

【1】建表语句

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| day001             |
| day01              |
| day02              |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
9 rows in set (0.00 sec)

mysql> use day02;
Database changed
mysql> create table t1(id int) engine=innodb;
Query OK, 0 rows affected (0.39 sec)

mysql> create table t2(id int) engine=myisam;
Query OK, 0 rows affected (0.14 sec)

mysql> create table t3(id int) engine=blackhole;
Query OK, 0 rows affected (0.14 sec)

mysql> create table t4(id int) engine=memory;
Query OK, 0 rows affected (0.22 sec)

mysql> show tables;
+-----------------+
| Tables_in_day02 |
+-----------------+
| t1              |
| t2              |
| t3              |
| t4              |
+-----------------+
4 rows in set (0.00 sec)

【2】innodb引擎

  • frm:存储的表结构
  • idb:存储表的数据
  • 特点:存储数据持久化存储退出也会存在
mysql> insert into t1 values(1);
Query OK, 1 row affected (0.37 sec)

mysql> select * from t1;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

【3】myisam引擎

  • frm:存储的表结构
  • MYD:表的数据
  • MYI:表的索引结构
  • 特点:存储数据持久化存储,退出也会存在
mysql> insert into t2 values(1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t2;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

【4】blackhole引擎

  • frm:存储的表结构
  • 特点:存储数据不会有任何反应,不会存储任何数据
mysql> insert into t3 values(1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t3;
Empty set (0.00 sec)

【5】memory引擎

  • frm:储存的表结构
  • 特点就是基于内存的存储,只要服务重启,数据就会全部丢失
mysql> insert into t4 values(1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from  t4;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
# 终端:
C:\WINDOWS\system32>net stop mysql57
C:\WINDOWS\system32>net start mysql57# 重启MySQL

Database changed
mysql> select * from t1;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.01 sec)

mysql> select * from t2;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> select * from t3;
Empty set (0.00 sec)

mysql> select * from t4;
Empty set (0.00 sec)

【二】约束条件(null)

# 【一】完整的建表语句
-- 最后一个字段不要加 ,!
create table 表名(
	字段名1 类型(宽度) 约束条件,
	字段名2 类型(宽度) 约束条件,
	字段名3 类型(宽度) 约束条件,
);
-- 字段名 和类型是必须有的参数
-- 宽度 和约束条件是可以选择性增加的
# 【二】创建一张表
create table t5(
	id
);

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 3

create table t5(
	id int
);

mysql> desc t5;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
-- 上面的 int(11) 这个 11 就是当前字段的宽度(0-10)
-- 有的字段是带有默认宽度的
mysql> insert into t5 values(12345678912);
ERROR 1264 (22003): Out of range value for column 'id' at row 1
mysql> insert into t5 values(1234567891);
Query OK, 1 row affected (0.03 sec)

-- 有的mysql版本是默认开启长度限制的,超过最大长度会报错
-- 有的版本是不开启,如果超出最大长度则会按照最大长度截取数据

【三】严格模式

  • 控制MySQL里面存储数据的一些限制规则
  • 控制超出长度不提示,控制超出长度提示报错
show variables like "%mode";
show variables like "_mode";
-- 查看严格模式的查询方式有两种
-- SQL中的模糊查询 like 喜欢 / 像
-- like "%mode" %匹配任意个字符
-- like "_mode" _只能匹配单个字符
mysql> show variables like "%mode";
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name            | Value
                                               |
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| block_encryption_mode    | aes-128-ecb
                                               |
| gtid_mode                | OFF
                                               |
| innodb_autoinc_lock_mode | 1
                                               |
| innodb_strict_mode       | ON
                                               |
| offline_mode             | OFF
                                               |
| pseudo_slave_mode        | OFF
                                               |
| rbr_exec_mode            | STRICT
                                               |
| slave_exec_mode          | STRICT
                                               |
| sql_mode                 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
9 rows in set, 1 warning (0.00 sec)

在某些情况下我们想要关闭某个严格模式

-- 临时修改 : 退出客户端重新连接,修改后严格模式还是原来的
set session sql_mode = 'STRICT_TRANS_TABLES'
-- 永久修改 : 退出客户端重新连接,严格模式修改会一直生效
set global sql_mode = 'STRICT_TRANS_TABLES'

【四】基本字段类型:整型

【1】整型

整数类型 字节 无符号数的取值范围 有符号数的取值范围
TINYINT 1 0~255 -128~127
SMALLINT 2 0~65535 -32768~32767
MEDIUMINT 3 0~16777215 -8388608~8388607
INT 4 0~4294967295 -2147483648~2147483647
BIGINT 8 0~18446744073709551615 -9223372036854774808~9223372036854774807
mysql> create table t9 (id tinyint);
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    3
Current database: day02

Query OK, 0 rows affected (0.77 sec)

mysql> show tables;
+-----------------+
| Tables_in_day02 |
+-----------------+
| t1              |
| t2              |
| t3              |
| t4              |
| t9              |
+-----------------+
5 rows in set (0.00 sec)

mysql> desc t9;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | tinyint(4) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> insert into t9 values(-128);
Query OK, 1 row affected (0.14 sec)

mysql> insert into t9 values(-129);
ERROR 1264 (22003): Out of range value for column 'id' at row 1

mysql> select * from t9;
+------+
| id   |
+------+
| -128 |
+------+
mysql> insert into t9 values(127);
Query OK, 1 row affected (0.03 sec)

mysql> select * from t9;
+------+
| id   |
+------+
| -128 |
|  127 |
+------+
2 rows in set (0.00 sec)

mysql> insert into t9 values(128);
ERROR 1264 (22003): Out of range value for column 'id' at row 1

【2】有无符号

-- unsigned 无符号(就是不能存复数);

mysql> create table t10(id tinyint unsigned);
Query OK, 0 rows affected (0.35 sec)

mysql> desc t10;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| id    | tinyint(3) unsigned | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> insert into t10 values(1);
Query OK, 1 row affected (0.36 sec)

mysql> insert into t10 values(-1);
ERROR 1264 (22003): Out of range value for column 'id' at row 1

【3】字段类型的宽度

  • 字段类型后面跟着的宽度只是显示的宽度
  • 插入的长度是按照,当前字段的最大长度进行限制
create table t11(id int(4));

【4】约束条件之zerofill

# 默认长度是10;
mysql> create table t13(id int(8) unsigned zerofill);
Query OK, 0 rows affected (0.34 sec)

mysql> desc t13;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type                     | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| id    | int(8) unsigned zerofill | YES  |     | NULL    |       |
+-------+--------------------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> insert into t13 values(1);
Query OK, 1 row affected (0.12 sec)

mysql> select * from t13;
+----------+
| id       |
+----------+
| 00000001 |
+----------+
1 row in set (0.00 sec)

mysql> insert into t13 values(123456789);
Query OK, 1 row affected (0.12 sec)

mysql> select * from t13;
+-----------+
| id        |
+-----------+
|  00000001 |
| 123456789 |
+-----------+
2 rows in set (0.00 sec)

mysql> insert into t13 values(123456789123);
ERROR 1264 (22003): Out of range value for column 'id' at 

【五】字段类型之浮点型

【1】浮点型

数据类型 字节数 取值范围
FLOAT 4 -2^128~2 ^128,即-3.40E+38~+3.40E+38
DOUBLE 8 -2^1024~ 2^1024,即-1.79E+308~1.79E+308
DECIMAL 设置位数和精度。 65 ~ 30
float(255,30)
# 总共255位 , 小数部分占 30 位

double(255,30)
# 总共255位 , 小数部分占 30 位

decimal(65,30)
# 总共65位 , 小数部分占 30 位
mysql> create table t15(id float(255,30));
Query OK, 0 rows affected (0.17 sec)

mysql> create table t16(id double(255,30));
Query OK, 0 rows affected (0.16 sec)

mysql> create table t17(id decimal(65,30));
Query OK, 0 rows affected (0.16 sec)

mysql> desc t15;
+-------+---------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| id    | float(255,30) | YES  |     | NULL    |       |
+-------+---------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> desc t16;
+-------+----------------+------+-----+---------+-------+
| Field | Type           | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| id    | double(255,30) | YES  |     | NULL    |       |
+-------+----------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> desc t17;
+-------+----------------+------+-----+---------+-------+
| Field | Type           | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| id    | decimal(65,30) | YES  |     | NULL    |       |
+-------+----------------+------+-----+---------+-------+
1 row in set (0.00 sec)
insert into t15 values(1.1111111111111111111111);
insert into t16 values(1.1111111111111111111111);
insert into t17 values(1.1111111111111111111111);


mysql> insert into t15 values(1.1111111111111111111111);
Query OK, 1 row affected (0.03 sec)

mysql> insert into t16 values(1.1111111111111111111111);
Query OK, 1 row affected (0.02 sec)

mysql> insert into t17 values(1.1111111111111111111111);
Query OK, 1 row affected (0.03 sec)

mysql> select * from t15;
+----------------------------------+
| id                               |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select * from t16;
+----------------------------------+
| id                               |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select * from t17;
+----------------------------------+
| id                               |
+----------------------------------+
| 1.111111111111111111111100000000 |
+----------------------------------+
1 row in set (0.00 sec)
-- float 类型 从第8为开始模糊
-- double 类型 从第16为开始模糊
-- decimal 类型 从23为开始模糊

--- 精确度 decimal > double > float

【六】字段类型之字符串类型

【1】字符串类型

(1)char

-- 定长字符串 , 给长度 4 位,超出会报错,不够默认用空格补全


# 定

(2)varchar

-- 不定长字段,给 4 个长度,超过四个直接报错,有几个存几个

# 可变

【2】创建表

create table t18(name char(4));
create table t19(name varchar(4));

mysql> create table t18(name char(4));
Query OK, 0 rows affected (0.17 sec)

mysql> create table t19(name varchar(4));
Query OK, 0 rows affected (0.13 sec)

mysql> desc t18;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| name  | char(4) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> desc t19;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| name  | varchar(4) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)

【3】插入数据

-- 插入数据
insert into t18 values('a');
insert into t19 values('a');

mysql> insert into t18 values('a');
Query OK, 1 row affected (0.03 sec)

mysql> insert into t19 values('a');
Query OK, 1 row affected (0.02 sec)

mysql> select * from t18;
+------+
| name |
+------+
| a    |
+------+
1 row in set (0.00 sec)

mysql> select * from t19;
+------+
| name |
+------+
| a    |
+------+
1 row in set (0.00 sec)

超过长度:

insert into t18 values('dream');
insert into t19 values('dream');

mysql> insert into t18 values('dream');
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> insert into t19 values('dream');
ERROR 1406 (22001): Data too long for column 'name' at row 1

【4】查看长度

mysql> insert into s18 values('aaaa');
ERROR 1146 (42S02): Table 'day02.s18' doesn't exist
mysql> insert into t18 values('aaaa');
Query OK, 1 row affected (0.36 sec)

mysql> select * from t18;
+------+
| name |
+------+
| a    |
| abcd |
| aaaa |
+------+
3 rows in set (0.00 sec)

mysql> select char_length(name) from t18;
+-------------------+
| char_length(name) |
+-------------------+
|                 1 |
|                 4 |
|                 4 |
+-------------------+
3 rows in set (0.00 sec)

【5 】取消默认去除空格

mysql> show variables like "%mode";
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name            | Value                                                                                                                                     |
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| block_encryption_mode    | aes-128-ecb                                                                                                                               |
| gtid_mode                | OFF                                                                                                                                       |
| innodb_autoinc_lock_mode | 1                                                                                                                                         |
| innodb_strict_mode       | ON                                                                                                                                        |
| offline_mode             | OFF                                                                                                                                       |
| pseudo_slave_mode        | OFF                                                                                                                                       |
| rbr_exec_mode            | STRICT                                                                                                                                    |
| slave_exec_mode          | STRICT                                                                                                                                    |
| sql_mode                 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
9 rows in set, 1 warning (0.35 sec)
-- 在修改严格模式的时候去除或者增加单个 带上原来的
-- 覆盖掉

【6】char 与 varchar 的比较

(1)char

  • 缺点:浪费空间

  • 优点:存储简单

    • 直接按照固定的字符存储数据即可

(2)varchar

  • 优点:节省空间

  • 缺点:存储麻烦

    • 存的时候,在真正数据的前面加报头(表示数据真正大小)
    • 取的时候,需要先读取报头,才能读取真实的数据

以前用 char 现在 varchar 使用较多

【七】字段类型之日期时间类型

【1】日期时间类型

date : 年月日

datetime : 年月日时分秒

time : 时分秒

year : 年份

【2】创建表

create table student(
	id int,
    name varchar(16),
    born_year year,
    birth date,
    study_time time,
    reg_time datetime
);


mysql> create table student(
    ->  id int,
    ->     name varchar(16),
    ->     born_year year,
    ->     birth date,
    ->     study_time time,
    ->     reg_time datetime
    -> );
Query OK, 0 rows affected (0.17 sec)

mysql> desc student;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(11)     | YES  |     | NULL    |       |
| name       | varchar(16) | YES  |     | NULL    |       |
| born_year  | year(4)     | YES  |     | NULL    |       |
| birth      | date        | YES  |     | NULL    |       |
| study_time | time        | YES  |     | NULL    |       |
| reg_time   | datetime    | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
insert into student values(
		 1,
    'dream',
    '2024',
    '2024-5-31',
    '11:11:11',
    '2023-6-30 11:11:11'
);

mysql> insert into student values(
    ->           1,
    ->     'dream',
    ->     '2024',
    ->     '2024-5-31',
    ->     '11:11:11',
    ->     '2023-6-30 11:11:11'
    -> );
Query OK, 1 row affected (0.03 sec)

mysql> select * from student;
+------+-------+-----------+------------+------------+---------------------+
| id   | name  | born_year | birth      | study_time | reg_time            |
+------+-------+-----------+------------+------------+---------------------+
|    1 | dream |      2024 | 2024-05-31 | 11:11:11   | 2023-06-30 11:11:11 |
+------+-------+-----------+------------+------------+---------------------+

insert into student values(
		 1,
    'dream',
    '128',
    '2024-5-31',
    '11:11:11',
    '2023-6-30 11:11:11'
);

-- ERROR 1264 (22003): Out of range value for column 'born_year' at row 1

【八】字段类型之枚举和集合类型

【1】枚举和集合

-- 枚举:多选一 用枚举类型给多个备选项,但只能一个 enum
-- 集合:多选多 用集合类型给多个备选项,但你能选多个 set

【2】枚举类型 enum

create table user(
	id int,
    name char(16),
    gender enum('male','female','others')
);

mysql> create table user(
    ->  id int,
    ->     name char(16),
    ->     gender enum('male','female','others')
    -> );
Query OK, 0 rows affected (0.15 sec)

mysql> desc user;
+--------+--------------------------------+------+-----+---------+-------+
| Field  | Type                           | Null | Key | Default | Extra |
+--------+--------------------------------+------+-----+---------+-------+
| id     | int(11)                        | YES  |     | NULL    |       |
| name   | char(16)                       | YES  |     | NULL    |       |
| gender | enum('male','female','others') | YES  |     | NULL    |       |
+--------+--------------------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
insert into user(id,name,gender) values(1,'dream','male');

mysql> insert into user(id,name,gender) values(1,'dream','male');
Query OK, 1 row affected (0.03 sec)

mysql> select * from user;
+------+-------+--------+
| id   | name  | gender |
+------+-------+--------+
|    1 | dream | male   |
+------+-------+--------+
1 row in set (0.00 sec)

insert into user(id,name,gender) values(1,'dream','male,female');

mysql> insert into user(id,name,gender) values(1,'dream','male,female');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1

【3】集合类型 set

create table teacher(
	id int,
    name varchar(16),
    gender enum('male','female','others'),
    hobby set('read books','listen music','play games')
);


mysql> create table teacher(
    ->  id int,
    ->     name varchar(16),
    ->     gender enum('male','female','others'),
    ->     hobby set('read books','listen music','play games')
    -> );
Query OK, 0 rows affected (0.21 sec)

mysql> desc teacher;
+--------+-----------------------------------------------+------+-----+---------+-------+
| Field  | Type                                          | Null | Key | Default | Extra |
+--------+-----------------------------------------------+------+-----+---------+-------+
| id     | int(11)                                       | YES  |     | NULL    |       |
| name   | varchar(16)                                   | YES  |     | NULL    |       |
| gender | enum('male','female','others')                | YES  |     | NULL    |       |
| hobby  | set('read books','listen music','play games') | YES  |     | NULL    |       |
+--------+-----------------------------------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
insert into teacher values(
	1,
    'dream',
    'male',
    'read books'
);

mysql> insert into teacher values(
    ->  1,
    ->     'dream',
    ->     'male',
    ->     'read books'
    -> );
Query OK, 1 row affected (0.03 sec)

mysql> select * from teacher;
+------+-------+--------+------------+
| id   | name  | gender | hobby      |
+------+-------+--------+------------+
|    1 | dream | male   | read books |
+------+-------+--------+------------+
1 row in set (0.00 sec)


insert into teacher values(
	2,
    'chimeng',
    'female',
    'read books,listen music'
);

mysql> insert into teacher values(
    ->  2,
    ->     'chimeng',
    ->     'female',
    ->     'read books,listen music'
    -> );
Query OK, 1 row affected (0.03 sec)

mysql> select * from teacher;
+------+---------+--------+-------------------------+
| id   | name    | gender | hobby                   |
+------+---------+--------+-------------------------+
|    1 | dream   | male   | read books              |
|    2 | chimeng | female | read books,listen music |
+------+---------+--------+-------------------------+
2 rows in set (0.00 sec)

【九】总结

【1】字段类型

-- 【一】数字类型
-- 【1】整数类型
-- tinyint int bigint ...
-- 【2】浮点数类型
-- float double decimal
-- 【二】字符串类型
-- 开启严格模式
-- char  自动补全长度
-- varchar 不会自动补全
-- 【三】时间日期类型
-- date 日期 年月日
-- time 时间 时分秒
-- datetime 年月日时分秒
-- year 年份
-- 【四】枚举和集合
-- 枚举 enum 在多个备选项中只能选一个 
-- 集合 set 在多个备选项中能选多个 多个之间用,合开

【2】约束条件

-- unsigned 无符号
-- null可以为空
-- not null 不能为空
-- zerofill 默认长度用0填充

-- ● unsigned约束条件用于指定某个字段只能包含非负数(正整数或零)。
-- ● 当将字段定义为unsigned时,它会限制该字段的取值范围为大于等于零的整数。

【3】严格模式

-- 【一】查看所有的严格模式 
show variables like "%mode";
-- % 模糊查询任意长度
-- _ 模糊查询一个长度

-- 【二】修改严格模式
-- 【1】全局永久性修改
set global sql_mode = "";
-- 【2】局部临时性修改
set session sql_mode = "";
posted @ 2024-05-29 08:49  HuHuMarshal  阅读(31)  评论(1)    收藏  举报