SQL命令详解之数据的查询操作
目录
1 简介
2 基础查询
2.1 基础查询语法
2.2 基础查询练习
3 条件查询
3.1 条件查询语法
3.2 条件查询练习
4 排序查询
4.1 排序查询语法
4.2 排序查询练习
5 聚合函数
5.1 一般语法:
5.2 聚合函数练习
6 分组查询
6.1 分组查询语法
6.2 分组查询练习
7 分页查询
7.1 分页查询语法
7.2 分页查询练习
8 总结
1 简介
查询是数据操作至关重要的一部分比如说在所有商品中查找出价格在规定范围内的所有商品,要想把数据库中的数据在客户端中展示给用户,一般都进行了查询的操作。
在实际开发中,我们要根据不同的需求,并且考虑查询的效率来决定怎样进行查询,学习查询前,可以先看看查询的完整语法:
SELECT字段列表
FROM表名列表
WHERE条件列表
GROUPBY分组字段
HAVING分组后条件
ORDERBY排序字段
LIMIT分页限定
2 基础查询
2.1 基础查询语法
查询多个字段:
select 字段列表 from 表名;
查询全部字段:
select * from 表名;
去除重复记录:
select distinct 字段列表 from 表名;
起别名操作:
select 字段名 别名 from 表名;
2.2 基础查询练习
练习一:文章浏览 I
Views 表:
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| article_id | int |
| author_id | int |
| viewer_id | int |
| view_date | date |
+---------------+---------+
此表可能会存在重复行。(换句话说,在 SQL 中这个表没有主键)
此表的每一行都表示某人在某天浏览了某位作者的某篇文章。
请注意,同一人的 author_id 和 viewer_id 是相同的。
请查询出所有浏览过自己文章的作者,结果按照id 升序排列:
select DISTINCT author_id as id from Views where author_id = viewer_id;
3 条件查询
3.1 条件查询语法
一般语法:
select 字段列表 from 表名 where 条件列表;
条件查询一般配合运行符进行,下面是常见的几个运算符:

3.2 条件查询练习
练习一:可回收且低脂的产品
表:Products
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| product_id | int |
| low_fats | enum |
| recyclable | enum |
+-------------+---------+
-
product_id 是该表的主键(具有唯一值的列)。
-
low_fats 是枚举类型,取值为以下两种 ('Y', 'N'),其中 'Y' 表示该产品是低脂产品,'N' 表示不是低脂产品。
-
recyclable 是枚举类型,取值为以下两种 ('Y', 'N'),其中 'Y' 表示该产品可回收,而 'N' 表示不可回收。
编写一个 SQL 找出既是低脂又是可回收的产品编号:
select product_id from Products where low_fats='Y' and recyclable='Y';
练习二:患某种疾病的患者
患者信息表:Patients
+--------------+---------+
| Column Name | Type |
+--------------+---------+
| patient_id | int |
| patient_name | varchar |
| conditions | varchar |
+--------------+---------+
patient_id (患者 ID)是该表的主键。
'conditions' (疾病)包含 0 个或以上的疾病代码,以空格分隔。
这个表包含医院中患者的信息。
编写一个 SQL 查询患有 I 类糖尿病的患者 ID (patient_id)、患者姓名(patient_name)以及其患有的所有疾病代码(conditions),I 类糖尿病的代码总是包含前缀DIAB1 。
SELECT patient_id, patient_name, conditions
FROM Patients
WHERE conditions like 'DIAB1%' OR conditions LIKE '% DIAB1%';
4 排序查询
4.1 排序查询语法
select 字段列表 from 表名 order by 排序字段名1 [排序方式]...;
注:排序方式有两种:分别是升序 ASC 和降序 DESC,默认情况下是升序 ASC。
4.2 排序查询练习
# score 表
+------+------+-----------+---------+---------+
| s_name | 总分 | 语文成绩 | 数学成绩 | 英语成绩 |
+------+------+-----------+---------+---------+
| 赵雷 | 269 | 80 | 90 | 99 |
| 钱电 | 210 | 70 | 60 | 80 |
| 孙风 | 210 | 80 | 60 | 70 |
| 李云 | 100 | 50 | 30 | 20 |
| 周梅 | 170 | 83 | 0 | 87 |
| 吴兰 | 65 | 31 | 0 | 34 |
| 郑竹 | 187 | 83 | 87 | 0 |
+-----+------+------------+---------+---------+
编写一个 SQL 查询所有学生的成绩,并按 '总分' 倒序排序,如果 '总分' 相同再按 '语文成绩' 排序,以此类推。
select * form score order by '总分' desc, '语文成绩' desc, '数学成绩' desc, '英语成绩' desc;
5 聚合函数
5.1 一般语法:
注:NULL 值不参与聚合函数运算。
在进行查询操作时,往往需要对一整列进行运算,例如可以计算一整列成绩数据的平均值,我们就要使用聚合函数。下面是常见的聚合函数:

