SQL进阶必备:从计算字段到多表联结,让查询效率翻倍!
一、创建计算字段:让数据“按需重组”
存储在数据库中的原始数据,往往不符合直接使用的格式(比如分散在多列的信息、需要计算的数值),这时候“计算字段”就能派上用场——它不是表中实际存在的列,而是运行时通过SQL语句动态创建的虚拟列。
1. 核心用法:拼接与算术运算
- 字段拼接:用
Concat()函数将多列数据合并为一个字段,比如将供应商名称和国家拼接成“名称(国家)”格式:SELECT Concat(RTrim(vend_name), '(', RTrim(vend_country), ')') AS vend_title
FROM vendors;
其中
RTrim()用于去除字段右侧多余空格,AS给计算字段起别名(别名是客户机引用该列的关键)。 - 算术计算:直接对数值型字段进行加减乘除运算,比如计算订单中每项物品的总金额(单价×数量):
SELECT prod_id, quantity, item_price,
quantity * item_price AS expanded_price
FROM orderitems WHERE order_num = 20005;
2. 关键技巧:别名的正确使用
别名不仅能简化计算字段的引用,还能解决列名含特殊字符、名称不清晰的问题。命名时建议简洁明了,比如用total_price代替quantity*item_price,让SQL语句更易读。
二、数据处理函数:给数据“做精加工”
函数是SQL处理数据的“工具箱”,能快速完成文本格式化、日期计算、数值转换等操作。MySQL支持文本、日期时间、数值三类常用函数,重点掌握这些高频用法:
1. 文本处理函数:搞定字符串格式
- 大小写转换:
Upper()(转大写)、Lower()(转小写) - 截取与查找:
Left()(取左侧字符)、Locate()(查找子串位置) - 去空格:
Trim()(去除首尾空格)、RTrim()(去除右侧空格) - 语音匹配:
Soundex()(按发音匹配字符串,比如匹配“Y.Lee”和“Y.Lie”):SELECT cust_name FROM customers
WHERE Soundex(cust_contact) = Soundex('Y Lie');
2. 日期时间函数:精准处理时间数据
日期是SQL查询中高频过滤条件,核心函数用法如下:
- 获取当前时间:
Now()(日期+时间)、CurDate()(仅日期) - 提取日期成分:
Year()(年份)、Month()(月份)、Day()(天数) - 日期比较:用
Date()函数忽略时间部分,只对比日期:SELECT cust_id FROM orders
WHERE Date(order_date) = '2005-09-01';
3. 数值处理函数:简化数学运算
常用函数包括Abs()(绝对值)、Rand()(随机数)、Sum()(求和)等,多用于数值型数据的统计与转换。
三、汇总数据:用聚集函数快速统计
当需要对数据进行统计分析(比如求平均值、计数、找最值)时,不需要逐行检索数据,直接用聚集函数就能快速得到结果。
1. 5个核心聚集函数
| 函数 | 功能 |
|---|---|
AVG() |
返回某列平均值(忽略NULL值) |
COUNT() |
统计行数(COUNT(*)含NULL,COUNT(列名)不含NULL) |
MAX() |
返回某列最大值 |
MIN() |
返回某列最小值 |
SUM() |
返回某列值之和 |
2. 实用示例
- 计算所有产品的平均价格:
SELECT AVG(prod_price) AS avg_price FROM products;
- 统计有电子邮件的客户数量:
SELECT COUNT(cust_email) AS num_cust FROM customers;
- 合计某订单的总金额:
SELECT SUM(quantity * item_price) AS total FROM orderitems WHERE order_num = 20005;
四、分组数据:按条件分类统计
汇总函数默认对整个表生效,而GROUP BY子句能将数据按指定列分组,让聚集函数对每个组单独计算,比如“统计每个供应商的产品数量”“每个客户的订单数”。
1. 基础用法:GROUP BY + 聚集函数
SELECT vend_id, COUNT(*) AS num_prods
FROM products GROUP BY vend_id;
该语句按vend_id分组,统计每个供应商的产品数量。
2. 关键补充:HAVING过滤分组
WHERE用于过滤行,HAVING用于过滤分组(只能跟在GROUP BY后)。比如筛选出产品数量≥2且单价≥10的供应商:
SELECT vend_id, COUNT(*) AS num_prods
FROM products WHERE prod_price >= 10
GROUP BY vend_id HAVING COUNT(*) >= 2;
3. 注意事项
GROUP BY后列出的列,必须是SELECT中的非聚集列(或表达式);- 分组后如需排序,需加
ORDER BY(GROUP BY不保证分组顺序)。
五、子查询:用“查询嵌套”解决复杂问题
子查询(嵌套查询)是将一个查询结果作为另一个查询的条件或字段,适合解决“多步骤”的数据检索,比如“找出订购了某产品的所有客户”。
1. 核心场景:WHERE子句中的子查询
比如查找订购了产品TNT2的客户名称,需分3步:①找含TNT2的订单号→②找这些订单对应的客户ID→③找客户ID对应的客户信息,用子查询可合并为一条语句:
SELECT cust_name FROM customers
WHERE cust_id IN (
SELECT cust_id FROM orders
WHERE order_num IN (
SELECT order_num FROM orderitems WHERE prod_id = 'TNT2'
)
);
2. 进阶用法:作为计算字段的子查询
比如统计每个客户的订单总数,将子查询作为计算字段:
SELECT cust_name,
(SELECT COUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id) AS orders
FROM customers;
这种“相关子查询”会对外部查询的每一行执行一次内部查询,需注意列名的完全限定(比如orders.cust_id),避免歧义。
六、联结表:打破数据孤岛(重点!)
关系数据库中,数据被分散存储在多个表中(比如客户表、订单表、产品表),联结(JOIN)是将这些表按关联关系组合查询的核心技术,也是SQL最强大的功能之一。
1. 先搞懂:为什么需要联结?
比如要查询“客户名称+订单号+订购产品”,这些信息分散在customers、orders、orderitems三个表中,只有通过联结才能一次性检索,避免数据重复存储(比如客户信息不会在每个订单中重复)。
2. 基础联结:内部联结(等值联结)
最常用的联结方式,通过两表中相同的列(比如vendors.vend_id和products.vend_id)匹配数据:
SELECT vend_name, prod_name, prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id;
或用标准SQL的INNER JOIN语法(更清晰,推荐使用):
SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
3. 关键提醒:避免笛卡儿积
如果联结时忘记写WHERE或ON条件,MySQL会返回两表的“笛卡儿积”(行数=表1行数×表2行数),导致数据冗余且无意义,一定要注意!
4. 多表联结示例
查询订单20005的客户名称、产品名和数量,需联结3个表:
SELECT cust_name, prod_name, quantity
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id
AND orderitems.order_num = orders.order_num
AND orderitems.order_num = 20005;
总结:SQL进阶的核心逻辑
这6章内容层层递进,从“处理单表数据”(计算字段、函数),到“统计单表数据”(汇总、分组),再到“跨表关联数据”(子查询、联结),本质是逐步提升数据处理的“维度”和“灵活性”。
SQL进阶必备:从计算字段到多表联结,让查询效率翻倍!的更多相关文章
- 1.3(SQL学习笔记)计算字段及函数
一.计算字段 1.1拼接字段 一般情况下返回的字段是指定列的属性名.如果有时我们对返回格式有特殊要求. 例如,我们需要将显示商品名,即商品价格,同时商品名后面的价格放在括号内. prod_name(p ...
- SQL语句添加删除修改字段及一些表与字段的基本操作
用SQL语句添加删除修改字段 1.增加字段 alter table docdsp add dspcode char(200)2.删除字段 ALTER TABLE table_NA ...
- 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等
用SQL语句添加删除修改字段 1.增加字段 alter table docdsp add dspcode char(200) 2.删除字段 ALTER TABLE table_NAME DROP CO ...
- Linux进阶:让效率翻倍的Bash技巧(一)
http://blog.tpircsboy.com/tech/bash-skills-part1/
- id拼接保存到单个字段后作为表连接的查询条件
SELECT q.id, concat(q. NAME) qname, d.id did, d. NAME FROM question_po q LEFT JOIN data_configuratio ...
- Excel透视表进阶之计算字段、计算项、切片器、页面布局
计算字段 在透视表的字段列表中通过函数.公式等方式构建一个新的字段 又称虚拟字段,因为计算字段不会出现在数据源中,对于普通字段的操作,都可以对计算字段进行操作 计算字段只能出现在值区域,不能出现在筛选 ...
- 读书笔记--SQL必知必会07--创建计算字段
7.1 计算字段 字段(field),基本与列(column)含义相同. 利用计算字段可以直接从数据库中检索出转换.计算或格式化过的数据. 计算字段不实际存在于数据库表中,是运行时在SELECT语句内 ...
- (转)SQL Server 2005 中的计算字段
在实际工作上遇到的问题: 在订单表中有某项商品是将“订购数量(Quantity)”乘以“单件价格(UnitCost)”等于该项商品的总价(Subtotal). 在数据表中有的列(以下皆改叫为“字段”) ...
- SQL学习之计算字段的用法与解析
一.计算字段 1.存储在数据库表中的数据一般不是应用程序所需要的格式.大多数情况下,数据表中的数据都需要进行二次处理.下面举几个例子. (1).我们需要一个字段同时显示公司名和公司地址,但这两个信息存 ...
- SQL 必知必会·笔记<5>创建计算字段
字段(field) 基本上与列(column)的意思相同,经常互换使用,不过数据库列一 般称为列,而术语字段通常与计算字段一起使用. 拼接(concatenate) 将值联结到一起(将一个值附加到另一 ...
随机推荐
- Onvif/RTSP视频流对接云平台-实现高性能云端直播及录像存储方案
有的时候,我们的流媒体服务是架设在局域网当中,且这种局域网络有时会大于一个.当每个局域网络中,实际对接到Onvif/RTSP流媒体服务的摄像机并不是很多.摄像机的接入,又需要长期录像存储监控. 当然, ...
- T0和T1可编程选择为定时功能与计数功能,二者有什么不同?
T0或T1用做计数器时,分别对从芯片引脚T0(P3.4)或T1(P3.5)上输入的脉冲进行计数,外部脉冲的下降沿将触发计数,没输入一个脉冲,加法计数器加1.计数器对外部输入信号的占空比没有特别的限制, ...
- Rust备忘录 - 容器数据结构
- phpkg 让 PHP 摆脱 Composer 依赖地狱
phpkg 让 PHP 摆脱 Composer 依赖地狱 Composer 挺好,但 PHP 还能更强 写 PHP 的都知道,Composer 用起来很顺手:composer require.vend ...
- git删除本地和远程分支
一.删除分支 删除当前所在分支需要先切换到其他分支再进行操作,假设删除 dev-test 1.删除本地分支 -d 会在删除分支之前检查merge状态,查看dev-test是否已经合并到了其他分支.若没 ...
- 《ZeroTier教程》02-使用docker部署自建PLANET和controller 二次开发ztncui控制面板
原文永久链接:https://forum.piwind.com/d/39-zerotierjiao-cheng-02-shi-yong-dockerbu-shu-zi-jian-planethe-co ...
- 直击现场! “ 直通乌镇 ”开源赛复赛收官,OpenCSG担任评委,十强藏着哪些产业机会?
2025年9月16日,备受瞩目的"直通乌镇"全球互联网开源模型应用赛复赛在杭州圆满落幕.浙江省经济和信息化厅相关领导及各界专家.参赛团队代表齐聚一堂,共同见证了这一激动人心的时刻. ...
- Virtuoso的Layout操作与Calibre DRC&LVS
Virtuoso的Layout操作与Calibre DRC&LVS 很久之前写过一篇关于Virtuoso版图的基本操作以及怎么运行Calibre的DRC和LVS,但没有记录Virtuoso L ...
- 在CentOS 7中配置登录为字符登录模式
在CentOS 7中配置登录为字符登录模式,可以通过修改系统服务的默认目标来实现.字符登录模式通常对应于多用户模式(multi-user mode),在这种模式下,系统不提供图形界面,而是直接进入命令 ...
- KAL1 LINUX 官方文档之kali nethunter文档 --- NetHunter Rootless
译者注:非常建议使用这个方法来构建kali,几乎是所有手机,在我的k20上亲测可用, 不具有担保的最大灵活性 在任何没有root的原生安卓设备上安装Kali NetHunter,而不会使保修无效. 先 ...