26 包含JOIN遺忘的行

2021-04-24 02:11:55 字數 2738 閱讀 9912

--包含join遺忘的行

select getdate() --2009-01-05 22:54:33.763  in  西安 by 陳亮

/*--生成資料

use tempdb

if object_id('customer') is not null

drop table customer

gocreate table customer (id int ,name varchar(20))

goinsert into customer

select 1,'bety' union all

select 2,'robert' union all

select 3,'janette'

--if object_id('invoice') is not null

drop table invoice

gocreate table invoice (id int ,whn datetime,custid int ,cost int)

goinsert into invoice

select 1,'2009-01-01',1,100 union all

select 2,'2009-01-02',1,500 union all

select 3,'2009-01-05',3,200

--*/

--預設情況下,join就是inner join。 它將僅僅給出同時匹配兩個表的資料行:

select *

from customer inner join invoice

on (customer.id=custid);

/*id    name    id    whn    custid    cost

1    bety    1    2009-01-01 00:00:00.000    1    100

1    bety    2    2009-01-02 00:00:00.000    1    500

3    janette    3    2009-01-05 00:00:00.000    3    200

*/--與此相反,left outer join 將包括左表中的所有行——即使有的行不匹配右側表的任意行業是如此:

select *

from customer left outer join invoice

on (customer.id=custid);

/*id    name    id    whn    custid    cost

1    bety    1    2009-01-01 00:00:00.000    1    100

1    bety    2    2009-01-02 00:00:00.000    1    500

2    robert    null    null    null    null

3    janette    3    2009-01-05 00:00:00.000    3    200

*/--能夠使用短語left join 取代 left outer join 。單詞outer是個可選詞彙。

--類似地,如果你在使用內連線,那麼可以通過使用inner join 來取代join 來明確說明連線型別。這點要求在access中是強制性的。

--過濾必須在連線條件(on子句)中完成。在sql中,首先執行join子句,然後應用where條件。

--如果想得到robbert的數量0,那麼需要使用left outer join ,這樣,左表(customer)的每一行都出現在結果中:

select [name] ,count(custid)

from customer left join invoice on (customer.id=custid)

group by name

/*name    count(custid)

bety    2

janette    1

robert    0

*/--注意

select [name] ,count(*)

from customer left join invoice on (customer.id=custid)

group by name

/*name    count(*)

bety    2

janette    1

robert    1

*/select [name] ,count(name)

from customer left join invoice on (customer.id=custid)

group by name

/*name    count(name)

bety    2

janette    1

robert    1

*/--使用union也可以解決問題,編寫第二個查詢,它對不在invoice中的客戶返回0:

select [name] ,count(*)

from customer join invoice on (customer.id=custid)

group by name

union

select name ,0

from customer a

where not exists (select * from invoice b where b.custid=a.id)

--end*/

《劍指offer》26 包含min功能的棧

包含min功能的棧 要求設計乙個棧,除了正常進出棧以外,還有乙個輸出最小值的功能。首先自然而然可以想到python自帶的min函式 其實沿著min函式的思路走,如果我們想要搜尋乙個list的最小值,我們可以從左往右遍歷,然後先找到前兩個元素的較小者,再將其與第三個元素比較,得出更小者,再向後比較,以...

20 包含min的函式

定義棧的資料結構,請在該型別中實現乙個能夠得到棧中所含最小元素的min函式 在該棧中,呼叫min push及pop的時間複雜度應為o 1 把每次壓棧時的最小元素 每次新壓棧元素和之前的最小元素進行比較 放進另外乙個專門存放最小值的輔助棧中。例如 1 初始空棧,壓入元素3,目前3是最小值,放入輔助棧,...

18 包含min函式的棧

包含min函式的棧 定義棧的資料結構,請在該型別中實現乙個能夠得到棧最小元素的min函式。劍指offer上的例子講解的非常精彩。error control may reach end of non void function werror,wreturn type 意為無法找到non void fu...