MySQL数据库的学习


SQL:结构化查询语言(Structured Query Language),是对数据库进行操作的一种语言。

通过SQL语句我们可以方便的操作数据库中的数据库、表、数据。

​SQL是数据库管理系统都需要遵循的规范。不同的数据库生产厂商都支持SQL语句,但都有特有内容。

SQL语句分类:

(1)DDL数据定义语言,用来定义数据库对象,如数据库,表,列等。关键字为create,drop,alter等。

(2)DML数据操作语言,用来对数据库中表的数据进行增删改。关键字为insert,delete,update等。

(3)DQL数据查询语言,用来查询数据库中表的记录(数据)。关键字为select,where等。

(4)DCL数据控制语言(了解),用来定义数据库的访问权限和安全级别,及创建用户。关键字为GRANT,REVOKE等。

1 DDL语句

1.1 创建数据库

直接创建数据库:

CREATE DATABASE 数据库名;

判断是否存在并创建数据库:

CREATE DATABASE IF NOT EXISTS 数据库名;

创建数据库并指定字符集(编码表):

CREATE DATABASE 数据库名 CHARACTER SET 字符集;

MySQL8.0默认使用的字符集为utf8mb4(能使用任何类型数据)。

1.2 查看数据库

查看所有的数据库:

SHOW DATABASES;

查看某个已创建数据库的信息:

SHOW CREATE DATABASE 数据库名;

1.3 修改数据库

修改数据库字符集格式:

ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;

1.4 删除数据库

DROP DATABASE 数据库名;

1.5 使用数据库

查看正在使用的数据库:

SELECT DATABASE();

在对表进行操作前需要先使用/切换对应的数据库:

USE 数据库名;

1.6 创建表

前提:先使用某个数据库。

语法:

CREATE TABLE 表名 (
字段名1 字段类型1, 
字段名2 字段类型2
);

示例:创建student表包含id,name,birthday字段

CREATE TABLE student (
  id INT,
  name VARCHAR(20),
  birthday DATE
);

快速创建一个表结构相同的表:

CREATE TABLE 新表名 LIKE 旧表名;

1.7 查看表

查看某个数据库中的所有表:

SHOW TABLES;

查看表结构:

DESC 表名;

查看创建表的SQL语句:

SHOW CREATE TABLE 表名;

1.8 删除表

直接删除表:

DROP TABLE 表名;

判断表是否存在并删除表:

DROP TABLE IF EXISTS 表名;

1.9 修改表结构

前提:在做开发之前库当中的所有表字段已经建立成功了,一般不需要修改只需要插入数据,但是难免因为团队讨论误差忘了加一些字段,这时候就需要这部分对表字段进行修改。

添加表列(表列即为表中的字段):

ALTER TABLE 表名 ADD 列名 类型;

修改列类型:

ALTER TABLE 表名 MODIFY列名 新的类型;

修改列名:

ALTER TABLE 表名 CHANGE 旧列名 新列名 类型;

删除列:

ALTER TABLE 表名 DROP 列名;

修改表名:

RENAME TABLE 表名 TO 新表名;

修改表对应的字符集:

ALTER TABLE 表名 character set 字符集;

2 DML语句

2.1 插入数据的语法

关键字说明:

INSERT INTO 表名         –- 表示往哪张表中添加数据
(字段名1, 字段名2, …)     -- 要给哪些字段设置值
VALUES (值1, 值2, …);    -- 设置具体的值

注意:

  • 值与字段必须对应,个数相同,类型相同;
  • 值的数据大小必须在字段的长度范围内;
  • 除了数值类型外,其它的字段类型的值必须使用引号引起(建议单引号);
  • 如果要插入空值,可以不写字段,或者插入null。

2.2 插入全部数据

所有的字段名都写出来:

INSERT INTO 表名 (字段名1, 字段名2, 字段名3…) VALUES (值1, 值2, 值3);

不写字段名(会按照表已有的字段顺序赋值):

INSERT INTO 表名 VALUES (值1, 值2, 值3…);

2.3 插入部分数据

INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);

没有添加数据的字段会使用NULL。

具体操作示例:

