Oracle数据库环境搭建和select查询重要点

随声附和 提交于 2020-02-05 02:19:00

Oracle数据库环境搭建和查询重要点

环境搭建

安装OracleXE112_Win64

安装plsqldeveloperxx(64)

DBMS

数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称 DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。大部分 DBMS 提供数据定义语言DDL(Data Definition Language)和数据操作语言 DML(Data Manipulation Language),供用户定义数据库的模式结构与权限约束,实现对数据的追加、删除等操作。

DDL

DDL包括了create创建;drop删除;alter修改;rename重命名;truncata截断;

DML

包括了insert插入;delete删除;update更新;select查询;

DCL

包括了grant授权;revoke回收权利;commit提交事务;rollback回滚事物;

表是从属于用户的 ,查询表(用户名.表名),当前用户查询自己的表时,用户名.可以省略,其他用户查询 别的用户表 ,不能省略,同时必须存在权限。

表结构

表由表名、字段(名称+类型+约束)、记录 组成

三范式

在设计数据库时,存在行业的标准,这个标准也称为条件,即范式 Normal Form。一般遵循三个条件即可,也就是”三范式”(3NF)

1NF:每一列都是不可分割的基本数据项

2NF:非主属性非部分依赖于主键

3NF:属性不依赖于其它非主属性

select

命令不区分大小写

注释

例如:


--select 字段名1,字段名2,... from 表名  可查多个字段

普通查询

–select 后面是结果集

–select 字段名1,字段名2,… from 表名 可查多个字段
–别名 注意:如果想要特殊别名原封不动的显示,那么就需要把别名用""括起来,别名不能用单引号括起来
–如果别名出现全英文,默认会大写,如果想显示原本的,就用双引号括起来

–select 字段名1 as 别名,字段名2 别名,… from 表名 可查多个字段(也可以起别名,as可以省略)

–给表名起别名 表名 别名 注意:不能使用as

–字符串拼接 ||拼接

示例:


--查询emp表所有数据
select * from emp;

--查询emp表中的名字,编号,薪资
select ename,empno,sal from emp;

--查询所有部门的部门信息
select deptno,dname,loc from dept;

--查询公司中所有的部门编号
select deptno from dept;

--查询公司中有员工的部门的部门编号
select deptno from emp;

--distinct 去重 必须是结果集中的多条数据完全相同才能去重
select distinct deptno from emp;


--表达式      计算器
select 3*3 from emp;

--伪列 不是表中真实存在的字段
select distinct 'shsxt' from emp;

--给字段起别名 字段名 as 别名         as可以省略
select ename 姓名 from emp;

--给表名起别名 表名 别名 注意:不能使用as
select *from emp 部门表;

--给所有员工名称前添加'SXT'    注意:字符串拼接,拼接的内容不能用双引号括起来
select 'SXT'||ename 员工姓名 from emp;


--null处理:
--查询所有员工的姓名,薪资,和奖金,在原奖金上多发100
--null值和数字运算结果还是null
select ename,sal,comm+100 from emp;
--null值和字符串运算结果是原串
select ename,sal,comm||100 from emp;
--处理null值 nvl(参数1,参数2)     如果参数1为null,那么函数最终结果为参数2,反之还是为参数1
--不为null就用本身去加,为null本身就作为0去加
select ename,sal,comm, nvl(comm,0)+100 from emp;

--虚表 dual
--sysdate当前时间
select sysdate from dual;

--查询显示存在雇员的所有部门编号
select distinct deptno from emp;

条件查询

–条件查询

–select 内容 from 表 where 条件;

–执行流程:from where select

–分析三个点:查询数据、 数据来源、条件:

–1、=、>、<、>=、<=、!=、<>、betveen and

–2、and、or、not、

示例:


select * from emp;
--查询20部门的员工信息
select * from emp where deptno=20;

--查询工资大于1000的员工姓名 工作岗位 工资 所属部门编号
select ename,job,sal,deptno from emp where sal>1000;

--查询不在20部门工作的员工信息
select * from emp where deptno!=20;
select * from emp where deptno<>20;
select * from emp where not deptno=20;
--查询员工的年薪大于20000的 员工名称、岗位 年薪
select ename,job,(sal+nvl(comm,0))*12 年薪 from emp where (sal+nvl(comm,0))*12>20000;
select ename,job,(sal+nvl(comm,0))*12 年薪 from emp where not (sal+nvl(comm,0))*12<20000;

