MySQL之复杂查询的实现

作者:yzm4399 时间:2024-01-23 00:32:43 

1.排序

ORDER BY 子句来设定哪个字段哪种方式来进行排序,再返回搜索结果。
desc:降序

select * from blog order by balance desc;

asc:升序,默认,可不写

select * from blog order by balance asc;

MySQL之复杂查询的实现

多字段排序

update blog set age = 25 where age < 25;

先根据年龄升序,再根据余额降序

select * from blog order by age asc, balance desc;

MySQL之复杂查询的实现

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-21'),
('2', '小王', 'doctor', 3, '2022-02-21'),
('3', '小丽', 'police', 3, '2022-02-21'),
('4', '小王', 'doctor', 2, '2022-02-22'),
('5', '小明', 'firemen', 1, '2022-02-22'),
('6', '小丽', 'police', 3, '2022-02-22'),
('7', '小明', 'firemen', 2, '2022-02-23'),
('8', '小王', 'doctor', 2, '2022-02-23'),
('9', '小红', 'nurse', 3, '2022-02-23');

MySQL之复杂查询的实现

统计每人打卡记录数

SELECT name, COUNT(*) FROM employee GROUP BY name;

MySQL之复杂查询的实现

WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT&hellip;)
统计每人打卡总数

SELECT name, SUM(signin) as signin_count FROM employee GROUP BY name WITH ROLLUP;

MySQL之复杂查询的实现

其中记录 NULL 表示所有人的登录次数。
使用 coalesce 来设置一个可以取代 NUll 的名称
coalesce 语法:select coalesce(a,b,c);

SELECT name, SUM(signin) as signin_count FROM employee GROUP BY name WITH ROLLUP;

MySQL之复杂查询的实现

3.联合查询

UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。
UNION ALL:返回所有结果集,包含重复数据。

select author from blog
UNION ALL
select identity from employee;

MySQL之复杂查询的实现

报错:Illegal mix of collations for operation &lsquo;UNION&rsquo;
原因:相同字段的编码不一致造成的

MySQL之复杂查询的实现

解决:修改blog表的author字段

alter table blog modify `author` varchar(40) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '';

MySQL之复杂查询的实现

MySQL之复杂查询的实现

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;

MySQL之复杂查询的实现

where条件实现内连接效果

select b.author, b.age, b.title, e.name, e.signin from blog b,employee e
where b.author = e.identity;

MySQL之复杂查询的实现

左连接:读取左边数据表的全部数据,即便右边表无对应数据。

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://blog.csdn.net/qq_43654581/article/details/122980185

标签:MySQL,复杂查询
0
投稿

猜你喜欢

  • 利用python画一颗心的方法示例

    2021-06-04 01:14:33
  • 在Python程序中操作MySQL的基本方法

    2024-01-20 18:30:46
  • 详解PHP如何更好的利用PHPstorm的自动提示

    2024-05-22 10:05:30
  • Oracle生成单据编号存储过程的实例代码

    2024-01-23 19:10:19
  • python 数字类型和字符串类型的相互转换实例

    2021-08-02 08:11:36
  • perl哈希hash的常见用法介绍

    2023-08-12 18:46:59
  • 在Oracle PL/SQL中游标声明中表名动态变化的方法

    2009-02-28 10:39:00
  • Python(Tornado)模拟登录小米抢手机

    2021-09-03 16:15:03
  • Python2.x版本中cmp()方法的使用教程

    2022-08-19 01:23:40
  • Vue中使用vux配置代码详解

    2023-07-02 16:39:45
  • 深入MYSQL字符数字转换的详解

    2024-01-18 04:20:11
  • javascript将url中的参数加密解密代码

    2024-04-23 09:33:09
  • python 经典数字滤波实例

    2022-08-26 10:23:22
  • python实现求解列表中元素的排列和组合问题

    2022-03-18 00:05:08
  • 如何使用PHP计算上一个月的今天

    2023-11-15 14:16:25
  • PHP无限分类代码,支持数组格式化、直接输出菜单两种方式

    2024-05-13 09:24:51
  • 将mater库中的系统存储过程批量生成*.sql文件 通用且非常实用

    2012-06-06 20:03:43
  • js getElementsByTagName的简写方式

    2024-04-17 09:56:27
  • 详解Python判定IP地址合法性的三种方法

    2021-12-02 14:35:10
  • 公用样式模板的设计制作

    2009-09-13 21:27:00
  • asp之家 网络编程 m.aspxhome.com