1.创建db2数据库,并使用。

CREATE DATABASE db2;
USE db2;

2.创建完整学生信息表,包括学员的id,姓名,年龄,性别,家庭地址,电话号码,生日,数学成绩,英语成绩。

CREATE TABLE  student(
    id int,
    name varchar(20),
    age int,
    sex char(1),
    address varchar(200),
    phone varchar(20),
    birthday date,
    math double,
    english double
);

3.插入全部数据。

INSERT INTO student VALUES (1,'张三',19,'男','北京市','18888888888','2010-12-12',92.5,32.5);

4.插入部分数据,只往学生表中添加id, name, age, sex, address数据。

INSERT INTO student (id,name,age,sex,address) values (2,'李四',20,'女','北京市');

5.查看表中的数据。

SELECT * FROM student;

2.4 蠕虫复制

在已有的数据基础之上,将原来的数据进行复制,插入到对应的表中。

语法格式:

INSERT INTO 表名1 SELECT * FROM 表名2;

作用:将表名2中的数据复制到表名1中。

具体操作示例:

1.创建student2表,student2结构和student1表结构一样;

CREATE TABLE student2 LIKE student1;

2.将student1表中的数据添加到student2表中;

INSERT INTO student2 SELECT * FROM student1;

3.如果只想复制student1表中name,age字段数据到student2表中使用如下格式。

INSERT INTO student2(name,age) SELECT name,age FROM student1;

2.5 表数据的修改

不带条件修改数据(全部修改):

UPDATE 表名 SET 字段名=值;

带条件修改数据:

UPDATE 表名 SET 字段名=值 WHERE 字段名=值;

关键字说明:

UPDATE: 修改数据
SET: 修改哪些字段
WHERE: 指定条件

具体操作示例:

  • 不带条件修改数据,将所有的性别改成女:

    UPDATE student SET sex='女';

  • 带条件修改数据,将id号为2的学生性别改成男:

    UPDATE student SET sex='男' WHERE id=2;

  • 一次修改多个列,把id为3的学生,年龄改成26岁,address改成北京

    UPDATE student SET age=26,address='北京' WHERE id=3;

2.6 表数据的删除

不带条件删除数据(删除表里面的所有数据):

DELETE FROM 表名;

带条件删除数据:

DELETE FROM 表名 WHERE 字段名=值;

具体操作示例:

  • 带条件删除数据,删除id为3的记录:

    DELETE FROM student WHERE id=3;

  • 不带条件删除数据,删除表中的所有数据:

    DELETE FROM student;

truncate也可以用来删除表记录

TRUNCATE TABLE 表名;

truncatedelete的区别(面试题常问):

  • delete是将表中的数据一条一条删除;
  • truncate是将整个表摧毁,重新创建一个新的表(全空),新的表结构和原来表结构一模一样。

3 DQL语句

3.1 简单查询

3.1.1 查询表所有数据

使用 * 表示所有列:

SELECT * FROM 表名;

写出查询每列的名称(效率较高):

SELECT 字段名1, 字段名2, 字段名3, ... FROM 表名;

具体操作示例:

SELECT id,name,age,sex,address,phone,birthday,math,english FROM student;

3.1.2 查询指定列的数据

多个列之间以逗号分隔:

SELECT 字段名1, 字段名2... FROM 表名;

具体操作示例:查询student表中的name和age列

SELECT name, age FROM student;

3.1.3 别名查询

SELECT 字段名1 AS 别名, 字段名2 AS 别名... FROM 表名;
  • 查询时给列、表指定别名需要使用AS关键字,AS可以省略不写;
  • 使用别名的好处是方便观看和处理查询到的数据。

具体操作示例:查询sudent表中name和age列,name列的别名为”姓名”,age列的别名为”年龄”。

SELECT name AS 姓名, age AS 年龄 FROM student;

3.1.4 清除重复值

查询指定列并且结果不出现重复数据(字段名可以是一列可以是多列):

SELECT DISTINCT 字段名 FROM 表名;

具体操作示例:查询name和age列并且结果不出现name和age都一样的重复数据

SELECT DISTINCT name, age FROM student;

