定制网站MySQL表的高级增删改查

文章目录

一、聚合查询

定制网站聚合查询是针对行与行定制网站之间的计算,定制网站常见的聚合函数有:

函数作用
COUNT(expr)定制网站查询数据的数量
SUM(expr)定制网站查询数据的总和
AVG(expr)定制网站查询数据的平均值
MAX(expr)定制网站查询数据的最大值
MIN(expr)定制网站查询数据的最小值
create table stu(id int primary key,name varchar(50),math int,english int);insert into stu values(001,"张三",80,90),(002,"李四",75,80),(003,"王五",85,90),(004,"小王",90,80),(005,"小孙",null,null);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

count函数:
顾名思义,count定制网站函数就是用来统计我们定制网站表的行数的。

定制网站但注意的是,我们再给count定制网站函数传参数时,定制网站这一列不能有null值。

定制网站我们发现当传入math参数时,因为math定制网站有一行的数据是null,count定制网站函数在统计时,定制网站自动省略这一行。

定制网站当然我们还可以传入全列,count定制网站传入全列时,定制网站只要这一列有不为null定制网站的值就会被统计上,但时间会相对增大,一般建议传入主键或者not null的列。
SUM函数:
用来计算某一列数值的综合,null自动省略。

也可以进行表达式进行聚合计算。

AVG函数:
avg函数对某一列求平均值,我们可以发现计算平均值是,null既不计入分子也不计入分母。

MAX函数:
求某一列的最大值

MIN函数:
求某一列的最小值

二、分组查询

有时候单纯使用聚合查询没啥意思,我们需要先分组在进行聚合计算。

create table stu(id int,name varchar(20),class varchar(20),math int,english int);insert into stu values(001,"张三","计算机1班",80,95),                      (002,"李四","计算机1班",90,76),                      (003,"王五","计算机2班",86,77),                      (004,"小王","计算机2班",92,86),                      (005,"张良","计算机2班",86,96);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6


我们来计算平均数学成绩

这样的平均成绩没啥意思,我们来求一下每个班的数学平均成绩

select class,avg(math) from stu group by class;
  • 1


我们在来求一下,每班的数学最高分。

select name,class,max(math) from stu group by class;
  • 1


分组查询,也可以指定条件
1.分组之前指定条件,先筛选在分组,WHERE
2.分组之后指定条件,先分组在筛选, HAVING
3.分组之前和分组之后都指定条件,WHERE HAVING都使用。

分组之前: 查询每个班的平均数学成绩,但是去掉小王的成绩

select class,avg(math) from stu where name != '小王' group by class;
  • 1


分组之后: 查询每个班级的平均数学成绩,但去除平均成绩为85的班级。

select class,avg(math) from stu group by class having avg(math) != 85;
  • 1


分组之前和分组之后都指定条件: 查询班级的平均成绩,去掉小王的成绩,并且去除计算机1班的平均数学成绩

select class,avg(math) from stu where name != '小王' group by class having class != '计算机1班';
  • 1

三、联合查询

当我们多张表建立联系时,我们就可以进行联合查询,多表查询就是对多张表取。

笛卡尔的结果列数是两张表列数之和,行数是两张表的行数之积.

create table classes (id int primary key auto_increment, name varchar(20), `desc` varchar(100));create table student (id int primary key auto_increment, sn varchar(20),  name varchar(20), qq_mail varchar(20) ,        classes_id int);create table course(id int primary key auto_increment, name varchar(20));create table score(score decimal(3, 1), student_id int, course_id int);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
select * from student,classes
  • 1

大家轻易可以发现,笛卡尔积里的结果很多都是无效的数据,因此我们需要将一部分无意义的数据给去掉。

我们通过这两个变量来建立关系,多表查询时,我们访问表中的变量时用表名点(.)变量表示。

 select * from student,classes where classes.id = student.classes_id;
  • 1



当我们加上条件(这个条件我们成为连接条件)之后,剩下的都是“正确"的数据.
我们也可以指定列查询。

 select student.id,student.name,student.classes_id,classes.name from student,classes where classes.id = student.classes_id;
  • 1

内连接

我们现在构造了四张表出来,student(学生表),classes(班级表),course(课程表),score(分数表).




我们查询一下白素贞的班级:
我们在进行联合查询的时候,不必急于求成,一步一步进行。

