Oracle 数据库

导读:本篇文章讲解 Oracle 数据库,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Day01笔记

一、数据库

1.理解数据库

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库

**优点:**数据结构化,最低冗余度、较高的程序与数据独立性,易于扩展、易于编制应用程序。

分类: 小型 中型 大型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qcW1Qgng-1580862981925)(C:\Users\Hello Word\AppData\Roaming\Typora\typora-user-images\1580802885149.png)]

2.数据库管理系统(DBMS)

数据库管理系统(Database ManagementSystem)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称 DBMS。

**优点:**对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。

**存储模型:**可将数据库划分为关系型数据库和非关系型数据库

**关系模型:**指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。

3.Oracle数据库

Oracle Database又名为 Oracle RDBMS简称为Oracle是 一款关系数据库管理系统。

优点:系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的适应高吞吐量的数据库解决方案。

oracle 命令不区分大小写(SELECT 与 select), 存储数据|内容 区分大小写

4.SQL语言

理解:一种介于关系代数与关系演算之间的结构化查询语言,是一个通用的、功能极强的关系型数据库语言。
结构化查询语言sql:

DDL 数据定义语言: create 创建 drop 删除 alter 修改 rename 重命名

DML 数据管理语言: insert 插入 delete 删除 update 更新 select 查询

​ 数据查询语言 和 数据管理语言

​ **DCL 数据库控制语言:**grant 授权 revoke 回收权利 commit 提交事务 rollback 回滚事务

5.表

表是从属于用户的 ,查询表(用户名.表名)

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

表的逻辑(概念表):表是逻辑表(概念表),不是物理表,块(8k)
—>区(连续块)–>段(连续区) –>表(多个段) ,数据段不全是表,表一定是数据段。还有其他段:如索引段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uXCKpa6y-1580862981927)(C:\Users\Hello Word\AppData\Roaming\Typora\typora-user-images\1580804635937.png)]

6.表的结构

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Ha6U82e-1580862981928)(C:\Users\Hello Word\AppData\Roaming\Typora\typora-user-images\1580804700060.png)]

二、表

1.安装PLSQL Developer

  1. 安装plsql 注意安装问题
  2. sys 管理员身份登录(详见截图)
  3. oracle安装路径下找到scott.sql文件
  4. 文件拿到plsql中执行 齿轮f8
  5. 切换SCOTT用户身份登录 normal
  6. 新建一个sql window ,执行select语句查询是否表和数据已存在

2.Scott用户表

1)查看用户表

​ select table_name from tabs;

dept:部门表

emp:雇员表

salgrade:工资等级表

bonus:奖金表

2)查看表结构

desc emp; –在command Windows 打开

3)用户表说明

3.三范式

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1JHtNTPd-1580862981930)(C:\Users\Hello Word\AppData\Roaming\Typora\typora-user-images\1580805429780.png)]

2NF:在第一范式的基础上建立,第二范式就是非 主属性非部分依赖于主键,唯一属性列被称为主关键字或主键、主码
3NF:必须先满足第二范式,即第三范式就是属性不依赖 于其它非主属性。(外键)

总结:1NF->列不可再分,最小原子 (避免重复) ;2NF ->主键依赖 (确定唯一);3NF->消除传递依赖(建立主外键关联 拆分表)

三、Select(查询)

1.select语法

命令不区分大小写

SELECT
[DISTINCT] {*,column alias,..}
FROM
table alias 
WHERE
条件表达式 
ORDER
BY 排序字段列表 [asc|desc]

2.查询列(字段)

1)查询部分列

--查询员工名字
       select ename from emp;
       --查询员工编号
       select empno from emp;
       --查询员工编号,名字
       select empno,ename from emp;

2)所有列

--员工信息
select * from emp;
  --部门信息
  select * from dept;
  --工资等级表
  select * from salgrade;
  --奖金表
  select * from bonus;

3)去除重复

--去重 distinct 必须是结果集中的多条数据完全相同才能去重
     --有员工存在的部门的部门编号
     select distinct deptno from emp;

4)别名

--别名 select *|字段名1 (as) 别名,字段名2 别名,字段... from 表名;
--给字段别名  字段名 (as) 别名
--给表其别名  表名 别名  切记:不能使用as
--别名  如果别名中出现空格等特殊符号,或者想要原封不动显示 使用""  中的内容原封不动使用
select ename 员工名字 from emp;
select ename as 员工名字 from emp;
select * from emp e;
select ename 姓名,sal "工资",comm as "Sum" from emp;

