SQL 高级

BETWEEN ... AND

操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。

语法:

SELECT 列名称 FROM 表名称 WHERE 列名称 BETWEEN 值1 AND 值2

原始的表 (在实例中使用:)

LastNameFirstNameAddressCity
AdamsJohnOxford StreetLondon
BushGeorgeFifth AvenueNew York
CarterThomasChangan StreetBeijing
GatesBillXuanwumen 10Beijing

实例 1

如需以字母顺序显示介于 "Adams"(包括)和 "Carter"(不包括)之间的人,请使用下面的 SQL:

SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'

结果:

LastNameFirstNameAddressCity
AdamsJohnOxford StreetLondon
BushGeorgeFifth AvenueNew York

重要事项:不同的数据库对 BETWEEN...AND 操作符的处理方式是有差异的。某些数据库会列出介于 "Adams" 和 "Carter" 之间的人,但不包括 "Adams" 和 "Carter" ;某些数据库会列出介于 "Adams" 和 "Carter" 之间并包括 "Adams" 和 "Carter" 的人;而另一些数据库会列出介于 "Adams" 和 "Carter" 之间的人,包括 "Adams" ,但不包括 "Carter" 。

所以,请检查你的数据库是如何处理 BETWEEN....AND 操作符的!

实例 2

如需使用上面的例子显示范围之外的人,请使用 NOT 操作符:

SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter'

结果:

LastNameFirstNameAddressCity
CarterThomasChangan StreetBeijing
GatesBillXuanwumen 10Beijing

 

通过使用 SQL,别名(Alias)可用于列名称和表名称。

列名别名

语法:

SELECT 列名称 AS 列的别名 FROM 表名称

表名称别名

语法:

SELECT 列名称 FROM 表名称 AS 表的别名

实例: 使用一个列名别名

表 Persons:

LastNameFirstNameAddressCity
AdamsJohnOxford StreetLondon
BushGeorgeFifth AvenueNew York
CarterThomasChangan StreetBeijing

SQL:

SELECT LastName AS Family, FirstName AS Name FROM Persons

结果:

FamilyName
AdamsJohn
BushGeorge
CarterThomas

实例: 使用一个表名称别名

表 Persons:

LastNameFirstNameAddressCity
AdamsJohnOxford StreetLondon
BushGeorgeFifth AvenueNew York
CarterThomasChangan StreetBeijing

SQL:

SELECT LastName, FirstName FROM Persons AS Employees

结果:

表 Employees:

LastNameFirstName
AdamsJohn
BushGeorge
CarterThomas

Join 和 Key

有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。

数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。Employee_ID 会区分开每一个人,即使他们中的人都着相同的名字。

当你看到下面的例子时,请注意以下几点:

  • "Employee_ID" 列是 "Employees" 表的主键
  • "Prod_ID" 列是 "Orders" 表的主键
  • "Orders" 表中的 "Employee_ID" 列用于引用"Employees"表中的员工,而无需使用他们的确切姓名

表 Employees:

Employee_IDName
01Adams, John
02Bush, George
03Carter, Thomas
04Gates, Bill

表 Orders:

Prod_IDProductEmployee_ID
234Printer01
657Table03
865Chair03

引用两个表

我们可以通过引用两个表的方式,从两个表中获取数据:

实例

谁订购了产品,并且他们订购了什么产品?

SELECT Employees.Name, Orders.Product FROM Employees, Orders
WHERE Employees.Employee_ID = Orders.Employee_ID 

结果:

NameProduct
Adams, JohnPrinter
Carter, ThomasTable
Carter, ThomasChair

实例

谁订购了打印机?

SELECT Employees.Name
FROM Employees, Orders
WHERE Employees.Employee_ID = Orders.Employee_ID
AND Orders.Product = 'Printer' 

结果:

Name
Adams, John

使用 Join

我们也可以使用关键词 JOIN 来从两个表中获取数据:

内连接(INNER JOIN)

语法:

SELECT 字段1, 字段2, 字段3
FROM 第一个表
INNER JOIN 第二个表
ON 第一个表.keyfield = 第二个表.foreign_keyfield 

实例

谁定购了产品,并且他们定购了什么?

SELECT Employees.Name, Orders.Product
FROM Employees
INNER JOIN Orders
ON Employees.Employee_ID=Orders.Employee_ID

内连接会返回两个表中所匹配的所有的行。假如 Employees 中的某些行与 Orders 中的行不匹配,那些行就不会被列出来。

结果:

NameProduct
Adams, JohnPrinter
Carter, ThomasTable
Carter, ThomasChair

Example 左连接(LEFT JOIN)

语法:

SELECT field1, field2, field3
FROM first_table
LEFT JOIN second_table
ON first_table.keyfield = second_table.foreign_keyfield 

实例

列出所有的雇员,以及他们的定购产品 - 如果有的话。

SELECT Employees.Name, Orders.Product
FROM Employees
LEFT JOIN Orders
ON Employees.Employee_ID=Orders.Employee_ID 

左连接会第一个表 (Employees) 那里返回所有的行,即使在第二个表 (Orders) 中没有匹配的行。假如 Employees 中的某些行没有在 Orders 中可匹配的行,这些行业会被列出来。

结果:

NameProduct
Adams, JohnPrinter
Bush, George 
Carter, ThomasTable
Carter, ThomasChair
Gates, Bill 

Example 右连接(RIGHT JOIN)

语法:

SELECT field1, field2, field3
FROM first_table
RIGHT JOIN second_table
ON first_table.keyfield = second_table.foreign_keyfield 

实例

列出所有的定单,以及定购者 - 如果有的话。

SELECT Employees.Name, Orders.Product
FROM Employees
RIGHT JOIN Orders
ON Employees.Employee_ID=Orders.Employee_ID 

右连接会从第二个表格 (Orders) 那里返回所有的行,即使在第一个表格中没有可匹配的行。假如 Orders 中的某些行没有在 Employees 可匹配的行,那些行也会被列出。

结果:

NameProduct
Adams, JohnPrinter
Carter, ThomasTable
Carter, ThomasChair

实例

谁定购了打印机?

SELECT Employees.Name
FROM Employees
INNER JOIN Orders
ON Employees.Employee_ID=Orders.Employee_ID
WHERE Orders.Product = 'Printer' 

结果:

Name
Adams, John

UNION

UNION 命令用于从两个表中选取相关的信息,很类似 JOIN 命令。不过,当使用 UNION 命令时,所有被选取的列的数据类型应该是相同的。

注释:如使用 UNION,那么只有不同的值会被选取。

SQL Statement 1
UNION
SQL Statement 2

下面的例子中使用的原始表:

Employees_China:

E_IDE_Name
01Zhang, Hua
02Wang, Wei
03Carter, Thomas
04Yang, Ming

Employees_USA:

E_IDE_Name
01Adams, John
02Bush, George
03Carter, Thomas
04Gates, Bill

使用 UNION 命令

实例

列出所有在中国和美国的不同的雇员名:

SELECT E_Name FROM Employees_Norway
UNION
SELECT E_Name FROM Employees_USA

结果

E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Gates, Bill

注释:这个命令无法列出在中国和美国的所有雇员。在上面的例子中,我们有两个名字相同的雇员,他们当中只有一个人被列出来了。UNION 命令只会选取不同的值。

UNION ALL

UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。

SQL Statement 1
UNION ALL
SQL Statement 2

使用 UNION ALL 命令

实例:

列出在中国和美国的所有的雇员:

SELECT E_Name FROM Employees_Norway
UNION ALL
SELECT E_Name FROM Employees_USA

结果

E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Carter, Thomas
Gates, Bill
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值