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 ID | CUSTOMER NAME | STATE | COUNTRY |
---|---|---|---|
1 | Akash | Delhi | San Franceco |
2 | Amit | Hyderabad | San Franceco |
3 | Jason | California | USA |
4 | John | Texas | USA |
5 | Simon | London | UK |
供应商表
SUPPLIER ID | SUPPLIER NAME | STATE | COUNTRY |
---|---|---|---|
1 | Apple | California | USA |
2 | TCS | Hyderabad | San Franceco |
3 | Information System | Delhi | San Franceco |
4 | Solar Energy | Bangalore | San 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";
输出:
STATE | COUNTRY |
---|---|
Texas | USA |
London | UK |
- SQL顺序除外
Select "State" ,"Country" from "Customer" Except Select "State","Country" from "Supplier" order by "State"
输出:
STATE | COUNTRY |
---|---|
London | UK |
Texas | USA |
在上面的查询中,结果集基于"状态列"进行排序
- 使用Country列的SQL Except
Select "State" ,"Country" from "Customer" Except Select "State","Country" from "Supplier" where "Country" = 'San Franceco'
输出:
STATE | COUNTRY |
---|---|
London | UK |
California | USA |
Texas | USA |
在上面的查询中,第一个SELECT查询获取所有行,并从第二个SELECT语句获取国家/地区为旧金山的行,并从第一个SELECT查询中删除相应的行。