5)字符串和字符串连接||

--字符串 ''
select distinct '呵呵' from emp;
--字符串拼接||
select 'JX'||' '||ename 员工姓名 from emp;

6)伪列

--虚列
select 3*3 as sum from emp;

7)虚表

--虚表
select 3*3 from dual;
select sysdate from dual;

8)null

--null 值
--处理null值  nvl (参数1,参数2) 如果参数1为null,函数最终的结果为参数2 ,如果参数1不为null,结果还是参数1
--查询所有员工的姓名,薪资,和奖金,在原奖金上多发100
select ename , sal, comm, nvl(comm,0)+100 "实际奖金" from emp;

四、查询行(记录)

1.比较条件

= 、>、 <、 >=、 <=、 !=、 <>

-- 查询20部门的员工信息
select * from emp where deptno=20;
-- 查询工资大于1000的员工的姓名 工作岗位  工资   所属部门编号
--查询数据: ename, job, sal , deptno
--数据来源: emp
--条件: sal>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 as sal from emp where (sal+nvl(comm,0))*12>20000;
--先查询所有员工的年薪,判断
select ename,job,(sal+nvl(comm,0))*12 money from emp;
select * from (select ename,job,(sal+nvl(comm,0))*12 money from emp) where money>20000;

2.且 或 非

or and not

--检索 工资 1000, 1600员工名称 岗位 工资
select ename,job,sal from emp where sal=1000 or sal=1600;
select ename,job,sal from emp where sal in(1000,1600);
-- 查询 岗位 为 CLERK 或部门编号为 20的员工名称 部门编号,工资
select ename,deptno,sal,job from emp where job='CLERK' or deptno=20;
-- 工资在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 not(job='CLERK' and deptno=20);
--查询 岗位 不是 CLERK 员工名称 部门编号,工资
select ename,deptno,sal from emp where not job='CLERK';

3.null

null 不能使用条件判断,只能使用is

---null  is not null   is null  
--存在佣奖金的员工名称
select ename,comm from emp where not comm is null;
select ename,comm from emp where comm is not null;
--不存在奖金的员工名称
select ename,comm from emp where comm is null;
-- 查询能领到奖金的员工姓名(>0)
select ename,comm from emp where comm>0;
--查询工资大于1500 或 含有佣金的人员姓名
select ename,sal,comm from emp where sal>1500 or comm is not null;

4.集合操作

Union、Union All、Intersect、Minus

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

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

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

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

--集合
--union  union all intersect minus
--查询工资大于1500 或 含有佣金的人员姓名
--union 去除重复行
select ename,sal,comm from emp where sal>1500
union
select ename,sal,comm from emp where comm is not null;
-- union all 不去除重复行
select ename,sal,comm from emp where sal>1500
union all
select ename,sal,comm from emp where comm is not null;
--查询显示不存在雇员的所有部门号。
select deptno from dept
minus
select distinct deptno from emp;
--查询工资大于1500 且 含有佣金的人员姓名
select ename,sal,comm from emp where sal>1500
intersect
select ename,sal,comm from emp where comm is not null;

5.like:模糊查询

模糊查询,使用通配符:

%:零个及以上(任意个数的)的字符

_:一个字符

遇到内容中包含 % _ 使用escape(‘单个字符’)指定转义符

--like
--查询员工姓名中包含字符A的员工信息
select * from emp where ename like '%A%';
--查询员工姓名中包含第二个A的员工名称信息
select * from emp where ename like '_A%';
--查询员工姓名中第一个A的员工名称信息
select * from emp where ename like 'A%';
--数据中 员工姓名中 存在 _ % ,如何查找:
--1)、编写测试数据
insert into emp(empno,ename,sal) values(1000,'t_%test',1800);
insert into emp(empno,ename,sal) values(1200,'t_%tes%t',3450);
--2)、查找
--查询员工姓名中包含字符%的员工名称 岗位 工资 部门编号
select ename,job,sal,deptno from emp where ename like '%a%%' escape('a');
select * from emp;
--查询员工姓名中包含第二个_的员工名称 岗位 工资 部门编号
select ename,job,sal,deptno from emp where ename like '%a_%' escape('a');

6.获取所有行的记录