3.1.5 查询结果参与运算

某列数据和固定值运算:

SELECT 列名1 + 固定值 FROM 表名;

某列数据和其他列数据参与运算:

SELECT 列名1 + 列名2 FROM 表名;

注意: 参与运算的必须是数值类型。

具体操作示例:

  • 查询的时候将数学和英语的成绩相加
  • 让学员的年龄增加10岁

实现:

1.查询 math + english 的和

SELECT math + english FROM student;

2.查询 math + english 的和使用别名”总成绩”

SELECT math + english 总成绩 FROM student;

3.查询所有列与 math + english(使用别名”总成绩”)

SELECT *, math + english 总成绩 FROM student;

4.查询姓名、年龄,将每个人的年龄增加10岁(不影响原来表中的数据)

SELECT name, age + 10 FROM student;

3.2 Navicat的使用

Navicat是一套快速、可靠并价格相当便宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设。它的设计符合数据库管理员、开发人员及中小企业的需要。

Navicat是以直觉化的图形用户界面而建的,让你可以以安全并且简单的方式创建、组织、访问并共用信息。

具体示例:使用Navicat完成hero表(游戏中英雄角色表)

1.创建db数据库:右键新建数据库。

2.使用db数据库:双击。

3.创建hero表(在表上右键新建表添加字段和类型),表中包括:id,name,age,sex,attack(攻击力),location(英雄的定位),life(英雄的初始生命),magic(英雄的初始魔法),is_hot(是否是热门英雄),grounding_date(英雄的上架日期),max_score(英雄的最高评分)字段。然后ctrl+s保存并输入表名。

4.双击hero表,添加一条数据,对数据进行增删改操作。

注:还是要编写sql语句来实现功能不能单纯的依靠工具。

5.在数据库下的查询位置右键新建查询,即可输入sql语句,选中语句右键运行选择的即可进行运行操作。

3.3 复杂条件查询

前面的查询是将所有数据都查询出来,但是有时候我们只想获取到满足条件的数据。

语法格式:

SELECT 字段名 FROM 表名 WHERE 条件;

流程:取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回。

3.3.1 比较运算符

>大于

<小于

<=小于等于

>=大于等于

=等于

<>!=不等于

具体操作示例:

  • 查询攻击大于350的英雄

    SELECT * FROM hero where attack>350;

  • 具体操作示例:查询评分小于12的英雄

    SELECT * FROM hero WHERE max_score<12;

  • 查询定位为射手的英雄

    SELECT * FROM hero WHERE location='射手';

  • 查询不是热门的英雄,1表示热门,0表示非热门。

    SELECT * FROM hero WHERE is_hot=0;

    SELECT * FROM hero WHERE is_hot!=1;

    SELECT * FROM hero WHERE is_hot<>1;

3.3.2 逻辑运算符

and 多个条件同时满足

or 多个条件其中一个满足

not 不满足

具体操作示例:

  • 查询age大于35且生命值大于2500的英雄(两个条件同时满足)

    SELECT * FROM hero WHERE age>35 AND life>2500;

  • 查询age大于35或评分小于10的英雄(两个条件其中一个满足)

    SELECT * FROM hero WHERE age>35 OR max_score<10;

  • 查询id是1或3或5的英雄

    SELECT * FROM hero WHERE id=1 OR id=3 OR id=5;

in关键字的语法格式:

SELECT 字段名 FROM 表名 WHERE 字段 in (数据1, 数据2...);

in里面的每个数据都会作为一次条件,只要满足条件的就会显示。

具体操作示例:

  • 查询id是1或3或5的英雄

    SELECT * FROM hero WHERE id in(1,3,5);

  • 查询id不是1或3或5的英雄

    SELECT * FROM hero WHERE id not in(1,3,5);

3.3.3 范围运算符

BETWEEN 值1 AND 值2 

表示从值1到值2范围,包头又包尾。

比如:

age BETWEEN 35 AND 70

相当于:

age>=35 AND age<=70

具体操作示例:查询英雄上架日期大于等于2013-01-01小于等于2017-01-01之间的英雄