select 聚合函数 from 表名;
5.2 聚合函数练习
练习一:求所有学生的 '总成绩'、'平均分'、 '最高分' 、'最低分'
# score 表
+--------+--------+---------+
| s_name | c_name | s_score |
+--------+--------+---------+
| 赵雷 | 语文 | 80 |
| 赵雷 | 数学 | 90 |
| 赵雷 | 英语 | 99 |
| 钱电 | 语文 | 70 |
| 钱电 | 数学 | 60 |
| 钱电 | 英语 | 80 |
| 孙风 | 语文 | 80 |
| 孙风 | 数学 | 80 |
| 孙风 | 英语 | 80 |
| 李云 | 语文 | 50 |
| 李云 | 数学 | 30 |
| 李云 | 英语 | 20 |
| 周梅 | 语文 | 76 |
| 周梅 | 数学 | 87 |
| 吴兰 | 语文 | 31 |
| 吴兰 | 英语 | 34 |
| 郑竹 | 数学 | 89 |
| 郑竹 | 英语 | 98 |
+--------+--------+---------+
编写一个 SQL 查询所有学生的 '总成绩'、'平均分'、 '最高分' 、'最低分'
mysql> select s_name, sum(s_score) as'总分', round(avg(s_score),2) as'平均分', max(s_score) as'最高分', min(s_score) as'最低分'
fromtemp_student
groupby s_name;+-------+-------+-----------+-------+--------+
| s_name | 总分 | 平均分 | 最高分 | 最低分 |
+-------+-------+----------+--------+--------+
| 赵雷 | 269 | 89.67 | 99 | 80 |
| 钱电 | 210 | 70.00 | 80 | 60 |
| 孙风 | 240 | 80.00 | 80 | 80 |
| 李云 | 100 | 33.33 | 50 | 20 |
| 周梅 | 163 | 81.50 | 87 | 76 |
| 吴兰 | 65 | 32.50 | 34 | 31 |
| 郑竹 | 187 | 93.50 | 98 | 89 |
+-------+-------+---------+--------+---------+
7 rows in set (0.00 sec)
6 分组查询
6.1 分组查询语法
select 字段列表 from 表名 [where 分组前的条件限定] group by 分组字段名 [having 分组后的条件过滤]
注:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义。
6.2 分组查询练习
练习一:每月交易 I
表:Transactions
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| country | varchar |
| state | enum |
| amount | int |
| trans_date | date |
+---------------+---------+
id 是这个表的主键,该表包含有关传入事务的信息,state 列类型为 ["approved", "declined"] 之一。输入:
Transactions table:
+----+---------+--------+--------+--------+
| id | country | state | amount | trans_date |
+----+---------+--------+--------+--------+
| 121 | US | approved | 1000 | 2018-12-18 |
| 122 | US | declined | 2000 | 2018-12-19 |
| 123 | US | approved | 2000 | 2019-01-01 |
| 124 | DE | approved | 2000 | 2019-01-07 |
+-----+-------+---------+--------+------------+
输出:
+----------+---------+-------------+----------------+--------------------+-----------------------+
| month | country | trans_count | approved_count | trans_total_amount | approved_total_amount |
+----------+---------+-------------+----------------+--------------------+-----------------------+
| 2018-12 | US | 2 | 1 | 3000 | 1000 |
| 2019-01 | US | 1 | 1 | 2000 | 2000 |
| 2019-01 | DE | 1 | 1 | 2000 | 2000 |
+----------+---------+-------------+----------------+--------------------+-----------------------+
编写一个 sql 查询来查找每个月和每个国家/地区的事务数及其总金额、已批准的事务数及其总金额。
selectdate_format(trans_date, "%Y-%m") as 'month',country,count(*) as trans_count,sum(if(state = 'approved', 1, 0)) as approved_count,sum(amount) as trans_total_amount,sum(if(state = 'approved', amount, 0)) as approved_total_amount
fromTransactions
group bydate_format(trans_date, "%Y-%m"),country;
练习二:即时食物配送 II
配送表: Delivery
+-----------------------------+---------+
| Column Name | Type |
+-----------------------------+---------+
| delivery_id | int |
| customer_id | int |
| order_date | date |
| customer_pref_delivery_date | date |
+-----------------------------+---------+
delivery_id 是该表中具有唯一值的列。
该表保存着顾客的食物配送信息,顾客在某个日期下了订单,并指定了一个期望的配送日期(和下单日期相同或者在那之后)。如果顾客期望的配送日期和下单日期相同,则该订单称为 「即时订单」,否则称为「计划订单」。
「首次订单」是顾客最早创建的订单。我们保证一个顾客只会有一个「首次订单」。
编写解决方案以获取即时订单在所有用户的首次订单中的比例。保留两位小数。
结果示例如下所示:示例:
输入:
Delivery 表:
+-------------+-------------+------------+-----------------------------+
| delivery_id | customer_id | order_date | customer_pref_delivery_date |
+-------------+-------------+------------+-----------------------------+
| 1 | 1 | 2019-08-01 | 2019-08-02 |
| 2 | 2 | 2019-08-02 | 2019-08-02 |
| 3 | 1 | 2019-08-11 | 2019-08-12 |
| 4 | 3 | 2019-08-24 | 2019-08-24 |
| 5 | 3 | 2019-08-21 | 2019-08-22 |
| 6 | 2 | 2019-08-11 | 2019-08-13 |
| 7 | 4 | 2019-08-09 | 2019-08-09 |
+-------------+-------------+------------+-----------------------------+
输出:
+----------------------+
| immediate_percentage |
+----------------------+
| 50.00 |
+----------------------+
解释:
1 号顾客的 1 号订单是首次订单,并且是计划订单。
2 号顾客的 2 号订单是首次订单,并且是即时订单。
3 号顾客的 5 号订单是首次订单,并且是计划订单。
4 号顾客的 7 号订单是首次订单,并且是即时订单。
因此,一半顾客的首次订单是即时的。
编写一个 sql 查询来查找每个月和每个国家/地区的事务数及其总金额、已批准的事务数及其总金额。
selectround((sum(if(order_date = customer_pref_delivery_date, 1, 0)) / count(*)) * 100,2) as immediate_percentage
fromDelivery
where(customer_id, order_date) in (selectcustomer_id,min(order_date) as order_datefromDeliverygroupbycustomer_id);
7 分页查询
7.1 分页查询语法
在我们的印象中,网页在展示大量的数据时,往往不是把数据一下全部展示出来,而是用分页展示的形式,其实就是对数据进行分页查询的操作,即每次只查询一页的数据展示到页面上。
select 字段列表 from 表名 limit 查询起始索引,查询条目数;
在limit 关键字中,查询起始索引这个参数是从 0 开始的。
7.2 分页查询练习
练习一:最后一个能进入巴士的人
表: Queue
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| person_id | int |
| person_name | varchar |
| weight | int |
| turn | int |
+-------------+---------+
person_id 是这个表具有唯一值的列。
该表展示了所有候车乘客的信息。
表中 person_id 和 turn 列将包含从 1 到 n 的所有数字,其中 n 是表中的行数。
turn 决定了候车乘客上巴士的顺序,其中 turn=1 表示第一个上巴士,turn=n 表示最后一个上巴士。
weight 表示候车乘客的体重,以千克为单位。有一队乘客在等着上巴士。然而,巴士有1000千克 的重量限制,所以其中一部分乘客可能无法上巴士。
编写解决方案找出 最后一个 上巴士且不超过重量限制的乘客,并报告 person_name 。题目测试用例确保顺位第一的人可以上巴士且不会超重。
返回结果格式如下所示。示例 1:
输入:
Queue 表
+-----------+-------------+--------+------+
| person_id | person_name | weight | turn |
+-----------+-------------+--------+------+
| 5 | Alice | 250 | 1 |
| 4 | Bob | 175 | 5 |
| 3 | Alex | 350 | 2 |
| 6 | John Cena | 400 | 3 |
| 1 | Winston | 500 | 6 |
| 2 | Marie | 200 | 4 |
+-----------+-------------+--------+------+
输出:
+-------------+
| person_name |
+-------------+
| John Cena |
+-------------+
编写解决方案找出最后一个 上巴士且不超过重量限制的乘客
selectq1.person_name
fromQueue q1,Queue q2
whereq1.turn >= q2.turn
groupbyq1.person_id
havingsum(q2.weight) <= 1000
orderbysum(q2.weight) desclimit1;
8 总结
本篇 SQL 学习笔记系统地总结了查询操作的各个方面,包括基础查询、条件查询、排序、聚合、分组及分页等内容。通过详细的语法解析和实践练习,涵盖了从简单的数据检索到复杂的数据处理方法,帮助理解 SQL 在实际应用中的关键用法。同时,笔记中提供了具体的 SQL 练习案例,使读者能够在实践中掌握高效查询的技巧。掌握这些 SQL 技巧,不仅能够提高数据库操作能力,还能为优化查询性能和处理复杂数据分析奠定坚实基础。
相关文章:
SQL命令详解之数据的查询操作
目录 1 简介 2 基础查询 2.1 基础查询语法 2.2 基础查询练习 3 条件查询 3.1 条件查询语法 3.2 条件查询练习 4 排序查询 4.1 排序查询语法 4.2 排序查询练习 5 聚合函数 5.1 一般语法: 5.2 聚合函数练习 6 分组查询 6.1 分组查询语法 6.2 分组查询…...
序列化选型:字节流抑或字符串
序列化既可以将对象转换为字节流,也可以转换为字符串,具体取决于使用的序列化方式和场景。 转换为字节流 常见工具及原理:在许多编程语言中,都有将对象序列化为字节流的机制。例如 Python 中的 pickle 模块、Java 中的对象序列化…...
使用C#控制台调用本地部署的DeepSeek
1、背景 春节期间大火的deepseek,在医疗圈也是火的不要不要的。北京这边的医院也都在搞“deepseek竞赛”。友谊、北医三院等都已经上了,真是迅速啊! C#也是可以进行对接,并且非常简单。 2、具体实现 1、使用Ollama部署DeepSeek…...
Linux环境安装Nginx及版本升级指南
Linux环境安装Nginx及版本升级指南 一、安装Nginx 1. 安装前准备 # 更新系统软件包(Ubuntu/Debian) sudo apt update && sudo apt upgrade -y# CentOS/RHEL sudo yum update -y2. 安装依赖库 # Ubuntu/Debian sudo apt install -y curl wget…...
选开源CMS建站系统时,插件越多越好吗?
在选择开源CMS建站系统时,插件数量并不是唯一的衡量标准,更不能简单地说“插件越多就越好”,还是需要综合评估来考虑选择结果,以下是有关选择开源CMS系统时对插件数量的考量。 插件数量的优势插件数量可能带来的问题功能丰富性&a…...
Windows对比MacOS
Windows对比MacOS 文章目录 Windows对比MacOS1-环境变量1-Windows添加环境变量示例步骤 1:打开环境变量设置窗口步骤 2:添加系统环境变量 2-Mac 系统添加环境变量示例步骤 1:打开终端步骤 2:编辑环境变量配置文件步骤 3࿱…...
使用 Python 实现基于 AGA8 GERG - 2008 方程计算掺氢天然气压缩因子的示例代码
AGA8 GERG - 2008 方程是用于计算天然气混合物热力学性质的一种方法,下面是一个使用 Python 实现基于 AGA8 GERG - 2008 方程计算掺氢天然气压缩因子的示例代码。需要注意的是,AGA8 GERG - 2008 方程非常复杂,完整实现需要大量的系数和详细的…...
开源绝版经典小游戏合集
随着生活节奏的日益加快,我们常常需要一些小游戏来缓解疲惫的身心。过去,Windows 7自带的扫雷、蜘蛛纸牌等小游戏深受大家喜爱,但随着系统的更新换代,这些经典游戏逐渐淡出了人们的视野。我也曾花费不少时间寻找这些游戏ÿ…...
给虚拟机配置IP
虚拟机IP这里一共有三个地方要设置,具体说明如下: (1)配置vm虚拟机网段 如果不进行设置,每次启动机器时都可能是随机的IP,不方便我们后续操作。具体操作是:点击编辑→虚拟网络编辑器 选择VMne…...
YOLOv12以注意力机制为核心的架构:主要特点、创新点、使用方法
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
GD32F450 使用
GB32F450使用 1. 相关知识2. 烧写程序3. SPI3.1 spi基础3.2 spi代码 4. 串口4.1 串口引脚4.2 串口通信代码 问题记录1. 修改晶振频率 注意:GD32F450 总共有三种封装形式,本文所述的相关代码和知识,均为 GD32F450IX 系列。 1. 相关知识 参数配…...
Linux 动静态库和_make_进度条(一)
文章目录 一、如何理解条件编译二、动静态库1. 理论2. 实践3. 解决普通用户的sudo问题4. 技术上理解库 三、make和make_file 一、如何理解条件编译 1. gcc code.c -o code -DM 命令行级别的宏定义预处理的本质就是修改编辑我们的文本代码 头文件展开到源文件中去注释宏替换条…...
Android 图片压缩详解
在 Android 开发中,图片压缩是一个重要的优化手段,旨在提升用户体验、减少网络传输量以及降低存储空间占用。以下是几种主流的图片压缩方法,结合原理、使用场景和优缺点进行详细解析。 效果演示 直接先给大家对比几种图片压缩的效果 质量压缩 质量压缩:根据传递进去的质…...
C# 牵手DeepSeek:打造本地AI超能力
一、引言 在人工智能飞速发展的当下,大语言模型如 DeepSeek 正掀起新一轮的技术变革浪潮,为自然语言处理领域带来了诸多创新应用。随着数据隐私和安全意识的提升,以及对模型部署灵活性的追求,本地部署 DeepSeek 成为众多开发者和…...
普通人高效使用DeepSeek指南?
李升伟 整理 DeepSeek(深度求索)作为一款智能搜索引擎或AI工具,普通人可以通过以下方式高效利用它,提升学习、工作和生活效率: --- ### **一、基础功能:精准搜索** 1. **明确需求提问** 用自然语言…...
卢卡斯定理判断组合数奇偶(Codeforces Round 1006 (Div. 3)——F)
文章目录 组合数奇偶判断题意思路综上 组合数奇偶判断 【用杨辉三角阐释Lucas定理】https://www.bilibili.com/video/BV14F411P7ES?vd_source67186f29c3efb728bcff34035cf5aba2 这个视频可以简单的领会一下精神,卢卡斯定理也就是用于组合数取模。 奇偶性通过对2…...
ECharts组件封装教程:Vue3中的实践与探索
在日常的前端开发中,ECharts 作为一款强大且易用的图表库,被广泛应用于数据可视化场景。为了更好地在 Vue3 项目中复用 ECharts 功能,我们可以将其封装成一个组件。本文将带大家一步步实现 ECharts 的 Vue3 组件封装,并演示如何在父组件中调用和使用。 一、封装 ECharts 组…...
LLM中的Benchmark是什么
LLM中的Benchmark是什么 “DeepSeek推动价值重估Benchmark” DeepSeek这家公司或其相关技术的发展,促使Benchmark这家机构对相关资产或企业的价值进行重新评估。“Benchmark”在这里是一家研究机构或金融分析机构。 “Benchmark”常见的意思是“基准;水准点,基准点”,作…...
【新加坡】软件工程师工签政策、求职指南
文章目录 关键要点就业准证要求求职平台注意事项详细报告就业准证(EP)要求求职平台与投递渠道注意事项与求职建议表格:求职平台对比额外考虑关键引用 关键要点 去新加坡工作需要申请就业准证(EP),通常要求…...
梯度下降法(Gradient Descent) -- 现代机器学习的血液
梯度下降法(Gradient Descent) – 现代机器学习的血液 梯度下降法是现代机器学习最核心的优化引擎。本文从数学原理、算法变种、应用场景到实践技巧,用三维可视化案例和代码实现揭示其内在逻辑,为你构建完整的认知体系。 优化算法 一、梯度下降法的定义…...
CMake宏定义管理:如何优雅处理第三方库的宏冲突
在C/C项目开发中,我们常常会遇到这样的困境: 当引入一个功能强大的第三方库时,却发现它定义的某个宏与我们的项目产生冲突。比如: 库定义了 BUFFER_SIZE 1024,而我们需要 BUFFER_SIZE 2048库内部使用 DEBUG 宏控制日志…...
【计算机网络】常见tcp/udp对应的应用层协议,端口
TCP 和 UDP 对应的常见应用层协议 📌 基于 TCP 的应用层协议 协议全称用途默认端口HTTPHyperText Transfer Protocol超文本传输协议80HTTPSHTTP Secure加密的超文本传输协议443FTPFile Transfer Protocol文件传输协议(20 传输数据,21 控制连…...
微服务学习(2):实现SpringAMQP对RabbitMQ的消息收发
目录 SpringAMQP是什么 为什么采用SpringAMQP SpringAMQP应用 准备springBoot工程 实现消息发送 SpringAMQP是什么 Spring AMQP是Spring框架下用于简化AMQP(高级消息队列协议)应用开发的一套工具集,主要针对RabbitMQ等消息中间件的集成…...
《操作系统 - 清华大学》 9 -2:进程调度:调度原则
进程调度策略:原则、指标与权衡 在计算机系统中,进程调度策略至关重要。我们讲的就是有不同的这种调度策略,那么调度的原则是什么呢?原则就是选择某一个进程执行的依据,即要基于什么样的标准来挑选最合适的进程去执行…...
CSS—选择器详解:5分钟动手掌握选择器
个人博客:haichenyi.com。感谢关注 1. 目录 1–目录2–引言3–种类4–优先级 引言 什么是选择器? CSS选择器是CSS(层叠样式表)中的一种规则,用于指定要应用样式的HTML元素。它们就像是指向网页中特定元素的指针&#…...
Java——String
在 Java 中,String 类是用于表示不可变字符序列的核心类,提供了丰富的 API 用于操作字符串。以下是 String 类的关键特性和常用方法详解: 一、String 的核心特性 不可变性(Immutable) 一旦创建,字符串内容不…...
Channel State Information 信道状态信息
Channel State Information(CSI,信道状态信息)是无线通信系统中的一个重要概念,指的是接收端或发送端对无线信道特性的估计和反馈。CSI可以用于优化无线通信性能,例如信道均衡、预编码、波束成形等,以提高数…...
python中单例模式应用
数据库连接池单例模式 1. 为什么使用单例模式 创建数据库连接是一个昂贵的过程(涉及网络通信、认证等)。单例模式的连接池可以在程序启动时初始化一组连接,并在整个生命周期中重用这些连接,而不是每次请求都新建连接。同时还可…...
StarRocks 在爱奇艺大数据场景的实践
作者:林豪,爱奇艺大数据 OLAP 服务负责人 小编导读: 本文整理自爱奇艺工程师在 StarRocks 年度峰会的分享,介绍了爱奇艺 OLAP 引擎演化及引入 StarRocks 后的效果。 在广告业务中,StarRocks 替换 ImpalaKudu 后&#x…...
Easy Trans Spring Boot Starter ---Spring系列的字段翻译库
Easy Trans Spring Boot Starter 使用文档 1. 简介 easy-trans-spring-boot-starter 是一个基于 Spring Boot 的库,用于简化数据翻译和转换操作。它可以帮助你将数据库中的枚举值、状态码等转换为用户友好的文本,或者将一种数据格式转换为另一种格式。…...
