过滤和排序数据
目标
通过本章学习,您将可以:
在查询中过滤行。
在查询中对行进行排序。
在查询中过滤行
返回在 90号部门工作的所有员工的信息
EMPLOYEES
…
过滤
使用WHERE 子句,将不满足条件的行过滤掉。
WHERE 子句紧随 FROM 子句。
SELECT *|{[DISTINCT] column|expression [alias],...}
FROM table
[WHERE condition(s)];
WHERE 子句
SELECT employee_id, last_name, job_id, department_id
FROM employees
WHERE department_id = 90 ;
字符串和日期
字符串和日期要包含在单引号中。
字符串区分大小写,日期格式敏感。
默认的日期格式是 DD-MON-RR。
SELECT last_name, job_id, department_id
FROM employees
WHERE last_name = 'Whalen';
比较条件
操作符
=
>
>=
<
<=
<>,!=
含义
等于
大于
大于、等于
小于
小于、等于
不等于
比较运算
SELECT last_name, salary
FROM employees
WHERE salary <= 3000;
其它比较条件
操作符
BETWEEN ...AND...
IN(set)
LIKE
IS NULL
含义
在两个值之间 (包含两边边界)
等于值列表中的一个
模糊查询
是否是空值
BETWEEN
使用 BETWEEN 运算来显示在一个区间内的值。
SELECT last_name, salary
FROM employees
WHERE salary BETWEEN 2500 AND 3500;
Lower limit
Upper limit
IN
使用 IN运算显示列表中的值。
SELECT employee_id, last_name, salary, manager_id
FROM employees
WHERE manager_id IN (100, 101, 201);
LIKE
使用 LIKE 运算选择类似的值
选择条件可以包含字符或数字:
% 代表零个或多个字符。
_ 代表一个字符。
SELECT first_name
FROM employees
WHERE first_name LIKE 'S%';
LIKE
‘%’和‘-’可以同时使用。
可以使用 ESCAPE 标识符 选择‘%’和 ‘_’ 符号。
SELECT last_name
FROM employees
WHERE last_name LIKE '_o%';
SELECT last_name
FROM employees
WHERE last_name LIKE '_/_%' escape '/';
NULL
使用 NULL 判断空值。
SELECT last_name, manager_id
FROM employees
WHERE manager_id IS NULL;
逻辑运算
操作符
AND OR
NOT
含义
逻辑与
逻辑或
逻辑否
AND
AND 要求和的关系为真。
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary >=10000
AND job_id LIKE '%MAN%';
OR
OR 要求或关系为真。
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary >= 10000
OR job_id LIKE '%MAN%';
NOT
SELECT last_name, job_id
FROM employees
WHERE job_id
NOT IN ('IT_PROG', 'ST_CLERK', 'SA_REP');
优先级
可以使用括号改变优先级顺序
优先级
1 算术运算符
2 连接符
3 比较符
4 IS [NOT] NULL, LIKE, [NOT] IN
5 [NOT] BETWEEN
6 NOT
7 AND
8 OR
优先级
SELECT last_name, job_id, salary
FROM employees
WHERE job_id = 'SA_REP'
OR job_id = 'AD_PRES'
AND salary > 15000;
优先级
SELECT last_name, job_id, salary
FROM employees
WHERE (job_id = 'SA_REP'
OR job_id = 'AD_PRES')
AND salary > 15000;
使用括号控制执行顺序。
ORDER BY子句
使用 ORDER BY 子句排序
ASC: 升序,默认
DESC: 降序
ORDER BY 子句在SELECT语句的结尾。
SELECT last_name, job_id, department_id, hire_date
FROM employees
ORDER BY hire_date ;
…
降序排序
SELECT last_name, job_id, department_id, hire_date
FROM employees
ORDER BY hire_date DESC ;
…
按别名排序
SELECT employee_id, last_name, salary*12 annsal
FROM employees
ORDER BY annsal;
…
多个列排序
按照ORDER BY 列表的顺序排序。
可以使用不在SELECT 列表中的列排序。
SELECT last_name, department_id, salary
FROM employees
ORDER BY department_id, salary DESC;
…
总结
SELECT *|{[DISTINCT] column|expression [alias],...}
FROM table
[WHERE condition(s)]
[ORDER BY {column, expr, alias} [ASC|DESC]];
通过本课,您应该可以完成:
使用WHERE 子句过滤数据
使用比较运算
使用 BETWEEN, IN, LIKE和 NULL运算
使用逻辑运算符 AND, OR和NOT
使用 ORDER BY 子句进行排序。
Schedule: Timing Topic
45 minutes Lecture
30 minutes Practice
75 minutes Total
Lesson Aim
While retrieving data from the database, you may need to restrict the rows of data that are displayed or specify the order in which the rows are displayed. This lesson explains the SQL statements that you use to perform these actions.
Limiting Rows Using a Selection
In the example on the slide, assume that you want to display all the employees in department 90. The rows with a value of 90 in the DEPARTMENT_ID column are the only ones returned. This method of restriction is the basis of the WHERE clause in SQL.
Limiting the Rows Selected
You can restrict the rows returned from the query by using the WHERE clause. A WHERE clause contains a condition that must be met, and it directly follows the FROM clause. If the condition is true, the row meeting the condition is returned.
In the syntax:
WHERE restricts the query to rows that meet a condition
condition is composed of column names, expressions, constants, and a comparison operator
The WHERE clause can compare values in columns, literal values, arithmetic expressions, or functions. It consists of three elements:
Column name
Comparison condition
Column name, constant, or list of values
Using the WHERE Clause
In the example, the SELECT statement retrieves the name, job ID, and department number of all employees whose job ID is SA_REP.
Note that the job title SA_REP has been specified in uppercase to ensure that it matches the job ID column in the EMPLOYEES table. Character strings are case sensitive.
Character Strings and Dates
Character strings and dates in the WHERE clause must be enclosed in single quotation marks (''). Number constants, however, should not be enclosed in single quotation marks.
All character searches are case sensitive. In the following example, no rows are returned because the EMPLOYEES table stores all the last names in mixed case:
SELECT last_name, job_id, department_id
FROM employees
WHERE last_name = 'WHALEN';
Oracle databases store dates in an internal numeric format, representing the century, year, month, day, hours, minutes, and seconds. The default date display is DD-MON-RR.
Note: Changing the default date format is covered in a subsequent lesson.
Instructor Note
Some students may ask how to override the case sensitivity. Later in the course, we cover the use of single-row functions such as UPPER and LOWER to override the case sensitivity.
Comparison Conditions
Comparison conditions are used in conditions that compare one expression to another value or expression. They are used in the WHERE clause in the following format:
Syntax
... WHERE expr operator value
For Example
... WHERE hire_date='01-JAN-95'
... WHERE salary>=6000
... WHERE last_name='Smith'
An alias cannot be used in the WHERE clause.
Note: The symbol != and ^= can also represent the not equal to condition.
Using the Comparison Conditions
In the example, the SELECT statement retrieves the last name and salary from the EMPLOYEES table, where the employee salary is less than or equal to 3000. Note that there is an explicit value supplied to the WHERE clause. The explicit value of 3000 is compared to the salary value in the SALARY column of the EMPLOYEES table.
The BETWEEN Condition
You can display rows based on a range of values using the BETWEEN range condition. The range that you specify contains a lower limit and an upper limit.
The SELECT statement on the slide returns rows from the EMPLOYEES table for any employee whose salary is between $2,500 and $3,500.
Values specified with the BETWEEN condition are inclusive. You must specify the lower limit first.
Instructor Note
Emphasize that the values specified with the BETWEEN operator in the example are inclusive. Explain that BETWEEN … AND … is actually translated by Oracle server to a pair of AND conditions: (a >= lower limit) AND (a <= higher limit). So using BETWEEN … AND … has no performance benefits, and it is used for logical simplicity.
Demo:
Purpose: To illustrate using the BETWEEN operator.
The IN Condition
To test for values in a specified set of values, use the IN condition. The IN condition is also known as the membership condition.
The slide example displays employee numbers, last names, salaries, and manager’s employee numbers for all the employees whose manager’s employee number is 100, 101, or 201.
The IN condition can be used with any data type. The following example returns a row from the EMPLOYEES table for any employee whose last name is included in the list of names in the WHERE clause:
SELECT employee_id, manager_id, department_id
FROM employees
WHERE last_name IN ('Hartstein', 'Vargas');
If characters or dates are used in the list, they must be enclosed in single quotation marks ('').
Instructor Note
Explain that IN ( ... ) is actually translated by Oracle server to a set of OR conditions: a = value1 OR a = value2 OR a = value3. So using IN ( ... ) has no performance benefits, and it is used for logical simplicity.
Demo:
Purpose: To illustrate using the IN operator.
The LIKE Condition
You may not always know the exact value to search for. You can select rows that match a character pattern by using the LIKE condition. The character pattern-matching operation is referred to as a wildcard search. Two symbols can be used to construct the search string.
The SELECT statement on the slide returns the employee first name from the EMPLOYEES table for any employee whose first name begins with an S. Note the uppercase S. Names beginning with an s are not returned.
The LIKE condition can be used as a shortcut for some BETWEEN comparisons. The following example displays the last names and hire dates of all employees who joined between January 1995 and December 1995:
SELECT last_name, hire_date
FROM employees
WHERE hire_date LIKE '%95';
Combining Wildcard Characters
The % and _ symbols can be used in any combination with literal characters. The example on the slide displays the names of all employees whose last names have an o as the second character.
The ESCAPE Option
When you need to have an exact match for the actual % and _ characters, use the ESCAPE option. This option specifies what the escape character is. If you want to search for strings that contain ‘SA_’, you can use the following SQL statement:
SELECT employee_id, last_name, job_id
FROM employees
WHERE job_id LIKE '%SA\_%' ESCAPE '\';
The ESCAPE option identifies the backslash (\) as the escape character. In the pattern, the escape character precedes the underscore (_). This causes the Oracle Server to interpret the underscore literally.
The NULL Conditions
The NULL conditions include the IS NULL condition and the IS NOT NULL condition.
The IS NULL condition tests for nulls. A null value means the value is unavailable, unassigned, unknown, or inapplicable. Therefore, you cannot test with = because a null cannot be equal or unequal to any value. The slide example retrieves the last names and managers of all employees who do not have a manager.
For another example, to display last name, job ID, and commission for all employees who are NOT entitled to get a commission, use the following SQL statement:
SELECT last_name, job_id, commission_pct
FROM employees
WHERE commission_pct IS NULL;
…
Logical Conditions
A logical condition combines the result of two component conditions to produce a single result based on them or inverts the result of a single condition. A row is returned only if the overall result of the condition is true. Three logical operators are available in SQL:
AND
OR
NOT
All the examples so far have specified only one condition in the WHERE clause. You can use several conditions in one WHERE clause using the AND and OR operators.
The AND Operator
In the example, both conditions must be true for any record to be selected. Therefore, only employees who have a job title that contains the string MAN and earn $10,000 or more are selected.
All character searches are case sensitive. No rows are returned if MAN is not in uppercase. Character strings must be enclosed in quotation marks.
AND Truth Table
The following table shows the results of combining two expressions with AND:
Instructor Note
Demo:
Purpose: To illustrate using the AND operator.
The OR Operator
In the example, either condition can be true for any record to be selected. Therefore, any employee who has a job ID containing MAN or earns $10,000 or more is selected.
The OR Truth Table
The following table shows the results of combining two expressions with OR:
Instructor Note
Demo:
Purpose: To illustrate using the OR operator.
The NOT Operator
The slide example displays the last name and job ID of all employees whose job ID is not IT_PROG, ST_CLERK, or SA_REP.
The NOT Truth Table
The following table shows the result of applying the NOT operator to a condition:
Note: The NOT operator can also be used with other SQL operators, such as BETWEEN, LIKE, and NULL.
... WHERE job_id NOT IN ('AC_ACCOUNT', 'AD_VP')
... WHERE salary NOT BETWEEN 10000 AND 15000
... WHERE last_name NOT LIKE '%A%'
... WHERE commission_pct IS NOT NULL
Rules of Precedence
The rules of precedence determine the order in which expressions are evaluated and calculated. The table lists the default order of precedence. You can override the default order by using parentheses around the expressions you want to calculate first.
Example of the Precedence of the AND Operator
In the slide example, there are two conditions:
The first condition is that the job ID is AD_PRES and the salary is greater than 15,000.
The second condition is that the job ID is SA_REP.
Therefore, the SELECT statement reads as follows:
“Select the row if an employee is a president and earns more than $15,000, or if the employee is a sales representative.”
Instructor Note
Demo:
Purpose: To illustrate the rules of precedence.
Using Parentheses
In the example, there are two conditions:
The first condition is that the job ID is AD_PRES or SA_REP.
The second condition is that salary is greater than $15,000.
Therefore, the SELECT statement reads as follows:
“Select the row if an employee is a president or a sales representative, and if the employee earns more than $15,000.”
Instructor Note
Demo:
Purpose: To illustrate the rules of precedence.
The ORDER BY Clause
The order of rows returned in a query result is undefined. The ORDER BY clause can be used to sort the rows. If you use the ORDER BY clause, it must be the last clause of the SQL statement. You can specify an expression, or an alias, or column position as the sort condition.
Syntax
SELECT expr
FROM table
[WHERE condition(s)]
[ORDER BY {column, expr} [ASC|DESC]];
In the syntax:
ORDER BY specifies the order in which the retrieved rows are displayed
ASC orders the rows in ascending order (this is the default order)
DESC orders the rows in descending order
If the ORDER BY clause is not used, the sort order is undefined, and the Oracle server may not fetch rows in the same order for the same query twice. Use the ORDER BY clause to display the rows in a specific order.
Instructor Note
Let the students know that the ORDER BY clause is executed last in query execution. It is placed last unless the FOR UPDATE clause is used.
Default Ordering of Data
The default sort order is ascending:
Numeric values are displayed with the lowest values first—for example, 1–999.
Date values are displayed with the earliest value first—for example, 01-JAN-92 before 01-JAN-95.
Character values are displayed in alphabetical order—for example, A first and Z last.
Null values are displayed last for ascending sequences and first for descending sequences.
Reversing the Default Order
To reverse the order in which rows are displayed, specify the DESC keyword after the column name in the ORDER BY clause. The slide example sorts the result by the most recently hired employee.
Instructor Note
Let the students know that you can also sort by a column number in the SELECT list. The following example sorts the output in the descending order by salary:
SELECT last_name, salary
FROM employees
ORDER BY 2 DESC;
Sorting by Column Aliases
You can use a column alias in the ORDER BY clause. The slide example sorts the data by annual salary.
Instructor Note
Internally, the order of execution for a SELECT statement is as follows:
FROM clause
WHERE clause
SELECT clause
ORDER BY clause
Sorting by Multiple Columns
You can sort query results by more than one column. The sort limit is the number of columns in the given table.
In the ORDER BY clause, specify the columns, and separate the column names using commas. If you want to reverse the order of a column, specify DESC after its name. You can also order by columns that are not included in the SELECT clause.
Example
Display the last names and salaries of all employees. Order the result by department number, and then in descending order by salary.
SELECT last_name, salary
FROM employees
ORDER BY department_id, salary DESC;
Instructor Note
Show that the DEPARTMENT_ID column is sorted in ascending order and the SALARY column in descending order.
Summary
In this lesson, you should have learned about restricting and sorting rows returned by the SELECT statement. You should also have learned how to implement various operators and conditions.