Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql基础操作与入门

MySQL库操库、数据表操作与数据类型详解

作者:Sunday不上发条

本文详细讲解字符集与校验规则、创建/修改/删除数据库和表,以及各种数据类型(数值、字符串、日期)的用法,帮你轻松掌握MySQL基础,避免常见错误,感兴趣的朋友一起看看吧

1 ~> 库操作

1.1 字符集和校验规则

字符集:决定数据在底层的存储和编码方式。

比如使用utf8mb4 字符集:

A --> 0x41
中 --> 对应一组 UTF-8 编码
😀 --> 对应一组 UTF-8 编码

MySQL 中默认的字符集为 utf8,可以通过 vim /etc/my.cnf 在配置文件中查看。

校验规则:两个字符串进行比较的时候,应该按照什么规则比较。

例如:

'a‘ = 'A'

到底是 true 还是 false ? 就由校验规则决定。

MySQL 中默认字符集 utf8 对应的校验规则为 utf8_general_ci。

show charset;
show collation;
# 字符集
show variables like 'character_set_database';
# 校验规则
show variables like 'collation_database';

1.2 创建数据库

语法:

create database [if not exist] db_name;

此时,采用默认的字符集和校验规则。

# 指定字符集
charset = charset_name
charset charset_name
character set charset_name
# 指定校验规则
collate collate_name
collate = collate_name

想要指定字符集和校验规则,只需要在创建数据库的时候在后面加上对应的选项。对于每个字符集,MySQL 中都有对应默认的校验规则。

例如指定字符集为utf8mb4:

CREATE DATABASE t1 charset=utf8mb4 collate=utf8mb4_general_ci;
show create database db_name;

实验:验证“校验规则”对数据库的影响

CREATE DATABASE if not exists db1;
create table t1(
	str varchar(8)
	);
# 插入 'a'
insert into t1 (str) values ('a');
# 插入 'A'
insert into t1 (str) values ('A');
select * from t1 where str = 'a';


我们根据 a 查询,同时查到了 a 和 A,即 MySQL 默认的校验规则不区分大小写。

create database db2 charset=utf8 collate=utf8_bin;
select * from t1 where str = 'a';

1.3 操纵数据库

(1)查看数据库

show databases;

(2)查看创建语句

show create database db_name;

示例:

mysql> show create database db1;
+----------+--------------------------------------------------------------+
| Database | Create Database                                              |
+----------+--------------------------------------------------------------+
| db1      | CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------+

说明:

(3)修改数据库

修改数据库主要是指修改“字符集”和“校验规则”。

语法:

ALTER DATABASE db_name [];

# 修改字符集
charset = charset_name
character set charset_name
# 修改校验规则
collate = collate_name 

实例:

mysql> show create database db2;
+----------+--------------------------------------------------------------+
| Database | Create Database                                              |
+----------+--------------------------------------------------------------+
| db2      | CREATE DATABASE `db2` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> alter database db2 charset = gbk;
Query OK, 1 row affected (0.00 sec)

mysql> show create database db2;
+----------+-------------------------------------------------------------+
| Database | Create Database                                             |
+----------+-------------------------------------------------------------+
| db2      | CREATE DATABASE `db2` /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+-------------------------------------------------------------+

(4)删除数据库

DROP DATABASE db_name;

注意:删除后其中数据表全部被删,所以删除时应该非常谨慎!!!

(5)备份和还原

mysqldump -P3306 -u root -p密码 -B 数据库名 > 数据库备份存储的文件路径
mysql -u root -p school < ./school.sql;

实例:例如有一个数据库 school

备份:

mysqldump -u root -p school > ./school.sql

执行后输入 MySQL 密码,就会生成:school.sql

还原:

# 先创建数据库:
create database school;

# 退出 MySQL,在 Liunx 终端执行:
mysql -u root -p school < school.sql

(6)查看连接情况

show processlist;

实例:

mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host      | db   | Command | Time | State    | Info             |
+----+------+-----------+------+---------+------+----------+------------------+
| 10 | root | localhost | db2  | Query   |    0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+

2 ~> 表操作

2.1 创建表

语法:

CREATE TABLE table_name(
	field1 datatype1,
	field2 datatype2,
	field3 datatype3,
	...
)charset 字符集 collate 校验规则 engine 存储引擎;

例如我们描述一个学生:

CREATE TABLE students(
	id int,
	name varchar(8),
	age int unsigned,
	gender char(1)
)charset utf8 collate utf8_general_ci engine InnoDB;

2.2 查看表

desc table_name;

实例:

