目录
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" 表:
OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
---|---|---|---|---|
10308 | 2 | 7 | 1996-09-18 | 3 |
10309 | 37 | 3 | 1996-09-19 | 1 |
10310 | 77 | 8 | 1996-09-20 | 2 |
接下来请看 "Customers" 表:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
内连接(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" 表中选择的内容:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
以及从 "Orders" 表中选择的内容:
OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
---|---|---|---|---|
10308 | 2 | 7 | 1996-09-18 | 3 |
10309 | 37 | 3 | 1996-09-19 | 1 |
10310 | 77 | 8 | 1996-09-20 | 2 |
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" 表中选择的内容:
OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
---|---|---|---|---|
10308 | 2 | 7 | 1996-09-18 | 3 |
10309 | 37 | 3 | 1996-09-19 | 1 |
10310 | 77 | 8 | 1996-09-20 | 2 |
以及从 "Employees" 表中选择的内容:
EmployeeID | LastName | FirstName | BirthDate | Photo |
---|---|---|---|---|
1 | Davolio | Nancy | 12/8/1968 | EmpID1.pic |
2 | Fuller | Andrew | 2/19/1952 | EmpID2.pic |
3 | Leverling | Janet | 8/30/1963 | EmpID3.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" 表中选择的内容:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
以及从 "Orders" 表中选择的内容:
OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
---|---|---|---|---|
10308 | 2 | 7 | 1996-09-18 | 3 |
10309 | 37 | 3 | 1996-09-19 | 1 |
10310 | 77 | 8 | 1996-09-20 | 2 |
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;
从结果集中进行的选择可能如下所示:
CustomerName | OrderID |
---|---|
Alfreds Futterkiste | Null |
Ana Trujillo Emparedados y helados | 10308 |
Antonio Moreno Taquería | 10365 |
注: 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" 表中选择的内容:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
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" 表中选择的内容:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
以及从 "Suppliers" 表中选择的内容:
SupplierID | SupplierName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Exotic Liquid | Charlotte Cooper | 49 Gilbert St. | London | EC1 4SD | UK |
2 | New Orleans Cajun Delights | Shelley Burke | P.O. Box 78934 | New Orleans | 70117 | USA |
3 | Grandma Kelly's Homestead | Regina Murphy | 707 Oxford Rd. | Ann Arbor | 48104 | USA |
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)" 表中查询的内容:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
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" 表中选择的内容:
OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
---|---|---|---|---|
10248 | 90 | 5 | 1996-07-04 | 3 |
10249 | 81 | 6 | 1996-07-05 | 1 |
10250 | 34 | 4 | 1996-07-08 | 2 |
以及从 "Shippers" 表中选择的内容:
ShipperID | ShipperName |
---|---|
1 | Speedy Express |
2 | United Package |
3 | Federal 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)" 表中查询的内容:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
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" 表中选择的内容:
OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
---|---|---|---|---|
10248 | 90 | 5 | 1996-07-04 | 3 |
10249 | 81 | 6 | 1996-07-05 | 1 |
10250 | 34 | 4 | 1996-07-08 | 2 |
以及从 "Employees" 表中选择的内容:
EmployeeID | LastName | FirstName | BirthDate | Photo | Notes |
---|---|---|---|---|---|
1 | Davolio | Nancy | 1968-12-08 | EmpID1.pic | Education includes a BA.... |
2 | Fuller | Andrew | 1952-02-19 | EmpID2.pic | Andrew received his BTS.... |
3 | Leverling | Janet | 1963-08-30 | EmpID3.pic | Janet 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" 表中选择的内容:
ProductID | ProductName | SupplierID | CategoryID | Unit | Price |
---|---|---|---|---|---|
1 | Chais | 1 | 1 | 10 boxes x 20 bags | 18 |
2 | Chang | 1 | 1 | 24 - 12 oz bottles | 19 |
3 | Aniseed Syrup | 1 | 2 | 12 - 550 ml bottles | 10 |
4 | Chef Anton's Cajun Seasoning | 2 | 2 | 48 - 6 oz jars | 22 |
5 | Chef Anton's Gumbo Mix | 2 | 2 | 36 boxes | 21.35 |
以及从 "Suppliers" 表中选择的内容:
SupplierID | SupplierName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Exotic Liquid | Charlotte Cooper | 49 Gilbert St. | London | EC1 4SD | UK |
2 | New Orleans Cajun Delights | Shelley Burke | P.O. Box 78934 | New Orleans | 70117 | USA |
3 | Grandma Kelly's Homestead | Regina Murphy | 707 Oxford Rd. | Ann Arbor | 48104 | USA |
4 | Tokyo Traders | Yoshi Nagase | 9-8 Sekimai Musashino-shi | Tokyo | 100 | Japan |
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" 表中选择的内容:
ProductID | ProductName | SupplierID | CategoryID | Unit | Price |
---|---|---|---|---|---|
1 | Chais | 1 | 1 | 10 boxes x 20 bags | 18 |
2 | Chang | 1 | 1 | 24 - 12 oz bottles | 19 |
3 | Aniseed Syrup | 1 | 2 | 12 - 550 ml bottles | 10 |
4 | Chef Anton's Cajun Seasoning | 2 | 2 | 48 - 6 oz jars | 22 |
5 | Chef Anton's Gumbo Mix | 2 | 2 | 36 boxes | 21.35 |
以及从 "OrderDetails" 表中选择的内容:
OrderDetailID | OrderID | ProductID | Quantity |
---|---|---|---|
1 | 10248 | 11 | 12 |
2 | 10248 | 42 | 10 |
3 | 10248 | 72 | 5 |
4 | 10249 | 14 | 9 |
5 | 10249 | 51 | 40 |
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);