掌握非等值连接:从简单查询到复杂匹配的应用实例
创作时间:
作者:
@小白创作中心
掌握非等值连接:从简单查询到复杂匹配的应用实例
引用
CSDN
1.
https://blog.csdn.net/zgt_certificate/article/details/140912945
非等值连接(Non-Equi Join)
非等值连接(Non-Equi Join)是关系数据库中用于连接多个表的操作,其连接条件不局限于等号 (
),而是使用其他比较运算符,例如大于 (
)、小于 (
<
)、大于等于 ()、小于等于 (
<=
)、不等于 (
<>
) 等。
这种连接类型通常用于需要复杂匹配条件的数据查询中,与等值连接相比,它提供了更广泛的匹配可能性。
非等值连接的语法
非等值连接通常使用 SQL 中的
JOIN
关键字,并结合合适的比较运算符。其基本语法如下:
SELECT 表1.字段1, 表2.字段2, ...
FROM 表1
JOIN 表2
ON 表1.字段 操作符 表2.字段;
非等值连接的场景及实例
场景 1:员工薪资级别查询
背景描述:在人力资源管理系统中,需要根据员工的薪水确定其薪资级别。假设有一个员工信息表和一个薪资级别表。
数据表结构
- 员工表 (employees):
employee_id | name | salary |
|---|---|---|
1 | 小明 | 3000 |
2 | 小红 | 5000 |
3 | 小刚 | 7000 |
- 薪资级别表 (salary_grades):
grade_id | min_salary | max_salary | grade_name |
|---|---|---|---|
1 | 0 | 3999 | 初级 |
2 | 4000 | 5999 | 中级 |
3 | 6000 | 7999 | 高级 |
SQL 查询
SELECT employees.name, employees.salary, salary_grades.grade_name
FROM employees
JOIN salary_grades
ON employees.salary BETWEEN salary_grades.min_salary AND salary_grades.max_salary;
结果集
name | salary | grade_name |
|---|---|---|
小明 | 3000 | 初级 |
小红 | 5000 | 中级 |
小刚 | 7000 | 高级 |
- 连接条件:使用了
BETWEEN
运算符来连接
employees
表和
salary_grades
表,即
employees.salary
的值必须在
salary_grades.min_salary
和
salary_grades.max_salary
之间。 - 结果:查询结果展示了每位员工的薪水以及相应的薪资级别。
场景 2:产品折扣应用
背景描述:在一个电子商务平台中,根据购买的商品数量来确定折扣。假设有一个订单表和一个折扣表。
数据表结构
- 订单表 (orders):
order_id | product_id | quantity |
|---|---|---|
101 | 1 | 5 |
102 | 2 | 15 |
103 | 3 | 25 |
- 折扣表 (discounts):
discount_id | min_quantity | max_quantity | discount |
|---|---|---|---|
1 | 1 | 10 | 5% |
2 | 11 | 20 | 10% |
3 | 21 | 30 | 15% |
SQL 查询
SELECT orders.order_id, orders.quantity, discounts.discount
FROM orders
JOIN discounts
ON orders.quantity BETWEEN discounts.min_quantity AND discounts.max_quantity;
结果集
order_id | quantity | discount |
|---|---|---|
101 | 5 | 5% |
102 | 15 | 10% |
103 | 25 | 15% |
- 连接条件:使用
BETWEEN
运算符来判断
orders.quantity
是否在
discounts.min_quantity
和
discounts.max_quantity
之间,以确定适用的折扣。 - 结果:查询结果显示每个订单对应的商品数量和可享受的折扣。
场景 3:学生成绩评估
背景描述:学校需要根据学生的总成绩判断其奖学金级别。假设有一个学生成绩表和一个奖学金级别表。
数据表结构
- 学生成绩表 (student_scores):
student_id | name | total_score |
|---|---|---|
1 | 张三 | 75 |
2 | 李四 | 85 |
3 | 王五 | 95 |
- 奖学金级别表 (scholarship_levels):
level_id | min_score | max_score | level_name |
|---|---|---|---|
1 | 0 | 79 | 三等奖 |
2 | 80 | 89 | 二等奖 |
3 | 90 | 100 | 一等奖 |
SQL 查询
SELECT student_scores.name, student_scores.total_score, scholarship_levels.level_name
FROM student_scores
JOIN scholarship_levels
ON student_scores.total_score BETWEEN scholarship_levels.min_score AND scholarship_levels.max_score;
结果集
name | total_score | level_name |
|---|---|---|
张三 | 75 | 三等奖 |
李四 | 85 | 二等奖 |
王五 | 95 | 一等奖 |
- 连接条件:使用
BETWEEN
运算符来确定
student_scores.total_score
是否在
scholarship_levels.min_score
和
scholarship_levels.max_score
之间,以决定奖学金级别。 - 结果:查询结果显示每个学生的总成绩和相应的奖学金级别。
场景 4:产品价格区间查询
背景描述:在销售系统中,需要根据产品的价格范围来分类产品。假设有一个产品表和一个价格区间表。
数据表结构
- 产品表 (products):
product_id | product_name | price |
|---|---|---|
1 | 手机 | 1500 |
2 | 电脑 | 3000 |
3 | 电视 | 4500 |
- 价格区间表 (price_ranges):
range_id | min_price | max_price | range_name |
|---|---|---|---|
1 | 0 | 1999 | 低价位 |
2 | 2000 | 3999 | 中价位 |
3 | 4000 | 5999 | 高价位 |
SQL 查询
SELECT products.product_name, products.price, price_ranges.range_name
FROM products
JOIN price_ranges
ON products.price BETWEEN price_ranges.min_price AND price_ranges.max_price;
结果集
product_name | price | range_name |
|---|---|---|
手机 | 1500 | 低价位 |
电脑 | 3000 | 中价位 |
电视 | 4500 | 高价位 |
- 连接条件:使用
BETWEEN
运算符来判断
products.price
是否在
price_ranges.min_price
和
price_ranges.max_price
之间,以分类产品价格区间。 - 结果:查询结果展示了每种产品的价格和所属的价格区间。
场景 5:车辆保险费率计算
背景描述:在车辆保险管理系统中,需要根据车辆的价格确定保险费率。假设有一个车辆表和一个保险费率表。
数据表结构
- 车辆表 (vehicles):
vehicle_id | model | price |
|---|---|---|
1 | 轿车 | 80000 |
2 | SUV | 120000 |
3 | 跑车 | 200000 |
- 保险费率表 (insurance_rates):
rate_id | min_price | max_price | rate |
|---|---|---|---|
1 | 0 | 100000 | 2% |
2 | 100001 | 150000 | 3% |
3 | 150001 | 250000 | 4% |
SQL 查询
SELECT vehicles.model, vehicles.price, insurance_rates.rate
FROM vehicles
JOIN insurance_rates
ON vehicles.price BETWEEN insurance_rates.min_price AND insurance_rates.max_price;
结果集
model | price | rate |
|---|---|---|
轿车 | 80000 | 2% |
SUV | 120000 | 3% |
跑车 | 200000 | 4% |
- 连接条件:使用
BETWEEN
运算符来确定
vehicles.price
是否在
insurance_rates.min_price
和
insurance_rates.max_price
之间,以计算保险费率。 - 结果:查询结果显示每种车辆的价格和相应的保险费率。
热门推荐
Excel表格长度测量方法详解:函数、宏和手动测量
Faker不该被淘汰?LCK赛制遭质疑,T1经理出面发声,透露幕后故事
T1被淘汰后,LCK新赛制不合理,团体对抗赛弊端引发关注
缅甸猫:迷人的温暖伙伴
交通事故发生后该怎么办?关键步骤与法律建议
铜与浓硫酸的激烈邂逅:探秘背后的化学反应与应用
最小的自然数是0还是1?自然数是否有最大值?
乙丑大运是什么属性
如何选择具有投资价值的商铺?选择商铺时需要考虑哪些因素?
房东怎么签商铺租赁合同
中国AI领域最高荣誉,成都+2
房子出了问题找谁解决?物业与维修流程全解析
明朝“狂人”李贽,讽刺孔孟之道与世俗叫板,一生精彩又悲哀
《孤岛惊魂5》黄金版与普通版区别详解:哪个版本更适合你?
双黄连口服液的成分是什么
清洁能源发电技术详解:从太阳能到地热,构建可持续能源未来
从“教父”到奥斯卡影帝,推荐阿尔·帕西诺主演的10部经典电影
读博期间,如何提高编写代码时的Debug能力和效率
诗词创作中的意境与意象关系
防盗还是便于逃生?防盗窗怎么安才能“两全其美”?
终于有人把高考赋分说清楚了
青春期的挑战:如何理解并应对孩子的情绪波动
《诗经·蒹葭》赏析:其凄婉缠绵的情致像郑卫之音的风格
禅意深处:三大禅宗公案背后的灵魂拷问,有几个人能看懂呢?
怎样使鼻梁变高
冠心病的介入治疗
为什么直线是最短路径:变分视角
散尾葵适合在室内养吗(室内散尾葵的养殖方法)
《中国科学报》头版报道!搜寻地外智慧生命的中国人
翻译与本地化服务如何应对多语言品牌命名挑战?