Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL ORDER BY,GROUPBY 与各种JOIN

MySQL ORDER BY,GROUPBY 与各种JOIN

作者头像
泰坦HW
发布于 2020-07-22 08:13:49
发布于 2020-07-22 08:13:49
2K00
代码可运行
举报
文章被收录于专栏:Titan笔记Titan笔记
运行总次数:0
代码可运行

1. Order By

ORDER BY 语句用于根据指定的列对结果集进行排序。

ORDER BY 语句默认按照升序对记录进行排序。

如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。

原始的表 (用在例子中的):

Orders 表:

Company

OrderNumber

Titan Tech.

3532

Goodman Inc.

2356

Trump Limited.

4698

Goodman Inc.

6953

以字母顺序显示公司名称:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT Company, OrderNumber FROM Orders ORDER BY Company
结果:

Company

OrderNumber

Trump Limited.

4698

Titan Tech.

3532

Goodman Inc.

6953

Goodman Inc.

2356

2. Group By

GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。

SQL GROUP BY 语法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
SQL GROUP BY 实例

我们拥有下面这个 "Orders" 表:

O_Id

OrderDate

OrderPrice

Customer

1

2008/12/29

1000

Bush

2

2008/11/23

1600

Carter

3

2008/10/05

700

Bush

4

2008/09/28

300

Bush

5

2008/08/06

2000

Adams

6

2008/07/21

100

Carter

现在,我们希望查找每个客户的总金额(总订单)。

我们想要使用 GROUP BY 语句对客户进行组合。

我们使用下列 SQL 语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer

结果集类似这样:

Customer

SUM(OrderPrice)

Bush

2000

Carter

1700

Adams

2000

3. HAVING

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

SQL HAVING 语法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
SQL HAVING 实例

我们拥有下面这个 "Orders" 表:

O_Id

OrderDate

OrderPrice

Customer

1

2008/12/29

1000

Bush

2

2008/11/23

1600

Carter

3

2008/10/05

700

Bush

4

2008/09/28

300

Bush

5

2008/08/06

2000

Adams

6

2008/07/21

100

Carter

现在,我们希望查找订单总金额少于 2000 的客户。

我们使用如下 SQL 语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000

结果集类似:

Customer

SUM(OrderPrice)

Carter

1700

4. INNER JOIN

在表中存在至少一个匹配时,INNER JOIN 关键字返回行。

NNER JOIN 关键字语法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

注释:INNER JOIN 与 JOIN 是相同的。

原始的表 (用在例子中的):

"Persons" 表:

Id_P

LastName

FirstName

Address

City

1

Titan

HW

Oxford Street

London

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

"Orders" 表:

Id_O

OrderNo

Id_P

1

77895

3

2

44678

3

3

22456

1

4

24562

1

5

34764

65

内连接(INNER JOIN)实例

现在,我们希望列出所有人的定购。

您可以使用下面的 SELECT 语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

结果集:

LastName

FirstName

OrderNo

Titan

HW

22456

Titan

HW

24562

Carter

Thomas

77895

Carter

Thomas

44678

INNER JOIN 关键字在表中存在至少一个匹配时返回行。如果 "Persons" 中的行在 "Orders" 中没有匹配,就不会列出这些行。

5. STRAIGHT JOIN

引用 MySQL Official Tutorial 的说法:

STRAIGHT_JOIN is similar to JOIN, except that the left table is always read before the right table. This can be used for those (few) cases for which the join optimizer processes the tables in a suboptimal order.

也就是说,STRAIGHT_JOIN与 JOIN 类似,只不过左表始终在右表之前读取。这可用于联接优化器以次优顺序处理表的那些(少数)情况。

在 4. INNER JOIN 中的 INNER JOIN 语句可以改变为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
STRAIGHT_JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

6. LEFT OUTER JOIN

LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

LEFT JOIN 关键字语法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。

原始的表 (用在例子中的):

"Persons" 表:

Id_P

LastName

FirstName

Address

City

1

Titan

HW

Oxford Street

London

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

"Orders" 表:

Id_O

OrderNo

Id_P

1

77895

3

2

44678

3

3

22456

1

4

24562

1

5

34764

65

左连接(LEFT JOIN)实例

现在,我们希望列出所有的人,以及他们的定购 - 如果有的话。

您可以使用下面的 SELECT 语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

结果集:

LastName

FirstName

OrderNo

Titan

HW

22456

Titan

HW

24562

Carter

Thomas

77895

Carter

Thomas

44678

Bush

George

LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。

7. RIGHT OUTER JOIN

