数据库
首页 > 数据库> > MySQL-数据的增删改查(模糊查询,聚集函数,分组,多表查询)

MySQL-数据的增删改查(模糊查询,聚集函数,分组,多表查询)

作者:互联网

添加数据

insert into tableName(field1,field2...) values(value1,value2...);

删除数据

delete from tableName [where]; 

truncate tableName;

delete 和 truncate的区别:

区别deletetruncate
效率delete 是一条一条的删除,效率低truncate 先删除整个表,再创建一个新的空的表,效率高
是否影响自增不会影响自增自增会归零

更新数据

update tableName set field1 = value1,field2 = value2...[where]

如果没有where条件默认更新所有记录

查询数据

1. 基本语法

select field1,field2... from tableName;	-- 查询指定字段

select * from tableName;	-- 查询所有字段

2. distinct 去重

过滤表中重复的数据

select distinct field1 from tableName;

3. as 别名

查询的列可以运算并起一个别名

例如,计算学生的总成绩

select name,(math+english+chinese) as sumscore from student;

4. where 条件过滤

运算符:> = <

and &&

or ||

Not !

is null

select name,(math+english+chinese) as sumscore 
from student 
where sumscore>200;

5. 模糊查询

本质:比较运算符

-- 查询所有姓杨的同学
select name from student where name like '杨%';
-- 查询数学成绩为66,79,85的同学
select name from student where math in(66,79,85);

5. order by 排序

升序为 asc(默认)

降序为 desc

位于select语句的句尾

-- 对总分从高到低进行排序
select (math+english+chinese) as sumscore 
from student order by sumscore desc;

6. 聚集函数

  1. count 获取数量

    -- 统计学生的总数量
    select count(*) from student;
    
  2. sum 求和

    忽略null值,可以使用 ifnull(filed ,0) 填充null值

    -- 统计全班的总成绩
    select sum(if null(math,0)+english+chinese) from student;
    
  3. avg 平均值

    -- 一个班级的数学平均分
    select avg(math) from student;
    -- 一个班总分平均分
    select avg(if null(math,0)+english+chinese) from student;
    
  4. max 最大值

    select max(math) from student;
    
  5. min 最小值

    select min(math) from student;
    

7. group by 分组

基本格式:

SELECT *|colName1,colName2,… | 统计函数
FROM tableName
WHERE 条件1
GROUP BY colName1,colName2,…
[HAVING 分组后的过滤条件(可以使用统计函数)]
[ORDER BY 排序字段 ASC | DESC [,排序字段 ASC | DESC]];

单独使用group by 分组

此时查询的是每一个分组的一条记录,单独使用意义不大

根据性别进行分组

在这里插入图片描述
在这里插入图片描述

group by 和聚集函数一起使用

可以统计出某个,或者某些字段在一个分组中的最大值、最小值、平均值

根据性别进行分组,得到男女的总数

在这里插入图片描述

group by 和having一起使用

在这里插入图片描述

根据学号进行分组,求总成绩大于250分的学生

在这里插入图片描述

在这里插入图片描述

having 和 where的区别:

8. 多表查询

连接查询

在用户查看数据的时候,需要显示的数据来自多张表

内连接查询是最常见的连接查询,内连接查询可以查询两张或两张以上的表

连接过程:从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留

普通内连接

前提条件:需要有外键

关键字: inner join … on

基本语法:select from 左表 [inner] join 右表 on 左表.字段 = 右表.字段;

select Sname,Cno,Grade 
from student inner join sc 
on student.Sno=sc.Sno

在这里插入图片描述

隐式内连接(使用最多)

可以不使用关键字 inner join … on

基本语法:select from 左表,右表 where 左表.字段 = 右表.字段;

select Sname,Cno,Grade 
from student,sc 
where student.Sno=sc.Sno

外连接查询

以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行连接: 不管能不能匹配上条件,最终都会保留: 能匹配,正确保留; 不能匹配,其他表的字段都置空NULL

联合查询

联合查询结果是将多个select语句的查询结果合并到一块,因为在某种情况下需要将几个select语句查询的结果合并起来显示。比如现在需要查询两个班级的所有学生的信息,这就需要从A班查询所有学生信息,再从B班查询所有的学生信息,然后将两次的查询结果进行合并。
可以使用unionunion all关键字进行操作

基本语法:

select 语句1
union[union 选项]
select 语句2
union|[union 选项]
select 语句n

-- union 选项 可以为all(无论重复都输出),distinct(去重,【默认的】)

select name from classA
union all
select name from classB

联合查询的意义:

  1. 查询同一张表,但是需求不同 如查询学生信息, 男生身高升序, 女生身高降序
  2. 多表查询: 多张表的结构是完全一样的,保存的数据(结构)也是一样的.

注意:在联合查询中: order by不能直接使用(不能出现两次),需要对查询语句使用括号才行;

select *from
(select *from student 
where sex="woman" 
order by score)student
union
select *from
(select *from student 
where sex="man" 
order by score)student ;

即order by不能直接出现在union的子句中,但是可以出现在子句的子句中。

子查询

可以将原表中特定列的值与子查询返回的结果集中的值进行比较

select * from student 
where Sno in 
(select Sno from sc 
 where Grade in
 (select Grade from sc 
  where Grade>80))

例: 查询每门课程成绩大于80的学生的所有信息,
先在子查询中查出成绩大于80的结果集,然后将原成绩表中的成绩与结果集进行比较,如果存在,就得到学生的学号,再将原学生表中的所有学号与结果集进行比较,输出最终的学生信息。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

标签:多表,改查,查询,分组,student,左表,where,select
来源: https://blog.csdn.net/YYbLQQ/article/details/121584937