限制和排序数据
限制和排序数据
SELECT 语句的基本功能是选择、投影和连接。显示表中的特定列称为项目操作。我们现在将专注于显示特定的输出行。这称为选择操作。可以通过向 SELECT 查询添加 WHERE 子句来选择特定行。事实上,WHERE 子句出现在 SELECT 查询层次结构中的 FROM 子句之后。在所有场景中都必须保持该顺序。如果违反,Oracle 将引发异常。
句法:
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
需要注意的地方——
-
一个 SELECT 子句只能包含一个 WHERE 子句。但是,可以使用 AND 或 OR 运算符将多个过滤条件附加到 WHERE 子句。
-
谓词子句中的列、文字或表达式必须具有相似或可相互转换的数据类型。
-
WHERE 子句中不能使用列别名。
-
字符文字必须用单引号括起来并且区分大小写。
-
日期文字必须用单引号括起来并且格式敏感。默认格式为DD-MON-RR。
比较运算符
比较运算符在谓词中用于将一个术语或操作数与另一个术语进行比较。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。
BETWEEN 运算符
BETWEEN 运算符可用于比较确定范围内的列值。指定的范围必须有下限和上限,在比较期间两者都包含在内。它的用法类似于复合不等式运算符(<= 和 >=)。它可以与数字、字符和日期类型值一起使用。
例如,SELECT 查询中的 WHERE 条件SALARY BETWEEN 1500 AND 2500将列出工资在 1500 到 2500 之间的员工。
IN 运算符
IN 运算符用于测试给定值集中的列值。如果该列可以等于给定集合中的任何值,则该条件得到验证。使用 IN 运算符定义的条件也称为成员条件。
例如,SELECT 查询中的 WHERE 条件SALARY IN (1500, 3000, 2500)将限制薪水为 1500、3000 或 2500 的行。
LIKE 运算符
LIKE 运算符用于 SELECT 查询中的模式匹配和通配符搜索。如果列值的一部分未知,可以使用通配符替换未知部分。它使用通配符运算符来构建搜索字符串,因此搜索称为通配符搜索。这两个运算符是百分位 (‘%’) 和下划线 (‘_’)。下划线 (‘_’) 替换单个字符,而百分位 (‘%’) 替换多个字符。它们也可以组合使用。
例如,下面的 SELECT 查询列出了姓氏以“SA”开头的员工的名字。
SELECT first_name FROM employees WHERE last_name LIKE 'SA%';
IS (NOT) NULL 条件
需要注意的是,不能使用相等运算符测试 NULL 值。这是因为 NULL 值未知且未分配,而等式运算符测试确定值。IS NULL 运算符用作相等运算符来检查列的 NULL 值。
例如,SELECT 查询中的 WHERE 条件COMMISSION_PCT IS NULL将列出没有佣金百分比的员工。
逻辑运算符
可以向 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 子句中的多个条件,如果任一条件返回真,则返回真。假设您的组织经理的要求稍有变化。需要另一个员工列表,但在此列表中,员工应该:(1) 是女性,或者,(2) 姓氏以字母“T”开头或字母表中较晚的字母。结果表应按员工姓氏排序。在这种情况下,可以满足两个条件中的任何一个以满足查询。女性员工应与名称满足第二个条件的员工一起列出。
NOT 运算符用于否定表达式或条件。
ORDER BY 条款
当你只显示几行数据时,可能不需要对输出进行排序;但是,当您显示许多行时,可以通过对信息进行排序来帮助管理人员做出决策。可以使用可选的 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 查询(稍后讨论)。查询按薪水对结果集进行排序,因为它出现在列列表中的第 2 位。
SELECT first_name, salary FROM employees ORDER BY 2;
替代变量
当必须针对不同的输入集多次执行 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:
一旦用户为这两个变量提供了输入,就会替换值,验证并执行查询。
需要注意的地方——
-
如果变量要替换字符或日期值,则文字需要用单引号括起来。一种有用的技术是在处理字符和日期值时将 & 符号替换变量括在单引号中。
-
SQL Developer 和 SQL* Plus 都支持替换变量和 DEFINE/UNDEFINE 命令。尽管 SQL Developer 或 SQL* Plus 不支持对用户输入进行验证检查(数据类型除外)。
-
您不仅可以在 SQL 语句的 WHERE 子句中使用替换变量,还可以将其用作列名、表达式或文本的替换。
使用双与号替换变量
当同一个替换变量在多个地方使用时,为了避免再次重新输入相同的数据,我们使用双与号替换。在这种情况下,替换变量的值一旦输入,就会在使用的所有时刻被替换。
SELECT first_name, HIRE_DATE, SEPARATION_DATE FROM employees WHERE HIRE_DATE LIKE '%&DT%' AND SEPARATION_DATE '%&&DT%'
请注意,在上述查询中,&DT 的相同值被替换了两次。因此,它的值一旦由用户给出,将在两个地方被替换。
DEFINE 和 VERIFY 命令
在会话中设置变量定义由 SQL* Plus 的 DEFINE 功能设置。可以在会话中定义变量,以避免在查询执行期间停止。每当遇到 SQL 查询时,Oracle 都会读取相同的变量。默认处于 ON 状态。借助DEFINE子句,可以在查询执行前在命令行中声明一个变量为DEFINE variable=value;.
验证命令验证上述替换显示为 OLD 和 NEW 语句。默认情况下它是关闭的,可以使用 SET 命令设置为打开。
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