---查询所有的行记录
select * from emp e;
select * from emp where 1=1;
select * from emp where ename like '%';

7.all some any

-- 假设现在 900,1000,1800
--all()
-- 查询工资比我们三个人都高的那些员工的信息
select * from emp where sal>all(900,1000,1800);
-- 查询工资比我们三个人都低的那些员工的信息
select * from emp where sal<all(900,1000,1800);
--some() any()
-- 查询比我们中随便一个工资高的员工信息
select * from emp where sal>some(900,1000,1800);
select * from emp where sal>any(900,1000,1800);

五、in、exists 与排序

1.in 与exists

in相当于使用or的多个等值,定值集合 ,如果存在 子查询,确保 类型相同、字 段数为1,如果记录多,效率不高,用于 一些 少量定值判断上

--in
-- 查询工资为i 1500, 2000, 2500, 5000的员工的信息
select * from emp where sal in (1500, 2000, 2500);
--部门名称为 SALES 或 ACCOUNTING 的雇员信息
--查询的数据 : 雇员信息
--数据的来源 : emp
--条件 :dname in ('SALES','ACCOUNTING')
--1)('SALES','ACCOUNTING')部门的部门编号
--查询的数据 :部门编号
--数据的来源 : emp,dept
--条件 : :dname in ('SALES','ACCOUNTING')
select deptno from dept where dname in ('SALES', 'ACCOUNTING');--10 30
select * from emp where deptno in(10,30);
--子查询
select *
  from emp
 where deptno in
       (select deptno from dept where dname in ('SALES', 'ACCOUNTING'));
-- 查询工资等级为 2的员工信息
--查询的数据 :员工信息
--数据的来源 : emp,salgrade
--条件 :工资等级为2 grade=2
--低范围
select losal from salgrade where grade=2;--1201
--高范围
select hisal from salgrade where grade = 2;--1400
select *
  from emp
 where sal between (select losal from salgrade where grade = 2) and
       (select hisal from salgrade where grade = 2);
-- 查询 销售部(SALES) 中 工资大于1500的员工信息
select deptno from dept where dname='SALES';
select *
  from emp
 where sal > 1500
   and deptno in (select deptno from dept where dname = 'SALES');

– exists条件为true,存在记录则返回结果**,后续不再继续 比较查询,与查询的字 段无关,与记录有关:

-- exists (结果集) 存在既保留,存在即合法
--select 数据 from 数据来源 where exists(结果集) 
-- 从from中拿出一条数据 去where 中进行判断 ,如果exists(结果集)中有值,当前这一条就保留|满足条件,如果exists(结果集)中没有值,当前这一条就不保留

-- 部门名称为 SALES 或 ACCOUNTING 的雇员信息
-- 结果:查询出所有的结果
select *
  from emp
 where exists
       (select deptno from dept where dname in ('SALES', 'ACCOUNTING'));
-- 空
select * from emp exists (select * from emp where deptno=40);
--'SALES', 'ACCOUNTING'的员工信息
select *
  from emp
 where exists
       (select deptno from dept where dname in ('SALES', 'ACCOUNTING')and emp.deptno=dept.deptno);
-- 结果20部门员工信息
select *
  from emp e
 where not exists (select deptno
          from dept d
         where dname in ('SALES', 'ACCOUNTING')
           and e.deptno = d.deptno);

2.排序

使用 ORDER BY 排序,排序不是真实改变存储结构的顺序,而是获取的集合的 顺序。

顺序 :asc(默认)升序 desc降序

多字段: 在前面字段相等时,使用后面的字段排序

空排序: 降序为 desc,注意 null 为最后

-- 排序  order by  asc 升序  desc 降序
-- 按工资降序
select * from emp order by sal desc;
--null问题
select * from emp order by nvl(comm,0),comm desc;
select * from emp order by comm nulls first;
-- 查询雇员姓名,年薪 按佣金排序 默认为升序(asc),降序为desc,注意null为最后
select ename,(sal+nvl(comm,0))*12 sal,comm total from emp order by comm desc;
-- 对部门编号为 20 或30的雇员,工资+佣金 进行升序排序,如果相同,则按姓名降序。
select * from emp where deptno in(20,30);
select ename, sal, comm, (sal + nvl(comm, 0)) * 12 total
  from emp
 where deptno in (20, 30)
 order by total asc, ename desc;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/121485.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!