Day45.DML 数据增删改、数据类型总结

目录

关于数据操纵语言 (DML)

添加数据 -- INSERT

修改数据 -- UPDATE

删除数据

MySQL8新特性:计算列 -- VIRTUAL

数据类型精讲 

整数类型

浮点类型

定点数类型 DECIMAL (使用较多)

时间日期类型

YEAR类型

DATE类型、TIME类型

DATETIME类型(使用较多)

TIMESTAMP类型

总结

文本字符串类型

CHAR与VARCHAR类型(重点)

哪些情况使用 CHAR 或 VARCHAR 更好?

TEXT类型

ENUM类型、SET类型

二进制字符串类型(了解)

BLOB类型

JSON 类型


关于数据操纵语言 (DML)

数据操纵语言DML(Data Manipulation Language)   

  对象:纪录(行)

  关键词:insert update delete

  插入:insert into student values(01,'tonbby',99); (插入所有的字段)

     insert into student(id,name) values(01,'tonbby'); (插入指定的字段)

  更新:update student set name = 'tonbby',score = '99' where id = 01;

  删除:delete from tonbby where id = 01;

        在定义数据类型时,如果确定是 整数 ,就用 INT ; 如果是 小数 ,一定用定点数类型 DECIMAL(M,D) ; 如果是日期与时间,就用 DATETIME

        这样做的好处是,首先确保你的系统不会因为数据类型定义出错。不过,凡事都是有两面的,可靠性好,并不意味着高效。比如,TEXT 虽然使用方便,但是效率不如 CHAR(M) VARCHAR(M)

阿里巴巴《Java开发手册》之MySQL数据库:

  • 任何字段如果为非负数,必须是 UNSIGNED

  • 强制小数类型为 DECIMAL,禁止使用 FLOAT 和 DOUBLE。

    • 说明:在存储的时候,FLOAT 和 DOUBLE 都存在精度损失的问题,很可能在比较值的时候,得到不正确的结果。如果存储的数据范围超过 DECIMAL 的范围,建议将数据拆成整数和小数并分开存储。

  • 强制】如果存储的字符串长度几乎相等,使用 CHAR 定长字符串类型。

  • 强制】VARCHAR 是可变长字符串,不预先分配存储空间,长度不要超过 5000。如果存储长度大于此值,定义字段类型为 TEXT,独立出来一张表,用主键来对应,避免影响其它字段索引效率。

注意:

     开发中很少使用delete,删除有物理删除和逻辑删除,其中逻辑删除可以通过给表添加一个字段(isDel),若值为1,代表删除;若值为0,代表没有删除。

     此时,对数据的删除操作就变成了update操作了。

  truncate和delete的区别:

    truncate(清空)是删除表,再重新创建这个表。属于DDL,delete是一条一条删除表中的数据,属于DML。

注意:

    varchar类型的长度是可变的,创建表时指定了最大长度,定义时,其最大值可以取0-65535之间的任意值,但记录在这个范围内,使用多少分配多少,

varchar类型实际占用空间为字符串的实际长度加1。这样,可有效节约系统空间。varchar是mysql的特有的数据类型。

    char类型的长度是固定的,在创建表时就指定了,其长度可以是0-255之间的任意值。虽然char占用的空间比较大,但它的处理速度快。

添加数据 -- INSERT

  • 方式1VALUES的方式添加
一条一条的添加数据

# ① 没有指明添加的字段
#正确的
INSERT INTO emp1
VALUES (1,'Tom','2000-12-21',3400); #注意:一定要按照声明的字段的先后顺序添加
#错误的
INSERT INTO emp1
VALUES (2,3400,'2000-12-21','Jerry');

# ② 指明要添加的字段 (推荐)
INSERT INTO emp1(id,hire_date,salary,`name`)
VALUES(2,'1999-09-09',4000,'Jerry');
# 说明:没有进行赋值的hire_date 的值为 null
INSERT INTO emp1(id,salary,`name`)
VALUES(3,4500,'shk');

# ③ 同时插入多条记录 (推荐)
INSERT INTO emp1(id,NAME,salary)
VALUES
(4,'Jim',5000),
(5,'张俊杰',5500);
  • 方式2:将查询结果插入到表中
