【MySQL】表的基础增删改查

前面我们已经知道怎么来创建表了,接下来就来对创建的表进行一些基本操作。

这里先将上次创建的表删除掉:

mysql> use test;
Database changedmysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| student        |
+----------------+
1 row in set (0.00 sec)mysql> drop table if exists student;
Query OK, 0 rows affected (0.03 sec)

在test数据库里新建一个student表:

mysql> create table student(->     id int comment '序列号',->     name varchar(20) comment '学生名',->     Chinese decimal(3,1) comment '语文成绩',->     Math decimal(3,1) comment '数学成绩',->     English decimal(3,1) comment '英语成绩'-> );
Query OK, 0 rows affected (0.06 sec)

接下来就针对该表进行增删改查的操作~

目录

♫新增

♪单行数据插入

♪查看默认编码

♪修改配置文件

♪指定列插入

♪多行数据插入

 ♫查询

♪全列查询

♪指定列查询

♪表达式查询

♪表达式查询

♪去重查询

♪排序查询

♪运算符

♪条件查询

♪限制查询

♪分页查询

♫修改

♫删除


♫新增

♪单行数据插入

新增操作是指对表增添数据:

语法:insert into 表名 values(类型1的数据,类型2的数据,类型3的数据...);

mysql> insert into student values(1,'student1',99,94,93);
Query OK, 1 row affected (0.42 sec)

注:

①.into也可以省略不写

②.插入的数据必须和定义表的列数及顺序一致

♪查看默认编码

上面我们就将student1学生的数据插入到student表里了,但如果我们插入的名字是中文名就有可能会报错:

mysql> insert into student values(1,'张三',99,94,93);
ERROR 1366 (HY000): Incorrect string value: '\xD0\xA1\xC3\xF7' for column 'name' at row 1

这是因为我们在创建test数据库的时候没有手动指定字符集,此时字符集就会是配置文件(my.ini)里的字符集,而配置文件的字符集如果没有修改过默认是latin1。

我们可以通过show variables like "%character%";语句来查看当前MySQL的数据库编码:

mysql> show variables like "%character%";
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | gbk                                                     |
| character_set_connection | gbk                                                     |
| character_set_database   | latin1                                                  |
| character_set_filesystem | binary                                                  |
| character_set_results    | gbk                                                     |
| character_set_server     | latin1                                                  |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set, 1 warning (0.00 sec)

其中,character_set_client为客户端编码方式,character_set_connection为建立连接使用的编码,character_set_database数据库的编码,character_set_results结果集的编码,character_set_server数据库服务器的编码。可以看到此时数据库的编码为latin1,所以我们需要在创建数据库时手动指定字符集者通过修改配置文件的字符集来使接下来创建的数据库都支持中文。

♪修改配置文件

手动指定字符集我们都会了,下面就来改一改配置文件里的默认字符集吧~

找到并打开my.ini文件,将里面的default-character-set和character-set-server改为如下:

注:修改配置文件前最好备份一份修改前的,以防改错了能改回之前的。

修改完重启MySQL之后再去查询数据库编码可以发现默认字符集已经改为utf8了:

mysql> show variables like"%character%";
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | utf8                                                    |
| character_set_connection | utf8                                                    |
| character_set_database   | utf8                                                    |
| character_set_filesystem | binary                                                  |
| character_set_results    | utf8                                                    |
| character_set_server     | utf8                                                    |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set, 1 warning (0.02 sec)

这样,之后创建的数据库即使不手动指定字符集也能支持中文了,我们删掉之前的test库,并重新创建一个student表插入中文学生名的数据:

mysql> drop database if exists test;
Query OK, 1 row affected (0.09 sec)mysql> create database if not exists test;
Query OK, 1 row affected (0.00 sec)mysql> use test;
Database changed
mysql> create table student(->     id int comment '序列号',->     name varchar(20) comment '学生名',->     Chinese decimal(3,1) comment '语文成绩',->     Math decimal(3,1) comment '数学成绩',->     English decimal(3,1) comment '英语成绩'-> );
Query OK, 0 rows affected (0.07 sec)mysql> insert into student values(1,"张三",88,93,89);
Query OK, 1 row affected (0.02 sec)

