⑴ sql語句里的邏輯或寫法
select t1.No NO,t2.name NAME,t2.age AGE ,t3.count COUNT from t1,t2,t3
where
t1.NAME = t2.NAME(+) and
t1.No = t3.No(+)
and t3.count=1
UNION ALL
SELECT NO,NAME,0,0
FROM T1
WHERE
T1.name NOT IN
(SELECT NAME FROM T2)
to 光和虹
你後邊已經限制死了t3.count=1,即使你再怎麼用t1.No = t2.No(+)這種連接,你也查不出相關的記錄
而且寫sql首先要實現的是考慮結果,其他的東西可以再優化
並且D 40 在表2中存在,但是在表3中也不存在,雖然D 40 這條數據因為是和表1里的name不同才沒被選出來
所以你可能描述的不夠詳細
⑵ 誰知道SQL裡面的物理文件名和邏輯文件名的區別簡單點就是什麼是物理文件名,什麼又是邏輯文件名
物理文件名是包含文件名和文件存儲路徑的字元串。邏輯文件名是您在資料庫中使用的物理文件名的邏輯表示。
SQL是結構化查詢語言的縮寫,代表結構化查詢語言。SQL語言的主要功能是與各種資料庫建立關系。此外,SQL被認為是關系資料庫管理系統的標准語言。它是微軟公司開發和推廣的關系型資料庫管理系統。
(2)sql邏輯和擴展閱讀:
可以不同的方式使用資料庫邏輯和物理名稱:
1.資料庫的物理名稱:存在於磁碟上的名稱。
2.邏輯名稱:資料庫的內部名稱。
3.更改資料庫的自維護名稱不會更改資料庫的邏輯名稱。
簡單的說:
1.物理文件名:用於計算機查找文件。
2.邏輯文件名:供用戶查看。
3.在大多數情況下,在其他語言中需要的很大部分的程序實現單個事件只需要一個SQL語句可以實現一個目標,這也意味著我們可以用SQL語言編寫非常復雜的語句。
⑶ 在SQL中,物理備份設備和邏輯備份設備有什麼區別
可以這樣理解:物理備份設備實際上就是一個文件,可以存儲在介質上,邏輯備份設備是SQL指向物理備份設備的一條記錄。
⑷ sql 里邏輯文件和物理文件各指什麼
物理文件是實際存放數據的文件,就是在磁碟上具體對應的文件。邏輯文件LF是物理文件的一個視圖,按定義的Key鍵值對數據進行了排序。操作方法如下:
1、打開SQLServerManagementStudio並連接到資料庫引擎伺服器。
⑸ 詳解SQL邏輯查詢的各個階段
首先作者給出了如下的sql查詢語句執行順序
( ) select ( ) distinct ( ) <top_specification> <select_list>
( )from <left_table>
( ) <join_type> join <right_table>
( ) on <join _condition>
( ) where <where_condition>
( )group by <group_by_list>
( ) with {cube|rollup}
( )having(having_condition)
( ) order by <order_by_condition>
從這個順序中我們不難發現 所有的 查詢語句都是從from開始執行的 在執行過程中 每個步驟都會為
下一個步驟生成一個虛擬表 這個虛擬表將作為下一個執行步驟的輸入
第一步 首先對from子句中的前兩個表執行一個笛卡爾乘積 此時生成虛擬表 vt
第二步 接下來便是應用on篩選器 on 中的邏輯表達式將應用到 vt 中的各個行 篩選出滿足on邏輯表達式的行 生成虛擬表 vt
第三步 如果是outer join 那麼這一步就將添加外部行 left outer jion 就把左表在第二步中過濾的添加進來 如果是right outer join 那麼就將右表在第二步中過濾掉的行添加進來 這樣生成虛擬表 vt
第四步 如果 from 子句中的表數目多餘兩個表 那麼就將vt 和第三個表連接從而計算笛卡爾乘積 生成虛擬表 該過程就是一個重復 的步驟 最終得到一個新的虛擬表 vt
第五步 應用where篩選器 對上一步生產的虛擬表引用where篩選器 生成虛擬表vt 在這有個比較重要的細節不得不說一下 對於包含outer join子句的查詢 就有一個讓人感到困惑的問題 到底在on篩選器還是用where篩選器指定邏輯表達式呢?on和where的最大區別在於 如果在on應用邏輯表達式那麼在第三步outer join中還可以把移除的行再次添加回來 而where的移除的最終的
舉個簡單的例子 有一個學生表(班級 姓名)和一個成績表(姓名 成績) 我現在需要返回一個x班級的全體同學的成績 但是這個班級有幾個學生缺考 也就是說在成績表中沒有記錄 為了得到我們預期的結果我們就需要在on子句指定學生和成績表的關系(學生 姓名=成績 姓名)那麼我們是否發現在執行第二步的時候 對於沒有參加考試的學生記錄就不會出現在vt 中 因為他們被on的邏輯表達式過濾掉了 但是我們用left outer join就可以把左表(學生)中沒有參加考試的學生找回來 因為我們想返回的是x班級的所有學生 如果在on中應用學生 班級= x 的話 那麼在left outer join 中就會將不會把x班級的學生的所有記錄找回來 所以只能在where篩選器中應用 學生 班級= x 應為它的過濾是最終的
第六步 group by 子句將中的唯一的值組合成為一組 得到虛擬表vt 如果應用了group by 那麼後面的所有步驟都只能得到的vt 的列或者是聚合函數(count sum avg等) 原因在於最終的結果集中只為每個組包含一行 這一點請牢記
第七步 應用cube或者rollup選項 為vt 生成超組 生成vt
第八步 應用having篩選器 生成vt having篩選器是第一個也是為唯一一個應用到已分組數據的篩選器
第九步 處理select列表 將vt 中的在select中出現的列篩選出來 生成vt
第十步 應用distinct子句 vt 中移除相同的行 生成vt 事實上如果應用了group by子句那麼distinct是多餘的 原因同樣在於 分組的時候是將列中唯一的值分成一組 同時只為每一組返回一行記錄 那麼所以的記錄都將是不相同的
第十一步 應用order by子句 按照order_by_condition排序vt 此時返回的一個游標 而不是虛擬表 sql是基於集合的理論的 集合不會預先對他的行排序 它只是成員的邏輯集合 成員的順序是無關緊要的 對表進行排序的查詢可以返回一個對象 這個對象包含特定的物理順序的邏輯組織 這個對象就叫游標 正因為返回值是游標 那麼使用order by 子句查詢不能應用於表表達式 排序是很需要成本的 除非你必須要排序 否則最好不要指定order by 最後 在這一步中是第一個也是唯一一個可以使用select列表中別名的步驟
lishixin/Article/program/SQL/201311/16406