【MYSQL】笔记

发布于:2025-05-19 ⋅ 阅读:(17) ⋅ 点赞:(0)

📚 博主的专栏

🐧 Linux   |   🖥️ C++   |   📊 数据结构  | 💡C++ 算法 | 🅒 C 语言  | 🌐 计算机网络

在ubuntu中,改配置文件:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf  # Ubuntu默认服务端配置

文件默认存储路径:

/var/lib/mysql

 或者在登录mysql之后输入:

SHOW VARIABLES LIKE 'datadir';

一般是这样:

+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+

  登录命令: 

mysql -h 127.0.0.1 -P 3306 -u root -p
mysql -u root -p

数据库基本概念: 

mysql是数据库的客户端

mysqld是数据库的服务端

mysql本质上是基于C(mysql)S(mysqld)模式的一种网络服务

数据库一般指的是,在磁盘或者内存中存储的特定结构组织的数据 ,将来在磁盘上存储的一套数据库方案,数据库服务--mysqld。

一般的文件确实提供了数据的存储功能,但是文件并没有提供非常好的数据管理能力(用户角度)

数据库本质:对数据库内容存储的一套解决方案,你给我字段或者要求,我(数据库文件+客户端)直接给你结果就可以

创建数据库:create database 数据库名;

CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,
create_specification] ...]

说明:

大写的表示关键字

[] 是可选项

创建数据库的时候,有两个编码集:

1.数据库编码集 -- 数据库未来存储数据

2.数据库校验集 -- 支持数据库进行字段比较使用的编码,本质上是一种读取数据库中数据的采用的编码格式

数据库无论对数据做任何操作,都必须保证操作和编码必须是编码一致的

CHARACTER SET: 指定数据库采用的字符集

COLLATE: 指定数据库字符集的校验规则

 验证创建成功:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| helloworld         |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

并且可以在mysql文件默认存储路径下:新增所创建的数据库目录

建立数据库本质就是Linux下的目录

使用数据库:use 数据库名

mysql> use helloworld
Database changed

创建数据库表

mysql> create table student(
    -> name varchar(32),
    -> age int,
    -> gender varchar(2)
    -> );
Query OK, 0 rows affected (0.04 sec)

在数据库内建表,本质就是在Linux系统下创建一个文件

root@VM-8-15-ubuntu:/var/lib/mysql/helloworld# ls
student.ibd

 插入数据:

mysql> insert into student (name, age, gender) values ('张三',20, '男');
Query OK, 1 row affected (0.01 sec)

查找、筛选信息

mysql> select * from student;
+--------+------+--------+
| name   | age  | gender |
+--------+------+--------+
| 张三   |   20 | 男     |
+--------+------+--------+
1 row in set (0.00 sec)

删除数据库:

DROP DATABASE [IF EXISTS] db_name;

SQL分类:

DDL:数据定义语言; 

create、drop、alter

DML:数据操纵语言

insert、delete、update

DCL:数据控制语言

grant、revoke、commit

查看存储引擎:

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

字符集和校验规则

查看系统默认字符集

mysql> show variables like 'character_set_database';
+------------------------+---------+
| Variable_name          | Value   |
+------------------------+---------+
| character_set_database | utf8mb3 |
+------------------------+---------+
1 row in set (0.01 sec)

查看系统默认校验规则

mysql> show variables like 'collation_database';
+--------------------+--------------------+
| Variable_name      | Value              |
+--------------------+--------------------+
| collation_database | utf8mb3_general_ci |
+--------------------+--------------------+
1 row in set (0.00 sec)
mysql> show variables like 'collation_%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_0900_ai_ci |
| collation_database   | utf8mb3_general_ci |
| collation_server     | utf8mb3_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

查看数据库支持的字符集

show charset;

字符集主要是控制用什么语言。比如utf8就可以使用中文


查看数据库支持的字符集校验规则
 

show collation;

指定编码创建数据库:

create database d2 charset=utf8;
create database d2 character set utf8;

在mysql8.0+没有db.opt配置文件

可以这样查看:

mysql> SHOW CREATE database d2;
+----------+---------------------------------------------------------------------------------------------------+
| Database | Create Database                                                                                   |
+----------+---------------------------------------------------------------------------------------------------+
| d2       | CREATE DATABASE `d2` /*!40100 DEFAULT CHARACTER SET utf8mb3 */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+---------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