-- 1.先计算笛卡尔积select * from student,classes;
  • 1
  • 2

-- 2.引入连接条件select * from student,classes where classes.id = student.classes_id;
  • 1
  • 2

-- 3.引入名字为白素贞的条件select * from student,classes where classes.id = student.classes_id and student.name = '白素贞';
  • 1
  • 2

-- 4.只保留必要的列 select student.name,classes.name from student,classes where classes.id = student.classes_id and student.name = ' 白素贞';
  • 1
  • 2


联合查询也可以用join来完成:

 select student.name,classes.name from student join classes on classes.id = student.classes_id and student.name = '白素贞';
  • 1


内连接还可以使用inner join完成。

 select student.name,classes.name from student inner join classes on classes.id = student.classes_id and student.name = '白素贞';
  • 1


我们还可以进行多张表进行联合查询。

select * from student,score,course where student.id = score.student_id and course.id = score.course_id;
  • 1


我们可以省略部分列,使用别名,join来查询

select student.name as 学生姓名,course.name as 课程名称,score.score as 分数 from student join score on student.id = score.student_id join course on score.course_id = course.id;
  • 1

外连接

内连接和外连接在一些情况下,查询的结果没有差异(当两个表一一对应时),如果没有一一对应那么就有区别了。


我们可以用这两张表,建立一下内外连接看一下效果。

-- 内连接select * from student join score on student.id = score.student_id;
  • 1
  • 2

-- 外连接 select * from student left join score on student.id = score.student_id;
  • 1
  • 2


我们可以发现内外连接查询的结果是一样的。因为我们两个表的内容是一一对应的。

这时我们发现student表id为6的数据在score无对应



这时我们发现,内外查询的结果就有所差异了。
外连接:
当进行外连接时,如果是左连接,会把左表所有的数据查询到总结果中,如果右表没有对应数据,就是用NULL补充(右连接同理)。

自连接

SQL中无法对行和行之间使用条件比较,当我们要进行行行运算时,我们可以使用自连接进行调整。


我们想查询那个同学的java成绩比英文成绩高。

我们可以发现至今将表明写两遍,会报一个表名不唯一的错误。正确的做法是为表名起别名。

这里我们是自己和自己比,所以我们加上student_id相等的条件


然后对score1的科目进行限制为java,score2的科目限制为英文

select * from score as score1,score as score2 where score1.student_id = score2.student_id and score1.course_id = 1 and score2.course_id = 6;
  • 1


我们发现只有两名学生即选择了java,又选择了英文。
我们再加上java比英文高的条件。

select * from score as score1,score as score2 where score1.student_id = score2.student_id and score1.course_id = 1 and score2.course_id = 6 and score1.score > score2.score;
  • 1


我们发现没有java比英文高的数据

所以我们查出来的是空集合。

四、合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用UNION和UNION ALL时,前后查询的结果集中,字段需要一致。

-- union select * from course where id < 4 union select * from course where name != 'java';
  • 1
  • 2

-- union all select * from course where id < 4 union all select * from course where name != 'java';
  • 1
  • 2


这里我们可以发现union可以去掉重复数据,而union all不去重。
大家需要注意or 与 union的区别,or的查询只能针对同一个表,而union可以来自于多张表,只要查询的结果能够对应列即可。

五、

子查询最本质就是套娃,将多个SQL组合起来。
实际开发中,子查询的使用要小心(子查询会构造出来一些非常复杂并且不好理解的SQL,对于代码的可读性,执行效率都有可能造成很大的影响。
查询许仙的同班同学

正常思路,先去查询许仙的班级号,再去按照班级号去查那些同学和他一个班

select classes_id from student where name = '许仙';
  • 1

select name from student where classes_id = 1 and name != '许仙';
  • 1


子查询:

select name from student where classes_id = (select classes_id from student where name = '许仙') and name != '许 仙';
  • 1


子查询返回一条记录,才可以写等号

查询java或者英文课的成绩信息
先查询java或者英文课的课程号,再根据课程号去查询课程分数

 select id from course where name = 'java' or name = '英文';
  • 1

select * from score where course_id = 1 or course_id = 6;
  • 1


子查询:

 select * from score where course_id in (select id from course where name = 'java' or name = '英文');
  • 1



EXISTS关键字: 可读性比较差,效率也大大的比in低,适用于解决特殊情况

还是更推荐大家分步查询。

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发