1.创建用户和表空间
- 以超级管理员的身份登录。
- 创建表空间。
- 创建用户。
- 给用户授权。
- 使用新用户进行查询测试。
sqlplus;
sys as sysdba; //输入用户名,以sysdba的身份登录
sys //输入密码
create tablespace 表空间名 datafile '文件路径\文件名.dbf' size 空间大小;
create user 用户名 identified by 密码 default tablespace 表空间;
grant dba to 用户; //给用户赋予权限
select * from dual; //使用新用户进行查询测试
2. 表约束
- 主键约束(PRIMARY KEY)
- 唯一性约束(UNIQUE)//可以为空,且可以有多个空,因为空和空不相等
- 非空约束(NOT NULL)
- 外键约束(FOREIGN KEY)//外键在的表是从表,必须在主表中存在才可以使用
- 检查约束(CHECK)
3. 排序
降序desc 升序asc
单字段排序:
select * from 表 order by 列 排序方式;
多字段排序:
select * from 表 order by 列1 排序方式, 列2 排序方式;
4.伪列。
说明:查询不存在的列即伪列,当需要的结果不能直接从表中得到 需要经过计算来展示则可以使用伪列 + 表达式实现。
select ename, 1 from emp;
查询姓名、月薪、年薪
select ename, sal, sal * 12 as year from emp order by sal desc;
- Null处理。
1. 查询员工月收入:工资 + 提成。
2. 查询员工信息,并按升序排序。
select sal, comm, sal + comm as 月收入 from emp;
此时,当提成为空时,工资无法与提成进行加法计算,得到的结果为空。
解决办法:
通过nvl()处理,nvl(exp1, res);当表达式不为空时,结果为表达式,表达式结果为空的时候,结果为res。
1. select sal, comm, sal + nvl(comm, 0) as 月收入 from emp;
就可以得到正确的工资情况了。
2. 排序可使用nulls first和nulls last来选择空的信息的位置:
select * from emp order by comm nulls first;
- 字符串拼接。
通过||实现字符串的拼接。
查询所有员工姓名并在后面加一个a。
select ename, ename || 'a' as 别名 from emp;
查询所有员工姓名并在后面加上两次本名。
select ename, ename || ename||ename as 别名 from emp;
查询所有员工姓名并加上他们的奖金。//当字符串拼接遇到空的时候,空会自动变成一个空字符串。
select ename, comm, ename || comm as test from emp;
5. 虚表
dual是一个虚表,虚拟表,是用来构成select的语法规则,oracle保证dual里卖弄永远只有一条记录。该表只有一行一列,它和其他的表一样可以执行插入、更新、删除操作,还可以执行drop操作,但是不要去执行drop操作,否则会使系统不能用,起不了数据库。
dual主要用来选择系统变量或是求一个表达式的值。如果我们不需要从具体的表中来取得表中数据,而是单纯地得到一些我们想要的信息,并通过select完成时,就要借助一个对象,这个对象就是dual。
1. 计算999 * 666;
select 999 * 666 from dual;
2. 获取系统时间。
select sysdate from dual;
6. 条件查询。
=、>、<、>=、<=、 | 表面意思 |
---|---|
<>、!=、^= | 不等于 |
between and | 区间之内 |
in 、not in | 几个定值 、不是这几个定值 |
or、and、not | 左右两个条件满足其1、左右两个条件全部满足、条件取反 |
is null、is not null 、not 判断条件 is null | 为空、不为空、不为空 |
nvl( 表达式, 结果值) | 表达式值不为空则是表达式,表达式为空则返回结果值 |
!=、<>、^=:表示不等。
查询员工部门不为10部门的员工。
select * from emp where deptno != 10;
select * from emp where deptno ^= 10;
select * from emp where deptno <> 10;
not :对条件取反。
查询员工部门不为20的信息。
select * from emp where not deptno = 20;
between and :区间之内。
查询员工部门为10-20的员工信息
select * from emp where deptno between 10 and 20 order by deptno;
in :几个定值
查询员工部门为10和20的员工信息
select * from emp where deptno in (10, 20) order by deptno;
nvl( , ): 表达式值不为空则是表达式,表达式为空则返回结果值
查询所有没有奖金的员工信息。(需要将奖金的空值转换为0、把它当成0看)
select * from emp where nvl(comm, 0) <= 0;
7. 模糊查询
% | 任意个任意的字符 |
---|---|
_ | 一个任意的字符 |
select * from emp where ename like '%a%%' escape('a');
表示该字符后面的第一个%或_表示为自己的含义。
该标识只针对后面一位字符:查询包含"a%"的员工名字。
select * from emp where ename like '%aaa%%' escape('a');
查询员工名称中包含a%并且在后面的某个地方还包含_的员工信息。
select * from emp where ename like '%aaa%%a_%' escape('a');
8. 函数介绍。
- 单行函数:对应在表记录时,一条记录返回一个结果,例如lower(x),将参数转换为小写。
- 多行函数:也称组函数、聚合函数(重点):此类函数可同时对多条记录进行操作,并返回一个结果。例如max(x)求最大值。
常用单行函数:
concat(x,y) | 连接字符串x和y |
---|---|
instr(x, str, start, n) | 在x中查找srt,可以指定从start开始,也可以指定找n次出现的位置 |
length(x) | 返回x的长度 |
lower(x)、upper(x) | 将x转化为小写/大写 |
ltrim(x, trim_str)、rtrim(x, trim_str) | 把x左边/右边截去trim_str字符串,缺省截去空格 |
replace(x, old, new) | 在x中查找old,并替换为new |
substr(x, start, length) | 返回x的字符串,从start处开始,截去length个字符,缺省length默认到结尾 |
abs(x) | x的绝对值 |
ceil(x) | 向上取整 |
floor(x) | 向下取整 |
mod(x, y) | 对x求y的余数 |
sysdate | 当前系统时间 |
current_date | 返回当前系统日期 |
add_months(d1, n1) | 返回在日期d1基础上再加n1个月后的日期 |
last_day(d1) | 返回日期d1所在月份最后一天的日期 |
months_between(d1, d2) | 返回日期d1到日期d2之间的月数 |
next_day(d1,[c1]) | 返回日期d1在下周,星期几(参数c1)的日期(当前时间的下一个星期一) |
to_char(x, c) | 将日期或数据x按照c的格式转换为char数据类型 |
to_date(x, c) | 将字符串x按照c的格式转换为日期 |
to_number(x) | 将字符串x转化为数字型 |
常用组函数:null不参与运算
avg() | 平均值 |
---|---|
sum() | 求和 |
min() | 最小值 |
max() | 最大值 |
count() | 统计数量 |
9. Having过滤组信息
查询部门员工大于等于4的部门,使用Having过滤掉不符合的分组
select deptno, count(*) from emp group by deptno having count(*) >= 4
10. Oracle分页
- 假分页:一次性查询所有信息,并分页显示
优点:与数据库交互少 缺点:数据多时占用内存多 - 真分页:每次查询相应页数的信息,并显示
优点:占用内存小 缺点:与数据库交互多
通过rownum实现分页。
由于结果集中默认也存在rownum,所以需要通过伪列显示rownum后进行查询。
一页五条,查询第二页数据。
select * from(select ename, deptno, rownum as rw from emp) where rw between 6 and 10;
11. 多表连接查询:92语法
等值链接
查询员工及该员工部门信息
select * from emp e, dept d where e.deptno = d.deptno
非等值链接
查询员工姓名,工资金额,入职时间,工资等级
select ename, sal, hiredate, grade from emp e, salgrade s where e.sal between s.losal and s.hisal
12. 外链接
只要在主表中出现的记录,即使另一张表没有合它匹配的也会显示出来。
左外连接:左面的表是主表。
右外连接:右面的表是主表。
看’+',带+的是从表,对立面的表为主表。
查看每一个部门的信息以及员工数。
select d.deptno, d.dname, loc, nvl(cc, 0) from dept d, (select deptno, count(*) as cc from emp group by deptno) e where d.deptno = e.deptno(+)
13. 自链接
特殊的等值链接,(来自于同一张表)
找出上级的员工姓名
```cpp
select e1.ename, e1.mgr, e2.ename from emp e1, emp e2 where e1.mgr = e2.empno(+)
14. 多表连接查询:99语法。
- 笛卡尔积实现:cross join
select * from dept cross join emp
- 自然链接:等值链接(必须有同名列或存在主外键关系):natural join
查询所有员工名称、员工编号、所属部门标号、所属部门名称。
会自己寻找等值。
select ename, empno, deptno, dname from emp natural join dept
- 等值连接:(必须有同名列) :join using
查询所有员工名称、员工编号、所属部门标号、所属部门名称。
select ename, empno, deptno, dname from emp join dept using (deptno)
- 可以解决一切链接:join on
同名列前需要加限定词,e.deptno
查询所有员工名称、员工编号、所属部门编号、所属部门名称。
select ename, empno, e.deptno, dname from emp e join dept d on e.deptno = d.deptno
查询每一个员工的姓名,工资,所属部门编号,工资等级。
select ename, sal, deptno, sg.grade from emp e join salgrade sg on e.sal between sg.losal and sg.hisal
查询30部门的员工姓名、工资、部门编号、工资等级、部门名称。
select ename, sal, d.deptno, sg.grade, d.dname
from emp e
join salgrade sg on e.sal between sg.losal and sg.hisal
join dept d on e.deptno = d.deptno
where d.deptno = 30
- 外连接:有主从表之分
left out join on(using) / right out join on(using)
查看员工编号、员工名称、上级编号、上级名称
左外连接:
select e1.empno, e1.ename, e1.mgr, e2.ename
from emp e1
left outer join emp e2 on e1.mgr = e2.empno
右外连接:
select e1.empno, e1.ename, e1.mgr, e2.ename
from emp e1
right outer join emp e2 on e1.mgr = e2.empno
15. 集合操作
- Union 、Union All、Intersect、Minus
- Union:并集(去重),对两个结果集进行并集操作,不包括重复行同时进行默认规则的排序。
select 'a', 'b' from dual
union
select 'c', 'd' from dual
union
select 'a', 'b' from dual
- Union All:全集(不去重),对两个结果集进行并集操作,包括重复行,不进行排序。
select 'a', 'b' from dual
union all
select 'c', 'd' from dual
union all
select 'a', 'b' from dual
- Intersect:交集(找出重复),对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序。
select 'a', 'b' from dual
intersect
select 'a', 'b' from dual
- Minus:差集(减去重复),对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。
(select 'a', 'd' from dual
union
select 'a', 'b' from dual
union
select 'a','f' from dual
)
Minus
select 'a', 'b' from dual