基础查询 

查询当前用户

show user;

查询当前用户下的表

select * from tab;

清屏

host cls;

clear;

--查询所有的员工信息

select * from emp;

查询行宽
SQL> show linesize
linesize 80

SQL> --设置行宽
SQL> set linesize 120

SQL> --设置列宽
SQL> col ename for a8 (本意思是colum ename format a8 啊代表一个字符,8a代表8个字符)
SQL> col sal for 9999 (9代表一个数字,9999代表4个数字长度)
SQL> /

SQL优化的原则:
SQL> 1。尽量使用列名

查询员工信息:员工号 姓名 月薪 年薪 奖金 年收入

select empno,ename,sal,sal*12,comm,sal*12+comm from emp;

SQL中的null
1、包含null的表达式都为null
2、null永远!=null
滤空
nvl(a,b) nvl2

如下

select empno,ename,sal,sal*12,comm,sal*12+nvl(comm,0) from emp;

sal*12+nvl(comm,0)  如果comm为null那么初始值为0

针对上面第二点   null永远!=null
--查询奖金为null的员工

select * from emp where comm=null;则查不出来,需要用is关键字

select *from emp where comm is null;

ed可以进入编辑模式

中文乱码解决

查看编码

select userenv('language') from dual;

AMERICAN_AMERICA.ZHS16GBK

不然下面使用的别名中文就会变成???

别名使用

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函数

select concat('Hello','  World') from emp;

select concat('Hello','  World') from dual;

select 3+2 from dual;

--dual表:伪表
--伪列

select 'Hello'||'  World' 字符串 from dual;

--查询员工信息:***的薪水是****
select ename||'的薪水是'||sal 信息 from emp;

 过滤和排序

--查询10号部门的员工

select * from emp where deptno=10;

--字符串大小写敏感
--查询名叫KING的员工

select * from emp where ename='KING'

--日期格式敏感

查询日期格式

select * from v$nls_parameters;

修改日期格式

alter session set NLS_DATE_FORMAT='yyyy-mm-dd';

--查询入职日期是17-11月-81的员工

select * from emp where hiredate='17-11月-81';

alter session set NLS_DATE_FORMAT='DD-MON-RR';改回

SQL> --between and
SQL> --查询薪水1000~2000之间的员工

--between and: 1.含有边界  2.小值在前 大值在后

select * from emp where sal between 1000 and 2000;

SQL> --in 在集合中

SQL> --查询10和20号部门的员工

select * from emp where deptno in (10,20);

SQL> --查询不是10和20号部门的员工

select * from emp where deptno not in (10,20);

之前对空值有2条这里加一条--null值 3、如果集合中含有null,不能使用not in;但可以使用in

--模糊查询

select * from emp where ename like 'S%';

select * from emp where ename like '____';

--转意字符

insert into emp(empno,ename,sal,deptno) values(1001,'Tom_AB',3000,10);

select * from emp where ename like '%\_%' escape '\';

--order by 后面  + 列、表达式、别名、序号

select empno,ename,sal,sal*12 from emp order by sal*12 desc;

select empno,ename,sal,sal*12 年薪 from emp order by 4 desc;

select empno,ename,sal,sal*12 年薪 from emp order by 年薪 desc;

--order by 作用于后面所有的列,先按照第一个列排序,再后面的列
--desc只作用于离他最近的列

select * from emp order by deptno desc,sal desc;

针对空值的  4. null的排序 null值最大 故查询需要放在最后

select * from emp order by comm desc nulls last;

单行函数

--字符函数

select lower('Hello World') 转小写,upper('Hello World') 转大写,initcap('hello world') 首字母大写 from dual;

--substr(a,b) 从a中,第b位开始取

select substr('Hello World',4) 子串 from dual;

--substr(a,b,c) 从a中,第b位开始取,取c位

select substr('Hello World',4,3) 子串 from dual;

--length 字符数 lengthb 字节数

select length('Hello World') 字符,lengthb('Hello World') 字节 from dual;

select length('北京') 字符,lengthb('北京') 字节 from dual;

--instr(a,b)--在a中,查找b

select instr('Hello World','ll') 位置 from dual;

--lpad 左填充  rpad 右填充

