Ø  简介

本文介绍 Oracle 中查询(SELECT)语句的使用,在 SQL 中 SELECT 语句是相对内容较多的,也是相对比较复杂一点的,所以这里拿出来单独学习。

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

Ø  查询指定的表和列

Ø  根据指定的条件查询,即 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.   分组与分组过滤

1.   准备数据

1)   创建表结构

CREATE TABLE JNUser (

UserId NUMBER(10) NOT NULL ,

Name VARCHAR2(8) NOT NULL ,

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

Age NUMBER(5) 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 <= 2)

);

CREATE TABLE JNOrder (

OrderId NUMBER(10) NOT NULL ,

UserId NUMBER(10) NOT NULL ,

OrderNo VARCHAR2(16) NOT NULL ,

TotalAmount FLOAT NOT NULL ,

OrderDate DATE NOT NULL ,

Remarks VARCHAR2(4000) ,

PRIMARY KEY (OrderId),

CONSTRAINT UQ_JNOrder_OrderNo UNIQUE (OrderNo)

);

2)   插入数据

INSERT ALL

--用户数据

INTO JNUser VALUES(1, '孙器璇', 2, 17, to_date('2002/11/18', 'yyyy/mm/dd'), '北京', '17730094858437637X', 10400, 'hello')

INTO JNUser VALUES(2, '周器璇', 0, 22, to_date('1966/05/12', 'yyyy/mm/dd'), '武汉', '534668342907162757', 15000, '用户2')

INTO JNUser VALUES(3, '张二娃', 1, 24, to_date('1967/01/24', 'yyyy/mm/dd'), '杭州', '36935324879542561X', 7600, '大家好,我是张二娃')

INTO JNUser VALUES(4, '陈悴', 2, 22, to_date('1984/10/11', 'yyyy/mm/dd'), '武汉', '585823614699788016', 7100, '你好,贵姓?')

INTO JNUser VALUES(5, '钱悴', 2, 58, to_date('1961/10/21', 'yyyy/mm/dd'), '深圳', '449489822531507067', 15320, 'hello 张二娃')

INTO JNUser VALUES(6, '张无忌', 1, 61, to_date('1988/02/24', 'yyyy/mm/dd'), '杭州', '385929993868497572', 17800, '哈啰,我是张无忌')

INTO JNUser VALUES(7, '张大彪', 1, 24, to_date('1995/05/16', 'yyyy/mm/dd'), '上海', '466484458398445233', 1200, '我说了,我是彪爷')

INTO JNUser VALUES(8, '冯小二', 1, 29, to_date('1976/09/28', 'yyyy/mm/dd'), '广州', '40016865591929392X', 5700, '客观,吃点莫子?')

INTO JNUser VALUES(9, 'DBA', 2, 32, to_date('1997/04/28', 'yyyy/mm/dd'), '上海', '488500420672587475', 16000, '小崽子们,你们好,我是 DBA')

INTO JNUser VALUES(10, '陈双', 0, 18, to_date('1995/02/07', 'yyyy/mm/dd'), '武汉', '942310204386191671', 10343, '我是双儿')

--订单数据

INTO JNOrder VALUES(1, 2, '58977924501badf7', 2620, to_date('2019/06/10', 'yyyy/mm/dd'), '又是双十一,我卖完再剁手啦')

INTO JNOrder VALUES(2, 3, '316626433f743978', 1115, to_date('2019/08/19', 'yyyy/mm/dd'), '其他没什么,就是想买')

INTO JNOrder VALUES(3, 4, '8698789361c78946', 1734, to_date('2019/03/16', 'yyyy/mm/dd'), '')

INTO JNOrder VALUES(4, 5, '58716471589e3df2', 897, to_date('2019/11/13', 'yyyy/mm/dd'), ' ')

INTO JNOrder VALUES(5, 8, '5583165337e0ee25', 2097, to_date('2019/01/21', 'yyyy/mm/dd'), '我已下单,快点发货,老板')

INTO JNOrder VALUES(6, 8, '395799340826d6f2', 304, to_date('2019/02/27', 'yyyy/mm/dd'), '   ')

INTO JNOrder VALUES(7, 3, '887799782996b3f1', 1246, to_date('2019/09/20', 'yyyy/mm/dd'), '老板,给我来个好看的包装盒,我要送老丈人')