INSERT 语句中加入子查询。
不必书写 VALUES 子句。
子查询中的值列表应与 INSERT 子句中的列名对应
将查询结果插入到表中
SELECT * FROM emp1;

INSERT INTO emp1(id,NAME,salary,hire_date)
#查询语句
SELECT employee_id,last_name,salary,hire_date  # 查询的字段一定要与添加到的表的字段一一对应
FROM employees
WHERE department_id IN (70,60);

DESC emp1;
DESC employees;

修改数据 -- UPDATE

更新数据 (或修改数据)
# UPDATE .... SET .... WHERE ...
# 可以实现批量修改数据的。

UPDATE emp1
SET hire_date = CURDATE()
WHERE id = 5;      #约束,否则会全部删除

SELECT * FROM emp1;

#同时修改一条数据的多个字段
UPDATE emp1
SET hire_date = CURDATE(),salary = 6000
WHERE id = 4;

#题目:将表中姓名中包含字符a的提薪20%
UPDATE emp1
SET salary = salary * 1.2
WHERE NAME LIKE '%a%';

删除数据

删除数据 DELETE FROM .... WHERE....

DELETE FROM emp1
WHERE id = 1;

#在删除数据时,也有可能因为约束的影响,导致删除失败
DELETE FROM departments
WHERE department_id = 50;

#小结:DML操作默认情况下,执行完以后都会自动提交数据。
# 如果希望执行完以后不自动提交数据,则需要使用 SET autocommit = FALSE.

#在修改、删除数据时,也有可能因为约束的影响,导致失败

MySQL8新特性:计算列 -- VIRTUAL

计算列是由某一列的值是通过别的列计算得来的。

MySQL8的新特性:计算列
USE atguigudb;

CREATE TABLE test1(
a INT,
b INT,
c INT GENERATED ALWAYS AS (a + b) VIRTUAL  #字段c即为计算列
);

INSERT INTO test1(a,b)
VALUES(10,20);

SELECT * FROM test1;

UPDATE test1
SET a = 100;

数据类型精讲 

常见的数据类型:

 常见数据类型的属性:

整数类型

 UNSIGNED -- 表示无符号  ZEROFILL-- 0填充

CREATE TABLE test_int2(
f1 INT,
f2 INT(5),
f3 INT(5) ZEROFILL  #自动会添加UNSIGNED
#① 显示宽度为5。当insert的值不足5位时,
#使用0填充。 ②当使用ZEROFILL时,自动会添加UNSIGNED
)
ZEROFILL   必须和UNSIGNED ZEROFILL一起使用才有意义
  • 适用场景
TINYINT :一般用于枚举数据,比如系统设定取值范围很小且固定的场景。
SMALLINT :可以用于较小范围的统计数据,比如统计工厂的固定资产库存数量等。
MEDIUMINT :用于较大整数的计算,比如车站每日的客流量等。
INT INTEGER :取值范围足够大,一般情况下不用考虑超限问题,用得最多。比如商品编号。
BIGINT :只有当你处理特别巨大的整数时才会用到。比如双十一的交易量、大型门户网站点击量、证券公司衍生产品持仓等。

选择类型要考虑 存储空间 可靠性 的平衡问题,系统故障产生的成本远远超过增加几个字段存储空间所产生的成本 

浮点类型

FLOAT 表示单精度浮点数;
DOUBLE 表示双精度浮点数;

 问题为什么浮点数类型的无符号数取值范围,只相当于有符号数取值范围的一半,也就是只相当于有符号数取值范围大于等于零的部分呢?

MySQL 存储浮点数的格式为: 符号 (S) 尾数 (M) 阶码 (E) 。因此,无论有没有符号, MySQL 的浮点数都会存储表示符号的部分。因此, 所谓的无符号数取值范围,其实就是有符号数取值范围大于等于零的部分。

 数据精度说明

MySQL 允许使用 非标准语法 (其他数据库未必支持,因此如果涉及到数据迁移,则最好不要这么
用): FLOAT(M,D) DOUBLE(M,D) 。这里, M 称为 精度 D 称为 标度 (M,D) M= 整数位 + 小数位,D= 小数位。    D<=M<=255 0<=D<=30
例如,定义为 FLOAT(5,2) 的一个列可以显示为 -999.99-999.99 。如果超过这个范围会报错。
FLOAT DOUBLE 类型在不指定 (M,D) 时,默认会按照实际的精度(由实际的硬件和操作系统决定)来显示。
#3.浮点类型
CREATE TABLE test_double1(
f1 FLOAT,
f2 FLOAT(5,2),
f3 DOUBLE,
f4 DOUBLE(5,2)
);

