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

目录

一、Mysql对数据的增删改

[1. 增加数据(INSERT语句)](#1. 增加数据(INSERT语句))

[2. 修改数据(UPDATE语句)](#2. 修改数据(UPDATE语句))

​编辑

WHERE子句(⭐):

​编辑

[3. 删除数据(DELETE语句)](#3. 删除数据(DELETE语句))

删除数据(TRUNCATE语句)

面试题

[4. 计算列(MySql8 新特性)](#4. 计算列(MySql8 新特性))

二、数据的备份和还原

三、单表查询

[1. DQL语言](#1. DQL语言)

[2. 查询语句语法规则](#2. 查询语句语法规则)

指定字段列:

​编辑

表别名和字段别名:

DISTINCT:

WHERE条件子句:

[LIKE 关键字:](#LIKE 关键字:)

[IN 关键字:](#IN 关键字:)

[NULL 值查询:](#NULL 值查询:)

[ORDER BY排序](#ORDER BY排序)

LIMIT关键字:

MySql8新关键词OFFSET:

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

[3.1 GROUP BY](#3.1 GROUP BY)

[3.2 HAVING](#3.2 HAVING)

[4. 扩展](#4. 扩展)

四、总结


一、Mysql对数据的增删改

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

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

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

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

1. 增加数据(INSERT语句)

语法:

sql 复制代码
INSERT   INTO   `表名`   [(`字段1`,`字段2`,...`字段n`)]
 VALUES/VALUE   ('值1','值2',...'值n')[,('值1','值2',...'值n')...];

其中:
•"[]" 包含的内容可以省略;
•  字段或值之间用英文逗号隔开;
•  可同时插入多条数据,values 后用英文逗号隔开;
• values和value的方式均可。
sql 复制代码
-- 全字段插入数据
-- 日期要用字符串的形式书写成日期格式
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);
sql 复制代码
-- 部分字段插入
-- 其他的字段不能有not null约束,如果有默认值也可以
insert into student(sname) values('王五');

一次性插入多条数据:

方式一:

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

方式二:

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

语法:

sql 复制代码
INSERT INTO table2
 (column_name,...)
 SELECT column_name,...
 FROMtable1;

其中:
• table2 必须存在,将table1中数据赋值到table2中
sql 复制代码
-- 方式二:(不推荐)
-- 目标表必须要事先存在
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;

方式三:

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

2. 修改数据(UPDATE语句)

语法:

sql 复制代码
UPDATE   表名   SET `字段名1`= '值1' [ , `字段名2` = '值2', .... ] 
[ WHERE 条件];

其中:
•"[]" 包含的内容可以省略;
•  `字段名`为要更改数据的字段,'值'表示字段改后的值,注意字段和值的对应;
•  可同时修改多个字段,多个字段后用英文逗号隔开;
•"WHERE"是where子句,可以给修改增加条件;
• 条件:为筛选条件,如不指定则修改该表的所有列数据。
sql 复制代码
-- 修改
update 表名 set 字段名=值,字段名=值...,字段名=值 【where 子句】

-- 数据库的值全部改变
-- 受影响的行数 -- 避免过多的读写(IO)数据库

update stu1 set xingbie ='男';


WHERE子句(⭐):

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

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

where 针对表中每一行数据

sql 复制代码
-- where 条件是整张表每一条数据进行判断 ****
update stu1 set xingbie ='女' where xingming='王五';

-- 范围形
-- 方式一
-- 闭合区间
update stu1 set classid =100 
where  stuid >=10 and stuid <=15;
sql 复制代码
-- 方式二: -- between 跟较小的数据 and 较大的数据
update stu1 set classid =300 
where  stuid between 10 and 15;

3. 删除数据(DELETE语句)

语法:

sql 复制代码
DELETE FROM 表名   [ WHERE 条件];

其中:
•"[]" 包含的内容可以省略;
•  "WHERE"可以通过where子句增加删除的条件。
sql 复制代码
-- 删除
-- delete from 表名 【where 子句】
delete from stu1 

insert into stu1(xingming) values('张三')

删除数据(TRUNCATE语句)

语法:

sql 复制代码
TRUNCATE [TABLE] 表名

其中:
• TRUNCATE是一个特殊的删除语句,又叫做清空语句;
•  "[]"包含的内容可以省略;
•  功能:清空某一张表内的全部数据,重置自增计数器;
• 特点:由于没有条件约束,所以速度快,而且效率高。
sql 复制代码
-- 清空表
-- 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的值。

sql 复制代码
-- 计算列
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. 查询语句语法规则

sql 复制代码
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:限制显示查询结果的条数。
sql 复制代码
#DQL
-- 所有的查询都会得到一张虚拟表
-- 数据查询
-- 最简单的查询
select 'abc';
select 123;
select 1+1;

指定字段列:

语法:

sql 复制代码
SELECT   * | 字段名1, 字段名2...     FROM   表名

其中:"*"表示所查询的数据库表的全部字段。
sql 复制代码
-- 从表中查询数据
-- select from 表名
-- 全字段查询
select Sid,Sname,birthday,Ssex,classid from student;
select * from student;
sql 复制代码
-- 部分字段查询
select  Sname,Ssex from student;


表别名和字段别名:

语法:

sql 复制代码
SELECT   表别名.字段名1  AS 字段别名1, 表别名.字段名2 AS 字段别名2   
FROM   表名  AS 表别名

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

select Sname as '学生姓名' ,Ssex '学生性别', birthday 学生生日 from student;
sql 复制代码
-- 添加一个学校的字段
select Sname 学生姓名, 'xynu' 学校 from student;

DISTINCT:

语法:

sql 复制代码
SELECT   DISTINCT 字段名1, 字段名2...     FROM   表名

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

WHERE条件子句:

语法:

sql 复制代码
SELECT  *  FROM  表名 [ WHERE 条件];

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

练习:

sql 复制代码
-- 查询Sid 2-6 的学生
select * from student 
where Sid >=2 and Sid <=6; 

select * from student 
where Sid between 2 and 6; 
sql 复制代码
-- 查询出年龄大于1990-1-1的学生
select * from student 
where birthday < '1990-1-1'; 

LIKE 关键字:

语法:

sql 复制代码
SELECT  *  FROM  表名 WHERE 字段  LIKE 条件;

其中:
• 在WHERE子句中,使用LIKE关键字进行模糊查询;
• 与"%"一起使用,表示匹配0或任意多个字符;
• 与"_"一起使用,表示匹配单个字符。
sql 复制代码
-- 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 关键字:

语法:

sql 复制代码
SELECT  *  FROM  表名 WHERE 字段  IN (值1,值2...)

其中:
• 查询的字段的值,至少与IN 后的括号中的一个值相同;
• 多个值之间用英文逗号隔开。
sql 复制代码
-- 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 值查询:

语法:

sql 复制代码
SELECT  *  FROM  表名 WHERE 字段  IS NULL |  IS NOT NULL

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


ORDER BY排序

语法:

sql 复制代码
SELECT  *  FROM  表名 ORDER BY 字段名 [DESC|ASC]

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

LIMIT关键字:

语法:

sql 复制代码
SELECT  *  FROM  表名   LIMIT   [n , m  ]

其中:
• LIMIT关键字是MySQL特有关键字;
• LIMIT限制SELECT返回结果的行数;
• n 表示第一条记录的偏移量,m 表示显示记录的数量;
•"[ ]"包含的内容可以省略。
sql 复制代码
-- 分页 limit 位置,步长 如果不写位置 默认为0

select * 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:

语法:

sql 复制代码
SELECT  *  FROM  表名    limit  m  offset  n

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

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

函数名 返回值
AVG(col) 返回指定列的平均值
COUNT(col) 返回指定列中非NULL值的个数
MIN(col) 返回指定列的最小值
MAX(col) 返回指定列的最大值
SUM(col) 返回指定列的所有值之和

count

sql 复制代码
-- ***** 聚合函数
-- count  个数 --全类型
-- count  不统计null
-- 学生表中一共有多少个人
select count(*) from student;
select count('abc') from student; -- 常量
select count(Sid) from student; 

select count(birthday) from student;-- null 不会被count计算到
sql 复制代码
-- 得到男同学的人数
select count(*) from student where Ssex='男';

sum

sql 复制代码
-- sum  总和
select sum(score) from sc;

练习:

sql 复制代码
-- max  最大值
-- min  最小值
-- avg  平均值

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

3.1 GROUP BY

  1. 对所有的数据进行分组统计;
  2. 分组的依据字段可以有多个,并依次分组。
sql 复制代码
-- 查询出男同学和女同学各有多少个人
select count(*) from student where Ssex ='男';

select count(*) from student where Ssex ='女';

-- 上面两句等同于这句
select  Ssex,count(*) from student group by Ssex;
sql 复制代码
select  Ssex,max(Sid) from student group by Ssex;

练习:

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

3.2 HAVING

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

sql 复制代码
-- 找到平均分不及格的学生
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 复制代码
如果是 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语句。
相关推荐
明明真系叻几秒前
第一周:李宏毅机器学习笔记
人工智能·笔记·机器学习
花随叶落1 分钟前
JavaScript的学习之DOM的查询(一)
前端·javascript·学习
杨侨治3 分钟前
Web后端开发概述&环境搭建&项目创建&servlet生命周期
java·笔记·学习·servlet·java基础·javaee
xuruilll6 分钟前
Docker部署前端,动态配置后端地址
运维·docker·容器
赛男丨木子丿小喵7 分钟前
服务器raid5坏盘-换盘-修复阵列过程
运维·服务器
腾讯数据架构师9 分钟前
最新docker仓库镜像
运维·docker·容器·镜像源
华为云开发者联盟11 分钟前
探秘数据库中的并行计算技术应用
mysql·并行计算·华为云开发者联盟
Geeker5513 分钟前
如何从iPhone恢复错误删除的照片
android·数据库·macos·ios·pdf·手机·iphone
来自于狂人21 分钟前
ansible常用命令
linux·运维·ansible
念晚91722 分钟前
Linux各种命令——tac命令,more 命令, less命令,head命令,tail命令,file 命令, stat 命令
linux·运维·服务器·前端·网络·数据库·less