INTO JNOrder VALUES(8, 8, '39482046468266d6', 306, to_date('2019/02/28', 'yyyy/mm/dd'), NULL)

SELECT * FROM DUAL;

COMMIT;

2.   SELECT 语法

SELECT <列名1> [<,列名2>]… FROM <表名或视图名>

[WHERE <条件表达式>]

[GROUP BY <列名1> [HAVING <条件表达式>]

[ORDER BY <列名1> [ASC | DESC]]

说明:如果输出所有列,可以指定为"*"。这里简单阐述下(SELECT * 与 SELECT 所有列)的一些区别:

比较项

SELECT *

SELECT 指明所有列

结论

1.   执行效率

需要检索表中的所有列名

不需要检索列名

后者效率略高

2.   后续新增字段

原程序会直接将新字段查出

需要重新更改程序中的 SQL 语句

视业务情况而定

3.   难易程度

比较便捷

比较麻烦

前者有优势

4.   字段较多时(比如一两百多个)

减少网络流量

增加网络流量

前者有优势(可忽略的)

提示:如有其他看法,欢迎讨论。

3.   基本语法

1)   查询所有列

SELECT * FROM JNUser;

SELECT * FROM JNOrder;

2)   查询指定列

SELECT UserId, Name FROM JNUser;

3)   定义别名

SELECT UserId 用户Id, Name 用户名, Age AS "性 别", U.City FROM JNUser U;

说明:

1.   表别名不能使用 AS 关键字;定义别名后可使用或不使用;

2.   列别名可使用或不使用 AS 关键字;别名包含特殊字符时,采用""双引号括起来。

4)   算数运算符(+、-、*、/)

SELECT Salary, Salary + 200, Salary - 200, Salary * 12, Salary / 30 FROM JNUser;

5)   比较运算符(>、>=、<、<=、=、!= | <>)

SELECT * FROM JNUser WHERE City <> '上海'; --或者使用 !=

6)   列连接

SELECT UserId || ' - ' || Name || ' - ' || City AS UserDesc FROM JNUser;

7)   构建表达式

SELECT ('SELECT * FROM ' || TABLE_NAME || ';') AS SEL FROM ALL_TABLES WHERE OWNER = 'USER01';

8)   数据去重

SELECT DISTINCT Age, City FROM JNUser;

说明:去除每列相同的数据行,只返回一行

4.   WHERE 条件

1)   复合条件

SELECT * FROM JNUser WHERE Salary > 10000; --查出工资大于10000的用户

SELECT * FROM JNUser WHERE Sex = 0 AND Salary > 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)   LIKE 模糊匹配

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

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

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

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

5)   使用&变量

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 = '上海'; --查询上海用户平均薪资

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;

7.   排序

排序采用 ORDER BY 子句,包含升序(ASC)和降序(DESC)排序方式。

SELECT * FROM JNUser ORDER BY Salary; --ASC 升序排序(默认排序方式)

SELECT * FROM JNUser ORDER BY Salary DESC; --DESC 降序排序

SELECT * FROM JNUser ORDER BY Sex ASC, Salary DESC; --首先按性别升序排序,再按薪资降序排序

SELECT * FROM JNUser WHERE Sex = 1 ORDER BY 4 ASC; --查出男性用户所有用户,并按照第4列(AGE)升序排序

8.   分组与分组过滤

分组采用 GROUP BY 子句,注意:包含分组的 SELECT 输出列中只能包含,分组的列和聚合计算的列。GRUOUP BY 分组后还可以跟条件子句,即 HAVING,通常用于聚合计算过滤。

1)   查出工资大于8000的用户,每个性别各占的数量,并按性别倒序排序

SELECT Sex, COUNT(1) AS Count FROM JNUser

WHERE Salary > 8000

GROUP BY Sex

ORDER BY Sex DESC;

2)   查出工资大于8000的用户,每个性别的平均工资大于13000,并按性别倒序排序

SELECT Sex, AVG(Salary) AS Avg FROM JNUser

WHERE Salary > 8000

GROUP BY Sex

HAVING AVG(Salary) > 13000

ORDER BY Sex DESC;

