『壹』 sql 自身連接查詢問題
select b.姓名,b.班級(這里b.後面跟你要查詢的欄位) from 學生基本信息表 a,學生基本信息表 b where a.姓名='查詢信息' and a.班級號=b.班級號
『貳』 SQL 連接查詢
不懂就看看
SQL-92標准所定義的FROM子句的連接語法格式為:
FROM join_table join_type join_table
[ON (join_condition)]
其中join_table指出參與連接操作的表名,連接可以對同一個表操作,也可以對多表操作,對同一個表操作的連接又稱做自連接。
join_type 指出連接類型,可分為三種:內連接、外連接和交叉連接。內連接(INNER JOIN)使用比較運算符進行表間某(些)列數據的比較操作,並列出這些表中與連接條件相匹配的數據行。根據所使用的比較方式不同,內連接又分為等值連接、自然連接和不等連接三種。
外連接分為左外連接(LEFT OUTER JOIN或LEFT JOIN)、右外連接(RIGHT OUTER JOIN或RIGHT JOIN)和全外連接(FULL OUTER JOIN或FULL JOIN)三種。與內連接不同的是,外連接不只列出與連接條件相匹配的行,而是列出左表(左外連接時)、右表(右外連接時)或兩個表(全外連接時)中所有符合搜索條件的數據行。
交叉連接(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、不等連接: 在連接條件使用除等於運算符以外的其它比較運算符比較被連接的列的列值。這些運算符包括>、>=、<=、<、!>、!<和<>。
3、自然連接:在連接條件中使用等於(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,並刪除連接表中的重復列。
例,下面使用等值連接列出authors和publishers表中位於同一城市的作者和出版社:
SELECT *
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
又如使用自然連接,在選擇列表中刪除authors 和publishers 表中重復列(city和state):
SELECT a.*,p.pub_id,p.pub_name,p.country
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
(二)外連接
內連接時,返回查詢結果集合中的僅是符合查詢條件( WHERE 搜索條件或 HAVING 條件)和連接條件的行。而採用外連接時,它返回到查詢結果集合中的不僅包含符合連接條件的行,而且還包括左表(左外連接時)、右表(右外連接時)或兩個邊接表(全外連接)中的所有數據行。
如下面使用左外連接將論壇內容和作者信息連接起來:
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
ON a.username=b.username
下面使用全外連接將city表中的所有作者以及user表中的所有作者,以及他們所在的城市:
SELECT a.*,b.*
FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username
(三)交叉連接
交叉連接不帶WHERE 子句,它返回被連接的兩個表所有數據行的笛卡爾積,返回到結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。
例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉連接檢索到的記錄數將等
於6*8=48行。
SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY type
『叄』 SQL連接查詢研究
1、分類
在多表關聯查詢時,經常要用到連接查詢,SQL中連接分為四種:內連接(inner join或join)、左外連接(left outer join)、右外連接(right outer join)、全連接(full outer join);
其中,除了inner join其餘三種都是外連接。
首先建2張表用於後面的講解用。
表A:合同表
表B:合同金額歷史修改記錄表
其中,B表中的fk_contract_id欄位與A表中的id欄位有外鍵關系;
2、inner join內連接
內連接結果返回A、B兩個表均匹配的數據集,其中有一個表的數據不滿足,則那條數據不返回;
模擬數據如下:
A:
B:
結果:
分析:
3、left outer join左外連接
通常也簡稱為左連接,sql中可省略outer,寫為:left join;
左連接以左表為主表,右表為從表,返回結果集以左表數據為基礎,連接右表獲取額外信息;
查詢語句舉例:
結果:
分析:
從結果可以看出,雖然合同3在B表中沒有數據與之對應,但是還是作為結果集中的一部分返回了,因此可以這么說,只要主表有N條記錄,使用left join查詢返回的結果集一定至少有N條記錄(不考慮where條件)!
特別注意左連接時查詢條件放置的位置:
使用left join查詢時,主表的篩選條件要放在where中,而從表的條件要看情況選擇放在連接條件on中或是放在where中;下面舉例子說明這兩種情況:
栗子1:查詢出所有歷史合同金額有過300的合同記錄。
sql:
結果:
結果滿足我們的需求,但是如果把篩選條件放在on中:
結果:
顯然,查詢結果不滿足我們的這個需求!
栗子2:查詢出所有合同,並且如果其歷史合同金額有過300則展示其合同記錄信息。
在這個需求下,我們把查詢條件放在on中就是正確的,這時是不能放在where中的。
4、right outer join右外連接
通常簡稱為右連接,outer可省略,寫為:right join;
與左連接相反,右連接以右表為主表,即以右表記錄為基礎,擴展查詢左表信息;
一般可與左連接相互轉換,例如上栗1用右連接可以寫成如下sql:
結果:
5、full outer join全連接
全連接,即只要其中某個表存在匹配,full join關鍵字就會返回行。在mysql中並不支持full join,但可以用left join和right join查詢後再union代替,舉個栗子:
A表數據:
B表數據:
結果:
分析:
從結果中可以看出,全連接會返回A、B表中所有記錄,其中有關聯的會根據on條件進行整合,沒有連接上的記錄也會返回。
總結:
SQL中的連接查詢使用非常頻繁,但其中的一些細節還需要平時多注意,比如:
1、左、右連接時的條件放置位置及其區別;
2、一對多關系時,在左、右外連接時,若「一」為主表(或內連接)時,查詢結果集主表記錄會有重復!若要統計主表記錄時則需去重。
以上是筆者在平時工作中用到sql的連接查詢時總結出來的知識,分享給大家,希望對讀者有幫助!如有錯誤請給我留言,我會及時更正,謝謝!
『肆』 用sql語句進行多表連接查詢出現重復數據
1、在電腦上打開要去掉重復數據的資料庫,這里新建一張含有重復數據的user表。
『伍』 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的所有除去兩表的交集
『陸』 SQL表連接查詢
連接查詢包括合並、內連接、外連接和交叉連接,如果涉及多表查詢,了解這些連接的特點很重要。
只有真正了解它們之間的區別,才能正確使用。
1、Union
UNION 操作符用於合並兩個或多個 SELECT 語句的結果集。
UNION 運算符通過組合其他兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重復行而派生出一個結果表。
當 ALL 隨 UNION 一起使用時(即 UNION ALL),不消除重復行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。
注意:使用UNION時,兩張表查詢的結果有相同數量的列、列類型相似。
2、INNER JOIN(內連接)
INNER JOIN(內連接),也成為自然連接
作用:根據兩個或多個表中的列之間的關系,從這些表中查詢數據。
注意: 內連接是從結果中刪除其他被連接表中沒有匹配行的所有行,所以內連接可能會丟失信息。
重點:內連接,只查匹配行。
3、外連接
與內連接相比,即使沒有匹配行,也會返回一個表的全集。
外連接分為三種:左外連接,右外連接,全外連接。對應SQL:LEFT/RIGHT/FULL OUTER JOIN。通常我們省略outer 這個關鍵字。寫成:LEFT/RIGHT/FULL JOIN。
重點:至少有一方保留全集,沒有匹配行用NULL代替。
1)LEFT OUTER JOIN,簡稱LEFT JOIN,左外連接(左連接)
結果集保留左表的所有行,但只包含第二個表與第一表匹配的行。第二個表相應的空行被放入NULL值。
4、CROSS JOIN(交叉連接)
交叉連接。交叉連接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉連接也稱作笛卡爾積。
簡單查詢兩張表組合,這是求笛卡兒積,效率最低。
『柒』 SQL 基本語句 表的連接查詢
問題一:x.degree>y.degree
x 表和 y 表中有相同的欄位 degree, x 中的 degree 值大於 y 中的
問題二:x.cno='3-105'and x.degree>y.degree and y.sno='109' and y.cno='3-105'
x 表中的 cno 欄位值為'3-105'
x 表中的 degree 值大於 y 中的 degree 值
y 表中的 sno 欄位值為'109'
y 表中的 cno 欄位值為'3-105'
以上4個條件取交集
問題三:類似語句
1.
SELECT a.guest_id, a.guest_nme, a.service_type, a.working_addr,
b.phone_num,c.account_id
FROM pcc_tb_guest_mbl a, pcc_tb_guest_num b, pcc_tb_account c
WHERE a.guest_id = b.guest_id
AND b.account_id = c.account_id
AND a.subscr_nme LIKE '王%%'
AND a.service_type = 'voic02'
AND b.phone_num LIKE '8976%'
ORDER BY b.phone_num DESC
2.
SELECT b.phone_num 電話號碼,
DECODE (b.num_status, 'A', '可使用', 'V', '保留號','已使用') 狀態
FROM (SELECT phone_num, num_status
FROM pcc_tb_nm_number
WHERE MOD (SUBSTR (phone_num, 7), 11) = '0'
AND phone_num LIKE '85%'
AND num_status IN ('A','V') b
WHERE MOD (SUBSTR (b.phone_num, 5, 2), 11) = '0'
第一個你肯定能看懂,第二個寫了幾個函數DECODE,MOD,SUBSTR
DECODE(欄位名,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,預設值)
MOD(m,n) 取 m 除以 n 的余數
SUBSTR(欄位名,m,n) 欄位中從 m 位置開始,取 n 的長度,若 n 省略默認
取到最後
第二句即查詢電話號碼如 85%xxyy (尾號是雙重號),狀態是'可使用'和'保留號'的號碼
希望對你有所幫助
『捌』 sql 全連接查詢
在兩表連接是不能用groub
by的。(內連接查詢)
select
學號,姓名,選修課課程from
學生信息表
inner
join
課程表
on
學生信息表.選修課課程
=
課程表.選修課課程;
『玖』 sql 怎麼多表連接查詢(相同結構) 100分 急求
select c.* from
(select * from 表1 union all
select * from 表2) as c
order by id desc limit ……
limit後邊你取多少就自己寫吧
『拾』 sql 連接查詢
1.select worker.姓名,salary.工資 from worker,salary
where salary.日期 between'04/01/01' and '04-02-01' and worker.職工號=salary.職工號
2.select worker.職工號, worker.姓名,avg(salary.工資) as 平均工資 from worker,salary
group by worker.職工號, worker.姓名
我在自己的電腦上試過了,不知道你滿意不!呵呵