当前位置:首页 » 操作系统 » 水果机源码

水果机源码

发布时间: 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。

热点内容
苹果6s怎么设置4位密码 发布:2025-05-17 08:41:14 浏览:179
如何玩cf端游越南服务器 发布:2025-05-17 08:38:54 浏览:183
噪声的危害和控制设计脚本 发布:2025-05-17 08:22:29 浏览:473
esr算法 发布:2025-05-17 08:16:09 浏览:194
安卓手机怎么用拟我表情 发布:2025-05-17 08:10:13 浏览:918
给U盘安装kalilinux 发布:2025-05-17 08:07:26 浏览:249
sql提示存储过程 发布:2025-05-17 07:35:58 浏览:743
qq里的互动访问 发布:2025-05-17 07:26:53 浏览:665
口语易账号密码发送到哪里 发布:2025-05-17 07:26:52 浏览:62
核桃编程幼儿 发布:2025-05-17 07:26:50 浏览:787