📚 博主的专栏
在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列修改为xingmingmysql> 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);
结语:
随着这篇博客接近尾声,我衷心希望我所分享的内容能为你带来一些启发和帮助。学习和理解的过程往往充满挑战,但正是这些挑战让我们不断成长和进步。我在准备这篇文章时,也深刻体会到了学习与分享的乐趣。
在此,我要特别感谢每一位阅读到这里的你。是你的关注和支持,给予了我持续写作和分享的动力。我深知,无论我在某个领域有多少见解,都离不开大家的鼓励与指正。因此,如果你在阅读过程中有任何疑问、建议或是发现了文章中的不足之处,都欢迎你慷慨赐教。
你的每一条反馈都是我前进路上的宝贵财富。同时,我也非常期待能够得到你的点赞、收藏,关注这将是对我莫大的支持和鼓励。当然,我更期待的是能够持续为你带来有价值的内容。