BETWEEN ... AND
操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
语法:
SELECT 列名称 FROM 表名称 WHERE 列名称BETWEEN
值1AND
值2
原始的表 (在实例中使用:)
LastName | FirstName | Address | City |
---|---|---|---|
Adams | John | Oxford Street | London |
Bush | George | Fifth Avenue | New York |
Carter | Thomas | Changan Street | Beijing |
Gates | Bill | Xuanwumen 10 | Beijing |
实例 1
如需以字母顺序显示介于 "Adams"(包括)和 "Carter"(不包括)之间的人,请使用下面的 SQL:
SELECT * FROM Persons WHERE LastNameBETWEEN
'Adams'AND
'Carter'
结果:
LastName | FirstName | Address | City |
---|---|---|---|
Adams | John | Oxford Street | London |
Bush | George | Fifth Avenue | New 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'
结果:
LastName | FirstName | Address | City |
---|---|---|---|
Carter | Thomas | Changan Street | Beijing |
Gates | Bill | Xuanwumen 10 | Beijing |
通过使用 SQL,别名(Alias)可用于列名称和表名称。
列名别名
语法:
SELECT 列名称 AS 列的别名 FROM 表名称
表名称别名
语法:
SELECT 列名称 FROM 表名称 AS 表的别名
实例: 使用一个列名别名
表 Persons:
LastName | FirstName | Address | City |
---|---|---|---|
Adams | John | Oxford Street | London |
Bush | George | Fifth Avenue | New York |
Carter | Thomas | Changan Street | Beijing |
SQL:
SELECT LastNameAS Family
, FirstNameAS Name
FROM Persons
结果:
Family | Name |
---|---|
Adams | John |
Bush | George |
Carter | Thomas |
实例: 使用一个表名称别名
表 Persons:
LastName | FirstName | Address | City |
---|---|---|---|
Adams | John | Oxford Street | London |
Bush | George | Fifth Avenue | New York |
Carter | Thomas | Changan Street | Beijing |
SQL:
SELECT LastName, FirstName FROM Persons AS Employees
结果:
表 Employees:
LastName | FirstName |
---|---|
Adams | John |
Bush | George |
Carter | Thomas |
Join 和 Key
有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。
数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。Employee_ID 会区分开每一个人,即使他们中的人都着相同的名字。
当你看到下面的例子时,请注意以下几点:
- "Employee_ID" 列是 "Employees" 表的主键
- "Prod_ID" 列是 "Orders" 表的主键
- "Orders" 表中的 "Employee_ID" 列用于引用"Employees"表中的员工,而无需使用他们的确切姓名
表 Employees:
Employee_ID | Name |
---|---|
01 | Adams, John |
02 | Bush, George |
03 | Carter, Thomas |
04 | Gates, Bill |
表 Orders:
Prod_ID | Product | Employee_ID |
---|---|---|
234 | Printer | 01 |
657 | Table | 03 |
865 | Chair | 03 |
引用两个表
我们可以通过引用两个表的方式,从两个表中获取数据:
实例
谁订购了产品,并且他们订购了什么产品?
SELECT Employees.Name, Orders.Product FROM Employees, Orders WHERE Employees.Employee_ID = Orders.Employee_ID
结果:
Name | Product |
---|---|
Adams, John | Printer |
Carter, Thomas | Table |
Carter, Thomas | Chair |
实例
谁订购了打印机?
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 中的行不匹配,那些行就不会被列出来。
结果:
Name | Product |
---|---|
Adams, John | Printer |
Carter, Thomas | Table |
Carter, Thomas | Chair |
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 中可匹配的行,这些行业会被列出来。
结果:
Name | Product |
---|---|
Adams, John | Printer |
Bush, George | |
Carter, Thomas | Table |
Carter, Thomas | Chair |
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 可匹配的行,那些行也会被列出。
结果:
Name | Product |
---|---|
Adams, John | Printer |
Carter, Thomas | Table |
Carter, Thomas | Chair |
实例
谁定购了打印机?
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_ID | E_Name |
---|---|
01 | Zhang, Hua |
02 | Wang, Wei |
03 | Carter, Thomas |
04 | Yang, Ming |
Employees_USA:
E_ID | E_Name |
---|---|
01 | Adams, John |
02 | Bush, George |
03 | Carter, Thomas |
04 | Gates, 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 |