瘋狂Java SQL 對查詢結果進行集合運算

2021-07-11 03:01:58 字數 1700 閱讀 4590

1. 集合運算:

1) 由於select查詢結果是記錄的集合,因此理所應當可以計算集合的交並補等;

2) 對兩個查詢結果進行集合運算時兩邊的select查詢都不需要加括號,因為這並不是子查詢,這兩個是平行的(地位相同的)查詢;

3) 集合運算的語法格式:select查詢1 op select查詢2;

4) 因為實際問題並非數學問題那麼抽象,因此查詢結果的集合運算並不包括補,因為數學上乙個集合經過補之後可能得到乙個無限集合,但實際情況中是不存在無限集合的;

5) 標準sql之規定了3種集合運算:intersect(交)、union(並)、minus(減),但各個資料庫對集合運算支援的並不是很好,比如mysql就只提供了union,但並不支援intersect和minus,交和差需要通過where以及多表連線來手動實現;

6) 在進行集合運算時,兩邊的查詢結果必須滿足列數相等、並且對應列的資料型別相同!

!這是顯而易見的,因為兩個表會合併成一張表;

2. union:

1) 實現集合的並;

2) 示例:select col1, col2 from t1 union select col3, col4 from t2;

3) 注意兩邊查詢結果的列數要相同,並且對應列的型別要一致;

3. minus:

1) 實現集合的差,a-b=a中去除掉在b中也有的元素所得的集合;

2) 對於標準sql來說語法例如:select col1, col2 from t1 minus select col3, col4 from t2;

3) 但是mysql並不支援minus,因此需要用where not in來曲線實現minus:select col1, col2 from t1 where (col1, col2) not in(select col3, col4 from t2);

4. intersect:

1) 實現集合的交;

2) 對於標準sql來說語法例如:select id, name from t1 intersect select id, name from t2;

3) 但是mysql並不支援intersect,因此需要使用多表連線查詢來曲線實現intersect:select id, name from t1 join t2 on(t1.id = t2.id and t1.name = t2.name);

!!當然這裡使用自然連線也行;

4) 如果intersect的時候兩邊都用了where條件篩選,那麼用多表連線查詢時需要對兩邊where的條件合取!

i. 例如:

select id, name from t1 where id < 4

intersect

select id, name from t2 where name like 'pete%';

ii. 用多表連線查詢就要這樣寫:

select id, name from t1

join t2 using(id, name)

where t1.id < 4 and t2.name like 'pete%';

!!不用擔心查詢底層是怎樣實現的,這裡你可能會認為該查詢會先做連線,然後從連線的結果中再篩掉不滿足where條件的,那這樣豈不是效率很低;

!!但實際上現代資料庫都非常只能,在連線的同時(或者在兩條記錄連線之前就會檢查以下記錄滿不滿足where條件,因此不會做一些重複的工作!!

對查詢結果隨機排序

為了對行進行隨機排序,或者返回隨機選擇的x行資料,你可以在select語句中使用rand函式。但是rand函式在整個查詢中只被計算一次,所以所有的行都具有相同的值。你可以使用order by子句根據從newid函式返回的結果來排序行,如以下 所示 select from northwind.orde...

MySQL對查詢結果排序

從表中查詢出來的資料,可能是無序的,或者其排列順序表示使用者期望的 使用order by對查詢結果進行排序 select 欄位名1,欄位名2,from 表名 order by 欄位名1 asc desc 欄位名2 asc desc 指定的欄位名1 欄位名2,是對查詢結果排序的依據 引數asc,表示按...

對查詢結果進行排序

order by 列名 asc desc 公升序或降序排序單列排序 多列排序 指定排序方向 一 單列排序 select from bookinfo order by price desc 注意 預設為公升序排序 二 多列排序 按照多個列進行排序,預設公升序,如 相同 時,按庫存排序 select f...