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

一. 字段查询
语法格式如下:
SELECT {* | <指定字段列名>} FROM <表 1>, <表 2>…;
1. 查询表中所有字段
查询所有字段是指查询表中所有字段的数据,有 2 种方式查询表中的所有字段。
- 使用“*”通配符查询所有字段
- 列出表的所有字段
【实例1】查询 istester 表的所有数据
SELECT * FROM istester;SELECT (id, uname, sex, birth, department, address, idoxu) FROM istester;
2. 查询表中指定字段
【实例2】只查询表 istester 中 id, uname, idoxu 字段的数据
SELECT (id, uname, idoxu) FROM istester;
3. 设置别名

二. 条件查询
语法格式如下:
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 的数据
SELECT * FROM istester where id=1;SELECT * FROM idoxu where grade=100;
2. 多条件的查询语句
【实例4】
【实例5】
3. 模糊查询 (like)
字符串匹配的语法格式如下:
<字段名> [NOT] LIKE <表达式2>
字符串匹配是一种模式匹配,使用运算符 LIKE 设置过滤条件,过滤条件使用通配符进行匹配运算,而不是判断是否相等进行比较。
MySQL 支持的通配符有以下两种:
- 百分号(%)
百分号是 MySQL 中常用的一种通配符,在过滤条件中,百分号可以表示任何字符串,并且该字符串可以出现任意次。
使用百分号通配符要注意以下几点:
- MySQL 默认是不区分大小写的,若要区分大小写,则需要更换字符集的校对规则。
- 百分号不匹配空值。
- 百分号可以代表搜索模式中给定位置的 0 个、1 个或多个字符。
- 尾空格可能会干扰通配符的匹配,一般可以在搜索模式的最后附加一个百分号。
- 下划线(_)
下划线通配符和百分号通配符的用途一样,下画线只匹配单个字符,而不是多个字符,也不是 0 个字符。
【实例6】查找 idoxu 表,名称(c_name)包含 “i” 的数据
select * from idoxu where c_name like '%i%';
【实例7】查找 istester 表,id 包含 “1” 的数据
select * from istester where id like '%1%';
注意:不要过度使用通配符,对通配符检索的处理一般会比其他检索方式花费更长的时间。

三. 其它子查询
1. 对查询结果排序 (order by)
在 MySQL SELECT 语句中,ORDER BY 子句主要用来将结果集中的数据按照一定的顺序进行排序。
其语法格式为:
ORDER BY {<列名> | <表达式> | <位置>} [ASC|DESC]
说明如下:
- 列名
指定用于排序的列。可以指定多个列,列名之间用逗号分隔。
- 表达式
指定用于排序的表达式。
- 位置
指定用于排序的列在 SELECT 语句结果集中的位置,通常是一个正整数。
- ASC|DESC
关键字 ASC 表示按升序分组,关键字 DESC 表示按降序分组,其中 ASC 为默认值。这两个关键字必须位于对应的列名、表达式、列的位置之后。
使用 ORDER BY 子句应该注意以下几个方面:
- ORDER BY 子句中可以包含子查询。
- 当排序的值中存在空值时,ORDER BY 子句会将该空值作为最小值来对待。
- 当在 ORDER BY 子句中指定多个列进行排序时,MySQL 会按照列的顺序从左到右依次进行排序。
- 查询的数据并没有以一种特定的顺序显示,如果没有对它们进行排序,则将根据插入到数据表中的顺序显示。使用 ORDER BY 子句对指定的列数据进行排序。
【实例8】查找 istester 表,按 id 升序/降序
#升序 ascselect * from istester order by id; # 等同 select * from istester order by id asc;#降序 descselect * from istester order by id desc;
【实例9】查找 istester 表,id 包含 “1” 的数据,按id降序
select * from istester where id like '%1%' order by id desc;
2. 限制查询结果的记录条数 (limit)
MySQL SELECT 语句,返回的是所有匹配的行。在某些时候我们仅需要返回第一行或者前几行,这时就需要用到 limit 子句。
基本的语法格式:
<LIMIT> [<位置偏移量>,] <行数>
说明:
- limit 接受一个或两个数字参数。参数必须是一个整数常量。
- 如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
【实例10】查找 istester 表,id 包含 “1” 的数据,取 id 最大的三个
select * from istester where id like '%1%' order by id desc limit 3;
【实例11】查找 idoxu 表,取分数 grade 排名第 4-10 名
select * from idoxu order by grade desc limit 3, 7;
注意:第一条记录的位置偏移量是0,故第4名的偏移量是(index=)3
3. 去重 (distinct)
上面提到,MySQL SELECT 语句,返回的是所有匹配的行,而往往这些数据记录中有一些重复的值,所以出于对数据分析的需求,需要消除重复的记录。
过滤重复数据使用 distinct 关键字。
基本的语法格式:
SELECT DISTINCT <字段名> FROM <表名>;
【实例12】查询 istester 表有几种性别 sex 类型
select count(distinct sex) as totalSex from istester;
4. 去重
5. 去重

