您的位置:首页 > 健康 > 美食 > MySQL2(Mysql对数据的增删改 数据的备份和还原 单表查询 常用的聚合函数(⭐⭐))

MySQL2(Mysql对数据的增删改 数据的备份和还原 单表查询 常用的聚合函数(⭐⭐))

2024/12/26 0:54:58 来源:https://blog.csdn.net/qq_52897007/article/details/139953735  浏览:    关键词:MySQL2(Mysql对数据的增删改 数据的备份和还原 单表查询 常用的聚合函数(⭐⭐))

目录

一、Mysql对数据的增删改

1. 增加数据(INSERT语句)

2. 修改数据(UPDATE语句) 

​编辑

WHERE子句(⭐):

​编辑

3. 删除数据(DELETE语句)

删除数据(TRUNCATE语句)

面试题

4. 计算列(MySql8 新特性) 

二、数据的备份和还原

三、单表查询 

1. DQL语言

2. 查询语句语法规则

指定字段列:

​编辑

表别名和字段别名:

DISTINCT:

WHERE条件子句:

LIKE 关键字:

IN 关键字:

NULL 值查询:

ORDER BY排序

LIMIT关键字:

MySql8新关键词OFFSET:

3. 常用的聚合函数(⭐⭐)

3.1 GROUP BY

3.2 HAVING

4. 扩展

四、总结 


一、Mysql对数据的增删改

DML(数据操作语言)    Data Manipulation Language    用于对数据库中数据的增删改操作

数据增加:关键字INSERT,主要功能是 给数据库表增加记录。

数据修改:关键字是UPDATE,主要功能是 修改数据库表中已有的记录。可 以根据条件去做修改。

数据删除:关键字DELETE,主要功能室删除 数据库表中已有的记录。可以依 照条件去做修改。

1. 增加数据(INSERT语句)

语法:

INSERT   INTO   `表名`   [(`字段1`,`字段2`,...`字段n`)]VALUES/VALUE   ('值1','值2',...'值n')[,('值1','值2',...'值n')...];其中:
•“[]” 包含的内容可以省略;
•  字段或值之间用英文逗号隔开;
•  可同时插入多条数据,values 后用英文逗号隔开;
• values和value的方式均可。
-- 全字段插入数据
-- 日期要用字符串的形式书写成日期格式
insert into student(sid,sname,birthday,ssex,classid)
values(9,'张三','2000-1-1 14:30:59','男',1);
-- 不写字段名就是全字段插入
insert into 
student 
values(null,'李四','1999-2-2','女',1
);insert into student 
values(default,'李四','1999-2-2','女',1);
-- 部分字段插入
-- 其他的字段不能有not null约束,如果有默认值也可以
insert into student(sname) values('王五');

一次性插入多条数据:

方式一:

-- 一次性插入多条数据
-- 方式一:(推荐使用)
insert into student(sname,ssex) 
values ('唐三藏','男'),('孙悟空','男'),('猪悟能','男'),
('沙悟净','男');

方式二:

        INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。 目标表中任何已存在的行都不会受影响。

语法:

INSERT INTO table2(column_name,...)SELECT column_name,...FROMtable1;其中:
• table2 必须存在,将table1中数据赋值到table2中
-- 方式二:(不推荐)
-- 目标表必须要事先存在
create table stu1(stuid int primary key auto_increment,xingming varchar(10),xingbie varchar(2),classid int
);
-- insert into 目标表 select insert into stu1(xingming,xingbie,classid) 
select sname,ssex,classid from student;

方式三:

-- 方式三(不推荐)
-- 目标表不能存在
-- create table 目标表 select 
create table newstu 
select sid,sname,birthday from student;

2. 修改数据(UPDATE语句) 

语法:

UPDATE   表名   SET `字段名1`= '值1' [ , `字段名2` = '值2', …. ] 
[ WHERE 条件];其中:
•“[]” 包含的内容可以省略;
•  `字段名`为要更改数据的字段,'值'表示字段改后的值,注意字段和值的对应;
•  可同时修改多个字段,多个字段后用英文逗号隔开;
•“WHERE”是where子句,可以给修改增加条件;
• 条件:为筛选条件,如不指定则修改该表的所有列数据。
-- 修改
update 表名 set 字段名=值,字段名=值...,字段名=值 【where 子句】-- 数据库的值全部改变
-- 受影响的行数 -- 避免过多的读写(IO)数据库update stu1 set xingbie ='男';


