首页 > 数据库 >一文带你从入门到精通——MySQL(二)

一文带你从入门到精通——MySQL(二)

时间:2024-11-19 22:17:50浏览次数:3  
标签:聚合 一文 name 查询 field products MySQL SELECT 入门

建议先阅读我的上一篇博客,掌握一定的MySQL基础知识后再阅读本文,链接如下:

一文带你从入门到精通——MySQL(一)-CSDN博客

目录

二、MySQL单表查询

2.1 基础查询

2.2 条件查询

2.3 排序查询

2.4 聚合查询

2.5 分组查询

2.6 分页查询

2.7 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都能够对数据进行条件筛选,它们有那些区别呢?

wherehaving
书写顺序在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

相关文章

  • edusrc—记录一次某证书站捡漏拿下证书实战,网络安全零基础入门到精通教程!
    一、信息收集测试证书站首先得对他的资产收集一波首先,在icp备案查询网站查询备案的主域名有哪些https://beian.miit.gov.cn/img然后利用子域名收集工具对二级子域名,三级子域名进行收集,扩大资产范围我一般用oneforall这个工具收集资产,挺好用的,这里放上链接https://gi......
  • 基于Java+Springboot+Jpa+Mysql实现的在线网盘文件分享系统功能设计与实现一
    一、前言介绍:免费学习:猿来入此1.1项目摘要在线网盘文件分享系统的课题背景主要源于现代社会对数字化信息存储和共享需求的日益增长。随着互联网的普及和技术的快速发展,人们越来越依赖电子设备来存储和传输各种类型的数据文件。然而,传统的本地存储方式存在诸多不便,如空间有限、......
  • 基于Java+Springboot+Jpa+Mysql实现的在线网盘文件分享系统功能设计与实现二
    一、前言介绍:免费学习:猿来入此1.1项目摘要在线网盘文件分享系统的课题背景主要源于现代社会对数字化信息存储和共享需求的日益增长。随着互联网的普及和技术的快速发展,人们越来越依赖电子设备来存储和传输各种类型的数据文件。然而,传统的本地存储方式存在诸多不便,如空间有限、......
  • 5分钟,轻松搞定MySQL数据库等保测评
    前言作为数据库运维人员,需要理性看待数据库等保测评相关工作,完全按照测评结果对数据库进行整改,或完全忽略测评结果都是不可取的,过犹不及,物极必反。比如MySQL和Oracle为了防止密码被暴力破解的连接错误密码延时功能,随着连续输错密码次数的增加,连接的延时也会逐渐增加,如果设......
  • 【MySQL】约束
    【MySQL】约束文章目录【MySQL】约束前言一、概述二、约束演示三、外键约束总结前言本篇文章就MySQL约束,讲到约束的概述,约束演示以及外键约束。一、概述概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。目的:保证数据库中数据的正确、有效性和完整......
  • Redis入门(二)
    Redis字符串(String)Redis的字符串(String)是最基本的数据类型之一,它可以存储任意类型的字符串数据,包括文本和二进制数据。字符串的最大长度为512MB。Redis提供了丰富的命令来操作字符串,包括设置、获取、递增、递减等操作。基本概念键(Key):字符串的主键。值(Value):与键关联的字......
  • MySQL常用命令
    MySQL#用户管理及授权CREATEUSERluke@localhostIDENTIFIEDBY'linuxprobe';grantallon*.*toluke@localhost;grantselect,update,delete,insertonmysql.usertoluke@localhost;#查询用户权限showgrantsforluke@localhost;#创建DBcreatedatabaselinu......
  • MySQL 逻辑备份与恢复指南
    MySQL逻辑备份与恢复指南引言逻辑备份将数据库数据和结构导出为SQL文件,用于数据迁移或恢复。本文提供常用备份和恢复命令,适用于单表、单数据库、多数据库及所有数据库场景。命令行参数说明<参数>:尖括号内的内容为用户需替换的实际值(例如:主机、端口、用户名等)。>:表示输出重......
  • 【入门】字符串的反码c++
    #include<bits/stdc++.h>usingnamespacestd;intmain(){ //一、分析问题 //已知:一个长度不超过80个字符的字符串。 //未知:字符串的反码。 //关系:如果这是一个小写字符,则它和字符a的距离与它的反码和字符z的距离相同;如果是一个大写字符,则它和字符A的距离与它......
  • 微信小程序实现跑步轨迹回放入门教程
    一、先看效果跑步轨迹回放二、实现功能【跑步运动助手】是一款微信小程序,主要实现了跑步轨迹记录、历史轨迹、轨迹纠偏、轨迹回放和轨迹排名等功能。本文主要讲如何实现轨迹动画回放功能。更多干货请关注公众号:小蝇工作室1.获取GPS数据queryData=function(url,data......