mysql> desc student;
+--------+------------------+------+-----+---------+-------+
| Field  | Type             | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+-------+
| id     | int(11)          | YES  |     | NULL    |       |
| name   | varchar(8)       | YES  |     | NULL    |       |
| age    | int(10) unsigned | YES  |     | NULL    |       |
| gender | char(1)          | YES  |     | NULL    |       |
+--------+------------------+------+-----+---------+-------+
show create table table_name;

show create table table_name \G
select * from table_name;

2.3 修改表

在项目中,可能经常想要修改表中某个字段的名字,大小,类型,以及字符集和校验规则,存储引擎。

就以上面的 student 为例:

insert into student (id, name, age, gender) values (1, '张三', 18, '男');
# 默认也是全列插入
insert into student values (2, '李四', 19, '女');
mysql> select * from student;
+------+--------+------+--------+
| id   | name   | age  | gender |
+------+--------+------+--------+
|    1 | 张三   |   18 | 男     |
|    2 | 李四   |   19 | 女     |
+------+--------+------+--------+
ALTER table student ADD num varchar(12) AFTER gender;

实例:

mysql> ALTER table student ADD num varchar(12);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc student;
+--------+------------------+------+-----+---------+-------+
| Field  | Type             | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+-------+
| id     | int(11)          | YES  |     | NULL    |       |
| name   | varchar(8)       | YES  |     | NULL    |       |
| age    | int(10) unsigned | YES  |     | NULL    |       |
| gender | char(1)          | YES  |     | NULL    |       |
| num    | varchar(12)      | YES  |     | NULL    |       |
+--------+------------------+------+-----+---------+-------+
alter table student name varchar(20);
alter table student change  gender 性别 char(1);

注意:后面需要带上类型!

alter table student rename person;

注意:轻易不要修改表名,可能会导致业务代码报错。

alter table person drop age;

2.4 删除表

DROP table [if exists] table_name;

3 ~> MySQL 数据类型

3.1 数值类型

3.1.1 整数类型

类型存储空间有符号取值范围无符号取值范围
TINYINT1字节-128~1270~255
SMALLINT2字节-32768~327670~65536
MEDIUMINT3字节-8388608~83886070~16777215
INT4字节******
BIGINT8字节******

说明:没有指明 unsigned,默认为有符号整数。

以 tinyint 为例:

当我们在一个定义一个表,表中某个值的类型为 tinyint,如果要插入数据,那么该整数的大小必须在 -128 ~ 127的范围之中(约束),否则就会报错。

即 MySQL 的数据类型决定了你必须插入合法的值,所以,只要是在表中的数据就一定是合法的,符合我们预期的。

实例:

mysql> insert into t2 (id) values (123);
Query OK, 1 row affected (0.00 sec)

# 超过 tinyint范围:报错
mysql> insert into t2 (id) values (128);
ERROR 1264 (22003): Out of range value for column 'id' at row 1

3.1.2 浮点数类型

类型存储空间精度语法格式
FLOAT4字节单精度浮点数(约7位有效数字)FLOAT(M, D)
DOUBLE8字节双精度浮点数(约15有效数字)DOUBLE(M, D)
DECIMAL变长(计算决定)高精度定点数DECIMAL(M, D)

(1)单精度浮点数类型:float

语法:

float [(M, D)] [unsigned]

实例:

create table (id int, score float(4, 2));
mysql> insert into t3 (id, score) values (1, 90.50);
mysql> insert into t3 (id, score) values (1, 90.508);
mysql> insert into t3 (id, score) values (1, 90.504);
mysql> insert into t3 (id, score) values (1, 9.504);
# ---------------------------报错------------------------------------------
mysql> insert into t3 (id, score) values (1, 123.50);
ERROR 1264 (22003): Out of range value for column 'score' at row 1

mysql> select * from t3;
+------+-------+
| id   | score |
+------+-------+
|    1 | 90.50 |
|    1 | 90.51 |
|    1 | 90.50 |
|    1 |  9.50 |
+------+-------+

(2)高精度定点数类型:decimal

语法:

decimal [(M, D)] [unsigned]

实例:

create table t4(
	id int,
	salary decimal(12, 8),
	salary float(10, 6)
);
mysql> insert into t4 values (2, 1234.123456789, 1234.1234567);

mysql> select * from t4;
+------+---------------+-------------+
| id   | salary        | salary2     |
+------+---------------+-------------+
|    2 | 1234.12345679 | 1234.123413 |
+------+---------------+-------------+

当我们需要用高精度表示时,建议选择 decimal !

