Oracle 基本查询:dual、distinct、null、between and、in、like、order by、group by、dual、as
目录
Oracle 体系结构 与 查询语句执行顺序
准备员工表与部门表测试数据
伪表/虚表(dual) 与 as 设置别名
distinct 关键字去重
null 值不能做四则运算
"||" 字符串拼接
is null,is not null
between and 区间查询
in 关键字集合查询
like 模糊查询
order by 排序
group by 分组
Oracle 体系结构 与 查询语句执行顺序
1、数据库 -> 数据库实例 -> 表空间 -> 数据文件。
2、通常情况下 Oralce 数据库只会有一个实例叫 " orcl "。
Mysql 是多数据库的:新建一个 Java Web 应用,就会在 Mysql 中创建一个数据库,然后建表。
Oracle 是多用户的:新建 Java Web 应用,创建表空间,创建用户,用户去创建表。
3、Sql(结构化查询语言)主要分为:
DDL:数据定义语言,关键字有 create、alter、drop、truncate ...
DML:数据操作语言,关键字有 insert、update、delete ...
DCL:数据控制语言,关键字有 grant、revoke ...
DQL:数据查询语言,关键字有 select ...
4、查询语句格式:select [列名] [*] from 表名 [where 条件] [group 分组] [having 过滤] [order by 排序]
执行顺序:from ...> where ...> group by ...> having ... > select ...> order by ...
1.where 和 having 都是对查询结果的一种筛选,where 不能放在group by 后面
2.having 是跟 group by 连在一起用的,放在 group by 后面,此时的作用相当于 where
3.where 后面的条件中不能有聚集函数,比如 sum(),avg() 等,而 having 可以
SQL 操作符 与 单双引号
准备员工表与部门表测试数据
oracle 查询指定用户名下所有表:select * from all_tables where owner='SAF'; --SAF 为用户名称(必须大写)
查看当前登录用户下的所有表:select * from user_tables;
1、Oracle 12c 安装完成后,默认没有了以前的 soctt 用户,所以没有测试数据,这里手动建员工表与部门表,然后设置一些测试数据。
--创建员工表
CREATE TABLE EMP
(EMPNO NUMBER(4) NOT NULL,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7, 2),
COMM NUMBER(7, 2),
DEPTNO NUMBER(2)
);--创建部门表
CREATE TABLE DEPT
(DEPTNO NUMBER(2),
DNAME VARCHAR2(14),
LOC VARCHAR2(13)
);--添加约束
alter table emp add constraint emp_pk primary key(empno);
alter table dept add constraint dept_pk primary key(deptno);
alter table emp add constraint emp_fk_dept foreign key(deptno) references dept;--部门插入数据
INSERT INTO DEPT VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO DEPT VALUES (20, 'RESEARCH', 'DALLAS');
INSERT INTO DEPT VALUES (30, 'SALES', 'CHICAGO');
INSERT INTO DEPT VALUES (40, 'OPERATIONS', 'BOSTON ');--员工表插入数据
INSERT INTO EMP VALUES (7369, 'SMITH', 'CLERK', 7902,TO_DATE('17-08-1980', 'DD-MM-YYYY'), 800, NULL, 20);
INSERT INTO EMP VALUES (7499, '张三', 'SALESMAN', 7698,TO_DATE('20-04-1981', 'DD-MM-YYYY'), 1600, 300, 30);
INSERT INTO EMP VALUES (7521, 'WARD', 'SALESMAN', 7698,TO_DATE('22-12-1981', 'DD-MM-YYYY'), 1250, 500, 30);
INSERT INTO EMP VALUES (7566, 'JONES', 'MANAGER', 7839,TO_DATE('2-10-1981', 'DD-MM-YYYY'), 2975, NULL, 20);
INSERT INTO EMP VALUES (7654, 'MARTIN', 'SALESMAN', 7698,TO_DATE('28-07-1981', 'DD-MM-YYYY'), 1250, 1400, 30);
INSERT INTO EMP VALUES (7698, 'BLAKE', 'MANAGER', 7839,TO_DATE('1-06-1981', 'DD-MM-YYYY'), 2850, NULL, 30);
INSERT INTO EMP VALUES (7782, 'CLARK', 'MANAGER', 7839,TO_DATE('9-07-1981', 'DD-MM-YYYY'), 2450, NULL, 10);
INSERT INTO EMP VALUES (7788, 'SCOTT', 'ANALYST', 7566,TO_DATE('09-01-1982', 'DD-MM-YYYY'), 3000, NULL, 20);
INSERT INTO EMP VALUES (7839, 'KING', 'PRESIDENT', NULL,TO_DATE('17-10-1981', 'DD-MM-YYYY'), 5000, NULL, 10);
INSERT INTO EMP VALUES (7844, 'TURNER', 'SALESMAN', 7698,TO_DATE('8-11-1981', 'DD-MM-YYYY'), 1500, 0, 30);
INSERT INTO EMP VALUES (7876, 'ADAMS', 'CLERK', 7788,TO_DATE('12-12-1983', 'DD-MM-YYYY'), 1100, NULL, 20);
INSERT INTO EMP VALUES (7900, 'JAMES', 'CLERK', 7698,TO_DATE('3-04-1981', 'DD-MM-YYYY'), 950, NULL, 30);
INSERT INTO EMP VALUES (7902, '李四', 'ANALYST', 7566,TO_DATE('3-07-1981', 'DD-MM-YYYY'), 3000, NULL, 20);
INSERT INTO EMP VALUES (7934, 'MILLER', 'CLERK', 7782,TO_DATE('23-09-1982', 'DD-MM-YYYY'), 1300, NULL, 10);
伪表/虚表(dual) 与 as 设置别名
1、dual 伪表/虚表:这是 Oracle 提供给所有用户的一张表,主要用于补齐语法结构,以及计算等操作。如 "select 1+1" 在 Mysql 中可以正确执行,但是 Oracle 中会报错,因为语法不对,此时可以借助 dual 伪表:"select 1+1 from dual".
2、as 别名查询:别名中不能有特殊字符或者关键字,如果有,则需要使用双引号括起来。as 关键字用于字段位置,不能用于表名,as 关键字可以省略。
select sysdate,9500 * 12 as 年薪 from dual;
select * from person2 ;
--as 设置别名,可以省略不写
select
(case when t.pid < 30 then '华东区' when t.pid <60 then '华南区' else '华北区' end) as area,t.pid,t.pname pname,t.paddress as address,'true' as isShow from person2 t;
distinct 关键字去重
distinct [[dɪˈstɪŋkt],截然不同的;有区别的;]关键字去重:对于结果中重复的数据行,如果想要去掉它,则可以使用 distinct 关键字,它去除结果集中重复的数据行。
select tabtype from tab; --不加 distinct 时的效果
select distinct tabtype from tab; -- 去重后的效果
select distinct * from tab t; --多个字段也是同理,去除重复的数据行
null 值不能做四则运算
select * from emp;--查看所有
select empno,job,sal * 12,comm from emp;--查询员工年薪。假设员工一年内薪资不变
--查询员工年薪加奖金。为 null 的字段表示值不确定,不能做四则运算,否则运算出来的结果也会为null,即结果不确定
--nvl(param1,param2):如果参数 param1 为 null,则返回参数 param2 的值
select empno,job,sal * 12 + nvl(comm,0),comm from emp;
"||" 字符串拼接
1、Java 中字符串拼接可以使用 "+" 号,Oracle 使用自己独有的 "||" 符合进行字符串拼接。
2、Oracle 中双引号通常在设置别名的时候使用,单引号在设值时使用。
3、除了 "||" 符合拼接字符串,也可以使用 concat(str1,str2) 函数进行拼接两个字符串。
select * from emp;--查看所有
--必须是单引号,双引号会报错。单引号才是设置值时使用。双引号通常用于设置别名
select empno,'尉迟 ' || ename,job,sal from emp
select empno,concat('上官',ename) ,job,sal from emp;--必须是单引号
is null,is not null
1、is null:判断值是否为 null,is not null 判断值是否不为 null。
2、用法与 mysql 是一样的
select * from emp;--查看所有
select * from emp where comm is not null;--查询有奖金的员工
select * from emp where comm is null;--查询没有奖金的员工
between and 区间查询
与 mysql 用法一样。区间查询包含边界,是闭区间。
select * from emp;--查看所有
select * from emp where sal between 1100 and 1500;--查询工资在 [1100,1500] 用户
select * from emp where sal >= 1100 and sal <= 1500;--查询工资在 [1100,1500] 用户
select * from emp where sal not between 2000 and 5250.50; --查询工资不在 [2000,5250.50] 中的员工
in 关键字集合查询
1、与 mysql 用法一样。注意:in 括号中个数不能超过 1000 个,否则执行报错。
2、注意:in 中参数可以为 null,而 not in 中不能有 null,否则查询结果恒为空,即查不到数据。
--查询部门是30号,且工作为 'SALESMAN'的员工
SELECT T.* FROM emp t where (t.deptno,t.job) in ((30,'SALESMAN'));
-- 查询姓名不是 'WARD','SCOTT','FORD','MILLER','ZhangSan' 的用户(参数不能有 null,否则结果恒为空)
select * from emp where ename not in ('WARD','SCOTT','FORD','MILLER','ZhangSan');
like 模糊查询
和 mysql 用法一样。
1、"%" 匹配多个字符,"-" 匹配单个字符。
2、如果有特殊字符,则需要使用 "escape" 关键字转义。
select * from emp;--查看所有select * from emp where ename like '__A%';--查询姓名中第三个字母为 'A' 的员工
select * from emp where ename like '%A%';--查询姓名中含有 'A' 字符的员工
select * from emp where ename like 'A%';--查询姓名中以 'A' 字符开头的员工
select * from emp where ename like '%E';--查询姓名中以 'E' 字符结尾的员工--如果查询的字符串只是单纯的特殊字符,则必须转义,否则条件无效,相当于查所有。
--escpae 指定的字符表示就是 like 中使用的转义字符,可以是任意的,只需要 like 中与 escpe 保持一致即可
--escpe 中指定的字符,即 like 中的转义字符后面紧跟的必须是特殊字符,否则报错。
select * from emp where ename like '%_%'; --此时相当于查询所有
select * from emp where ename like '%\_%' escape '\';
select * from emp where ename like '%#_%' escape '#';
order by 排序
1、升序:order by asc;降序:order by desc。默认为升序。
2、如果排序字段可能等于 null,则可以使用 "nulls firset" 或者 "nulls last" 指定 null 值的数据在前还是在后。
select * from emp;--查看所有select * from emp order by comm ;--按奖金由低到高排序,此时 null 值默认在最后
select * from emp order by comm asc;--按奖金由低到高排序,此时 null 值默认在最后
select * from emp order by comm nulls first;--按奖金由低到高排序,指定 null 值在最前
select * from emp order by comm desc ;--按奖金由高到低排序,此时 null 值默认在最前
select * from emp order by comm desc nulls last;--按奖金由高到低排序,指定 null 值在最后
select * from emp order by sal ,comm desc;--按薪资升序,奖金降序。当薪资出现相等时,则再按照奖金进行排序
group by 分组
1、group by 分组表达式格式:select 分组条件,分组后的操作 from 表名 where 条件 group by 分组条件 having 条件筛选
1)分组条件:通常就是需要分组/显示的字段(1个或多个),select 后面的分组条件可以省略,group by 后面必须写
2)分组后的操作:比如求和、求平均值、max、min 等
3)where:针对表中的列发挥作用,对查询数据附加条件
4)having:针对分组查询的结果发挥作用,筛选组
分组统计各部门的平均薪资 | select deptno,avg(sal) from emp group by deptno; |
分组统计各部门的平均薪资,过滤出大于 2000 的部门 | select deptno,avg(sal) from emp group by deptno having avg(sal) >2000 |
分组统计各部门的平均薪资,过滤出大于 2000 的部门,且以倒序排列 | select deptno,avg(sal) from emp group by deptno having avg(sal) >2000 order by avg(sal) desc; |
统计每年入职的员工人数 |
select to_char(hiredate,'yyyy'),count(1) from emp group by to_char(hiredate,'yyyy'); |
查询 gbm_bs_tx_sy_interface 表中身份证(id_card) 出现2次及以上的身份证,并显示个数 | select t.id_card,count(*) from gbm_bs_tx_sy_interface t where t.agency_id = 20802 group by t.id_card having count(*) >=2; |
查询各个部门中各个岗位的薪资最小值 |
select min(sal) from emp t group by t.deptno,t.job; |
select 后面的分组条件省略的写法,在复杂查询中用的多,如:rowid 伪列删除表中重复数据
Oracle 基本查询:dual、distinct、null、between and、in、like、order by、group by、dual、as相关推荐
- Database之SQLSever:SQL命令实现四则运算、desc降序、like模糊查询、distinct去重、MAX/MIN/SUM/AVG/COUNT/GROUP/having等案例之详细攻略
Database之SQLSever:SQL命令实现四则运算.desc降序.like模糊查询.distinct去重.MAX/MIN/SUM/AVG/COUNT/GROUP/having等案例之详细攻略 ...
- oracle中查询当前系统时间用到的dual是什么?
oracle我们查询当前系统时间的时候,经常用到dual,这个是什么东西呢? -- 查询系统时间 结果:2018/04/17 15:00:48 -- select sysdate from dual; ...
- oracle子查询不减少数据,Oracle性能优化-子查询到特殊问题
编辑手记:前面我们介绍常用的子查询优化方法,但总有一些情况时在规律之外.谨慎处理方能不掉坑. 前文回顾: 作者简介:韩锋 精通包括Oracle.MySQL.informix等多种关系型数据库,有丰富的 ...
- oracle高级查询案例,oracle高级查询(实例基于scott用户四张表)
oracle高级查询(实例基于scott用户四张表) 分组查询 多表查询 子查询 综合实例 ====================================================== ...
- oracle对查询结果求和_oracle基础知识分享
原文链接:https://page.om.qq.com/page/OO2PXCD6VZ6CVqLqjpU6uShg0 以下是本人整理的ORACLE学习的一些基本的语法知识,如有不对的地方,望大家批评指 ...
- oracle各种查询语句
1. Oracle安装完成后的初始口令? internal/oracle sys/change_on_install system/manager scott/tiger sysman/oe ...
- oracle数据库查询近五年数据,Oracle数据库查询基本数据
---------------------------------------------------------------- --找出EMP表 select * from EMP; --选择在部门 ...
- oracle sql查询缺失号,Oracle层次查询和分析函数
摘要 一组连续的数,去掉中间一些数,如何求出剩下的数的区间(即号段)?知道号段的起止,如何求出该号段内所有的数?知道一个大的号段范围和已经取过的号段,如何求出可用的号段?利用Oracle提供的强大的查 ...
- oracle 查询最高分,oracle高级查询
幕课oracle学习笔记 --!!!scott用户 --一.分组查询 --1.常用的分组函数:AVG(平均数),SUM,MIN,MAX,COUNT,WM_CONCAT(行转列) select avg( ...
- Oracle 子查询
子查询可以返回单行结果,可以返回多行结果,也可以不返回结果. 如果子查询未返回任何行,则主查询也不会返回任何结果 (空值)select * from emp where sal > (selec ...
最新文章
- java 实现hashmap_Java集合(十)实现Map接口的HashMap
- 既是移动硬盘也是微型计算机,既是移动硬盘也是微型计算机 Gnarbox 2.0 SSD让你随时随地备份自己的照片...
- 【Google Play】App Bundle 使用详解 ( 简介 | 应用内更新 | 即时更新 | 灵活更新 )
- java缓存怎么用_java开发应该如何缓存?
- html form int,is_int, is_numeric, is_float, and HTML form validation
- Ubantu install jdk
- 常用的JavaScript工具类库收藏
- ie系列浏览器_IE浏览器换Logo,真担心你上网找不到图标
- 从jsp页面到servlet传值的不同方式
- (万字长文)HashMap, ConcurrentHashMap 原理及源码详解 java1.7
- Faster R-CNN算法详细流程
- axure能做剪切蒙版吗_现在做uv打印生意能做吗,好做吗?
- 我的2017年总结-播种学习进阶的一年
- Exchange 暴力破解与防范
- 一个简单好用的磨皮祛斑算法理论和python实现
- cadence导入dxf文件_Allegro PCB导入DXF文件详解
- DIY超好吃的橙子果酱
- 485与232的区别
- 卷一:C佳佳语法第1篇
- Unity_MegaFiers_Morph O Matic