📅  最后修改于: 2020-12-29 04:17:54             🧑  作者: Mango
SELECT语句的基本功能是选择,投影和联接。显示表中的特定列称为项目操作。现在,我们将专注于显示输出的特定行。这称为选择操作。可以通过将WHERE子句添加到SELECT查询中来选择特定的行。实际上,WHERE子句出现在SELECT查询层次结构中的FROM子句之后。必须在所有情况下都保持顺序。如果违反,Oracle会引发异常。
SELECT *|{[DISTINCT] column| expression [alias],..}
FROM table
[WHERE condition(s)]
在语法上
WHERE子句是关键字
[条件]包含列名,表现形式,常量,字面量和运算符。
假设您的经理正在为您的组织制定季度预算。作为此活动的一部分,有必要列出每位员工的基本细节,但仅针对年薪至少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子句中使用比较运算符,对运算符者双方的观点(你是比较对象或值)必须是列名,或一个特定的值。如果使用特定值,则该值必须是数字值或字面量字符串。如果该值是一个或日期,则必须输入单引号(”“)中的值。
甲骨文有九个比较运算符在相等或不等的条件下使用。
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运算符可用于比较确定范围内的列值。在比较期间,指定的范围必须有一个上下限(包括上限和下限)。它的用法类似于复合不等式运算符(<=和> =)。它可以与数字,字符和日期类型值一起使用。
例如,SELECT查询中的WHERE条件SALARY 1500和2500之间将列出薪水介于1500和2500之间的那些雇员。
IN运算符用于测试给定值集中的列值。如果该列可以等于给定集合中的任何值,则条件将得到验证。使用IN运算符定义的条件也称为隶属条件。
例如,SELECT查询中的WHERE条件SALARY IN(1500,3000,2500)将限制薪水为1500、3000或2500的行。
LIKE运算符用于SELECT查询中的模式匹配和通配符搜索。如果列值的一部分未知,则可以使用通配符替换未知部分。它使用通配符运算符构建搜索字符串,因此搜索称为通配符搜索。这两个运算符是百分数(’%’)和下划线(’_’)。下划线(_)替换单个字符,而百分位数(’%’)替换多个字符。它们也可以结合使用。
例如,下面的SELECT查询列出了姓氏以’SA’开头的员工的名字。
SELECT first_name
FROM employees
WHERE last_name LIKE 'SA%';
需要注意的是,NULL值不能使用相等运算符进行测试。这是因为在相等运算符测试确定值时,NULL值未知且未分配。 IS NULL运算符用作检查列的NULL值的相等运算符。
例如,SELECT查询中的WHERE条件COMMISSION_PCT IS NULL将列出没有佣金百分比的员工。
可以将多个过滤条件添加到WHERE子句谓词中。使用逻辑运算符AND,OR和NOT可以将多个条件组合在一起。
AND:联接两个或多个条件,并且仅在所有条件都为真时才返回结果。
或:联接两个或多个条件,当任何一个条件为真时,它将返回结果。
NOT:否定其后的表达式。
AND运算符在WHERE子句中链接两个或多个条件,并且仅在所有条件都为true时才返回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,则返回TRUE。假设您的组织经理的要求有所变化。需要另一个雇员列表,但是在此列表中,雇员应:(1)是女性,或者(2)姓氏以字母“ T”开头或字母后面的字母。结果表应按员工姓氏排序。在这种情况下,可以满足两个条件中的任何一个以满足查询。应列出女性雇员以及名称满足第二个条件的雇员。
NOT运算符用于否定表达式或条件。
当仅显示几行数据时,可能不需要对输出进行排序。但是,当您显示许多行时,可以通过对信息进行排序来帮助管理人员进行决策。 SELECT语句的输出可以使用可选的ORDER BY子句进行排序。当您使用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查询(稍后讨论)。该查询按薪水排序结果集,因为它在列列表中排名第二。
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值被替换了两次。因此,用户一旦给出的值将在两个地方替换。
通过SQL * Plus的DEFINE功能设置会话中变量的定义。可以在会话中定义变量,以避免在查询执行期间暂停。只要在SQL查询中遇到Oracle,Oracle就会读取相同的变量。默认情况下处于ON状态。借助DEFINE子句,可以在执行查询之前在命令行中将变量声明为DEFINE variable = value。 。
验证命令验证以上替换显示为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