MySQL的增删查改 初阶+进阶

数据库中表的新增 CREATE

创建表的前提条件是要use一个数据库 这样才能创建一个表

创建好一个表之后,就要插入数据

下面 我先创建一个学生表:

上面我们就创建好了一个学生表 我们可以通过desc 来看一下表内部的结构

我们创建好表之后 是不是要插入数据 插入数据 又分为 两种 单行插入 和多行插入

1-1 单行数据 + 全列插入

单行插入就是只插入一组数据 ,其实这里的values可以不用加s 但是我们常用的还是多行插入

1-2 多行数据 + 指定列输入

2.查询(SELECT)

为了针对查询这一操作 我重新创建了一个exam_result表

2-1 全列查询

通过*号可以进行全列查询

2-2 指定列查询

指定列查询 列的顺序 不需要和定义表的列的顺序一样

2-3 查询字段为表达式

第一种表达式不包含字段

第二种 表达式包含一个字段

第三种 表达式包含多个字段

在进行表达式查询的时候 对我们的存入数据是不会有影响的, 我们在客户端看到的所有表都是一个临时表.

2-4 别名 AS

为查询结果中的列指定别名,在返回的结果集中,以别名作为该列的名称 用到关键字AS

其实这里的AS可以省略不写 只不过 不建议省略 还是写上AS比较好!

2-5 去重 DISTINCT

可以使用关键字DISTINCT针对某一列进行去重. 下面我们可以针对某一列对比去重前和去重后
去重前:

去重后:

很明显可以观察到 少了两行数据 因为有三个相同的数据 去重后 自动删掉了两个相同的只保留了一个.

2-6 排序 ORDER BY

在没有 ORDER BY 的字句查询 ,返回的顺序都是未定义 这个顺序不可靠.

NULL这个数据排序 默认比任何值都小,升序排在最上面,降序排在最下面

在ORDER BY 中 ASC为升序 DESC 为降序 默认为升序 要想改为降序 还得在末尾加上DESC.

下面我们使用最简单的排序看看效果

升序:

降序:

当然排序还可以和表达式 和别名一起使用

还有一种排序方法 可以针对多个字段进行排序 ,排序的优先级 根据书写的顺序的改变而改变/

2-7 条件查询 WHERE

条件查询 当然得使用到运算符 运算符分为:比较运算符 和逻辑运算符.

比较运算符:

逻辑运算符:

在使用WHERE的时候需要我们注意2个点:

1 WHERE条件可以使用表达式 ,但是不能使用别名.

2 AND的优先级高于OR ,在同时使用时,需要使用小括号()括起来先执行的部分.

使用WHERE的基本查询 :

1 查询 数学成绩 大于90的同学

查询数学成绩好于英语成绩的同学

查询 总分在240分以上的同学

上面那个图片里面WHERE后面的"chinese+math+english" 是不能使用别名来代替 一定得注意这一点.

AND 和 OR

查询 语文成绩大于80 且数学的成绩大于90的同学
查询语文成绩 > 80 或者 英语成绩大于 80的同学

关于and和or的优先级 就是 不加括号 两个同时执行 肯定先执行and 再执行or

如果想先执行某一部分就加括号.

范围查询

BETWEEN......AND......

查询数学成绩在90到100的同学

IN

查询数学等于98, 85 的同学

模糊查询
LIKE

LIKE分为两种 一种 --% 可以匹配多个字符 包括0个字符 另一种是--_严格匹配一个字符

分页查询 LIMIT

分页查询可以将数据按照每一页多少数据的形式 进行显示 .

上面就是每页三个数据 共两页

修改 UPDATAE

这个就是可以改变表中的数据 可以结合WHERE和ORDER BY 进行修改 .

将孙悟空的数学成绩改成 88

将总成绩前3的同学的英语成绩加上5分

删除 DELETE

在数据库中 删除操作是十分危险的 不管是 删除数据库 还是删除表 都要谨慎考虑好 防止出现失误 严重的话 可能就被辞退了 . 在开发中 我们在进行删除操作的时候还是得叫同事一起帮忙看着 防止出现失误.

删除孙悟空的成绩

增删查改的进阶

数据库的约束

NULL约束

创建表的时候你可以针对某一列指定不能为NULL

这样你插入数据的时候id那一列就不能为空了

UNIQUE

唯一约束 可以针对某一列不能插入重复的值

可以在创建 student表时设定name这一列是唯一的

当创建表的时候用了该约束 如果在该列插入重复的数据 就会报错

唯一和不为空这两个约束 可以结合在一起使用 结合起来 相当于设定该列为主键 下面我们来讲如何给表设置主键

主键约束

一般来说 表都会带有一个主键 而且 一个表 只能有一个主键 不能有多个 ;但是MySQL 可以多个列组成一个主键 组成 联合主键 在MySQL后面我们会学到索引 MySQL一般都会自动给主键添加索引

主键 还可以设置成自增主键 这样 插入数据时可以不用写主键那一列 自增主键 默认从1开始

还有一点 自增主键 是根据最大的值进行累加的


