
1.Create新增
1.1 语法

创建一个用于演示的表
sql
create table users (
id bigint,
name varchar(20) comment '⽤⼾名'
);
1.2 单行数据全列插入
不用写列名,value_list 中值的数量 必须和定义表的列的数量 及顺序一致
sql
insert into users values(1, '张三');

1.3 单行数据指定列插入
value_list 中值的数量 必须和指定列的数量 及顺序一致
sql
insert into users (id, name) values (2,'李四');


1.4 多行数据指定列插入
在⼀条INSERT语句中也可以指定多个value_list,用逗号隔开, 实现一次插入多行数据。
sql
insert into users (id, name) values (3,'王五'),(4,'赵四');


4.Retrieve 检索
4.1 语法+数据


构造数据
sql
-- 创建表结构
CREATE TABLE exam (
id BIGINT,
name VARCHAR(20) COMMENT '同学姓名',
chinese float COMMENT '语⽂成绩',
math float COMMENT '数学成绩',
english float COMMENT '英语成绩'
);
-- 插⼊测试数据
INSERT INTO exam (id, name, chinese, math, english) VALUES
(1, '唐三藏', 67, 98, 56),
(2, '孙悟空', 87, 78, 77),
(3, '猪悟能', 88, 98, 90),
(4, '曹孟德', 82, 84, 67),
(5, '刘⽞德', 55, 85, 45),
(6, '孙权', 70, 73, 78),
(7, '宋公明', 75, 65, 30);
系统支持通过**(命令行 / 图形化)客户端工具** 导入SQL语句及脚本。




点击my.ini修改文件,第63行,改完后保存并重启MySQL

刚才已经通过Navicat导入过sql,所以此时仅有一个错误才正确,但仍有字符编码错误,可能有其他错误,暂时不管了。



4.2 Select
在 SQL 查询中,所有的 SELECT 操作结果都会通过临时表的形式返回给客户端。
(1)全列查询
查询所有记录
sql
select * from exam;

(2)指定列查询
在select后面的查询列表中指定希望查询的列 ,可以是⼀个也可以是多个,中间用逗号 隔开,指定列的顺序与表结构中的列的顺序无关。
例:查询所有人的编号、姓名和语文成绩
sql
select id, name, chinese from exam;

(3)查询字段为表达式
• 查询列表中的表达式 可以是表中不存在的值或列。
• 若表达式为字符串常量 ,必须使用单引号将其括起。
• 表达式的执行过程: 首先从物理表 中读取对应列的值;然后计算表达式 的值;合并所有结果形成结果集 ;最终通过临时表将结果返回给客户端。
常量表达式
sql
select id, name, 10, '详情' from exam;

把所有学生的语文成绩加10分
sql
select id, name, chinese+10 from exam;

计算所有学生语文、数学和英语成绩的总分, 可以对列和列 进行计算。
sql
select id, name, chinese+math+English from exam;

(4)为查询结果指定别名
只是为结果 起个别名,where中不能用别名进行比较。
AS 可以省略 ,别名如果包含空格必须用单引号包裹。
sql
select id, name, chinese+math+English as '总分' from exam;

(5)结果去重查询-distinct
查询当前所的数学成绩,在结果集中去除重复记录。
sql
select distinct math from exam;


4.3 Where条件查询
SQL 查询执行时,会逐行读取表中的记录 ,并对每一行应用 WHERE 条件进行判断 。符合条件的记录会被放入临时表 中,最终返回给客户端,可以保证原数据不受影响。
语法

(1)比较运算符


(2)逻辑运算符


示例1:基本查询
查询英语不及格 的同学 及英语成绩(<60)
条件--english<60;查询列--name, english
sql
select name, english from exam where english<60;

查询语文成绩高于英语成绩的同学
条件--chinese>english;查询列--name, chinese, english
sql
select name, chinese, english from exam where chinese>english;

总分在200分以下的同学
条件--chinese+math+english<200;查询列--name, chinese+math+english 总分
sql
select name, chinese+math+english '总分' from exam where chinese+math+english<200;

注:where中不能用别名进行比较。

示例2:AND和OR
查询语文成绩大于 80分且英语成绩大于80分的同学
条件--chinese>80 and english>80;查询列--name, chinese, english
sql
select name, chinese, english from exam where chinese>80 and english > 80;

查询语文成绩大于 80分或英语成绩大于80分的同学
条件--chinese>80 or english>80;查询列--name, chinese, english
sql
select name, chinese, english from exam where chinese>80 or english > 80;

注意:AND的优先级高于OR,在同时使用时,建议使用小括号()包裹优先执行的部分。
示例3:范围查询
语文成绩在**[80,90]** 分的同学及语文成绩
条件--chinese between 80 and 90;查询列--name, chinese
sql
select name, chinese from exam where chinese between 80 and 90;

