点点滴滴,积少成多

1. 运行一下:

#include <stdio.h>
#define ARRAY_SIZE 10
int main() 
{
    int arr[ARRAY_SIZE] = {51,116,53,120,85,66,71,98,86,100};
    int i, j;
    for(i = 0; i < ARRAY_SIZE; i++)
        for(j = 0; j < ARRAY_SIZE-1; j++)
            if(arr[j] > arr[j+1]) {
                arr[j] ^= arr[j+1];
                arr[j+1] ^= arr[j];
                arr[j] ^= arr[j+1];
            }
    for(i = 0; i < ARRAY_SIZE; i++)
        printf("%c", arr[i],arr[i]);
}
居然也是个排序!
2. Tcp通信基本流程:
服务器端                                                                       客户端
1.创建socket                                                                1.创建socket
2.bind()                                                                          
3.listen()
4.accecp()
----等待客户端连接----                                                    2.connect()
5.读数据(recv)                                                          3.写数据(send)
6.写数据(send)                                                         4.读数据(recv)
7.关闭socket(closesocket())                                 5.关闭socket(closesocket())
Udp通信基本流程:
服务器端:                                                                    客户端
1.创建socket                                                                1.创建socket
2.bind()                                                                    2.bind()
3.recvfrom                          
----等待连接----                                                              3.sendto()
4.sendto()                                                                4.recvfrom()
5.关闭socket(closesocket())                                   5.关闭socket(closesocket())
3. 怎么根据IP网段算出子网掩码
现在的IP暂时由四段数字组成(以后将扩充更改),常分为三类IP:
     A类:0.0.0.0到127.255.255.255
     B类:128.0.0.0到191.255.255.255
     C类:192.0.0.0到223.255.255.255
子网掩码:
     A类:255.0.0.0 一个子网最多可容纳1677万台电脑
     B类:255.255.0.0 一个子网最多可容纳6万台电脑
     C类:255.255.255.0 一个子网最多可容纳253台电脑
在同一网段,要求网络标识相同,网络标识就是用IP的二进制与子网掩码的二进制数据作'与'运算(可用WINDOWS计算器算二进制),所以结果相同,表示在同一网段,而不是IP地址前几段相同就表示在同一网段。算网络标识的时候,A类IP只算第一段,B类只算第一,二段,C类IP算第一,二,三段。
     例:192.168.0.1 255.255.255.0的网络标识为:192.168.0.0
            192.168.0.1:    11000000.10101000.00000000.00000001
            255.255.255.0:11111111.11111111.11111111.0000000
            作与运算:        11000000.10101000.00000000.00000000
     结果:192.168.0.0
子网掩码决定了一个子网的计算机数目,简单的算法就是2的M次方。M表示二进制的子网掩码后面0的数目。
     例:255.255.255.0
     二进制:11111111.11111111.11111111.00000000
后面有8个0,那M就是8,这个子网掩码可以容纳2的8次方(台)电脑,也就是256台,去掉0和255就是254台电脑。
实例:一个公司有530台电脑,组成一个对等网,子网掩码如何设?IP如何设?
     子网掩码:          
          2的M次方=530,求的M=10
          那么子网掩码最后为10个0,如此便是:11111111.11111111.11111100.00000000
          换成十进制便是:255.255.252.0
再看IP,我们选一个B类IP,例如:188.188.×.×
     前两段按B类要随便设就可以,关键是第三段,只要网络标识相同就可以在同一网段就可以,我们先看网络标识:
          255.255.252.0:11111111.11111111.11111100.00000000
          188.188.×.×:   10111100.10111100.??????××.××××××××
          网络标识:          10111100.10111100.??????00.00000000
     上边×号无论填0和1结果都是0
     ?处填0和1都一样,我们就全填0,结果便是IP便是:
     10111100.10111100.000000××.××××××××,这个IP共有530台电脑,IP最后一段分给254台,一共要分530/254=2.086段,