SQL RIGHT JOIN 关键字

RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。

RIGHT JOIN 关键字语法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

注释:在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN。

原始的表 (用在例子中的):

"Persons" 表:

Id_P

LastName

FirstName

Address

City

1

Titan

HW

Oxford Street

London

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

"Orders" 表:

Id_O

OrderNo

Id_P

1

77895

3

2

44678

3

3

22456

1

4

24562

1

5

34764

65

右连接(RIGHT JOIN)实例

现在,我们希望列出所有的定单,以及定购它们的人 - 如果有的话。

您可以使用下面的 SELECT 语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo<br>FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

结果集:

LastName

FirstName

OrderNo

Titan

HW

22456

Titan

HW

24562

Carter

Thomas

77895

Carter

Thomas

44678

34764

RIGHT JOIN 关键字会从右表 (Orders) 那里返回所有的行,即使在左表 (Persons) 中没有匹配的行。

8. NATURAL JOIN

自然连接(NATURAL JOIN)是一种特殊的等价连接,它将表中具有相同名称的列自动进行记录匹配。自然连接不必指定任何同等连接条件。

比如我们有一个 order_info 表,和一个 odrer_detail

order_info 的表结构为

Name

OrderID

Titan

1001

Titan

1002

Titan

1003

Trump

1004

Trump

1005

Trump

1006

Trump

1007

order_detail 的表结构为

OrderID

Price

1001

55

1002

66

1003

77

1004

88

1005

99

1006

100

1007

133

当我们进行NATURAL JOIN 查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM `order_info` NATURAL JOIN `oder_detail`
结果会是:

OrderID

Name

Price

1001

Titan

55

1002

Titan

66

1003

Titan

77

1004

Trump

88

1005

Trump

99

1006

Trump

100

1007

Trump

133

9. CROSS JOIN

如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积

还是上面那个表,我只保留了OrderID为 1001,1002,1005的这三条数据。

SQL语句
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM `order_info` CROSS JOIN `oder_detail`
查询结果

Name

OrderID

OrderID(1)

Price

1001

55

1002

66

1005

99

Titan

1001

1001

55

Titan

1001

1002

66

Titan

1001

1005

99

Titan

1002

1001

55

Titan

1002

1002

66

Titan

1002

1005

99

Trump

1005

1001

55

Trump

1005

1002

66

Trump

1005

1005

99

10. SELF JOIN

SELF JOIN 是内部连接,自连接,可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。

