提示:从该章开始结合极客时间《SQL必知必会》
select语句
为了使用select语句, 必须至少给出两条信息——想选择什么,以及从哪里选择。
select 列名1,列名2… from 表名
可以检索单个、多个、全部列。
SELECT prod_name FROM products; #单个
SELECT prod_id, prod_name,prod_price FROM products; # 多个列
SELECT * FROM products; # 全部
注意: 一般,除非你确定需要表中的每一个列,否则最好不要使用通配符 *,因为检索不需要的列通常会降低检索和应用程序的性能。
检索不同的行
在第一个列名前使用关键字DISTINCT。
**注意: **
- DISTINCT需要放到所有列名的前面。
- DISTINCT其实是对后面所有的列名的组合去重。
select vend_id from products;
select distinct vend_id from products; # 去重
限制结果 Limit
查询返回查询结果的第一行或前几行,可以使用LIMIT语句
SELECT prod_name FROM products LIMIT 5; # 返回不多于5行
可以指定要检索的开始行和行数
SELECT prod_name FROM products LIMIT 5,5; # 从行5开始的5行
注意:
- 行0: 检索出来的第一行为行0而不是行1。因此LIMIT 1,1检索出来的是第二行而不是第一行。
- 在行数不够时只返回它能够返回的那么多行
- LIMIT 3,4的意思是从行3开始的4行,这容易把人弄糊涂。因此有另一种写法,LIMIT 4 OFFSET 3意为从行3开始取4行。
使用完全限定的表面
SELECT products.`prod_name` FROM products;
SELECT products.`prod_name` FROM mysqlstudy.`products`;
排序
使用ORDER BY 子句排序检索数据
-
排序的列名:ORDER BY 后面可以有一个或多个列名,如果是多个列名进行排序,会按照后面第一个列先进行排序,当第一列的值相同的时候,再按照第二列进行排序,以此类推。
-
排序的顺序:ORDER BY 后面可以注明排序规则,ASC 代表递增排序,DESC 代表递减排序。如果没有注明排序规则,默认情况下是按照 ASC 递增排序。我们很容易理解 ORDER BY 对数值类型字段的排序规则,但如果排序字段类型为文本数据,就需要参考数据库的设置方式了,这样才能判断 A 是在 B 之前,还是在 B 之后。比如使用 MySQL 在创建字段的时候设置为 BINARY 属性,就代表区分大小写。
-
非选择列排序:ORDER BY 可以使用非选择列进行排序,所以即使在 SELECT 后面没有这个列名,你同样可以放到 ORDER BY 后面进行排序。
-
ORDER BY 的位置:ORDER BY 通常位于 SELECT 语句的最后一条子句,否则会报错。
补充
查询常数
SELECT 查询还可以对常数进行查询。对的,就是在 SELECT 查询结果中增加一列固定的常数列。这列的取值是我们指定的,而不是从数据表中动态取出的。 你可能会问为什么我们还要对常数进行查询呢?SQL 中的 SELECT 语法的确提供了这个功能,一般来说我们只从一个表中查询数据,通常不需要增加一个固定的常数列,但如果我们想整合不同的数据源,用常数列作为这个表的标记,就需要查询常数。比如说,我们想对 heros 数据表中的英雄名进行查询,同时增加一列字段platform,这个字段固定值为“王者荣耀”,可以这样写:
SELECT '王者荣耀' as platform, name FROM heros
在这个 SQL 语句中,我们虚构了一个platform字段,并且把它设置为固定值“王者荣耀”。需要说明的是,如果常数是个字符串,那么使用 单引号(‘’) 就非常重要了,比如‘王者荣耀’。单引号说明引号中的字符串是个常数,否则 SQL 会把王者荣耀当成列名进行查询,但实际上数据表里没有这个列名,就会引起错误。如果常数是英文字母,比如’WZRY’也需要加引号。如果常数是个数字,就可以直接写数字,不需要单引号,比如:
SELECT 123 as platform, name FROM heros
SELECT 的执行顺序
查询是 RDBMS 中最频繁的操作。我们在理解 SELECT 语法的时候,还需要了解 SELECT 执行时的底层原理。只有这样,才能让我们对 SQL 有更深刻的认识。
- 关键字的顺序是不能颠倒的:
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...
- SELECT 语句的执行顺序:
FROM > WHERE > GROUP BY > HAVING > SELECT的字段 > DISTINCT > ORDER BY > LIMIT
比如你写了一个 SQL 语句,那么它的关键字顺序和执行顺序是下面这样的:
SELECT DISTINCT player_id, player_name, count(*) as num #顺序5
FROM player JOIN team ON player.team_id = team.team_id #顺序1
WHERE height > 1.80 #顺序2
GROUP BY player.team_id #顺序3
HAVING num > 2 #顺序4
ORDER BY num DESC #顺序6
LIMIT 2 #顺序7
总结
https://time.geekbang.org/column/article/102111