INSERT INTO test_double1(f3,f4)
VALUES(123.45,123.456); #存在四舍五入 小数只允许2位数,f4=123.46

#Out of range value for column 'f4' at row 1
INSERT INTO test_double1(f3,f4)
VALUES(123.45,1234.456);

#Out of range value for column 'f4' at row 1
INSERT INTO test_double1(f3,f4)
VALUES(123.45,999.995);

MySQL 8.0.17 开始, FLOAT(M,D) DOUBLE(M,D) 用法在官方文档中已经明确不推荐使用 ,将来可能被移除。另外,关于浮点型FLOAT DOUBLE UNSIGNED 也不推荐使用了,将来也可能被移除。
精度误差说明
MySQL 4 个字节存储 FLOAT 类型数据,用 8 个字节来存储 DOUBLE 类型数据。无论哪个,都是采用二进制的方式来进行存储的。比如 9.625 ,用二进制来表达,就是 1001.101 ,或者表达成 1.001101×2^3 。如果尾数不是 0 5 (比如 9.624),你就无法用一个二进制数来精确表达。进而,就只好在取值允许的范围内进行四舍五入。 因为浮点数是不准确的,所以我们要避免使用 “=” 来判断两个数是否相等。 DECIMAL -定点数类型。

定点数类型 DECIMAL (使用较多)

MySQL中的定点数类型只有 DECIMAL 一种类型。

DECIMAL(M,D) 的最大取值范围与 DOUBLE 类型一样 ,但是有效的数据范围是由 M D 决定的。
DECIMAL 的存储空间并不是固定的,由精度值 M 决定,总共占用的 存储空间为M+2个字节 。也就是说,在一些对精度要求不高的场景下,比起占用同样字节长度的定点数,浮点数表达的数值范围可以更大一些。
定点数在 MySQL 内部是以 字符串 的形式进行存储,这就决定了它一定是精准的。
DECIMAL 类型不指定精度和标度时,其默认为 DECIMAL(10,0) 。当数据的精度超出了定点数类型的精度范围时,则MySQL 同样会进行四舍五入处理
浮点数 vs 定点数
浮点数相对于定点数的优点是在长度一定的情况下,浮点类型取值范围大,但是不精准,适用
于需要取值范围大,又可以容忍微小误差的科学计算场景(比如计算化学、分子建模、流体动
力学等)
定点数类型取值范围相对小,但是精准,没有误差,适合于对精度要求极高的场景 (比如涉
及金额计算的场景)
“由于 DECIMAL 数据类型的精准性,在我们的项目中,除了极少数(比如商品编号)用到整数类型
外,其他的数值都用的是 DECIMAL,原因就是这个项目所处的零售行业,要求精准,一分钱也不能
差。 ” ——来自某项目经理
  • 位类型:BIT(了解)

 二进制:BIN(f1),   十进制:HEX(f1), 十进制的方式显示数据: f1 + 0

时间日期类型

YEAR 类型通常用来表示年
DATE 类型通常用来表示年、月、日
TIME 类型通常用来表示时、分、秒
DATETIME 类型通常用来表示年、月、日、时、分、秒
TIMESTAMP 类型通常用来表示带时区的年、月、日、时、分、秒

YEAR类型

  • 在MySQL中,YEAR有以下几种存储格式:

    • 以4位字符串或数字格式表示YEAR类型,其格式为YYYY,最小值为1901,最大值为2155。

    • 以2位字符串格式表示YEAR类型,最小值为00,最大值为99。

      • 当取值为01到69时,表示2001到2069;

      • 当取值为70到99时,表示1970到1999;

      • 当取值整数的0或00添加的话,那么是0000年;

      • 当取值是日期/字符串的'0'添加的话,是2000年。

MySQL5.5.27 开始, 2 位格式的 YEAR 已经不推荐使用 YEAR 默认格式就是 “YYYY” ,没必要写成 YEAR(4)。

DATE类型、TIME类型

