您的位置:首页 > 数据库 > Oracle

Oracle子查询

2019-01-23 19:59 429 查看

1.子查询

语法:
select 字段列表 from table
where 表达式 operator (select 字段列表 from table);

说明:operator 是比较运算符(>,>=,<,<=,=,<>)
被()包裹的查询语句叫子查询(内层查询),子查询在主查询(外层查询)之前执行,子查询的结果被主查询使用 。
核心注意事项:
1)将子查询写到比较运算符的右边
2)单行子查询: 子查询返回的是单行结果,此时只能使用单行比较运算符
3)多行子查询:子查询返回的是多行结果,此时只能使用多行比较运算符
1.1 单行子查询
只能使用单行比较运算符:<, >, >=,<=, =, <>(!=)
例如:
2.查询职务和SCOTT相同,雇佣日期比SCOTT早的雇员信息
select * from emp where job=(select job from emp where ename=‘SCOTT’) and
hiredate<(select hiredate from emp where ename=‘SCOTT’)
1.2 多行子查询
多行比较运算符:

表达式(字段) In (a,b,c)
表达式(字段) any (a,b,c) :值和a,b,c,中的任意一个比较
例如:
– 1.查询部门编号为20的所有员工的收入
select sal from emp where deptno=20
– 2.查询所有员工,它的工资要>=上面一组收入中的任意一个
select * from emp where sal>=ALL(select sal from emp where deptno=20) and deptno=20

子查询的补充:可以在子查询中返回多个字段值,即子查询支持单行多列,此时外层的主查询需要将多个字段用()括起来
select * from emp where (sal,job)=(select sal,job from emp where ENAME=‘SMITH’)
子查询和连接查询的比较
1.当查询是基于一张表,且是基于未知值的查询,用子查询,其它情况下都使用连接查询。子查询的效率不如连接查询(sql执行器需要先对子查询语句进行分析,并返回结果),而连接查询是n个表一起分析
2. 理论上所有的子查询都可以用连接查询来代替
例如:查询工资和职位和 smith 相同的所有员工信息。
– 子查询
select * from emp where (sal,job)=(select sal,job from emp where ENAME=‘SMITH’) ;
– 自连接查询(把t1表当成是存储要查询的员工信息,t2表当成存储SMITH信息的表)
select * from emp t1 , emp t2 where t1.sal=t2.sal and t1.job=t2.job and t2.ename=‘SMITH’

2.分页模板

假设 pageNum:页号(第几页) , pageSize:每页几条记录

分页模板1:

select 字段列表 from(select rownum R,t.* from (
select * from 表名 ORDER BY 字段 desc|asc ) t where rownum<=(pageNum*pageSize))
where R>=(pageNum-1)*pageSize+1

分页模板2:

select 字段列表 from(select rownum R,t.* from (
select * from 表名 ORDER BY 字段 desc|asc ) t )
where R>=(pageNum-1)pageSize+1 and R<=(pageNumpageSize)

参照语法,实现 – 查询员工表的第3页信息,每页显示6条,
要显示的字段:工号,姓名,职位,工资
select empno,ename,job,sal from (select rownum R,t.empno,t.ename,t.job,t.sal from
(select * from emp ORDER BY sal desc) t where rownum<= 18) where R>=13

3.用户和权限

创建用户语法:create user 用户名 identified by 密码
1)切换当前用户,用system管理员来登录
命令: conn 用户名/密码;

其中,conn是切换用户,由当前的scott用户切换到system上(让system来连接oracle服务器), show user:显示当前登录的用户
2)使用创建用户语法去创建一个用户名为bjsxt,密码为123456的用户

新用户默认没有任何权限,无法登录到oracle服务器上
权限:执行SQL命令或访问其它数据库对象的能力(权利),权限是单一的,比如insert,update,select都是权限
角色:是一组权限的集合,一个角色中包含了多个权限。
角色相当于市长,市长所负责的事情称为权限。
在oracle中允许直接给用户分配角色,此时该用户就拥有了此角色下的所有权限。
授权语法:
Grant 角色名(权限名) to 用户;

例如:

也可以同时授予多个角色/权限,多个角色或权限之间使用逗号连接
比如 grant connect, resource to bjsxt;

要让新用户访问其它用户的表(或者其它对象),必须给新用户授予dba权限(既能够查询其它用户的表,也可以对其它用户的表做增删改)

访问其它用户的表,需要在表名前面加上”用户.”的前缀

撤销权限语法:
revoke 角色/权限名 from 用户;


删除用户语法:
drop user 用户名


