資料:
http://keke-wanwei.javaeye.com/blog/99162
http://hi.baidu.com/daweeforever/blog/item/a8831425e684296735a80f5e.html
http://sizhefang.javaeye.com/blog/212652
這幾天碰到2個有點繞的查詢:
1.
select * from 表A,表A子表
where
表A
.FileCode = 表A子表
.FileCode and
表A.ID
in
(select 表A子表
.ID
from 表A子表
where
Vc_Code = '1190' AND Vc_Num ='111300' AND Er_Num ='0101'
);
這個查詢的條件在子表,而結果在父表,沒用關聯查詢,直接查詢2個表
2.
SELECT * FROM
A表 AS A
LEFT JOIN
C表 AS C
ON
A.UID = C.EID ,
B表 AS B
WHERE
A.U_ID = B.U_ID AND
//A表和B表通過U_ID關聯
B.D_ID IN
(SELECT MAX(D_ID) FROM B表
GROUP BY U_ID) //要D_ID值最大的D_ID
AND
B.CASEID = '87' //B表的一個欄位值已知
AND A.STATUS = '1'; //A表的一個欄位值已知
關聯查詢總結:
1.UNION
格式:
查詢語句
UNION [ALL] 查詢語句
[UNION [ALL] 查詢語句][…n]
說明:
ALL選項表示將所有行合并到結果集合中。不指定該項時,被聯集查詢結果集合中的重複行將只保留一行。
在包括多個查詢的UNION語句中,其執行順序是自左至右,使用括弧可以改變這一執行順序。例如:
查詢1 UNION (查詢2 UNION 查詢3)
例子:
person表和user表沒有約束
person表:
user表:
執行:select id,name
from user
UNION
select id,name
from person
;
結果:
注意:sql句子欄目數必須是相同
的,欄位可以隨意
2.JOIN
JOIN用於按照ON條件聯結兩個表,主要有四種:
(一)內串連
INNER JOIN:內部聯結兩個表中的記錄,僅當至少有一個同屬於兩表的行符合聯結條件時,內聯結才返回行。(表示交集)
(二)外串連
LEFT JOIN / LEFT OUTER
JOIN:外部聯結兩個表中的記錄,並包含左表中的全部記錄。如果左表的某記錄在右表中沒有匹配記錄,則在相關聯的結果集中右表的所有挑選清單列均為空白
值。理解為即使不符合ON條件,左表中的記錄也全部顯示出來,且結果集中該類記錄的右表欄位為空白值。(差集)
RIGHT JOIN / RIGHT OUTER JOIN:外部聯結兩個表中的記錄,並包含右表中的全部記錄。簡單說就是和LEFT JOIN反過來。(差集)
FULL JOIN / FULL OUTER JOIN: 完整外部聯結返回左表和右表中的所有行。就是LEFT JOIN和RIGHT JOIN和合并,左右兩表的資料都全部顯示。(並集)
(三)交叉串連
交叉串連(cross join)不帶WHERE 子句,它返回被串連的兩個表所有資料行的笛卡爾積,返回到結果集合中的資料行數等於第一個表中符合查詢條件的資料行數乘以第二個表中符合查詢條件的資料行數。
JOIN的基本文法(注意結果對比):
1.執行 select * from user as A join
person as B on A.id=B.id;
或
select * from user as A inner join
person as B on A.id=B.id;
結果如下:
2.執行 select A.*
from user as A join person as B on A.id=B.id;
3.執行select * from user as A left join
person as B on A.id=B.id;
4.select * from person
as A right join
user
as B on A.id=B.id;
5.full join
mysql 5不支援full join 所以用左關聯和右關聯進行聯合
SELECT * FROM user
LEFT JOIN money ON user.id=money.id
UNION
SELECT * FROM user
RIGHT JOIN money ON user.id=money.id
6.執行
select * from user CROSS JOIN
person;