四舍五入要分成3段,所以IP地址000000××处分成三个不同的数据即可,例:00000001,00000010,00000011,分别是1,2,3,
这样IP地址就确定了188.188.1.×,188.188.2.×,188.188.3.×。 
4. 在Linux Gcc下编译一下,做个试验看看
全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
答:可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错
5.const的用法总结
一、对于基本声明 
1.const int r=100; //标准const变量声明加初始化,因为默认内部连接所以必须被初始化,其作用域为此文件,编译器经过类型检查后直接用100在编译时替换。
2.extend const int r=100; //将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义。 
3.const int r[ ]={1,2,3,4}; 
struct S {int a,b;};
const S s[ ]={(1,2),(3.4)}; //以上两种都是常量集合,编译器会为其分配内存,所以不能在编译期间使用其中的值,例如:int temp[r[2]];这样的编译器会报告不能找到常量表达式
二、对于指针 
1.const int *r=&x; //声明r为一个指向常量的x的指针,r指向的对象不能被修改,但他可以指向任何地址的常量。 就是说这个指针只能指向的内容一定是常量了!!!!地址内存可变
2.int const *r=&x; //与用法1完全等价,没有任何区别。 
3.int * const r=&x; //声明r为一个常量指针,他指向x,r这个指针的指向不能被修改,但他指向的地址的内容可以修改。 这个指针指向的地址不可变是个固定的常量,地址所表示的内容可变
4.const int * const r=&x; //综合1、3用法,r是一个指向常量的常量型指针。 
三、对于类型检查 
可以把一个非const对象赋给一个指向const的指针,因为有时候我们不想从这个指针来修改其对象的值;但是不可以把一个const对象赋值给一个非const指针,因为这样可能会通过这个指针改变指向对象的值,但也存在使这种操作通过的合法化写法,使用类型强制转换可以通过指针改变const对象:

