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语句。
相关推荐
搬码临时工35 分钟前
电脑同时连接内网和外网的方法,附外网连接局域网的操作设置
运维·服务器·网络
藥瓿亭37 分钟前
K8S认证|CKS题库+答案| 3. 默认网络策略
运维·ubuntu·docker·云原生·容器·kubernetes·cks
Gaoithe1 小时前
ubuntu 端口复用
linux·运维·ubuntu
px不是xp2 小时前
山东大学算法设计与分析复习笔记
笔记·算法·贪心算法·动态规划·图搜索算法
程序猿小D2 小时前
第16节 Node.js 文件系统
linux·服务器·前端·node.js·编辑器·vim
一只叫煤球的猫2 小时前
MySQL 8.0 SQL优化黑科技,面试官都不一定知道!
后端·sql·mysql
寒山李白2 小时前
MySQL安装与配置详细讲解
数据库·mysql·配置安装
echo haha2 小时前
第7章 :面向对象
笔记
Chef_Chen2 小时前
从0开始学习R语言--Day18--分类变量关联性检验
学习