当前位置: 移动技术网 > IT编程>数据库>Oracle > Oracle数据库整理-(前篇)

Oracle数据库整理-(前篇)

2020年07月14日  | 移动技术网IT编程  | 我要评论

一.概述

1.一个认知

  • 认知什么是oracle? oracle:商业运用第一的关系型数据库 实质:关系型数据库

2.二个概念

  • 数据库:数据存储的仓库
  • 关系型数据库:数据库中保存的对象之间可以存在一定的关联关系,并非完全独立。主要反映到以后学习的主外键.

3.三个名词

  • sql: 结构化的查询语句,操作oracle数据库的语言
  • sqlplus:oracle软件自带的可以输入sql,且将sql执行结果显示的终端
  • pl/sql:程序化的sql语句,在sql语句的基础上加入一定的逻辑操作,如if for…,使之成为一个sql块,完成一定的功能

4.四种对象

  • table:表格,由行和列组成,列又称字段,每一行内容为表格的一条完整的数据。

  • view: 视图,一张表或者多张表的部分或者完整的映射,好比表格照镜子,镜子里面的虚像就是view

  • sequence:序列

  • index:索引,提高数据的访问效率

  • synonym:同义,方便对象的操作

  • program unit:程序单元,pl/sql操作的对象

5.五种分类

  • Data retrieval:数据查询 select
  • DML:数据操纵语言(行级操作语言):操作的是表格当中一条一条的数据 insert update delete
  • DDL:数据定义语言(表级操作语言):操作的内容为表格(对象)
    create alter drop truncate rename
  • transaction control:事务控制 commit(提交) rollback(回滚) savepoint()
  • DCL:数据控制语言 如:grant revoke
    -delete: 删除表中的一条或者多条记录,该操作需要提交事务 truncate:清空表格,该操作不需要提交事务

二.数据查询操作

以下例子都会用到两张表 s_emp:员工表 s_dept: 部门表

1.使用select语句查询某张表的所有数据内容

语法:
select [distinct] *{col_name1,col_name2,…}
from tb_name;
注意:语法中出现的中括号[],表示该部分可有可无
* :表示所有列,在企业用语中不出现,因为效率低下且可读性差
col_name1:列名,将需要查阅的数据字段列举出来,可以查看多列值,列名之间用,进行分割即可
tb_name: 表名,要查询哪个表

例:查看s_dept表中的所有记录的id和name

select id,name  from s_dept;

2.select语句可以对指定的列的所有值进行算术运算

例:查看每个员工的员工id,名字和月薪涨100以后的年薪

select id,last_name,(salary+100)*12  from s_emp;

3.给查询的列起别名

例: 查看员工的员工id,名字和年薪,年薪列名为annual

select id,last_name,salary as annual from s_emp;

4.对null值得替换运算

语法:nvl()函数
select nvl(col_name,change_value)  from tb_name;
例: 查看所有员工的员工id,名字和提成,如果提成为空,显示成0
select id,last_name,nvl(commission_pct,0) commission_pct from s_emp;

语法:
select distinct col_name,col_name…from tb_name;
注意1:distinct关键词只能放在select关键词后面
例: 查看所有员工的职位名称和部门id,同职位同部门的只显示一次

select distinct title,dept_id from s_emp;

5.排序

1.排序:所谓排序,就是根据某个字段的值按照升序或者降序的情况将记录查询出来
语法:
select col_name,…from tb_name order by col_name [asc|desc],…
注意:1.排序使用order by字句,该子句只对查询记录显示调整,并不改变查询结果,所以执行权最低,即最后执行。
2.排序关键词:
asc:升序(默认,默认的意思是不加关键词的时候默认为生序排序)
desc:降序
3.如果有多个列排序,后面的列排序的前提是前面的列排好序以后有重复(相同)的值。
例:test表

id id2
1 2
2 3
3 4
4 1
4 2
语句:
select id,id2 from test order by id,id2 desc;

结果:

id id2
1 2
2 3
3 4
4 2
4 1

注意:先排第一列,如果第一列有重复的值再排第二列,以此类推
需求:查看员工的id,名字和薪资,按照薪资的降序排序显示。

4.order by 后面还可以跟数字,表示使用select后面的第几个列进行排序
例: //使用last_name列进行排序

