MySQL 基础语法,select 查询相关。

0. 数据表

接下来的示例会使用一个 world 数据表,表中存储了世界上的所有国家的相关信息。

name:国家名称

continent:洲份

area:面积

population:人口

gdp:国内生产总值

1. SELECT 查询语句

SELECT 查询语句

SELECT 语句,从表中查询一个或多个数据列。

SELECT 语句包含了两个部分,查询什么,以及从什么地方查询。

查询所有国家的名称
SELECT name FROM world;

SELECT 多列查询

想从表中查询出多列数据,使用相同的 SELECT 语句。区别是在 SELELCT 关键字后给出多个列名,列名之间使用逗号间隔。

// 多个列名之间使用逗号间隔

// 查询所有国家的名称和人口
SELECT name, population FROM world;

SELECT 所有列查询

除了可以指定查询列外,还可以使用 (*) 通配符查询表中所有的列。

// 使用 (*) 通配符查询所有列

// 查询所有国家的所有信息
SELECT * FROM world;

注意: 除了明确需要表中的所有列,否则最好别使用 (*) 通配符。查询不需要的列通常会降低查询和应用程序的性能。

DISTINCT 查询不同行

SELECT 返回的所有匹配的行,但是有可能出现重复的数据。使用 DISTINCT 关键字只会返回不同的数据(去重复)。

// 使用 DISTINCT 关键字去除重复的数据

// 查询世界上的所有洲份
SELECT DISTINCT continent FROM world;

LIMIT 限制结果

使用 LIMIT 子句可以对结果进行截取。比如,截取返回结果前几行。

// 使用 LIMIT 子句对结果进行截取

// 查询结果中前5个国家名称
SELECT name FROM world LIMIT 5;

LIMIT 子句使用两个参数可以在结果的中间进行截取。第一个参数为开始位置,第二个参数为需要查询的行数。

// 使用 LIMIT 子句对结果进行截取

// 查询结果中从行5开始的5个国家名称
SELECT name FROM world LIMIT 5,5;

注意: 查询出来的结果是从“行0”开始而不是“行1”,所以“行5”实际上是第六行。

2. ORDER BY 排序子句

ORDER BY 排序子句

ORDER BY 子句,根据需要排序查询出的数据。

在上面的示例中,查询结果都是没有特定顺序的。使用 ORDER BY 子句可以根据需要对结果进行排序。

// 使用 ORDER BY 子句对结果排序

// 根据人口排序。查询所有国家的名称和人口
SELECT name, population FROM world ORDER BY population;

提示: ORDER BY 子句还可以使用非查询列进行排序。

ORDER BY 多列排序

ORDER BY 子句还可以对多个列进行排序,首先排序的列放在前,后排序的列放在后。

// 使用 ORDER BY 子句进行多列排序

// 首先根据洲份的字母进行排序,相同洲份的再根据gdp进行排序。查询所有国家的洲份和名称。
SELECT continent, name FROM world ORDER BY continent, gdp;

ORDER BY 排序方向

在上面的示例中,都没有明确说明排序的方向,是因为默认为升序排序。如果希望进行降序排序使用 DESC 关键字。

// 使用 ORDER BY 子句进行多列排序

// 首先根据洲份的字母进行升序排序,相同洲份的再根据gdp进行降序排序。查询所有国家的洲份和名称。
SELECT continent, name FROM world ORDER BY continent, gdp DESC

注意: DESC 关键字只应用于前面一个列名,不同的列需要单独指明。与 DESC 相反的是 ASC (升序) ,因为默认就是升序所以不常用。

3. WHERE 数据过滤

WHERE 数据过滤

WHERE 子句,指定查询条件。

数据库表包含了大量的数据,我们通常只需要获取我们需要的特定的数据。使用 WHERE 子句指定查询条件进行数据过滤,获取我们需要的数据。

// 使用 WHERE 子句进行数据过滤

// 查询国家面积大于 5000000 平方公里的国家名称和面积
SELECT name, area FROM world WHERE area > 5000000;

基本操作符

基本操作符的使用与上个示例类似。

操作符 说明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于

BETWEEN 范围值操作符

BETWEEN 操作符用于检查某个范围的值,第一个值为开始值,第二值为结束值。

// 使用 BETWEEN 进行范围值查询

// 查询国家面积在 200000 到 250000 平方公里范围内的国家名称和面积
SELECT name, area FROM world WHERE area BETWEEN 200000 AND 250000;

NULL 空值

NULL 是指无值,与 0,空字符或仅包含空格的值不同。

// 使用 NULL 进行查询

// 查询gpd为空值的国家名称
SELECT name FROM world WHERE gdp IS NULL;

WHERE 多条件数据过滤

通常我们还需要进行多个条件的数据过滤,我们就需要使用 AND/OR 子句对 WHERE 子句进行组合。