--先查再判断
--查询所有员工年薪
select ename,job,(sal+nvl(comm,0))*12 年薪 from emp;--数据来源
--判断
select * from (select ename,job,(sal+nvl(comm,0))*12 年薪 from emp) where 年薪>20000;


--假设现在 900,1000,1100
--all()
--查询工资比我们三个都高的员工信息
select * from emp where sal>all(900,1000,1100);

--查询工资比我们三个都低的员工信息
select * from emp where sal<all(900,1000,1100);

--查询工资比我们中随便一个工资高的员工信息
--some() any()
select * from emp where sal>some(900,1000,1100);
select * from emp where sal>any(900,1000,1100);
--查询工种为'SALESMAN'员工信息(注意区分大小写)
select * from emp where job='SALESMAN';

--检索工资2000,3000员工名称 岗位 工资
select ename,job,sal from emp where sal=2000 or sal=3000;
select ename,job,sal from emp where sal in(2000,3000);

--工资在2000到3000之间的员工信息
select * from emp where sal>=2000 and sal<=3000;
select * from emp where sal between 2000 and 3000;

--查询岗位为CLERK且部门编号为20的员工名称 部门编号 工资
select ename,deptno,sal from emp where job='CLERK' and deptno=20;

--查询岗位为CLERK或部门编号为20的员工名称 部门编号 工资
select ename,deptno,sal from emp where job='CLERK' or deptno=20;

--查询岗位不是CLERK员工名称 部门编号 工资
select ename,deptno,sal from emp where job!='CLERK';
select ename,deptno,sal from emp where not job='CLERK';
select ename,deptno,sal from emp where job<>'CLERK';

--查询岗位不为CLERK并且部门编号不为20的员工名称 部门编号 工资
--注意:not后面如果不加括号那么job<>'CLERK'只对这个取反
select ename,deptno,sal from emp where not (job='CLERK' or deptno=20);
select ename,deptno,sal from emp where (job!='CLERK' and deptno!=20);

--存在奖金的员工名称
select ename from emp where comm is null;

--不存在奖金的员工名称
select ename from emp where not comm is null;
select ename from emp where comm is not null;

--查询能领到奖金的员工姓名
select ename from emp where comm>0;
select ename from emp where (comm is not null and comm>0);

--查询工资大于1500或含有奖金的人员姓名
select ename from emp where (sal>1500 or (comm is not null and comm>0));
select ename from emp where (sal>1500 or comm>0);

子查询

–all(值1,值2…) 满足里面所有的值

–in (值1,值2…) 当对一个字段的多个值进行等值匹配,可以使用

–exists(结果集) 存在即保留,存在即合法

–select 数据 from 数据来源 where exists(结果集)

–从from中拿出一条数据去where中进行判断,如果exists(结果集)中有值,当前这一条就保留,满足条件,如果exists(结果集)中没有值,当前这一条就不保留

–如果里面没有值那么,就不会存储数据,什么都拿不到

示例:


--查询工资为:1500,2000,2500,5000的员工的信息
select * from  emp where sal=1500 or sal=2000 or sal=2500 or sal=5000;
select * from  emp where sal in(1500,2000,2500,5000);

--部门名称为SALES或ACCOUNTING的雇员信息

--先查询部门表的SALES、ACCOUNTING部门编号
select deptno from dept where dname in('SALES','ACCOUNTING');
--再通过查询到的部门编号再去雇员表里的雇员信息
--子查询
select *
  from emp
 where deptno in
       (select deptno from dept where dname in ('SALES', 'ACCOUNTING'));
       
--工资等级表所有信息
select * from salgrade;
--查询工资等级为2的员工信息
select * from emp where sal>=(select losal from salgrade where grade=2) and sal<=(select hisal from salgrade where grade=2);
--between and
select * from emp where sal between (select losal from salgrade where grade=2) and (select hisal from salgrade where grade=2);


--查询销售部(SALES)中工资大于1500的员工信息
select * from emp where deptno in(select deptno from dept where dname='SALES') and sal>1500;

