首页 / 香港服务器 / 正文
SQL MINUS 运算符详解及应用,sql minus 怎么用1

Time:2024年12月13日 Read:6 评论:42 作者:y21dr45

在结构化查询语言(SQL)中,MINUS运算符用于返回第一个SELECT语句中有而第二个SELECT语句中没有的记录,它常用于数据仓库、ETL操作以及各种数据分析场景中,本文将深入探讨MINUS运算符的定义、用法及其在不同数据库系统中的差异,并通过实例展示其实际应用。

SQL MINUS 运算符详解及应用,sql minus 怎么用

一、MINUS运算符的基本概念

MINUS运算符是SQL中的一种集合操作符,与UNION、INTERSECT和EXCEPT类似,它用于比较两个查询结果并返回第一个查询结果中存在且第二个查询结果中不存在的记录,MINUS运算符通常用于以下几种情况:

1、数据清洗:从数据集中删除不需要的记录。

2、差异分析:找出两个数据集之间的差异。

3、数据对比:比较不同时间点或不同来源的数据变化。

二、语法及使用注意事项

基本的MINUS语法如下:

SELECT column_lists FROM table_name WHERE condition
MINUS
SELECT column_lists FROM table_name WHERE condition;

需要特别注意的是:

1、每个与MINUS运算符连接的SELECT语句的数据类型和字段数量必须相同。

2、对应的列必须具有相同或至少可转换的数据类型。

三、实例解析

为了更好地理解MINUS运算符的使用,下面通过几个实例进行详细解析。

1. 基本实例

假设我们有两个表:Old_Worker_Info(旧员工信息表)和New_Worker_Info(新员工信息表),结构如下:

CREATE TABLE Old_Worker_Info (
    Worker_ID INT NOT NULL PRIMARY KEY,
    Worker_First_Name VARCHAR(100),
    Worker_Last_Name VARCHAR(100),
    Worker_Dept_Id INT NOT NULL,
    Worker_Joining_Date VARCHAR(80),
    Worker_City VARCHAR(80),
    Worker_Salary INT
);
CREATE TABLE New_Worker_Info (
    Worker_ID INT NOT NULL PRIMARY KEY,
    Worker_First_Name VARCHAR(100),
    Worker_Last_Name VARCHAR(100),
    Worker_Dept_Id INT NOT NULL,
    Worker_Joining_Date VARCHAR(80),
    Worker_City VARCHAR(80),
    Worker_Salary INT
);

插入示例数据:

INSERT INTO Old_Worker_Info (Worker_ID, Worker_First_Name, Worker_Last_Name, Worker_Dept_Id, Worker_Joining_Date, Worker_City, Worker_Salary)
VALUES (1001, 'Arush', 'Sharma', 4001, '2020-01-02', 'Delhi', 20000),
       (1002, 'Bulbul', 'Roy', 4002, '2019-12-31', 'Delhi', 38000),
       (1004, 'Saurabh', 'Sharma', 4001, '2020-10-10', 'Mumbai', 45000),
       (1005, 'Shivani', 'Singhania', 4001, '2019-07-15', 'Kolkata', 42000),
       (1006, 'Avinash', 'Sharma', 4002, '2019-11-11', 'Delhi', 28000),
       (1007, 'Shyam', 'Besas', 4003, '2021-06-21', 'Lucknow', 35000);
INSERT INTO New_Worker_Info (Worker_ID, Worker_First_Name, Worker_Last_Name, Worker_Dept_Id, Worker_Joining_Date, Worker_City, Worker_Salary)
VALUES (1002, 'Bulbul', 'Roy', 4002, '2019-12-31', 'Delhi', 38000),
       (1003, 'Rahul', 'Das', 4004, '2022-01-23', 'Chennai', 48000),
       (1004, 'Saurabh', 'Sharma', 4001, '2020-10-10', 'Mumbai', 45000),
       (1008, 'Ravi', 'Kumar', 4005, '2023-03-15', 'Hyderabad', 52000);

如果我们想找出在Old_Worker_Info表中但不在New_Worker_Info表中的员工记录,可以使用下面的SQL查询:

SELECT * FROM Old_Worker_Info
MINUS
SELECT * FROM New_Worker_Info;

该查询将返回以下结果:

| Worker_ID | Worker_First_Name | Worker_Last_Name | Worker_Dept_Id | Worker_Joining_Date | Worker_City | Worker_Salary |
|-----------|-------------------|-----------------|----------------|---------------------|-------------|---------------|
|      1001 | Arush             | Sharma          |          4001 | 2020-01-02         | Delhi      |       20000    |
|      1005 | Shivani           | Singhania       |          4001 | 2019-07-15         | Kolkata    |       42000    |
|      1006 | Avinash           | Sharma          |          4002 | 2019-11-11         | Delhi      |       28000    |
|      1007 | Shyam             | Besas           |          4003 | 2021-06-21         | Lucknow    |       35000    |

这些记录是在Old_Worker_Info表中存在但不在New_Worker_Info表中存在的员工信息。

2. 复杂实例

考虑另一个实例,我们有两张销售信息表:Store_Information(店面销售信息)和Internet_Sales(网络销售信息),结构如下:

CREATE TABLE Store_Information (
    store_name VARCHAR(100),
    Sales INT,
    Sale_Date VARCHAR(80)
);
CREATE TABLE Internet_Sales (
    Sale_Date VARCHAR(80),
    Sales INT
);

插入示例数据:

INSERT INTO Store_Information (store_name, Sales, Sale_Date) VALUES
('Los Angeles', 1500, 'Jan-05-1999'),
('San Diego', 250, 'Jan-07-1999'),
('Los Angeles', 300, 'Jan-08-1999'),
('Boston', 700, 'Jan-08-1999');
INSERT INTO Internet_Sales (Sale_Date, Sales) VALUES
('Jan-07-1999', 250),
('Jan-10-1999', 535),
('Jan-11-1999', 320),
('Jan-12-1999', 750);

如果我们想知道哪些日期有店面销售但没有网络销售,可以使用MINUS运算符:

SELECT Sale_Date FROM Store_Information
MINUS
SELECT Sale_Date FROM Internet_Sales;

该查询将返回以下结果:

| Sale_Date |
|-----------|
| Jan-05-1999|
| Jan-08-1999|

这些日期表示有店面销售但没有网络销售的日期。

四、MySQL中的MINUS模拟

需要注意的是,MySQL并不直接支持MINUS运算符,但是可以通过LEFT JOIN子句来模拟MINUS操作:

SELECT column_list FROM table1
LEFT JOIN table2 ON condition
WHERE table2.column_name IS NULL;

模拟

标签: SQLMINUS 
排行榜
关于我们
「好主机」服务器测评网专注于为用户提供专业、真实的服务器评测与高性价比推荐。我们通过硬核性能测试、稳定性追踪及用户真实评价,帮助企业和个人用户快速找到最适合的服务器解决方案。无论是云服务器、物理服务器还是企业级服务器,好主机都是您值得信赖的选购指南!
快捷菜单1
服务器测评
VPS测评
VPS测评
服务器资讯
服务器资讯
扫码关注
鲁ICP备2022041413号-1