注意:授权grant和撤销权限revoke这两个关键字是属于DCL(数据控制语言),不能在navicat的查询编辑器里面写,只能在sqlplus的命令窗口中写。Navicat的查询编辑器里可以写DML, DQL,但是navicat中写的DML语句会自动提交,没办法回滚。

4.字段的数据类型

4.1 字符串类型
CHAR(n):存储固定长度n的字符串 ,CHAR字段最多可以存储2,000字节的信息。如果创建表时,不指定CHAR长度,则默认为1
VARCHAR2(n) :存储可变长度n的字符串
n的单位是字节
固定长度指的是如果我们给字段插入值的长度不够n个字节,多余的部分会用空格填充,保证最终存到数据库中的长度是n个字节。
例如:定义字段tname,类型为char(5),给该字段插入值是mo,只有2个字节,但是oracle服务器会在mo后面填充3个空字符’’,最终存到表中的数据是’mo ‘
可变长度指:插入值的长度是多个字节,存到表中的就是多少字节.
如果给字段指定了char(n)或varchar2(n)的类型,该字段的值不能超过n个字节
总结:可以用lengthb(str)函数获取字符串str的字节数,用length(str)获取str的字符数
select dname, lengthb(dname) 字节数,length(dname) 字符数 from dept;
4.2 数字类型
Number(p, [s]):p是有效数字的总位数,s是小数部分的位数
例如:12.378 -->5位有效数字,3位小数
Number : 最多存38位整数,小数部分默认0位,默认p=38
Number(9): 最多存9位整数
Number(9,2):最多9位有效数字,小数部分最多2位,可以存12.87

5.表操作

1)create table:创建表
2)alter table:修改表,改表的结构
3)drop table:删除表

4)3种删除表

相同点:
1,相同点,使用drop delete truncate 都会删除表中的内容
drop table 表名
delete from 表名(后面不跟where语句,则也删除表中所有的数据)
truncate table 表名
不同点:
第1:delete from table属于DML语句,在没有提交前是可以回滚的;
而truncate table和drop table是直接生效的,不能回滚。
第2:delete语句和truncate table 都是删除表中的数据,表还存在。
Drop table是删除表结构,表就不存在了。

5)约束

A.主键约束:是最重要的约束,每个表都应该有主键字段,主键约束就是对主键的约束。
主键可以是单字段或者是多字段的组合,如果主键是由多个字段构成的,就叫联合主键,
通常情况下,主键就是表的第1个字段。
在Navicat中会把主键列加上一个黄钥匙来标记它是主键

建议直接在建表时创建主键约束,即在主键的类型后面写上primary key
create table student(
sno number(6) primary key, --添加主键约束
sname varchar2(20),
sex char(2),
age number(2),
email varchar2(30),
clazzid number(4)
– 加主键约束
– constraint PK_student primary key(sno)
);
B.唯一约束
直接在建表时给字段添加唯一约束,写个UNIQUE
例如: sname varchar2(20) UNIQUE
C.检查约束
在建表时可以对某个字段添加check约束
例如
sex char(2) check(sex=‘男’ or sex=‘女’),
age number(2) check(age>=18 and age<=25),
D.非空约束
只能在字段上定义,NOT NULL
例如:
email varchar2(30) not null
E.外键约束
外键:表中的一个列,该列的值必须是参照另一张表的主键或唯一键(加了唯一约束的字段)
定义了外键的表称为“子表”,外键所参照的表叫做“主表(或者父表)”
外键参照的是主表的主键或者唯一键
Dept是父表,emp表是子表
在删除主表的记录时,对子表的影响(删除策略)有三种:
1)RESTRICT方式:只有当删除的主表中的主键值在子表中没有被引用时,才能删除主表记录。
例如:如果要删除dept表中dept=10的部门,在子表emp中存在外键dept=10的员工信息,部门删除是失败的
2).CASCADE方式:将子表中所有外键值与主表中要删除的主键值相对应的记录一起删除(级联删除)
3).SET NULL方式:将子表中所有与主表中被删除的主键值所关联的外键值设为空值,只是将子表中的外键设为NULL
如:要删除dept表中dept=10的部门,在子表emp中关联10号部门的员工的外键都变成NULL值
添加外键约束的方式:在外键字段上写 references 父表(父表的主键)
[on delete 删除策略]
删除策略就是上面的RESTRICT,CASCADE和SET NULL之一,如果是RESTRICT,可以省略on子句。
On子句写成:on delete set null或on delete cascade
例如:
create table department(
id number(1) primary key,
name varchar2(20) not null,
c_id NUMBER(1) references city(cid) on delete cascade – 城市编号,外键,删除策略默认就是RESTRICT
)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: