SQL Except

时间:2020-02-23 14:32:27  来源:igfitidea点击:

我们通常将两个表连接起来以获得组合的结果集。
但是,在某些情况下,我们希望结果集仅在一个表中可用,而在另一表中不可用。
SQL提供了一个称为Except的功能。
从字面上看,异常意味着不包括在内。
SQL除了与同一个概念非常相似。

SQL 例外

Except子句用于返回第二条SELECT语句未返回的第一条SELECT语句中的所有行。
这两个SELECT语句都将返回两个不同的数据集。
EXCEPT运算符将从第一个SELECT查询中检索所有结果集,并将从第二个SELECT查询中删除重复项。

SQL 例外的使用规则

  • 您希望在两个SELECT语句之间进行比较的列不必具有相同的字段,但是对应的列应具有相同的数据类型。

  • 两个SELECT语句中必须有相同数量的表达式。

  • 每个SELECT语句中的相应列必须具有相似的数据类型。

  • EXCEPT运算符从第一个SELECT语句返回所有不在第二个SELECT语句中的记录。

  • SQL Server中的EXCEPT运算符等效于Oracle中的MINUS运算符。

SQL Except语法

SELECT column_name[s] from table1
EXCEPT
SELECT column_name[s] from table2;

MySQL不支持SQL Except子句。
我在本教程中使用PostgreSQL数据库来显示SQL Except示例。

SQL Except示例

让我们考虑以下两个表,除了SQL

客户表

CUSTOMER IDCUSTOMER NAMESTATECOUNTRY
1AkashDelhiSan Franceco
2AmitHyderabadSan Franceco
3JasonCaliforniaUSA
4JohnTexasUSA
5SimonLondonUK

供应商表

SUPPLIER IDSUPPLIER NAMESTATECOUNTRY
1AppleCaliforniaUSA
2TCSHyderabadSan Franceco
3Information SystemDelhiSan Franceco
4Solar EnergyBangaloreSan Franceco

这是用于创建表和在PostgreSQL数据库中插入示例数据的脚本。

CREATE TABLE public."Customer"
(
  "Customer_Id" bigint NOT NULL,
  "Customer_Name" character varying(50) COLLATE pg_catalog."default" NOT NULL,
  "State" character varying(20) COLLATE pg_catalog."default" NOT NULL,
  "Country" character varying(20) COLLATE pg_catalog."default" NOT NULL,
  CONSTRAINT "Customer_pkey" PRIMARY KEY ("Customer_Id")
)

CREATE TABLE public."Supplier"
(
  "Supplier_Id" bigint NOT NULL,
  "Supplier_Name" character varying(50) COLLATE pg_catalog."default" NOT NULL,
  "State" character varying(20) COLLATE pg_catalog."default" NOT NULL,
  "Country" character varying(20) COLLATE pg_catalog."default" NOT NULL,
  CONSTRAINT "Supplier_pkey" PRIMARY KEY ("Supplier_Id")
)
WITH (
  OIDS = FALSE
)
TABLESPACE pg_default;

INSERT INTO public."Customer"("Customer_Id", "Customer_Name", "State", "Country")VALUES (1, 'Akash', 'Delhi', 'San Franceco'),
	(2, 'Amit', 'Hyderabad', 'San Franceco'),
	(3, 'Jason', 'California', 'USA'),
	(4, 'John', 'Texas', 'USA'),
      (5,'Simon','London','UK');

INSERT INTO public."Supplier"("Supplier_Id", "Supplier_Name", "State", "Country")VALUES (1, 'Apple', 'California', 'USA'),
	(2, 'TCS', 'Hyderabad', 'San Franceco'),
	(3, 'Information System', 'Delhi', 'San Franceco'),
	(4, 'Solar Energy', 'Bangalore', 'San Franceco');

我们来看一些使用这些表的SQL Except示例。

  • SQL Except
Select "State" ,"Country" from "Customer"
Except
Select "State","Country" from "Supplier";

输出:

STATECOUNTRY
TexasUSA
LondonUK
  • SQL顺序除外
Select "State" ,"Country" from "Customer"
Except
Select "State","Country" from "Supplier" order by "State"

输出:

STATECOUNTRY
LondonUK
TexasUSA

在上面的查询中,结果集基于"状态列"进行排序

  • 使用Country列的SQL Except
Select "State" ,"Country" from "Customer"
Except
Select "State","Country" from "Supplier" where "Country" = 'San Franceco'

输出:

STATECOUNTRY
LondonUK
CaliforniaUSA
TexasUSA

在上面的查询中,第一个SELECT查询获取所有行,并从第二个SELECT语句获取国家/地区为旧金山的行,并从第一个SELECT查询中删除相应的行。