SELECT * FROM hero WHERE grounding_date BETWEEN '2013-01-01' AND '2017-01-01';
SELECT * FROM hero WHERE grounding_date >='2013-01-01'  AND grounding_date<='2017-01-01';

3.3.4 模糊查询

LIKE表示模糊查询

SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';

这样,满足通配符字符串规则的数据就会显示出来。

MySQL通配符有两个:

%: 表示0个或多个字符(任意个字符)

_: 表示一个字符

具体操作示例:

  • 查询姓孙的英雄

    SELECT * FROM hero WHERE name LIKE '孙%';

  • 查询姓名中包含’孙’字的英雄(前后都可以匹配任意个字符)

    SELECT * FROM hero WHERE name LIKE '%孙%';

  • 查询姓孙,且姓名有三个字的英雄

    SELECT * FROM hero WHERE name LIKE '孙__';

3.3.5 结果排序

通过ORDER BY子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)。

语法:

SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 [ASC|DESC];

ASC: 升序, 默认是升序

DESC: 降序

1.单列排序:使用一个字段排序

具体操作示例:查询年龄小于等于35岁的英雄,按照年龄升序排列

SELECT * FROM hero WHERE age<=35 ORDER BY age ASC;

2.组合排序:先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推。

SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];

具体操作示例:查询年龄小于等于35岁的英雄,按照年龄升序排列,如果年龄相同按照生命的降序排列

SELECT * FROM hero WHERE age<=35 ORDER BY age ASC,life DESC;

3.3.6 聚合函数

之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。注意,聚合函数会忽略空值NULL。

五个聚合函数:

count: 统计指定列记录数,记录为NULL的不统计

sum: 计算指定列的数值和,如果不是数值类型,那么计算结果为0

max: 计算指定列的最大值

min: 计算指定列的最小值

avg: 计算指定列的平均值,如果不是数值类型,那么计算结果为0

聚合函数的使用:写在SQL语句 SELECT字段名 的地方

SELECT 字段名... FROM 表名;
SELECT COUNT(age) FROM 表名;

具体操作示例:

  • 查询英雄总数

    SELECT COUNT(max_score) FROM hero

    因为对于NULL的记录不会统计,所以使用某一列不够保险。

    即,只要使用全部字段作为衡量标准就不会有遗漏的错误统计出现:

    SELECT COUNT(*) FROM hero

  • 查询年龄大于35的英雄总数

    SELECT COUNT(*) FROM hero WHERE age>35;

  • 查询所用英雄的总评分

    SELECT SUM(max_score) FROM hero

  • 查询英雄评分的平均分

    SELECT AVG(max_score) FROM hero

  • 查询英雄评分的最高分

    SELECT MAX(max_score) FROM hero

  • 查询英雄评分的最低分

    SELECT MIN(max_score) FROM hero

3.3.6 分组查询

分组查询是指使用 GROUP BY 语句对查询信息进行分组,相同数据作为一组:

SELECT 字段1,字段2... FROM 表名 GROUP BY 分组字段 [HAVING 条件];

GROUP BY是通过将分组字段结果中相同内容作为一组来进行分组。

SELECT * FROM hero GROUP BY sex;

上面这句话会将sex相同的数据作为一组,但是只会返回每组的第一条数据,没有任何意义。

分组的目的就是为了统计,一般分组会跟聚合函数一起使用。

分组后聚合函数的作用:不是操作所有数据,而是操作一组数据。例如求男生组生命总和及女生组生命总和的语句如下。

SELECT SUM(life) FROM hero GROUP BY sex

注意事项:当我们使用某个字段分组,在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪组的,正确写法如下。

SELECT SUM(life),sex FROM hero GROUP BY sex

具体操作示例:

  • 查询年龄小于30岁的人,按性别分组,统计每组的人数

    1.先查询年龄大于30岁的人;2.再分组;3.最后统计每组的人数。

    SELECT sex,count(*) FROM hero WHERE age<30 GROUP BY sex;

  • 查询年龄小于30岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据

    其中,并只显示性别人数>2的数据属于分组后的条件,对于分组后的条件需要使用having语句。

    SELECT sex,count(*) FROM hero WHERE age<30 GROUP BY sex HAVING COUNT(*)>2;

    1.先查询年龄大于30岁的人;2.再分组;3.统计每组的人数;4.显示性别人数大于2的数据。

havingwhere的区别(面试题常问):

  • having是在分组后对数据进行过滤
  • where是在分组前对数据进行过滤
  • having后面可以使用聚合函数
  • where后面不可以使用聚合函数

3.3.7 Limit分页

LIMIT的作用是限制查询记录的条数:

SELECT *|字段列表 [as 别名] FROM 表名 [WHERE子句] [GROUP BY子句][HAVING子句][ORDER BY子句][LIMIT子句];

思考:limit子句为什么排在最后?

因为前面所有的限制条件都处理完了,只剩下显示多少条记录的问题了!

LIMIT语法格式:

LIMIT offset,length; 或者 LIMIT length;

offset是指偏移量,可以认为是跳过的记录数量,默认为0;

length是指需要显示的总记录数,即要查几条记录。

具体操作示例:查询hero表中数据,从第三条开始显示,显示6条,我们可以认为跳过前面2条,取6条数据。

SELECT * FROM student LIMIT 2,6;

LIMIT的使用场景分页

比如我们登录京东,淘宝,返回的商品信息可能有几万条,不是一次全部显示出来。是一页显示固定的条数。

假设我们每页显示5条记录的方式来分页,SQL语句如下:

-- 每页显示5条
-- 第一页: LIMIT 0,5;   跳过0条,显示5条
-- 第二页: LIMIT 5,5;   跳过5条,显示5条
-- 第三页: LIMIT 10,5;  跳过10条,显示5条
SELECT * FROM hero LIMIT 0,5;
SELECT * FROM hero LIMIT 5,5;
SELECT * FROM hero LIMIT 10,5;

注意:

1.如果第一个参数是0可以简写:

SELECT * FROM student3 LIMIT 0,5;
SELECT * FROM student3 LIMIT 5;

2.LIMIT 10,5; 不够5条,即最后一页有多少显示多少。

4 数据库约束

对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性。

约束种类:

PRIMARY KEY: 主键

UNIQUE: 唯一

NOT NULL: 非空

DEFAULT: 默认

FOREIGN KEY: 外键

4.1 主键约束

4.1.1 主键的作用

用来唯一标识一条记录,每个表都应该有一个主键,并且每个表只能有一个主键。

有些记录的 name,age,sex 字段的值都一样时,那么就没法区分这些数据,造成数据库的记录不唯一,这样就不方便管理数据。

哪个字段应该作为表的主键?

​通常不用业务字段作为主键,单独给每张表设计一个 id 的字段,把 id 作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。

4.1.2 创建主键

主键:PRIMARY KEY

主键的特点:

  • 主键必须包含唯一的值
  • 主键列不能包含NULL值

创建主键方式:在创建表的时候给字段添加主键,或者直接在Navicat表的设计中点击钥匙。

字段名 字段类型 PRIMARY KEY

具体操作示例:

1.创建英雄表hero1, 包含字段(id, name, age)将 id 做为主键(主键在Navicat中会显示一个小钥匙)

CREATE TABLE hero1(
    id int PRIMARY Key,
    name varchar(20),
    age int
);

2.添加数据

INSERT INTO hero1 (id, NAME) VALUES (1, '盾山');
INSERT INTO hero1 (id, NAME) VALUES (2, '梦琪');
INSERT INTO hero1 (id, NAME) VALUES (3, '鲁班');
INSERT INTO hero1 (id, NAME) VALUES (4, '白起');

3.再插入一个id为1的英雄,即插入重复的主键值

INSERT INTO hero1 (id, NAME) VALUES (1, '盾山');
-- 主键是唯一的不能重复,报错Duplicate entry '1' for key 'PRIMARY'

4.试着插入一个id为NULL的英雄,即插入NULL的主键值

INSERT INTO hero1 (id, NAME) VALUES (NULL, '蔡文姬');
-- 主键是不能为空的,报错Column 'id' cannot be null

4.1.3 删除主键