♪指定列插入

插入操作还可以指定列插入:

语法:insert into 表名(列名1,列名2,列名3...) values(列名1的数据,列名2的数据,列名3的数据...);

mysql> insert into student(id,name) values(2,"李四");
Query OK, 1 row affected (0.09 sec)

这样就可以只插入部分数据,其余列则就是默认值。

♪多行数据插入

如果觉得一条一条插入太麻烦,还可以一次插入多条数据:

语法:insert into 表名 values(类型1的数据,类型2的数据,类型3的数据...),(类型1的数据,类型2的数据,类型3的数据...),(类型1的数据,类型2的数据,类型3的数据...)...;

mysql> insert into student values(3,"王五",97,77,82),(4,"赵六",87,67,65),(5,"小七",88,77,82);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

注:MySQL是一个客户端服务器,每次请求和相应都会有时间开销,数据库服务器把数据存储在硬盘上(硬盘的读取和写入速度慢),每进行一次sql都会开启一个事务,故一次插入多条数据往往比多次插入一条数据效率要高。

 ♫查询

♪全列查询

新增数据后,我们就可以通过查询操作查看我们插入的数据了:

语法:select * from 表名;

mysql> select * from student;
+------+--------+---------+------+---------+
| id   | name   | Chinese | Math | English |
+------+--------+---------+------+---------+
|    1 | 张三   |    88.0 | 93.0 |    89.0 |
|    2 | 李四   |    NULL | NULL |    NULL |
|    3 | 王五   |    97.0 | 77.0 |    82.0 |
|    4 | 赵六   |    87.0 | 67.0 |    65.0 |
|    5 | 小七   |    88.0 | 77.0 |    82.0 |
+------+--------+---------+------+---------+
5 rows in set (0.01 sec)

注:当数据量很大时不介意使用全列查询,容易把硬盘IO和网络带宽吃满。

♪指定列查询

相比于全列查询,指定列查询的数据量就要小很多:

语法:select 列名1,列名2,列名3... from 表名;

mysql> select id,name,Chinese from student;
+------+--------+---------+
| id   | name   | Chinese |
+------+--------+---------+
|    1 | 张三   |    88.0 |
|    2 | 李四   |    NULL |
|    3 | 王五   |    97.0 |
|    4 | 赵六   |    87.0 |
|    5 | 小七   |    88.0 |
+------+--------+---------+
5 rows in set (0.00 sec)

♪表达式查询

还可以指定表达式进行查询:

语法:select 表达式1,表达式2,表达式3... from student;

mysql> select id,name,10 from student;
+------+--------+----+
| id   | name   | 10 |
+------+--------+----+
|    1 | 张三   | 10 |
|    2 | 李四   | 10 |
|    3 | 王五   | 10 |
|    4 | 赵六   | 10 |
|    5 | 小七   | 10 |
+------+--------+----+
5 rows in set (0.00 sec)mysql> select id,name,Chinese+10 from student;
+------+--------+------------+
| id   | name   | Chinese+10 |
+------+--------+------------+
|    1 | 张三   |       98.0 |
|    2 | 李四   |       NULL |
|    3 | 王五   |      107.0 |
|    4 | 赵六   |       97.0 |
|    5 | 小七   |       98.0 |
+------+--------+------------+
5 rows in set (0.01 sec)mysql> select id, name,Chinese+Math+English from student;
+------+--------+----------------------+
| id   | name   | Chinese+Math+English |
+------+--------+----------------------+
|    1 | 张三   |                270.0 |
|    2 | 李四   |                 NULL |
|    3 | 王五   |                256.0 |
|    4 | 赵六   |                219.0 |
|    5 | 小七   |                247.0 |
+------+--------+----------------------+
5 rows in set (0.00 sec)

注:根据表达式查询返回的是一个临时表,并不会改变原来表的数据