const int r=100;
int * ptr = const_cast(&r); //C++标准,C语言使用:int * ptr =(int*)&r;
四、对于字符数组 
如char * name = “china”; 这样的语句,在编译时是能够通过的,但是”china”是常量字符数组,任何想修改他的操作也能通过编译但会引起运行时错误,如果我们想修改字符数组的话就要使用char name[ ] = “china”; 这种形式。
五、对于函数 
1.void Fuction1 ( const int r ); //此处为参数传递const值,意义是变量初值不能被函数改变
2.const int Fuction1 (int); //此处返回const值,意思指返回的原函数里的变量的初值不能被修改,但是函数按值返回的这个变量被制成副本,能不能被修改就没有了意义,它可以被赋给任何的const或非const类型变量,完全不需要加上这个const关键字。但这只对于内部类型而言(因为内部类型返回的肯定是一个值,而不会返回一个变量,不会作为左值使用),对于用户自定义类型,返回值是常量是非常重要的,见下面条款3。 
3.Class CX; //内部有构造函数,声明如CX(int r =0) 
CX Fuction1 () { return CX(); }
const CX Fuction2 () { return CX(); }
如有上面的自定义类CX,和函数Fuction1()和Fuction2(),我们进行如下操作时:
Fuction1() = CX(1); //没有问题,可以作为左值调用
Fuction2() = CX(1); //编译错误,const返回值禁止作为左值调用。因为左值把返回值作为变量会修改其返回值,const声明禁止这种修改。
4.函数中指针的const传递和返回: 
int F1 (const char * pstr); //作为传递的时候使用const修饰可以保证不会通过这个指针来修改传递参数的初值,这里在函数内部任何修改*pstr的企图都会引起编译错误。
const char * F2 (); //意义是函数返回的指针指向的对象是一个const对象,它必须赋给一个同样是指向const对象的指针。
const char * const F3(); //比上面多了一个const,这个const的意义只是在他被用作左值时有效,它表明了这个指针除了指向const对象外,它本身也不能被修改,所以就不能当作左值来处理。
5.函数中引用的const传递: 
void F1 ( const X& px); //这样的一个const引用传递和最普通的函数按值传递的效果是一模一样的,他禁止对引用的对象的一切修改,唯一
不同的是按值传递会先建立一个类对象的副本,然后传递过去,而它直接传递地址,所以这种传递比按值传递更有效。 
**另外只有引用的const传递可以传递一个临时对象,因为临时对象都是const属性,且是不可见的,他短时间存在一个局部域中,所以
不能使用指针,只有引用的const传递能够捕捉到这个家伙。 
六、对于类 
1.首先,对于const的成员变量,只能在构造函数里使用初始化成员列表来初始化,试图在构造函数体内进行初始化const成员变量会引起编译错误。初始化成员列表形如:
2.X:: X ( int ir ): r(ir) {} //假设r是类X的const成员变量
2.const成员函数。提到这个概念首先要谈到const对象,正象内置类型能够定义const对象一样(const int r=10;),用户自定义类型也可以定义const对象(const X px(10);),编译器要保证这个对象在其生命周期内不能够被改变。如果你定义了这样的一个const对象,那么对于这个对象的一切非const成员函数的调用,编译器为了保证对象的const特性,都会禁止并在编译期间报错。所以如果你想让你的成员函数
能够在const对象上进行操作的话,就要把这个函数声明为const成员函数。假如f( )是类中的成员函数的话,它的声明形如: 
int f( ) const; //const放在函数的最后,编译器会对这个函数进行检查,在这个函数中的任何试图改变成员变量和调用非const成员函数的
操作都被视为非法 
注意:类的构造和析构函数都不能是const函数。
3.建立了一个const成员函数,但仍然想用这个函数改变对象内部的数据。这样的一个要求也会经常遇到,尤其是在一个苛刻的面试考
官那里。首先我们要弄清楚考官的要求,因为有两种方法可以实现,如果这位考官要求不改变原来类的任何东西,只让你从当前这个
const成员函数入手,那么你只有使用前面提到的类型强制转换方法。实例如下: 
//假如有一个叫做X的类,它有一个int成员变量r,我们需要通过一个const成员函数f( )来对这个r进行++r操作,代码如下
void X::f( ) const
{ (const_cast(this)) -> ++r; } //通过this指针进行类型强制转换实现
另外一种方法就是使用关键字:mutable。如果你的成员变量在定义时是这个样子的:
mutable int r ;
那么它就告诉编译器这个成员变量可以通过const成员函数改变。编译器就不会再理会对他的检查了
 
 
6. ASP、JSP与PHP的比较


目前,最常用的三种动态网页语言有ASP(Active Server Pages),JSP(Java Server Pages), 
PHP (Hypertext Preprocessor)。 

简 介 

ASP全名Active Server Pages,是一个WEB服务器端的开发环境, 利用它可以产生和运 
行动态的、交互的、高性能的WEB服务应用程序。ASP采用脚本语言VB Script(Java script 
)作为自己的开发语言。 

PHP是一种跨平台的服务器端的嵌入式脚本语言. 它大量地借用C,Java和Perl语言的语法 
, 并耦合PHP自己的特性,使WEB开发者能够快速地写出动态生成页面.它支持目前绝大多数数 
据库。还有一点,PHP是完全免费的,不用花钱,你可以从PHP官方站点http://www.php.ne 
t)自由下载。而且你可以不受限制地获得源码,甚至可以从中加进你自己需要的特色。 

JSP 是Sun公司推出的新一代站点开发语言,他完全解决了目前ASP,PHP的一个通病-- 
脚本级执行(据说PHP4 也已经在Zend 的支持下,实现编译运行).Sun 公司借助自己在Jav 
a 上的不凡造诣,将Java 从Java 应用程序 和 Java Applet 之外,又有新的硕果,就是Js 
p--Java Server Page。Jsp 可以在Serverlet和JavaBean的支持下,完成功能强大的站点 
程序。 