ALTER TABLE 表名 DROP PRIMARY KEY;

具体操作示例:删除hero1表的主键

ALTER TABLE hero1 DROP PRIMARY KEY;

4.1.4 主键自增

​主键如果让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成主键字段的值。

AUTO_INCREMENT
-- 表示自动增长(字段类型必须是整数类型)

具体操作示例:

1.创建英雄表hero2, 包含字段(id, name, age)将 id 做为主键并自动增长

CREATE TABLE hero2(
    id int PRIMARY Key AUTO_INCREMENT,
    name varchar(20),
    age int
);

2.插入数据

INSERT INTO hero2 (NAME, age) VALUES ('猪八戒', 22);
INSERT INTO hero2 (NAME, age) VALUES ('关羽', 26);
INSERT INTO hero2 (NAME, age) VALUES ('诸葛亮', 25);
INSERT INTO hero2 (NAME, age) VALUES ('孙膑', 20);
-- 不维护id字段,主键默认从1开始自动增长

扩展

默认地 AUTO_INCREMENT 的开始值是1,如果希望修改起始值,请使用下列SQL语法。

ALTER TABLE 表名 AUTO_INCREMENT=起始值;

DELETETRUNCATE的区别(面试常问):

  • DELETE 删除表中的数据,不会摧毁表,不重置AUTO_INCREMENT的值,接着之前的自增
  • TRUNCATE 摧毁表,重建表,AUTO_INCREMENT重置为1开始自增

4.2 唯一约束

在这张表中这个字段的值不能重复,比如身份证号手机号等信息。

唯一约束的基本语法格式:

字段名 字段类型 UNIQUE

具体实现步骤:

1.创建英雄表hero3, 包含字段(id, name), name 这一列设置唯一约束,不能出现同名的英雄。

CREATE TABLE hero3 (
    id INT,
    NAME VARCHAR(20) UNIQUE
);

2.添加英雄

INSERT INTO hero3 VALUES (1, '貂蝉');
INSERT INTO hero3 VALUES (2, '西施');
INSERT INTO hero3 VALUES (3, '王昭君');
INSERT INTO hero3 VALUES (4, '杨玉环');

INSERT INTO hero3 VALUES (5, '貂蝉');
-- 插入相同的名字出现name重复,报错Duplicate entry '貂蝉' for key 'name'

INSERT INTO hero3 VALUES (5, NULL);
INSERT INTO hero3 VALUES (6, NULL);
-- 因为null是没有值,所以不存在重复的问题,可以插入多个NULL

4.3 非空约束

表示这个字段必须设置值,不能是NULL。

非空约束的基本语法格式:

字段名 字段类型 NOT NULL

具体操作步骤:

1.创建表英雄表hero4, 包含字段(id,name,gender)其中 name 不能为NULL

CREATE TABLE hero4 (
    id INT,
    NAME VARCHAR(20) UNIQUE NOT NULL,
    gender CHAR(2)
);

2.添加一条完整的记录

INSERT INTO hero4 VALUES (1, '扁鹊', '男');
INSERT INTO hero4 VALUES (2, '镜', '男');
INSERT INTO hero4 VALUES (3, '恺', '男');
INSERT INTO hero4 VALUES (4, '貂蝉', '男');

INSERT INTO hero4 VALUES (5, NULL, '男');
-- 姓名不赋值报错: Column 'name' cannot be null

4.4 默认值约束

往表中添加数据时,如果不指定这个字段的数据,就使用默认值。

默认值格式:

字段名 字段类型 DEFAULT 默认值

具体操作示例:

1.创建一个英雄表 hero5,包含字段(id,name,location),默认的定位是射手

CREATE TABLE hero5 (
    id INT,
    NAME VARCHAR(20),
    location VARCHAR(50) DEFAULT '射手'
);

2.添加一条记录,使用默认地址

INSERT INTO hero5 (id, NAME) VALUES (1, '后羿');

3.添加一条记录,不使用默认地址

INSERT INTO hero5 VALUES (2, '兰陵王', '刺客');

文章作者: BoBoRing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 BoBoRing !
评论
  目录