数据查询
9.1 基本查询语句
SELECT语句是最常用的查询语句,它的使用方式有些复杂,但功能是相当强大的。SELECT语句的基本语法如下:
- 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
- SELECT 命令可以读取一条或者多条记录。
- 你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
- 你可以使用 WHERE 语句来包含任何条件。
- 你可以使用 LIMIT 属性来设定返回的记录数。
- 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
9.2 表单查询
单表查询是指从一张表中查询所需要的数据。所有查询操作都比较简单。
9.2.1 查询所有字段
查询所有字段是指查询表中所有字段的数据。这种方式可以将表中所有字段的数据都查询出来。在MySQL中可以使用“*”代表所有的列,即可查出所有的字段,语法格式: SELECT * FROM 表名;
9.2.2 查询指定字段
查询指定字段可以使用的语法格式: SELECT 字段名 FROM 表名;
如果是查询多个字段,可以使用“,”对字段进行分隔。
9.2.3 查询指定数据
如果要从很多记录中查询出指定的记录,那么就需要一个查询的条件。设定查询条件应用的是WHERE子句。通过它可以实现很多复杂的条件查询。在使用WHERE子句时,需要使用一些比较运算符来确定查询的条件。
运算符 | 作用 |
---|---|
= | 等于 |
<=> | 安全的等于 |
<>或!= | 不等于 |
<= | 小于等于 |
>= | 大于等于 |
> | 大于 |
IS NULL | 判断一个值是否为NULL |
IS NOT NULL | 判断一个值是否不为NULL |
LEAST | 在有两个或多个参数时,返回最小值 |
GREATEST | 当有2或多个参数时,返回最大值 |
BETWEEN AND | 判断一个值是否落在两个值之间 |
NOT LIKE | 通配符匹配 |
IN | 判断一个值是否落在两个值之间 |
NOT IN | 判断一个值不是IN列表中的任意一个值 |
LIKE | 通配符匹配 |
REGEXP | 正则表达式匹配 |
9.2.4 带IN关键字的查询
IN关键字可以判断某个字段的值是否在于指定的集合中。如果字段的值在集合中,则满足查询条件,该记录将被查询出来;如果不在集合中,则不满足查询条件。其语法格式:
SELECT * FROM 表名 WHERE 条件 [NOT] IN(元素1,元素2,…,元素n);
- [NOT]:可选项,加上NOT表示不在集合内满足条件
- 元素:表示集合中的元素,各元素之间用逗号隔开,字符型元素需要加上单引号
9.2.5 带BETWEEN AND的范围查询
BETWEEN AND关键字可以判断某个字段的值是否在指定的范围内。如果字段的值在指定范围内,则满足查询条件,该记录将被查询出来。如果不在指定范围内,则不满足查询条件。其语法格式:
SELECT * FROM 表名 WHERE 条件 [NOT] BETWEEN 取值1 AND 取值2;
- [NOT]:可选项,加上NOT表示不在集合内满足条件
- 取值1 :表示范围的起始值
- 取值2 :表示范围的终止值
9.2.6 带LIKE的字符匹配查询
LIKE属于较常用的比较运算符,通过它可以实现模糊查询。它有两种通配符:“%”和下划线“_”;
通配符:% 任意0到多个字符 ;_ 任意单个字符
说明:字符串“p”和“入”都算作一个字符,在这点上英文字母和中文字母是没有区别的
9.2.7 用IS NULL关键字查询空值
IS NULL关键字可以用来判断字段的值是否为空值(NULL)。如果字段的值是空值,则满足查询条件,该记录将被查询出来。如果字段的值不是空值,则不满足查询条件。其语法格式: IS [NOT] NULL
其中,“NOT”是可选项,表示字段不是空值时满足条件
9.2.8 带AND的多条件查询
AND关键字可以用来联合多个条件进行查询。使用AND关键字时,只有同时满足所有查询条件的记录会被查询出来。如果不满足这些查询条件的其中一个,这样的记录将被排除掉。AND关键字的语法格式:
select * from 数据表名 where 条件1 and 条件2 […AND 条件表达式n];
关键字AND连接两个表达式,可以同时使用多个关键字AND来连接多个表达式
9.2.9 带OR的多条件查询
OR关键字也可以用来联合多个条件进行查询,但是与AND关键字不同,OR关键字只要满足查询条件中的一个,那么此记录就会被查询出来;如果不满足这些查询条件中的任何一个,这样的记录将被排除掉。OR关键字的语法格式:
select * from 数据表名 where 条件1 OR 条件2 […OR 条件表达式n];
关键字OR可以用来连接两个条件表达式,也可以同时使用多个关键字OR来连接多个条件表达式
9.2.10 用ORDER BY关键字对查询结果排序
使用ORDER BY可以对查询的结果进行升序(ASC)和降序(DESC)排列,在默认情况下,ORDER BY按升序输出结果。如果要按降序排列可以使用DESC来实现。语法格式: ORDER BY 字段名 [ASC|DESC];
说明:对含有NULL值得列进行排序时,如果是按升序排列,NULL值将出现在最前面;如果是按降序排列,NULL值将出现在最后面。
9.2.11 用DISTINCT关键字去除结果中的重复行
使用DISTINCT关键字可以去除查询结果中的重复记录,语法格式: select distinct 字段名 from 表名;
9.2.12 用GROUP BY关键字分组查询
通过GROUP BY子句可以将数据划分到不同的组中,实现对记录进行分组查询。在查询时,所查询的列必须包含在分组的列中,目的是使查询到的数据没有矛盾。
1. 使用关键字GROUP BY来分组
单独使用关键字GROUP BY查询结果只显示每组的一条记录
2.关键字GROUP BY与GROUP_CONCAT()函数一起使用
使用关键字GROUP BY与GROUP_CONCAT()函数查询,可以将每组中的所有字段值都显示出来
3.按多个字段进行分组
使用关键字GROUP BY也可以按多个字段进行分组
9.2.13 用LIMIT限制查询结果的数量
查询数据时,可能会查询出很多的记录。而用户需要的记录可能只是很少的一部分。这样就需要来限制查询结果的数量。LIMIT是MySQL中的一个特殊关键字。LIMIT子句可以对查询结果的记录条数进行限定,控制它输出的行数。
9.3 聚合函数查询
聚合函数的最大特点是它们根据一组数据求出一个值。聚合函数的结果值只根据选定行中非NULL的值进行计算,NULL值被忽略。
9.3.1 COUNT()函数
COUNT()函数,对于除“*”以外的任何参数,返回所选择集合中非NULL值的行的数目;对于参数“*”,返回选择集合中所有行的数目,包含NULL值的行。没有WHERE子句的COUNT(*)是经过内部优化的,能够快速的返回表中所有的记录总数。
9.3.2 SUM()函数
SUM()函数可以求出表中某个字段取值的总和。
9.3.3 AVG()函数
AVG()函数可以求出表中某个字段取值的平均值。
9.3.4 MAX()函数
MAX()函数可以求出表中某个字段取值的最大值。
9.3.5 MIN()函数
MIN()函数可以求出表中某个字段取值的最小值。
9.4 连接查询
连接是把不同表的记录连到一起的最普遍的方法。一种错误的观念认为由于MySQL的简单性和源代码开放性,使它不擅长连接。这种观念是错误的。MySQL从一开始就能够很好地支持连接,现在还以支持标准的SQL2连接语句而自夸,这种连接语句可以以多种高级方法来组合表记录。
9.4.1 内连接查询
内连接是最普遍的连接类型,而且是最匀称的,因为它们要求构成连接的每一部分的每个表的匹配,不匹配的行将被排除。
9.4.2 外连接查询
与内连接不同,外连接是指使用OUTER JOIN关键字将两个表连接起来。外连接生成的结果集不仅包含符合连接条件的行数据,而且还包括左表(左外连接时的表)、右表(右外连接时的表)或两边连接表(全外连接时的表)中所有的数据行。语法格式:
SELECT 字段名称 FROM 表名1 LEFT|RIGHT JOIN 表名2 ON 表名1.字段名1 = 表名2.属性名2;
外连接分为左外连接(LEFT JOIN),右外连接(RIGHT JOIN)和全外连接三种类型
1. 左外连接
① 左外连接,表1 LEFT JOIN 表2 ON 连接条件表1就是主表,表2就是从表 、
② 查询的结果集是:主表中所有的记录,以及从表中和主表匹配的记录,如果从表有和主表不匹配的记录,则用NULL填充
③ 一般用于查询主表中有,而从表中没有的数据
④ 左外连接和右外连接互换主从表的顺序,并更换LEFT | RIGHT 关键字,可以达到相同的效果
2.右外连接
① 右外连接,表1 RIGHT JOIN 表2 ON 连接条件表2就是主表,表1就是从表
② 查询的结果集是仍是相同的规律:主表中所有的记录以及:从表中和主表匹配的记录,如果从表有和主表不匹配的记录,则用NULL填充
③ 依然用于查询主表中有,而从表中没有的数据
④ 左外连接和右外连接互换主从表的顺序,并更换LEFT | RIGHT 关键字,可以达到相同的效果
9.4.3 复合条件连接查询
在连接查询时,也可以增加其他的限制条件。通过多个条件的复合查询,可以使查询结果更加准确。
9.5 子查询
9.5.1 带IN关键字的子查询
只有子查询返回的结果列包含一个值时,比较运算符才适用。假如一个子查询返回的结果集是值的列表,这时比较运算符就必须用IN运算符代替; IN运算符可以检测结果集中是否存在某个特定的值,如果检测成功就执行外部的查询。
9.5.2 带比较运算符的子查询
子查询可以使用比较运算符。这些比较运算符包括=、!=、>、>=、<、<=等。比较运算符在子查询时使用的非常广泛。
9.5.3 带EXISTS关键字的子查询
使用EXISTS关键字时,内层查询语句不返回查询的记录。而是返回一个真假值。如果内层查询语句查询到满足条件的记录,就返回一个真值(true),否则,将返回一个假值(false)。当返回的值为true时,外层查询语句将进行查询;当返回的为false时,外层查询语句不进行查询或者查询不出任何记录。
9.5.4 带ANY关键字的子查询
ANY关键字表示满足其中任意一个条件。使用ANY关键字时,只要满足内层查询语句返回的结果中的任意一个,就可以通过该条件来执行外层查询语句。
9.5.5 带ALL关键字的子查询
ALL关键字表示满足所有条件。使用ALL关键字时,只有满足内层查询语句返回的所有结果,才可以执行外层查询语句。
9.6 合并查询结果
合并查询结果是将多个SELECT语句的查询结果合并到一起。合并查询结果使用UNION和UNION ALL关键字。
9.7 定义表和字段的别名
在查询时,可以为表和字段取一个别名,这个别名可以代替其指定的表和字段。为字段和表取别名,能够使查询更加方便。而且可以使查询结果以更加合理的方式显示。
9.7.1 为表取别名
当表的名称特别长时,在查询中直接使用表名很不方便。这时可以为表取一个贴切的别名。
9.7.2 为字段取别名
当查询数据时,MySQL会显示每个输出列的名词。默认情况下,显示的列名是创建表时定义的列名。我们同样可以为这个列取一个别名。
9.8 使用正则表达式查询
正则表达式是用某种模式去匹配一类字符串的一个方式。正则表达式的查询能力比通配字符的查询能力更强大,而且更加的灵活。下面详细讲解如何使用正则表达式来查询。 在MySQL中,使用REGEXP关键字来匹配查询正则表达式。其基本形式如下: 字段名 REGEXP '匹配方式'
9.8.1 匹配指定字符中的任意一个
使用方括号([])可以将需要查询字符组成一个字符集。只要记录中包含方括号中的任意字符,该记录将会被查询出来。
9.8.2 使用“*”和“+”来匹配多个字符
正则表达式中,“*”和“+”都可以匹配多个该符号之前的字符。但是,“+”至少表示一个字符,而“*”可以表示0个字符。
9.8.3 匹配以指定的字符开头和结束的记录
正则表达式中,^表示字符串的开始位置,$表示字符串的结束位置。下面将通过一个具体的实例演示如何匹配以指定的字符开头和结束的记录。