--exists(结果集) 存在即保留,存在即合法
--select 数据 from 数据来源 where exists(结果集)
--从from中拿出一条数据去where中进行判断,如果exists(结果集)中有值,当前这一条就保留,满足条件,如果exists(结果集)中没有值,当前这一条就不保留
select *
  from emp
 where exists
       (select deptno from dept where dname in ('SALES', 'ACCOUNTING'));--只要exists(结果集)有值那么,就存储数据,所以拿到了emp表中的所有数据
       
--如果里面没有值那么,就不会存储数据,什么都拿不到
select *
  from emp
 where exists
       (select deptno from emp where deptno=40);
       
--拿到部门名称为SALES或ACCOUNTING的雇员信息
select *
  from emp e
 where exists
       (select deptno from dept d where dname in ('SALES', 'ACCOUNTING')and e.deptno=d.deptno);


--查询所有的行记录
select * from emp;--推荐使用所有字段名,这样效率更高
select * from emp where 1=1;
select * from emp where ename like '%';

集合和模糊查询

–集合操作:

–Union、Union All、Intersect、Minus

–Union,并集(去重) 对两个结果集进行并集操作,不包括重复行同时进行默认规则的排序;

–Union All,全集(不去重) 对两个结果集进行并集操作,包括重复行,不进行排序 ;

–Intersect,交集(找出重复) 对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;

–Minus,差集(减去重复) 对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序

–like模糊查询 % 任意个字符 _ 一个字符

示例:


--查询工资大于1500 或 含有佣金的人员姓名
select * from emp where sal>800 
Union 
select * from emp where comm is not null;

select * from emp where sal>800 
Union All
select * from emp where comm is not null;


--查询显示不存在雇员的所有部门号
select deptno from dept
Minus
select deptno from emp;

--定值查询,效率低
--查询员工姓名中字符A开头的员工信息
select * from emp where ename like 'ALLEN';

--查询员工姓名中字符A开头的员工信息
select * from emp where ename like 'A%';

--查询员工姓名中包含字符A的员工信息
select * from emp where ename like '%A%';

--查询员工姓名中第二个字母为A的员工信息
select * from emp where ename like '_A%';

--编写测试数据
--insert into emp(empno,ename,sal)values(1000,'t_%test',8989);
--insert into emp(empno,ename,sal)values(1200,'t_tes%t',8000);

--数据中 员工姓名中 % 如何查找:
--转义字符 escape()
select * from emp where ename like '%Q%%' escape('Q');--定义Q为转义字符,然后把Q放在%前面,也就是把%当成字符去查

排序

–排序

–select 数据 from 数据源 where 行过滤条件 order by 排序字段 desc降序/asc升序…;

–执行顺序 from where select order by

示例:


--雇员表中部门编号为30的员工薪资进行升序排序
select * from emp where deptno=30 order by sal asc;--默认排序(升序)
--如果薪资相同则按照员工编号进行升序排序
select * from emp where deptno=30 order by sal asc,empno desc;

数据库、用户、表之间的关系

Oracle数据库是通过表空间来存储物理表的,一个数据库可以存在多个实例,一个数据实例可以有N个表空间,一个表空间下可以有N张表。
当然实例,表空间等,都不需我们来划分,由专业的管理数据库的或者运维 人员划分,所以不需要关注,有疑问的同学简单了解

安装数据库系统,它会内置一些高级权限的用户如SYS,SYSTEM等。我们用这些高级权限账号登陆就可以在数据库实例中创建表空间,用户,表了。

表空间(tablespace)是数据库的逻辑划分,每个数据库至少有一个表空间(称作SYSTEM表空间)。为了便于管理和提高运行效率,可以使用一些附加表空间来划分用户和应用程序。例如:USER表空间供一般用户使用…一个表空间只能属于一个数据库。

Oracle数据库建好后,要想在数据库里建表,必须先为数据库建立用户,并为用户指定表空间。

创建用户:
CREATE USER 用户名
IDENTIFIED BY 密码
DEFAULT TABLESPACE 表空间(默认USERS)
TEMPORARY TABLESPACE 临时表空间(默认TEMP)

我们的scott.sql文件中:

TO SCOTT IDENTIFIED BY TIGER;

ALTER USER SCOTT DEFAULT TABLESPACE USERS;

ALTER USER SCOTT TEMPORARY TABLESPACE TEMP;

CONNECT SCOTT/TIGER;

就是相同的作用

有了数据库,表空间和用户,就可以用自定义的用户在自己的表空间创建表了。有了表,我们可以开发

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!