三者都提供在 HTML 代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。 
但JSP代码被编译成 Servlet 并由 Java 虚拟机解释执行,这种编译操作仅在对 JSP 页面的 
第一次请求时发生。在 ASP 、PHP、JSP 环境下, HTML 代码主要负责描述信息的显示样式 
,而程序代码则用来描述处理逻辑。普通的 HTML 页面只依赖于 Web 服务器,而 ASP 、PH 
P、JSP 页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到 
HTML 代码中,然后一起发送给浏览器。 ASP 、PHP、 JSP三者都是面向 Web 服务器的技术 
,客户端浏览器不需要任何附加的软件支持。 

技术特点 

ASP: 

1. 使用 VBScript 、 JScript 等简单易懂的脚本语言,结合 HTML 代码,即可快速地完成 
网站的应用程序。 
2. 无须 compile 编译,容易编写,可在服务器端直接执行。 
3. 使用普通的文本编辑器,如 Windows 的记事本,即可进行编辑设计。 
4. 与浏览器无关 (Browser Independence), 用户端只要使用可执行 HTML 码的浏览器,即 
可浏览 Active Server Pages 所设计的网页内容。 Active Server Pages 所使用的脚本语 
言 (VBScript 、 Jscript) 均在 WEB 服务器端执行,用户端的浏览器不需要能够执行这些 
脚本语言。 
5.Active Server Pages 能与任何 ActiveX scripting 语言相容。除了可使用 VBScript 
或 JScript 语言来设计外,还通过 plug-in 的方式,使用由第三方所提供的其他脚本语言 
,譬如 REXX 、 Perl 、 Tcl 等。脚本引擎是处理脚本程序的 COM(Component Object Mod 
el) 物件。 
6. 可使用服务器端的脚本来产生客户端的脚本。 
7.ActiveX Server Components(ActiveX 服务器元件 ) 具有无限可扩充性。可以使用 Vi 
sual Basic 、 Java 、 Visual C++ 、 COBOL 等编程语言来编写你所需要的ActiveX Se 
rver Component 。 

PHP: 

1.数据库连接 
PHP可以编译成具有与许多数据库相连接的函数。PHP与MySQL是现在绝佳的组合。你还可 
以自己编写外围的函数取间接存取数据库。通过这样的途径当你更换使用的数据库时,可以 
轻松地更改编码以适应这样的变。PHPLIB就是最常用的可以提供一般事务需要的一系列基库 
。但PHP提供的数据库接口支持彼此不统一,比如对Oracle, MySQL, Sybase的接口,彼此 
都不一样。这也是PHP的一个弱点。 
2.面向对象编程 
PHP提供了类和对象。基于web的编程工作非常需要面向对象编程能力。PHP支持构造器、 
提取类等。 

JSP: 

1.将内容的生成和显示进行分离 
使用JSP技术,Web页面开发人员可以使用HTML或者XML标识来设计和格式化最终页面。使 
用JSP标识或者小脚本来生成页面上的动态内容。生成内容的逻辑被封装在标识和JavaBeans 
组件中,并且捆绑在小脚本中,所有的脚本在服务器端运行。如果核心逻辑被封装在标识和 
Beans中,那么其他人,如Web管理人员和页面设计者,能够编辑和使用JSP页面,而不影响内 
容的生成。 
在服务器端,JSP引擎解释JSP标识和小脚本,生成所请求的内容(例如,通过访问Java 
Beans组件,使用JDBCTM技术访问数据库,或者包含文件),并且将结果以HTML(或者XML) 
页面的形式发送回浏览器。这有助于作者保护自己的代码,而又保证任何基于HTML的Web浏览 
器的完全可用性。 
2.强调可重用的组件 
绝大多数JSP页面依赖于可重用的,跨平台的组件(JavaBeans或者Enterprise JavaBea 
nsTM组件)来执行应用程序所要求的更为复杂的处理。开发人员能够共享和交换执行普通操 
作的组件,或者使得这些组件为更多的使用者或者客户团体所使用。基于组件的方法加速了 
总体开发过程,并且使得各种组织在他们现有的技能和优化结果的开发努力中得到平衡。 
3.采用标识简化页面开发 
Web页面开发人员不会都是熟悉脚本语言的编程人员。JavaServer Page技术封装了许多 
功能,这些功能是在易用的、与JSP相关的XML标识中进行动态内容生成所需要的。标准的JS 
P标识能够访问和实例化JavaBeans组件,设置或者检索组件属性,下载Applet,以及执行用 
其他方法更难于编码和耗时的功能。 
通过开发定制化标识库,JSP技术是可以扩展的。今后,第三方开发人员和其他人员可以 
为常用功能创建自己的标识库。这使得Web页面开发人员能够使用熟悉的工具和如同标识一样 
的执行特定功能的构件来工作。 
JSP技术很容易整合到多种应用体系结构中,以利用现存的工具和技巧,并且扩展到能够 
支持企业级的分布式应用。作为采用Java技术家族的一部分,以及Java 2(企业版体系结构 
)的一个组成部分,JSP技术能够支持高度复杂的基于Web的应用。 
由于JSP页面的内置脚本语言是基于Java编程语言的,而且所有的JSP页面都被编译成为 
Java Servlet,JSP页面就具有Java技术的所有好处,包括健壮的存储管理和安全性。 
作为Java平台的一部分,JSP拥有Java编程语言“一次编写,各处运行”的特点。随着越 
来越多的供应商将JSP支持添加到他们的产品中,您可以使用自己所选择的服务器和工具,更 
改工具或服务器并不影响当前的应用。 

