字符匹配查询
使用LIKE关键字的查询又称为模糊查询,通常用于查询字段值包含某些字符的记录,语法形式如下:
SELECT {*|col_list} FROM table_name WHERE col_namea LIKE valueb;
1、 通配符 %
1)、通配符“%”可以匹配任意长度的字符,可以是0个,也可以是1个或多个。
查询tb_goods表中name值以“果”开头的记录,结果如下:
mysql> SELECT * FROM tb_goods WHERE name LIKE '果%';
2)、查询tb_goods表中name值以“糖”结尾的记录。
SELECT * FROM tb_goods WHERE name LIKE '%糖';
3)、查询tb_goods表中name值包含“游”的记录。
SELECT * FROM tb_goods WHERE name LIKE '%游%';
4)、查询tb_goods表中name值以“休”开头,以“服”结尾的记录。
SELECT * FROM tb_goods WHERE name LIKE '休%服';
通配符“%”可以出现在匹配字符的任意位置,并且可以匹配任意数目的字符。
2、 通配符 _
通配符“_”的使用方法与通配符“%”类似,都可以出现在匹配字符的任意位置,但通配符“_”只能匹配一个字符。
查询tb_goods表中name值以“西”开头,“西”后有两个字符的记录,结果如下所示。
mysql> SELECT * FROM tb_goods WHERE name LIKE '西__';
如果要查询tb_goods表中name值以“西”开头,“西”后有一个字符的记录,则执行以下语句即可。
SELECT * FROM tb_goods WHERE name LIKE '西_';
排序查询
使用前面的方法查询到的结果是按照记录在表中的默认顺序进行排列的。如果需要将查询结果按照指定的顺序排列,可以使用ORDER BY关键字。语法形式如下:
SELECT {*|col_list} FROM table_name ORDER BY col_namea [ASC|DESC];
ASC:升序-- 默认排序方式
DESC:降序
1、单字段排序
注意:在排序之前最好将有空值的记录补充完整,否则,空值记录将被排在最前面。
查询tb_goods表中id、name和add_time字段的数据,并按照add_time字段值进行排序,结果如下:
mysql> SELECT id,name,add_time FROM tb_goods ORDER BY add_time;
2、多字段排序
有些情况下,可能需要使用多个字段作为排序条件对查询结果进行排序。为查看查询结果,此处将第5条记录的price值改为2.5(与第3条记录值相同)。
mysql> update tb_goods set price=2.5 where id=5;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
查询tb_goods表中所有记录,并按照price和num字段值进行排序,结果如下:
mysql> SELECT * FROM tb_goods ORDER BY price,num;
3、降序排序
如果需要对查询结果进行降序排序,可以使用DESC关键字。
将tb_goods表中所有记录查询出来,并按照price字段降序排序,结果如下:
mysql> SELECT * FROM tb_goods ORDER BY price DESC;
3、 在按照多字段排序时,也可以使用DESC关键字进行降序排序。
查询tb_goods表中所有记录,并按照price字段和num字段进行排序,结果如下:
mysql> SELECT * FROM tb_goods ORDER BY price DESC,num;
限制查询结果的数量
实际应用中,数据库中的数据量通常是很大的,一般不会一次性将所有数据查询出来,此时就需要使用LIMIT关键字来限制查询结果的数量。语法形式如下:
SELECT {*|col_list} FROM table_name LIMIT [offset_start,]row_count;
将tb_goods表中的前3条记录查询出来,结果如下:
mysql> SELECT * FROM tb_goods LIMIT 3;
如果指定起始位置(从0开始),则系统会从起始位置开始查询,返回总条数为显示条数的记录。
返回tb_goods表中从第3条记录开始,总条数为3的记录,结果如下:
mysql> SELECT * FROM tb_goods LIMIT 2,3;
聚合函数和分组数据记录查询
在数据库中,通常需要进行一些数据汇总操作。比如,要统计汇总商品种类或者统计整个公司的员工数等,此时就用到了聚合函数。MySQL所支持的聚合函数一共有以下5种。
1、 COUNT()函数:计算表中记录的条数。
2、 SUM()函数:计算字段值的总和。
3、 AVG()函数:计算字段值的平均值。
4、 MAX()函数:查询表中字段值的最大值。
5、 MIN()函数:查询表中字段值的最小值。
实际应用中,聚合函数通常与分组查询一起使用。分组查询就是按照某个字段对数据记录进行分组,比如前面用到的tb_goods表,可以按照商品类别对记录进行分组,然后使用聚合函数统计每个类别下的商品数量。
使用聚合函数查询的基本语法形式如下:
SELECT function(*|col_num) FROM table_name WHERE CONDITION;
本节依然以galaxy数据库中的tb_goods表为例进行操作,在操作之前,先执行以下语句,向数据表中追加5条记录。
INSERT INTO tb_goods(type,name,price,num,add_time)
VALUES('书籍','三国演义',109,50,'2018-01-03 13:40:40'),
('水果','西瓜',1.5,null,'2018-02-05 13:40:40'),
('水果','苹果',3,100,'2018-03-05 13:40:40'),
('服饰','牛仔裤',120,10,'2018-05-04 13:40:40'),
('书籍','红楼梦',50.5,15,'2018-05-06 13:40:40');
1、 COUNT()函数
COUNT()函数用于统计数据记录条数,用于返回表中记录的条数,或者符合特定条件的记录条数。
1)、COUNT(*):计算表中总的记录数,不管表字段中是否包含NULL值。
2)、COUNT(col_name):计算表中指定字段的记录数,在具体统计时将忽略NULL值。
查询tb_goods表中总的记录条数,执行结果如下。
mysql> SELECT COUNT(*) AS 总数 FROM tb_goods;
提示:上述语句中使用AS关键字为字段取别名为goods_num,使得查询结果简单明了,AS关键字可省略。使用AS关键字不仅可以为字段取别名,还可为表取别名,其使用非常灵活。
查询tb_goods表中有库存(num值不为NULL)的记录条数,执行结果如下。
SELECT COUNT(num) AS goods_num FROM tb_goods;
2、 SUM()函数
SUM()函数是一个求总和的函数,用于返回指定字段值的总和,或符合特定条件的指定字段值总和,
在具体计算时将忽略NULL值。其使用方法如下:
SUM(col_name)
查询tb_goods表中商品库存的总和,执行结果如下。
SELECT SUM(num) 总库存 FROM tb_goods;
3、AVG()函数
AVG()函数通过计算返回的行数和每一行数据的和,得到指定列数据的平均值,在具体计算时将忽略NULL值。AVG()函数与GROUP BY一起使用,可以计算每个分组的平均值。其使用方式如下:
查询tb_goods表中每个商品类别的平均价格,执行结果如下。
SELECT type,AVG(price) FROM tb_goods GROUP BY type;
4、MAX()函数和MIN()函数
MAX()函数和MIN()函数是用于求最大值和最小值的函数,可返回指定字段中的最大值和最小值,或者符合特定条件的指定字段值中的最大值和最小值。
1)、 MAX(col_name):该方式可以实现计算指定字段值中的最大值,在具体计算时将忽略NULL值。
2)、 MIN(col_name):该方式可以实现计算指定字段值中的最小值,在具体计算时将忽略NULL值。
查询goods表中商品的最高价格和最低价格,执行结果如下。
SELECT MAX(price) 最高价,MIN(price) 最低价 FROM tb_goods;
分组查询
分组查询是将查询结果按照某个或多个字段进行分组,MySQL使用GROUP BY语句对数据进行分组。GROUP BY从字面上理解就是“根据(BY)一定的规则进行分组(GROUP)”。它的工作原理是按照一定的规则将一个数据集合划分成若干个小的区域,然后针对这些区域的数据进行处理,语法形式如下:
SELECT {*|col_list} aggregate_func FROM table_name
GROUP BY col_namea [HAVING condition];
1、简单分组查询
将GROUP BY关键字与聚合函数COUNT()一起使用,可以查询每组的数量。
将tb_goods表中的记录按照type字段(商品类别)进行分组,并统计每组的数量,结果如下:
SELECT type,count(*) FROM tb_goods GROUP BY type;
如果需要将每种类型中包含的商品名称显示出来,可以使用group_concat()函数。
将tb_goods表中的记录按照type字段进行分组,并显示每组中的商品名称,结果如下:
SELECT type,group_concat(name) FROM tb_goods GROUP BY type;
2、使用HAVING过滤分组后数据
GROUP BY和HAVING一起使用,可以指定显示记录所需满足的条件,只有满足条件的分组才会被显示。
将tb_goods表中的记录按照type字段分组并统计每组的数量,然后只取商品数量大于1的分组,结果如下:
SELECT type,count(*) FROM tb_goods GROUP BY type HAVING COUNT(*)>1;
WHERE子句和HAVING子句都具有按照条件筛选数据的功能,两者的区别主要有以下几点:
1、 WHERE子句在进行分组操作之前用来选择记录,而HAVING子句在进行分组操作之后通过过滤来选择分组。
2、 HAVING子句中的每个字段必须被包含在SELECT关键字后的字段列表中。
3、 HAVING子句可以包含聚合函数,但WHERE子句不能。
3、使用多个字段进行分组
使用GROUP BY不止可以按照一个字段进行分组,还可以按多个字段进行分组。分组层次从左到右,即先按第1个字段进行分组,然后对第1个字段值相同的记录,再根据第2个字段进行分组,依此类推。
将tb_goods表中的记录按照type和num字段进行分组并统计,显示每个分组中商品类别、库存、商品名称和商品数量,执行结果如下:
SELECT type,num,group_concat(name),count(name) FROM tb_goods GROUP BY type,num;