Oracle表连接查询和联合查询

查询结果排序

Oracle查询语句中使用Order by语句对查询结果进行排序

ASC设置自然排序(正序|升序),可省略此关键字

DESC 设置倒序排序(倒序|降序)

select * from students order by birth ASC

提示:Oracle查询排序支持多列排序

 

表连接查询

表连接查询目的在于组合多表中的数据作为查询结果显示

  1. 自然连接,匹配查询表相同列名的数据去除重复项显示结果
  2. 内连接,设置连接条件,只匹配符合条件的数据进行组合
  3. 外连接,设置连接条件,以主连接表作为最终连接从参考

左外连接 右外连接 全连接

 

自然连接

select * from 1 natural join 2 natural join 3

 

内连接

内连接使用inner join关键字实现;

内连接通常使用whereon关键字设置连接条件;

使用on关键字是标准方式。

如果使用where语句,必须在inner join之前使用

 

外连接

select * from 1 left[outer] join 2 on 1.id = 2.sid

无论是否匹配连接条件,确保左侧表中所有记录全部显示,outer关键字可以省略

select * from 1 right[outer] join 2 on 1.id = 2.sid

无论是否匹配连接条件,确保右侧表中所有记录全部显示,outer关键字可以省略

 

联合查询

UNION查询(并集联合)

UNION ALL 查询(全联合)

INTERSECT查询(交集联合)

MINUS 查询(最小联合)

 

Union联合查询

UNION对两个查询结果集进行合并操作,将完全重复的记录剔除(合并重复行),相当于合并操作之后再执行一次DISTINCT操作

UNION可以对字段名不同但数据类型相同的结果集进行合并,UNION只允许对最终合并的结果集进行ORDER BY

 

Union查询的限制

  1. 两个数据源或者结果集必须具有相同的列数量;
  2. 依次按照2个数据源的字段顺序合并;
  3. 相互合并的字段名称可以不同,但是数据类型必须是相同或是兼容类型;
  4. 使用UNION前数据源字段名称作为最终结果集字段名称。

 

Intersect联合查询

Intersect查询用于获得两个结果集的交集,也就是只有都出现在两个表中的数据才会被查询返回,intersect多用于某个表对于另外一个表完全重复数据行的筛选。intersectnatural JOIN连接查询功能非常类似。

 

Minus联合查询

minus联合查询称之为减集,如A minus BA 中和B中同时有的数据将被剔除而只保留A中有而B中没有的数据。

 

--查询哪些学生没有成绩

select id 学生编号 from student minus select scores.sid from scores;

 

————————————————

oracle 建立外键 此列列表的唯一关键字或主键不匹配

 

 

 

在我建立外键的时候发生了这样的错误,猜测可能是跟主键有关系

我的语句是这么写的:

     constraint for_score_students foreign key(studentid) references students( studentid)

错误提示在了红色s

说明:

   1 这句语句写在第三个表score里面,我想把score里的studentid作为score的外键

   2 于是将问题定位于students

出现这个错误的原因有两种:

1students里的studentid不是主键(唯一关键字)

    此时只需要对studentid加一个主键约束即可add  primary key (studentid)

    而我的问题出在创建students时用的是旧表复制而来的:create table students as select * from student

    而复制旧表只能复制数据而不能复制约束,所以倒是students里的主键约束消失,出现了这样的错误。

 

2:   studentid不是唯一主键,可能我的students里的主键设为了两个(联合主键)【 primary key (courseid,studentid)

     此时就需要设为联合外键作为主键,像这样 constraint foreign_name foreign key( courseid,studentid) references studentid( courseid,studentid)

        提一句,尽量避免联合主键联合外键,这样不符合第三范式,可能会造成数据冗余。

————————————————

版权声明:本文为CSDN博主「在路上hpb」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/yzliang2016/article/details/79401689

————————————————

 

--查询结果的排序(Order by)
select * from emp_tab order by age asc; --自然排序,可以省略asc关键字
select * from emp_tab order by age desc; --自然排序,不可以省略desc关键字

--多列排序(永远考虑第一个排序完成后才会考虑依次后面的排序规则)
select * from emp_tab where address is null order by age desc,name desc; --倒序排序

--表连接查询
--自然连接
select * from emp natural join dept;

--内连接
select d.deptno,d.dname,d.loc from scott.dept d inner join scott.emp e on d.deptno = e.deptno;

--内连接显示部门及员工信息
select d.name 部门名称,e.id 员工ID,e.name 员工姓名 from dept d inner join emp e on d.id = e.depid;

--另一种内连接
--内连接显示部门及员工信息
select d.name 部门名称,e.id 员工ID,e.name 员工姓名 from dept d,emp e where d.id = e.depid;

--多表内连接查询
select d.name 部门名称,e.id 员工ID,e.name 员工姓名,t.address 员工地址 from dept d inner join emp e on d.id = e.depid 
inner join emp_tab t on e.address = t.address;

