数据库介绍5

1、集合操作
数据中的查询语句得到的是一个结果集(ResultSet)
集合A和集合B
集合A:{1,2,3,4,5}
集合B:{1,3,5,7,9}
集合A和集合B合集:{1,2,3,4,5,7,9}
集合A和集合B交集:{1,3,5}
集合A和集合B差集:{2,4}
集合B和集合A差集:{7,9}
集合操作说明:
a.两个结果集必须结构相同
当列的个数、列的顺序、列的数据类型一致时,称这
两个结果集结构相同。只有结构相同的结果集才能
进行集合操作。
b.合集 union和union all
c.交集 intersect
d.差集 minus

//查询10部门的员工姓名和薪水
select ename,salary from emp_xu 
where deptno=10;
张三丰       99999.99
张无忌           5000
杨过             8000

//查询薪水大于6000的员工姓名和薪水
select ename,salary from emp_xu
where salary>6000;
张三丰       99999.99
杨过             8000
乔峰             8000
段誉            15000
孙悟空          50000
燕小六          12000
张无忌           8000

1)合集
union:去重,排序
union all:不去重,不排序
select ename,salary from emp_xu 
where deptno=10
union
select ename,salary from emp_xu
where salary>6000;

select ename,salary from emp_xu 
where deptno=10
union all
select ename,salary from emp_xu
where salary>6000;

2)交集 intersect
select ename,salary from emp_xu 
where deptno=10
intersect
select ename,salary from emp_xu
where salary>6000;

3)差集 minus
A-B:
select ename,salary from emp_xu 
where deptno=10
minus
select ename,salary from emp_xu
where salary>6000;

B-A:
select ename,salary from emp_xu
where salary>6000
minus
select ename,salary from emp_xu 
where deptno=10;

错误演示:
select ename,salary from emp_xu 
where deptno=10
intersect
select deptno,salary from emp_xu
where salary>6000;

select ename,salary from emp_xu 
where deptno=10
union
select position,salary from emp_xu
where salary>6000;

2、表间关联查询
1)内连接
 语法:
 表1 [inner] join 表2 on 条件
 //查询员工的姓名和其部门的名字
 select emp_xu.ename,dept_xu.dname
 from emp_xu inner join dept_xu
 on emp_xu.deptno=dept_xu.deptno;

 select e.ename,d.dname
 from emp_xu e inner join dept_xu d
 on e.deptno=d.deptno;
注意:结果集中的数据一定是在两个表中能找到匹配
数据的记录

//查询员工的姓名和他领导的名字
select e1.ename,e2.ename
from emp_xu e1 join emp_xu e2
on e1.leader=e2.empno;

select e1.ename,e2.ename
from emp_xu e2 join emp_xu e1
on e1.leader=e2.empno;

内连接:表1 inner join 表2 on 条件
说明:
a.表1为驱动表,表2为匹配表
b.当使用等值连接时,驱动表和匹配表可以互换的,
不会影响结果
c.执行过程:不论谁做驱动表,都会遍历驱动表,在
匹配表中查找匹配数据(匹配表中每条记录都要进行
匹配)

内连接:等值连接和非等值连接,返回满足条件的记录
等值连接:条件是等值操作'='
非等值连接:条件不是等值操作'>、<、<>'

//查询员工的姓名和其部门的名字,要求没有部门的
员工也要查询出来

员工=有部门的员工+没有部门的员工
select e.ename,d.dname
from emp_xu e inner join dept_xu d
on e.deptno=d.deptno
union
select ename,'No Dept' from emp_xu 
where deptno is null;

2)外连接
一:左外连接(以左边表为驱动表)
语法:
表1 left [outer] join 表2 on 条件

二:右外连接(以右边表为驱动表)
语法:
表1 right [outer] join 表2 on 条件

三:全外连接
语法:
表1 full [outer] join 表2 on 条件

外连接特征:
如果驱动表在匹配表中找不到匹配记录,则匹配一行
空行(驱动表中数据全部出现在结果集当中)

外连接的结果集=内连接的结果集+驱动表在匹配表中
匹配不上的记录和空值

//查询员工的姓名和其部门的名字,要求没有部门的
员工也要查询出来

员工=有部门的员工+没有部门的员工

外连接:员工全部被查询出来,员工表要做驱动表
select e.ename,nvl(d.dname,'No Dept')
from emp_xu e left outer join dept_xu d
on e.deptno=d.deptno;

select e.ename,nvl(d.dname,'No Dept')
from dept_xu d right join emp_xu e
on e.deptno=d.deptno;//左、右外连接可以互换

//查询员工的姓名和其部门的名字,要求没有员工的
部门也要查询出来
分析:需要将全部部门数据查询出来,部门表作为
驱动表
select d.dname,e.ename
from dept_xu d left join emp_xu e
on d.deptno=e.deptno;

select d.dname,e.ename
from emp_xu e right join dept_xu d
on d.deptno=e.deptno;

//查询哪些部门没有员工
分析:部门表数据全部被查询出来,部门表作为驱动
表。添加where条件过滤满足题目要求记录
select d.dname,e.ename
from dept_xu d left join emp_xu e
on d.deptno=e.deptno
where e.ename is null;

select d.dname,e.ename
from dept_xu d left join emp_xu e
on d.deptno=e.deptno
where e.empno is null;

//查询员工的姓名和其部门的名字,要求没有部门的
员工和没有员工的部门全部查询出来
select ename,dname
from emp_xu e full outer join dept_xu d
on e.deptno=d.deptno;