还是查询上面那个 order_info 数据表,用自连接的方式查询OrderID比Trump的订单小的所有订单

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT a.`*` FROM `order_info` a,`order_info` b WHERE b.'name' = `Trump` AND `a`.OrderID <  `b`.OrderID
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020年05月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
记一次mysql错误查询
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
DencyCheng
2018/12/27
5130
快速入门SQL
快速复习一下之前学的SQL。虽然SQL对大小写不敏感,建议关键字使用大写,但是我习惯了小写
皮大大
2021/03/01
6740
快速入门SQL
SQLserver基础语句大全[通俗易懂]
结构化查询语言(Structured Query Language)简称 SQL,是一种特殊目的的编程语言, 是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统; 同时也是数据库脚本文件的扩展名。
全栈程序员站长
2022/08/22
3.8K0
常用sql语句整理
RDBMS 关系型数据库管理系统(relational database management system)
yifei_
2022/11/14
3070
sql数据转换
常用语句 --查询是否有空值 select * from iteminfo where 主供应商 = '' or 主供应商 is null --查询字段是否超出长度 select * from iteminfo where len(单位)>20
学派客
2023/04/07
8610
❤️ 爆肝3天!两万字图文 SQL 零基础入门,不怕你学不会,就怕你不收藏!❤️
SQL语言有40多年的历史,从它被应用至今几乎无处不在。我们消费的每一笔支付记录,收集的每一条用户信息,发出去的每一条消息,都会使用数据库或与其相关的产品来存储,而操纵数据库的语言正是 SQL !
Lucifer三思而后行
2021/09/14
8.6K0
❤️ 爆肝3天!两万字图文 SQL 零基础入门,不怕你学不会,就怕你不收藏!❤️
数据库常用sql语句总结「建议收藏」
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说数据库常用sql语句总结「建议收藏」,希望能够帮助大家进步!!!
Java架构师必看
2022/07/06
23K0
数据库常用sql语句总结「建议收藏」
常用SQL语句集合
一、数据定义 1、创建新数据库:CREATE DATABASE database_name 2、创建新表:CREATE TABLE table_name (column_name datatype,column_name datatype,...) 3、修改数据表:   添加列:ALTER TABLE table_name ADD column_name datatype   删除列:ALTER TABLE table_name DROP COLUMN column_name   修改列:ALTER
小古哥
2018/03/08
7540
重新学习Mysql数据库1:无废话MySQL入门
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
Java技术江湖
2019/11/29
1.3K0
where in与join 查询
Oracle:当前所用版本中,限制in中的参数不能超过 1000个。当超出时会被报错"ORA-01795异常(where in超过1000)的解决"。
WindCoder
2018/09/19
1.9K0
SQL之GROUP BY 语句
合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句。 GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。 SQL GROUP BY 语法 SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name SQL GROUP BY 实例 我们拥有下面这个 "Orders"
互联网金融打杂
2018/04/03
1.1K0
SQL数据分析:从基础入门到进阶,提升SQL能力
SQL语言有40多年的历史,从它被应用至今几乎无处不在。我们消费的每一笔支付记录,收集的每一条用户信息,发出去的每一条消息,都会使用数据库或与其相关的产品来存储,而操纵数据库的语言正是 SQL !
Lucifer三思而后行
2022/01/08
3.4K0
SQL数据分析:从基础入门到进阶,提升SQL能力
有哪些常用的sql语句
首行当然是最基本的增删查改啦,其中最重要的是查。 还有就是一些要注意的地方,就是SQL语句对大小写不敏感,语句中列名对应的值要用单引号''括起来不是双引号。 SQL 使用单引号来环绕文本值。如果是数值,请不要使用引号 特别是C/C++程序员要注意,通常错误都是在用字符串进行拼接SQL语句时,由于双引号和单引号混用,特别容易出错。 一、查:1、SELECT 列名称 FROM 表名称,其中列名可以是多个,中间用豆号分开,如SELECT LastName,FirstName FROM Persons;
java达人
2018/01/31
2K0
SQL---UNION 和 UNION ALL 操作符
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
IT云清
2019/01/22
6680
MySQL 性能优化的 9 种姿势,面试再也不怕了!
Mysql是一种关系型数据库,可以很好地支持大数据量的存储,但是一般来说,数据库中的表越小,在它上面执行的查询也就越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度舍得尽可能小。
程序员小猿
2021/11/23
1.1K0
SQL FULL OUTER JOIN 关键字:左右表中所有记录的全连接解析
SQL RIGHT JOIN关键字返回右表(table2)中的所有记录以及左表(table1)中的匹配记录。如果没有匹配,则左侧的结果为0条记录。
小万哥
2023/11/27
4020
SQL FULL OUTER JOIN 关键字:左右表中所有记录的全连接解析
INSERT INTO SELECT语句与SELECT INTO FROM语句区别
语句形式为:Insert into Table2(field1,field2,…) select value1,value2,… from Table1
全栈程序员站长
2022/09/14
1.8K0
关于SQL中Union和Join的用法
转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)
帘卷西风
2018/08/03
1K0
关于SQL中Union和Join的用法
mysql和sqlserver区别_一定和必须的区别
mysql支持enum,和set类型,sql server不支持 mysql不支持nchar,nvarchar,ntext类型 mysql的递增语句是AUTO_INCREMENT,而sql server是identity(1,1) sql server默认到处表创建语句的默认值表示是((0)),而在mysql里面是不允许带两括号的 mysql需要为表指定存储类型 sql server识别符是[],[type]表示他区别于关键字,但是mysql却是 `,也就是按键1左边的那个符号 sql server支持getdate()方法获取当前时间日期,但是mysql里面可以分日期类型和时间类型,获取当前日期是cur_date(),当前完整时间是 now()函数 mysql支持insert into table1 set t1 = ‘’, t2 = ‘’ ,但是sql server不支持这样写 mysql支持insert into tabl1 values (1,1), (1,1), (1,1), (1,1), (1,1), (1,1), (1,1) sql server不支持limit语句,是非常遗憾的,只能用top 取代limt 0,N,row_number() over()函数取代limit N,M mysql在创建表时要为每个表指定一个存储引擎类型,而sql server只支持一种存储引擎 mysql不支持默认值为当前时间的datetime类型(mssql很容易做到),在mysql里面是用timestamp类型
全栈程序员站长
2022/11/10
3.4K0
MySQL实现全关联 full outer join
SQL LEFT JOIN 关键字 LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。 LEFT JOIN 关键字语法 SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name 注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOI
互联网金融打杂
2018/04/18
2.9K0
MySQL实现全关联 full outer join
相关推荐
记一次mysql错误查询
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验