select last_name,salary from s_emp order by 1;

6.限制查询

语法:
select col_name,… from tb_name
where col_name 比较操作表达式 逻辑操作符 col_name 比较操作表达式
注意:

  • 限制查询条件,使用where子句
  • 条件可以多个,使用逻辑操作符和()进行条件的逻辑整合
  • where子句的优先级别最高
  • 比较操作表达式由操作符和值组成
  • sql比较操作符SQL comparison operators
    BETWEEN … AND…
    IN(list)
    LIKE
    IS NULL
  • 逻辑比较操作符 : = > < >= <=
  • 不等于:三个都表示不等于的意思(经常用的是!=) != <> ^=

例: 查看名字为Ngao或者Smith的员工信息

select id,last_name,salary
from s_emp
where last_name in ('Ngao','Smith');

例:查看员工名字以C字母开头的员工的id,工资。
like:模糊查询,即值不是精确的值的时候使用
通配符,即可以代替任何内容的符号
% :通配0到多个字符
_ : 当且仅当通配一个字符
转义字符: 默认为,可以指定 指定的时候用escape 符号指明即可,转义字符只能转义后面的一个字符

select id,last_name,salary
from s_emp
where last_name like 'C%';

例:查看员工部门id为41且职位名称为Stock Clerk(存库管理员)的员工id和名字

select id,last_name,dept_id,title
from s_emp
where dept_id = 41 and title = 'Stock Clerk';

例: 查看员工提成不为空的员工信息

select id,last_name,commission_pct
from s_emp
where commission_pct is not null;

例:查看员工名字不是以C字母开头的员工信息。

select id,last_name,salary
from s_emp
where last_name not like 'C%';

7.多表查询

多表查询,又称表联合查询,即一条sql语句涉及到的表有多张,数据通过特定的连接进行联合显示.

笛卡尔积 : 在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y.
假设集合A={a,b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1),(b, 2)}。
在数据库中,如果直接查询俩张表,那么其查询结果就会产生笛卡尔积

连接查询
为了在多表查询中避免笛卡尔积的产生,我们可以使用连接查询来解决这个问题.
连接查询分为:

  1. 等值连接
  2. 不等值连接
  3. 外连接
    左外连接
    右外连接
    全连接
  4. 自连接

1)等值连接
利用一张表中某列的值和另一张表中某列的值相等的关系,把俩张表连接起来。
例: 查询员工的名字、部门编号、部门名字

select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id;

2)不等值连接
假设数据库中还有一张工资等级表:salgrade
工资等级表salgrade:
gradeName列表示等级名称
losal 列表示这个级别的最低工资数
hisal 列表示这个级别的最高工资数
表中的数据类似于下面内容:
id salgrade losal hisal
1 初级程序员 2000 4000
2 中级程序员 4000 6000
例:查询出员工的名字、职位、工资、工资等级名称

SELECT  e.last_name, e.title, e.salray, s.gradeName
		FROM    s_emp e, salgrade s
		WHERE   e.salray BETWEEN s.losal AND s.hisal

3)左外连接
例:查询所有员工 以及对应的部门的名字,没有部门的员工也要显示出来

select last_name,dept_id,name 
from s_emp,s_dept
where s_emp.dept_id=s_dept.id(+);

或者 俩者是等价的

select last_name,dept_id,name 
from s_emp left outer join s_dept
on s_emp.dept_id=s_dept.id;

注意:outer可以省去不写
4)右外连接
例:查询所有员工 以及对应的部门的名字,没有任何员工的部门也要显示出来

select last_name,dept_id,name 
from s_emp right outer join s_dept
on s_emp.dept_id=s_dept.id;

5)全连接
例: 查询所有员工 以及对应的部门的名字,没有任何员工的部门也要显示出来,没有部门的员工也要显示出来

select last_name,dept_id,name 
from s_emp full outer join s_dept 
on s_emp.dept_id=s_dept.id;

6)自连接:一张表,自己和自己连接
例: 查询每个员工的名字以及员工对应的管理者的名字

select s1.last_name,s2.last_name manager_name
from s_emp s1,s_emp s2
where s1.manager_id = s2.id;

本文地址:https://blog.csdn.net/weixin_43977265/article/details/107288091

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网