SQL 系列教程(三)

目录

SQL INNER JOIN 关键词

SQL INNER JOIN 关键词

演示数据库

内连接(INNER JOIN)实例

连接三个表

SQL LEFT JOIN 关键词

SQL LEFT JOIN 关键词

演示数据库

SQL LEFT JOIN 实例

SQL RIGHT JOIN 关键词

SQL RIGHT JOIN 关键词

演示数据库

SQL RIGHT JOIN 实例

SQL FULL OUTER JOIN 关键词

SQL FULL OUTER JOIN 关键词

演示数据库

SQL FULL OUTER JOIN 实例

SQL Self JOIN

SQL Self JOIN

演示数据库

SQL Self JOIN 实例

SQL UNION 操作符

SQL UNION 操作符

演示数据库

SQL UNION 实例

SQL UNION ALL 实例

带有 WHERE 的 SQL UNION

带有 WHERE 的 SQL UNION ALL

另一个 UNION 实例

SQL GROUP BY 语句

SQL GROUP BY 语句

演示数据库

SQL GROUP BY 实例

演示数据库

SQL GROUP BY 多表连接

SQL HAVING 子句

SQL HAVING 子句

演示数据库

SQL HAVING 实例

演示数据库

更多 HAVING 实例

SQL EXISTS 运算符

SQL EXISTS 运算符

演示数据库

SQL EXISTS 实例

SQL ANY 和 ALL 运算符

SQL ANY 和 ALL 运算符

演示数据库

SQL ANY 实例

SQL ALL 实例


SQL INNER JOIN 关键词

SQL INNER JOIN 关键词

INNER JOIN 关键字在表中存在至少一个匹配时返回行。

【INNER JOIN 语法】

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

演示数据库

请看 "Orders" 表:

OrderIDCustomerIDEmployeeIDOrderDateShipperID
10308271996-09-183
103093731996-09-191
103107781996-09-202

接下来请看 "Customers" 表:

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1
 
Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico

内连接(INNER JOIN)实例

以下 SQL 语句选择包含客户信息的所有订单:

【实例】

SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

注: 只要两个表中的列之间存在匹配,INNER JOIN关键字就会选择这两个表中的所有行。如果"订单"表中的记录与"客户"中的记录不匹配,则不会显示这些订单!

连接三个表

以下 SQL 语句选择包含客户和发货人信息的所有订单:

【实例】

SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName
FROM ((Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)
INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);

SQL LEFT JOIN 关键词

SQL LEFT JOIN 关键词

LEFT JOIN 关键字会从左表 (table1) 那里返回所有的行,即使在右表 (table2) 中没有匹配的行。如果没有匹配项,则结果从右侧为NULL。

【LEFT JOIN 语法】

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

注: 在某些数据库中,左连接称为左外连接。

演示数据库

以下是从 "Customers" 表中选择的内容:

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1
 
Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico

以及从 "Orders" 表中选择的内容:

OrderIDCustomerIDEmployeeIDOrderDateShipperID
10308271996-09-183
103093731996-09-191
103107781996-09-202

SQL LEFT JOIN 实例

以下 SQL 语句将选择所有客户以及他们可能拥有的任何订单:

【实例】

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName;

SQL RIGHT JOIN 关键词

SQL RIGHT JOIN 关键词

RIGHT JOIN 关键字返回右表(table2)中的所有记录,以及左表(table1)中的匹配记录。当没有匹配项时,左侧的结果为空。

【RIGHT JOIN 语法】

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;

注: 在某些数据库中,右连接称为右外连接。

演示数据库

以下是从 "Orders" 表中选择的内容:

OrderIDCustomerIDEmployeeIDOrderDateShipperID
10308271996-09-183
103093731996-09-191
103107781996-09-202

以及从 "Employees" 表中选择的内容:

EmployeeIDLastNameFirstNameBirthDatePhoto
1DavolioNancy12/8/1968EmpID1.pic
2FullerAndrew2/19/1952EmpID2.pic
3LeverlingJanet8/30/1963EmpID3.pic

SQL RIGHT JOIN 实例

以下 SQL 语句将返回所有员工以及他们可能下的任何订单:

【实例】

