1.排序
ORDER BY 子句来设定哪一个字段哪一种方式来进行排序,再返回搜索结果。
desc:降序
select * from blog order by balance desc;
asc:升序,默许,可不写
select * from blog order by balance asc;
多字段排序
update blog set age = 25 where age < 25;
先根据年龄升序,再根据余额降序
select * from blog order by age asc, balance desc;
2.分组
GROUP BY 语句根据一个或多个列对结果集进行分组。
新建员工表
CREATE TABLE `employee` (
`id` int NOT NULL,
`name` varchar(20) NOT NULL DEFAULT ”,
`identity` varchar(20) NOT NULL DEFAULT ”,
`signin` tinyint NOT NULL DEFAULT ‘0’ COMMENT ‘打卡次数’,
`date` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
插入数据
INSERT INTO `employee` VALUES
(‘1’, ‘小明’, ‘firemen’, 3, ‘2022-02⑵1’),
(‘2’, ‘小王’, ‘doctor’, 3, ‘2022-02⑵1’),
(‘3’, ‘小丽’, ‘police’, 3, ‘2022-02⑵1’),
(‘4’, ‘小王’, ‘doctor’, 2, ‘2022-02⑵2’),
(‘5’, ‘小明’, ‘firemen’, 1, ‘2022-02⑵2’),
(‘6’, ‘小丽’, ‘police’, 3, ‘2022-02⑵2’),
(‘7’, ‘小明’, ‘firemen’, 2, ‘2022-02⑵3’),
(‘8’, ‘小王’, ‘doctor’, 2, ‘2022-02⑵3’),
(‘9’, ‘小红’, ‘nurse’, 3, ‘2022-02⑵3’);
统计每人打卡记录数
SELECT name, COUNT(*) FROM employee GROUP BY name;
WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)
统计每人打卡总数
SELECT name, SUM(signin) as signin_count FROM employee GROUP BY name WITH ROLLUP;
其中记录 NULL 表示所有人的登录次数。
使用 coalesce 来设置一个可以取代 NUll 的名称
coalesce 语法:select coalesce(a,b,c);
SELECT name, SUM(signin) as signin_count FROM employee GROUP BY name WITH ROLLUP;
3.联合查询
UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。
UNION ALL:返回所有结果集,包括重复数据。
select author from blog
UNION ALL
select identity from employee;
报错:Illegal mix of collations for operation ‘UNION’
缘由:相同字段的编码不一致酿成的
解决:修改blog表的author字段
alter table blog modify `author` varchar(40) COLLATE utf8mb4_general_ci NOT NULL DEFAULT ”;
UNION DISTINCT: 删除结果集中重复的数据。默许,可不写
select author from blog
UNION
select identity from employee;
4.多表连接
INNER JOIN(内连接,或等值连接):获得两个表中字段匹配关系的记录。
LEFT JOIN(左连接):获得左表所有记录,即便右表没有对应匹配的记录。
RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获得右表所有记录,即便左表没有对应匹配的记录。
内连接
INNER 可以省略
select b.author, b.age, b.title, e.name, e.signin from blog b
INNER JOIN employee e on b.author = e.identity;
where条件实现内连接效果
select b.author, b.age, b.title, e.name, e.signin from blog b,employee e
where b.author = e.identity;
左连接:读取左侧数据表的全部数据,即使右侧表无对应数据。
select b.author, b.age, b.title, e.name, e.signin from blog b
LEFT JOIN employee e on b.author = e.identity;
右连接:读取右侧数据表的全部数据,即使左侧边表无对应数据。
select b.author, b.age, b.title, e.name, e.signin from blog b
RIGHT JOIN employee e on b.author = e.identity;
文章来源:丸子建站
文章标题:MySQL之复杂查询的实现
https://www.wanzijz.com/view/58984.html