日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

oracle数据库多表联查并排序,oracle数据库之多表联接查询(一)

發布時間:2023/12/18 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle数据库多表联查并排序,oracle数据库之多表联接查询(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

--此文章可以作為sql腳本直接運行

/*

建表以及插入相關數據,為后面的查詢做準備工作

*/ --建學生信息表

create table studentinfo(

stuid? int? primary key,

sname? varchar(10) not null,

cid??? int not null,

address varchar(20)

);

--建班級表

create table classes(

cid?? int primary key ,

cname varchar2(10)

);

--建考試信息表

create table exam(

eid int? primary key,

stuid int not null,

coursename varchar(20) not null,

score float

);

--加上外鍵約束???? 外鍵約束在表內不好加,因為要可慮建立表的先后順序,放在后面一起加就可以不考慮此問題

alter table studentinfo add? constraint fk_cid foreign key (cid) references? classes(cid);

alter table exam add? constraint fk_stuid foreign key(stuid) references? studentinfo(stuid);

--必須先插入classes表的數據,否則studentinfo表中的外鍵找不到參照的對象

insert into classes values (1,'0901');

insert into classes values (2,'0902');

insert into classes values (3,'0903');

create sequence seq_stuid ;

insert into studentinfo values(seq_stuid.Nextval,'zhangsan',1,'hnzz');

insert into studentinfo values(seq_stuid.Nextval,'lisi',1,'hncs');

insert into studentinfo values(seq_stuid.Nextval,'wangwu',2,'hncd');

insert into studentinfo values(seq_stuid.Nextval,'zhaoliu',2,'hndd');

insert into studentinfo values(seq_stuid.Nextval,'zhudao',3,'hnyy');

insert into studentinfo values(seq_stuid.Nextval,'david',3,'hnyy');

create sequence seq_eid ;

insert into exam values(seq_eid.Nextval,1,'java',80);

insert into exam values(seq_eid.Nextval,2,'java',59);

insert into exam values(seq_eid.Nextval,3,'java',67);

insert into exam values(seq_eid.Nextval,5,'oracle',99);

insert into exam values(seq_eid.Nextval,6,'oracle',100);

select * from classes ;

select * from studentinfo ;

select * from? exam ;

/*? 開始今天的內容? */

--內聯查詢

----題目:請查詢出所有參加了考試的同學的姓名,班級,考試科目和考試成績

select sname as 姓名,cname as 班級,coursename as 科目,score as 分數??? --要查詢什么就select什么,最好取上別名,更容易理解查詢結果

from studentinfo s inner join exam e???? --從studentinfo表 內聯接 exam表

on s.stuid = e.stuid???????????????????? --on?? 后面接條件(兩張表聯接的數據對應方式)??? 取表別名可以省寫一些代碼

inner join classes c

on c.cid=s.cid ;???????????????????????? --這種聯接可以一直聯接下去??? 前提是表之間有數據的對應

--下面我們將進行聯接的兩個表交換下位置

select sname as 姓名,cname as 班級,coursename as 科目,score as 分數

from exam e inner join studentinfo s

on s.stuid = e.stuid

inner join classes c

on c.cid=s.cid ;

--->查詢結果無變化???? 內聯查詢跟表的位置無關

--->分析:內聯查詢是?? 從左邊的表往右邊的表查找能匹配的記錄,無匹配的記錄行不顯示

--外聯查詢? 可以查詢出某些找不到對應值的行??? 左外聯和右外聯

--左外聯? 左邊的表中的行數全部保留? (從左邊的行往右邊找對應行)? 無匹配記錄的行也會顯示,顯示數據為空

select sname ,coursename ,score

from studentinfo s left join exam e on s.stuid =e.stuid ;

--右外聯? 右邊的表中的行數全部保留? (從右邊的行往左邊找對應行)

select sname ,coursename ,score

from studentinfo s right join exam e on s.stuid =e.stuid ;

--可以找出沒有去參加考試的人

select sname ,coursename ,score

from studentinfo s left join exam e on s.stuid =e.stuid

where score is null ;

--全外聯?? 兩邊表的行數據都能夠保存??? 會顯示無對應記錄的行

select sname ,coursename ,score

from studentinfo s full join exam e on s.stuid =e.stuid ;

--交叉聯接???? 查詢結果? 左邊表的每一行都對應一次右邊表的行

----左邊有5行?? 右邊有3行???? 查詢結果是? 5*3=15行

select sname ,coursename ,score

from studentinfo s cross join exam e? ;

--下面的查詢和交叉聯接查詢效果一樣

select sname ,coursename ,score

from studentinfo s , exam e? ;

create table shu1(

num1 int

);

insert into shu1 values (0);

insert into shu1 values (1);

insert into shu1 values (2);

insert into shu1 values (3);

insert into shu1 values (4);

insert into shu1 values (5);

insert into shu1 values (6);

insert into shu1 values (7);

insert into shu1 values (8);

insert into shu1 values (9);

--交叉聯接的應用

--生成彩票號碼的表? 還用到了自聯接? 這里模擬的是簡單的,只有3位數的彩票,不過思路是這樣的

create table caipiao?? --oracle中一種特殊的建表方式----》create table 表名 as select ...? 將查詢到的數據直接插入到新生成的表中

as

select a.num1 as a,b.num1 as b,c.num1 as c?? --新建的表的列名就是這里取的別名?? 這里新建表的列名就是 a,b,c

from shu1 a cross join shu1 b cross join shu1 c;

select * from caipiao ;

select count(*) as 彩票號碼總數 from caipiao ;

--求奇數列的和

create table test

as

select shu1.*,rownum as hangshu

from shu1 ;

select sum(num1) as 奇數列和 from test

where mod(hangshu,2) = 1 ;?? --mod(a,b)?? 求 a 模 b 的函數

總結

以上是生活随笔為你收集整理的oracle数据库多表联查并排序,oracle数据库之多表联接查询(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。