A. sql連接查詢
建議你還是做一個函數吧,函數把prize傳進去,逐個的獲取對應的獎勵名再輸出。
比如select name, sf_get_prizename(prize) from 表a
sf_get_prizename函數裡面,對於輸入參數,從前往後定位';',遇到了,截取字元,到表B取名字。做一個循環。這樣就能重新拼一個串出來,就把編號變成名字了。
CREATE function SF_GET_PRIZENAME(@PRIZE varchar(100))
returns varchar(100)
as
begin
declare @Position int
declare @newstr varchar(100)
declare @output varchar(100)
declare @char varchar(1)
declare @prizename VARCHAR(10)
set @newstr = @prize
set @output = ''
while len(@newstr) > 0
begin
set @char = left(@newstr,1)
if @char <> ';'
begin
select @prizename = definition from tb_b where code = @char;
set @output = @output + @prizename
end
else
begin
set @output = @output + ';'
end
set @newstr = substring(@newstr,2,len(@newstr) - 1)
end
return @output
end
調用:SELECT NAME, DBO.SF_GET_PRIZENAME(PRIZE) FROM 表A
B. sql連接不關閉多次查詢
緩存或者考慮分布式。
簡單的辦法就是對於頻繁使用的數據進行緩存,或者考慮分布式。
多表關聯查詢,查詢優化器的執行步驟具體如下。1.訪問路徑:查詢語句中涉及多個對象,可以基於成本確定每一個對象數據的檢索方式,是選擇全表掃描還是索引訪問等。2。連接方式:結果集之間的關聯方式,主要包括嵌套循環、哈希連接、排序合並連接等。優化器對結果集之間連接方式的判斷尤為重要,因為判斷結果將會直接影響SQL的執行效率。3.關聯順序:當關聯對象超過2個時,首先選取兩個對象關聯得到的結果集,再與第三個結果集相關聯。
C. SQL 幾種聯表查詢方式
二、CROSS JOIN(創建笛卡爾積) 對兩張表通過交叉聯合產生第三張返回結果集的表。相當於普通的連接。 三、INNER JOIN(內連接) 內連接就相當於普通的CROSS JOIN,只是格式不一樣,INNER JOIN在後面有一個ON子句(相當於WHERE)的搜索條件,用於過濾返回的行。 四、OUTER JOIN (外連接) select * from ta outer join tb on (ta.c1=tb.c1) outer join告訴DBMS生成結果表,在此表中不僅帶有相關(ta.c1=tb.c1)行對,而且還有來自兩個源表中任一表的不匹配的行。 五、LEFT OUTER JOIN(左連接) RIGHT OUTER JOIN(右連接) select * from ta left outer join tb on (ta.c1=tb.c1) select * from ta right outer join tb on (ta.c1=tb.c1) left outer join(left join) 告訴DBMS生成包括聯合行和任何不匹配的行的結果表,但是不匹配的行系來自查詢的FROM子句中LEFT OUTER JOIN關鍵詞左邊的表中。 right outer join(right join)與left outer join(left join)剛好相反。 六、FULL OUTER JOIN(全連接) FULL OUTER JOIN 返回組合了LEFT OUTER JOIN 和RIGHT OUTER JOIN結果的表。 以下是Inner Join及Outer Join的具體介紹: 在一個正規化的資料庫環境中, 我們常會碰到這款情形: 所需的資料並不是放在同一個資料表中, 在這個時候, 你就要用到 Join。 當然Join 如何將不同的資料庫的資料結合, 還要看你如何使用它, 一共有四種不同的 Join 的方式, 在這篇文章中我們將為你介紹 Inner Join 及 Outer Join 以及其應用。 Inner Join (自然連接)Inner Join 應該是最常用的 Join 方式, 它只會傳回符合 Join 規則的紀錄, 還是先來看看語法: Select <要選擇的欄位> From <主要資料表> <次要資料表> [On ] 現在我們利用 MS SQL Server 的內建資料庫看一個實例。 Select ProctId, ProctName, SupplierId From Procts 從Procts 產品資料表中取出三個欄位, 分別是產品代碼, 產品名稱, 供貨商代碼, 但查詢出來的結果保證讓你的老闆很不滿意, 因為供貨商代碼對於人類實在是無什麼意義, 這個時候 Join 就可以幫上忙了, 藉由 Join Suppliers 這個資料表我們便可以查詢到供貨商名稱Select ProctId, ProctName, Suppliers.SupplierId From Procts 首先要拿掉 Procts 資料表的 Foreign Key, 否則沒有法度在 Procts 資料表新增一筆 SupplierId 沒有對映到 Suppliers 資料表的紀錄, 要知影一個資料表的 Constraint 你可以執行 SQL 內建的 sp_helpconstraint , 在 QA 執行 sp_helpconstraint Procts 接下來刪除 FK_Procts_Suppliers 這個 Foreign Key Alter Table Procts Drop Constraint FK_Procts_Suppliers 再來新增一筆紀錄於 Procts 資料表, SupplierId 使用 50 是因為它並沒有對映到 Suppliers 資料表中的記錄 Insert Into Procts (ProctName,SupplierId,CategoryId) values ('Test Proct','50','1') 現在我們再執行頭前的查詢, 只是將 Inner Join 改為 Left Outer Join Select ProctId, ProctName, Suppliers.SupplierId From Procts Left Outer Join Suppliers Procts.Suppliers = Suppliers.SupplierId 比較一下兩種 Join 方式的查詢結果, 你應該就會知影其中的差別! 再來看看 Right Outer Join, 請新增下底這筆記錄 Insert Into Suppliers (CompanyName) values ('LearnASP') 現在請使用 Right Out Join 來作查詢, 比較看看查詢的結果和 Inner Join 有什麼不同! 尋找不相符紀錄 這里我們來看看如何使用 Out Join 來找不相符紀錄, 可能是有子紀錄卻沒有父紀錄或是顛倒過來 Select Suppliers.CompanyName From Procts Right Join Suppliers On Procts.SupplierId = Suppliers.SupplierId Where Procts.SupplierId is Null 執行結果你會找到一筆資料為 LearnASP, 該筆供貨商資料存在, 但基本上已經沒有產品是來自這個供貨商, 想像一下如果不用 Outer Join 你要怎麼以一個 SQL 指令完成同一查詢結果! 知道 Outer Join 的好用了吧! 再執行 Select Procts.ProctName From Procts Left Join Suppliers On Procts.SupplierId = Suppliers.SupplierId Where Suppliers.SupplierId is Null 這個查詢結果你會發現 Test Proct 這項產品竟然找不到供貨商的資料!
D. 關於SQL鏈接查詢的幾種方式
一、概述 通過連接運算符可以實現多個表查詢。連接是關系資料庫模型的主要特點,也是它區別於其它類型資料庫管理系統的一個標志。多表連接查詢是使用Sql的基本操作,但連接的方式卻有多種,熟練使用這些連接方式能夠簡化Sql語句,提高資料庫運行效率。 在關系資料庫管理系統中,表建立時各數據之間的關系不必確定,常把一個實體的所有信息存放在一個表中。當檢索數據時,通過連接操作查詢出存放在多個表中的不同實體的信息。連接操作給用戶帶來很大的靈活性,他們可以在任何時候增加新的數據類型。為不同實體創建新的表,然後通過連接進行查詢。 連接可以在SELECT 語句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出連接時有助於將連接操作與WHERE子句中的搜索條件區分開來。所以,在Transact-SQL中推薦使用這種方法。 二、基本語法與方法 SQL-92標准所定義的FROM子句的連接語法格式為:FROM join_table join_type join_table [ON (join_condition)] 其中join_table指出參與連接操作的表名,連接可以對同一個表操作,也可以對多表操作,對同一個表操作的連接又稱做自連接。 join_type 指出連接類型,可分為三種:內連接、外連接和交叉連接。內連接(INNER JOIN)使用比較運算符進行表間某(些)列數據的比較操作,並列出這些表中與連接條件相匹配的數據行。根據所使用的比較方式不同。 1、內連接又分為等值連接、自然連接和不等連接三種。 2、外連接分為左外連接(LEFT OUTER JOIN或LEFT JOIN)、右外連接(RIGHT OUTER JOIN或RIGHT JOIN)和全外連接(FULL OUTER JOIN或FULL JOIN)三種。與內連接不同的是,外連接不只列出與連接條件相匹配的行,而是列出左表(左外連接時)、右表(右外連接時)或兩個表(全外連接時)中所有符合搜索條件的數據行。 3、交叉連接(CROSS JOIN)沒有WHERE 子句,它返回連接表中所有數據行的笛卡爾積,其結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。 連接操作中的ON (join_condition) 子句指出連接條件,它由被連接表中的列和比較運算符、邏輯運算符等構成。 無論哪種連接都不能對text、ntext和image數據類型列進行直接連接,但可以對這三種列進行間接連接。例如:SELECT p1.pub_id,p2.pub_id,p1.pr_info FROM pub_info AS p1 INNER JOIN pub_info AS p2 ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) (一)內連接 內連接查詢操作列出與連接條件匹配的數據行,它使用比較運算符比較被連接列的列值。內連接分三種: 1、等值連接:在連接條件中使用等於號(=)運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列,包括其中的重復列。 2、不等連接: 在連接條件使用除等於運算符以外的其它比較運算符比較被連接的列的列值。這些運算符包括>、>=、
E. sql 全連接查詢
在兩表連接是不能用groub
by的。(內連接查詢)
select
學號,姓名,選修課課程from
學生信息表
inner
join
課程表
on
學生信息表.選修課課程
=
課程表.選修課課程;
F. SQL多表連接查詢實例分析(詳細圖文)
新建兩張表:
表1:student
截圖如下:
表2:course
截圖如下:
(此時這樣建表只是為了演示連接SQL語句,當然實際開發中我們不會這樣建表,實際開發中這兩個表會有自己不同的主鍵。)
一、外連接
外連接可分為:左連接、右連接、完全外連接。
1、左連接
left
join
或
left
outer
join
SQL語句:select
*
from
student
left
join
course
on
student.ID=course.ID
執行結果:
左外連接包含left
join左表所有行,如果左表中某行在右表沒有匹配,則結果中對應行右表的部分全部為空(NULL).
註:此時我們不能說結果的行數等於左表數據的行數。當然此處查詢結果的行數等於左表數據的行數,因為左右兩表此時為一對一關系。
2、右連接
right
join
或
right
outer
join
SQL語句:select
*
from
student
right
join
course
on
student.ID=course.ID
執行結果:
右外連接包含right
join右表所有行,如果左表中某行在右表沒有匹配,則結果中對應左表的部分全部為空(NULL)。
註:同樣此時我們不能說結果的行數等於右表的行數。當然此處查詢結果的行數等於左表數據的行數,因為左右兩表此時為一對一關系。
3、完全外連接
full
join
或
full
outer
join
SQL語句:select
*
from
student
full
join
course
on
student.ID=course.ID
執行結果:
完全外連接包含full
join左右兩表中所有的行,如果右表中某行在左表中沒有匹配,則結果中對應行右表的部分全部為空(NULL),如果左表中某行在右表中沒有匹配,則結果中對應行左表的部分全部為空(NULL)。
二、內連接
join 或
inner
join
SQL語句:select
*
from
student
inner
join
course
on
student.ID=course.ID
執行結果:
inner
join
是比較運算符,只返回符合條件的行。
此時相當於:select
*
from
student,course
where
student.ID=course.ID
三、交叉連接
cross
join
1.概念:沒有
WHERE
子句的交叉聯接將產生連接所涉及的表的笛卡爾積。第一個表的行數乘以第二個表的行數等於笛卡爾積結果集的大小。
SQL語句:select
*
from
student
cross
join
course
執行結果:
如果我們在此時給這條SQL加上WHERE子句的時候比如SQL:select
*
from
student
cross
join
course
where
student.ID=course.ID
此時將返回符合條件的結果集,結果和inner
join所示執行結果一樣。
四、兩表關系為一對多,多對一或多對多時的連接語句
當然上面兩表為一對一關系,那麼如果表A和表B為一對多、多對一或多對多的時候,我們又該如何寫連接SQL語句呢?
其實兩表一對多的SQL語句和一對一的SQL語句的寫法都差不多,只是查詢的結果不一樣,當然兩表也要略有改動。
比如表1的列可以改為:
Sno
Name
Cno
表2的列可以改為:
Cno
CName
這樣兩表就可以寫一對多和多對一的SQL語句了,寫法和上面的一對一SQL語句一樣。
下面介紹一下當兩表為多對多的時候我們該如何建表以及些SQL語句。
新建三表:
表A:
student
截圖如下:
表B:
course
截圖如下:
表C:
student_course
截圖如下:
一個學生可以選擇多門課程,一門課程可以被多個學生選擇,因此學生表student和課程表course之間是多對多的關系。
當兩表為多對多關系的時候,我們需要建立一個中間表student_course,中間表至少要有兩表的主鍵,當然還可以有別的內容。
SQL語句:select
s.Name,C.Cname
from
student_course
as
sc
left
join
student
as
s
on
s.Sno=sc.Sno
left
join
course
as
c
on
c.Cno=sc.Cno
執行結果:
此條SQL執行的結果是學生選課的情況。
G. SQL多表查詢總結
連接查詢包括合並、內連接、外連接和交叉連接,如果涉及多表查詢,了解這些連接的特點很重要。
只有真正了解它們之間的區別,才能正確使用。
UNION 操作符用於合並兩個或多個 SELECT 語句的結果集。
UNION 運算符通過組合其他兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重復行而派生出一個結果表。
當 ALL 隨 UNION 一起使用時(即 UNION ALL),不消除重復行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。
注意:使用UNION時,兩張表查詢的結果有相同數量的列、列類型相似。
學生表信息(Students):
教師表信息(Teachers):
1)基本UNION查詢,查詢學校教師、學生的總的信息表,包括ID和姓名
查詢結果:
2)查詢教師學生全部姓名
因為UNION只會選擇不同的值,如果學生中和教師中有重名的情況,這就需要UNION ALL
查詢結果:
INNER JOIN(內連接),也成為自然連接
作用:根據兩個或多個表中的列之間的關系,從這些表中查詢數據。
注意⚠️: 內連接是從結果中刪除其他被連接表中沒有匹配行的所有行,所以內連接可能會丟失信息。
重點:內連接,只查匹配行。
語法:(INNER可省略)
學生表信息(Students):
專業信息表(Majors):
實例:查詢學生信息,包括ID,姓名、專業名稱
查詢結果:
根據結果可以清晰看到,確實只有匹配的行。學生Lucy的信息丟失了。
與內連接相比,即使沒有匹配行,也會返回一個表的全集。
外連接分為三種:左外連接,右外連接,全外連接。
對應SQL:LEFT/RIGHT/FULL OUTER JOIN。
通常我們省略outer 這個關鍵字。寫成:LEFT/RIGHT/FULL JOIN。
重點:至少有一方保留全集,沒有匹配行用NULL代替。
1、LEFT JOIN (左連接)
結果集保留左表的所有行,但只包含第二個表與第一表匹配的行。第二個表相應的空行被放入NULL值。
依然沿用內鏈接的例子:
(1)使用左連接查詢學生的信息,其中包括學生ID,學生姓名和專業名稱。
查詢結果:
通過結果,我們可以看到左連接包含了第一張表的所有信息,在第二張表中如果沒有匹配項,則用NULL代替。
2、RIGHT JOIN (右連接)
右外連接保留了第二個表的所有行,但只包含第一個表與第二個表匹配的行。第一個表相應空行被入NULL值。
右連接與左連接思想類似。只是第二張保留全集,如果第一張表中沒有匹配項,用NULL代替
依然沿用內鏈接的例子,只是改為右連接
(2)使用右連接查詢學生的信息,其中包括學生ID,學生姓名和專業名稱
查詢結果:
通過結果可以看到,包含了第二張表Majors的全集,Computer在Students表中沒有匹配項,就用NULL代替。
3、FULL JOIN (全連接)
會把兩個表所有的行都顯示在結果表中
3)使用全連接查詢學生的信息,其中包括學生ID,學生姓名和專業名稱。
查詢結果:
包含了兩張表的所有記錄,沒有記錄丟失,沒有匹配的行用NULL代替。
4、CROSS JOIN(交叉連接)
交叉連接。交叉連接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉連接也稱作笛卡爾積。
簡單查詢兩張表組合,這是求笛卡兒積,效率最低。
笛卡兒積:笛卡爾乘積,也叫直積。假設集合A={a,b},集合B={0,1,2},則兩個集合的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以擴展到多個集合的情況。類似的例子有,如果A表示某學校學生的集合,B表示該學校所有課程的集合,則A與B的笛卡爾積表示所有可能的選課情況。
4)交叉連接查詢學生的信息,其中包括學生ID,學生姓名和專業名稱。
查詢結果:
5)查詢多表,其實也是笛卡兒積,與CROSS JOIN等價,以下查詢同上述結果一樣。
這個可能很常見,但是大家一定要注意了,這樣就查詢了兩張表中所有組合的全集。
查詢結果:
6)增加查詢條件
注意:在使用CROSS JOIN關鍵字交叉連接表時,因為生成的是兩個表的笛卡爾積,因而不能使用ON關鍵字,只能在WHERE子句中定義搜索條件。
查詢結果:
查詢結果與INNER JOIN一樣,但是其效率就慢很多了。
H. SQL兩表匯總連接查詢,語句怎麼寫
SQL中多表查詢可以使用鏈接查詢
1、union
union [all]
all:表示將查詢的所有結果都合並到結果集中,若不加all會將重復的行只保留一行
1
2
--示例:
select * from a union select * from b
2、join
連接分為內連接、外連接、交叉連接
2.1、內連接 inner join (默認的連接方式)
只有至少有(指定的欄位)一行的記錄在兩個查詢表中都有記錄,此時才有結果集。即 返回兩個表之間的交集(相同欄位的記錄)
1
2
--示例:
SELECT * FROM `a` INNER JOIN b ON a.aaa = b.aaa
2.2、外連接
a、left join 左連接
返回查詢表的記錄,包含左邊表的所有記錄,如果左邊表中的記錄在右邊表中沒有對 應的記錄,則所返回右邊表的欄位結果為空(差集)
1
2
--示例:
SELECT * FROM `a` LEFT JOIN `b` ON a.aaa = b.aaa
b、right join 右連接
與left join相反,查詢的記錄包含右邊表的所有記錄,如果右邊表中的記錄在左邊表 中沒有對應的記錄,則返回左邊表的欄位值為空(差集)
1
2
--示例:
SELECT * FROM `b` LEFT JOIN `a` ON a.aaa = b.aaa
c、full join 全連接
返回左表和右表中的所有記錄,即兩表的數據全部顯示
1
2
--示例:
select * from a full join b
3、cross in 交叉連接
不帶where子句,返回兩個表中所有笛卡爾積,記錄數為a表和b表記錄數的積
1
2
--示例:
SELECT * FROM `b` CROSS JOIN `a`
I. sql左連接、右連接、全連接、內連接有啥區別
左(外)連接(LEFT JOIN),以左表為基準,查詢出左表所有的數據和右表中連接欄位相等的記錄,如果右表中沒有對應數據,則在左表記錄後顯示為空(NULL).如果把兩個表分別看成一個集合的話,則顯示的結果為JOIN左邊的集合。
右(外)連接(RIGHT JOIN )是以右表為基準,查詢出右表所有的數據和左表中連接欄位相等的記錄,如果左表沒有對應數據則在右表對應數據行顯示為空(NULL).如果把兩個表分別看成一個集合的話,則顯示的結果為JOIN右邊的集合。
內連接(INNER JOIN )是查詢出兩個表對應的數據,如果把兩個表分別看成一個集合的話,內連接的結果即為兩個表的交集。
全連接(FULL JOIN )將兩個表的數據全部查出來,返回左右表中所有的記錄和左右表中連接欄位相等的記錄,如果把兩個表分別看成一個集合的話,全外連接的結果即為兩個表的並集。
J. sql的幾種常見查詢方式
一、內連接(Inner Join)
select*fromainnerjoinbona.name=b.name;
此語句的結果為同時匹配表a和表b的記錄集。即內連接取的是兩個表的交集。
二、全外連接(full outer join)
select*fromafullouterjoinbona.name=b.name;
此語句的結果為表a與表b的並集,即任意一個表的內容都將被查詢出來,如果另一個表無對應的項,則顯示為null
select*fromafullouterjoinbona.name=b.namewherea.nameisnullorb.nameisnull;
此語句的結果為表a與表b的並集除去兩表的交集。即除去了兩表都有的部分,剩餘的是兩表各自不同的部分
三、左外連接(left outer join)
select*fromaleftouterjoinbona.name=b.name;
此語句的結果為表a的所有項加表b與a相匹配的項,b中沒有與a匹配的項時顯示為null
select*fromaleftouterjoinbona.name=b.namewhereb.nameisnull;
此語句的結果為表a的所有項除去兩表的交集
四、右外連接(right outer join)
select*fromarightouterjoinbona.name=b.name;
此語句的結果為表a與表b匹配的項加表b的所有項,a中沒有與b匹配的項時顯示為null
select*fromarightouterjoinbona.name=b.namewherea.nameisnull;
此語句的結果為表b的所有除去兩表的交集