select lpad('abcd',10,'*') 左,rpad('abcd',10,'*') 右 from dual;

--trim 去掉前后指定的字符

select trim('H' from 'Hello WorldH') from dual;

--replace替换

select replace('Hello World','l','*') from dual;

--四舍五入

select round(45.926,2) 一,round(45.926,1) 二,round(45.926,0) 三,round(45.926,-1) 四,round(45.926,-2) 五 from dual;

--截断

select trunc(45.926,2) 一,trunc(45.926,1) 二,trunc(45.926,0) 三,trunc(45.926,-1) 四,trunc(45.926,-2) 五 from dual;

--当前时间

select sysdate from dual;

数字-字符串-日期转换

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

select (sysdate-1) 昨天,sysdate 今天,(sysdate+1) 明天 from dual;

--计算员工的工龄:天 星期  月 年

select ename,hiredate,(sysdate-hiredate) 天,(sysdate-hiredate)/7 星期,(sysdate-hiredate)/30 月,(sysdate-hiredate)/365 年  from emp;

不允许日期 + 日期  没有意义

--months_between

select ename,hiredate,(sysdate-hiredate)/30 一,months_between(sysdate,hiredate) 二 from emp;

select add_months(sysdate,53) from dual;

--last_day

select last_day(sysdate) from dual;

--next_day

--下一个星期四

select next_day(sysdate,'星期四') from dual;

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss"今天是"day') from dual;(日期转字符串)

--查询员工的薪水:两位小数、千位符、本地货币代码(数字转字符串)

select to_char(sal,'L9,999.99') from emp;

--nvl2(a,b,c) 当a=null的时候,返回c;否则返回b

select sal*12+nvl2(comm,comm,0) from emp;

--nullif(a,b) 当a=b的时候,返回null;否则返回a

select nullif('abc','abc') 值 from dual;

select nullif('abc','abcd') 值 from dual;

--coalesce 从左到右 找到第一个不为null的值

select comm,sal,coalesce(comm,sal) "第一个不为null的值" from emp;

--给员工涨工资,总裁1000 经理800 其他400

select ename,job,sal 涨前,

          case job when 'PRESIDENT' then sal+1000

               when 'MANAGER' then sal+800

              else sal+400

              end 涨后  

                from emp;

select ename,job,sal 涨前,decode(job,'PRESIDENT',sal+1000,'MANAGER',sal+800, sal+400) 涨后 from emp;

多行函数

--工资总额

select sum(sal) from emp;

--平均工资

select sum(sal)/count(*) 一,avg(sal) 二 from emp;

--null值 5. 组函数会自动滤空;

select count(*), count(comm) from emp;

select count(*), count(nvl(comm,0)) from emp;

--null值 5. 组函数会自动滤空;可以嵌套滤空函数来屏蔽他的滤空功能

--每个部门的平均工资

select deptno,avg(sal) from emp group by deptno;

--多个列的分组

--多个列的分组: 先按照第一个列分组,如果相同,再第二个列分组,以此类推

select deptno,job,sum(sal) from emp group by deptno,job order by 1;

--where和having的区别:where不能使用多行函数

--查询10号部门的平均工资

select deptno,avg(sal) from emp group by deptno having deptno=10;

select deptno,avg(sal) from emp where deptno=10 group by deptno;

--SQL优化 3. 尽量使用where

group by 的增强

select deptno,job,sum(sal) from emp group by rollup(deptno,job);

多表查询

--等值连接

--查询员工信息:员工号  姓名 月薪 部门名称

desc dept

select e.empno,e.ename,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno;

--不等值连接

--查询员工信息:员工号  姓名 月薪 工资级别

select * from salgrade;

select e.empno,e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal  and s.hisal;

--外连接:

--按部门统计员工信息:部门号 部门名称  人数

select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数 from emp e,dept d where e.deptno=d.deptno group by d.deptno,d.dname;

SQL> select * from dept;

SQL> select * from emp where deptno=40;

未选定行

