SELECT 查询的基础语法

本文详细介绍了SQL查询中的SELECT语句,包括查询列、起别名、去除重复行、排序检索数据、约束返回结果数量及其执行顺序。强调了ORDER BY的用法和SELECT *的不推荐原因,指出其可能带来的性能问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查询列

SELECT name FROM heros; (单列)
SELECT name, hp_max, mp_max  FROM heros; (多列)
SELECT * FROM heros; (所有列)

起别名

SELECT name AS n FROM heros; (AS 可以省略)

查询常数

字符串都用单引号

SELECT '王者荣耀' as platform, name FROM heros

去除重复行

SELECT DISTINCT attack_range FROM heros;
SELECT DISTINCT attack_range, name FROM heros;
  1. DISTINCT 需要放到所有列名的前面,如果写成SELECT name, DISTINCT attack_range FROM heros会报错。
  2. DISTINCT 其实是对后面所有列名的组合进行去重

排序检索数据

  1. 排序的列名
    ORDER BY 后面可以有一个或多个列名,如果是多个列名进行排序,会按照后面第一个列先进行排序,当第一列的值相同的时候,再按照第二列进行排序,以此类推。
  2. 排序的顺序
    ORDER BY 后面可以注明排序规则,ASC代表递增排序,DESC 代表递减排序。如果没有注明排序规则,默认情况下是按照 ASC 递增排序。
  3. 非选择列排序
    ORDER BY 可以使用非选择列进行排序,所以即使在 SELECT 后面没有这个列名,你同样可以放到 ORDER BY 后面进行排序。
  4. ORDER BY 的位置
    ORDER BY 通常位于 SELECT 语句的最后一条子句,否则会报错。

约束返回结果的数量

英雄名称及最大生命值,按照最大生命值从高到低排序,返回 5 条记录

SELECT name, hp_max FROM heros ORDER BY hp_max DES LIMIT 0,5; (从0开始,不包含5)

SELECT 的执行顺序

关键字的顺序

SELECT ...
 FROM ... 
 WHERE ... 
 GROUP BY ... 
 HAVING ... 
 ORDER BY

SELECT 语句的执行顺序

FROM > WHERE > GROUP BY > HAVING > SELECT 的字段 > DISTINCT> ORDER BY

SELECT DISTINCT player_id, player_name, count(*) as nums # 顺序5
FROM player JOIN team ON player.team_id = team.team_id # 顺序
WHERE height > 1.80 # 顺序 2
GROUP BY player.team_id # 顺序 3
HAVING num > 2 # 顺序 4
ORDER BY num DESC # 顺序 6
LIMIT 2 # 顺序 7

在 SELECT 语句执行这些步骤的时候,每个步骤都会产生一个虚拟表,然后将这个虚拟表传入下一个步骤中作为输入。

这些步骤隐含在 SQL 的执行过程中,对于我们来说是不可见的

一、首先先执行 FROM 这一步的。在这个阶段,如果是多张表联查,还会经历下面的几个步骤:

  1. 首先先通过 CROSS JOIN 求笛卡尔积,相当于得到虚拟表 vt(virtual table)1-1;
  2. 通过 ON 进行筛选,在虚拟表 vt1-1 的基础上进行筛选,得到虚拟表 vt1-2;
  3. 添加外部行。如果我们使用的是左连接、右链接或者全连接,就会涉及到外部行,也就是在虚拟表 vt1-2 的基础上增加外部行,得到虚拟表 vt1-3。

二、最终的虚拟表vt1,就可以在此基础上再进行 WHERE 阶段。在这个阶段中,会根据 vt1 表的结果进行筛选过滤,得到虚拟表 vt2。

三、第三步和第四步,也就是 GROUP 和 HAVING 阶段。在这个阶段中,实际上是在虚拟表 vt2 的基础上进行分组和分组过滤,得到中间的虚拟表 vt3 和 vt4。

四、SELECT 阶段会提取想要的字段,然后在 DISTINCT阶段过滤掉重复的行,分别得到中间的虚拟表 vt5-1 和vt5-2。

五、提取了想要的字段数据之后,就可以按照指定的字段进行排序,也就是 ORDER BY 阶段,得到虚拟表 vt6。

六、 vt6 的基础上,取出指定行的记录,也就是 LIMIT阶段,得到最终的结果,对应的是虚拟表 vt7。

SELECT * 为什么不推荐

  • 数据库需要去解析 * 包含哪些字段
  • 增加了网络传输量,因为含有跟业务需求无关的数据
  • 覆盖索引,影响性能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值