MySQL数据库的增删改查
MySQL数据库的增删改查
- 创建
- 查找
- 单表查找
- 筛选列(字段)
- 子语句
- 条件查询 where子语句
- 限制查询 limit子语句
- 排序子语句 order by 列名
- 函数
- 聚合函数
- 分组函数 group by
- 多表查询
- 一对一的关系
- 一对多的关系
- 连表查询
- 多对多的关系
- 增删改
- 添加
- 删除
- 修改
创建
首先先新建连接
其次创建数据库
其中字符集选择 utf8mb4、排序规则选择 utf8mb4_bin
然后创建 student 表
其中 id 不是空且设为主键自动递增
int 表示整形数据、varchar 表示字符串
数据添加
查找
单表查找
筛选列(字段)
我们在sql中输入:
-- 查找对应字段信息
select name,age from student
-- 查找全部信息
select * from student
结果为:
子语句
条件查询 where子语句
where子语句在查找、修改、删除等均适用
select * from student where sex='男'
算数运算符: >、<、>=、<=、!= 或 <>
逻辑运算符: and并且、or或者、not取非(主要用在 is in)
select * from student where age!=22
select * from student where age >= 22 and age <= 24 and sex="女"
select * from student where age < 22 or age > 24
between … and (相当于是闭区间[ ])
select * from student where age between 22 and 24
in() (相当于是备选池子)
select * from student where id in(2,5,6)
select * from student where age not in(22,25,20)
is (一般与 null 连用)
此时我们在student表中添加一个信息age为空的信息
再在sql中输入:
select * from student where age is null
那么会呈现:
限制查询 limit子语句
第一种写法: limit a,b
其中a表示起始索引值(索引值从0开始)、b表示查询个数
select * from student limit 0,3
即从索引为0(第1个位置)的位置往后查3条
另一种写法: limit b offset a
其中b表示查询个数、a表示起始索引值(索引值从0开始)
分页查询的实现:
例如当我们实现每页显示两条数据,代码可以这样写
--第一页
select * from student limit 0,2
--第二页
select * from student limit 2,2
--第三页
select * from student limit 4,2
--第四页
select * from student limit 6,2
总结规律
:
对于页码 page、一页大小 pageSize
那么我们可以这样操作来实现:
select * from student limit (page-1)*pageSize,pageSize
对于既有where子语句又有limit子语句:
where子语句在前
select * from student where age>=22 limit 0,2
排序子语句 order by 列名
desc降序|asc升序(asc可以省略)
select * from student order by age desc
既有where子语句又有limit子语句还有排序子语句:
where子语句在最前,其次是 order by,最后是 limit 语句
select * from student where age>=22 order by age desc limit 0,2
函数
聚合函数
sum()求和、avg()取平均、max()取最大值、min()取最小值、count()取得的记录数、count()取数量
其中 count(字段名称) count统计某一个字段的情况下不会统计值为null的记录
此时我们修改 student 表格的数据为:
select count(age) from student
结果为7,id为8的数据没有 age 信息所以不统计
select count(*) from student
统计表中记录的数量
分组函数 group by
group by 字段名字,表示要根据哪个字段进行分组
修改表中数据为:
对组内可进行求和求平均等
select sum(age),class from student group by class
筛选的实现:
分组之前加条件用的是where,对分组之后查询出来的结果再筛选用的是having
select sum(age),class from student where sex = "男" group by class
select sum(age),class from student where sex = "男" group by class having class = 1
多表查询
一对一的关系
例如丈夫与妻子的关系
最优解:合成一张表
一对多的关系
例如学生与班级的关系
最优解:在多的一方加外键
此时我们创建一个新表class
当使用 select * from student,class 时,结果是笛卡尔积
正确写法为:
select * from student,class where student.classid = class.id
补充重命名:
字段名或表名 as 后面是新名字 (as可省)
select s1.id,name,sex,age,classname as 班级名称 from student as s1,class as c1 where s1.classid = c1.id
在 student 和 class 表中分别再添加一条信息
此时再输入
select s1.id,name,sex,age,classname as 班级名称 from student as s1,class
as c1 where s1.classid = c1.id
时,发现结果和上面是一样的,没有班级的学生或没有学生的班级都查不出来,即只能查班级与学生的公共部分
连表查询可以解决问题
连表查询
内连接:
inner join … on (其中inner可以省略)on 后面跟的是连接条件(找的是公共部分)
select * from student join class on student.classid = class.id
连表查询连接条件与筛选条件做区分,连接条件写在on里、筛选条件写在where里,而多表查询不做区分,在where中添加 and、or 等条件即可
select * from student join class on student.classid = class.id where sex='女'
外连接:
左外连接:left join…on
多查左表有而公共部分没有的部分
select * from student left join class on student.classid = class.id
右外连接:right join … on
多查右表有而公共部分没有的部分
select * from student right join class on student.classid = class.id
多对多的关系
例如学生与课程的关系
最优解:再创建一张关系表
操作:
此时添加一个表,表名为"学生表"
此时添加一个表,表名为"课程表"
此时添加一个表,表名为"选课表"
select * from 学生表,选课表,课程表 where 学生表.id = 选课表.sid and 选课表.cid = 课程表.id
select * from 学生表 join 选课表 join 课程表 on 学生表.id = 选课表.sid and 选课表.cid = 课程表.id
最终结果上面两个效果相同
此时我们进行如下操作:
select * from 学生表 left join 选课表 on 学生表.id = 选课表.sid join 课程表 on 选课表.cid = 课程表.id
所以可以一路 join 后再 on,也可以 join 一个 on 一个
增删改
添加
insert into student(name,age,sex,classid) values("vivi",25,"男",3)
id一般不添加已经设置为自动递增了
删除
删除整个表
delete from student
删除表的某个信息,需要用到where子语句
delete from student where id = 9
修改
需要用到where子语句
update student set name = "pipi",age = 20 where id = 10