单表查询
表是数据库中数据存储的逻辑单元,业务流程处理所需要得到的数据就是从数据库中的表里提取
的.
SELECT *|{[DISTINCT] column|expression [alias],………}
FROM table
[WHERE condition(s)] [ORDER BY{column,expr,alias} [ASC|DESC]];
SELECT 与 FROM 之间可以是表中的列,也可以是表达式,包括算术表达式、字符串、常数、函
数等(字符串用单引号定界)。
1. SELECT 语句中的 * 指提取该表中的所有字段:
SELECT * FROM employees;
说明:从员工信息表中提取所有数据(取所有字段)。
2. SELECT 语句中的 column 是指表的列:
SELECT first_name, phone_number FROM employees;
说明:从员工信息中提取员工姓名和联系电话(取字段 COLUMN)。
3. SELECT 语句中的 expression 是指一个表达式:
SELECT sysdate "CURRENT DATE"
FROM dual;
说明:sysdate 是一个函数,返回服务器的时间,表达式也可以是一个计算公式。该语句中
的 dual 是一个公有表,用在 select 语句中来查看函数或表达式的返回值。
4. SELECT 语句中的[alias]是为列或者表达式取的别名:
SELECT sysdate "CURRENT DATE"
FROM dual;
说明:别名的目的是为了使提取的数据每一列有对应的名称,从而便于识别。本例提取当前的
时间,为该字段赋予的名称是“CURRENT DATE”从而使输出的数据更有实际意义。如
果别名中间有空格或者别名中需要区分大小写,则需要把该别名放在两个双引号之间。
5. SELECT 语句中的[WHERE condition(s)]为该查询语句设定条件:
SELECT first_name, last_name, email
FROM employees
WHERE employee_id = 100;
说明:从雇员表中提取雇员姓名,邮件地址,提取条件为员工号是 100.
6. SELECT 语句中的[ORDER BY]为提取的数据按照指定的列排序:
SELECT first_name, last_name, email
FROM employees
ORDER BY last_name;
说明:从雇员表中提取员工名字、姓氏、邮箱地址,按照姓氏排序,缺省的情况下是升序排列。
7. SELECT 语句中的[ASC|DESC]为该数据提取语句设定排序方式:
SELECT first_name, last_name, email
FROM employees
ORDER BY last_name desc;
说明:从员工信息中提取员工名字、姓氏、邮箱地址并按姓氏降序排列。也可以对一个语句中
的多个列进行排序,对每个列后面都可以增加升降序的选项。同时排序的列可以不用出
现在选择列当中。
8. SELECT 语句中的 DISTINCT 用于排除重复的结果行:
SELECT DISTINCT salary
FROM employees
WHERE job_id = 'IT_PROG';
说明:提取职位为 IT_PROG 的所用员工的不同的工资数额。如果没有 DISTINCT 语句,则可
能会提取出来大量的重复的数据。
WHERE 子句中的 condition(s)用来设定常用的查询条件,这些条件主要有:
条件 说明
=,>,<,>=,<=,!=,<>,!>,!<;NOT 比较运算符
BETWEEN AND, NOT BETWEEN AND 范围运算符
IN, NOT IN 集合运算符
LIKE, NOT LIKE 字符匹配
IS NULL, IS NOT NULL 空值运算
AND, OR 多重条件
9. 在 CONDITION 子句中使用范围运算符:
SELECT last_name, phone_number
FROM employees
WHERE employee_id BETWEEN 1 AND 150;
说明:相当于大于等于某数并且小于等于某数。等同于 >= 和 <= 的结合使用。
10. AND 与 OR 的使用及使用括号来解决优先级别的问题:
SELECT first_name, last_name, salary
FROM employees
WHERE job_id = 'IT_PROG' AND
(hire_date > to_date('20050101', 'yyyymmdd') OR salary < 5000);
说明:提取员工信息中工作岗位为 IT_PROG 并且入职时间晚于 2005 年,或者薪资少于 5000
元的员工的姓名以及薪资。注意当查询条件涉及到多个时,可以用逻辑运算符 AND 和
OR 来关联多个查询条件,其优先级顺序与其它开发语言相同,AND 的优先级高于 OR,
可以用括号改变优先级。
11. 使用 IN 运算符:
SELECT * FROM departments
WHERE department_id IN(10, 20, 30);
说明:IN 谓词实际上是多个 OR 运算的缩写。
12:表中字段别名的使用:
SELECT last_name "My name", department_id, salary
FROM employees
ORDER BY "My name", department_id;
说明:ORDER BY 后面可以使用字段别名的方式,可以使用多个字段进行排序。
13. 空值的使用:
SELECT *
FROM employees
WHERE commission_pct IS NOT NULL;
说明:涉及空值条件查询时,必须使用 IS NULL, IS NOT NULL 来判断,这里的 IS 不能
用 = 替代。空值不能等同于 0 或者空格,排序时空值总是比任何值大,空值与其它数
值的运算结果仍然是空值。
14.使用 LIKE 时 % 与 _ 的用法:
SELECT first_name, last_name, salary
FROM employees
WHERE phone_number LIKE '01%'
AND last_name LIKE '_a___' ORDER BY salary ;
说明:从员工信息中提取用户姓名和薪水,提取条件为电话号码以 01 开头,并且员工姓氏第
2 个字符是 a 且长度为 5 的员工。在使用 % 时,注意 % 在前面与 % 在后面时所代表
含义是不同的。另外,WHERE 条件中的字符类型和日期时间类型的数据必须使用单引
号,并且字符类型是大小写敏感的。
15. LIKE 的条件中有关键字时的处理方法:
SELECT employee_id, last_name, job_id
FROM employees
WHERE job_id LIKE '%SA\_%' ESCAPE '\';
说明:如果在 LIKE 的内容中包含了 _ 或者 % , 则要使用 ESCAPE 关键词。