當前位置:首頁 » 操作系統 » 水果機源碼

水果機源碼

發布時間: 2023-04-29 06:14:24

A. c語言本身是開源的嗎,c語言是用什麼寫的謝謝大家了

C語言是一個由ISO組織中的ANSI制定的標准,任何個人或者組織都可以根據這個標准將其實現。現今,世界上有許多不同的C語言實現,比較著名的有:GCC、Watcom、MS C等,其中前兩者是開源的,後者是閉源的。下面粘貼幾個老外的回答(原回答鏈接)。

The C language is not a piece of software but a defined standard, so one wouldn't say that it's open-source, but rather that it's an open standard.

There are a gazillion different compilers for C however, and many of those are indeed open-source. The most notable example is GCC's C compiler, which is all under the GNU General Public License (GPL), an open-source license.

There are more options. Watcom is open-source, for instance. There is no shortage of open-source C compilers, but without a doubt the most widespread one, at least in the non-Windows world, is GCC.

For Windows, your best bet is probably Watcom or GCC by using Cygwin or MinGW.

C is a standard which specifies how C compilers should generate programs.

C itself doesn't have any source code, just like a musical note doesn't have any plastic.

Some C compilers, such as GCC, are open source.

C is just a language, and a standardised one at that, too. It pretty much is the compiler that "does all the work". Different compilers did have different dialects; before the the C99 ANSI standard, you had things like Borland C and other competing compilers, that implemented the C language in their own fantastic ways.

stdlib is just an agreed-upon collection of standard libraries that are required to be present in any ANSI C implementation.

關於C++開源與否:

與C語言類似,C++也是由ISO/ANSI制定的一個標准,所謂的「官方」並未給出確切的實現,任何組織與個人都可以根據標准自己開發一個C++編譯器出來。出名的C++編譯器有:GCC/G++、libc/libc++、clang(++)、 Visual studio和MS´ runtime等。也把老外的幾個回答貼出來(原回答鏈接)。

C++ itself is only a description what the language should be,

without a definite implementation.

Anyone can make his own implementations (compiler etc, runtime library, ...)

and call it C++ if it fits to the description.

http://www.open-std.org/jtc1/sc22/wg21/

And if a implementation is open source depends on the creator.

Examples of implementation (parts):

GCC/G++, libc/libc++, clang (++ too), Visual studio and MS´ runtime...

C++ is developed by an ISO standard committee. There's also a C++ foundation that runs a web site you might want to read.

C++ itself is a language, not a specific implementation, so there's no source code available for the standard/language itself.

Some C++ implementations are open source (e.g., Gnu and Clang).

1. C++ is a code standard defined by the International Organization of Standardization (ISO). There are many different implementations of the language, but they all tend to conform to C++11. Unlike Linux or Qt, C++ is just a standard, and to use any code written in the language you'll need a compiler. The major compilers (list from Wikipedia) are LLVM Clang, GCC, Microsoft Visual C++, and the Intel C++ Compiler.

2. C++ revisions are dealt with by ISO, and are influenced primarily by the maintainers of the above four implementations.

3. Clang and GCC are both open-source, I'm sure if you poke around you can find other conforming compilers but those are the two most used.

總之,跟Java、python和PHP這樣所謂的開源語言不同,C語言與C++沒有官方提供的各自確切的實現代碼(庫),ISO/ANSI僅僅提供了C和C++的標准。

這些都是我從自個兒博客摘抄來的,也不見得有人看得到。

B. 麻煩給完整編程

print('\n'.join(input('請輸入多種水果名稱:').strip().split()))

C. Apple 源碼用到的一些數據結構

本篇英文名叫 CWC:Kitchen Tools That Cook Loves ,翻譯過來的意思是 蘋果源碼中出現的一些數據結構 ,不斷積累更新。
CWC : Cooking With Cook ,翻譯過來的中文意思就是 作為一個長期熱愛蘋果的蘋果開發者,我們要陪著水果公司一起積累和成長。