外连接的本质是驱动表中的数据全部出现在结果集中,
一条数据都不能少。

全外连接=内连接的结构集+驱动表在匹配表中匹配
不上的记录和空值+匹配表在驱动表匹配不上的记录
和空值

3、Oracle数据库排名分页
关键字:rownum
rownum是一个伪列,对查询返回数据的行进行编号即
行号,由1开始。

//查询员工表中前4条记录
select empno,ename,rownum from emp_xu 
where rownum<5;

//查询员工表中第四、第五、第六条记录
select empno,ename from emp_xu
where rownum>3;//未选定,rownum不能使用'>'

select empno,ename from emp_xu
where rownum>3 and rownum<7;//错误的写法

select empno,ename from emp_xu
where rownum<7
minus
select empno,ename from emp_xu
where rownum<4;

换种写法:
select empno,ename,rownum rn from emp_xu
where rownum<7;

select empno,ename,rn,rownum
from (
select empno,ename,rownum rn from emp_xu
where rownum<7
)
where rn>3;

4、约束条件(constraint)
1)主键约束
主键:primary key 简称PK
主键约束=不能为空+不能重复
一张表中只能存在一个主键,主键可以是一列也可以
是多列组合(联合主键)。
主键约束可以有两种方式定义:列级约束和表级约束
列级:
create table stu(
id number(4) primary key,
name varchar2(10)
);

insert into stu values(null,'张三');//不能为空
insert into stu values(0001,'张三');
insert into stu values(0001,'张三');//不能重复

drop table stu;//彻底删除
表级:
create table stu(
id number(4),
name varchar2(10),
constraint stu_id_pk primary key(id)
);

注意:表级定义约束建议命名规则
表名_列名_约束类型

//联合主键
constraint stu_id_name_pk primary key(id,name)

2)非空约束
非空约束:not null 简称NN
注意:非空约束只能定义在列级
drop table stu;

create table stu(
id number(4) primary key,
name varchar2(10) not null
);

insert into stu values(0001,null);//不能为空
insert into stu values(0001,'张三丰');

//表示给'name'字段添加非空约束并取一个名字
name varchar2(10) constraint stu_name_nn not null

3)唯一约束
唯一约束:unique 简称UK
列级:
drop table stu;

create table stu(
id number(4) primary key,
name varchar2(10) not null,
email varchar2(20) unique
);

insert into stu values(0001,'张三','[email protected]');
insert into stu 
values(0002,'张三','[email protected]');//不能重复

insert into stu values(0002,'张三',null);
insert into stu values(0003,'张三丰',null);
注意:NULL重复插入,唯一约束没有影响

表级:
drop table stu;

create table stu(
id number(4),
name varchar2(10) not null,
email varchar2(20),
constraint stu_id_pk primary key(id),
constraint stu_email_uk unique(email)
);

4)检查约束
检查约束:check 简称CK
列级:
drop table stu;

create table stu(
id number(4) primary key,
name varchar2(10) not null,
email varchar2(20) unique,
sex char(1) check(sex in('F','M'))
);

insert into stu 
values(0001,'张三','123@qq','男');//超出指定长度

insert into stu 
values(0001,'张三','123@qq','A');//违反检查约束

insert into stu 
values(0001,'张三','123@qq','F');

表级:
drop table stu;

create table stu(
id number(4),
name varchar2(10) not null,
email varchar2(20),
sex char(1),
constraint stu_id_pk primary key(id),
constraint stu_email_uk unique(email),
constraint stu_sex_ck check(sex in('F','M'))
);

5)外键约束
外键约束:foreign key 简称FK
外键约束定义在两个表的两个字段上(或者一张表的
两个字段),用来保证两个字段的关系。

//先创建部门表再创建员工(有先后顺序)
create table dept_temp(
deptno number(2) primary key,
dname varchar2(10) not null
);

create table emp_temp(
empno number(4) primary key,
ename varchar2(12) not null,
deptno number(2),
constraint emp_temp_deptno_fk 
foreign key(deptno) references dept_temp(deptno)
);

//员工插入一条记录
insert into emp_temp values(1001,'张三',10);

//部门插入一条记录
insert into dept_temp values(10,'研发部');

注意:需要先插入部门数据,然后再插入员工信息。
否则会报违反完整约束条件


修改表时添加主键约束
add constraint constraint_name primary key(column_name1,...);
select constraint_name from user_contraint where table_name='';
更改约束的名称
alter table rename contraint pk_id to new_pk_id;
删除主键约束
alter table userinfo disable constraint new_pk_id;
select constraint_name,status from user_contraint where table_name'';
alter table userinfo drop constraint new_pk_id;
alter table userinfo_p drop primary key;

总结:五大约束

*主键约束是惟一的每张表只能有一个,但是可以由多个字段构成

*外键约束是唯一的涉及两张表之间关系的约束

*创建表时设置约束,非空约束只能在列级设置,其他的可以在表级和列级设置,且非空约束没有名字,所以不能改名

*修改表时添加约束,特殊的也是非空约束,其实是修改字段的语句,然后在后面加上not null即可,删除时加上null即可

*约束名称可以通过数据字典查看------user_constraints

暂时不用------disable  使用时------enable  彻底删除------drop




















 

猜你喜欢

转载自blog.csdn.net/little_____white/article/details/81055698
今日推荐