3.1.3 BIT 类型

MySQL 中的 BIT 类型用于直接存储二进制位(0 和 1)。

语法:

BIT(M)

实例:

create table t5(
	id int,
	a bit(8)
);
mysql> insert into t5 values (1, 10);
mysql> insert into t5 values (1, b'1010011');
mysql> insert into t5 values (1, 65);

mysql> select * from t5;
+------+------+
| id   | a    |
+------+------+
|    1 |      |
|    1 | S    |
|    1 | A    |
+------+------+

3.2 字符串类型

3.2.1 文本字符类型

(1)char 类型

语法:

char(L)

实例:

create table t6(
	id int,
	str char(8)
);
mysql> insert into t6 values (1, 'hello');
mysql> insert into t6 values (1, '你吃饭了吗');

mysql> select * from t6;
+------+-----------------+
| id   | str             |
+------+-----------------+
|    1 | hello           |
|    1 | 你吃饭了吗        |
+------+-----------------+

(2)varchar 类型

语法:

varchar(L)

实例:

create table t7(
	id int,
	str varchar(6)
);
mysql> insert into t7 values (1, 'hello');
mysql> insert into t7 values (2, '我爱你,中国');

mysql> select * from t7;
+------+--------------------+
| id   | str                |
+------+--------------------+
|    1 | hello              |
|    2 | 我爱你,中国         |
+------+--------------------+

(3)char 和 varchar 比较

通过上面的例子,感觉 char 和 varchar 没什么区别!

char(8):所占空间为 单个字符字节数 * 8;

varchar(8):所占空间为当前实际存储的字符串的大小 + 长度前缀,即 varchar 是在不超过自定义范围的情况下,用多大空间开多大空间。

长度前缀用于存储当前实际存储的字节数。

3.2.2 二进制类型:enum & set

enum:枚举,“单选” 类型。

语法:

enum ('选项1', '选项2', '选项3', ...)

set:集合,“多选” 类型。

语法:

set ('选项1', '选项2', '选项3', ...)

对于 enum 和 set 的选项和数组相似,对应下标1、2、3… 。

实例:

mysql> create table votes (
    -> name varchar(20),
    -> gender enum('男', '女'),
    -> hobby set('足球', '羽毛球', '游泳', '登山')
    -> );
mysql> insert into votes values ('张三','男','足球,游泳');
mysql> insert into votes values ('李四', 2, '游泳');
mysql> insert into votes values ('王五', 1, 6);

mysql> select * from votes;
+--------+--------+------------------+
| name   | gender | hobby            |
+--------+--------+------------------+
| 张三   | 男     | 足球,游泳          |
| 李四   | 女     | 游泳               |
| 王五   | 男     | 羽毛球,游泳         |
+--------+--------+------------------+

如果想要查找喜欢游泳的人:

mysql> select * from votes where hobby = '游泳';
+--------+--------+--------+
| name   | gender | hobby  |
+--------+--------+--------+
| 李四   | 女     | 游泳   |
+--------+--------+--------+

并不能查到所有 hobby 中包含 '游泳' 的人,可以借助 find_in_set。

find_in_set(sub, str_list):如果 sub 在str_list 中返回下标,否则返回 0。

mysql> select * from votes where find_in_set('游泳', hobby);
+--------+--------+------------------+
| name   | gender | hobby            |
+--------+--------+------------------+
| 张三   | 男     | 足球,游泳        |
| 李四   | 女     | 游泳             |
| 王五   | 男     | 羽毛球,游泳      |
+--------+--------+------------------+

3.3 日期和时间类型

常见的有三种类型:

实例:

mysql> create table time(
    -> t1 date,
    -> t2 datatime,
    -> t3 timestamp
    -> );

# 插入两种时间,时间戳会自动补上
mysql> insert into time (t1, t2) values ('1997-7-1','2008-8-8 12:1:1');
mysql> insert into time (t1, t2) values ('1997-7-1','2008-8-8 12:1:1');

# 两次插入存在时间差。所以,看到时间戳不同
mysql> select * from time;
+------------+---------------------+---------------------+
| t1         | t2                  | t3                  |
+------------+---------------------+---------------------+
| 1997-07-01 | 2008-08-08 12:01:01 | 2026-08-26 17:33:59 |
| 1997-07-01 | 2008-08-08 12:01:01 | 2026-08-26 17:34:17 |
+------------+---------------------+---------------------+

到此这篇关于MySQL库操库、数据表操作与数据类型详解的文章就介绍到这了,更多相关mysql基础操作与入门内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文