应用范围 

ASP是Microsoft开发的动态网页语言,也继承了微软产品的一贯传统——只能运行于微软 
的服务器产品,IIS (Internet Information Server) (windows NT)和PWS(Personal Web Se 
rver)(windows 98)上。Unix下也有ChiliSoft的插件来支持ASP,但是ASP本身的功能有限, 
必须通过ASP+COM的组合来扩充,Unix下的COM实现起来非常困难。 

PHP3可在Windows,Unix,Linux的Web服务器上正常运行,还支持IIS,Apache等通用Web服务器 
,用户更换平台时,无需变换PHP3代码,可即拿即用. 

JSP同PHP3类似,几乎可以运行于所有平台。如Win NT,Linux,Unix. NT下IIS通过一个插 
件,例如JRUN或者ServletExec,就能支持JSP。著名的Web服务器Apache已经能够支持JSP。 
由于Apache广泛应用在NT、Unix和Linux上,因此JSP有更广泛的运行平台。虽然现在NT操作 
系统占了很大的市场份额,但是在服务器方面Unix的优势仍然很大,而新崛起的Linux更是来 
势不些从一个平台移植到另外一个平台,JSP和JavaBean甚至不用重新编译,因为Java字节 
码都是标准的与平台无关的。 

性能比较 

有人做过试验,对这三种语言分别做循环性能测试及存取Oracle数据库测试。 

在循环性能测试中,JSP只用了令人吃惊的四秒钟就结束了20000*20000的循环。而ASP 
、PHP测试的是2000*2000循环(少一个数量级),却分别用了63秒和84秒。(参考PHPLIB) 
。 

数据库测试中,三者分别对 Oracle 8 进行 1000 次 Insert,Update,Select,和Delete 
: Jsp 需要 13 秒,Php 需要 69 秒,ASP则 需要 73 秒。 

前景分析 

目前在国内PHP与ASP应用最为广泛。而JSP由于是一种较新的技术,国内采用的较少。但在 
国外,JSP已经是比较流行的一种技术,尤其是电子商务类的网站,多采用JSP。 
采用PHP的网站如新浪网(sina)、中国人(Chinaren)等,但由于PHP本身存在的一些缺 
点,使得它不适合应用于大型电子商务站点,而更适合一些小型的商业站点。 
首先,PHP缺乏规模支持。其次,缺乏多层结构支持。对于大负荷站点,解决方法只有一 
个:分布计算。数据库、应用逻辑层、表示逻辑层彼此分开,而且同层也可以根据流量分开 
,组成二维阵列。而PHP则缺乏这种支持。还有上面提到过的一点,PHP提供的数据库接口支 
持不统一,这就使得它不适合运用在电子商务中。 
ASP和JSP则没有以上缺陷,ASP可以通过Microsoft Windowsd的COM/DCOM获得ActiveX规 
模支持,通过DCOM和Transcation Server获得结构支持;JSP可以通过SUN Java的Java Clas 
s和EJB获得规模支持,通过EJB/CORBA以及众多厂商的Application Server获得结构支持。 

