【D1n910】(13/42)学习【MySQL数据库】C++语言程序设计 - MySQL数据库的笔记
正常操作,正常分析,大家好,我是D1N910,这是我观看【MySQL数据库】C++语言程序设计 - MySQL数据库从而整理的学习笔记。我会继续努力的。
本篇 D1n910】(13/42)学习【MySQL数据库】C++语言程序设计 - MySQL数据库的笔记
的主要内容是 MySQL数据库 的增删改查!
小知识点,desc 指令可以查看表结构,desc = description
description
n. 描述;说明;形容;描写(文字);类型
举个例子:
学习自

如果你没看过之前的专栏内容,那么强烈建议一定要先看看再继续往下看




Unit 6 DML 操作
DML 数据操纵语言(Data Manipulation Language, DML)
1.插入语句 insert
语法
insert into 表名 [(字段列表)] values (值列表);
其中字段列表带中括号就是可以不填写,默认则匹配全部字段。
一般场景
有自增长字段的场景
这里能够看到class_no不是按顺序的原因是因为我之前用 insert 语句的时候插入失败了几次,但是这也同样会占用自增长的编号的。所以自增长的编号只是唯一的,但不是说一定是连续的。
插入有使用默认值的场景
回顾课程表的字段信息
已添加的教师信息
自增长字段可以直接用null,默认值字段想用默认值得用 default;
如果想要在values中缺省默认值字段,可以在表后括号内指定填写的字段;
⚠️ 错误示例,违反了外键约束:插入了不存在的教师编号 007
⚠️ 错误示例,违反了唯一约束:插入了重复的教师编号 001;
教师编号 teacher_no 是我们之前设置了 unique 的字段.
批量插入多行数据
如果这边报错
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`choose`.`student`, CONSTRAINT `students_class_fk` FOREIGN KEY (`class_no`) REFERENCES `classes` (`class_no`))
这是因为外键限制, classes 表的 class_no 字段和要添加的不符合
修改后就OK了
Insert...select语句
-- 在insert语句中使用select子句可以将源表的查询结果添加到目标表中
语法
如果目标表名和复制的表的字段一样,那么字段列表1就是可选的,用 * 表示全部
示例
* like 在之前学过是用来拷贝表结构而不包含表数据。
这个的作用主要是对原表进行备份
2.update语句 更新SQL数据 更新数据
语法
示例
创建表 score,包含如下字段:
添加测试数据
先创建一个 exam 表来作测试用
更改多个字段
执行结果如下
测试更新语句违反外键约束的场景
这里的原因是子表中已经有引用了 class_no 为 3 的外键了,那么改主表的 class_no 3 为 4就会报错。
1.3.删除语句
回顾原来exam表中的数据
使用 where 进行删除
可以看到 exam_score 小于 45 的 stu_no=5 的数据被删除了。
没有 where 进行删除
统统干掉惹 ψ(`∇´)ψ
进行违反外键约束的删除
可以看到删除失败了,原因是子表还用着 class_no=1 的数据捏 ╮(╯_╰)╭
1.4.truncate语句
truncate
vt.截断;截短,缩短,删节(尤指掐头或去尾)
adj.截短的;被删节的
--来自百度翻译
语法
> truncate table table_name;
功能
截断表,虽然不是增删改,功能上相当于没有where子句的delete
语句示例
>使用truncate语句删除表score中的数据
直接清理掉了 ヾ(・ε・`*)
>使用truncate语句删除表student中的数据
失败了 ヾ(・ε・`*)
> 使用truncate语句阶段数据后会使得自增字段恢复初始值,回忆之前设定的 exam的内容,stu_no是自增字段
Unit 7 基本查询语句
目录
select语句
使用select子句指定字段列表
基本查询语句
使用distinct过滤结果集中重复数据
使用imit限定返回行数
1.select语句
select语句的语法格式如下
select 字段列表 from 数据源
[ where 条件表达式]
[ group by 分组字段[ having 条件表达式]]
[ order by 排序字段 [asc|desc]]
其中
字段列表:指定要检索的字段,* 表示全部字段
数据源:检索的表或视图
where子句:用于指定记录的过滤条件,是结果为真或者假的表达式
group by子句:用于对检索数据进行分组,
Having子句:依附于 group by 的。只有group by语句中才能用。对分组后的数据进行筛选,筛选后选择符合条件的组
order by子句:用于对结果集进行排序 asc/decs 升序/降序
2.使用select子句指定字段列表
字段列表的指定方式
示例
使用表达式
前面的我们都清楚,使用函数的意思就是select 能够让 mysql 执行函数然后返回结果。
其中version、now是mysql 内置的函数
命名别名
很明显,上面直接用函数名或者1+1等作为表头不是很好看,那么可以另起一个名称,函数后接 as+别名,或者直接省略 as 然后加别名即可。
字段或表达式 [as] 别名
select version() as 版本号,now() 服务器时间
order by子句:用于对结果集进行排序 asc/decs 升序/降序
默认是 asc,升序 ascend
如果要降序,必须写 desc,下降
3.基本查询语句
下面可以看出 select 后面跟着的字段内容就是在努力地为输出表格而服务的。
下面再看看函数方面的应用,下面是我们前面定义的 exam 表。
插入一个数据
上面是三列,通过函数能够得到 exam_score、regular_score 得到的一个成绩
同样我们也可以用别名使得得到的表头更好看。
4.使用distinct过滤结果集中重复数据
distinct
adj.不同的;明显的;清晰的;清楚的;明白的;有区别的;不同种类的;确定无疑的;确切的
-- 来自百度翻译
正常查询完整的表时,因为有 primary key 主键对应的列,那么就不会有重复的行,
但是如果只是部分查询表,只是部分列的话,那么极有可能就有重复的行,
可利用distinct过滤结果集中重复数据。只用在select和字段列表之间加 distinct 这∫个单词就行。
示例
单列
多列
其中
tables是系统数据库information_schema中的一张表,用来保存数据库中表和视图的信息。
能够看到 TABLES

这里关注 tables 的三个字段:

查询数据

这里我们的一共有338行数据

可以看出表名基本上不会重复,但是数据库名和类型就重复很多了。如果我们查询时候不包含表名,会发现包含大量的重复数据。
得到的很多行。

使用 distinct 后,就只有五行了。
5.使用imit限定返回行数
limit 不在SQL中要求,但是不同产品都会有这样的需求,所以每个产品使用的方式可能都不同,这个limit只是 MySQL 的用法。这个操作有一个统一的名称叫分页。

语法
其中:
start: 表示从第一行记录开始检索,缺省值为0,表示第一行
length: 表示要检索的行数
示例
列出information_schema.tables表中的前10行记录的table_schema, table_name
列出information_schema.tables表中的第七页(每页10行)。这里为什么第七页是从60行开始?
原因 0行~9行 是第一页,即第一页的第一行是整张表的第0行(下标从0开始)。
第n页的第一行就是 (n-1)*10=60.
那么第七页的第一行就是 (7-1)*10=60.
同样成功。
注意,各人表不同,也许你处输出结果和我不一样,无碍。

未完待续
学习进度(13/42)
恭喜你掌握 SQL 的增删改查!