目前: entsize_list_tt 、 list_array_tt 、 cache_t's buckets ...

entsize_list_tt 其實就是一個通用的容器,可以獲取 內部的迭代器,用於遍歷內部存儲的元素

出現場景:

三者的聲明頭如下:

entsize_list_t 定義源碼,省略大部分方法:

這個類用來表示一個空、單數組、或者多數組。它和 list 的帆桐區別就是 多了一個多維數組的封裝。

出現場景:

ro 中沒有,只有三個單 List。

三者的聲明頭如下:

list_array_tt 源碼部分如下:

cache_t 的結構體定義:

buckets 的內部是一個連續的存儲空間,存儲是一個散列表。
開辟聲明的函數調用的是 calloc

當 msgSend 的時候,就會調用 fillCache 進行方法的緩存,存儲的涉及 cls sel 和 imp

bucket_t 的結構體很有意思,arm64 和 i386 的兩個值的順序是反著的。

arm64 的時候是 :

armv7* , i386 和 x86_64 的時候是:

源碼注釋:

初始的 capacity 是 4。
源碼中 cache_t::insert(cls, sel, imp, reveiver) 方法調用的時候,判斷擴容。

fastpath(newOccupied + CACHE_END_MARKER <= capacity / 4 * 3)

也就是說當大於四分之三的時候,就會進行擴容操作,每次 double 擴容

capacity = capacity ? capacity * 2 : INIT_CACHE_SIZE;

當然不是無限制的擴容,有一個最大容量的限制:

MAX_CACHE_SIZE = 1 << 16

這個類型應該是執行最多次的,看一些文章說一秒鍾iOS中執行幾百萬次

explicit_atomic用來給catchT緩存方法用,核心是原子性和線程安全。

weak弱引用的散列表

擴展: non-fragile structs 是什麼?OC 1.0 (iOS自始至終都是2.0起的,Mac最開始是1.0)桐轎缺譯器生成了一個 ivar 布局,顯示了在類中從哪可局辯以訪問 ivars ,對 ivar 的訪問就可以通過 對象地址 + ivar偏移位元組 的方法。蘋果更新了NSObject類,例如增加一些屬性,這個又是靜態庫,發布新版本的系統,這個時候布局就出錯了,就不得不重新編譯子類來恢復兼容性。(那如果是在線上運行的app,升級系統後就沒辦法運行了)

使用 Non Fragile ivars 時,程序進行檢測來調整類中新增的 ivar 的偏移量。 這樣就可以通過 對象地址 + 基類大小 + ivar偏移位元組 的方法來計算出 ivar 相應的地址,並訪問到相應的 ivar。(即使升級iOS系統,之前的app也能正常運行)

擴展再擴展: 為什麼OC類不能動態添加成員變數? runtime函數中,確實有一個class_addIvar()函數用於給類添加成員變數,但是文檔中特別說明: This function may only be called after objc_allocateClassPair and before objc_registerClassPair. Adding an instance variable to an existing class is not supported. 這個函數只能在「構建一個類的過程中」調用。一旦完成類定義,就不能再添加成員變數了。經過編譯的類在程序啟動後就被runtime載入,沒有機會調用addIvar。程序在運行時動態構建的類需要在調用objc_registerClassPair之後才可以被使用,同樣沒有機會再添加成員變數。
理論上說,我還是認為可以添加,只是為什麼一定不可以,就不得而知了。

D. 猴王水果競猜源碼銷售大騙子!500元定金轉了他就馬上把你QQ拉黑

E. 求推薦一款比較好用的全面的單機版設備維修記錄軟體,可以導出導入Excel表格

EXCEL完成能實現你的要求。
用VBA編程,不難:
建個窗體--添加N個按鈕,按鈕功能:設備信息、客戶信息、維修記錄、記錄查詢、記錄列印、記錄統計...
這得你自己去研究,我倒是有汽車維修方面的,不知你想實現哪些功能。