三者中,JSP应该是未来发展的趋势。世界上一些大的电子商务解决方案提供商都采用J 
SP/Servlet。比较出名的如IBM的E-business,它的核心是采用JSP/Servlet的WebSphere; 
西方另外一个非常著名的电子商务软件提供商,Intershop。它原来的产品Intershop1 2, 3 
, 4占据了主要的电子商务软件份额。它们都是通过CGI来提供支持 的。但去年10月后它推出 
了Enfinity,一个采用JSP/Servlet的电子商务Application Server,而且声言不再开发传统 
软件。 

总之 
ASP,PHP,JSP三者都有相当数量的支持者,由此也可以看出三者各有所长。正在学习或 
使用动态页面的朋友可根据三者的特点选择一种适合自己的语言。

 

 

7. 设计模式之UML类图关系浅谈

 

See http://www.cnblogs.com/huomiao/archive/2009/12/16/1625251.html

 

8.  常用服务使用的端口号

http://hi.baidu.com/guanlianan/blog/item/957c5850647a7e591138c236.html

 

 

9. sql查询语句总结

 

数据查询
查询查询格式:
SELECT */列名,.../表达式
from 表名/视图
where 条件
order by 列名1 asc,列名2 desc
group by 列名1,列名2 HAVING 过滤条件
查询指定列
SELECT Sno,Sname FROM Student
查询全部列
SELECT * FROM Student
更改查询结果中的列标题
old_name as new_name 或 new_name= old_name 
查询学生表中的姓名和出生年份,并将系别小写显示
SELECT Sname,’Year of Birth:’,2004-Sage, LOWER(Sdept) FROM Student
消除取值重复的行 
SELECT DISTINCT Sno FROM SC
限制结果集中返回的行数
select top 5 * from xs
select top 10 percent from xs
查询满足条件的元组 
常用的查询条件

