表連線:進行多表檢索最常用的技術,使用join關鍵字將乙個或者多個表按照彼此間的關係連線為乙個結果集。
資料準備:建立客戶表
mysql,mssqlserver,db2:
create table t_customer (
fid int not null ,
fname varchar(20) not null ,
fage int,primary key (fid))
oracle:
create table t_customer (
fid number (10) not null ,
fname varchar2(20) not null ,
fage number (10),primary key (fid))
mysql,mssqlserver,db2:
create table t_ordertype (
fid int not null ,
fname varchar(20) not null,
primary key (fid))
建立訂單表
oracle:
create table t_ordertype (
fid number (10) not null ,
fname varchar2(20) not null,
primary key (fid))
mysql,db2:
create table t_order (
fid int not null ,
fnumber varchar(20) not null ,
fprice decimal(10,2),
fcustomerid int,
ftypeid int,
primary key (fid))
mssqlserver:
create table t_order (
fid int not null ,
fnumber varchar(20) not null ,
fprice numeric(10,2),
fcustomerid int,
ftypeid int,
primary key (fid))
oracle:
create table t_order (
fid number (10) not null ,
fnumber varchar2(20) not null ,
fprice numeric(10,2),
fcustomerid number (10),
ftypeid int,
primary key (fid))
插入資料
insert into t_customer(fid,fname,fage)values(1,"tom",21);
insert into t_customer(fid,fname,fage)values(2,"mike",24);
insert into t_customer(fid,fname,fage)values(3,"jack",30);
insert into t_customer(fid,fname,fage)values(4,"tom",25);
insert into t_customer(fid,fname,fage)values(5,"linda",null);
insert into t_ordertype(fid,fname)values(1,"marketorder");
insert into t_ordertype(fid,fname)values(2,"limitorder");
insert into t_ordertype(fid,fname)values(3,"stop order");
insert into t_ordertype(fid,fname)values(4,"stoplimit order");
insert into t_order(fid,fnumber,fprice,fcustomerid, ftypeid)values(1,"k001",100,1,1);
insert into t_order(fid,fnumber,fprice,fcustomerid, ftypeid)values(2,"k002",200,1,1);
insert into t_order(fid,fnumber,fprice,fcustomerid, ftypeid)values(3,"t003",300,1,2);
insert into t_order(fid,fnumber,fprice,fcustomerid, ftypeid)values(4,"n002",100,2,2);
insert into t_order(fid,fnumber,fprice,fcustomerid, ftypeid)values(5,"n003",500,3,4);
insert into t_order(fid,fnumber,fprice,fcustomerid, ftypeid)values(6,"t001",300,4,3);
insert into t_order(fid,fnumber,fprice,fcustomerid, ftypeid)values(7,"t002",100,null,1);
如:需要查詢姓名為mike的客戶的訂單號和票價。
若sql不支援表連線,那麼完成這個功能的第乙個任務將是在t_customer 表中檢索姓名為mike的客戶的fid值:
select fid from t_customer where fname="mike"
這個sql語句返回2,也就是姓名為mike 的客戶的fid值為2,這樣就可以到t_order中檢索fcustomerid等於2 的記錄:
select fnumber,fprice from t_order where fcustomerid=2
執行結果:
fnumber fprice
n002 100.00
使用上述方法,不但檢索速度慢,且當資料複雜時,還很繁瑣,大大降低檢索效率,而使用sql中的表連線可簡化開發,並且由於資料庫系統會對錶連線進行查詢優化,所以使用表連線進行資料的檢索會非常快速。
表連線就像連線兩張資料表的連線,線的兩端是分別在兩張表的特定欄位上的。在這裡的例子中t_customer表的fid欄位和t_order表的fcustomerid欄位就是關聯關係的兩個端點。在使用表連線的時候必須顯式的指定這個關聯關係。
sql中使用join 關鍵字來使用表連線。
表連線有多種不同的型別,被主流資料庫系統支援的有交叉連線(cross join)、內連線(inner join)、外連線(outter join),在有的資料庫系統中還支援聯合連線(union join)。
六 SQL 表連線 內連線
內連線組合兩張表,並且基於兩張表中的關聯關係來連線它們。使用內連線需要指定表中哪些字段組成關聯關係,並且需要指定基於什麼條件進行連線。內連線的語法如下 inner join table name on condition其中table name 為被關聯的表名,condition則為進行連線時的條件...
六 SQL 表連線 交叉連線
與內連線比起來,交叉連線非常簡單,因為它不存在on子句。交叉連線會將涉及到的所有表中的所有記錄都包含在結果集中。交叉連線,定義方式分為隱式連線和顯式連線。隱式連線 只要在select語句的from語句後將要進行交叉連線的表名列出即可,這種方式可以被幾乎任意資料庫系統支援。如 將t customer表...
六 SQL 表連線 全外部連線
全外部連線並不是所有資料庫系統都支援,最常使用的mysql就不支援全外部連線。全外部連線 是左外部連線和右外部連線的合集,因為即使在右表中不存在匹配連線條件的資料,左表中的所有記錄也將被放到結果集中,同樣即使在左表中不存在匹配連線條件的資料,右表中的所有記錄也將被放到結果集中。如 使用全外部連線查詢...