F. 常用的十大python圖像處理工具

原文標題:10 Python image manipulation tools.
作者 | Parul Pandey
翻譯 | 安其羅喬爾、JimmyHua
今天,在我們的世界裡充滿了數據,圖像成為構成這些數據的重要組成部分。但無論是用於何種用途,這些圖像都需要進行處理。圖像處理就是分析和處理數字圖像的過程,主要旨在提高其質量或從中提取一些信息,然後可以將其用於某種用途。
圖像處理中的常見任務包括顯示圖像,基本操作如裁剪、翻轉、旋轉等,圖像分割,分類和特徵提取,圖像恢復和圖像識別。Python成為這種圖像處理任務是一個恰當選擇,這是因為它作為一種科學編程語言正在日益普及,並且在其生態系統中免費提供許多最先進的圖像處理工具供大家使用。
讓我們看一下可以用於圖像處理任務中的常用 Python 庫有哪些吧。

1.scikit-image
scikit-image是一個開源的Python包,適用於numpy數組。它實現了用於研究,教育和工業應用的演算法和實用工具。即使是那些剛接觸Python生態系統的人,它也是一個相當簡單直接的庫。此代碼是由活躍的志願者社區編寫的,具有高質量和同行評審的性質。
資源
文檔里記錄了豐富的例子和實際用例,閱讀下面的文檔:
http://scikit-image.org/docs/stable/user_guide.html
用法
該包作為skimage導入,大多數功能都在子模塊中找的到。下面列舉一些skimage的例子:
圖像過濾

使用match_template函數進行模板匹配

你可以通過此處查看圖庫找到更多示例。
2. Numpy
Numpy是Python編程的核心庫之一,並為數組提供支持。圖像本質上是包含數據點像素的標准Numpy數組。因此,我們可以通過使用基本的NumPy操作,例如切片、掩膜和花式索引,來修改圖像的像素值。可以使用skimage載入圖像並使用matplotlib顯示圖像。
資源
Numpy的官方文檔頁面提供了完整的資源和文檔列表:
http://www.numpy.org/
用法
使用Numpy來掩膜圖像.

3.Scipy
scipy是Python的另一個類似Numpy的核心科學模塊,可用於基本的圖像操作和處理任務。特別是子模塊scipy.ndimage,提供了在n維NumPy數組上操作的函數。該包目前包括線性和非線性濾波,二值形態學,B樣條插值和對象測量等功能函數。
資源
有關scipy.ndimage包提供的完整功能列表,請參閱下面的鏈接:
https://docs.scipy.org/doc/scipy/reference/tutorial/ndimage.html#correlation-and-convolution
用法
使用SciPy通過高斯濾波器進行模糊:

4. PIL/ Pillow
PIL( Python圖像庫 )是Python編程語言的一個免費庫,它支持打開、操作和保存許多不同的文件格式的圖像。然而, 隨著2009年的最後一次發布,它的開發停滯不前。但幸運的是還有有Pillow,一個PIL積極開發的且更容易安裝的分支,它能運行在所有主要的操作系統,並支持Python3。這個庫包含了基本的圖像處理功能,包括點運算、使用一組內置卷積核的濾波和色彩空間的轉換。
資源
文檔中有安裝說明,以及涵蓋庫的每個模塊的示例:
https://pillow.readthedocs.io/en/3.1.x/index.html
用法
在 Pillow 中使用 ImageFilter 增強圖像:

5. OpenCV-Python
OpenCV( 開源計算機視覺庫 )是計算機視覺應用中應用最廣泛的庫之一 。OpenCV-Python 是OpenCV的python版API。OpenCV-Python的優點不只有高效,這源於它的內部組成是用C/C++編寫的,而且它還容易編寫和部署(因為前端是用Python包裝的)。這使得它成為執行計算密集型計算機視覺程序的一個很好的選擇。
資源
OpenCV-Python-Guide指南可以讓你使用OpenCV-Python更容易:
https://github.com/abidrahmank/OpenCV2-Python-Tutorials
用法
下面是一個例子,展示了OpenCV-Python使用金字塔方法創建一個名為「Orapple」的新水果圖像融合的功能。