校验规则对数据库的影响

不区分大小写

创建一个数据库,校验规则使用utf8_ general_ ci[不区分大小写]

create database d3 collate utf8_general_ci;

创建一个名为 d3 的数据库,并显式指定其字符集为 GBK,校对规则(排序规则)为 gbk_chinese_ci

create database d3 charset=gbk collate gbk_chinese_ci;

在test1中创建一个表person,并且插入一些字符,这里是查找a 不区分大小写

mysql> select * from person where name='a';
+------+
| name |
+------+
| a    |
| A    |
+------+
2 rows in set (0.00 sec)

 结果排序

不区分大小写排序以及结果:

mysql> select * from person order by name;
+------+
| name |
+------+
| a    |
| A    |
| b    |
| c    |
| d    |
+------+
5 rows in set (0.00 sec)

创建一个数据库,校验规则使用utf8_ bin[区分大小写]

create database test2 collate utf8_bin;

区分大小写的排序 

mysql> use test2;
mysql> select * from person order by name;
+------+
| name |
+------+
| A |
| B |
| a |
| b |
+------+

操纵数据库

查看数据库

show databases;
select database();//查看当前所在数据库

显示创建语句

show create database 数据库名;

说明:
MySQL 建议我们关键字使用大写,但是不是必须的。
数据库名字的反引号``,是为了防止使用的数据库名刚好是关键字
/*!40100 default.... */ 这个不是注释,表示当前mysql版本大于4.01版本,就执行这句话

修改数据库

语法:

ALTER DATABASE db_name
[alter_spacification [,alter_spacification]...]
alter_spacification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name

对数据库的修改主要指的是修改数据库的字符集,校验规则实例:

将 mytest 数据库字符集改成 gbk

mysql> alter database mytest charset=gbk;
Query OK, 1 row affected (0.00 sec)
mysql> show create database mytest;
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| mytest | CREATE DATABASE `mytest` /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+----------------------------------------------------------------+

库的备份与恢复:

备份:

mysqldump -P3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径

