3、Oracle 中的过滤、排序

最近项目要用到Oracle,奈何之前没有使用过,所以在B站上面找了一个学习视频,用于记录学习过程以及自己的思考。
视频链接:
【尚硅谷】Oracle数据库全套教程,oracle从安装到实战应用
如果有侵权,请联系删除,谢谢。

更加详细的教程,可以直接观看此链接Oracle教程

1、过滤

1.1、基本使用方式

使用方式:使用 WHERE 子句,将不满足条件的行过滤掉。

SELECT	*|{[DISTINCT] column|expression [alias],...}
FROM	table
[WHERE	condition(s)];

WHERE 子句紧随 FROM 子句。

比如:

-- 查询 department_id 等于 90 的数据
SELECT employee_id, last_name, job_id, department_id
FROM   employees
WHERE  department_id = 90 ;

1.2、过滤中使用字符和日期

过滤条件中使用字符和日期,有以下几点需要注意:

  • 字符和日期要包含在单引号中
  • 字符大小写敏感,日期格式敏感
  • 默认的日期格式是 DD-MON月-RR。(eg: 7-7月-1996)。使用此方式容易出现格式不匹配,后面再单行函数中做转换后查询。
-- 字符串查询
SELECT last_name, job_id, department_id
FROM   employees
WHERE  last_name = 'Whalen';


--日期查询
SELECT last_name, hire_date, department_id
FROM   employees
WHERE  hire_date = '7-6月-1994';

--使用单行函数后的日期查询
SELECT last_name, hire_date, department_id
FROM   employees
WHERE  to_char(hire_date, 'yyyy-mm-dd') = '1994-06-07';

以下的查询方式都不对:

-- ORA-00904: "yyyy-mm-dd": 标识符无效
WHERE  to_char(hire_date, "yyyy-mm-dd") = '1994-06-07';  -- 报错

WHERE  to_char(hire_date, 'yyyy-mm-dd') = '1994-6-07';  -- 得不到正确数据

1.3、where 条件中的比较运算

赋值使用 := 符号

1、比较运算

-- 查询薪资小于等于3000的
SELECT last_name, salary
FROM   employees
WHERE  salary <= 3000;

1.4、其它比较运算

1、BETWEEN

使用 BETWEEN 运算来显示在一个区间内的值

-- 查询薪资大于等于2500并且小于等于3500的
SELECT last_name, salary
FROM   employees
WHERE  salary BETWEEN 2500 AND 3500;

2、IN
使用 IN运算显示列表中的值。

-- 查询薪资等于 100或者101或者201的
SELECT employee_id, last_name, salary, manager_id
FROM   employees
WHERE  manager_id IN (100, 101, 201);

1.5 LIKE

  • 使用 LIKE 运算选择类似的值(模糊查询)
  • 选择条件可以包含字符或数字:
  • % 代表零个或多个字符(任意个字符)
  • _代表一个字符。
-- 查询first_name 以S开头的
SELECT	first_name
FROM 	employees
WHERE	first_name LIKE 'S%';

1、%-可以同时使用。

-- 查询第二个字符是o的数据
SELECT last_name
FROM   employees
WHERE  last_name LIKE '_o%';

2、可以使用 ESCAPE 标识符 选择%_ 符号。

回避特殊符号的:使用转义符。例如:将[%]转为[%]、[_]转为[_],然后再加上[ESCAPE ‘\’] 即可。

-- 查询以 IT_ 开头的数据。注意查询后面需要加上 escape 。
SELECT job_id
FROM   jobs
WHERE  job_id LIKE 'IT\_%' escape '\';

1.6、NULL

使用 IS (NOT) NULL 判断空值。

-- 查询 manager_id 等于 NULL 的数据
SELECT last_name, manager_id
FROM   employees
WHERE  manager_id IS NULL;

1.7、逻辑运算

1.7.1、AND

AND 要求并的关系为真。

-- 查询salary 大于等于10000 并且 job_id 包含 MAN 的数据
SELECT employee_id, last_name, job_id, salary
FROM   employees
WHERE  salary >=10000
AND    job_id LIKE '%MAN%';
1.7.2、OR

OR 要求或关系为真。

-- 查询 salary 大于等于 或者 job_id 包含 MAN 的数据
SELECT employee_id, last_name, job_id, salary
FROM   employees
WHERE  salary >= 10000
OR     job_id LIKE '%MAN%';
1.7.3、NOT
-- 查询 job_id 不在 ('IT_PROG', 'ST_CLERK', 'SA_REP') 列表中的数据
SELECT last_name, job_id
FROM   employees
WHERE  job_id 
       NOT IN ('IT_PROG', 'ST_CLERK', 'SA_REP');

1.8、优先级

可以使用括号改变优先级顺序

2、ORDER BY子句

  • 使用 ORDER BY 子句排序
    • ASC(ascend): 升序
    • DESC(descend): 降序
  • ORDER BY 子句在SELECT语句的结尾
SELECT   last_name, job_id, department_id, hire_date
FROM     employees
ORDER BY hire_date ;

1、降序排序

SELECT   last_name, job_id, department_id, hire_date
FROM     employees
ORDER BY hire_date DESC ;

2、按别名排序

SELECT employee_id, last_name, salary*12 annsal
FROM   employees
ORDER BY annsal;

3、多个列排序

按照ORDER BY 列表的顺序排序。

SELECT last_name, department_id, salary
FROM   employees
ORDER BY department_id, salary DESC;

可以使用不在SELECT 列表中的列排序。

SELECT last_name, department_id
FROM   employees
ORDER BY salary DESC;

select 语句表达式

SELECT     *|{[DISTINCT] column|expression [alias],...}
FROM       table
[WHERE     condition(s)]
[ORDER BY  {column, expr, alias} [ASC|DESC]];

练习题:
1、选择姓名中有字母a和e的员工姓名

select last_name
from employees
where last_name like '%a%e%' or last_name like '%e%a%'
posted @ 2024-05-18 09:06  画个一样的我  阅读(89)  评论(0编辑  收藏  举报