DATE 类型表示日期,没有时间部分,格式为 YYYY - MM - DD 或者 YYYYMMDD 格式(不推荐)
使用 CURRENT_DATE() 或者 NOW() 函数,会插入当前系统的日期。
CREATE TABLE test_date1(
f1 DATE
);

DESC test_date1;
#添加指定的年月日
INSERT INTO test_date1
VALUES ('2020-10-01'), ('20201001'),(20201001);

#添加当前的年月日
INSERT INTO test_date1
VALUES (CURDATE()),(CURRENT_DATE()),(NOW());
  • TIME类型
可以使用带有冒号的字符串,比如' D HH:MM:SS' ' HH:MM:SS ' ' HH:MM ' ' D HH:MM ' ' D HH ' ' SS ' 格式,都能被正确地插入TIME 类型的字段中。其中 D 表示天,其最小值为 0 ,最大值为 34 。如果使用带有 D 格式的字符串 插入TIME 类型的字段时, D 会被转化为小时,计算格式为 D*24+HH 。当使用带有冒号并且不带 D 的字符串表示时间时,表示当天的时间,比如12:10 表示 12:10:00 ,而不是 00:12:10
使用 CURRENT_TIME() 或者 NOW() ,会插入当前系统的时间。
CREATE TABLE test_time1(
f1 TIME
);

DESC test_time1;

INSERT INTO test_time1
VALUES('2 12:30:29'), ('12:35:29'), ('12:40'), ('2 12:40'),('1 05'), ('45');
        #60:30:29       12:35:29     12:40:00   60:40:00   29:00:00   00:00:45
INSERT INTO test_time1
VALUES (NOW()), (CURRENT_TIME()),(CURTIME());

DATETIME类型(使用较多)

DATETIME 类型在所有的日期时间类型中占用的存储空间最大,总共需要 8 个字节的存储空间。在格式上为DATE 类型和 TIME 类型的组合,可以表示为 YYYY - MM - DD HH:MM:SS
YYYY - MM - DD HH:MM:SS 格式的字符串插入 DATETIME 类型的字段时,最小值为1000-01-01 00:00:00 ,最大值为 9999-12-03 23:59:59
使用函数 CURRENT_TIMESTAMP() NOW() ,可以向 DATETIME 类型的字段插入系统的当前日期和时间。
CREATE TABLE test_datetime1(
dt DATETIME
);

INSERT INTO test_datetime1
VALUES ('2021-01-01 06:50:30'), ('20210101065030');#会自动转换为前面的格式

INSERT INTO test_datetime1
VALUES (CURRENT_TIMESTAMP()), (NOW()),(SYSDATE());

TIMESTAMP类型

TIMESTAMP 类型也可以表示日期时间,其显示格式与 DATETIME 类型相同,都是 YYYY - MM - DD
HH:MM:SS ,需要 4 个字节的存储空间。
但是 TIMESTAMP 存储的时间范围比 DATETIME 要小很多,只能存储 “1970-01-01 00:00:01 UTC”“2038-01-19 03:14:07 UTC” 之间的时间。其中, UTC 表示世界统一时间,也叫 作世界标准时间。
CREATE TABLE test_timestamp1(
ts TIMESTAMP
);

INSERT INTO test_timestamp1
VALUES ('1999-01-01 03:04:50'), ('19990101030405');

INSERT INTO test_timestamp1
VALUES (CURRENT_TIMESTAMP()), (NOW());

#Incorrect datetime value  超出时间范围
INSERT INTO test_timestamp1
VALUES ('2038-01-20 03:14:07');
存储数据的时候需要 对当前时间所在的时区进行转换(存储毫秒数) ,查询数据的时候再将时间转换回当前的时区。因此,使用TIMESTAMP存储的同一个时间值,在不同的时区查询时会显示不同的时间。
#修改当前的时区
SET time_zone = '+9:00';

SELECT * FROM temp_time;
TIMESTAMP 和 DATETIME的区别:
  • TIMESTAMP存储空间比较小,表示的日期时间范围也比较小

  • 底层存储方式不同,TIMESTAMP底层存储的是毫秒值,距离1970-1-1 0:0:0 0毫秒的毫秒值。

  • 两个日期比较大小或日期计算时,TIMESTAMP更方便、更快

  • TIMESTAMP和时区有关。TIMESTAMP会根据用户的时区不同,显示不同的结果。而DATETIME则只能反映出插入时当地的时区,其他时区的人查看数据必然会有误差的。