外键约束 foreign key

外键约束是针对 两个表之间产生的约束 ,外键可以用来关联其他表的主键 或者唯一的键

现在创建一个班级表 和学生表 每个学生对应一个班级 班级和学生 存在一对多的关系

在这里需要注意的是 在student表中插入数据的时候 不能插入班级表中id中没有的数据 比如现在创建的班级表中id 只有1 和2 所以针对学生表插入数据时 外键那个id 不能为3 只能是 1 或者2 .

现在class表相当于"父表" ,student相当于子表 表面上 看似只有 父表约束了子表 但实质上子表 也会约束了父表 就类似 删除表 如果你现在想直接删除class这个表 是 不行的 MySQL 会提示你有外键约束 如果想删除的话 只能是先删除student表 再删 class表 相当于 先删子表 再删父表 .

如果想创建外键 那就必须得要求父表 对应的列 有主键约束 或者 有UNIQUE约束 (唯一约束).

实体之间有三个关系 一对一 一对多 多对多

聚合查询

聚合函数都是针对某一列的所有行进行 操作

count (*) 可以求出表中有多少行 这个操作 就是 全部查询一遍 返回结果中的行数 如果表中有一行都为null count( *) 会将null 算进去 如果是count (列名) 该列名为null count 就不会计算进去

sum() 括号里面可以写 列名 ,表达式

计算所有同学 的数学成绩总和

sum 会避免 与 null 进行进行运算 因为 进行sum运算的时候 null和任何数据计算的值都为null

avg() 括号同样可以写列名和表达式

求 所有同学语文的平均值

max() 和 min() 括号同样可以放表达式和 列名

求班里同学数学成绩最高的 和 数学成绩最低 的

GROUP BY 子句

GROUP BY 可以用来 对表的行进行分组

根据岗位 来分组 计算平均的工资

这里分组也有两种情况 一种是先指定条件 再分组 可以用WHERE

统计 每个角色的 平均工资 升序排序 ,但要排除 隔壁老王的工资

第二种是先 进行分组 再 去指定条件筛选 使用having

统计每个角色的平均工资进行降序排序, 但是 得排除 薪资 在1w以上的.

联合查询

也就是 多表查询

多表查询 的过程其实就是对两个表进行笛卡尔积

下面我创建了四个表 分别是:

班级表

学生表
课程表

成绩表

比如 现在要查白素贞的成绩

首先我们知道 成绩在成绩表 白素仙在学生表 所以我们要对这两个表进行笛卡尔积

两个表进行笛卡尔积:

总共有160行数据 但有部分数据是没有用的 所以我们要加入连接条件

加入连接条件之后明显数据变少 看着更直观了 再 加入查询的条件 只需要查询 白素贞同学的成绩

当然 联合查询还可以使用 join on 这种写法

也是一样的效果 的

当然 联合查询也可以搭配聚合函数 和分组函数一起使用

比如查询 所有同学的总成绩 :

外连接

外连接 又分为左外连接 右外连接

左外连接 就是会把左表 的数据尽量列出来 右表中如果没有就补null

右外连接则相反

自连接

自连接 就是 自己和自己连接 但是 要给表起别名 才能自连接 就比如 你要比较自己的语文和数学的成绩就要用到 自连接

SQL 各语句的查询顺序

第一先执行FROM 先确定从哪个表拿数据

第二执行WHERE 筛选出满足条件的行 ,生成一个虚拟表

第三执行GROUP BY 再对虚拟表中进行分组 ,按照指定的列合成一组 再生成虚拟表

第四执行聚合函数 分组后进行对数据的统计

第五执行SELECT 选出要查找的字段 ,生成虚拟表

第六执行 ORDER BY 对虚拟表中的数据进行排序

最后执行 LIMIT 对表中 的数据进行分页处理

好了 关于MySQL的增删改查的内容就到此结束了 谢谢大家的观看和浏览!!!

相关推荐
秀儿y12 分钟前
Redis-十大数据类型
数据库·redis·缓存·oracle
知识的宝藏36 分钟前
Django models中的增删改查与MySQL SQL的对应关系
sql·mysql·django·django models
路在脚下@36 分钟前
MySQL的索引失效的原因有那些
数据库·mysql
虾稿1 小时前
[手机Linux] 七,NextCloud优化设置
linux·运维·服务器
稳重的大王1 小时前
威联通NAS部署openwrt软路由保姆级教程附镜像文件
运维·服务器
新子-存在了1 小时前
linux中 mysql备份
linux·运维·mysql
ZHOUPUYU1 小时前
VMware虚拟机超详细安装Linux教程(最新版)
linux·运维·服务器·windows·微软·centos·虚拟机
成都渲染101云渲染66661 小时前
云渲染,Enscape、D5、Lumion渲染提速教程
运维·服务器·unity·电脑·图形渲染·blender·houdini
初级代码游戏1 小时前
关于linux的ld.so.conf.d
linux·运维·服务器
我叫czc1 小时前
【Python高级353】python实现多线程版本的TCP服务器
服务器·python·tcp/ip