sql聯合查詢語句(兩張表)
一、交叉連接(CROSS JOIN)交叉連接(CROSS JOIN):有兩種,顯式的和隱式的,不帶ON子句,返回的是兩表的乘積,也叫笛卡爾積。
例如:下面的語句1和語句2的結果是相同的。語句1:隱式的交叉連接,沒有CROSS JOIN。
SELECT *, *_NUMBER, *, *OM ORDERS O , CUSTOMERS CWHERE *=1;語句2:顯式的交叉連接,使用CROSS JOIN。SELECT *,*_NUMBER,*,*OM ORDERS O CROSS JOIN CUSTOMERS CWHERE *=1;語句1和語句2的結果是相同的,查詢結果如下:二、內連接(INNER JOIN)內連接(INNER JOIN):有兩種,顯式的和隱式的,返回連接表中符合連接條件和查詢條件的數據行。
(所謂的鏈接表就是數據庫在做查詢形成的中間表)。例如:下面的語句3和語句4的結果是相同的。
語句3:隱式的內連接,沒有INNER JOIN,形成的中間表為兩個表的笛卡爾積。SELECT *,*_NUMBER,*,*OM CUSTOMERS C,ORDERS OWHERE *=*ER_ID;語句4:顯示的內連接,一般稱為內連接,有INNER JOIN,形成的中間表為兩個表經過ON條件過濾后的笛卡爾積。
SELECT *,*_NUMBER,*,*OM CUSTOMERS C INNER JOIN ORDERS O ON *=*ER_ID;語句3和語句4的查詢結果:三、外連接(OUTER JOIN):外連不但返回符合連接和查詢條件的數據行,還返回不符合條件的一些行。外連接分三類:左外連接(LEFT OUTER JOIN)、右外連接(RIGHT OUTER JOIN)和全外連接(FULL OUTER JOIN)。
三者的共同點是都返回符合連接條件和查詢條件(即:內連接)的數據行。不同點如下:左外連接還返回左表中不符合連接條件單符合查詢條件的數據行。
右外連接還返回右表中不符合連接條件單符合查詢條件的數據行。全外連接還返回左表中不符合連接條件單符合查詢條件的數據行,并且還返回右表中不符合連接條件單符合查詢條件的數據行。
全外連接實際是上左外連接和右外連接的數學合集(去掉重復),即“全外=左外 UNION 右外”。說明:左表就是在“(LEFT OUTER JOIN)”關鍵字左邊的表。
右表當然就是右邊的了。在三種類型的外連接中,OUTER 關鍵字是可省略的。
下面舉例說明:語句5:左外連接(LEFT OUTER JOIN)SELECT *,*_NUMBER,*ER_ID,*,*OM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON *=*ER_ID;語句6:右外連接(RIGHT OUTER JOIN)SELECT *,*_NUMBER,*ER_ID,*,*OM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON *=*ER_ID;注意:WHERE條件放在ON后面查詢的結果是不一樣的。例如:語句7:WHERE條件獨立。
SELECT *,*_NUMBER,*ER_ID,*,*OM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON *=*ER_IDWHERE *_NUMBER<>'MIKE_ORDER001';語句8:將語句7中的WHERE條件放到ON后面。SELECT *,*_NUMBER,*ER_ID,*,*OM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON *=*ER_ID AND *_NUMBER<>'MIKE_ORDER001';從語句7和語句8查詢的結果來看,顯然是不相同的,語句8顯示的結果是難以理解的。
因此,推薦在寫連接查詢的時候,ON后面只跟連接條件,而對中間表限制的條件都寫到WHERE子句中。語句9:全外連接(FULL OUTER JOIN)。
SELECT *,*_NUMBER,*ER_ID,*,*OM ORDERS O FULL OUTER JOIN CUSTOMERS C ON *=*ER_ID;注意:MySQL是不支持全外的連接的,這里給出的寫法適合Oracle和DB2。但是可以通過左外和右外求合集來獲取全外連接的查詢結果。
下圖是上面SQL在Oracle下執行的結果:語句10:左外和右外的合集,實際上查詢結果和語句9是相同的。SELECT *,*_NUMBER,*ER_ID,*,*OM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON *=*ER_IDUNIONSELECT *,*_NUMBER,*ER_ID,*,*OM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON *=*ER_ID;語句9和語句10的查詢結果是相同的,如下:四、聯合連接(UNION JOIN):這是一種很少見的連接方式。
Oracle、MySQL均不支持,其作用是:找出全外連接和內連接之間差異的所有行。這在數據分析中排錯中比較常用。
也可以利用數據庫的集合操作來實現此功能。語句11:聯合查詢(UNION JOIN)例句,還沒有找到能執行的SQL環境。
SELECT *,*_NUMBER,*ER_ID,*,*OM ORDERS O UNION JOIN CUSTOMERS C ON *=*ER_ID語句12:語句11在DB2下的等價實現。還不知道DB。
sql語句兩表聯查-兩表聯查該怎樣寫查詢Sql語句?做一個簡單的論壇,
把兩個表都選上,選擇你要的字段,然后在條件里面把關聯的字段條件加上,例如下面: "SELECT *, thor, *hdate, *e_Type, FORM article,type WHERE *e_Type = " 這里 是你type表里面欄目的id,對應你article表里面的Article_Type。
*, thor, *hdate分別是文章的標題,作者,發布時間,這條語句并不一定可用,要對照你的表結構。如果有不清楚可以給我發信息,能把你的表結構發出來最好。
SQL兩個表的聯合查詢語句
(SELECT 產品單號,產品型號,產品零件,SUM(員工生產零件數量) FROM B GROUP BY 產品單號,產品型號,產品零件) B1;SELECT A.產品單號,B1.產品型號,(A.生產數量-*GN) FROM A,(SELECT 產品單號,產品型號 SUM(員工生產零件數量) FROM B GROUP BY 產品單號,產品型號) B1 WHERE A.產品單號=B1.產品單號 AND A.產品型號=B.產品型號; SELECT SUM(員工生產零件數量),產品單號,產品型號,產品零件 FROM B GROUP BY 產品單號,產品型號,產品零件;。
SQL語句兩表聯查
可以用謂詞或聯結實現: 連接實現: select * from b join a on *=* where a.b=21 聯結實現的條件是兩表id來自同一值域,表示意義相同.在連接時其實兩可以作成一個表的: 也就是 id,a.b,a.c,b.b.b.c 但由于空值的問題,導致了部分依賴所以才會拆分成兩個表的. 使用謂詞實現: select * from b where id in (select id from a where a.b=21) 這個可以實現兩表id來自同一值域,但表示意義不同的情況.也就是說兩表中的id有無關性. 相比較而言,連接的方式更快一些,但這種情況是兩表來自同一值域,且意義相同,如果不是這種情況,可能得不到你正確的值的.而使用謂詞不管意義是否相同,都可以得到正確的值. 玩數據庫必須知道這兩個表是否具有相關性,也就是設計時的意義,否則優化詞句什么的都沒有辦法去做的! 有幾種方式可以實現你的這個需求. 1. 使用表 關聯 SELECT * FROM 表2 JOIN 表1 ON ( 表* = 表1.列1 ); 2. 使用 IN SELECT * FROM 表2 WHERE ID IN ( SELECT 列1 FROM 表1); 3.使用 EXISTS SELECT * FROM 表2 WHERE EXISTS ( SELECT 1 FROM 表1 WHERE 表* = 表1.列1 );select * from t2 left join t1 on * = t1.列1 where t1需要啥條件 and t2需要啥條件select * from 表2 where 某列 in (select 列1 from 表1) and id=1。
sql語句如何兩表連查
多表查詢分為 內、外連接外連接分為左連接(left join 或left outer join)、右連接(right join 或者 right outer join)、和完整外部連接 (full join 或者 full outer join)左連接(left join 或 left outer join)的結果就是left join子句中的左表的所有行,而不僅僅是鏈接列所匹配的行,如果左表中的某行在右表中沒有匹配,則在相關聯的結果行中右表的所有選擇列均為空值(NULL)SQL語法 select * from table1 left join table2 on table1.條件列名 = table2.條件列名;注釋: 顯示的就是table1中的所有列和能匹配的列右連接(right join 或 right outer join )在這里不做多說這左連接很象但是是相反的,只說一下語法select *from table1 right join table2 on table1. 條件列= table2.條件列完全外部連接(full join 或 full outer join)顯示左右表中的所有行,當某一個表中沒有匹配的行時,則另一個表的選擇列表列包含空值(NULL)如果有則顯示全部數據SQL語法:select *from table1 full join table2 on table1.條件列名= table2.條件列名內連接:概念:內連接就是用比較運算符比較要用連接列的值的連接內連接(join 或者inner join )SQL語法:select *fron table1 join table2 on table1.條件列名 = table2.條件列名返回符合匹配條件的兩表列等價于:select A* ,B* from table1 A ,table2 B where A.條件列名 =B.條件列名select *form table1 cross join table2 where table1.條件列名 = table2.條件列名(注: Cross join 后面不能跟on 只能用where)交叉連接(完全)概念:沒有用where子句的交叉連接將產生連接所涉及的笛卡爾積第一個表的行數乘以第二個表的行數等于笛卡爾積和結果集的大小交叉連接: Cross join(不帶條件where,如果帶返回或顯示的是匹配的行數)SQL語法:select *from table1 cross join table2如果有條件(where)select * from table1 cross join table2 where table1. 條件列名= table2.條件列名等價于select *from table1,table2 (不帶where)。
sql語句如何兩表連查
多表查詢分為 內、外連接
外連接分為左連接(left join 或left outer join)、右連接(right join 或者 right outer join)、和完整外部連接 (full join 或者 full outer join)
左連接(left join 或 left outer join)的結果就是left join子句中的左表的所有行,而不僅僅是鏈接列所匹配的行,如果左表中的某行在右表中沒有匹配,則在相關聯的結果行中右表的所有選擇列均為空值(NULL)
SQL語法 select * from table1 left join table2 on table1.條件列名 = table2.條件列名;
注釋: 顯示的就是table1中的所有列和能匹配的列
右連接(right join 或 right outer join )在這里不做多說這左連接很象但是是相反的,只說一下語法
select *from table1 right join table2 on table1. 條件列= table2.條件列
完全外部連接(full join 或 full outer join)
顯示左右表中的所有行,當某一個表中沒有匹配的行時,則另一個表的選擇列表列包含空值(NULL)如果有則顯示全部數據
SQL語法:
select *from table1 full join table2 on table1.條件列名= table2.條件列名
內連接:
概念:內連接就是用比較運算符比較要用連接列的值的連接
內連接(join 或者inner join )
SQL語法:
select *fron table1 join table2 on table1.條件列名 = table2.條件列名
返回符合匹配條件的兩表列
等價于:
select A* ,B* from table1 A ,table2 B where A.條件列名 =B.條件列名
select *form table1 cross join table2 where table1.條件列名 = table2.條件列名(注: Cross join 后面不能跟on 只能用where)
交叉連接(完全)
概念:沒有用where子句的交叉連接將產生連接所涉及的笛卡爾積第一個表的行數乘以第二個表的行數等于笛卡爾積和結果集的大小
交叉連接: Cross join(不帶條件where,如果帶返回或顯示的是匹配的行數)
SQL語法:
select *from table1 cross join table2
如果有條件(where)
select * from table1 cross join table2 where table1. 條件列名= table2.條件列名
等價于
select *from table1,table2 (不帶where)