♪表达式查询

如果觉得表达式太长,还可以为表达式取个别名,这样返回的结果集中就会以该别名作为该列的名称:

语法:select 表达式 as 别名 from student;

mysql> select id,name,Chinese+Math+English as total from student;
+------+--------+-------+
| id   | name   | total |
+------+--------+-------+
|    1 | 张三   | 270.0 |
|    2 | 李四   |  NULL |
|    3 | 王五   | 256.0 |
|    4 | 赵六   | 219.0 |
|    5 | 小七   | 247.0 |
+------+--------+-------+
5 rows in set (0.00 sec)

注:as也可以省略不写

♪去重查询

还可以通过distnct对某一列进行去重操作:

语法:select distance 列名 from 表名;

mysql> select distinct Chinese from student;
+---------+
| Chinese |
+---------+
|    88.0 |
|    NULL |
|    97.0 |
|    87.0 |
+---------+
4 rows in set (0.01 sec)

注:distnct后面如果跟n列,那么只会对n列都重复的进行去重操作。

♪排序查询

也可以通过order by对查询结果进行排序:

语法:select 列名 from 表名 order by 列名 asc/desc;(asc为升序,desc为降序,不写时默认为asc)

mysql> select id,name,Chinese from student order by Chinese asc;
+------+--------+---------+
| id   | name   | Chinese |
+------+--------+---------+
|    2 | 李四   |    NULL |
|    4 | 赵六   |    87.0 |
|    1 | 张三   |    88.0 |
|    5 | 小七   |    88.0 |
|    3 | 王五   |    97.0 |
+------+--------+---------+
5 rows in set (0.40 sec)

注:

①.NULL比任何值都小。

②.没有 order by 子句的查询,返回的顺序是未定义的。

③.也可以使用表达式及别名排序(如:mysql> select name,Chinese+Math+English as total from student order by total;)。

④.还可以对多个字段进行排序,排序优先级随书写顺序(如:mysql> select name from student order by Chinese desc,Math,English;(先根据语文成绩排序,语文成绩相同再根据数学成绩排序,数学成绩相同再根据英语成绩排序))。

MySQL还可以根据指定的条件进行查询,不过条件查询需要用到运算符,这里我们还是先了解下MySQL里的运算符~

♪运算符

♩比较运算符

运算符描述
>,>=,<,<=
大于,大于等于,小于,小于等于
=
等于, NULL 不安全,例如 NULL = NULL 的结果是 NULL
<=>
等于, NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)
!=,<>
不等于
between a1 and a2
范围匹配, [a1, a2] ,如果 a1 <= value <= a2, 返回 TRUE(1)
in (option, ...)
如果是 option 中的任意一个,返回 TRUE(1)
IS NULL
NULL
IS NOT NULL
不是 NULL
like
模糊匹配。 % 表示任意多个(包括 0 个)任意字符; _ 表示任意一个字

注:<=>可以比较两列都为NULL的情况,而IS NULL只能判断一个是否为NULL

♩逻辑运算符

运算符描述
and
多个条件必须都为 TRUE(1) ,结果才是 TRUE(1)
or
任意一个条件为 TRUE(1), 结果为 TRUE(1)
not
条件为 TRUE(1) ,结果为 FALSE(0)

注:and 的优先级高于 or

♪条件查询

对特定条件的数据进行查询也可以降低查询的数据量:

语法:select 列名 from 表名 where 查询条件;

