Oracle的DQL
基本查询:
链接语句: sqlplus scott/tiger@192.168.56.101:1521/orcl
SQL> --清屏
SQL> host cls (host clear)
SQL> --当前用户
SQL> show user
SQL> --当前用户下的表
SQL> select * from tab;
SQL> --员工表的结构
SQL> desc emp
SQL> --查询所有的员工信息
SQL> select * from emp;
SQL> --设置行宽(表的显示)
SQL> show linesize
linesize 80
SQL> set linesize 150
SQL> --设置列宽(表的显示)
SQL> col ename for a8
SQL> col sal for 9999
SQL> /
SQL> --c命令 change (出错后更改SQL语句)(或者使用eq编辑原语句)
SQL> 2
2* form emp
SQL> c /form/from
2* from emp
SQL> /
SQL中的列别名:
1:列名后面跟 as;
2:as可以直接省略:
3:别名的双引号也可以省略(但是省略引号之后不能在其中加空格之类的);
select empno as "员工号", ename "姓名", sal "月 薪", sal*12, comm, sal*12+nvl(comm,0) from emp;
distinct去掉重复记录
select distinct deptno from emp;
select distinct deptno, job from emp;(distinct作用于后面所有的列)
连接符: || 相当于 concat 函数
SQL> select concat('Hello',' World') from emp; (其后面必须查询一张表,一般使用 dual表(伪表) );
SQL> select 'Hello'||' World' from dual;
SQL> select ename||'的薪水是'||sal 信息 from emp;
在SQL语句中, 字符 和 日期 使用单引号包裹起来,且字符大小写敏感, 日期格式敏感.
SQL> --修改日期格式
SQL> select * from v$nls_parameters; (查看基本参数)
SQL> alter session|system set NLS_DATE_FORMAT='yyyy-mm-dd';(更改日期格式)
过滤(where)
SQL> --between and: 1. 含有边界 2. 小值在前 大值在后
SQL> --查询薪水1000~2000之间的员工
SQL> select * from emp where sal between and ;
SQL> --in 在集合中
SQL> select * from emp where deptno in (,); 查询10和20号部门的员工
select * from emp where deptno not in (,);查询不是10和20号部门的员工
like 模糊查询
查询名字中含有下划线的员工
SQL> elect * rom emp where ename like '%\_%' escape '\' ; (使用escape声明一个转义字符)
排序:
查询员工信息 按照月薪排序
SQL> select * from emp order by sal; (ASC;DESC)
(order by后面 可以跟 : 列, 表达式, 别名, 序号)
SQL> select empno, ename, sal, sal* 年薪 from emp order by sal* desc; (年薪,)
多个列排序: order by 作用于后面所有的列;desc只作用于离他最近的列
SQL> select * from emp order by deptno desc, sal desc;
单行函数:
通用函数
1.nvl(a,b) 如果a为null,那么返回b.
2.nvl2(a,b,c) 当a=null的时候,返回c;否则返回b
3.nullif(a,b) 当a=b的时候,返回null;否则返回a
3.coalesce(a,b,c...): 从左到右第一个不为null的值
字符函数
select lower('Hello World') 转小写, upper('Hello World') 转大写, initcap('hello world') 首字母大写 from dual;
substr(a,b,c) 从a中,第b位开始取,取c位(无c取到末尾)
select substr('Hello World',,) 子串 from dual;
instr(a,b) :查询b在a中的位置
select instr('Hello World','ll') 位置 from dual; (结果为3)
length 字符数 lengthb 字节数
select length('北京') 字符, lengthb('北京') 字节 from dual;
lpad 左填充 rpad 右填充
SQL> -- abcd ---> 10 位
select lpad('abcd', , '*') 左, rpad('abcd', , '*') 右 from dual;
trim 去掉前后指定的字符
select trim('H' from 'Hello WorldH') from dual;
replace(a,b,c) 将a中的b使用c替换
select replace('Hello World', 'l', '*') from dual;
number函数
round(a,b) 将a四舍五入留b为小数点
select round(45.926, ) 一, round(45.926, ) 二, round(45.926, ) 三,round(45.926, -) 四, round(45.926, -) 五 from dual;
trunc(a,b) 将a截断保留b为小数点
select trunc(45.926, ) 一, trunc(45.926, ) 二, trunc(45.926, ) 三,trunc(45.926, -) 四, trunc(45.926, -) 五 from dual;
date函数
查询当前时间
select sysdate from dual;
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
select (sysdate-) 昨天,sysdate 今天,(sysdate+) 明天 from dual;
months_between 两个日期之间间隔的月数
select ename,hiredate,months_between(sysdate,hiredate) from emp;
add_months 当前日期下加上多少个月
select add_months(sysdate,) from dual;
last_day:日期所在月的最后一天
select last_day(sysdate) from dual;
next_day :某日期的下一个某一天(多有于分布式数据库,触发器,快照)
下一个星期日
select next_day(sysdate,'星期日') from dual;
显式类型转换
TO_NUMBER <> TO_CHAR(number,'format') 数字和字符串类型的转换
select to_char(sal, 'L9,999.99') from emp;
TO_DATE <> TO_CHAR('date','format') 时间和字符串类型的转换
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;
条件表达式(类似 if else ):
case :
select ename, job, sal 涨前,
case job when 'PRESIDENT' then sal+
when 'MANAGER' then sal+
else sal+
end 涨后
from emp;
decode:
select ename, job, sal 涨前,
decode(job, 'PRESIDENT', sal+,
'MANAGER', sal+,
sal+) 涨后
from emp;
多行函数:
count(); 计数
sum(); 求和
avg(); 平均值
max(); 最大值
min(); 最小值
wm_concat(); 列转行
select deptno,avg(sal) from emp group by deptno having avg(sal) > ;
: 在select中没有在 组函数中的列必须要在 group by 子句中
: where后面不能有 组函数, having后面可以有组函数.
group by 语句的增强:
select deptno,job,sum(sal) from emp group by deptno,job
+
select deptno,sum(sal) from emp group by deptno
+
select sum(sal) from emp
合成:
select deptno,job,sum(sal) from emp group by rollup(deptno,job);
作用: sql*plus报表
多表查询
等值连接(内连接)
select e.empno, e.ename, e.sal, d.dname from emp e, dept d where e.deptno = d.deptno;
不等值连接
select e.empno, e.ename ,e.sal, s.grade from emp e, salgrade s where e.sal between s.losal and s.hisal;
左外连接:当where e.deptno=d.deptno不成立的时候,等号左边的表任然被包含
写法:where e.deptno=d.deptno(+)
右外连接:当where e.deptno=d.deptno不成立的时候,等号右边的表任然被包含
写法: where e.deptno(+)=d.deptno
自连接
select e.ename 员工姓名, b.ename 老板姓名 from emp e, emp b where e.mgr=b.empno;
层次查询
select level,empno,ename,mgr from emp connect by prior empno=mgr start with mgr is null order by ;
子查询
注意的问题:
1. 括号
子查询(内查询)语句必须写在括号中
2. 合理的书写风格
子查询语句必须要有合理的书写规范
3. 可以在where select having from 后面 都可以使用子查询
select empno,ename,sal,(select job from emp where empno=) 第四列 from emp;
(select 子句中只能使用的单行子查询)
4. 不可以在group by后面使用子查询
5. 强调from后面的子查询
select * from (select empno,ename,sal from emp);
(性能同select empno,ename,sal from emp; 一样)
6. 主查询和子查询可以不是同一张表;只要子查询返回的结果 主查询可以使用 即可
select * from emp where deptno=(select deptno from dept where dname='SALES');
7. 一般不在子查询中排序;但在top-n分析问题中,必须对子查询排序(rownum为伪列)
select rownum,ename,sal from (select * from emp order by sal desc) where rownum<=;
8. 一般先执行子查询,再执行主查询;但相关子查询例外
相关子查询:将主查询中的值 作为参数传递给子查询
select empno,ename,sal,(select avg(sal) from emp where deptno=e.deptno) avgsal
from emp e where sal > (select avg(sal) from emp where deptno=e.deptno);
9. 单行子查询只能使用单行操作符;多行子查询只能使用多行操作符
在集合中
查询部门名称是SALES和ACCOUNTING的员工
select * from emp where deptno in (select deptno from dept where dname='SALES' or dname='ACCOUNTING');
any: 和集合中的任意一个值比较
查询工资比30号部门任意一个员工高的员工信息
select * from emp where sal > any (select sal from emp where deptno=);
all 和集合中的所有值比较
查询工资比30号部门所有员工高的员工信息
select * from emp where sal > all (select sal from emp where deptno=);
10.子查询中的null
分页:
select * from (select rownum r,e1.* from (select * from emp order by sal) e1 where rownum <=)
where r >=;
Oracle的DQL的更多相关文章
- oracle(5)--DQL查询语句
DQL 数据查询语句(data query language) 1.查询条件符号: < , > , = , <= , >= , != , < > ...
- oracle之DQL
一.单表查询 语法:select * from table where 条件 group by 分组 having 过滤分组 order by 排序 --查询平均工资低于2000的部门的最大工资和平均 ...
- Oracle查询DQL脚本记录
--查询列 Select t.sname,t.ssex,t.class from student t --t 别名; Select *from student t; --* 代表查询表内所有数据 '; ...
- oracle学习笔记(四) DQL数据查询语言和TCL 事务控制语言
DML 数据管理语言 Data manage language insert, update, delete以及select语句,不过,有人也把select单独出来,作为DQL 数据查询语言 data ...
- Oracle——DQL、DML、DDL、DCL
1.DQL:数据查询语言 基本结构:由select.from.where组成 子句组成的查询块: SELECT <字段名表> FROM <表或视图名> WHE ...
- Oracle数据库基本操作(三) —— DQL相关内容说明及应用
本文所使用的查询表来源于oracle数据中scott用户中的emp员工表和dept部门表. 一.基本语法 SQL语句的编写顺序: select 输出的列 from 表名 where 条件 group ...
- Oracle DQL查询语言整理
select * from t_hq_ryxx; select nianl, xingm from t_hq_ryxx; select nianl as 年龄, xingm as 姓名 from t_ ...
- [原创]关于ORACLE的使用入门
Oracle===============================数据库:Oracle------>甲骨文(Oracle) 49+%DB2---------->IBM 49+%Sq ...
- Oracle的SQL基础
1.了解SQL的种类 (1)DDL 数据定义语言:定义数据库中数据要如何存储的,包括对数据库对象的创建(create)修改(alter)删除(drop)的操作,这些对象主要有数据库,数据表,视图,索引 ...
随机推荐
- linux pstree命令
pstree命令可以使进程以tree的形式显示 pstree -ssystemd─┬─UVPHostd───6*[{UVPHostd}] ├─acpid ├─2*[agetty] ├─crond ├─ ...
- PHPStorm从入门到精通
1. 使用phpstorm+xdebug进行调试 首先,安装php的xdebug扩展 查看phpinfo中php的版本,php的安装位数,php的是否线程安全:根据这些下载对应的xdebug.dll ...
- C# Web开发中弹出对话框的函数[转载]
public void Alert(string str_Message) { ClientScriptManager scriptManager =((Page)System.Web.HttpCon ...
- size_t的使用
size_t的取值range是目标平台下最大可能的数组尺寸 典型的例子:x64平台下size_t是8位,而x32平台下是4位: int在两个平台下均为4位 所以在使用的时候一定要配置好对应的平台,否则 ...
- name设置id的方式 解决多个单选域冲突现象 同时有利于从动态网页取值
- <c:forEach>可以默认的把以逗号分隔的字符串作为一个集合来遍历
<c:forEach>可以默认的把以逗号分隔的字符串作为一个集合来遍历
- codeforces263B
Squares CodeForces - 263B Vasya has found a piece of paper with a coordinate system written on it. T ...
- 清北学堂(2019 4 28 ) part 2
主要内容数据结构: 1.二叉搜索树 一棵二叉树,对于包括根节点在内的节点,所有该节点左儿子比此节点小,所有该节点右儿子比该节点大,(感觉好像二分...) 每个节点包含一个指向父亲的指针,和两个指向儿子 ...
- Django通用视图APIView和视图集ViewSet的介绍和使用
原 Django通用视图APIView和视图集ViewSet的介绍和使用 2018年10月21日 14:42:14 不睡觉假扮古尔丹 阅读数:630 1.APIView DRF框架的视图的基类是 ...
- pycharm中查看源码的快捷键
将光标移动至要查看的方法处,按住ctrl 点击鼠标左键,即可查看该方法的源码