Sql Certificate 简明教程
SQL - Restricting and Sorting Data
SELECT 语句的基本功能是选择、投影和联接。从表中显示特定列称为投影操作。现在,我们将重点放在显示特定输出行上。这称为选择操作。可以通过向 SELECT 查询添加 WHERE 子句来选择特定行。实际上, WHERE 子句刚好在 SELECT 查询层次结构中的 FROM 子句之后出现。在所有情况下都必须保持此顺序。如果违反,Oracle 将引发异常。
Syntax:
SELECT *|{[DISTINCT] column| expression [alias],..}
FROM table
[WHERE condition(s)]
在语法中,
-
WHERE 子句是关键字
-
[condition] 包含列名、表达式、常量、常量和比较运算符。
假设你的经理正在为你的组织制定季度预算。作为此活动的一部分,必须制作一份每个员工基本信息清单,但仅针对年薪至少 25,000 美元的员工。以下 SQL 查询将完成此任务。请注意 WHERE 子句以粗体显示。
SELECT Employee_ID, Last_Name, First_Name, Salary
FROM employees
WHERE Salary >= 25000;
EMPLOYEE_ID LAST_NAME FIRST_NAME SALARY
---------- --------------- --------------- -----------
88303 Jones Quincey $30,550.00
88404 Barlow William $27,500.00
88505 Smith Susan $32,500.00
3 rows selected
Points to be noted -
-
SELECT 子句只能包含一个 WHERE 子句。但是,可以使用 AND 或 OR 运算符向 WHERE 子句追加多个筛选条件。
-
谓词子句中的列、文字或表达式必须是类似的或可相互转换的数据类型。
-
列别名不能用于 WHERE 子句。
-
字符文字必须用单引号括起来,并且区分大小写。
-
日期文字必须用单引号括起来,并且格式敏感。默认格式为 DD-MON-RR 。
Comparison Operators
比较运算符用于谓词中比较一个术语或操作数与另一个术语。SQL 提供了全面的等式、不等式和杂项运算符。它们可以根据 SELECT 查询中的数据和筛选条件逻辑使用。在 WHERE 子句中使用比较运算符时,运算符两侧的参数(你正在比较的对象或值)既可以是列名,也可以是特定值。如果使用特定值,则该值必须是数值或文字字符串。如果值是字符字符串或日期,你必须将值输入单引号 ('') 内。
Oracle 有九个比较运算符用于等式或不等式条件。
Operator Meaning
= equal to
< less than
> greater than
>= greater than or equal to
<= less than or equal to
!= not equal to
<> not equal to
其他 Oracle 运算符是 BETWEEN..AND、IN、LIKE 和 IS NULL。
The BETWEEN Operator
BETWEEN 运算符可用于比较一定范围内的列值。指定的范围必须具有下限和上限,并且在比较期间两者都包含在内。它的用法类似于复合不等式运算符 (⇐ 和 >=)。它可用于数值、字符和日期类型的值。
例如,SELECT 查询中的 WHERE 条件 SALARY BETWEEN 1500 AND 2500 将列出薪水在 1500 和 2500 之间的那些员工。
The IN Operator
IN 运算符用于在给定的值集中测试列值。如果列可以等同于给定集合中的任何值,则条件有效。使用 IN 运算符定义的条件也称为成员资格条件。
例如,SELECT 查询中的 WHERE 条件* SALARY IN (1500, 3000, 2500) * 将限制薪水为 1500、3000 或 2500 的行。
The LIKE Operator
LIKE 运算符用于在 SELECT 查询中进行模式匹配和通配符搜索。如果列值的一部分未知,则可以使用通配符替换未知部分。它使用通配符运算符来构建搜索字符串,因此搜索称为通配符搜索。这两个运算符是百分位('%')和下划线(' '). Underscore (' '),前者替代单个字符,而后一个替代多个字符。它们还可以组合使用。
例如,下面的 SELECT 查询列出姓氏以“SA”开头的那些员工的姓氏。
SELECT first_name
FROM employees
WHERE last_name LIKE 'SA%';
IS (NOT) NULL Conditions
需要注意的是,不能使用等式运算符测试 NULL 值。这是因为 NULL 值是未知且未分配的,而等式运算符测试的是一个确定的值。IS NULL 运算符充当等式运算符来检查列的 NULL 值。
例如,SELECT 查询中的 WHERE 条件* COMMISSION_PCT IS NULL * 将列出佣金百分比为 NULL 的员工。
Logical Operators
可以向 WHERE 子句谓词添加多个筛选条件。可以使用逻辑运算符 AND、OR 和 NOT 将多个条件组合在一起。
-
AND:联接两个或更多个条件,并且仅在所有条件为真时返回结果。
-
OR:连接两个或更多的条件,并且当任何条件为真时返回结果。
-
NOT:否定其后的表达式。
AND 运算符将 WHERE 子句中的两个或更多条件连接起来,并且仅当所有条件都为真时才返回 TRUE。假设一位经理需要一份女性员工列表。此外,该列表应该只包括姓氏以字母“E”开头或出现在字母表中更靠后的员工。此外,结果表应按员工姓氏排序。有两条简单的条件需要满足。WHERE 子句可以写成:WHERE Gender = 'F' AND last_name > 'E'。
SELECT last_name "Last Name", first_name "First Name", Gender "Gender"
FROM employees
WHERE Gender = 'F' AND last_name > 'E'
ORDER BY last_name;
OR 运算符在 WHERE 子句中连接多个条件,并且如果任一条件返回真,则返回 TRUE。假设您组织经理的要求发生了轻微的变化。需要另一个员工列表,但在该列表中,员工应:(1) 是女性,或 (2) 姓氏以字母“T”或字母表中更靠后的字母开头。结果表应按员工姓氏排序。在这种情况下,为了满足查询,可以满足这两个条件中的任何一个。应将女性员工与满足第二个条件的姓名员工一起列出。
NOT 运算符用于否定表达式或条件。
The ORDER BY Clause
当您只显示几行数据时,可能不需要对输出进行排序;但是,当您显示多行时,对信息进行排序可能有助于经理做出决策。可以使用可选的 ORDER BY 子句对 SELECT 语句的输出进行排序。使用 ORDER BY 子句时,您对其进行排序的列名称还必须是 SELECT 子句中指定的列名称。
下面的 SQL 查询使用 ORDER BY 子句按 last_name 列以升序对结果表进行排序。升序是默认排序顺序。
SELECT last_name, first_name
FROM employees
WHERE last_name >= 'J'
ORDER BY last_name;
last_name first_name
--------------- ---------------
Jones Quincey
Klepper Robert
Quattromani Toni
Schultheis Robert
排序也可以基于数字和日期值。还可以基于多列进行排序。
默认情况下,ORDER BY 子句将按结果表中输出行的升序对其进行排序。我们可以使用关键字 DESC(降序的简称)启用降序排序。另一种则是按升序排列的 ASC 关键字,但由于 ASC 关键字是默认值,因此它很少使用。当使用 ASC 或 DESC 可选关键字时,它必须位于您在 WHERE 子句中对其进行排序的列名称之后。
位置排序 - 可以在 ORDER BY 子句中给出所选列列表中列的数字位置,而不是列名称。它主要用于 UNION 查询(后面讨论)。该查询按 salary 排序结果集,因为它在列列表中出现第 2 位。
SELECT first_name, salary
FROM employees
ORDER BY 2;
Substitution Variables
当必须针对不同的输入集多次执行 SQL 查询时,可以使用替换变量。在查询执行之前,可以使用替换变量来提示用户输入。它们广泛用于基于查询的报表生成中,这些报表从用户那里获取数据范围作为条件筛选和数据显示的输入。替换变量前面加一个单和号 (&) 符号,以临时存储值。例如,
SELECT EMPLOYEE_ID, LAST_NAME, SALARY
FROM employees
WHERE LAST_NAME = &last_name
OR EMPLOYEE_ID = &EMPNO;
当执行上述 SELECT 查询时,oracle 会将“&”标识为替换变量。它会提示用户输入“last_name”和“EMPNO”的值,如下所示。
Enter value for last_name:
Enter value for empno:
一旦用户向这两个变量提供输入,就会替换值,验证并执行查询。
Using the Double-Ampersand Substitution Variable
当在多个地方使用相同的替换变量时,为了避免再次输入相同的数据,可以使用双和号替换。在这种情况下,一旦输入替换变量的值,它就会在所有使用实例中替换。
SELECT first_name, HIRE_DATE, SEPARATION_DATE
FROM employees
WHERE HIRE_DATE LIKE '%&DT%' AND SEPARATION_DATE '%&&DT%'
请注意,在上面的查询中 &DT 的值被替换了两次。因此,用户一旦给出的值将在两个地方替换。
The DEFINE and VERIFY Commands
在会话中设置变量的定义是由 SQL* Plus 的 DEFINE 特性设置的。可以在会话中定义变量,以避免在查询执行期间停止。Oracle 在 SQL 查询中每遇到一次就会读取相同的变量。它默认处于 ON 状态。借助 DEFINE 子句,可以在查询执行之前在命令行中声明一个变量,如 DEFINE variable=value; 。
Verify 命令验证上述替换,显示为 OLD 和 NEW 语句。它在默认情况下为 OFF,可以使用 SET 命令将其设置为 ON。
SQL> SET DEFINE ON
SQL> SET VERIFY ON
SQL> DEFINE NAME = MARTIN'
SQL> SELECT first_name, SALARY
FROM employees
WHERE first_name = '&NAME';
OLD 1: select first_name, sal from employee where first_name = '&first_name'
new 1: select first_name, sal from employee where first_name = 'MARTIN'
first_name SALARY
------- -------
MARTIN 5000