📜  限制和排序数据

📅  最后修改于: 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运算子

BETWEEN运算符可用于比较确定范围内的列值。在比较期间,指定的范围必须有一个上下限(包括上限和下限)。它的用法类似于复合不等式运算符(<=和> =)。它可以与数字,字符和日期类型值一起使用。

例如,SELECT查询中的WHERE条件SALARY 1500和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:联接两个或多个条件,并且仅在所有条件都为真时才返回结果。

  • 或:联接两个或多个条件,当任何一个条件为真时,它将返回结果。

  • 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运算符用于否定表达式或条件。

ORDER BY子句

当仅显示几行数据时,可能不需要对输出进行排序。但是,当您显示许多行时,可以通过对信息进行排序来帮助管理人员进行决策。 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子句中使用替换变量,而且还可以替换列名,表达式或文本。

使用Double-Ampersand替代变量

当在多个地方使用相同的替换变量时,为了避免再次重新输入相同的数据,我们使用双“&”替换。在这种情况下,替换变量的值一旦输入,将在所有使用时刻被替换。

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,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