WHERE子句(⭐):

        有条件的从数据库表中获取记录,通常同在修改,删除,和查询语句的时候,协助该类语句从条件中获取 记录。针对修改和删除语句,如果没有条件,则全部修改和全部删除。

运算符含义举例结果
=等于5=6false
<> 或 !=不等于5!=6true
>大于5>6false
<小于5<6true
>=大于等于5>=6false
<=小于等于5<=6true
BETWEEN在某个范围之间BETWEEN 5 AND 10-
AND并且5>1 AND 1>2false
OR5>1 OR 1>2True
Not
-- where 条件是整张表每一条数据进行判断 ****
update stu1 set xingbie ='女' where xingming='王五';

where 针对表中每一行数据

-- where 条件是整张表每一条数据进行判断 ****
update stu1 set xingbie ='女' where xingming='王五';-- 范围形
-- 方式一
-- 闭合区间
update stu1 set classid =100 
where  stuid >=10 and stuid <=15;
-- 方式二: -- between 跟较小的数据 and 较大的数据
update stu1 set classid =300 
where  stuid between 10 and 15;

3. 删除数据(DELETE语句)

语法:

DELETE FROM 表名   [ WHERE 条件];其中:
•“[]” 包含的内容可以省略;
•  “WHERE”可以通过where子句增加删除的条件。
-- 删除
-- delete from 表名 【where 子句】
delete from stu1 insert into stu1(xingming) values('张三')

删除数据(TRUNCATE语句)

语法:

TRUNCATE [TABLE] 表名其中:
• TRUNCATE是一个特殊的删除语句,又叫做清空语句;
•  “[]”包含的内容可以省略;
•  功能:清空某一张表内的全部数据,重置自增计数器;
• 特点:由于没有条件约束,所以速度快,而且效率高。
-- 清空表
-- truncate 表名
truncate stu1

面试题

drop truncate delete 区别

  • drop 包表结构,索引,数据全部删掉
  • truncate 只保留表结构, 索引和数据删掉
  • delete 只删数据

4. 计算列(MySql8 新特性) 

什么叫计算列呢?简单来说就是某一列的值是通过别的列计算得来的。

例如,a列值为1、b列值为2,c列不需要手动插入,定义a+b的结果为c的值,那么c就是计算列,是通过别的列计算得来的。


在MySQL8.0中,CREATE TABLE 和 ALTER TABLE 中都支持增加计算列。下面以CREATE TABLE为例进行讲解。


举例:定义数据表tb1,然后定义字段id、字段a、字段b和字段c,其中字段c为计算列,用于计算a+b的值。

-- 计算列
CREATE TABLE jsltab(id INT PRIMARY KEY AUTO_INCREMENT,a INT ,b INT ,c INT GENERATED ALWAYS AS (a + b) VIRTUAL
);
select * from jsltab
insert into jsltab(a,b) values(2,3),(200,300)

二、数据的备份和还原

方法一:使用工具

备份:

选中需要备份的 右键 选择转储SQL文件

恢复:

右键 点击运行SQL文件 选择备份的文件即可

方法二:使用dos命令

数据库备份和恢复的作用和价值主要体现在以下几个方面:

  • 高可用性:使数据库的失效次数减到 最少,从而使数据库保持 最大的可用性。
  • 安全性:计算机病毒型、特洛伊木马型、“黑客”入侵型、 逻辑炸弹型等会造成信息丢失,丢失的数据需要及时恢复。
  • 完整性:当数据库失效后,确保尽量少的数据丢失或根本不丢失,从而使数据具有最大的完整性。

三、单表查询 

1. DQL语言

        DQL(Data Query Language 数据查询语言)。用途是查询数据库数据,如SELECT语句。是SQL语句中最核心、最重要的语句,也是使用频率最高的语句。其中,可以根据表的结构和关系分为单表查询和多表联查。

  • 单表查询:针对数据库中的一张数据表进行查询,可以通过各 种查询条件和方式去做相关的优化。
  • 多表联查:针对数据库中两张或者两张以上的表同时进行查询, 依赖的手段有复杂查询和嵌套查询。

2. 查询语句语法规则

SELECT   [DISTINCT]{*|表1.*|[ 表1.字段1 [as  字段别名1][, 表1.字段2[as  字段别名2]][, …]]}FROM  表1 [as  表别名 ][ left|right|inner join  表2   on  表之间
的关系 ][ WHERE][ GROUP BY ] 
[ HAVING][ ORDER BY][ LIMIT  {[ 位置偏移量,]行数}]; 其中:
“[ ]”包含的内容可以省略;
“{ }”包含的内容必须存在;必须按照该顺序使用