总结

用得最多的日期时间类型,就是 DATETIME 如果日期时间信息分散在 好几个字段,很不容易记,而且查询的时候, SQL 语句也会更加复杂。
此外,一般存注册时间、商品发布时间等,不建议使用 DATETIME 存储,而是使用 时间戳 ,因为
DATETIME 虽然直观,但不便于计算。
mysql> SELECT UNIX_TIMESTAMP();

文本字符串类型

MySQL中,文本字符串总体上分为 CHAR VARCHAR TINYTEXT TEXT MEDIUMTEXT LONGTEXT ENUM SET 等类型。

CHARVARCHAR类型(重点)

CHAR类型:

CHAR(M) 类型一般需要预先定义字符串长度。如果不指定(M),则表示长度默认是1个字符,一旦创建长度不可变。创建就会占用内存,可能存在内存空间的浪费。MySQL检索CHAR类型的数据时,CHAR类型的字段会去除尾部的空格。

CREATE TABLE test_char1(
c1 CHAR,
c2 CHAR(5)
);

INSERT INTO test_char1(c1)
VALUES('a');

#Data too long for column 'c1' at row 1
INSERT INTO test_char1(c1)
VALUES('ab');


INSERT INTO test_char1(c2)
VALUES('尚硅谷教育');

#Data too long for column 'c2' at row 1
INSERT INTO test_char1(c2)
VALUES('尚硅谷IT教育');

VARCHAR类型:

Variable Char 可变化字符

VARCHAR(M) 定义时, 必须指定 长度 M ,否则报错。
MySQL4.0 版本以下, varchar(20) :指的是 20 字节,如果存放 UTF8 汉字时,只能存 6 个(每个汉字 3 字节) ;MySQL5.0 版本以上,varchar(20):指的是20字符
#Column length too big for column 'name' (max = 21845); use BLOB or TEXT instead
CREATE TABLE test_varchar2(
NAME VARCHAR(65535)
);

CREATE TABLE test_varchar3(
NAME VARCHAR(5)
);

INSERT INTO test_varchar3
VALUES('尚硅谷'),('尚硅谷教育');

#Data too long for column 'NAME' at row 1
INSERT INTO test_varchar3
VALUES('尚硅谷IT教育');

哪些情况使用 CHAR VARCHAR 更好?

存储短的、长度固定的用CHAR
InnoDB 存储引擎,建议使用 VARCHAR 类型。因为对于 InnoDB 数据表,内部的行存储格式并没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),而且 主要影响性能的因素 是数据行使用的存储总量 ,由于 char 平均占用的空间多于 varchar 所以除了简短并且固定长度的,其他考虑varchar。 这样节省空间,对磁盘 I/O 和数据存储总量比较好。

TEXT类型

当文本量较大时,我们可以考虑使用TEXT类型 。

CREATE TABLE test_text(
tx TEXT
);

INSERT INTO test_text
VALUES('atguigu   ');

SELECT CHAR_LENGTH(tx)
FROM test_text; #10 不会去除空格
textblob类型的数据删除后容易导致“空洞 ,使得文件碎片比较多,所以频繁使用的表不建议包含 TEXT 类型字段,建议单独分出去,单独用一个表。

ENUM类型、SET类型

  • 枚举 (ENUM)

设置字段值时, ENUM类型只允许从成员中选取单个值,不能一次选取多个值。 其所需要的存储空间由定义ENUM类型时指定的成员个数决定。
 
ENUM类型

CREATE TABLE test_enum(
season ENUM('春','夏','秋','冬','unknow')
);

INSERT INTO test_enum
VALUES('春'),('秋');

SELECT * FROM test_enum;

#Data truncated for column 'season' at row 1
INSERT INTO test_enum
VALUES('春,秋');
#Data truncated for column 'season' at row 1
INSERT INTO test_enum
VALUES('人');

INSERT INTO test_enum
VALUES('unknow');

#忽略大小写的
INSERT INTO test_enum
VALUES('UNKNOW');

#可以使用索引进行枚举元素的调用 
INSERT INTO test_enum
VALUES(1),('3');  #春|秋