希望把某些不成立的记录(40号部门),任然包含在最后的结果中 ---> 外连接
左外连接: 当where e.deptno=d.deptno不成立的时候,等号左边的表任然被包含在最后的结果中
写法:where e.deptno=d.deptno(+)
右外连接: 当where e.deptno=d.deptno不成立的时候,等号右边的表任然被包含在最后的结果中
写法:where e.deptno(+)=d.deptno

select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数 from emp e,dept d where e.deptno(+)=d.deptno group by d.deptno,d.dname;

--层次查询

select level,empno,ename,mgr from emp connect by prior empno=mgr start with mgr is null order by 1;

 子查询

--子查询所要解决的问题:不能一步求解

select * from emp where sal > (select sal  from emp where ename='SCOTT');

可以在主查询的where select having  from 后面使用子查询

不可以在group by使用子查询

select empno,ename,sal,(select job from emp where empno=7839) 第四列 from emp;

--any: 和集合中的任意一个值比较

--查询工资比30号部门任意一个员工高的员工信息

select * from emp where sal > any (select sal from emp where deptno=30);

--min最小值

select * from emp where sal > (select min(sal) from emp where deptno=30);

--all:和集合中的所有值比较

-查询工资比30号部门所有员工高的员工信息

select * from emp  where sal > all (select sal from emp where deptno=30);

max最大值

select * from emp where sal > (select max(sal) from emp where deptno=30);

集合运算

select * from emp where deptno=10 union select * from emp where deptno=20;

尽量不要使用集合运算

  --oracle分页(Pageing Query)

select *
from (select rownum r,e1.*
from (select * from emp order by sal) e1
where rownum <=8
)
where r >=5;

select * from (select e1.*,rownum r from (select * from emp order by sal) e1) where r>=5 and r<=8;

 SQL的类型

1、DML(Data Manipulation Language 数据操作语言): select insert update delete
2、DDL(Data Definition Language 数据定义语言): create table,alter table,truncate table,drop table
                      create/drop view,sequnece,index,synonym(同义词)
3、DCL(Data Control Language 数据控制语言): grant(授权) revoke(撤销权限)

使用管理员给scott用户授权

grant connect,resource,create any view,create any synonym,create database link to scott;

--插入insert

insert into emp(empno,ename,sal,deptno) values(1002,'Tom',3000,10);

insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno);

select empno,ename,sal,&t from emp;

一次添加多行

create table emp10 as select * from emp where 1=2;

--一次性将emp中,所有10号部门的员工插入到emp10中

insert into emp10 select * from emp where deptno=10;

--flashback其实是一种恢复

--设置运行命令是是否显示语句SQL

SQL> set feedback off

--导入数据
SQL> @d:\testdelete.sql

SQL> select count(*) from testdelete;

显示sql执行时间

SQL> set timing on;

SQL> delete from testdelete;

SQL> set timing off;

清空表

SQL> drop table testdelete purge;

SQL> @d:\testdelete.sql

SQL> set timing on;
SQL> truncate table testdelete;

SQL> set timing off;

--原因:(非常非常非常)undo数据(还原数据)

SQL> create table testsavepoint (tid number,tname varchar2(20));

显示sql

SQL> set feedback on;

SQL> insert into testsavepoint values(1,'Tom');

已创建 1 行。

SQL> insert into testsavepoint values(2,'Mary');

已创建 1 行。

--创建保存点

SQL> savepoint a;

保存点已创建。

SQL> select * from testsavepoint;

SQL> insert into testsavepoint values(3,'Maee');

已创建 1 行。

SQL>  select * from testsavepoint;

SQL> rollback to savepoint a;

SQL> select * from testsavepoint;

SQL> commit;

--事务处理集。(只读)

SQL> set transaction read only;

insert into testsavepoint values(3,'Maee');