6. SimpleCV
SimpleCV 也是一個用於構建計算機視覺應用程序的開源框架。有了它,你就可以訪問幾個高性能的計算機視覺庫,如OpenCV,而且不需要先學習了解位深度、文件格式、顏色空間等。
它的學習曲線大大小於OpenCV,正如它們的口號所說「計算機視覺變得簡單」。一些支持SimpleCV的觀點有:
即使是初學者也可以編寫簡單的機器視覺測試攝像機、視頻文件、圖像和視頻流都是可互操作的資源
官方文檔非常容易理解,而且有大量的例子和使用案例去學習:
https://simplecv.readthedocs.io/en/latest/
用法

7. Mahotas
Mahotas 是另一個計算機視覺和圖像處理的Python庫。它包括了傳統的圖像處理功能例如濾波和形態學操作以及更現代的計算機視覺功能用於特徵計算,包括興趣點檢測和局部描述符。該介面是Python語言,適合於快速開發,但是演算法是用C語言實現的,並根據速度進行了調優。Mahotas庫速度快,代碼簡潔,甚至具有最小的依賴性。通過原文閱讀它們的官方論文以獲得更多的了解。
資源
文檔包括安裝指導,例子,以及一些教程,可以更好的幫助你開始使用mahotas。
https://mahotas.readthedocs.io/en/latest/install.html
用法
Mahotas庫依賴於使用簡單的代碼來完成任務。關於『Finding Wally』的問題,Mahotas做的很好並且代碼量很少。下面是源碼:
https://mahotas.readthedocs.io/en/latest/wally.html

8. SimpleITK
ITK 或者 Insight Segmentation and Registration Toolkit是一個開源的跨平台系統,為開發人員提供了一套廣泛的圖像分析軟體工具 。其中, SimpleITK是建立在ITK之上的簡化層,旨在促進其在快速原型設計、教育、解釋語言中的應用。SimpleITK 是一個圖像分析工具包,包含大量支持一般過濾操作、圖像分割和匹配的組件。SimpleITK本身是用C++寫的,但是對於包括Python以內的大部分編程語言都是可用的。
資源
大量的Jupyter Notebooks 表明了SimpleITK在教育和研究領域已經被使用。Notebook展示了用Python和R編程語言使用SimpleITK來進行互動式圖像分析。
http://insightsoftwareconsortium.github.io/SimpleITK-Notebooks/
用法
下面的動畫是用SimpleITK和Python創建的剛性CT/MR匹配過程的可視化 。點擊此處可查看源碼!

9. pgmagick
pgmagick是GraphicsMagick庫的一個基於python的包裝。 GraphicsMagick圖像處理系統有時被稱為圖像處理的瑞士軍刀。它提供了一個具有強大且高效的工具和庫集合,支持以88種主要格式(包括重要格式,如DPX、GIF、JPEG、JPEG-2000、PNG、PDF、PNM和TIFF)讀取、寫入和操作圖像。
資源
有一個專門用於PgMagick的Github庫 ,其中包含安裝和需求說明。還有關於這個的一個詳細的用戶指導:
https://github.com/hhatto/pgmagick
用法
使用pgmagick可以進行的圖像處理活動很少,比如:
圖像縮放

邊緣提取

10. Pycairo
Pycairo是圖像處理庫cairo的一組Python捆綁。Cairo是一個用於繪制矢量圖形的2D圖形庫。矢量圖形很有趣,因為它們在調整大小或轉換時不會失去清晰度 。Pycairo是cairo的一組綁定,可用於從Python調用cairo命令。
資源
Pycairo的GitHub庫是一個很好的資源,有關於安裝和使用的詳細說明。還有一個入門指南,其中有一個關於Pycairo的簡短教程。
庫:https://github.com/pygobject/pycairo指南:https://pycairo.readthedocs.io/en/latest/tutorial.html用法
使用Pycairo繪制線條、基本形狀和徑向梯度:

