建议先阅读我的上一篇博客,掌握一定的MySQL基础知识后再阅读本文,链接如下:
目录
二、MySQL单表查询
MySQL的单表查询属于SQL中的DQL语句。
现在假设你有如下的数据,其中id为该表的主键,name表示商品名称,price表示商品价格,score表示用户对商品的评分,is_self表示该商品是否为自营,假设该表的名字为products。
2.1 基础查询
基础查询是MySQL单表查询最基础的语法,格式如下:
SELECT field_name FROM table_name;
上述语句表示从名为table_name的表中查询名为field_name的字段。
如果需要查询表中所有字段,可以用*代替field_name。
如果需要对查询出的字段名进行去重操作,可以在select后加入distinct关键字。
如果需要对表或者字段起别名可以在相应原名后加入as new_table_name,其中as关键字可以省略,注意如果给表起了表名,必须用别名调用该表中的字段。
SELECT DISTINCT *
FROM table_name AS new_table_name;
2.2 条件查询
基础查询只能完成最基本的一些查询操作,如果有其他限制条件,仅仅用基础查询就无法实现了,比如我们要查询products表中为自营并且评分大于9.50的商品,就需要用到条件查询了。
条件查询关键字:where,其基本格式如下:
SELECT field_name
FROM table_name
WHERE conditions;
where 后跟各种条件,用于所查询限制数据,常见的条件有以下五种:
比较运算符:=、>、<、>=、<=、!=、<>,其中!=、<>均表示不等于
逻辑运算符: and、or、not,其中and表示与操作,or表示或操作,not表示取反操作
范围查询:连续范围:between x and y,非连续范围:in(x,y),between关键字表示闭区间查询,包含x、y两个端点;in关键字可以对多个字段进行联合查询
模糊查询:使用关键字like,%表示匹配0个或者多个任意字符;_表示匹配任意一个字符
非空判断:为空:is null;不为空:is not null,注意null在数据库中表示unknown值(未知值),它不表示""(空字符串),不能把任何值与一个unknown值进行比较,因为它们比较后会生产一个null值,而必须使用is null操作符来进行比较。
学习了以上的各种判断条件后,我们就可以完成查询products表中为自营并且评分大于9.50的商品的需求了。
SELECT *
FROM products
WHERE score > 9.50 AND is_self = '自营';
更多的条件查询示例如下:
-- 需求1: 查询商品价格在1000(含)到3000(含)之间的商品信息
SELECT *
FROM products
WHERE price BETWEEN 1000 AND 3000;
-- 需求2: 查询价格是999或者2199或者2399的商品
SELECT *
FROM products
WHERE price IN (999, 2199, 2399);
-- 需求3: 查询商品名称以'华'开头的商品信息
SELECT *
FROM products
WHERE name LIKE '华%';
-- 需求4: 查询商品名称以'华'开头并且8个字符的商品信息
SELECT *
FROM products
WHERE name LIKE '华_______';
-- 需求5:查询未评分的商品信息
SELECT *
FROM products
WHERE score IS NULL;
2.3 排序查询
如果我们需要将products表按照用户的评分进行排序,就需要对score字段进行排序操作,这就要用到我们的排序查询了。
排序查询关键字: order by,其基础格式如下:
SELECT field_name
FROM table_name
ORDER BY order_field_name ASC/DESC;
排序查询中,默认是asc即升序模式,同时asc关键字可以省略,如果需要降序排序,需要添加desc关键字,注意order by后可以跟多个排序字段,先按照前面的字段排序,如果有相同值的情况再按照后面的排序规则进行排序。
如果需要我们去查询商品的所有信息,并首先按照评分从高到低进行排序,如果评分相同的再按照价格从低到高排序,应该怎么做呢,答案示例如下:
SELECT *
FROM products
ORDER BY score DESC, price;
2.4 聚合查询
如果我们要统计某个字段的平均值、最大值等统计量,就需要使用到聚合查询的方法,而聚合查询则需要使用到聚合函数,又叫统计函数,也叫分组函数,常用聚合函数有:
sum(),用于求字段中数据的总和值
count(),用于统计字段中数据的数量
avg(),用于求字段中数据的平均值
max(),用于求字段中数据的最大值
min(),用于求字段中数据的最小值
聚合查询的基础格式如下:
SELECT SUM(field_name1), AVG(field_name2),
MAX(field_name3), MIN(field_name2), COUNT(field_name2)
FROM table_name;
聚合函数之后,如果没有group by的分组,则默认整个表就是一个大的分组,计算的是整个表的字段统计值,同时需要注意的是,聚合函数(字段名)会自动忽略字段中null值,对于其他聚合函数来说影响不大,但如果是需要统计个数,如果忽略null值则会丢失某些数据,因此以后统计个数可以使用count(*)或者count(常数)的格式进行统计,因为该格式不会忽略null值,其中常数可以取1、2等任意值。
2.5 分组查询
分组查询也是单表查询中比较难理解的一部分,假设我们有这样一个需求,要统计products表中自营和非自营的商品各自的商品数量,我们应该怎么去实现呢,这里就需要使用到分组查询的方式,其关键字为group by,其基础格式如下:
SELECT group_by_field_name, aggregate_function(field_name)
FROM table_name
GROUP BY group_by_field_name;
上述语句表示从表名为table_name的表中,首先按照字段名为group_by_field_name的字段进行分组,并查询名为group_by_field_name的字段,以及名为field_name的字段中由相应聚合函数计算出的统计值,注意:select后的字段名要么在group by后面出现过,要么写到聚合函数中,但是如果按照主键进行分组,select后的字段名则没有限制。
了解了group by的分组之后,我们就可以去实现上述的需求了。
SELECT is_self,
COUNT(id) AS cnt
FROM products
GROUP BY is_self;
如果要对分组后的数据再次进行条件筛选,则需要使用having关键字,其格式如下:
SELECT group_by_field_name, aggregate_function
FROM table_name
WHERE non_aggregate_condition
GROUP BY group_by_field_name
HAVING aggregate_condition;
注意对使用了聚合函数的字段以及分组字段进行的条件判断被称为聚合条件,那么where和having都能够对数据进行条件筛选,它们有那些区别呢?
where | having | |
书写顺序 | 在group by关键字前 | 在group by关键字之后 |
执行顺序 | 在分组前对数据进行过滤 | 在分组后对数据进行过滤 |
条件类型 | 只能跟非聚合条件 | having可以跟聚合条件,也可以跟非聚合条件,但跟非聚合条件时查询效率低 |
聚合函数 | 之后的条件中不能使用聚合函数 | 之后的条件中可以使用聚合函数 |
字段别名 | 之后的条件中不能用字段别名 | 之后的条件中可以用字段别名 |
更多的分组查询示例如下:
-- 需求1:统计每个分类商品的平均价格,并筛选出平均价格低于1000的分类
SELECT category_id,
AVG(price)
FROM products
GROUP BY category_id
HAVING AVG(price) < 1000;
-- 需求2:统计自营商品中,每个分类的商品的平均价格,并筛选出平均价格高于2000的分类
SELECT category_id,
AVG(price) AS avg_price
FROM products
WHERE is_self = '自营'
GROUP BY category_id
HAVING AVG(price) > 2000;
2.6 分页查询
在实际的业务中,往往不需要我们去查询全部的数据,如果想要查询部分的数据就需要使用分页查询的方法,其关键字为limit x,y,写于MySQL语句的最后面,参数x代表起始索引,可以省略,默认从0开始 ,y: 本次查询的数据条数。
分页查询示例如下:
-- 需求1:获取所有商品中,价格最高的商品信息
SELECT *
FROM products
ORDER BY price DESC
LIMIT 1;
-- 需求2:将商品数据按照价格从低到高排序,然后获取第2页内容(每页3条)
SELECT *
FROM products
ORDER BY price
LIMIT 3, 3;
注意,需求1中limit后的参数x是省略了的,默认从索引0从开始查找;在需求2中参数y的值为3很好理解,因为每页仅展示3条数据,那为什么参数x的值为3呢?因为需要查询第二页的内容,而索引是从0开始的,第一页的数据对应索引0、1、2,因此第二页的起始索引为3.
这里给大家留一个思考题,如果有数据相同的并列情况,可以使用limit关键字完成topN需求吗?在下一期博客中会为大家解答。
2.7 MySQL语句的执行顺序
至此已经为大家介绍了MySQL中查询需要使用的大部分关键字,那么这些关键字的执行顺序和书写顺序是相同的吗?答案是否定的,这里为大家整理了MySQL语句的执行顺序以及书写顺序。
书写顺序:SELECT -> DISTINCT -> 聚合函数 -> FROM -> WHERE -> GROUP BY -> HAVING
-> ORDER BY -> LIMIT
执行顺序:FROM -> WHERE -> GROUP BY -> 聚合函数 -> HAVING -> SELECT -> DISTINCT
-> ORDER BY -> LIMIT
标签:聚合,一文,name,查询,field,products,MySQL,SELECT,入门 From: https://blog.csdn.net/2401_86480334/article/details/143894317