将mytest库备份到文件(退出连接

mysqldump -P3306 -u root -p123456 -B mytest > D:/mytest.sql

这时,可以打开看看 mytest.sql 文件里的内容,其实把我们整个创建数据库,建表,导入数据的语句都装载这个文件中。
还原

mysql> source D:/mysql-5.7.22/mytest.sql;

注意:

如果备份的不是整个数据库,而是其中的一张表,怎么做

mysqldump -u root -p 数据库名 表名1 表名2 > D:/mytest.sql

同时备份多个数据库

mysqldump -u root -p -B 数据库名1 数据库名2 ... > 数据库存放路径

如果备份一个数据库时,没有带上-B参数, 在恢复数据库时,需要先创建空数据库,然后使用数据库,再使用source来还原

查看连接情况(数据库卡的时候可以查一查连接情况)

show processlist

创建表

mysql> create table if not exists user1(
    -> name varchar(20) comment '用户名',
    -> password char(32) comment '用户的密码',
    -> birthday date comment '用户的生日'
    -> )charset=utf8 collate utf8_general_ci engine MyIsam;
Query OK, 0 rows affected, 2 warnings (0.03 sec)

//或者

mysql> create table if not exists user3(
    -> name varchar(20) comment '用户名',
    -> password char(32) comment '用户的密码',
    -> birthday date comment '用户的生日'
    -> )charset=utf8 collate=utf8_general_ci engine=InnoDB;

 不同的存储引擎,创建表的文件不一样。

users 表存储引擎是 MyISAM ,在数据目中有三个不同的文件,分别是:

users.frm:表结构

users.MYD:表数据users.MYI:表索引

user1_375.sdi  user1.MYI      user2.MYD  user3.ibd
user1.MYD      user2_376.sdi  user2.MYI

查看创建表的信息:\G可以过滤掉不必要的符号

mysql> show create table user1 \G
*************************** 1. row ***************************
       Table: user1
Create Table: CREATE TABLE `user1` (
  `name` varchar(20) DEFAULT NULL COMMENT '用户名',
  `password` char(32) DEFAULT NULL COMMENT '用户的密码',
  `birthday` date DEFAULT NULL COMMENT '用户的生日'
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3
1 row in set (0.00 sec)

修改表结构

在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型,表的存储引擎等等。我们还有需求,添加字段,删除字段等等。这时我们就需要修改表

ALTER TABLE tablename ADD (column datatype [DEFAULT expr][,column
datatype]...);
ALTER TABLE tablename MODIfy (column datatype [DEFAULT expr][,column
datatype]...);
ALTER TABLE tablename DROP (column);

给user1改名为user:

alter table user1 rename to user;

在第一行添加id:

mysql> ALTER TABLE user 
    -> ADD COLUMN id INT(11) COMMENT '用户id' FIRST;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | YES  |     | NULL    |       |
| name     | varchar(20) | YES  |     | NULL    |       |
| password | char(32)    | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

插入数据:

mysql> insert into user values (1, 'pupu', '123456', '2003-1-1');
Query OK, 1 row affected (0.01 sec)

mysql> insert into user values (2, 'guagua', '6789', '2003-2-2');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+------+--------+----------+------------+
| id   | name   | password | birthday   |
+------+--------+----------+------------+
|    1 | pupu   | 123456   | 2003-01-01 |
|    2 | guagua | 6789     | 2003-02-02 |
+------+--------+----------+------------+
2 rows in set (0.00 sec)

在users表添加一个字段,用于保存图片路径,指定按照该birthday后面

alter table users add assets varchar(100) comment '图片路径' after
birthday;
mysql> desc user;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id       | int          | YES  |     | NULL    |       |
| name     | varchar(20)  | YES  |     | NULL    |       |
| password | char(32)     | YES  |     | NULL    |       |
| birthday | date         | YES  |     | NULL    |       |
| assets   | varchar(100) | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

mysql> select * from user;
+------+--------+----------+------------+--------+
| id   | name   | password | birthday   | assets |
+------+--------+----------+------------+--------+
|    1 | pupu   | 123456   | 2003-01-01 | NULL   |
|    2 | guagua | 6789     | 2003-02-02 | NULL   |
+------+--------+----------+------------+--------+

对指定列的某一些属性做修改,比如说将name的类型长度从20改为60

删除password列
删除字段一定要小心,删除字段及其对应的列数据都没了

mysql> alter table user drop password;
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> desc user;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id       | int          | YES  |     | NULL    |       |
| name     | varchar(60)  | YES  |     | NULL    |       |
| birthday | date         | YES  |     | NULL    |       |
| assets   | varchar(100) | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> select * from user;
+------+--------+------------+--------+
| id   | name   | birthday   | assets |
+------+--------+------------+--------+
|    1 | pupu   | 2003-01-01 | NULL   |
|    2 | guagua | 2003-02-02 | NULL   |
+------+--------+------------+--------+
2 rows in set (0.00 sec)

修改表名为employee

mysql> alter table users rename to employee;

to:可以省掉


将name列修改为xingming

mysql> alter table employee change name xingming varchar(60) comment '员工姓名'; --新字段需要完整

删除表

DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...
drop table t1; 

轻易不要修改和删除数据库的表和数据库

数据类型:

数值类型 

tinyint类型
默认有符号 

mysql> show create table t1 \G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `num` tinyint DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
1 row in set (0.00 sec)

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

mysql> insert into t1 values (127);
Query OK, 1 row affected (0.00 sec)

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

mysql> insert into t1 values (-1);
Query OK, 1 row affected (0.00 sec)

mysql> 
mysql> select * from t1;
+------+
| num  |
+------+
| -128 |
|  127 |
|    1 |
|   -1 |
+------+
4 rows in set (0.00 sec)

mysql> insert into t1 values (-129);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t1 values (+128);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t1 values (+130);
ERROR 1264 (22003): Out of range value for column 'num' at row 1

无符号 

mysql> show tables
    -> ;
+-------------------+
| Tables_in_test_db |
+-------------------+
| t1                |
| t2                |
+-------------------+
2 rows in set (0.00 sec)

mysql> desc t2;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| num   | tinyint unsigned | YES  |     | NULL    |       |
+-------+------------------+------+-----+---------+-------+
1 row in set (0.01 sec)

mysql> insert into t2 values (0);
Query OK, 1 row affected (0.01 sec)

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

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

mysql表中建立属性列,列名称 类型在后

其他类型自己推导

注意:尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下,与其如此,还不如设计时,将int类型提升为bigint类型

bit类型

mysql> create table if not exists t3(
    -> id int,
    -> online bit(1)
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> desc t3;
+--------+--------+------+-----+---------+-------+
| Field  | Type   | Null | Key | Default | Extra |
+--------+--------+------+-----+---------+-------+
| id     | int    | YES  |     | NULL    |       |
| online | bit(1) | YES  |     | NULL    |       |
+--------+--------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert into t3 (id, online) values (123, 0);
Query OK, 1 row affected (0.01 sec)

mysql> insert into t3 (id, online) values (124, 1);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t3;
+------+----------------+
| id   | online         |
+------+----------------+
|  123 | 0x00           |
|  124 | 0x01           |
+------+----------------+
2 rows in set (0.00 sec)

mysql> select  id, hex(online) from t3;
+------+-------------+
| id   | hex(online) |
+------+-------------+
|  123 | 0           |
|  124 | 1           |
+------+-------------+
2 rows in set (0.00 sec)

mysql> 

小数类型
float
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入

mysql> create table tt6(id int, salary float(4,2));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tt6 values(100, -99.99);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt6 values(101, -99.991); #多的这一点被拿掉了
Query OK, 1 row affected (0.00 sec)
mysql> select * from tt6;
+------+--------+
| id | salary |
+------+--------+
| 100 | -99.99 |
| 101 | -99.99 |
+------+--------+
2 rows in set (0.00 sec)

缺点,一个数据比较大,或者小数点后边位数多,就会float就存储不精确

decimal

decimal(5,2) 表示的范围是 -999.99 ~ 999.99

decimal(5,2) unsigned 表示的范围 0 ~ 999.99 decimal和float很像,但是有区别:

float和decimal表示的精度不一样

mysql> create table tt8 ( id int, salary float(10,8), salary2
decimal(10,8));
mysql> insert into tt8 values(100,23.12345612, 23.12345612);
Query OK, 1 row affected (0.00 sec)
mysql> select * from tt8;
+------+-------------+-------------+
| id | salary | salary2 |
+------+-------------+-------------+
| 100 | 23.12345695 | 23.12345612 | # 发现decimal的精度更准确,因此如果我们希望某
个数据表示高精度,选择decimal
+------+-------------+-------------+

说明:float表示的精度大约是7位。

decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10

建议:如果希望小数的精度高,推荐使用decimal。

字符串类型

char
char(L): 固定长度字符串,L是可以存储的长度,单位为字符(可以是字母或者汉字),最大长度值可以为255

mysql> create table tt9(id int, name char(2));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into tt9 values(100, 'ab');
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt9 values(101, '中国');
Query OK, 1 row affected (0.00 sec)
mysql> select * from tt9;
+------+--------+
| id | name |
+------+--------+
| 100 | ab |
| 101 | 中国 |
+------+--------+

一个utf-8汉字占3个字节

说明:

char(2) 表示可以存放两个字符,可以是字母或汉字,但是不能超过2个, 最多只能是255
 

mysql> create table tt10(id int ,name char(256));
ERROR 1074 (42000): Column length too big for column 'name' (max = 255); use
BLOB or TEXT instead

varchar

varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节

mysql> create table tt10(id int ,name varchar(6)); --表示这里可以存放6个字符
mysql> insert into tt10 values(100, 'hello');
mysql> insert into tt10 values(100, '我爱你,中国');
mysql> select * from tt10;
+------+--------------------+
| id | name |
+------+--------------------+
| 100 | hello |
| 100 | 我爱你,中国 |
+------+--------------------+

说明:

关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:

varchar长度可以指定字节为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字

节数是65532。

当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。

mysql> create table tt11(name varchar(21845))charset=utf8; --验证了utf8确实是不
能超过21844
ERROR 1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. You have to change some columns to
TEXT or BLOBs
mysql> create table tt11(name varchar(21844)) charset=utf8;
Query OK, 0 rows affected (0.01 sec)

char VS varchar

如何选择定长或变长字符串?
如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
定长的磁盘空间比较浪费,但是效率高。
变长的磁盘空间比较节省,但是效率低。
定长的意义是,直接开辟好对应的空间
变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少

日期和时间类型

date :日期 'yyyy-mm-dd' ,占用三字节
datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节

//创建表
mysql> create table birthday (t1 date, t2 datetime, t3 timestamp);
Query OK, 0 rows affected (0.01 sec)
//插入数据:
mysql> insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:1:1'); --插入两
种时间
Query OK, 1 row affected (0.00 sec)
mysql> select * from birthday;
+------------+---------------------+---------------------+
| t1 | t2 | t3 |
+------------+---------------------+---------------------+
| 1997-07-01 | 2008-08-08 12:01:01 | 2017-11-12 18:28:55 | --添加数据时,时间戳自动补
上当前时间
+------------+---------------------+---------------------+
//更新数据:
mysql> update birthday set t1='2000-1-1';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from birthday;
+------------+---------------------+---------------------+
| t1 | t2 | t3 |
+------------+---------------------+---------------------+
| 2000-01-01 | 2008-08-08 12:01:01 | 2017-11-12 18:32:09 | -- 更新数据,时间戳会更新
成当前时间
+------------+---------------------+---------------------+

enum和set

语法:

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

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

该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,....最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。

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

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

该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,....最多64个。

说明:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读

案例:

有一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择(可以多选), (男,女)[单选]

mysql> create table votes(
-> username varchar(30),
-> hobby set('登山','游泳','篮球','武术'), --注意:使用数字标识每个爱好的时候,想想
Linux权限,采用比特位位置来个set中的爱好对应起来
-> gender enum('男','女')); --注意:使用数字标识的时候,就是正常的数组下标
Query OK, 0 rows affected (0.02 sec)
insert into votes values('雷锋', '登山,武术', '男');
insert into votes values('Juse','登山,武术',2);
select * from votes where gender=2;
+----------+---------------+--------+
| username | hobby | gender |
+----------+---------------+--------+
| Juse | 登山,武术 |女 |
+----------+---------------+--------

有如下数据,想查找所有喜欢登山的人 

+-----------+---------------+--------+
| username | hobby | gender |
+-----------+---------------+--------+
| 雷锋 | 登山,武术 | 男 |
| Juse | 登山,武术 | 女 |
| LiLei | 登山 | 男 |
| LiLei | 篮球 | 男 |
| HanMeiMei | 游泳 | 女 |
+-----------+---------------+--------+

使用这样的查询语句,不能查询出所有(这里是严格匹配的),爱好为登山的人 

mysql> select * from votes where hobby='登山';
+----------+--------+--------+
| username | hobby | gender |
+----------+--------+--------+
| LiLei | 登山 | 男 |
+----------+--------+--------+

注意:

NULL vs ‘’-----》

NULL表示空串,""表示有东西

集合查询使用find_ in_ set函数:
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0;

str_list 用逗号分隔的字符串

mysql> select find_in_set('a', 'a,b,c');
+---------------------------+
| find_in_set('a', 'a,b,c') |
+---------------------------+
| 1 |
+---------------------------+
mysql> select find_in_set('d', 'a,b,c');
+---------------------------+
| find_in_set('d', 'a,b,c') |
+---------------------------+
| 0 |
+---------------------------+

查询爱好登山的人

mysql> select * from votes where find_in_set('登山', hobby);
+----------+---------------+--------+
| username | hobby | gender |
+----------+---------------+--------+
| 雷锋 | 登山,武术 | 男 |
| Juse | 登山,武术 | 女 |
| LiLei | 登山 | 男 |
+----------+---------------+--------+

mysql> select * from votes where find_in_set('登山', hobby) and find_in_set('武术', hobby);

 结语:

       随着这篇博客接近尾声,我衷心希望我所分享的内容能为你带来一些启发和帮助。学习和理解的过程往往充满挑战,但正是这些挑战让我们不断成长和进步。我在准备这篇文章时,也深刻体会到了学习与分享的乐趣。    

         在此,我要特别感谢每一位阅读到这里的你。是你的关注和支持,给予了我持续写作和分享的动力。我深知,无论我在某个领域有多少见解,都离不开大家的鼓励与指正。因此,如果你在阅读过程中有任何疑问、建议或是发现了文章中的不足之处,都欢迎你慷慨赐教。

        你的每一条反馈都是我前进路上的宝贵财富。同时,我也非常期待能够得到你的点赞、收藏,关注这将是对我莫大的支持和鼓励。当然,我更期待的是能够持续为你带来有价值的内容。


网站公告

今日签到

点亮在社区的每一天
去签到