关键字:

  • DISTINCT:设定DISTINCT可以去掉重复记录。
  • AS:表名或者字段名过长时,可以用AS关键字起别名,方便操作。
  • GROUP BY:按组分类显示查询出的数据。
  • HAVING:GROUP BY分组时依赖的分组条件。
  • ORDER BY:将查询出来的结果集按照一定顺序排序完成。
  • LIMIT:限制显示查询结果的条数。
#DQL
-- 所有的查询都会得到一张虚拟表
-- 数据查询
-- 最简单的查询
select 'abc';
select 123;
select 1+1;

指定字段列:

语法:

SELECT   * | 字段名1, 字段名2...     FROM   表名其中:“*”表示所查询的数据库表的全部字段。
-- 从表中查询数据
-- select from 表名
-- 全字段查询
select Sid,Sname,birthday,Ssex,classid from student;
select * from student;

-- 部分字段查询
select  Sname,Ssex from student;


表别名和字段别名:

语法:

SELECT   表别名.字段名1  AS 字段别名1, 表别名.字段名2 AS 字段别名2   
FROM   表名  AS 表别名其中:
• “.” 当前表存在的字段;
• “AS”可忽略不写,“AS”的功能如下:• 给字段取一个新别名;• 给表取一个新别名;• 把经计算或总结的结果用另外一个新名称来代替。
-- 给字段起别名
select Sname as '学生姓名' ,Ssex from student;select Sname as '学生姓名' ,Ssex '学生性别', birthday 学生生日 from student;

-- 添加一个学校的字段
select Sname 学生姓名, 'xynu' 学校 from student;


DISTINCT:

语法:

SELECT   DISTINCT 字段名1, 字段名2...     FROM   表名其中:去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同),
只返回一条。
-- 查询学生表中性别的数据
-- distinct 去除重复的数据
-- 去重机制 完全一致
select  distinct Ssex from student;


WHERE条件子句:

语法:

SELECT  *  FROM  表名 [ WHERE 条件];其中:
• WHERE条件子句不是必须的;
• WHERE子句,可以给查询增加条件;
• 条件:为筛选条件,如不指定则修改该表的所有数据。
-- 带条件的查询 where子句
select * from student 
where Ssex ='男' and classid =1; 

练习:

-- 查询Sid 2-6 的学生
select * from student 
where Sid >=2 and Sid <=6; select * from student 
where Sid between 2 and 6; 

-- 查询出年龄大于1990-1-1的学生
select * from student 
where birthday < '1990-1-1'; 


LIKE 关键字:

语法:

SELECT  *  FROM  表名 WHERE 字段  LIKE 条件;其中:
• 在WHERE子句中,使用LIKE关键字进行模糊查询;
• 与“%”一起使用,表示匹配0或任意多个字符;
• 与“_”一起使用,表示匹配单个字符。
-- like 模糊查询insert into student (sname) values
('张老师'),('小张'),('张美女'),('姓张的老师');-- %  任意多的任意字符
-- _  一个任意字符
select * from student where Sname like '%张%';
select * from student where Sname like '张%';select * from student where Sname like '%张_';
select * from student where Sname like '%张__';


IN 关键字:

语法:

SELECT  *  FROM  表名 WHERE 字段  IN (值1,值2...)其中:
• 查询的字段的值,至少与IN 后的括号中的一个值相同;
• 多个值之间用英文逗号隔开。
-- in 在特定的范围内
-- 1,3,4,5,8
select * from student where Sid =1 or Sid =3 or Sid =4 or Sid =5 or Sid =8;
select * from student where Sid in (1,3,4,5,8);


NULL 值查询:

语法:

SELECT  *  FROM  表名 WHERE 字段  IS NULL |  IS NOT NULL其中:
• NULL代表“无值”;
• 区别于零值0和空符串;
•  只能出现在定义允许为NULL的字段;
•  须使用 IS NULL 或 IS NOT NULL 比较操作符去比较。
-- 对 null 的操作
select * from student where birthday is null;
select * from student where birthday is not null;


ORDER BY排序

语法:

SELECT  *  FROM  表名 ORDER BY 字段名 [DESC|ASC]其中:
• ORDER BY 表示对SELECT语句查询得到的结果,按字段名进行排序;
• DESC表示排序的顺序为降序,ASC表示排序的顺序为升序;
•“[ ]”包含的内容可以省略。
-- 排序
-- asc (或不写)就是升序  
-- desc 降序
-- 先写先排select * from student order by classid desc, birthday asc;


