目录
(2)char与varcahr的比较
一.针对记录的SQL语句
1.什么是记录
表中一行一行的数据称之为记录
(需要先有库再有表最后有操作记录)
2.有哪些针对记录的SQL语句
1. 查看记录
select * from t1; # 查所有
2. 增加数据
insert into t1 values(1, 'kevin', 20); # 第一种方式,全字段增加, 单条增加
insert into t1 values(2, 'kevin1', 20),(3, 'kevin2', 20),(4, 'kevin3', 20),(5, 'kevin4', 20),(6, 'kevin5', 20); # 第二种方式,全字段增加, 批量增加
insert into t1(id, name) values(7, 'kevin7'); # 空的使用NULL填充
3. 修改
update t1 set name='tank' where id=1;
update t1 set age=30 where name='tank';
update t1 set name='jerry',age=30 where id=3;
update t1 set name='oscar' where name='tank' and age=30;
update t1 set name='oscar' where name='kevin3' or name='kevin4';
update t1 set name='tony';
"""以后再自行更新和删除的sql语句的时候,一定要细心、好好看看你的条件是否正确"""
案例:
update t1 set age=age+40 where id=1;
update t1 set price=price+10;
"""一定要谨慎!!!!"""
4. 删除
delete from t1 where id=1;
delete from t1 where id=2 or id=7;
delete from t1; # 这是清空表
二.配置文件的使用
MySQL的配置文件是:my-default.ini (修改了配置文件,一定别忘了重启服务端)
修改配置文件内容(修改字符编码为utf-8):
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
三.存储引擎的使用
存储引擎就是存储数据的方式
MySQL支持的存储引擎方式
使用命令:show engines; 查看存储引擎
一共有九种存储引擎,重点学习:MyISAM MEMORY InnoDB 这三个存储引擎
- MyISAM:
- 它是MySQL5.5版本及之前的版本默认的存储引擎,它的读取速度相较于InnoDB很快,但是它的数据安全性相较于InnoDB较低(不支持事务,支持的是表锁)
- InnoDB:
- 它是MySQL5.6及之后的版本默认的存储引擎,它的读取速度相对较慢,但是安全性比较高(支持事务、行锁、外键)
- MEMORY:
- 它是基于内存存储的,意味着断电数据就会丢失,重启服务端数据也会丢失
create table t2 (id int, name varchar(64)) engine=MyISAM;
create table t3 (id int, name varchar(64)) engine=InnoDB;
create table t4 (id int, name varchar(64)) engine=MEMORY;
对于不同的存储引擎,硬盘中保存的文件个数也是不一样的
MyISAM:(3个文件)
.frm 存储表结构
.MYD 存储表数据
.MYI 存索引
InnoDB:(2个文件)
.frm 存储表结构
.ibd 存储数据和索引
MEMORY:()
.frm 存储表结构
四.数据类型
1.整型:(存储整数的)
分类:TINYINT SAMLLINT MEDUIMINT INT BINGINT
作用:存储年龄、ID、等级、号码等
整数类型 | 字节 | 无符号数的取值范围 | 有符号数的取值范围 |
---|---|---|---|
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 |
以TINYINT存储数据:
- 是否有符号
- 默认情况下是带符号的
- 超出最大范围会如何
- 超出限制只能存最大接受值
(1)TINYINT存储数据超出最大范围会如何
创建表:
create table t9(id tinyint);
# Query OK, 0 rows affected (0.58 sec)
查看表:
desc t9;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | tinyint(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)
表中已经有了相对于的数据格式
TINYINT 有符号最大限制 -128~127
插入数据:
insert into t9 values(-129),(256);
# ERROR 1264 (22003): Out of range value for column 'id' at row 1
插入数据:
insert into t9 values(-128),(127);
# Query OK, 2 rows affected (0.15 sec)
Records: 2 Duplicates: 0 Warnings: 0
查看表:
select * from t9;
+------+
| id |
+------+
| -128 |
| 127 |
+------+
2 rows in set (0.00 sec)
- 默认情况下带括号
- 超出最大限制只能存最大接收值
(2)约束条件之unsigned(无符号)
创建表(约束条件:tinyint unsigned
)
create table t10(id tinyint unsigned);
# Query OK, 0 rows affected (1.00 sec)
查看表:
desc t10;
+-------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| id | tinyint(3) unsigned | YES | | NULL | |
+-------+---------------------+------+-----+---------+-------+
1 row in set (0.00 sec)
插入数据:
insert into t10 values(156);
# Query OK, 1 row affected (0.12 sec)
查看数据:
select * from t10;
+------+
| id |
+------+
| 128 |
| 156 |
+------+
2 rows in set (0.00 sec)
针对整型,括号内的宽度是用来限制存储数据的范围的
创建表:
create table t12(id int(8));
# Query OK, 0 rows affected (0.76 sec)
查看表:
desc t12;
+-------+--------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+-------+
| id | int(8) | YES | | NULL | |
+-------+--------+------+-----+---------+-------+
1 row in set (0.00 sec)
插入数据:
insert into t12 values(123456789);
# Query OK, 1 row affected (0.09 sec)
查看表:
select * from t12;
+-----------+
| id |
+-----------+
| 123456789 |
+-----------+
1 row in set (0.00 sec)
限制了8存储了9
特例:
只有整型括号内的数字不是限制位数而是显示长度
id int(8)
如果数字没有超出 8 位 ,那么默认用 0 填充至 8 位
如果数字超出 8 位 ,那么 有几位存几位(但是还是要遵循最大范围)
插入数据:
insert into t12 values(1);
# Query OK, 1 row affected (0.25 sec)
查看表:
select * from t12;
+-----------+
| id |
+-----------+
| 123456789 |
| 1 |
+-----------+
2 rows in set (0.00 sec)
按理来说是应该用0填充的,但是为什么看不看0呢
(3)约束条件之 zerofill
创建表(无符号,用0填充至8位)
create table t13(id int(8) unsigned zerofill);
# Query OK, 0 rows affected (0.57 sec)
查看表:
desc t13;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| id | int(8) unsigned zerofill | YES | | NULL | |
+-------+--------------------------+------+-----+---------+-------+
1 row in set (0.00 sec)
插入数据:
insert into t13 values(1);
# Query OK, 1 row affected (0.20 sec)
insert into t13 values(123456789);
# Query OK, 1 row affected (0.20 sec)
查看表:
select * from t13;
+-----------+
| id |
+-----------+
| 00000001 |
| 123456789 |
+-----------+
2 rows in set (0.00 sec)
数字不够8位用0填充
总结:针对整型字段,无需指定宽度,因为它的默认的宽度已经足够展示所有数据了
2.浮点型
- 分类
- FLOAT DOUBLE DECIMAL
- 作用
数据类型 | 字节数 | 取值范围 |
---|---|---|
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 |
(1)存储限制
float(255,30)
# 总共255位 , 小数部分占 30 位
double(255,30)
# 总共255位 , 小数部分占 30 位
decimal(65,30)
# 总共65位 , 小数部分占 30 位
(2)精确度验证
创建表:
create table t15(id float(255,30));
create table t16(id double(255,30));
create table t17(id decimal(65,30));
# Query OK, 0 rows affected (1.67 sec)
# Query OK, 0 rows affected (0.93 sec)
# Query OK, 0 rows affected (2.60 sec)
查看表:
desc t15;
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| id | float(255,30) | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
1 row in set (0.00 sec)
desc t16;
+-------+----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| id | double(255,30) | YES | | NULL | |
+-------+----------------+------+-----+---------+-------+
1 row in set (0.00 sec)
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);
# Query OK, 1 row affected (0.17 sec)
# Query OK, 1 row affected (0.12 sec)
# Query OK, 1 row affected (0.19 sec)
查看数据:
select * from t15;
+----------------------------------+
| id |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00 sec)
select * from t16;
+----------------------------------+
| id |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec)
select * from t17;
+----------------------------------+
| id |
+----------------------------------+
| 1.111111111111111111111100000000 |
+----------------------------------+
1 row in set (0.00 sec)
可以很明显的发现每一个类型的精确度有明显的区别
float < double < decimal
虽然每个类型的精确度不一,但是可以根据实际情况选择对应的数据类型
3.字符串类型
(1)分类
char(定长)
char(4)
#(超过四个字符直接报错,不够,四个字符空格补全)
varchar(变长)
varchar(4)
#(超过四个字符直接报错,不够,有几个接存几个)
(2)char与varcahr的比较
- char
- 缺点:浪费空间
- 优点:存储简单,直接按照固定的字符存储数据即可
- varchar
- 优点:节省空间
- 缺点:存储麻烦
- 存的时候在真正的数据前面加报头(表示数据真正大小)
- 取的时候需要先读报头才能读取真实的数据
创建表:
create table t18(name char(4));
create table t19(name varchar(4));
# Query OK, 0 rows affected (1.05 sec)
# Query OK, 0 rows affected (0.54 sec)
查看表:
desc t18;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| name | char(4) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.01 sec)
desc t19;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| name | varchar(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)
插入数据:
insert into t18 values('a');
insert into t19 values('a');
# Query OK, 1 row affected (0.11 sec)
# Query OK, 1 row affected (0.12 sec)
插入数据(超出字符范围)
insert into t18 values('dream');
# ERROR 1406 (22001): Data too long for column 'name' at row 1
查看表:
select * from t18;
+------+
| name |
+------+
| a |
+------+
1 row in set (0.00 sec)
select * from t19;
+------+
| name |
+------+
| a |
+------+
1 row in set (0.00 sec)
我们可以观察到,通过这种方式无法直观地看到我们想要的效果
(3)char_length
char_length:统计字段长度
select char_length(name) from t18;
+-------------------+
| char_length(name) |
+-------------------+
| 1 |
+-------------------+
1 row in set (0.00 sec)
select char_length(name) from t19;
+-------------------+
| char_length(name) |
+-------------------+
| 1 |
+-------------------+
1 row in set (0.00 sec)
char在硬盘上存的绝对是真正的数据,带有空格
但是在现实的时候MySQL会自动将多余的空格删除
解决方法:修改sql_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.01 sec)
修改命令:
要在原有的基础上进行替换,所以要带有原有的属性
set global 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,PAD_CHAR_TO_FULL_LENGTH';
# Query OK, 0 rows affected (0.00 sec)
再次运行查询命令:
select char_length(name) from t18;
+-------------------+
| char_length(name) |
+-------------------+
| 4 |
+-------------------+
1 row in set (0.00 sec)
select char_length(name) from t19;
+-------------------+
| char_length(name) |
+-------------------+
| 1 |
+-------------------+
1 row in set (0.00 sec)
4.时间类型
分类:
- date:年月日
- datetime:年月日时分秒
- time:时分秒
- year:年
创建表:
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.45 sec)
插入数据:
insert into student values(
1,
'dream',
'2001',
'2001-1-31',
'11:11:11',
'2023-6-30 11:11:11'
);
# Query OK, 1 row affected (0.09 sec)
查看表:
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)
查看表数据:
select * from student;
+------+-------+-----------+------------+------------+---------------------+
| id | name | born_year | birth | study_time | reg_time |
+------+-------+-----------+------------+------------+---------------------+
| 1 | dream | 2001 | 2001-01-31 | 11:11:11 | 2023-06-30 11:11:11 |
+------+-------+-----------+------------+------------+---------------------+
1 row in set (0.00 sec)
5.枚举与集合类型
(1)枚举与集合
枚举(enum):多选一
枚举类型存储数据只能从候选项中选取一个才行
集合(set):多选多
(2)使用
枚举:
创建表:
create table user(
id int,
name char(16),
gender enum('male','female','others')
);
# Query OK, 0 rows affected (1.13 sec)
查看表:
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 values(1,'dream','male');
# Query OK, 1 row affected (0.17 sec)
查看表数据:
select * from user;
+------+------------------+--------+
| id | name | gender |
+------+------------------+--------+
| 1 | dream | male |
+------+------------------+--------+
1 row in set (0.00 sec)
插入数据:
insert into user values(2,'chimeng','x');
# ERROR 1265 (01000): Data truncated for column 'gender' at row 1
枚举类型存储数据只能从候选项中取一个才行
集合:
创建表:
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.58 sec)
查看表:
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'
);
# Query OK, 1 row affected (0.17 sec)
查看数据:
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'
);
# Query OK, 1 row affected (0.17 sec)
查看数据:
+------+---------+--------+-------------------------+
| id | name | gender | hobby |
+------+---------+--------+-------------------------+
| 1 | dream | male | read books |
| 2 | chimeng | female | read books,listen music |
+------+---------+--------+-------------------------+
2 rows in set (0.00 sec)
插入数据:
insert into teacher values(
3,
'bud',
'others'
);
# ERROR 1136 (21S01): Column count doesn't match value count at row 1
集合类型可以多选,不允许不选,错选
五.总结:
1.字段类型:
数值类型:
- INT:整数类型,通常用于存储整数值。
- BIGINT:大整数类型,可以存储更大范围的整数值。
- DECIMAL:高精度浮点数类型,用于存储具有精确小数位的数值。
字符串类型:
- CHAR:定长字符串类型,存储固定长度的字符。
- VARCHAR:变长字符串类型,存储可变长度的字符。
- TEXT:用于存储较长的文本内容。
日期和时间类型:
- DATE:仅存储日期。
- TIME:仅存储时间。
- DATETIME:存储日期和时间。
- TIMESTAMP:存储日期和时间,并自动记录修改时间戳。
枚举和集合类型:
- ENUM:用于存储预定义的枚举值。
- SET:用于存储多个预定义值的集合。
2.严格模式
严格模式是MySQL数据库的一种运行模式,他对数据的完整性和准确度有更严格的要求
使用严格模式可以帮助开发人员在数据库操作中发现和修复潜在的问题,提高数据的一致性和可靠性
在严格模式下,MySQL会进行以下检查:
-
严格的数据类型检查:MySQL会根据表定义的字段类型和长度进行严格的数据验证,不允许非法的数据插入。比如,如果一个字段定义为整数类型,但插入了一个字符串,则会产生错误。
-
禁止隐式转换:MySQL不会自动将一种数据类型隐式转换为另一种数据类型,从而避免因为隐式转换引起的数据不准确或截断的问题。
-
非空字段检查:MySQL会检查非空字段是否为空,如果为空则会报错。
-
严格模式下的零值插入:在严格模式下,MySQL对于插入零值(如或'')会更加严格,例如不允许将一个非零值插入到定义为无符号整数的字段中。
启用严格模式可以通过以下方式之一实现:
-
在连接数据库时指定参数:可以在连接字符串中加上
STRICT_TRANS_TABLES
或STRICT_ALL_TABLES
参数来开启严格模式。 -
修改配置文件:可以在MySQL的配置文件(通常是my.cnf或my.ini)中设置
sql_mode
参数,添加或修改相关模式来启用或禁用严格模式。
需要注意的是,严格模式可能导致一些应用程序出现问题,因为它要求更加严格的数据验证和操作,因此,在启用严格模式之前,应该进行充分的测试和评估,确保应用能够适应这种模式下的变化