SELECT Orders.OrderID, Employees.LastName, Employees.FirstName
FROM Orders
RIGHT JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
ORDER BY Orders.OrderID;

注: RIGHT JOIN 关键字返回右表(Employees)中的所有记录,即使左表(Orders)中没有匹配项。

SQL FULL OUTER JOIN 关键词

SQL FULL OUTER JOIN 关键词

当左(table1)或右(table2)表记录中存在匹配项时,FULL OUTER JOIN 关键字返回所有记录。

注: FULL OUTER JOIN 可能返回非常大的结果集!FULL OUTER JOIN 和 FULL JOIN 是相同的。

【FULL OUTER JOIN 语法】

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name
WHERE condition;

演示数据库

以下是从 "Customers" 表中选择的内容:

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1
 
Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico

以及从 "Orders" 表中选择的内容:

OrderIDCustomerIDEmployeeIDOrderDateShipperID
10308271996-09-183
103093731996-09-191
103107781996-09-202

SQL FULL OUTER JOIN 实例

以下 SQL 语句选择所有客户和所有订单:

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL OUTER JOIN Orders ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;

从结果集中进行的选择可能如下所示:

CustomerNameOrderID
Alfreds FutterkisteNull
Ana Trujillo Emparedados y helados10308
Antonio Moreno Taquería10365

注: FULL OUTER JOIN 关键字返回两个表中的所有匹配记录,无论另一个表是否匹配。因此,如果(Customers)中有行在(Orders)中没有匹配项,或者(Orders)中有行在(Customers)中没有匹配项,那么这些行也将列出。

SQL Self JOIN

SQL Self JOIN

自联接是常规联接,但表是与自身联接的。

【Self JOIN 语法】

SELECT column_name(s)
FROM table1 T1, table1 T2
WHERE condition;

注:T1 和 T2 是同一个表的不同表别名。

演示数据库

以下是从 "Customers" 表中选择的内容:

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1
 
Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico

SQL Self JOIN 实例

以下 SQL 语句匹配来自同一城市的客户:

【实例】

SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City
ORDER BY A.City;

SQL UNION 操作符

SQL UNION 操作符

UNION 操作符用于组合两个或多个SELECT语句的结果集。

  • UNION 中的每个 SELECT 语句必须具有相同的列数
  • 列还必须具有类似的数据类型
  • 每个 SELECT 语句中的列的顺序也必须相同

【UNION 语法】

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

【UNION ALL 语法】

默认情况下,UNION 操作符仅选择不同的值。要允许重复值,请使用UNION ALL:

SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

注: 结果集中的列名通常等于 UNION 中第一个 SELECT 语句中的列名。

演示数据库

以下是从 "Customers" 表中选择的内容:

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1
 
Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico

以及从 "Suppliers" 表中选择的内容:

SupplierIDSupplierNameContactNameAddressCityPostalCodeCountry
1Exotic LiquidCharlotte Cooper49 Gilbert St.LondonEC1 4SDUK
2New Orleans Cajun DelightsShelley BurkeP.O. Box 78934New Orleans70117USA
3Grandma Kelly's HomesteadRegina Murphy707 Oxford Rd.Ann Arbor48104USA

SQL UNION 实例

以下 SQL 语句从 "Customers" 和 "Suppliers" 表返回城市(仅不同的值):

【实例】

SELECT City FROM Customers
UNION
SELECT City FROM Suppliers
ORDER BY City;

注: 如果一些客户或供应商拥有相同的城市,每个城市将只列出一次,因为 UNION 只选择不同的值。使用 UNION ALL 还可以选择重复值!

SQL UNION ALL 实例

以下 SQL 语句从"Customers"和"Suppliers"表中返回 cities(也有重复值):

【实例】

SELECT City FROM Customers
UNION ALL
SELECT City FROM Suppliers
ORDER BY City;

带有 WHERE 的 SQL UNION

以下 SQL 语句从 "Customers" 和 "Suppliers" 表中返回德国(German)城市(仅不同的值):

【实例】

SELECT City, Country FROM Customers
WHERE Country='Germany'
UNION
SELECT City, Country FROM Suppliers
WHERE Country='Germany'
ORDER BY City;

