Oracle数据库整理-(前篇)
Oracle数据库整理
一.概述
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)等值连接
利用一张表中某列的值和另一张表中某列的值相等的关系,把俩张表连接起来。
例: 查询员工的名字、部门编号、部门名字
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
上一篇: 数据库高级
下一篇: 显示某两个字符及之间的字符