AND 子句

// 使用 AND 子句组合条件

// 查询面积大于 2000000 平方公里且人口大于 250000000的国家名称、人口和面积
SELECT name, population, area FROM world WHERE area > 2000000 AND population > 250000000;

OR 子句

// 使用 OR 子句组合条件

// 查询面积大于 2000000 平方公里或人口大于 250000000的国家名称、人口和面积
SELECT name, population, area FROM world WHERE area > 2000000 OR population > 250000000;

计算次序

当 AND/OR 混合使用时,AND 子句优先度更高。可以使用圆括号明确计算次序。

// AND OR 混合使用

// 首先处理 AND 子句,后处理 OR 子句
SELECT name, continent, area FROM world
WHERE continent = 'Asia' OR continent = 'Europe' AND area > 2000000;

// 使用圆括号明确计算次序
// 查询亚洲或欧洲面积大于 2000000 平方公里的国家名称、洲份和面积
SELECT name, continent, area FROM world
WHERE (continent = 'Asia' OR continent = 'Europe') AND area > 2000000;

IN 条件范围操作符

IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配。

// 使用 IN 操作符

// 与上面示例结果相同
// 查询亚洲或欧洲面积大于 2000000 平方公里的国家名称、洲份和面积
SELECT name, continent, area FROM world
WHERE continent IN ('Asia', 'Europe') AND area > 2000000;

可以看出,IN 操作符与 OR 子句效果相同。

continent IN (‘Asia’, ‘Europe’) 等同于 (continent = ‘Asia’ OR continent = ‘Europe’)。

为什么使用 IN 操作符

  1. 语法更清晰直观。
  2. 计算次序更容易管理(操作符更少)。
  3. IN 操作符比 OR 子句执行更快。
  4. IN 可以包含其他 SELECT 语句,使得可以动态建立 WHERE 子句。

NOT 否定操作符

NOT 操作符用于否定条件。

// 使用 NOT 操作符

// 查询不在亚洲和欧洲的国家名称
SELECT name FROM world WHERE continent NOT IN ('Asia', 'Europe');

4. LIKE 模糊查询

LIKE 模糊查询

LIKE 操作符,利用通配符进行模糊查询。

(%) 通配符,匹配任意数量的任意字符。

// 使用 (%) 通配符进行模糊查询

// 查询国家名称为‘A’开头的国家名称。
SELECT name FROM world WHERE name LIKE 'A%';

(_) 通配符,匹配单个任意字符。

// 使用 (_) 通配符进行模糊查询

// 查询国家名称为四个字符的国家名称。
SELECT name FROM world WHERE name LIKE '____';

通配符使用技巧

  1. 通配符搜索时间会更长,不要过度使用通配符。
  2. 除非绝对有必要,否则不要在开始处使用通配符。这种情况搜索起来最慢。
  3. 注意通配符位置,避免放错位置。

5. REGEXP 正则表达式操作符

REGEXP 正则表达式操作符

REGEXP 操作符,可以使用正则表达式控制数据过滤。

// 使用 REGEXP 操作符

// 在引号内使用正则表达式
SELECT xxx FROM xxx WHERE xxx REGEXP '[正则表达式]'

涉及正则表达式语法,所以就不做演示了。

6. UNION 组合查询操作符

大多数 SQL 查询都只会包含单条 SELECT 语句返回的数据,MySQL 也支持执行多条 SELELCT。使用 UNION 操作符可以将合并数条 SQL 查询。

// 使用 UNION 合并查询

// 查询亚洲国家和欧洲国家的名称
SELECT name FROM world WHERE continent = 'Asia'
UNION
SELECT name FROM world WHERE continent = 'Europe';

使用 WHERE 多条件过滤同样能达到 UNION 的效果。上面的示例可能不太明显,在处理复杂的查询时,UNION 操作符可能会比 WHERE 多条件更加清晰。

UNION 规则

  1. 必须由两条或两条以上 SELECT 语句组成。
  2. SELECT 语句必须包含相同的列、表达式或聚集函数。
  3. 列数据类型必须兼容。

PS: 在使用 UNION 操作符时,不同的 SELECT 语句查询出相同的结果时默认会去除重复数据。如果希望保留重复数据可以使用 UNION ALL 操作符(这是 WHERE 多条件做不到的)。

UNION 组合查询排序

UNION 排序与 SELECT 有所不同,UNION 不允许每条 SELECT 单独排序。UNION 统一在多条 SELECT 语句后进行排序。

// 使用 UNION 合并查询排序

// 查询亚洲国家和欧洲国家的名称,根据洲份和名称排序
SELECT name FROM world WHERE continent = 'Asia'
UNION
SELECT name FROM world WHERE continent = 'Europe';
ORDER BY continent, name;

评论