带有 WHERE 的 SQL UNION ALL

以下 SQL 语句从 "Customers" 和 "Suppliers" 表返回德国(German)城市(值也重复):

【实例】

SELECT City, Country FROM Customers
WHERE Country='Germany'
UNION ALL
SELECT City, Country FROM Suppliers
WHERE Country='Germany'
ORDER BY City;

另一个 UNION 实例

以下 SQL 语句列出了所有客户和供应商:

【实例】

SELECT 'Customer' AS Type, ContactName, City, Country
FROM Customers
UNION
SELECT 'Supplier', ContactName, City, Country
FROM Suppliers;

注:请注意上面的 "AS Type" ——它是一个别名。SQL 别名用于为表或列提供临时名称。别名仅在查询期间存在。因此,我们在这里创建了一个名为 "Type" 的临时列,列出联系人是"客户"还是"供应商"。

SQL GROUP BY 语句

SQL GROUP BY 语句

GROUP BY 语句将具有相同值的行分组为摘要行。

GROUP BY 语句通常与聚合函数(COUNT、MAX、MIN、SUM、AVG)一起使用,将结果集按一列或多列进行分组。

【GROUP BY 语法】

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);

演示数据库

以下是从示例数据库的 "客户(Customers)" 表中查询的内容:

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1
 
Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico
4
 
Around the HornThomas Hardy120 Hanover Sq.LondonWA1 1DPUK
5Berglunds snabbköpChristina BerglundBerguvsvägen 8LuleåS-958 22Sweden

SQL GROUP BY 实例

以下 SQL 语句列出了每个地区的客户数量:

【实例】

SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country;

以下 SQL 语句列出了每个地区的客户数量,按从高到低排序:

【实例】

SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
ORDER BY COUNT(CustomerID) DESC;

演示数据库

以下是从 "Orders" 表中选择的内容:

OrderIDCustomerIDEmployeeIDOrderDateShipperID
102489051996-07-043
102498161996-07-051
102503441996-07-082

以及从 "Shippers" 表中选择的内容:

ShipperIDShipperName
1Speedy Express
2United Package
3Federal Shipping

SQL GROUP BY 多表连接

以下 SQL 语句列出了每个发货人发送的订单数量:

【实例】

SELECT Shippers.ShipperName, COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders
LEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID
GROUP BY ShipperName;

SQL HAVING 子句

SQL HAVING 子句

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。

HAVING 子句可以让我们筛选分组后的各组数据。

【HAVING 语法】

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);

演示数据库

以下是从示例数据库的 "客户(Customers)" 表中查询的内容:

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1
 
Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico
4
 
Around the HornThomas Hardy120 Hanover Sq.LondonWA1 1DPUK
5Berglunds snabbköpChristina BerglundBerguvsvägen 8LuleåS-958 22Sweden

SQL HAVING 实例

下面的 SQL 语句列出了每个国家/地区的客户数量。仅包括拥有5个以上客户的国家/地区:

【实例】

SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5;

以下 SQL 语句列出了每个国家/地区的客户数量,按从高到低的顺序排列(仅包括客户超过5个的国家/地区):

【实例】

SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5
ORDER BY COUNT(CustomerID) DESC;

演示数据库

以下是从 "Orders" 表中选择的内容:

OrderIDCustomerIDEmployeeIDOrderDateShipperID
102489051996-07-043
102498161996-07-051
102503441996-07-082

以及从 "Employees" 表中选择的内容:

EmployeeIDLastNameFirstNameBirthDatePhotoNotes
1DavolioNancy1968-12-08EmpID1.picEducation includes a BA....
2FullerAndrew1952-02-19EmpID2.picAndrew received his BTS....
3LeverlingJanet1963-08-30EmpID3.picJanet has a BS degree....

更多 HAVING 实例

以下SQL语句列出了已注册超过10个订单的员工:

【实例】

SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders
FROM (Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID)
GROUP BY LastName
HAVING COUNT(Orders.OrderID) > 10;

以下SQL语句列出了员工 "Davolio" 或 "Fuller" 注册的订单是否超过25份:

【实例】

SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders
FROM Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
WHERE LastName = 'Davolio' OR LastName = 'Fuller'
GROUP BY LastName
HAVING COUNT(Orders.OrderID) > 25;

SQL EXISTS 运算符

SQL EXISTS 运算符

EXISTS 运算符用于测试子查询中是否存在任何记录。

如果子查询返回一条或多条记录,则 EXISTS 运算符返回true。

【EXISTS 语法】

SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);

演示数据库

以下是从示例数据库的 "Products" 表中选择的内容:

ProductIDProductNameSupplierIDCategoryIDUnitPrice
1Chais1110 boxes x 20 bags18
2Chang1124 - 12 oz bottles19
3Aniseed Syrup1212 - 550 ml bottles10
4Chef Anton's Cajun Seasoning2248 - 6 oz jars22
5Chef Anton's Gumbo Mix2236 boxes21.35

以及从 "Suppliers" 表中选择的内容:

SupplierIDSupplierNameContactNameAddressCityPostalCodeCountry
1Exotic LiquidCharlotte Cooper49 Gilbert St.LondonEC1 4SDUK
2New Orleans Cajun DelightsShelley BurkeP.O. Box 78934New Orleans70117USA
3Grandma Kelly's HomesteadRegina Murphy707 Oxford Rd.Ann Arbor48104USA
4Tokyo TradersYoshi Nagase9-8 Sekimai Musashino-shiTokyo100Japan

SQL EXISTS 实例

以下 SQL 语句返回 TRUE 并列出产品价格低于20的供应商:

【实例】

SELECT SupplierName
FROM Suppliers
WHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID = Suppliers.supplierID AND Price < 20);

以下 SQL 语句返回 TRUE 并列出产品价格等于22的供应商:

【实例】

SELECT SupplierName
FROM Suppliers
WHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID = Suppliers.supplierID AND Price = 22);

SQL ANY 和 ALL 运算符

SQL ANY 和 ALL 运算符

ANY 和 ALL 运算符与 WHERE 或 HAVING 子句一起使用。

如果任何子查询值满足条件,则 ANY 运算符返回 true。

如果所有子查询值都满足条件,则 ALL 运算符返回 true。

【ANY 语法】

SELECT column_name(s)
FROM table_name
WHERE column_name operator ANY
(SELECT column_name FROM table_name WHERE condition);

【ALL 语法】

SELECT column_name(s)
FROM table_name
WHERE column_name operator ALL
(SELECT column_name FROM table_name WHERE condition);

注: 运算符必须是标准比较运算符 (=, <>, !=, >, >=, <, <=)。

演示数据库

以下是从示例数据库的 "Products" 表中选择的内容:

ProductIDProductNameSupplierIDCategoryIDUnitPrice
1Chais1110 boxes x 20 bags18
2Chang1124 - 12 oz bottles19
3Aniseed Syrup1212 - 550 ml bottles10
4Chef Anton's Cajun Seasoning2248 - 6 oz jars22
5Chef Anton's Gumbo Mix2236 boxes21.35

以及从 "OrderDetails" 表中选择的内容:

OrderDetailIDOrderIDProductIDQuantity
1102481112
2102484210
310248725
410249149
5102495140

SQL ANY 实例

如果任何子查询值满足条件,则 ANY 运算符返回 TRUE。

如果在 OrderDetails 表中找到 quantity=10 的任何记录,以下 SQL 语句将返回 TRUE 并列出产品名称:

【实例】

SELECT ProductName
FROM Products
WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity = 10);

如果在 OrderDetails 表中发现任何数量大于99的记录,以下 SQL 语句将返回 TRUE 并列出产品名称:

【实例】

SELECT ProductName
FROM Products
WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity > 99);

SQL ALL 实例

如果所有子查询值都满足条件,则 ALL 运算符返回 TRUE。

如果 OrderDetails 表中的所有记录的数量都为10,则以下 SQL 语句将返回 TRUE 并列出产品名称(因此,本例将返回 FALSE,因为并非 OrderDetails 表中的所有记录的数量都为10):

【实例】

SELECT ProductName
FROM Products
WHERE ProductID = ALL (SELECT ProductID FROM OrderDetails WHERE Quantity = 10);
  • 30
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值