home1.gif


在 MySQL 中,使用 SELECT 语句来查询数据。

SELECT 的语法格式如下:

  1. SELECT
  2. {* | <字段列名>}
  3. [
  4. FROM <表 1>, <表 2>…
  5. [WHERE <表达式>]
  6. [GROUP BY <group by definition>]
  7. [HAVING <expression> [{<operator> <expression>}…]]
  8. [ORDER BY <order by definition>]
  9. [LIMIT[<offset>,] <row count>]
  10. ]

其中:

  • {*|<字段列名>}包含星号通配符的字段列表,表示所要查询字段的名称。<表 1>,<表 2>…,表 1 和表 2 表示查询数据的来源,可以是单个或多个。
  • WHERE <表达式>,是可选项,如果选择该项,将限定查询数据必须满足该查询条件。
  • GROUP BY< 字段 >,是可选项,该子句告诉 MySQL 如何显示查询出来的数据,并按照指定的字段分组。
  • [ORDER BY< 字段 >],是可选项,该子句告诉 MySQL 按什么样的顺序显示查询出来的数据,升序(ASC)和降序(DESC),默认情况下是升序。
  • [LIMIT[,]],是可选项,该子句告诉 MySQL 每次显示查询出来的数据条数。

goon.gif

一. 字段查询

语法格式如下:

  1. SELECT {* | <指定字段列名>} FROM <表 1>, <表 2>…;

1. 查询表中所有字段


查询所有字段是指查询表中所有字段的数据,有 2 种方式查询表中的所有字段。

  • 使用“*”通配符查询所有字段
  • 列出表的所有字段

【实例1】查询 istester 表的所有数据

  1. SELECT * FROM istester;
  2. SELECT (id, uname, sex, birth, department, address, idoxu) FROM istester;

2. 查询表中指定字段


【实例2】只查询表 istester 中 id, uname, idoxu 字段的数据

  1. SELECT (id, uname, idoxu) FROM istester;

3. 设置别名


goon.gif

二. 条件查询

语法格式如下:

  1. WHERE <查询条件> {<判定运算1>,<判定运算2>,…}

其中,判定运算的语法分类如下:

  • <表达式1>{=|<|<=|>|>=|<=>|<>|!=}<表达式2>
  • <表达式1>[NOT]LIKE<表达式2>
  • <表达式1>[NOT][REGEXP|RLIKE]<表达式2>
  • <表达式1>[NOT]BETWEEN<表达式2>AND<表达式3>
  • <表达式1>IS[NOT]NULL

判定运算其结果取值为 TRUE、FALSE 和 UNKNOWN。

1. 单一条件的查询语句


如下。

【实例3】查询表 istester 中id=1,表 idoxu 中 grade=100 的数据

  1. SELECT * FROM istester where id=1;
  2. SELECT * FROM idoxu where grade=100;

2. 多条件的查询语句


【实例4】

【实例5】

3. 模糊查询 (like)


字符串匹配的语法格式如下:

  1. <字段名> [NOT] LIKE <表达式2>

字符串匹配是一种模式匹配,使用运算符 LIKE 设置过滤条件,过滤条件使用通配符进行匹配运算,而不是判断是否相等进行比较。

MySQL 支持的通配符有以下两种:

  • 百分号(%)

百分号是 MySQL 中常用的一种通配符,在过滤条件中,百分号可以表示任何字符串,并且该字符串可以出现任意次。
使用百分号通配符要注意以下几点:

  • MySQL 默认是不区分大小写的,若要区分大小写,则需要更换字符集的校对规则。
  • 百分号不匹配空值。
  • 百分号可以代表搜索模式中给定位置的 0 个、1 个或多个字符。
  • 尾空格可能会干扰通配符的匹配,一般可以在搜索模式的最后附加一个百分号。
    • 下划线(_)

下划线通配符和百分号通配符的用途一样,下画线只匹配单个字符,而不是多个字符,也不是 0 个字符。

【实例6】查找 idoxu 表,名称(c_name)包含 “i” 的数据

  1. select * from idoxu where c_name like '%i%';

【实例7】查找 istester 表,id 包含 “1” 的数据

  1. select * from istester where id like '%1%';

注意:不要过度使用通配符,对通配符检索的处理一般会比其他检索方式花费更长的时间。

goon.gif

三. 其它子查询

1. 对查询结果排序 (order by)


在 MySQL SELECT 语句中,ORDER BY 子句主要用来将结果集中的数据按照一定的顺序进行排序。

其语法格式为:

  1. ORDER BY {<列名> | <表达式> | <位置>} [ASC|DESC]

说明如下:

  • 列名

指定用于排序的列。可以指定多个列,列名之间用逗号分隔。

  • 表达式

指定用于排序的表达式。

  • 位置

指定用于排序的列在 SELECT 语句结果集中的位置,通常是一个正整数。

  • ASC|DESC

关键字 ASC 表示按升序分组,关键字 DESC 表示按降序分组,其中 ASC 为默认值。这两个关键字必须位于对应的列名、表达式、列的位置之后。

使用 ORDER BY 子句应该注意以下几个方面:

  • ORDER BY 子句中可以包含子查询。
  • 当排序的值中存在空值时,ORDER BY 子句会将该空值作为最小值来对待。
  • 当在 ORDER BY 子句中指定多个列进行排序时,MySQL 会按照列的顺序从左到右依次进行排序。
  • 查询的数据并没有以一种特定的顺序显示,如果没有对它们进行排序,则将根据插入到数据表中的顺序显示。使用 ORDER BY 子句对指定的列数据进行排序。

【实例8】查找 istester 表,按 id 升序/降序

  1. #升序 asc
  2. select * from istester order by id; # 等同 select * from istester order by id asc;
  3. #降序 desc
  4. select * from istester order by id desc;

【实例9】查找 istester 表,id 包含 “1” 的数据,按id降序

  1. select * from istester where id like '%1%' order by id desc;

2. 限制查询结果的记录条数 (limit)


MySQL SELECT 语句,返回的是所有匹配的行。在某些时候我们仅需要返回第一行或者前几行,这时就需要用到 limit 子句。

基本的语法格式:

  1. <LIMIT> [<位置偏移量>,] <行数>

说明:

  1. limit 接受一个或两个数字参数。参数必须是一个整数常量。
  2. 如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。

【实例10】查找 istester 表,id 包含 “1” 的数据,取 id 最大的三个

  1. select * from istester where id like '%1%' order by id desc limit 3;

【实例11】查找 idoxu 表,取分数 grade 排名第 4-10 名

  1. select * from idoxu order by grade desc limit 3, 7;

注意:第一条记录的位置偏移量是0,故第4名的偏移量是(index=)3

3. 去重 (distinct)


上面提到,MySQL SELECT 语句,返回的是所有匹配的行,而往往这些数据记录中有一些重复的值,所以出于对数据分析的需求,需要消除重复的记录。

过滤重复数据使用 distinct 关键字。

基本的语法格式:

  1. SELECT DISTINCT <字段名> FROM <表名>;

【实例12】查询 istester 表有几种性别 sex 类型

  1. select count(distinct sex) as totalSex from istester;

4. 去重


5. 去重


end1.gif