mysql> select id,name,Chinese from student where Chinese<=90;
+------+--------+---------+
| id   | name   | Chinese |
+------+--------+---------+
|    1 | 张三   |    88.0 |
|    4 | 赵六   |    87.0 |
|    5 | 小七   |    88.0 |
+------+--------+---------+
3 rows in set (0.00 sec)mysql> select id,name from student where name like '%五';
+------+--------+
| id   | name   |
+------+--------+
|    3 | 王五   |
+------+--------+
1 row in set (0.02 sec)mysql> select id,name,Chinese from student where Chinese between 88 and 99;
+------+--------+---------+
| id   | name   | Chinese |
+------+--------+---------+
|    1 | 张三   |    88.0 |
|    3 | 王五   |    97.0 |
|    5 | 小七   |    88.0 |
+------+--------+---------+
3 rows in set (0.00 sec)mysql> select id,name,Chinese,Math from student where Chinese>85 and Math>85;
+------+--------+---------+------+
| id   | name   | Chinese | Math |
+------+--------+---------+------+
|    1 | 张三   |    88.0 | 93.0 |
+------+--------+---------+------+
1 row in set (0.00 sec)mysql> select id,name,Chinese+Math+English as total from student where Chinese+Math+English is not null;-- where后面不能用别名
+------+--------+-------+
| id   | name   | total |
+------+--------+-------+
|    1 | 张三   | 270.0 |
|    3 | 王五   | 256.0 |
|    4 | 赵六   | 219.0 |
|    5 | 小七   | 247.0 |
+------+--------+-------+
4 rows in set (0.00 sec)

注:条件查询where后面不能用别名

♪限制查询

使用where虽然可以限制查询内容,但仍然不知道查询到的数据量有多少,而limit就可以强制限制查询的行数:

语法:select 列名 from 表名 limit 行数;

mysql> select * from student limit 3;
+------+--------+---------+------+---------+
| id   | name   | Chinese | Math | English |
+------+--------+---------+------+---------+
|    1 | 张三   |    88.0 | 93.0 |    89.0 |
|    2 | 李四   |    NULL | NULL |    NULL |
|    3 | 王五   |    97.0 | 77.0 |    82.0 |
+------+--------+---------+------+---------+
3 rows in set (0.00 sec)

♪分页查询

当查询结果的数量较大时,我们需要将其分页显示,以方便用户查看和管理,MySQL中可以通过limitoffset(limit限制行数,offset设置开始查询的行(0为第一行))来实现分页查询:

语法:select 列名 from 表名 limit 行数 offset 第n行;

mysql> select * from student limit 2 offset 0;
+------+--------+---------+------+---------+
| id   | name   | Chinese | Math | English |
+------+--------+---------+------+---------+
|    1 | 张三   |    88.0 | 93.0 |    89.0 |
|    2 | 李四   |    NULL | NULL |    NULL |
+------+--------+---------+------+---------+
2 rows in set (0.00 sec)mysql> select * from student limit 2 offset 2;
+------+--------+---------+------+---------+
| id   | name   | Chinese | Math | English |
+------+--------+---------+------+---------+
|    3 | 王五   |    97.0 | 77.0 |    82.0 |
|    4 | 赵六   |    87.0 | 67.0 |    65.0 |
+------+--------+---------+------+---------+
2 rows in set (0.00 sec)mysql> select *from student limit 2 offset 4;
+------+--------+---------+------+---------+
| id   | name   | Chinese | Math | English |
+------+--------+---------+------+---------+
|    5 | 小七   |    88.0 | 77.0 |    82.0 |
+------+--------+---------+------+---------+
1 row in set (0.00 sec)

注:分页查询也可以写成select 列名 from 表名 limit 第n行,行数;的形式

了解完这些基础的查询操作后,我们再来看看如何修改已添加的数据。

♫修改

通过update关键字可以对指定条件的列修改指定内容:

语法:update 表名 set 列名 = 值 指定条件;

-- 将张三的语文成绩改为90
mysql> update student set Chinese = 90 where name = "张三";
Query OK, 1 row affected (0.19 sec)
Rows matched: 1  Changed: 1  Warnings: 0-- 将语文成绩倒数的2个学生的语文成绩改为90
mysql> update student set Chinese = 90 order by Chinese limit 2;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

MySQL还支持一次修改多列数据:

语法:update 表名 set 列名1=值1,列名2=值2,列名3=值3.. 指定条件;

-- 将张三的语文成绩,数学成绩,英语成绩都改为90
mysql> update student set Chinese=90,Math=90,English=90 where name="张三";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