oracle命令1的更多相关文章

  1. Oracle命令:授权-收回权限-角色

    Oracle命令:授权-收回权限-角色 oracle grant 不论授予何种权限,每条授权(grant)语句总是由三部分组成: 1) 接受者部分是准备获得权限的一个或多个用户的列表. 2)关键字权限 ...

  2. Oracle命令行中显示:ORA-04076: 无效的 NEW 或 OLD 说明

    Oracle命令行进行操作时可能出现"ORA-04076: 无效的 NEW 或 OLD 说明" 需要在条件语句中JOB前面添加“old.”即可(因为是在when条件里面,所以不用“ ...

  3. 给oracle命令的参数赋值

    ''' <summary>    '''   给oracle命令的参数赋值    ''' </summary>    ''' <param name="cmd& ...

  4. Oracle命令类别

    Oracle命令类别: 数据操纵语言:DML: select; insert; delete; update; merge. 数据定义语言:DDL: create; alter; drop; trun ...

  5. Linux下登录Oracle命令行时删除键^H解决方法

    Linux下登录Oracle命令行时删除键^H解决方法 在linux服务器下登录oracle的控制台,如果输入错误,想用删除键删除时却不能删除,输出的是^H的字符. 方法 用如下的命令可以使删除键生效 ...

  6. oracle命令

    oracle创建表空间: 1.如果在PL/SQL 等工具里打开的话,直接修改下面的代码中[斜体加粗部分]执行 2.确保路径存在,比如[D:\oracle\oradata\Oracle9i\]也就是你要 ...

  7. oracle命令识记

    连接数据库 sqlplus /nolog; conn / as sysdba; set ORACLE_SID=实例名; 查看表结构命令 select table_name from user_tabl ...

  8. oracle 命令创建用户 、授权、数据库导入、导出

    最近在使用oracle,经常要导入导出数据,命令很简单,却经常忘记,所以记下来.. drop user yfplss cascade;--登录system用户删除已存在的用户名,该用户下的所有东西都被 ...

  9. oracle命令大全

    内容包括三大项:    1.oracle基本操作语句 2.SQLServer基本操作语句 3.各种数据库连接方法 ******************************************* ...

随机推荐

  1. RNN流程

    1.记号 2.前向计算,第二张图是第一张图的公式的简化.其中a称之为隐状态 3.计算代价函数

  2. 以太坊钱包开发系列2 - 账号Keystore文件导入导出

    以太坊去中心化网页钱包开发系列,将从零开始开发出一个可以实际使用的钱包,本系列文章是理论与实战相结合,一共有四篇:创建钱包账号.账号Keystore文件导入导出.展示钱包信息及发起签名交易.发送Tok ...

  3. php 连接oracle 导出百万级数据

    1,我们一般做导出的思路就是,根据我们想要的数据,全部查询出来,然后导出来,这个对数据量很大的时候会很慢,这里我提出来的思想就是分页和缓冲实现动态输出. 2.普通的我就不说了,下面我说一下分页和内存刷 ...

  4. 菜鸟脱壳之脱壳的基础知识(四)——利用ESP定律来寻找OEP

    .上节说的是单步跟踪法,这节讲的是利用堆栈平衡(ESP定律)来进行脱壳!想必大家都听说过ESP定律这个大名吧!ESP定律运用的就是堆栈平衡原理!一般的加壳软件在执行时,首先要初始化,保存环境(保存各个 ...

  5. 1018. Binary Prefix Divisible By 5可被 5 整除的二进制前缀

    网址:https://leetcode.com/problems/binary-prefix-divisible-by-5/ 一次for循环遍历数组,在上次计算的基础上得到本次的结果! class S ...

  6. Git:一个简单示例

    初始状态:两个分支master/dev都只有一个文件readme.txt 待解决问题:在master分支新增文件,并且修改readme.txt文件,将上述操作同步至远程master分支,最后同步到de ...

  7. 斜率优化dp的总结

    放在了我的另一个博客上面 斜率优化dp的总结(多刷新几次才打得开)

  8. vue-常用指令

    一.一些指令 1.v-bind 绑定元素(简写 :) <div id="app-2"> <span v-bind:title="message" ...

  9. wireshark捕获/显示过滤器表达式书写规律说明

    一.说明 1.1 背景说明 对于大多数刚开始接触wireshark的使用者而言,经常是开始的时候时候看到wireshark能把所有数据包都拦截下来觉得强无敌,但是面对一大堆的数据包要问有什么用或者说想 ...

  10. 如何使用require.js?

    最近几天在学习一个javascript库require.js,也看了一些相关的教学视频,这里推荐一下幕课网阿当老师的<阿当大话西游之Web组件>的教学视频,一整套看下来,参照视频里面的de ...