SQL 查询
编写 SQL 查询:
SELECT ...FROM 子句
SELECT * FROM Employees
如果我们只需要特定列(通常情况下都是这样的),我们可以/应该在逗号分隔的列表中显式指定这些列,如下所示:
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
WHERE 子句
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
WHERE City = '
如果您希望返回相反条件的员工,即返回那些不住在伦敦的员工,您应该编写以下语句:
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
WHERE City <> '
不需要测试等于情况,您也可以使用所需的标准等于/不等于运算符。例如,若要获取其雇佣日期等于某个给定日期或大于该日期的员工列表,您可以编写以下语句:
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
WHERE HireDate >= '1-july-1993'
SELECT EmployeeID, FirstName, LastName, HireDate, City
FROM Employees
WHERE (HireDate >= '1-june-1992') AND (HireDate <= '15-december-1993')
请注意,SQL 也有一个特殊的 BETWEEN 运算符,用于检查某个值是否在两个值之间(包括等于两端的值)。这使我们可以将以前的查询重新编写为:
SELECT EmployeeID, FirstName, LastName, HireDate, City
FROM Employees
WHERE HireDate BETWEEN '1-june-1992' AND '15-december-1993'
我们也可以使用 NOT 运算符来提取那些不在指定日期之间的行:
SELECT EmployeeID, FirstName, LastName, HireDate, City
FROM Employees
WHERE HireDate NOT BETWEEN '1-june-1992' AND '15-december-1993'
使用 OR 运算符,则编写的语句如下所示:
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
WHERE City = '
但是,如果您希望与三个、四个或更多值进行比较,则上述方法就行不通了。在这种情况下,我们可以使用 IN 运算符来对一组值进行测试。如果我们希望查看 City 是否为 Seattle、Tacoma 或 Redmond,我们可以编写以下语句:
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
WHERE City IN ('
有了 BETWEEN 运算符,我们也可以获得所含结果的相反条件下的结果,即查询那些 City 不在指定列表中的行:
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
WHERE City NOT IN ('
LIKE 运算使我们可以使用通配符来执行基本的模式匹配。在 Microsoft SQL Server 中,定义的通配符包含以下字符:
通配符 |
说明 |
_(下划线) |
与任意单字符匹配 |
% |
与包含一个或多个字符的字符串匹配 |
[ ] |
与特定范围(例如,[a-f])或特定集(例如,[abcdef])中的任意单字符匹配。 |
[^] |
与特定范围(例如,[^a-f])或特定集(例如,[^abcdef])之外的任意单字符匹配。 |
以下一些示例可以帮助阐明上述规则。
• |
WHERE FirstName LIKE '_im' 可以找到所有三个字母的、以 im 结尾的名字(例如,Jim、Tim)。 |
• |
WHERE LastName LIKE '%stein' 可以找到姓以 stein 结尾的所有员工。 |
• |
WHERE LastName LIKE '%stein%' 可以找到姓中任意位置包括 stein 的所有员工。 |
• |
WHERE FirstName LIKE '[JT]im' 可以找到三个字母的、以 im 结尾并以 J 或 T 开始的名字(即仅有 Jim 和 Tim) |
• |
WHERE LastName LIKE 'm[^c]%' 可以找到以 m 开始的、后面的(第二个)字母不为 c 的所有姓。 |
此处我们也选择使用 NOT 运算符:若要找到所有名字不以 M 或 A 开始的员工,我们可以编写以下语句:
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
WHERE (FirstName NOT LIKE 'M%') AND (FirstName NOT LIKE 'A%')
ORDER BY 子句
ORDER BY 子句包括了一个或多个用于指定排序顺序的列名。如果返回至第一批 SELECT 语句中的某条语句,我们可以用以下语句按 City 对其结果排序:
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
ORDER BY City
默认情况下,列的排序顺序为升序(从最小值到最大值)
如果我们希望列的排序顺序为降序,我们可以在列名后包括 DESC 关键字。
ORDER BY 子句支持使用多列。您可以包括以逗号分隔的多个列以按其排序:行将先按指定的第一列进行排序,然后再按指定的下一列进行排序。如果我们向 SELECT 子句添加 Country 字段并希望按 Country 和 City 排序,我们可以编写以下语句:
SELECT EmployeeID, FirstName, LastName, HireDate, Country, City FROM Employees
ORDER BY Country, City DESC
请注意,为了使语句显得更有趣,我们已经指定了 City 列的排序顺序为降序(从最大值到最小值)。Country 列的排序顺序仍为升序。通过编写以下语句我们可以更清楚地了解到这一点:
SELECT EmployeeID, FirstName, LastName, HireDate, Country, City FROM Employees
ORDER BY Country ASC, City DESC
重要的是要注意要在 ORDER BY 子句中使用某一列时,并不需要在选定的(返回的)多个列中包括这一列。如果我们不需要查看/使用 Country 值,只是对于将其作为主排序字段感兴趣,可以编写以下查询:
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
ORDER BY Country ASC, City DESC