注:修改时若不加上指定条件,则会将表里所有行的数据都进行修改

最后来看下删除操作~

♫删除

删除操作是指将表中不需要的数据移除掉:

语法:delete from 表名 指定条件;

-- 删除学生名为张三的数据
mysql> delete from student where name="张三";
Query OK, 1 row affected (0.01 sec)-- 删除语文成绩最后两名的学生数据
mysql> delete from student order by Chinese limit 2;
Query OK, 2 rows affected (0.00 sec)

注:删除操作如果没有添加指定条件同样会把表里所有数据都删了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/153884.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库sql查询成绩第二高

select * from propro; #查询成绩第二高 select max(id) from propro where id <(select max(id) from propro); #查询成绩第二高的第二种方式 select * from (select * from propro order by id desc limit 2) as b order by id asc limit 1;

postgresql中的近一周,近一月,近三月,近一年日期段拆分

统计中经常会遇到,近一周,近一月,近三月,近一年数据统计,下面提供了postgresql拆分日期段的sql -- 近一周,每一天起止时间 select generate_series startDate,generate_series interval 1 day endDate from generate_series( NOW()::date interval -6 day, now()::timest…

【开源电商网站】(2),使用docker-compose和dockerfile进行配置,设置自定义的镜像,安装插件,增加汉化包,支持中文界面汉化。

项目相关代代码地址 相关内容&#xff1a; https://blog.csdn.net/freewebsys/category_12461196.html 原文地址&#xff1a; https://blog.csdn.net/freewebsys/article/details/133666433 包括以下运行的详细代码&#xff1a; https://gitee.com/study-demo-all/oscommerc…

【Python】语言学习

之前总觉得python简单&#xff0c;不当回事&#xff0c;直到自己动手连输出都写不出来。。于是开一篇专门练python的博客。 输出 Python初相识 (educoder.net) 常规输出 print("向上&#xff1a;%.2f,向下&#xff1a;%.2f" %(pow(1.001, 365),pow(0.999, 365))) …

vue2项目中使用element ui组件库的table,制作表格,改表格的背景颜色为透明的

el-table背景颜色变成透明_el-table背景透明_讲礼貌的博客-CSDN博客 之前是白色的&#xff0c;现在变透明了&#xff0c;背景颜色是蓝色

对于无法直接获取URL的数据爬虫

在爬学校安全教育题库的时候发现题库分页实际上执行了一段js代码&#xff0c;如下图所示 点击下一页时是执行了函数doPostBack&#xff0c;查看页面源码如下 点击下一页后这段js提交了一个表单&#xff0c;随后后端返回对应数据&#xff0c;一开始尝试分析获取对应两个参数&a…

VSCode Intellij IDEA CE 数据库连接

VSCode & Intellij IDEA CE 数据库连接 大概记一下现在正在用的几个工具/插件 VSCode VSCode 里面的工具我下载了很多&#xff0c;如果只是链接 MySQL 的话&#xff0c;可能用 Jun Han 这位大佬的 MySQL 就好了&#xff1a; 使用这个插件直接打开 .sql 文件单击运行就能…

基于SpringBoot的足球联赛管理系统

基于SpringBoot的足球联赛管理系统 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 首页 详情 管理员界面 摘要 基于Spring Boot的足球联赛管理系统代表了一种现代体育赛事管…

林沛满-TCP 是如何避免被发送方分片的?

TCP 可以避免被发送方分片&#xff0c;是因为它主动把数据分成小段再交给网络层。最大的分段大小称为 MSS&#xff08;Maximum Segment Size&#xff09;&#xff0c;它相当于把 MTU 刨去 IP头和 TCP 头之后的大小&#xff0c;所以一个 MSS 恰好能装进一个 MTU 中。 图4 图 4 …

大语言模型学到什么

背景&#xff1a; 这篇文章是对《LANGUAGE MODELS REPRESENT SPACE AND TIME》论文的翻译加解读。之所以选这篇文章是因为最近在研究大模型的可解释性&#xff0c;以及基于可解释性对大模型的下游任务适配做训练级别可控性增强研究。其实总结成两句话就是&#xff1a; 1.大模…

配置Hive使用Spark执行引擎

配置Hive使用Spark执行引擎 Hive引擎概述兼容问题安装SparkSpark配置Hive配置HDFS上传Spark的jar包执行测试速度对比 Hive引擎 概述 在Hive中&#xff0c;可以通过配置来指定使用不同的执行引擎。Hive执行引擎包括&#xff1a;默认MR、tez、spark MapReduce引擎&#xff1a; 早…

Docker consul的容器服务更新与发现

目录 一、什么是服务注册与发现 二、什么是consul 三、consul部署 1、建立consul服务器 ​编辑 2、部署registrator服务器 3、consul-template 4、部署consul-template 5、增加/删除一个 nginx 容器节点 添加&#xff1a; 删除&#xff1a; 四、consul 多节点 ​编…

Docker安装——Ubuntu (Jammy 22.04)

一、为什么要用 Ubuntu&#xff1f;(centos和ubuntu有什么区别&#xff09; 使用lsb_release命令&#xff1a;lsb_release -a &#xff0c;即可查看ubantu的版本&#xff0c;但是为什么要使用ubantu 呢&#xff1f; 区别&#xff1a;1、centos基于EHEL开发&#xff0c;而ubunt…

Multi-Grade Deep Learning for Partial Differential Equations

论文阅读&#xff1a;Multi-Grade Deep Learning for Partial Differential Equations with Applications to the Burgers Equation Multi-Grade Deep Learning for Partial Differential Equations with Applications to the Burgers Equation符号定义偏微分方程定义FNN定义PI…

Can 通信-协议

概述 CAN 是 Controller Area Network 的缩写&#xff08;以下称为 CAN&#xff09;&#xff0c;是 ISO国际标准化的串行通信协议。 在当前的汽车产业中&#xff0c;出于对安全性、舒适性、方便性、低公害、低成本的要求&#xff0c;各种各样的电子控制系统 被开发了出来。由于…

iceberg简介004_iceberg和其他数据湖框架的对比---​​数据湖Apache Iceberg工作笔记0004

然后来看一下iceberg和其他数据湖框架的对比这里可以看到hudi支持的多一点对吧,但是 iceberg有自己的优势,并且他们都支持timeline 也就是时间旅行对吧. 然后这个图是显示了,数据湖三剑客的开源时间,以及火热程度,可以对比一下看看.

mistyR官网教程 空转spatial

Modeling spatially resolved omics with mistyR • mistyR (saezlab.github.io) mistyR and data formats • mistyR (saezlab.github.io) Heidelberg University and Heidelberg University Hospital, Heidelberg, Germany Jožef Stefan Institute, Ljubljana, Sloveniajov…

【轻松玩转MacOS】指引篇:这9篇指南助你轻松上手

引言 亲爱的读者&#xff0c;欢迎来到《轻松玩转MacOS》&#xff01;这里是专为MacOS新手打造的使用教学专栏&#xff0c;无论您是从Windows转投Mac的初学者&#xff0c;还是对MacOS操作略知一二但希望更进一步的朋友&#xff0c;都能在这里找到您需要的答案。 正文 1、基本…

leetcode:190. 颠倒二进制位

一、题目&#xff1a; 函数原型&#xff1a; uint32_t reverseBits(uint32_t n) 解释&#xff1a;uint32是无符号int或short的别称&#xff0c;传入的参数是一个32位二进制串&#xff0c;返回值是该32位二进制串逆序后的十进制值 二、思路&#xff1a; 实际上并不需要真的去逆…

SpringBoot项目创建

创建SpringBoot项目&#xff1a; 选择maven项目&#xff0c;选择Java版本 选择springboot版本&#xff08;这里随便选择&#xff0c;后面会进行更改&#xff0c;用不到这么高的版本&#xff09;&#xff0c;选择所需要的对应工具。 然后下一步即可。 配置修改 &#xff0c;结构…