最近看sql的書,這裡自己舉個例子來溫故知新一遍常用常見的sql查詢。好了,code is cheap,**來了。
下面對上面新建表的字段稍微介紹一下:
接著在相應表裡插入一些記錄:
最後就是要按條件查詢結果了:
1 回答關於」否定「的問題
問題(1): 找到沒有選擇sql server課程的學生
分析:上述問題的結果集應該是包含沒有選任何課程的學生和選擇了除sql server之外的任何其他課程的學生,但是第一種查詢返回的結果集是「選取了不是sql server課程的學生「而不是」沒有選sql server的學生「。
結論:真正的否定需要兩步操作,即要找出」誰不在「,先找出」誰在「,然後排除它們。
問題(2):找到選取sql server或者my sql課程(但不是兩者都選)的學生。
分析:從正確的查詢語句我們可以看到這裡也採取了問題一里的解決方案,並通過使用自聯接查詢選取sql server和my sql課程的學生,然後使用子查詢,選出選取sqlserver或者mysql的學生。
問題(3):選取了sqlserver而且未選取其他課程的學生
分析:正確的查詢通過子查詢找到所有沒有選sqlserver的學生,外層查詢通過not in就找到了選擇sqlserver或者沒有選擇任何一門課程的學生,然後表student和studenttakecourses之間的聯結會篩選掉未選擇任何課程的學生。
2 回答有關」至多「的問題
問題(4):找到選取了課程並且至多選取兩門課程的學生
分析:通過聚集函式count可以查詢到選取課程不多於兩門的學生。下面給出一種使用多次自聯接的解決方案:
總結:上述子查詢的where判斷可以這樣理解,對於某個特定學生,返回滿足下述條件的結果集:他的第乙個課程id小於第二個課程id,而且第二個課程id小於第三個課程id。如果學生選擇的課程小於三門,則該表示式永遠不會為真,因為並不存在第三個課程id。子查詢查到了選取三門以上課程的學生,外層查詢not in加上學生表和學生選擇的課程表聯接查詢一下就找到了至少選取一門課程且不多於兩門的學生。
問題(5):找到至多比另外兩名學生大的學生。
分析:問題換一種說法就是「找到比0個學生、1個學生、2個學生大的那些學生。」
通過視窗函式dense_rank,我們可以非常方便地找到所要選取的結果集。其實,不使用dbms的函式,同樣可以取到結果,思路如下: 先找到不比三個以上學生大的學生,然後排除他們。
未完待續。
sql查詢10則小技巧
1.不要使用in操作符,這樣資料庫會進行全表掃瞄,推薦方案 在業務密集的sql當中盡量不採用in操作符 2.not in 使用not in也不會走索引 推薦方案 用not exists或者 外聯結 判斷為空 來代替 3 操作符 不等於 使用 同樣不會使用索引,因此對它的處理只會產生全表掃瞄 推薦方案...
SQL查詢去除重複行 SQL小技巧
1.存在部分字段相同的紀錄,即有唯一鍵主鍵id 最常見情況 如果是這種情況的話用distinct是過濾不了的,這就要用到主鍵id的唯一性特點及group by分組 select from table where id in select max id from table group by 去除重複...
sql查詢語句的拼接小技巧(高手勿噴)
1.基本的查詢語句後面加上 where 1 1,便於增加查詢條件。askstr select from twork where 1 1 if length cxteworkid.text 0 then begin askstr askstr and gworkid like quotedstr cx...