總結
有一些有用且免費的Python圖像處理庫可以使用,有的是眾所周知的,有的可能對你來說是新的,試著多去了解它們。

G. 用sql開發一個水果銷售系統的源代碼


select 姓名,savg from (select 學號,avg(成績)as savg from sc where 成績<60 group by 學號 having count(學號)>=2) t1,student where t1.學號=student.學號

1. Group By 語句簡介:
Group By語句從英文的字面意義上理解就是「根據(by)一定的規則進行分組(Group)」。它的作用是通過一定的規則將一個數據集劃分成若干個小的區域,然後針對若干個小區域進行數據處理。 2. Group By 的使用: 上面已經給出了對Group By語句的理解。基於這個理解和SQL Server 2000的聯機幫助,下面對Group By語句的各種典型使用進行依次列舉說明。 2.1 Group By [Expressions]: 這個恐怕是Group By語句最常見的用法了,Group By + [分組欄位](可以有多個)。在執行了這個操作以後,數據集將根據分組欄位的值將一個數據集劃分成各個不同的小組。比如有如下數據集,其中水果名稱(FruitName)和出產國家(ProctPlace)為聯合主鍵: FruitName ProctPlace Price
Apple China $1.1
Apple Japan $2.1
Apple USA $2.5
Orange China $0.8
Banana China $3.1
Peach USA $3.0
如果我們想知道每個國家有多少種水果,那麼我們可以通過如下SQL語句來完成: SELECT COUNT(*) AS 水果種類, ProctPlace AS 出產國 FROM T_TEST_FRUITINFO GROUP BY ProctPlace 這個SQL語句就是使用了Group By + 分組欄位的方式,那麼這句SQL語句就可以解釋成「我按照出產國家(ProctPlace)將數據集進行分組,然後分別按照各個組來統計各自的記錄數量。」很好理解對吧。這里值得注意的是結果集中有兩個返回欄位,一個是ProctPlace(出產國), 一個是水果種類。如果我們這里水果種類不是用Count(*),而是類似如下寫法的話: SELECT FruitName, ProctPlace FROM T_TEST_FRUITINFO GROUP BY ProctPlace 那麼SQL在執行此語句的時候會報如下的類似錯誤: 選擇列表中的列 'T_TEST_FRUITINFO.FruitName' 無效,因為該列沒有包含在聚合函數或 GROUP BY 子句中。 這就是我們需要注意的一點,如果在返回集欄位中,這些欄位要麼就要包含在Group By語句的後面,作為分組的依據;要麼就要被包含在聚合函數中。我們可以將Group By操作想像成如下的一個過程,首先系統根據SELECT 語句得到一個結果集,如最開始的那個水果、出產國家、單價的一個詳細表。然後根據分組欄位,將具有相同分組欄位的記錄歸並成了一條記錄。這個時候剩下的那些不存在於Group By語句後面作為分組依據的欄位就有可能出現多個值,但是目前一種分組情況只有一條記錄,一個數據格是無法放入多個數值的,所以這里就需要通過一定的處理將這些多值的列轉化成單值,然後將其放在對應的數據格中,那麼完成這個步驟的就是聚合函數。這就是為什麼這些函數叫聚合函數(aggregate functions)了。 2.2 Group By All [expressions] : Group By All + 分組欄位, 這個和前面提到的Group By [Expressions]的形式多了一個關鍵字ALL。這個關鍵字只有在使用了where語句的,且where條件篩選掉了一些組的情況才可以看出效果。在SQL Server 2000的聯機幫助中,對於Group By All是這樣進行描述的: 如果使用 ALL 關鍵字,那麼查詢結果將包括由 GROUP BY 子句產生的所有組,即使某些組沒有符合搜索條件的行。沒有 ALL 關鍵字,包含 GROUP BY 子句的 SELECT 語句將不顯示沒有符合條件的行的組。 其中有這么一句話「如果使用ALL關鍵字,那麼查詢結果將包含由Group By子句產生的所有組...沒有ALL關鍵字,那麼不顯示不符合條件的行組。」這句話聽起來好像挺耳熟的,對了,好像和LEFT JOIN 和 RIGHT JOIN 有點像。其實這里是類比LEFT JOIN來進行理解的。還是基於如下這樣一個數據集: FruitName ProctPlace Price
Apple China $1.1
Apple Japan $2.1
Apple USA $2.5
Orange China $0.8
Banana China $3.1
Peach USA $3.0
首先我們不使用帶ALL關鍵字的Group By語句: SELECT COUNT(*) AS 水果種類, ProctPlace AS 出產國 FROM T_TEST_FRUITINFO WHERE (ProctPlace <> 'Japan') GROUP BY ProctPlace 那麼在最後結果中由於Japan不符合where語句,所以分組結果中將不會出現Japan。 現在我們加入ALL關鍵字: SELECT COUNT(*) AS 水果種類, ProctPlace AS 出產國 FROM T_TEST_FRUITINFO WHERE (ProctPlace <> 'Japan') GROUP BY ALL ProctPlace 重新運行後,我們可以看到Japan的分組,但是對應的「水果種類」不會進行真正的統計,聚合函數會根據返回值的類型用默認值0或者NULL來代替聚合函數的返回值。 2.3 GROUP BY [Expressions] WITH CUBE | ROLLUP: 首先需要說明的是Group By All 語句是不能和CUBE 和 ROLLUP 關鍵字一起使用的。 首先先說說CUBE關鍵字,以下是SQL Server 2000聯機幫助中的說明: 指定在結果集內不僅包含由 GROUP BY 提供的正常行,還包含匯總行。在結果集內返回每個可能的組和子組組合的 GROUP BY 匯總行。GROUP BY 匯總行在結果中顯示為 NULL,但可用來表示所有值。使用 GROUPING 函數確定結果集內的空值是否是 GROUP BY 匯總值。 結果集內的匯總行數取決於 GROUP BY 子句內包含的列數。GROUP BY 子句中的每個操作數(列)綁定在分組 NULL 下,並且分組適用於所有其它操作數(列)。由於 CUBE 返回每個可能的組和子組組合,因此不論指定分組列時所使用的是什麼順序,行數都相同。 我們通常的Group By語句是按照其後所跟的所有欄位進行分組,而如果加入了CUBE關鍵字以後,那麼系統將根據所有欄位進行分組的基礎上,還會通過對所有這些分組欄位所有可能存在的組合形成的分組條件進行分組計算。由於上面舉的例子過於簡單,這里就再適合了,現在我們的數據集將換一個場景,一個表中包含人員的基本信息:員工所在的部門編號(C_EMPLINFO_DEPTID)、員工性別(C_EMPLINFO_SEX)、員工姓名(C_EMPLINFO_NAME)等。那麼我現在想知道每個部門各個性別的人數,那麼我們可以通過如下語句得到: SELECT C_EMPLINFO_DEPTID, C_EMPLINFO_SEX, COUNT(*) AS C_EMPLINFO_TOTALSTAFFNUM FROM T_PERSONNEL_EMPLINFO GROUP BY C_EMPLINFO_DEPTID, C_EMPLINFO_SEX 但是如果我現在希望知道: 1. 所有部門有多少人(這里相當於就不進行分組了,因為這里已經對員工的部門和性別沒有做任何限制了,但是這的確也是一種分組條件的組合方式); 2. 每種性別有多人(這里實際上是僅僅根據性別(C_EMPLINFO_SEX)進行分組); 3. 每個部門有多少人(這里僅僅是根據部門(C_EMPLINFO_DEPTID)進行分組);那麼我們就可以使用ROLLUP語句了。 SELECT C_EMPLINFO_DEPTID, C_EMPLINFO_SEX, COUNT(*) AS C_EMPLINFO_TOTALSTAFFNUM FROM T_PERSONNEL_EMPLINFO GROUP BY C_EMPLINFO_DEPTID, C_EMPLINFO_SEX WITH CUBE 那麼這里你可以看到結果集中多出了很多行,而且結果集中的某一個欄位或者多個欄位、甚至全部的欄位都為NULL,請仔細看一下你就會發現實際上這些記錄就是完成了上面我所列舉的所有統計數據的展現。使用過SQL Server 2005或者RDLC的朋友們一定對於矩陣的小計和分組功能有印象吧,是不是都可以通過這個得到答案。我想RDLC中對於分組和小計的計算就是通過Group By的CUBE和ROLLUP關鍵字來實現的。(個人意見,未證實) CUBE關鍵字還有一個極為相似的兄弟ROLLUP, 同樣我們先從這英文入手,ROLL UP是「向上卷」的意思,如果說CUBE的組合是絕對自由的,那麼ROLLUP的組合就需要有點約束了。我們先來看看SQL Server 2000的聯機中對ROLLUP關鍵字的定義: 指定在結果集內不僅包含由 GROUP BY 提供的正常行,還包含匯總行。按層次結構順序,從組內的最低級別到最高級別匯總組。組的層次結構取決於指定分組列時所使用的順序。更改分組列的順序會影響在結果集內生成的行數。 那麼這個順序是什麼呢?對了就是Group By 後面欄位的順序,排在靠近Group By的分組欄位的級別高,然後是依次遞減。如:Group By Column1, Column2, Column3。那麼分組級別從高到低的順序是:Column1 > Column2 > Column3。還是看我們前面的例子,SQL語句中我們僅僅將CUBE關鍵字替換成ROLLUP關鍵字,如: SELECT C_EMPLINFO_DEPTID, C_EMPLINFO_SEX, COUNT(*) AS C_EMPLINFO_TOTALSTAFFNUM FROM T_PERSONNEL_EMPLINFO GROUP BY C_EMPLINFO_DEPTID, C_EMPLINFO_SEX WITH ROLLUP 和CUBE相比,返回的數據行數減少了不少。:),仔細看一下,除了正常的Group By語句後,數據中還包含了: 1. 部門員工數;(向上卷了一次,這次先去掉了員工性別的分組限制) 2. 所有部門員工數;(向上又卷了依次,這次去掉了員工所在部門的分組限制)。 在現實的應用中,對於報表的一些統計功能是很有幫助的。 這里還有一個問題需要補充說明一下,如果我們使用ROLLUP或者CUBE關鍵字,那麼將產生一些小計的行,這些行中被剔除在分組因素之外的欄位將會被設置為NULL,那麼還存在一種情況,比如在作為分組依據的列表中存在可空的行,那麼NULL也會被作為一個分組表示出來,所以這里我們就不能僅僅通過NULL來判斷是不是小計記錄了。下面的例子展示了這里說得到的情況。還是我們前面提到的水果例子,現在我們在每種商品後面增加一個「折扣列」(Discount),用於顯示對應商品的折扣,這個數值是可空的,也就是可以通過NULL來表示沒有對應的折扣信息。數據集如下所示: FruitName ProctPlace Price Discount
Apple China $1.1 0.8
Apple Japan $2.1 0.9
Apple USA $2.5 1.0
Orange China $0.8 NULL
Banana China $3.1 NULL
Peach USA $3.0 NULL
現在我們要統計「各種折扣對應有多少種商品,並總計商品的總數。」,那麼我們可以通過如下的SQL語句來完成: SELECT COUNT(*) AS ProctCount, Discount FROM T_TEST_FRUITINFO GROUP BY Discount WITH ROLLUP 好了,運行一下,你會發現數據都正常出來了,按照如上的數據集,結果如下所示: ProctCount Discount
3 NULL
1 0.8
1 0.9
1 1.0
6 NULL
好了,各種折扣的商品數量都出來了,但是在顯示「沒有折扣商品」和「商品小計」的時候判斷上確存在問題,因為存在兩條Discount為Null的記錄。是哪一條呢?通過分析數據我們知道第一條數據(3, Null)應該對應沒有折扣商品的數量,而(6,Null)應該對應所有商品的數量。需要判斷這兩個具有不同意義的Null就需要引入一個聚合函數Grouping。現在我們把語句修改一下,在返回值中使用Grouping函數增加一列返回值,SQL語句如下: SELECT COUNT(*) AS ProctCount, Discount, GROUPING(Discount) AS Expr1 FROM T_TEST_FRUITINFO GROUP BY Discount WITH ROLLUP 這個時候,我們再看看運行的結果: ProctCount Discount Expr1
3 NULL 0
1 0.8 0
1 0.9 0
1 1.0 0
6 NULL 1
對於根據指定欄位Grouping中包含的欄位進行小計的記錄,這里會標記為1,我們就可以通過這個標記值將小計記錄從判斷那些由於ROLLUP或者CUBE關鍵字產生的行。Grouping(column_name)可以帶一個參數,Grouping就會去判斷對應的欄位值的NULL是否是由ROLLUP或者CUBE產生的特殊NULL值,如果是那麼就在由Grouping聚合函數產生的新列中將值設置為1。注意Grouping只會檢查Column_name對應的NULL來決定是否將值設置為1,而不是完全由此列是否是由ROLLUP或者CUBE關鍵字自動添加來決定的。 2.2 Group By 和 Having, Where ,Order by語句的執行順序: 最後要說明一下的Group By, Having, Where, Order by幾個語句的執行順序。一個SQL語句往往會產生多個臨時視圖,那麼這些關鍵字的執行順序就非常重要了,因為你必須了解這個關鍵字是在對應視圖形成前的欄位進行操作還是對形成的臨時視圖進行操作,這個問題在使用了別名的視圖尤其重要。以上列舉的關鍵字是按照如下順序進行執行的:Where, Group By, Having, Order by。首先where將最原始記錄中不滿足條件的記錄刪除(所以應該在where語句中盡量的將不符合條件的記錄篩選掉,這樣可以減少分組的次數),然後通過Group By關鍵字後面指定的分組條件將篩選得到的視圖進行分組,接著系統根據Having關鍵字後面指定的篩選條件,將分組視圖後不滿足條件的記錄篩選掉,然後按照Order By語句對視圖進行排序,這樣最終的結果就產生了。在這四個關鍵字中,只有在Order By語句中才可以使用最終視圖的列名,如: SELECT FruitName, ProctPlace, Price, ID AS IDE, Discount FROM T_TEST_FRUITINFO WHERE (ProctPlace = N'china') ORDER BY IDE 這里只有在ORDER BY語句中才可以使用IDE,其他條件語句中如果需要引用列名則只能使用ID,而不能使用IDE。

熱點內容
c資料庫壓縮 發布:2025-05-17 11:39:22 瀏覽:960
安卓手機如何連接音響功放 發布:2025-05-17 11:37:48 瀏覽:958
破解exe加密視頻 發布:2025-05-17 11:23:41 瀏覽:976
我的世界伺服器圈太大了怎麼辦 發布:2025-05-17 11:15:21 瀏覽:614
便宜的免費雲伺服器 發布:2025-05-17 11:08:50 瀏覽:777
中國頂級dhcp解析伺服器地址 發布:2025-05-17 11:06:27 瀏覽:34
php轉義html 發布:2025-05-17 11:04:00 瀏覽:567
鋼筋籠加密區規范 發布:2025-05-17 10:59:50 瀏覽:4
我的世界網易手機版主播伺服器房號 發布:2025-05-17 10:40:59 瀏覽:227
豎編譯 發布:2025-05-17 09:56:08 瀏覽:229