## MySql--复杂查询 转

丿咖啡灬微凉

MySql拥有着非常丰富的查询方式，除了之前总结的简单查询和子查询外，还提供复杂查询的方式，可以进行分组查询、多表查询和合并查询结果，现将之总结一下。

# /*****************************分组查询**************************************/

``create table studentInfo(id int PRIMARY KEY, name VARCHAR(20), score decimal(4,2), subject VARCHAR(20), teacher VARCHAR(20));``

## 1、对单列进行分组查询

``select subject, COUNT(*) from studentInfo GROUP BY subject;``

## 2、使用HAVING的分组查询

``select subject, AVG(score) from studentInfo GROUP BY subject HAVING subject = '数学';``

## 3、对多列进行分组查询

``select subject, teacher, AVG(score) from studentInfo GROUP BY subject, teacher;``

## 4、在分组查询中使用ORDER BY

``select teacher, SUM(score) from studentInfo GROUP BY teacher ORDER BY sum(score) desc;``

/*****************************************************************************/

# /*****************************多表查询**************************************/

``````create table newInfo(id int PRIMARY KEY, name VARCHAR(20), score decimal(4,2), subjectid int, teacherid int);
create table subjectInfo(id int PRIMARY KEY, subjectname VARCHAR(30));
create table teacherInfo(id int PRIMARY KEY, teachername VARCHAR(30));``````

## 1、等值连接

``````mysql> select newInfo.name,subjectInfo.subjectname from newInfo,subjectInfo where newInfo.subjectid=subjectInfo.id;
+--------+-------------+
| name   | subjectname |
+--------+-------------+
| 小明   | 数学        |
| 小红   | 英语        |
| 小李   | 语文        |
+--------+-------------+
3 rows in set (0.00 sec)``````

``````mysql> select newInfo.name,subjectInfo.subjectname,teacherInfo.teachername from newInfo,subjectInfo,teacherInfo
> where newInfo.subjectid = subjectInfo.id and newInfo.teacherid = teacherInfo.id;
+--------+-------------+-------------+
| name   | subjectname | teachername |
+--------+-------------+-------------+
| 小明   | 数学        | 张老师      |
| 小红   | 英语        | 王老师      |
| 小李   | 语文        | 吴老师      |
+--------+-------------+-------------+
3 rows in set (0.00 sec)``````

## 2、笛卡尔积   3*4列和5*7列表不加条件查询，得到8*28列表

``select * from newInfo,subjectInfo,teacherInfo;``

## 3、外连接

### (1)左外连接

``````mysql> select newInfo.name,subjectInfo.subjectname from newInfo LEFT OUTER JOIN subjectInfo
> ON newInfo.subjectid = subjectInfo.id;
+--------+-------------+
| name   | subjectname |
+--------+-------------+
| 小明   | 数学        |
| 小红   | 英语        |
| 小李   | 语文        |
| 小胡   | NULL        |
+--------+-------------+
4 rows in set (0.00 sec)``````

### (2)右外连接

``````mysql> select newInfo.name,subjectInfo.subjectname from newInfo RIGHT OUTER JOIN subjectInfo
> ON newInfo.subjectid = subjectInfo.id;
+--------+-------------+
| name   | subjectname |
+--------+-------------+
| 小李   | 语文        |
| 小明   | 数学        |
| 小红   | 英语        |
| NULL   | 计算机      |
+--------+-------------+
4 rows in set (0.00 sec)``````

## 4、内连接相当于等值连接  相比较更加明显是多表查询

``````mysql> select newInfo.name,subjectInfo.subjectname from newInfo INNER JOIN subjectInfo
> ON newInfo.subjectid = subjectInfo.id;
+--------+-------------+
| name   | subjectname |
+--------+-------------+
| 小李   | 语文        |
| 小明   | 数学        |
| 小红   | 英语        |
+--------+-------------+
3 rows in set (0.00 sec)``````

``````mysql> select newInfo.name,subjectInfo.subjectname,teacherInfo.teachername
-> from newInfo INNER JOIN subjectInfo INNER JOIN teacherInfo
-> ON newInfo.subjectid=subjectInfo.id and newInfo.teacherid=teacherInfo.id;
+--------+-------------+-------------+
| name   | subjectname | teachername |
+--------+-------------+-------------+
| 小明   | 数学        | 张老师      |
| 小红   | 英语        | 王老师      |
| 小李   | 语文        | 吴老师      |
+--------+-------------+-------------+
3 rows in set (0.00 sec)``````

/*****************************************************************************/

# /*****************************合并查询结果**************************************/

## 1、使用UNION关键字合并查询结果（多表查询的数据表）两张表的列数相同，数据类型相同

``````mysql> select * from teacherInfo
-> UNION
-> select * from subjectInfo;
+----+-------------+
| id | teachername |
+----+-------------+
|  1 | 张老师      |
|  2 | 王老师      |
|  3 | 吴老师      |
|  1 | 语文        |
|  2 | 数学        |
|  3 | 英语        |
|  4 | 计算机      |
+----+-------------+
7 rows in set (0.00 sec)``````

## 2、对合并后的查询结果排序

``````mysql> select * from teacherInfo
-> UNION
-> select * from subjectInfo
-> ORDER BY id;
+----+-------------+
| id | teachername |
+----+-------------+
|  1 | 张老师      |
|  1 | 语文        |
|  2 | 数学        |
|  2 | 王老师      |
|  3 | 英语        |
|  3 | 吴老师      |
|  4 | 计算机      |
+----+-------------+
7 rows in set (0.00 sec)``````

## 3、限制组合查询结果的行数

``````mysql> select * from teacherInfo
-> UNION
-> select * from subjectInfo
-> LIMIT 3;
+----+-------------+
| id | teachername |
+----+-------------+
|  1 | 张老师      |
|  2 | 王老师      |
|  3 | 吴老师      |
+----+-------------+
3 rows in set (0.00 sec)``````

/*****************************************************************************/

### 丿咖啡灬微凉

dble是上海爱可生信息技术股份有限公司基于mysql的高可扩展性的分布式中间件，存在以下几个优势特性： 数据水平拆分 随着业务的发展，您可以使用dble来替换原始的单个MySQL实例。 兼容Mysql...

2018/01/01
1K
2
DBLE —— 基于 MySQL 的高可扩分布式中间件

DBLE是上海爱可生信息技术股份有限公司基于mysql的高可扩展性的分布式中间件，存在以下几个优势特性： 数据水平拆分 随着业务的发展，您可以使用dble来替换原始的单个MySQL实例。 兼容Mysql...

2018/01/04
13
0
Mysql中Explain详解

2017/11/01
0
0
zg手册 之 Mysql 开发（1）-- 中文全文检索插件开发

2014/06/02
0
0

【IT168 技术】背景 　　此场景目的是体验RadonDB的复杂查询兼容性能力。 　　一般中间件对SQL处理上的约束： 　　● 全局排序不支持 　　● 查询中不包含分区键的，不支持或是性能不好 ...

it168网站
2018/05/08
0
0

AWS的自动部署工具codedeploy 部署前的准备工作

28分钟前
0
0

1、MySQL的复制原理以及流程 基本原理流程，3个线程以及之间的关联； 主：binlog线程——记录下所有改变了数据库数据的语句，放进master上的binlog中； 从：io线程——在使用start slave 之后...

Java干货分享
38分钟前
1
0

57分钟前
2
0
JFinal开发的旅游线路营销Saas平台演示系统我部署了一个

2
0

3
0