数学成绩是78或者79或者98或者99分 的同学及数学成绩
条件--math in(78, 79, 98, 99);查询列--name, math
sql
select name, math from exam where math in(78, 79, 98, 99);

示例4:模糊查询

示例5:NULL的查询
写入⼀条数据,英语成绩为NULL
sql
insert into exam values (8, '张⻜', 27, 0, NULL);

查询英语成绩为NULL 的记录
条件--math is null;查询列--*
sql
select * from exam where english is null;

查询英语成绩不为NULL 的记录,可以过滤掉不符合条件的值。
条件--math is not null;查询列--*
sql
select * from exam where english is not null;

注意:NULL与任何值进行运算结果为NULL,所以可以过滤掉不符合条件的值。

4.4 Order by排序
(1)语法


注意:
• 对SELECT查询出来的有效结果集进行排序, 可以使用 SELECT 列表 中定义的列别名来进行排序。
• 当对多个列 进行排序时,各列之间需用逗号 隔开。排序的执行顺序是依次进行的,即后续列的排序规则会基于前一列排序的结果之上应用。
• 指定排序列后,返回的结果集 会按照当前排序规则重新组织 。排序操作通常在额外的内存空间 (如临时表 )中进行,以保证原数据不受影响。
(2)示例
按数学成绩从低到高 排序(升序 ) asc
查询列--*;排序--math asc;
sql
select * from exam order by math asc;

按语文成绩从高到低 排序(降序 ) desc
查询列--*;排序--chinese desc;
sql
select * from exam order by chinese desc;

按英语成绩从高到低 排序 desc
查询列--*;排序--english desc;
sql
select * from exam order by english desc;

注:NULL被看做比任何值都小
查询同学各门成绩,依次按数学降序,英语升序,语文升序的方式显示。
查询列--name, math, english, chinese;排序--math desc, english asc, chinese asc
sql
select name, math, english, chinese from exam order by math desc, english asc, chinese asc;

查询同学及总分 ,由高到低排序
查询列--name, chinese+math+english '总分';排序--'总分' desc
对SELECT查询出来的有效结果集进行排序, 可以使用 SELECT 列表 中定义的列别名来进行排序。
sql
select name, chinese+math+english '总分' from exam order by '总分' desc;

所有英语成绩不为NULL 的同学,按语文成绩从高到低排序
条件--english is not null;查询列--*;排序--chinese desc


4.5 分页查询
(1)语法

注意:
• 先执行order by,后执行limit。
• 当 start 的值超出 了表中记录数的范围 ,返回null。
• 没有 达到 limit 的条数限制 ,也不会有任何影响,有多少条就显示多少条

(2)示例
从第0条 开始,读3条 记录,类似每页3条记录,此时查询的就是第一页。
sql
select * from exam limit 0, 3;

从第3条 开始,读3条 记录,类似每页3条记录,此时查询的就是第二页。
sql
select * from exam limit 3, 3;

从第6条 开始,读3条 记录,类似每页3条记录,此时查询的就是第三页。
sql
select * from exam limit 6, 3;

5.Update修改
5.1 语法

注意:
• 更新务必加WHERE条件,避免误更新全表数据。
• 可以设置多个列 的值,列与列之间用逗号隔开。
• 对符合条件的结果 进行列值更新。

5.2 示例
将孙悟空 同学的数学成绩 变更为80分
条件--name = '孙悟空';修改列--math;修改值--80
sql
update exam set math = 80 where name = '孙悟空';
先查一下孙悟空的数学成绩


将曹孟德 同学的数学 成绩变更为60 分,语文 成绩变更为70分
条件--name = '曹孟德';修改列--math, chinese;修改值--60, 70
sql
update exam set math = 60, chinese = 70 where name = '曹孟德';
先查一下曹孟德的数学和语文成绩

将总成绩倒数前三 的3位同学的数学 成绩加上30分

先查一下总成绩倒数前三 的3位同学的数学成绩
条件--chinses + math + english is not null;查询列--name, math, chinese + math + english 总分;排序--总分 asc;分页--3
sql
select name, math, chinese + math + english 总分 from exam where chinese + math + english is not null order by 总分 asc limit 3;
条件--下文;修改列--math;修改值--math + 30
sql
update exam set math = math + 30 where chinese + math + english is not null order by chinese + math + english asc limit 3;
注:别名是SELECT中定义的,在UPDATE上下文中不存在。

查看结果

将所有同学 的语文 成绩更新为原来的2倍
条件--无;修改列--chinese;修改值--chinese * 2
sql
update exam set chinese = chinese * 2;
先查一下所有同学的语文成绩

6.Delete删除
语法

务必加WHERE条件,避免误删除全表数据。
示例1 :删除孙悟空 同学的考试成绩
sql
delete from exam where name = '孙悟空';
先查看原始数据

