MySQL之数据表查询语句(SELECT)
定义:
MySQL表单查询是指从一张表的数据中查询所需的数据,主要有查询所有字段、查询指定字段、查询指定记录、查询空值、多条件的查询、对查询结果进行排序等。
基本语法:
MySQL 从数据表中查询数据的基本语句为 SELECT 语句,基本格式如下:
SELECT
{* | <字段列名>}
[
FROM <表 1>, <表 2>…
[WHERE <表达式>
[GROUP BY <group by definition>
[HAVING <expression> [{<operator> <expression>}…]]
[ORDER BY <order by definition>]
[LIMIT[<offset>,] <row count>]
]
其中,各条子句的含义如下:
{*|<字段列名>}
包含星号通配符的字段列表,表示查询的字段,其中字段列至少包含一个字段名称,如果要查询多个字段,多个字段之间要用逗号隔开,最后一个字段后不要加逗号。FROM <表 1>,<表 2>…
,表 1 和表 2 表示查询数据的来源,可以是单个或多个。- WHERE 子句是可选项,如果选择该项,将限定查询行必须满足的查询条件。
GROUP BY< 字段 >
,该子句告诉 MySQL 如何显示查询出来的数据,并按照指定的字段分组。[ORDER BY< 字段 >]
,该子句告诉 MySQL 按什么样的顺序显示查询出来的数据,可以进行的排序有升序(ASC)和降序(DESC)。[LIMIT[<offset>,]<row count>]
,该子句告诉 MySQL 每次显示查询出来的数据条数。
1、使用“*”查询表中的全部内容
在 SELECT 语句中使用星号“*”通配符查询所有字段。
SELECT 查询记录最简单的形式是从一个表中检索所有记录,实现的方法是使用星号“*”通配符指定查找所有列的名称。
语法格式如下:
SELECT * FROM 表名;
【实例 1】从 tb_students_info 表中检索所有字段的数据,输入的 SQL 语句和执行结果如下所示。
创建tb_students_info表
查看
向tb_students_info表中添加数据
单行添加(INSERT...VALUES)
INSERT...VALUES多行同时添加
用SELECT * FROM进行查询,查询所有,显示如下:
由执行结果可知,使用星号“*”通配符时,将返回所有列,数据列按照创建表时的顺序显示。
注意:一般情况下,除非需要使用表中所有的字段数据,否则最好不要使用通配符“*”。使用通配符虽然可以节省输入查询语句的时间,但是获取不需要的列数据通常会降低查询和所使用的应用程序的效率。通配符的优势是,当不知道所需列的名称时,可以通过通配符获取它们。
根据前面 SELECT 语句的格式,SELECT 关键字后面的字段名为将要查找的数据,因此可以将表中所有字段的名称跟在 SELECT 关键字后面,如果忘记了字段名称,可以使用 DESC 命令查看表的结构。
DESC查询表的结构如下:
【实例 2】查询 tb_students_info 表中的所有数据,输入的 SQL 语句和执行结果如下所示。
注意:使用“*”可以返回所有列的数值,但若不需要返回所有列的值,为了提高效率,一般采用 SELECT 字段名列表的形式。
2、查询表中指定字段
查询表中的某一个字段的语法格式为:
SELECT < 列名 > FROM < 表名 >;
【实例 3】查询 tb_students_info 表中 name 列所有学生的姓名,输入的 SQL 语句和执行结果如下所示。
使用 SELECT 声明可以获取多个字段下的数据,只需要在关键字 SELECT 后面指定要查找的字段名称,不同字段名称之间用逗号“,”分隔开,最后一个字段后面不需要加逗号,语法格式如下:
SELECT <字段名1>,<字段名2>,…,<字段名n> FROM <表名>;
【实例 4】从 tb_students_info 表中获取 id、name 和 height 三列,输入的 SQL 语句和执行结果如下所示。
3、MySQL WHERE条件查询
在使用 MySQL SELECT语句时,可以使用 WHERE 子句来指定查询条件,从 FROM 子句的中间结果中选取适当的数据行,达到数据过滤的效果。
语法格式如下:
SELECT <字段1>[,<字段2>..<字段n>] FROM <表名>
WHERE <查询条件> {<判定运算1>,<判定运算2>,…}
其中,判定运算其结果取值为 TRUE、FALSE 和 UNKNOWN。
判定运算的语法分类如下:
- <表达式1>
{=|<|<=|>|>=|<=>|<>|!=}
<表达式2> - <表达式1>
[NOT]LIKE
<表达式2> - <表达式1>
[NOT][REGEXP|RLIKE]
<表达式2> - <表达式1>
[NOT]BETWEEN
<表达式2>AND
<表达式3> - <表达式1>
IS[NOT]NULL
3.1 单一条件的查询语句
【实例 5】在表 tb_students_info 中查询身高为 170cm 的学生的姓名,输入的 SQL 语句和行结果如下所示。
【实例 6】查询年龄小于 22 的学生的姓名,输入的 SQL 语句和执行结果如下所示。
3.2 多条件查询
使用 SELECT 查询时,可以增加查询的限制条件,这样可以使查询的结果更加精确。MySQL 在 WHERE 子句中使用 AND 操作符限定只有满足所有查询条件的记录才会被返回。
可以使用 AND 连接两个甚至多个查询条件,多个条件表达式之间用 AND 分开。
【实例 7】在 tb_students_info 表中查询 age 大于 21,并且 height 大于等于 175 的学生的信息,输入的 SQL 语句和执行结果如下所示。
注意:上例的 WHERE 子句中只包含一个 AND 语句,把两个过滤条件组合在一起,实际上可以添加多个 AND 过滤条件,增加条件的同时增加一个 AND 关键字。
4、使用 LIKE 的模糊查询
字符串匹配的语法格式如下:
SELECT <字段名>[,...<字段n>] FROM <表名>
WHERE <表达式1> [NOT] LIKE <表达式2>;
字符串匹配是一种模式匹配,使用运算符 LIKE 设置过滤条件,过滤条件使用通配符进行匹配运算,而不是判断是否相等进行比较。
相互间进行匹配运算的对象可以是 CHAR、VARCHAR、TEXT、DATETIME 等数据类型。运算返回的结果是 TRUE 或 FALSE。
利用通配符可以在不完全确定比较值的情形下创建一个比较特定数据的搜索模式,并置于关键字 LIKE 之后。可以在搜索模式的任意位置使用通配符,并且可以使用多个通配符。MySQL 支持的通配符有以下两种:
1) 百分号(%)
百分号是 MySQL 中常用的一种通配符,在过滤条件中,百分号可以表示任何字符串,并且该字符串可以出现任意次。
使用百分号通配符要注意以下几点:
- MySQL 默认是不区分大小写的,若要区分大小写,则需要更换字符集的校对规则。
- 百分号不匹配空值。
- 百分号可以代表搜索模式中给定位置的 0 个、1 个或多个字符。
- 尾空格可能会干扰通配符的匹配,一般可以在搜索模式的最后附加一个百分号。
2) 下划线(_)
下划线通配符和百分号通配符的用途一样,下画线只匹配单个字符,而不是多个字符,也不是 0 个字符。
注意:不要过度使用通配符,对通配符检索的处理一般会比其他检索方式花费更长的时间。
【实例 8】在 tb_students_info 表中,查找所有以“T”字母开头的学生姓名,输入的 SQL 的语句和执行结果如下所示。
注意:在搜索匹配时,通配符“%”可以放在不同位置。
【实例 9】在 tb_students_info 表中,查找所有包含“e”字母的学生姓名,输入的 SQL 的语句和执行结果如下所示。
【实例 10】在 tb_students_info 表中,查找所有以字母“y”结尾,且“y”前面只有 4 个字母的学生的姓名,输入的 SQL 语句和执行结果如下所示。
5、日期字段作为条件的查询
以日期字段作为条件,可以使用比较运算符设置查询条件,也可以使用 BETWEEN AND 运算符查询某个范围内的值。
BETWEEN AND 用来查询某个范围内的值,该操作符需要两个参数,即范围的开始值和结束值,若字段值满足指定的范围查询条件,则这些记录被返回。
【实例 11】在表 tb_students_info 中查询注册日期在 2016-01-01 之前的学生的信息,输入的 SQL 语句和执行结果如下所示。
【实例 12】在表 tb_students_info 中查询注册日期在 2015-10-01 和 2016-05-01 之间的学生的信息,输入的 SQL 语句和执行结果如下所示。