SELECT Sname FROM Student WHERE Sdept=‘CS’
SELECT Sname,Sage FROM Student WHERE Sage<20
SELECT Sname,Sage FROM Student WHERE NOT Sage>=20
SELECT DISTINCT Sno FROM SC WHERE Grade<60
SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23
SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23
判断表达式的值是否在子查询的结果中 :IN ,NOT IN
SELECT Sname,sgender FROM Student WHERE Sdept IN (‘IS’,’MA’,’CS’)
SELECT Sname,sgender FROM Student WHERE Sdept NOT IN (‘IS’,’MA’,’CS’)
谓词LIKE的一般语法格式为
[NOT] LIKE ‘<匹配串>’ [‘ESCAPE’ <换码字符>]
查找姓刘的学生的姓名,年龄,性别
SELECT Sname,Sno,sgender FROM Student WHERE Sname LIKE ‘刘%’
匹配规则
“%”  匹配零个或多个字符
“_”   匹配任意单个字符
Escape 定义转义字符,以去掉特殊字符的特定含义,使其被作为普通字符看待
如escape “/”,定义 / 作为转义字符,则可用/%去匹配%,用/_去匹配_
查询课程名称以”db_”开头的所有课程情况
Select * from course where cname like ‘db/_%’ escape ‘/’
查询课程名称以”db_”开头,且倒数第3 个字符为I的课程和详细情况
Select * From course Where cname like ‘db/_%I__’escape ‘/’
查询 学号是98001的学生信息(注意:这里的学号是字符型)
SELECT * FROM Student WHERE Sno LIKE ‘98001’
SELECT * FROM Student WHERE Sno=‘98001’
查询“欧阳”姓的学生信息
SELECT Sname FROM Student WHERE Sname like ‘欧阳__’
查缺少成绩的学生的学号和相应的课程号 
SELECT Sno,Cno FROM SC WHERE Grade IS NULL
查所有有成绩的记录的学生学号和课程号 
SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL
查CS系年龄在20岁以下的学生姓名 
SELECT Sname FROM Student WHERE Sdept=‘CS’ AND Sage<20
注意运算符优先级
SELECT sname, sage, sdept FROM student WHERE sage=18 OR sage=19 AND sdept=‘cs’
排序,分组,多表查询,嵌套查询,集合查询
对查询结果排序
查询学生的学号和成绩,并按成绩的降序排列
SELECT Sno,Grade FROM SC WHERE Cno=‘3’ ORDER BY Grade DESC
查询全体学生情况,查询结果按所在系升序排列,对同一系中的学生按年龄降序排列 
SELECT * FROM Student ORDER BY Sdept,Sage DESC
使用集函数
主要集函数
COUNT ([DISTINCT|ALL] *) 统计元组个数
COUNT ([DISTINCT|ALL] <列名>) 统计一列中值的个数
SUM ([DISTINCT|ALL] <列名>)计算一列值的总和
AVG([DISTINCT|ALL] <列名>)计算一列值的平均值
MAX([DISTINCT|ALL] <列名>)求一列值中的最大值
MIN([DISTINCT|ALL] <列名>)求一列值中的最小值
例1:查询学生总人数  SELECT COUNT(*)  FROM  Student;
例2:查询选修了课程的学生人数  SELECT COUNT(DISTINCT Sno) FROM SC;
例3:计算1号课程的学生平均成绩  SELECT AVG(Grade) FROM SC WHERE Cno=‘1’;
例4:查询学习1号课程的学生最高分数 SELECT MAX(Grade) FROM SC WHERE Cno=‘1’;
对查询结果分组
group by   列名  [having   条件表达式]
group by将表中的元组按指定列上值相等的原则分组,然后在每一分组上使用聚集函数,得到单一值
having则对分组进行选择,只将聚集函数作用到满足条件的分组上

例:查询各个课程号与相应的选课人数 
SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno;
查询选修了3门以上课程的学生的学号 
SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) >3
比较连接查询
连接查询中用来连接两个表的条件称为连接条件或连接谓词,其一般格式为:
[<表名1>.] <列名1>  <比较运算符> [<表名2>.] <列名2> 
其中比较运算符主要有:=、>、< 、 >= 、 <= 、 !=。
 当连接运算为 = 时,称为等值连接。使用其他运算符称为非等值连接。
 连接谓词中的列名称为连接字段。连接条件中的各连接字段类型必须是可比的,但不必是相同的。
将Student与SC中同一学生 的元组连接起来
SELECT Student.*,Sc.* FROM Student,SC WHERE Student.Sno=SC.Sno
复合条件连接
SELECT Student.Sno,Sname FROM Student, SC WHERE Student.Sno=SC.Sno AND SC.Cno=‘2’ AND SC.Grade>90
SELECT Student.Sno, Sname, Cname, Grade FROM Student, SC, Course WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno
嵌套查询
在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。
将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。
SELECT Sname FROM Student WHERE Sno IN(SELECT Sno FROM SC WHERE Cno=‘2’);
       
带有比较运算符的子查询
SELECT Sno, Sname, Sdept FROM Student WHERE Sdept = (SELECT Sdept FROM Student WHERE Sname=‘刘晨’)
into 子句
可将查询出的数据村入另一个表中
举例:
由学生表创建“计算机系学生”表,包含学号和姓名列
select 学号,姓名into 计算机学生from xs where 专业名=‘计算机’
集合查询
并操作UNION的使用
SELECT * FROM Student WHERE Sdept=‘CS’ UNION SELECT * FROM Student WHERE Sage<=19
查询既选修了课程1又选修了课程2的学生
SELECT Sno FROM SC WHERE Sno IN (SELECT Sno FROM SC WHERE Cno=‘1’) AND Sno IN (SELECT Sno FROM SC WHERE Cno=‘2’); 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值