LIMIT关键字:

语法:

SELECT  *  FROM  表名   LIMIT   [n , m  ]其中:
• LIMIT关键字是MySQL特有关键字;
• LIMIT限制SELECT返回结果的行数;
• n 表示第一条记录的偏移量,m 表示显示记录的数量;
•“[ ]”包含的内容可以省略。
-- 分页 limit 位置,步长 如果不写位置 默认为0select * from student limit 0,3;select * from student limit 3,3;select * from student limit 6,3;select * from student limit (页码-1)*步长,步长;select * from student limit (2-1)*3,3;

LIMIT实现分页显示的方式:

MySql8新关键词OFFSET:

语法:

SELECT  *  FROM  表名    limit  m  offset  n其中:
• LIMIT关键字是MySQL特有关键字;
• LIMIT限制SELECT返回结果的行数;
• n 表示第一条记录的偏移量,m 表示显示记录的数量;
•“[ ]”包含的内容可以省略。
-- offset 设置偏移量,位置
select * from student limit 3 offset 6

3. 常用的聚合函数(⭐⭐)

函数名返回值
AVG(col)返回指定列的平均值
COUNT(col)返回指定列中非NULL值的个数
MIN(col)返回指定列的最小值
MAX(col)返回指定列的最大值
SUM(col)返回指定列的所有值之和
count
-- ***** 聚合函数
-- count  个数 --全类型
-- count  不统计null
-- 学生表中一共有多少个人
select count(*) from student;
select count('abc') from student; -- 常量
select count(Sid) from student; select count(birthday) from student;-- null 不会被count计算到

-- 得到男同学的人数
select count(*) from student where Ssex='男';

sum

-- sum  总和
select sum(score) from sc;

练习:

-- max  最大值
-- min  最小值
-- avg  平均值-- 统计出sc表
-- 一共的考试次数 ,总成绩,平均分, 最高分,最低分
-- sum  总和
select count(*) 考试次数,sum(score) 总成绩,avg(score) 平均分,max(score) 最高分,min(score) 最低分 from sc;

3.1 GROUP BY

  1. 对所有的数据进行分组统计;
  2. 分组的依据字段可以有多个,并依次分组。
-- 查询出男同学和女同学各有多少个人
select count(*) from student where Ssex ='男';select count(*) from student where Ssex ='女';-- 上面两句等同于这句
select  Ssex,count(*) from student group by Ssex;

select  Ssex,max(Sid) from student group by Ssex;

练习:

-- 查出每个学生的平均分
select Sid,avg(score),count(*) from sc group by Sid;

3.2 HAVING

与GROUP BY结合使用,进行分组后的数据筛选。

-- 找到平均分不及格的学生
select Sid,avg(score)from sc group by Sid having avg(score)<60;

 where 和 having 的区别

  1. where 必须出现在group by 前面      having 必须出现在group by 后面
  2. where筛选的聚合前的数据 每一行数据       having 筛选的是聚合后的数据

4. 扩展

        在不同的 DBMS 中使用的关键字可能不同。在 MySQL、PostgresQL、MariaDB 和 sQLite 中使用 LIMIT 关键字,而且需要放到 SELECT 语句的最后面。 

如果是 SQL Server 和 Access,需要使用 TOP 关键字,比如:
SELECT TOP 5 name,hp_max FROM heros ORDER BY hp_max DESC如果是 DB2,使用 FETCH FIRST 5 ROWS ONLY 这样的关键字:
SELECT name, hp_max FROM herOS ORDER BY hp_maX DESC FETCH FIRST 5 ROWS ONLY重要:
如果是 Oracle,你需要基于 ROWNUM 来统计行数:
SELECT rownum,last_name,salary FROM employees WHERE rownum < 5 ORDER BY salary DESC;

四、总结 

  • DML语句内容?
    • INSERT语句,UPDATE语句和DELETE语句;
  • 新增语句如何实现多记录同时新增?
    • INSERT INTO `表名` (`字段1`,`字段n`) VALUES (值1,值n),(值1,值n),(值1,值n); 
  • WHERE子句的功能?
    • 依赖逻辑条件对数据库的记录修改,删除或者查询;
  • TRUNCATE语句和DELETE语句的异同?
    • 相同点:都能删除数据,都不能修改表结构;
    • 不同点:1、前者会重置自增计数器,后者不会;
      •         2、前者无条件约束,速度快效率高。
  • DQL语句内容
    • SELECT语句。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com