--左外连接
select e.ID,e.NAME,t.name,t.address from emp e left join emp_tab t on e.address = t.address;
select * from scott.dept left join scott.emp on scott.dept.deptno = scott.emp.deptno;
--右外连接
select e.ID,e.NAME,t.name,t.address from emp e right join emp_tab t on e.address = t.address;
select * from scott.dept right join scott.emp on scott.dept.deptno = scott.emp.deptno;

CREATE TABLE user2
(
 NAME VARCHAR2(64),
 age NUMBER,
 address VARCHAR2(64)
);

CREATE TABLE user3
(
 uNAME VARCHAR2(64),
 uage NUMBER,
 uaddress VARCHAR2(64)
);

INSERT INTO user2 values('白无瑕',23,'雪山');
INSERT INTO user2 values('令狐冲',29,'华山');
INSERT INTO user2 values('洪七公',62,'乞丐山');

INSERT INTO user3 values('白无瑕',23,'雪山');
INSERT INTO user3 values('李隆基',50,'凌霄宝殿');
INSERT INTO user3 values('洪七公',62,'乞丐山');

--联合查询
select name,age from user2 union select uname,uage from user3;

--联合查询排序
select name n,age a from user2 union select uname n,uage a from user3 order by n desc;

--联合全部查询
select name,age from user2 union all select uname,uage from user3 order by name desc;

select * from user2;
select * from user3;

--交集联合查询
select name,address from user2 intersect select uname,uaddress from user3;

select * from dep_table;
select * from emp_tab;

--减集联合查询
select ID 部门编号 FROM dep_table MINUS select dep_id from emp_tab;
--1 查询员工信息并定义中文列别名,显示列部门代码,部门名称,成立日期,员工姓名,生日和电话号码;
select d.code 部门代码,d.name 部门名称,d.newdate 成立日期, e.name 员工姓名,e.birth 生日,e.phone 电话号码 from dept d inner join emp e on d.id = e.depid;

--2 查询员工信息,显示部门名称,姓名,性别,地址和生日只限制性别是女的并安装生日倒序排列;
select d.name 部门名称,e.name 员工姓名,e.gender 性别,e.address 地址,e.birth 生日 from dept d inner join emp e on d.id = e.depid 
where e.gender = 0 order by e.birth desc;

--3 查询销售部所有员工信息显示姓名,地址,部门名称先安装生日正序排列再安装姓名倒序排列显示结果,要求使用左外连接实现;
select e.name 姓名,e.address 地址,d.name 部门名称 from emp e left join dept d on e.depid = d.id where d.name = '销售部' 
order by e.birth desc,e.name desc;

--4 使用union 自联合emp查询组合数据;
select e.address from emp e union select t.address from emp_tab t;

--5使用union all 自联合emp查询组合数据
select e.address from emp e union all select t.address from emp_tab t;

--6使用intersect 自联合emp查询组合数据;
select e.address from emp e intersect select t.address from emp_tab t;

--7使用minus 自联合emp查询组合数据;
select e.address from emp e minus select t.address from emp_tab t;

CREATE TABLE Products
(
 PID Number Primary key not null,
 PCode Varchar2(64) not null,
 PNmae Varchar2(64) not null,
 Price Date,
 Quantity Number,
 Descs Varchar2(1000)
);
alter table products rename column PNmae to PName;
alter table products modify(Price Number);
comment on column products.pid is '主键';
comment on column products.PCode is '产品代码';
comment on column products.PName is '产品名称';
comment on column products.Price is '单价';
comment on column products.Quantity is '库存数量';
comment on column products.Descs is '备注';

insert into products values(seq_sales.nextval,'DZ20170508','JP数码相机9X',6000,5000,'自定义');
insert into products values(seq_sales.nextval,'DZ20170610','CH摄像王xx5J',20500,1500,'自定义');
insert into products values(seq_sales.nextval,'DZ20195502','CH掌上宝MI9',2699,3500,'自定义');
insert into products values(seq_sales.nextval,'DZ20198807','JPX单反相机9XX',18000,2500,'自定义');

select * from products;
select * from emp;
select * from sales;

CREATE TABLE Sales
(
 ID number not null Primary key,
 salDate Date not null,
 PID number not null, 
 constraint fk_sales_pid foreign key(PID) references products(PID),
 EID varchar2(64) not null,
 constraint fk_sales_eid foreign key(EID) references emp(ID),
 SalQuantity Number, 
 constraint ck_sales_SalQuantity check(SalQuantity >=0),
 Price number,
 Descs varchar(1000)
)
comment on column sales.id is '主键';
comment on column sales.saldate is '销售日期(年月日)';
comment on column sales.PID is '产品ID,外键引用Product表主键值';
comment on column sales.EID is '员工id,外键,引用emp表主键值';
comment on column sales.SalQuantity is '销售数量';
comment on column sales.Price is '销售实际单价';
comment on column sales.Descs is '备注';

insert into sales values(seq_sales.nextval,to_date('2018-5','yyyy-MM'),100,'661',1000,6000'测试数据');

 

posted @ 2021-09-12 00:08  伊万  阅读(796)  评论(0编辑  收藏  举报