示例2 :不加条件 的删除整张表 数据(危险操作)
sql
delete from t_delete;
准备测试表、插入测试数据、查看测试表、删除整张表中的数据、查看结果。



7.截断表
语法


示例

准备测试表、插入测试数据、查看测试表、查看建表结构,AUTO_INCREMENT=4


截断表,注意受影响的行数是0;查看表中的数据;查看表结构;AUTO_INCREMENT已被重置为0

继续写入数据、自增主键从1开如计数、再次查看表结构,AUTO_INCREMENT=2

8.插入查询结果
语法

示例:删除表中的重复记录,重复的数据只能有一份
sql
# 创建测试表,并构造数据
mysql> CREATE TABLE t_recored (id int, name varchar(20));
# 插⼊测试数据
INSERT INTO t_recored VALUES
(100, 'aaa'),
(100, 'aaa'),
(200, 'bbb'),
(200, 'bbb'),
(200, 'bbb'),
(300, 'ccc');
# 查看结果
mysql> select * from t_recored;
+------+------+
| id | name |
+------+------+
| 100 | aaa |
| 100 | aaa |
| 200 | bbb |
| 200 | bbb |
| 200 | bbb |
| 300 | ccc |
+------+------+
6 rows in set (0.00 sec)

创建一张新表,表结构与t_recored相同; 新表中没有记录;原表中的记录**去重后写入到新表;**查询新表中的记录,实现去重。


另一种写法

若想将旧表与新表进行互换也可以
rename table 对表重命名 原表名 to 新表名
新表与原表重命名 ;查询重命名后 表中的记录,实现需求且原来中的记录不受影响。

9.聚合函数

常用函数

9.1 COUNT
(1)语法

NULL 的数据不会计入结果
(2)示例
统计exam表中有多少记录
使用*** / 常量**做统计
sql
select count(*) from exam;
select count(1) from exam;


统计有多少学生参加英语考试
sql
select count(english) from exam;

统计语文 成绩小于50分 的学生个数
sql
select count(chinese) from exam where chinese < 50;

9.2 SUM
语法

NULL 的数据不会计入结果
不能统计非数值的列
示例:统计所有学生数学、 英语 成绩总分
sql
select sum(math) 数学总分, sum(english) 英语总分 from exam;

不能统计非数值的列
sql
select sum(name) from exam;

9.3 AVG
语法

示例
统计英语 成绩的平均分
sql
select avg(english) 英语平均分 from exam;

统计平均总分
sql
select avg(chinese + math + english) 平均总分 from exam;

9.4 MAX
查询英语最高分
sql
select max(english) 英语最高分 from exam;

9.5 MIN
查询**>70分以上** 的数学 最低分
sql
select min(math) 数学70分以上最低分 from exam where math > 70;

查询数学 成绩的最高 分与英语 成绩的最低分
可以使用多个聚合函数
sql
select max(math) 数学最高分, min(english) 英语最低分 from exam;

10.Group by分组查询-having子句
GROUP BY 子句的作用是通过一定的规则 将一个数据集划分成若干个小的分组 ,然后针对 若干个 分组进行数据处理,比如使用聚合函数对分组进行统计。

10.1 语法


10.2 示例
• 准备测试表及数据职员表emp,列分别为:id(编号),name(姓名),role(角色),salary(薪水)
sql
drop table if exists emp;
create table emp (
id bigint primary key auto_increment,
name varchar(20) not null,
role varchar(20) not null,
salary decimal(10, 2) not null
);
insert into emp values (1, '⻢云', '⽼板', 1500000.00);
insert into emp values (2, '⻢化腾', '⽼板', 1800000.00);
insert into emp values (3, '鑫哥', '讲师', 10000.00);
insert into emp values (4, '博哥', '讲师', 12000.00);
insert into emp values (5, '平姐', '学管', 9000.00);
insert into emp values (6, '莹姐', '学管', 8000.00);
insert into emp values (7, '孙悟空', '游戏⻆⾊', 956.8);
insert into emp values (8, '猪悟能', '游戏⻆⾊', 700.5);
insert into emp values (9, '沙和尚', '游戏⻆⾊', 333.3);
select * from emp;

• 统计 每个角色 的人数
sql
select role, count(*) from emp group by role;



• 统计 每个角色 的平均 工资,最高 工资,最低工资
sql
select role, avg(salary), max(salary), min(salary) from emp group by role;

10.3 having子句
使用GROUP BY 对结果进行分组处理之后**,对分组的结果进行过滤** 时,不能 使用WHERE子句,而要使用HAVING 子句。

示例:显示平均工资低于1500 的角色 和它 的平均工资
过滤条件 :平均工资低于1500
基于分组结果(角色的平均工资)之上进行过滤
sql
select role, avg(salary) from emp group by role;
sql
select role, avg(salary) from emp group by role having avg(salary) < 1500;


11.内置函数

日期函数


字符串处理函数



数学函数

其他常用函数