# 没有限制非空的情况下,可以添加null值
INSERT INTO test_enum
VALUES (NULL);
  • SET 集合类型

设置字段值时,可以取取值范围内的 0 个或多个值。 SET 类型在选取成员时,可以一次 选择多个成员,这一点与 ENUM 类型不同
SET类型
CREATE TABLE test_set(
s SET ('A', 'B', 'C')
);

INSERT INTO test_set (s) VALUES ('A'), ('A,B');

#插入重复的SET类型成员时,MySQL会自动删除重复的成员
INSERT INTO test_set (s) VALUES ('A,B,C,A');    #A|B|C

#向SET类型的字段插入SET成员中不存在的值时,MySQL会抛出错误。
#Data truncated for column 's' at row 1
INSERT INTO test_set (s) VALUES ('A,B,C,D');

ENUM SET联合使用

CREATE TABLE temp_mul(
gender ENUM('男','女'),
hobby SET('吃饭','睡觉','打豆豆','写代码')
);

INSERT INTO temp_mul
VALUES('男','睡觉,打豆豆');

二进制字符串类型(了解)

MySQL 中的二进制字符串类型主要存储一些二进制数据,比如可以存储图片、音频和视频等二进制数据。

BINARYVARBINARY类型(使用较少)

BINARY (M)为固定长度的二进制字符串,如果未指定(M),表示只能存储 1个字节

VARBINARY (M)为可变长度的二进制字符串,VARBINARY类型 必须指定(M) ,否则报错。

test_binary1;

INSERT INTO test_binary1(f1,f2)
VALUES('a','abc');

SELECT * FROM test_binary1;

#Data too long for column 'f1' at row 1
INSERT INTO test_binary1(f1)
VALUES('ab');

BLOB类型

MySQL中的BLOB类型包括TINYBLOBBLOBMEDIUMBLOBLONGBLOB 4种类型,它们可容纳值的最大长度不同。可以存储一个二进制的大对象,比如 图片 音频 视频 等。

 BLOB是一个 二进制大对象 ,可以容纳可变数量的数据。 在实际工作中,往往不会在MySQL数据库中使用BLOB类型存储大对象数据,通常会将图片、音频和视频文件存储到 服务器的磁盘上 ,并将图片、音频和视频的访问路径存储到MySQL中。

在使用 text blob 字段类型时要注意以下几点,以便更好的发挥数据库的性能。
BLOB TEXT 值也会引起自己的一些问题,特别是执行了大量的删除或更新操作的时候。删除这种值会在数据表中留下很大的" 空洞 "。 为了提高性能,建议定期使用 OPTIMIZE TABLE 功能对这类表进行 碎片整理
② 如果需要对大文本字段进行模糊查询, MySQL 提供了 前缀索引 。但是仍然要在不必要的时候避免检索大型的BLOB TEXT 值。例如, SELECT * 查询就不是很好的想法,除非你能够确定作为约束条件的WHERE子句只会找到所需要的数据行。否则,你可能毫无目的地在网络上传输大量的值。
③ 把 BLOB TEXT 分离到单独的表 中。在某些环境中,如果把这些数据列移动到第二张数据表中,可以让你把原数据表中的数据列转换为固定长度的数据行格式,那么它就是有意义的。这会 减少主表中的碎片 ,使你得到固定长度数据行的性能优势。它还使你在主数据表上运行 SELECT * 查询的时候不会通过网络传输大量的BLOB TEXT 值。
Blob类型
CREATE TABLE test_blob1(
id INT,
img MEDIUMBLOB
);

INSERT INTO test_blob1(id)
VALUES (1001);(img 此处用图形化工具添加的)

SELECT *
FROM test_blob1;

JSON 类型

JSON(JavaScript Object Notation)是一种轻量级的 数据交换格式 。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。它易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式。

JSON类型
CREATE TABLE test_json(
js json
);

INSERT INTO test_json (js) 
VALUES ('{"name":"songhk", "age":18, "address":{"province":"beijing", "city":"beijing"}}');

SELECT * FROM test_json;
#键值对方式 key取出?
SELECT js -> '$.name' AS NAME,js -> '$.age' AS age ,js -> '$.address.province' AS province, js -> '$.address.city' AS city
FROM test_json;

教程来源:宋红康 -- 数据类型精讲 MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!_哔哩哔哩_bilibili

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值