sqlplus;
sys as sysdba; //输入用户名,以sysdba的身份登录
sys //输入密码
create tablespace 表空间名 datafile '文件路径\文件名.dbf' size 空间大小;
create user 用户名 identified by 密码 default tablespace 表空间;
grant dba to 用户; //给用户赋予权限
select * from dual; //使用新用户进行查询测试
- 主键约束(PRIMARY KEY)
- 唯一性约束(UNIQUE)//可以为空,且可以有多个空,因为空和空不相等
- 非空约束(NOT NULL)
- 外键约束(FOREIGN KEY)//外键在的表是从表,必须在主表中存在才可以使用
- 检查约束(CHECK)
降序desc 升序asc
单字段排序:
select * from 表 order by 列 排序方式;
多字段排序:
select * from 表 order by 列1 排序方式, 列2 排序方式;
说明:查询不存在的列即伪列,当需要的结果不能直接从表中得到 需要经过计算来展示则可以使用伪列 + 表达式实现。
select ename, 1 from emp;
查询姓名、月薪、年薪
select ename, sal, sal * 12 as year from emp order by sal desc;
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;
dual是一个虚表,虚拟表,是用来构成select的语法规则,oracle保证dual里卖弄永远只有一条记录。该表只有一行一列,它和其他的表一样可以执行插入、更新、删除操作,还可以执行drop操作,但是不要去执行drop操作,否则会使系统不能用,起不了数据库。
dual主要用来选择系统变量或是求一个表达式的值。如果我们不需要从具体的表中来取得表中数据,而是单纯地得到一些我们想要的信息,并通过select完成时,就要借助一个对象,这个对象就是dual。
1. 计算999 * 666;
select 999 * 666 from dual;
2. 获取系统时间。
select sysdate from dual;
=、>、<、>=、<=、 | 表面意思 |
---|---|
<>、!=、^= | 不等于 |
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;
% | 任意个任意的字符 |
---|---|
_ | 一个任意的字符 |
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');
常用单行函数:
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() | 统计数量 |
查询部门员工大于等于4的部门,使用Having过滤掉不符合的分组
select deptno, count(*) from emp group by deptno having count(*) >= 4
通过rownum实现分页。
由于结果集中默认也存在rownum,所以需要通过伪列显示rownum后进行查询。
一页五条,查询第二页数据。
select * from(select ename, deptno, rownum as rw from emp) where rw between 6 and 10;
等值链接
查询员工及该员工部门信息
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
只要在主表中出现的记录,即使另一张表没有合它匹配的也会显示出来。
左外连接:左面的表是主表。
右外连接:右面的表是主表。
看’+',带+的是从表,对立面的表为主表。
查看每一个部门的信息以及员工数。
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(+)
特殊的等值链接,(来自于同一张表)
找出上级的员工姓名
```cpp
select e1.ename, e1.mgr, e2.ename from emp e1, emp e2 where e1.mgr = e2.empno(+)
select * from dept cross join emp
查询所有员工名称、员工编号、所属部门标号、所属部门名称。
会自己寻找等值。
select ename, empno, deptno, dname from emp natural join dept
查询所有员工名称、员工编号、所属部门标号、所属部门名称。
select ename, empno, deptno, dname from emp join dept using (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
查看员工编号、员工名称、上级编号、上级名称
左外连接:
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
select 'a', 'b' from dual
union
select 'c', 'd' from dual
union
select 'a', 'b' from dual
select 'a', 'b' from dual
union all
select 'c', 'd' from dual
union all
select 'a', 'b' from dual
select 'a', 'b' from dual
intersect
select 'a', 'b' from dual
(select 'a', 'd' from dual
union
select 'a', 'b' from dual
union
select 'a','f' from dual
)
Minus
select 'a', 'b' from dual