Oracle 查询(SELECT)语句(一)

2024年 2月 4日 73.1k 0

简介

本文介绍 Oracle 中查询(SELECT)语句的使用,在 SQL 中 SELECT 语句相对增删改(CUD/DML)的语句知识点较多,也是比较重要 SQL 编程技术,所以这里拿出来单独学习。

 

首先,我们先来理一下思路,我们知道查询通常包含以下内容:

Ø  查询所有列(*)

Ø  查询指定的列

Ø  根据指定的条件查询,即 WHERE 条件

Ø  去除重复行,即 DISTINCT 子句

Ø  查询数据聚合,即 COUNT()、MAX()、MIN() 等

Ø  按条件输出,即 CASE WHEN THEN 子句

Ø  排序(ORDER BY)

Ø  分组(GROUP BY)与分组过滤(HAVING)

Ø  连接查询(INNER JOIN、LEFT JOIN 等)

Ø  子查询(SELECT 子查询、WHERE 子查询等)

Ø  其他

 

好了,既然知道了有这些查询功能,下面我们就一一突破,准备了以下内容:

1.   准备数据

2.   SELECT 语法

3.   基本用法

4.   WHERE 子句

5.   聚合查询

6.   CASE WHEN THEN 子句

7.   排序

8.   分组与过滤

9.   多表查询

10.  子查询(单行与多行子查询)

11.  连接查询

 

1.   准备数据

1)   创建表结构

CREATE TABLE JNUser (

  UserId NUMBER(10) NOT NULL,

  Name VARCHAR2(8) NOT NULL,

  Sex NUMBER(1) NOT NULL,    --性别(0 女,1 男,2 未知)

  Age NUMBER(2) NOT NULL,

  Birthday DATE NOT NULL,

  City VARCHAR2(6) NOT NULL,

  IdNumber CHAR(18) NOT NULL,

  Salary FLOAT,

  Remarks VARCHAR2(4000) NOT NULL,

  PRIMARY KEY (UserId),

  CONSTRAINT UQ_JNUser_IdNumber UNIQUE (IdNumber),

  CONSTRAINT CK_JNUser_Sex CHECK (Sex >= 0 AND Sex 、>=、 10000; --查出性别为女性,且工资大于10000的用户

SELECT * FROM JNUser WHERE (Sex = 0 OR Sex = 2) AND Salary > 10000; --查出性别为女性或者未知,且工资大于10000的用户

 

2)   IN 子句

IN 子句表示取出值包含在列举值范围内的记录。

SELECT * FROM JNUser WHERE City IN('武汉', '上海', '北京') ORDER BY City; --查出所在城市在武汉、上海、北京的用户,并按城市升序排序

 

3)   BETWEEN 子句

BETWEEN 子句表示取出值在起始值与结束值之间的记录,且包含起始值与结束值(它是包头包围的闭区间)。

SELECT * FROM JNUser WHERE Salary BETWEEN 10400 AND 16000; --查出工资在10400(包含)至16000(包含)之间的用户

 

4)   NOT 取反

NOT 子句用于对条件表达式进行取反,例如:

SELECT * FROM JNUser WHERE NOT(AGE > 30); --实际查出了年龄小于或等于30的用户

 

5)   EXISTS、NOT EXISTS

EXISTS 子句可以用于判断是否存在结果集,EXISTS 表示当存在结果集时为 true,否则为 false;而 NOT EXISTS 则对 EXISTS 的结果进行取反。

SELECT * FROM JNUser t1 WHERE EXISTS(SELECT 1 FROM JNOrder t2 WHERE t1.userid = t2.userid); --查询下过订单的用户

 

6)   LIKE 模糊匹配

Ø  %表示零到多个字符;

Ø  _表示任意单个字符;

Ø  []表示在列举范围内的字符;

SELECT * FROM JNUser WHERE Remarks LIKE 'h%'; --查出备注以 h 开头的用户(注意:匹配时区分大小写)

SELECT * FROM JNUser WHERE Remarks LIKE '%好%'; --查出备注中包含“好”字的用户

SELECT * FROM JNUser WHERE Name LIKE '张__'; --查出姓张的,并且名为2个字的用户

注意:在实际应用场景中不到万不得已,尽量避免使用 LIKE 模糊查询,因为使用模糊的字段就不能使用索引了,影响查询效率。

 

7)   是否区分大小写

SELECT * FROM JNUser WHERE REMARKS = 'hello';  --1条记录

SELECT * FROM JNUser WHERE REMARKS = 'Hello';  --0条记录

结论:Oracle 中的值是区分大小写的,但是执行语句或表名、列名、等对象名不区分大小写。

 

8)   日期比较(查询1988年之后出生的用户)

SELECT * FROM JNUser WHERE BIRTHDAY >= '1988-01-01';  --ORA-01861: 文字与格式字符串不匹配

SELECT * FROM JNUser WHERE BIRTHDAY >= to_date('1988-01-01', 'yyyy-mm-dd');   --使用 to_date() 函数转为日期类型

SELECT * FROM JNUser WHERE to_char(BIRTHDAY, 'yyyy-mm-dd') >= '1988-01-01';   --或者使用 to_char() 函数转为字符类型

SELECT * FROM JNUser WHERE to_char(BIRTHDAY, 'mm') >= '05';   --大于5月份的用户

 

9)   使用&变量

SELECT * FROM JNUser WHERE City = '&City' AND Salary > &Salary;

说明:该查询方式只适合在 PL/SQL Developer 中使用,提供一个条件参数占位符,用于在窗口中输入参数值。

 

5.   聚合查询

聚合函数是 Oracle 提供的内置函数,用于计算某一列的聚合计算(如:数量、平均值等)

SELECT COUNT(*) AS COUNT FROM JNUser WHERE City = '上海'; --统计有多少上海用户,*可以改为数字1

SELECT MAX(SALARY) AS MAX FROM JNUser WHERE City = '上海'; --查询上海用户的最高薪资

SELECT MIN(SALARY) AS MIN FROM JNUser WHERE City = '上海'; --查询上海用户的最低薪资

SELECT SUM(SALARY) AS SUM FROM JNUser WHERE City = '上海'; --查询上海用户的总薪资

SELECT AVG(SALARY) AS AVG FROM JNUser WHERE City = '上海'; --查询上海用户的平均薪资

SELECT COUNT(DISTINCT t."OrderId") FROM temp01 t WHERE t."CategoryId" = t1."CategoryId"    --统计时进行去重

 

注意:

1.   MAX 和 MIN 函数计算出两个或两个以上的最大值或最小值时,同样之后只返回一个值。

2.   COUNT、SUM 和 AVG 函数计算统计时,为 NULL 的值将不参与计算。

 

6.   CASE WHEN THEN 子句

CASE WHEN THEN 定义在 SELECT 与 FROM 之间,用于判断当条件符合 WHEN 时,就返回 THEN 对应的值,否则返回 ELSE 中的值。

1)   第一种写法

SELECT City, (CASE City WHEN '上海' THEN 'SH' WHEN '武汉' THEN 'WH' ELSE 'WZ' END) AS JianCheng FROM JNUser;

 

2)   第二种写法

SELECT City, (CASE WHEN City = '上海' THEN 'SH' WHEN City = '武汉' THEN 'WH' ELSE 'WZ' END) AS JianCheng FROM JNUser;

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论