Oracle 查询(SELECT)语句(一)的更多相关文章

  1. Microsoft SqlServer2008技术内幕:T-Sql语言基础-读书笔记-单表查询SELECT语句元素

    1.select语句逻辑处理顺序: FORM WHERE GROUP BY HAVING SELECT OVER DISTINCT TOP ORDER BY 总结: 2.FORM子句的表名称应该带上数 ...

  2. mysql 查询select语句汇总

    数据准备: 创建表: create table students( id int unsigned primary key auto_increment not null, name varchar( ...

  3. Oracle中Select语句完整的执行顺序

    oracle Select语句完整的执行顺序: .from 子句组装来自不同数据源的数据: .where 子句基于指定的条件对记录行进行筛选: .group by子句将数据划分为多个分组: .使用聚集 ...

  4. 基于SQL和PYTHON的数据库数据查询select语句

    #xiaodeng#python3#基于SQL和PYTHON的数据库数据查询语句import pymysql #1.基本用法cur.execute("select * from biao&q ...

  5. SQL_2_查询Select语句的使用

    查询一词在SQL中并不是很恰当,在SQL中查询除了向数据库提出问题之外,还可以实现下面的功能: 1>建立或删除一个表 2>插入.修改.或删除一个行或列 3>用一个特定的命令从几个表中 ...

  6. oracle查询字符集语句

      (1)查看字符集(三条都是等价的) 复制代码 代码如下: select * from v$nls_parameters  where parameter='NLS_CHARACTERSET'sel ...

  7. oracle查询相关语句

    1,查询表空间使用情况select a.a1 表空间名称,c.c2 类型,c.c3 区管理,b.b2/1024/1024 表空间大小M,(b.b2-a.a2)/1024/1024 已使用M,subst ...

  8. Oracle数据库select语句

    select * from EMp--all data in EMP table select * from EMP where ename in('SMITH')--the data where e ...

  9. Oracle下select语句

    先看scott下自带的emp表 empno:编号  ename:名字  Job:职位  mgr:上级编号 hiredate:入职时间 sal:薪水 comm:奖金 deptno:部门编号 部门表dep ...

随机推荐

  1. 用Scriban进行模版解析

    前言 有些时候,我们需要根据模版去展示一些内容,通常会借助模版引擎来处理. 举个简单的例子,发短信. 短信肯定是有模版的,不同的场景对应不同的模版. 注册的, [xxx]恭喜您成功注册yyy平台,您的 ...

  2. Spring Boot2 系列教程(二十二)整合 MyBatis 多数据源

    关于多数据源的配置,前面和大伙介绍过 JdbcTemplate 多数据源配置,那个比较简单,本文来和大伙说说 MyBatis 多数据源的配置. 其实关于多数据源,我的态度还是和之前一样,复杂的就直接上 ...

  3. 错误InnoDB:Attemptedtoopenapreviouslyopenedtablespace.

    2013-08-04 13:48:22 760 [ERROR] InnoDB: Attempted to open a previously opened tablespace. Previous t ...

  4. 《DSLR-Quality Photos on Mobile Devices with Deep Convolutional Networks》研读笔记

    <DSLR-Quality Photos on Mobile Devices with Deep Convolutional Networks>研读笔记 论文标题:DSLR-Quality ...

  5. oracle学习笔记(十三) 查询练习(三) 子查询查询

    子查询练习 create table empployee_demo( empno number(4) not null primary key, --员工编号,主键 ename varchar2(10 ...

  6. 读Xamarin文档记录

    //怎样判断Wifi是否连接if (Connectivity.NetworkAccess == NetworkAccess.None) { ... } 连接改变的事件,判断事件改变后是否还处于连接状态 ...

  7. webpack资源处理

    使用上篇已谈过,这篇纯代码!!~~ <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  8. JVM内存分配策略,及垃圾回收算法

    本人免费整理了Java高级资料,一共30G,需要自己领取;传送门:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q 说起垃圾收集(Garbage Co ...

  9. 完整版的CAD技巧!3天轻松玩转CAD,零基础也能学会

    最近有很多小伙伴反应,CAD图纸学起来有点小困难,也许你还没能掌握技巧,CAD大神带你3天轻松玩转CAD,零基础也能快速学会. 一.看懂图纸是关键 CAD制图首先得让自己知道要绘制什么,如果心中对图纸 ...

  10. cmdb项目-3

    1. cmdb资产审计 2.stark组件使用 快速完成网站的一个组件,使用方式与django的admin系统类似 ,仅仅将model注册 ,就可以生成对model增删改查的页面 ,当然这里还包括了模 ...