搜档网
当前位置:搜档网 › 关于select函数

关于select函数

关于select函数
关于select函数

关于select函数

关于select函数,其函数原型为:

int select(int n, fd_set *readfds, fd_set *writefds, fd_set

*exceptfds, struct tim *timeout);

此函数的功能是由内核检测在timeout时间内,是否有readfds,writefds,exceptfds三个句柄集(file descriptors)里的某个句柄(file descriptor)的状态符合寻求,即readfds 句柄集里有句柄可读或writefds句柄集里有可写或exceptfds句柄集里有例外发生,任何一个有变化函数就立即返回,返回值为timeout发生状态变化的句柄个数。

n是所有readfds,writefds,exceptfds三个句柄集(file descriptors)里编号最大值加1。比如:要检测两个socket 句柄fd1和fd2在timeout时间内是否分别可读和可写就可以这样:

先把两个句柄集(file descriptors)清零:

FD_ZERO (&readfds);

FD_ZERO (&writefds);

然后把fd1加入读检测集:

FD_SET (fd1, &readfds);

然后把fd2加入写检测集:

FD_SET (fd2, &writefds);

再给timeout设置值,timeout是这样的一个结构:

struct tim {

long tv_sec;

long tv_usec;

};

你可以这样赋值:

https://www.sodocs.net/doc/bf1683947.html,_sec=1;

https://www.sodocs.net/doc/bf1683947.html,_uec=0;

表示检测在1秒钟内是否有句柄状态发生变化。

如果有句柄发生变化,就可以用FD_ISSET检测各个句柄,比如:

FD_ISSET (fd1, &readfds);//检测是否fd1变成可读的了

FD_ISSET (fd2, &writefds);//检测是否fd2变成可写的了

示意程序代码如下:fd1 = socket();//创建一个socket fd2 = socket();//创建一个socket

while(1) {

FD_ZERO (&readfds);

FD_ZERO (&writefds);

FD_SET (fd1, &readfds);

FD_SET (fd2, &writefds);

https://www.sodocs.net/doc/bf1683947.html,_sec=1;

https://www.sodocs.net/doc/bf1683947.html,_uec=0;

ret = select(fd1>fd2?(fd1+1):(fd2+1),

&readfds, &writefds, NULL, &timeout);

if(ret < 0) {printf("系统错误,select出错,错误代码:%d, 错误信息:%s", errno, strerror(errno));}

else if(ret == 0) {printf("select超时返回,没有任何句柄状态发生变化!");}

//有句柄状态发生了变化

if(FD_ISSET(fd1, &readfds)) {

fd1有数据可读;

fd1里的数据被读出来;

}

if(FD_ISSET(fd2, &writefds)) {

fd2可写;

fd2里发送数据给对方;

}

}经常用到的几个自定义函数:

1、开启监听的函数int

OpenSCPServer(int port, int total, int sendbuflen, int recvbuflen, int blockORnot, int reuseORnot) { int sockfd = 0, ret = 0, opt = 0, flags=1;

struct sockaddr_in laddr;

ret = sockfd = socket(PF_INET, SOCK_STREAM, 0);

if(ret < 0) {

sprintf(errorMessage, "OpenTCPServer socket() error! return:%d, errno=%d, errortext:'%s' %s", ret, errno, strerror(errno), GetCurrentTime(0, 0));

return -1;

}

ret = setsockopt(sockfd, SOL_SOCKET,

SO_REUSEADDR, &reuseORnot, sizeof(int));

if(ret < 0) {

sprintf(errorMessage, "OpenTCPServer setsockopt() reuse error! return:%d, errno=%d, errortext:'%s' %s", ret, errno, strerror(errno), GetCurrentTime(0, 0));

return -2;

}

ret = setsockopt(sockfd, SOL_SOCKET,

SO_RCVBUF, &recvbuflen, sizeof(int));

if ( ret < 0) {

sprintf(errorMessage, "OpenTCPServer setsockopt() recvbuf error! return:%d, errno=%d,

errortext:'%s' %s", ret, errno, strerror(errno), GetCurrentTime(0, 0));

return -3;

}

ret = setsockopt(sockfd, SOL_SOCKET,

SO_SNDBUF, &sendbuflen, sizeof(int));

if (ret < 0) {

sprintf(errorMessage, "OpenTCPServer setsockopt() sendbuf error! return:%d, errno=%d, errortext:'%s' %s", ret, errno, strerror(errno), GetCurrentTime(0, 0));

return -4;

}

ioctl(sockfd,FIONBIO,&blockORnot);

laddr.sin_family = PF_INET;

laddr.sin_port = htons(port);

laddr.sin_addr.s_addr = INADDR_ANY;

bzero(&(laddr.sin_zero), 8);

ret = bind(sockfd, (struct sockaddr *)&laddr, sizeof(struct sockaddr));

if(ret < 0) {

sprintf(errorMessage, "OpenTCPServer bind()

error! return:%d, errno=%d, errortext:'%s' %s", ret, errno, strerror(errno), GetCurrentTime(0, 0));

close(sockfd);

return -5;

}

ret = listen(sockfd, total);

if(ret < 0) {

sprintf(errorMessage, "OpenTCPServer listen() error! return:%d, errno=%d, errortext:'%s' %s", ret, errno, strerror(errno), GetCurrentTime(0, 0));

close(sockfd);

return -6;

}

sprintf(errorMessage, "OpenTCPServer opened on port.%d(%d) OK, socket(%d), buf(%d:%d)! %s", port, total, sockfd, sendbuflen, recvbuflen, GetCurrentTime(0, 0));

return sockfd;

}2、连接服务器的函数int

ConnectSCPServer(char * serverip, int serverport, int blockORnot) { int serversock = 0, ret = 0;

unsigned long addr;

struct sockaddr_in sin;

struct hostent *he;

if((he=gethostbyname(serverip))== 0) {

sprintf(errorMessage, "ConnectSCPServer IP address '%s' error! return:-1 %s", serverip, GetCurrentTime(0, 0));

return -1;

}

serversock = socket(PF_INET, SOCK_STREAM, 0);

if(serversock == -1) {

sprintf(errorMessage, "ConnectSCPServer socket() error! return:-2, errno=%d, errortext:'%s' %s", errno, strerror(errno), GetCurrentTime(0, 0));

return -2;

}

ioctl(serversock, FIONBIO, &blockORnot);

//block or not

memset((char*)&sin, 0, sizeof(struct

sockaddr_in));

sin.sin_family = PF_INET;

sin.sin_port = htons(serverport);

sin.sin_addr = *((struct in_addr *)he->h_addr);

ret = connect(serversock, (struct sockaddr *)&sin,

sizeof(sin));

if(ret == -1) {

sprintf(errorMessage, "ConnectSCPServer connect() error! return:-3, errno=%d, errortext:'%s' %s", errno, strerror(errno), GetCurrentTime(0, 0));

close(serversock);

return -3;

}

return serversock;

}3、发送数据函数Sendint

Send(int sock, char * buf, size_t size, int flag, int timeout) { int i = 0, ret = 0, intretry = 0;

struct tim tival;

fd_set writefds;

int maxfds = 0;

https://www.sodocs.net/doc/bf1683947.html,_sec = timeout;

https://www.sodocs.net/doc/bf1683947.html,_usec = 0;

FD_ZERO(&writefds);

if(sock > 0) {

FD_SET(sock, &writefds);

maxfds=((sock > maxfds)?sock:maxfds);

}

else {

sprintf(errorMessage, "Send socket:%d error! return:-2 %s", sock, GetCurrentTime(0, 0));

return -2;

}

ret = select(maxfds + 1, NULL, &writefds, NULL, &tival);

if(ret <= 0) {

if(ret < 0) sprintf(errorMessage, "Send socket:%d select() error! return:%d, errno=%d, errortext:'%s' %s", sock, ret, errno, strerror(errno), GetCurrentTime(0, 0));

else sprintf(errorMessage, "Send socket:%d select timeout(%d)! %s", sock, timeout, GetCurrentTime(0, 0));

close(sock);

return -3;

}

if(!(FD_ISSET(sock, &writefds))) {

sprintf(errorMessage, "Send socket:%d not in writefds! %s", sock, GetCurrentTime(0, 0));

close(sock);

return -4;

}

while(i < size) {

ret = send(sock, buf + i, size - i, flag);

if(ret <= 0) {

sprintf(errorMessage, "Send socket:%d

send() error! return:%d, errno=%d, errortext:'%s' %s", sock, ret, errno, strerror(errno), GetCurrentTime(0, 0));

if (EINTR == errno)

if(intretry < 10) {intretry++;continue;}

else sprintf(errorMessage, "Send socket:%d send() error!EINTR 10 times! %s", sock, GetCurrentTime(0, 0));

close(sock);

return -1;

}

else i += ret;

}

sprintf(errorMessage, "Send socket:%d send()

OK! %d/%d bytes sent! %s", sock, i, size, GetCurrentTime(0, 0));

return i;

}4、接收数据函数Recvint

Recv(int sock, char * buf, size_t size, int flag, int timeout) { int i = 0, ret = 0, intretry = 0;

struct tim tival;

fd_set readfds;

int maxfds = 0;

https://www.sodocs.net/doc/bf1683947.html,_sec = timeout;

https://www.sodocs.net/doc/bf1683947.html,_usec = 0;

FD_ZERO(&readfds);

if(sock > 0) {

FD_SET(sock, &readfds);

maxfds=((sock > maxfds)?sock:maxfds);

}

else {

sprintf(errorMessage, "Recv socket:%d error! return:-2 %s", sock, GetCurrentTime(0, 0));

return -2;

}

ret = select(maxfds + 1, &readfds, NULL, NULL, &tival);

if(ret <= 0) {

if(ret < 0) sprintf(errorMessage, "Recv

socket:%d select() error! return:%d, errno=%d,

errortext:'%s' %s", sock, ret, errno, strerror(errno), GetCurrentTime(0, 0));

else sprintf(errorMessage, "Recv socket:%d select timeout(%d)! %s", sock, timeout, GetCurrentTime(0, 0));

close(sock);

return -3;

}

if(!(FD_ISSET(sock, &readfds))) {

sprintf(errorMessage, "Recv socket:%d not in readfds! %s", sock, GetCurrentTime(0, 0));

close(sock);

return -4;

}

while(i < size) {

ret = recv(sock, buf + i, size - i, flag);

if(ret <= 0){

sprintf(errorMessage, "Recv socket:%d recv() error! return:%d, errno=%d, errortext:'%s' %s", sock, ret, errno, strerror(errno), GetCurrentTime(0, 0));

if(errno == EINTR)

if(intretry < 10) {intretry++;continue;}

else sprintf(errorMessage, "Recv socket:%d recv() error! EINTR 10 times! %s", sock, GetCurrentTime(0, 0));

close(sock);

return -1;

}

else i += ret;

}

sprintf(errorMessage, "Recv socket:%d recv()

OK! %d/%d bytes received! %s", sock, i, size, GetCurrentTime(0, 0));

return i;

}

最后需要说明的是:我这里讲到的源程序并不能实际地作为一个产品程序来用,实际情况下可能会有其它许多工作要做,比如可能要建立共享队列来存放socket里读到的消息,也

可能把发送消息先进行排队然后再调用Send函数。还有,如果不是全数字,在发送前一定要htonl转换为网络字节序,同理接收到后一定要先ntohl由网络字节序转换为主机字节序,否则对方发送过来的0x00000001在你这里可能是

0x00010000,因为高低位顺序不同。

lab1 SQLPlus使用及简单Select语句

实验1 SQL*Plus使用及简单Select语句 实验人:_________ 学号_____ 班级____________ 实验目的: 1.掌握SQL*Plus常用功能的使用。 2.掌握简单查询的语法。 实验平台: 1.Windows 2000/XP。 2.Oracle 10g 实验过程记录及分析: 1.SQL*Plus的使用: 1) 2) 3)如果某个用户连接数据库时,发生了“协议适配器错误”,分析其原因,并给出解决错 4)

5) 6) 7) 2. SQL 1) 2)3

4)查询emp表中,工资额大于2000的员工的姓名及其工资额。 5) 6) 7)查询emp表中,ename列含有字母A的员工的姓名。

8) 9) 10

11)使用to_date函数查询1981年入职的员工姓名。 SQL> select * from emp 2 where to_char(hiredate,'yyyy')='1981'; EMPNO ENAME JOB MGR HIREDATE SAL COMM ---------- ---------- --------- ---------- -------------- ---------- ---------- DEPTNO ---------- 7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 7566 JONES MANAGER 7839 02-4月 -81 2975 20 EMPNO ENAME JOB MGR HIREDATE SAL COMM ---------- ---------- --------- ---------- -------------- ---------- ---------- DEPTNO ---------- 7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 EMPNO ENAME JOB MGR HIREDATE SAL COMM ---------- ---------- --------- ---------- -------------- ---------- ----------

linux Select函数用法详解

Socket-Select Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect、accept、recv或recvfrom 这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。 可是使用Select就可以完成非阻塞(所谓非阻塞方式non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高)方式工作的程序,它能够监视我们需要监视的文件描述符的变化情况——读写或是异常。下面详细介绍一下。 Select的函数格式: int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout); 先说明两个结构体: 第一,struct fd_set可以理解为一个集合,这个集合中存放的是文件描述符(file descriptor),即文件句柄,这可以是我们所说的普通意义的文件,当然Unix下任何设备、管道、FIFO等都是文件形式,全部包括在内,所以毫无疑问一个socket就是一个文件,socket句柄就是一个文件描述符。fd_set集合可以通过一些宏由人为来操作,比如清空集合 FD_ZERO(fd_set *),将一个给定的文件描述符加入集合之中FD_SET(int ,fd_set *),将一个给定的文件描述符从集合中删除FD_CLR(int ,fd_set*),检查集合中指定的文件描述符是否可以读写FD_ISSET(int ,fd_set* )。一会儿举例说明。 第二,struct timeval是一个大家常用的结构,用来代表时间值,有两个成员,一个是秒数,另一个是毫秒数。 具体解释select的参数: int maxfdp是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!在Windows中这个参数的值无所谓,可以设置不正确。 fd_set *readfds是指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的读变化的,即我们关心是否可以从这些文件中读取数据了,如果这个集合中有一个文件可读,select就会返回一个大于0的值,表示有文件可读,如果没有可读的文件,则根据timeout参数再判断是否

select用法

SELECT命令在全国计算机等级考试二级VFP考试中所占的比重可以说非常大,在笔试考试中可以占8-12分,上机考试中占20-50分,所以我将SELECT命令做如下说明,请大家认真学习. SELECT各短语功能: SELECT 说明查询结果,可以用*来表示所有字段,也可以直接写所要查询的字段名,多个字段名也要用英文的逗号隔开,在分组或计算查询中还可以使用如SUM(),COUNT(),A VG(),MAX(),MIN()这些函数进行运算,还可以在排序后用TOP短语来取查询结果的前几条记录,用AS短语对结果字段重新命名; FROM 说明查询的数据源,一般写表名,多个表名用英文的逗号隔开,也可以对所用到的表进行重新命名(如学生st 将学生表重新命名成st表); WHERE 说明查询条件,一般写条件表达式也就是逻辑表达式; GROUP BY说明分组字段此短语后可跟写HA VING短语用来说明分组后的条件; ORDER BY说明排序字段,可以用ASC(升序)和DESC(降序)来说明排序方式; INTO 说明查询去各,可以用TABLE或DBF(表)、CURSOR(临时表)、ARRAY(数组)三短语中一个来说明查询去向的类型。 考点1 简单查询 1简单查询 简单查询是由SELECT和FROM短语构成的无条件查询,或由SELECT,FROM和WHERE短语构成的条件查询。 2简单的连接查询 连接是关系的基本操作之一,连接查询是一种基于多个关系的查询。 3嵌套查询 嵌套查询所要求的结果出自一个关系,但关系的条件却涉及多个关系。其内层基本上也是一个SELECT-FROM-WHERE查询语句。这种简单嵌套查询,可使用谓词IN或NOT IN 来判断在外层的查询条件中是否包含内层查询的结果。 考点2 特殊运算符号 1 BETWEEN…AND… 含义:该查询的条件是在……范围之内,相当于用AND连接的一个逻辑表达式。 2 LIKE 含义:它是一个字符串匹配运算符,与之搭配使用的通配符包括“*”和“?”。 考点3 排序 使用SQL SELECT可以将查询结果进行排序,排序的短语是ORDER BY。 格式:ORDER BY Order_Item[ASCIDESC][,Order_Item[ASC|DESC]…] 说明:可以按升序(ASC)或降序(DESC)排序,允许按一列或多列排序。 考点4 计算查询 1简单的计算查询 SQL不仅具有一般的检索能力,而且还有计算方式的检索,用于计算检索的函数有:COUNT(计数)、SUM(求和)、A VG(计算平均值)、MAX(求最大值)及MIN(求最小值)。 2分组与计算查询 在SQL SELECT中可以利用GROUP BY子句进行分组计算查询。 格式:GROUP BY GroupColumn[,GroupColumn…][HA VING FilterCondition] 说明:可以按一列或多列分组,还可以用HA VING子句进一步限定分组的条件。它必须跟在GROUP BY子句之后,不可单独使用,与WHERE子句并不矛盾。 考点5 别名和自连接查询

photoShop操作实例大全

】【共享】[4-17]photoShop基本制作技能大集合 我感觉很精典的教程: 下载地址:https://www.sodocs.net/doc/bf1683947.html,/softdown ... /200510/IT_yyjz.rar 1 Photoshop只是一个工具而已,不要把它看成神物。 2 看5本书不如自己动脑筋分析一个例子。 3 学Photoshop并不难,难的是学会怎么用。 4 不要试图掌握photoshop的每一个功能,熟悉和你工作最相关的部分就可以了。 5 不要看不起最基本的元素,往往看起来比较复杂的图像就是这些基本元素构成的。 6 不要问:有没有XXX教程--耐心的人会自己打开photoshop尝试。 7 不要说:不要让我用英文的photoshop,不要让我看英文的网站,我看不懂--谁都是从不懂到懂的8 不要担心:我没有学过美术,我一定用不好photoshop。 9 不要只问不学 10 学photoshop要坚持,要有耐心 11 看到某个图像的教程请试着用同样方法作出其他的图像 12 时常总结、吸收自己和其他人的小敲门、技巧 13 有了问题先自己想,察看帮助,1个小时后没有结果再问别人 14 学会用搜索引擎,很多知识在网上可以轻松得到 15 花3个小时做10张图,不如花10个小时做3张图。 16 不要总想在图片中赋予什么意义,好看就行 17 学photoshop首先掌握功能,然后掌握方法 18 先会走再会跑 19 明白了以上18条,你会觉得photoshop不过如此 1.如何制作晕映效果? 如何制作晕映效果?

晕映(Vignettss)效果是指图像具有柔软渐变的边缘效果。使用Photoshop制作晕映效果非常容易,下面介绍如何使用Photoshop5.5制作图像的两种晕映效果。 1.椭圆晕映效果 1)使用Photoshop5.5打开一幅图; 2)在工具栏中选择椭圆套索工具; 3)用椭圆套索工具在图像中选取所需的部分;

整理的SQL常用函数

create table test (id int, value varchar(10)) insertinto test values('1','aa') insertinto test values('1','bb') insertinto test values('2','aaa') insertinto test values('2','bbb') insertinto test values('2','ccc') insertinto test values('3','aa') insertinto test values('4','bb') select*from test select id, [values] =stuff((select','+ [values] from test t where id = test.id forxmlpath('')), 1 , 1 ,'') from test groupby id stuff(param1,startIndex,length, param2) 说明:将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用param2替换删掉的字符。*/

COUNT()函数用于返回一个列内所有非空值的个数,这是一个整型值。 由于COUNT(*)函数会忽略NULL值,所以这个查询的结果是2。 三、SUM()函数 SUM()函数是最常用的聚合函数之一,它的功能很容易理解:和AVG()函数一样,它用于数值数据类型,返回一个列范围内所有非空值的总和。 四、CAST()函数 CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型。 以下例子用于将文本字符串'123'转换为整型: SELECT CAST('123' AS int) 返回值是整型值123。 如果试图将一个代表小数的字符串转换为整型值,又会出现什么情况呢? SELECT CAST('123.4' AS int) CAST()函数和CONVERT()函数都不能执行四舍五入或截断操作。由于123.4不能用int数据类型来表示,所以对这个函数调用将产生一个错误。 Server: Msg 245, Level 16, State 1, Line 1 Syntax error converting the varchar value '123.4' to a column of data type int. 在将varchar值'123.4' 转换成数据类型int时失败。 要返回一个合法的数值,就必须使用能处理这个值的数据类型。对于这个例子,存在多个可用的数据类型。如果通过CAST()函数将这个值转换为decimal类型,需要首先定义decimal 值的精度与小数位数。在本例中,精度与小数位数分别为9与2。精度是总的数字位数,包括小数点左边和右边位数的总和。而小数位数是小数点右边的位数。这表示本例能够支持的最大的整数值是9999999,而最小的小数是0.01。 SELECT CAST('123.4' AS decimal(9,2)) decimal数据类型在结果网格中将显示有效小数位:123.40 精度和小数位数的默认值分别是18与0。如果在decimal类型中不提供这两个值,SQL Server 将截断数字的小数部分,而不会产生错误。 SELECT CAST('123.4' AS decimal) 结果是一个整数值:123 五、CONVERT()函数 对于简单类型转换,CONVERT()函数和CAST()函数的功能相同,只是语法不同。 CAST()函数一般更容易使用,其功能也更简单。 CONVERT()函数的优点是可以格式化日期和数值,它需要两个参数:第1个是目标数据类型,第2个是源数据。 CONVERT()函数还具有一些改进的功能,它可以返回经过格式化的字符串值,且可以把日期值格式化成很多形式。有28种预定义的符合各种国际和特殊要求的日期与时间输出格式。 六、STR()函数 这是一个将数字转换为字符串的快捷函数。这个函数有3个参数:数值、总长度和小数位数。如果数字的整数位数和小数位数(要加上小数点占用的一个字符)的总和小于总长度,对结果中左边的字符将用空格填充。在下面第1个例子中,包括小数点在内一共是5个字符。结果

Linux下select函数的使用

select系统调用是用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变。关于文件句柄,其实就是一个整数,我们最熟悉的句柄是0、1、2三个,0是 标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构的表示就是stdin、stdout、stderr。 int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout); 参数n代表文件描述词加1; 参数readfds、writefds 和exceptfds 称为描述词组,是用来回传该描述词的读,写或例外的状况。 下面的宏提供了处理这三种描述词组的方式: FD_CLR(inr fd,fd_set* set);用来清除描述词组set中相关fd 的位 FD_ISSET(int fd,fd_set *set);用来测试描述词组set中相关fd 的位是否 为真 FD_SET(int fd,fd_set*set);用来设置描述词组set中相关fd的位 FD_ZERO(fd_set *set);用来清除描述词组set的全部位 参数timeout为结构timeval,用来设置select()的等待时间,其结构定义如下: struct timeval { time_t tv_sec; time_t tv_usec; }; (1)如果参数timeout设为NULL,则表示select()一直阻塞,直到有句柄状态变化 (2)如果timeout值为0,则select不阻塞直接返回 (3)如果timeout为某个特定值,则在特定时间内阻塞直到有句柄状态变化,如果这个世间内所有句柄状态都无变化,则超时返回0 select函数执行结果:执行成功则返回文件描述词状态已改变的个数,如果返回0代表在描述词状态改变前已超过timeout时间,没有返回;当有错误发生时则返回-1,错误原因存于errno,此时参数readfds,writefds,exceptfds

SQL语句 SELECT LIKE like用法详解

SQL语句 SELECT LIKE like用法详解 2009-12-16 13:44 LIKE语句的语法格式是:select * from 表名 where 字段名 like 对应值(子串),它主要是针对字符型字段的,它的作用是在一个字符型字段列中检索包含对应子串的。 假设有一个数据库中有个表table1,在table1中有两个字段,分别是name 和sex二者全是字符型数据。现在我们要在姓名字段中查询以“张”字开头的记录,语句如下: select * from table1 where name like "张*" 如果要查询以“张”结尾的记录,则语句如下: select * from table1 where name like "*张" 这里用到了通配符“*”,可以说,like语句是和通配符分不开的。下面我们就详细介绍一下通配符。 多个字符 * c*c代表cc,cBc,cbc,cabdfec等 它同于DOS命令中的通配符,代表多个字符。 多个字符 % %c%代表agdcagd等 这种方法在很多程序中要用到,主要是查询包含子串的。 特殊字符 a a代表a*a 代替* 单字符 ? b?b代表brb,bFb等 同于DOS命令中的?通配符,代表单个字符 单数字 # k#k代表k1k,k8k,k0k 大致同上,不同的是代只能代表单个数字。 字符范围 - [a-z]代表a到z的26个字母中任意一个 指定一个范围中任意一个 续上

排除 [!字符] [!a-z]代表9,0,%,*等 它只代表单个字符 数字排除 [!数字] [!0-9]代表A,b,C,d等 同上 组合类型 字符[范围类型]字符 cc[!a-d]#代表ccF#等 可以和其它几种方式组合使用 例:假设表table1中有以下记录: name sex 张小明男 李明天男 李a天女 王5五男 王清五男 下面我们来举例说明一下: 查询name字段中包含有“明”字的。 select * from table1 where name like '%明%' 查询name字段中以“李”字开头。 select * from table1 where name like '李*' 查询name字段中含有数字的。 select * from table1 where name like '%[0-9]%' 查询name字段中含有小写字母的。 select * from table1 where name like '%[a-z]%' 查询name字段中不含有数字的。 select * from table1 where name like '%[!0-9]%' 我们着重要说明的是通配符“*”与“%”的区别。 select * from table1 where name like '*明*' select * from table1 where name like '%明%' 大家会看到,前一条语句列出来的是所有的记录,而后一条记录列出来的是name字段中含有“明”的记录,所以说,当我们作字符型字段包含一个子串的查询时最好采用“%”而不用“*”,用“*”的时候只在开头或者只在结尾时,而不能两端全由“*”代替任意字符的情况下。 大家在写sql 语句的时候,如果是 select .. where 类型的语句,有注意到条件的前后顺序吗?我今天做个小实验。 比如查询地址里包含“海口市”及“振兴路” 两个关键字的数据,一般时候可能会用

SQL语句大全实例

SQL语句实例 表操作 例 1 对于表的教学管理数据库中的表STUDENTS ,可以定义如下:CREATE TABLE STUDENTS (SNO NUMERIC (6, 0) NOT NULL SNAME CHAR (8) NOT NULL AGE NUMERIC(3,0) SEX CHAR(2) BPLACE CHAR(20) PRIMARY KEY(SNO)) 例 2 对于表的教学管理数据库中的表ENROLLS ,可以定义如下: CREATE TABLE ENROLLS (SNO NUMERIC(6,0) NOT NULL CNO CHAR(4) NOT NULL GRADE INT PRIMARY KEY(SNO,CNO) FOREIGN KEY(SNO) REFERENCES STUDENTS(SNO) FOREIGN KEY(CNO) REFERENCES COURSES(CNO) CHECK ((GRADE IS NULL) OR (GRADE BETWEEN 0 AND 100))) 例 3 根据表的STUDENTS 表,建立一个只包含学号、姓名、年龄的女学生表。 CREATE TABLE GIRL

AS SELECT SNO, SNAME, AGE FROM STUDENTS WHERE SEX=' 女'; 例 4 删除教师表TEACHER 。 DROP TABLE TEACHER 例 5 在教师表中增加住址列。 ALTER TABLE TEACHERS ADD (ADDR CHAR(50)) 例 6 把STUDENTS 表中的BPLACE 列删除,并且把引用BPLACE 列的所有视图和约束也一起删除。 ALTER TABLE STUDENTS DROP BPLACE CASCADE 例7 补充定义ENROLLS 表的主关键字。 ALTER TABLE ENROLLS ADD PRIMARY KEY (SNO,CNO) ; 视图操作(虚表) 例9 建立一个只包括教师号、姓名和年龄的视图FACULTY 。( 在视图定义中不能包含ORDER BY 子句) CREATE VIEW FACULTY AS SELECT TNO, TNAME, AGE FROM TEACHERS 例10 从学生表、课程表和选课表中产生一个视图GRADE_TABLE ,它包括学生姓名、课程名和成绩。 CREATE VIEW GRADE_TABLE AS SELECT SNAME,CNAME,GRADE FROM STUDENTS,COURSES,ENROLLS WHERE STUDENTS.SNO =ENROLLS.SNO AND https://www.sodocs.net/doc/bf1683947.html,O=https://www.sodocs.net/doc/bf1683947.html,O 例11 删除视图GRADE_TABLE DROP VIEW GRADE_TABLE RESTRICT 索引操作 例12 在学生表中按学号建立索引。 CREATE UNIQUE INDEX ST ON STUDENTS (SNO,ASC) 例13 删除按学号所建立的索引。 DROP INDEX ST 数据库模式操作

[MSSQL] - SELECT语句使用大全

SELECT语句使用大全 虽然 SELECT 语句的完整语法比较复杂,但是大多数 SELECT 语句都描述结果集的四个主要属性 1、结果集中的列的数量和属性。 2、从中检索结果集数据的表,以及这些表之间的所有逻辑关系。 3、为了符合 SELECT 语句的要求,源表中的行所必须达到的条件。不符合条件的行会被忽略。 4、结果集的行的排列顺序。 它的主要子句可归纳如下: SELECT select_list --描述结果集的列 INTO new_table_name --指定使用结果集来创建新表 FROM table_list --包含从中检索到结果集数据的表的列表[返回结果集的对象]。 [ WHERE search_conditions ] --WHERE 子句是一个筛选,它定义了源表中的行要满足 SELECT 语句的要求所必须达到的条件 [ GROUP BY group_by_list ] --根据 group_by_list 列中的值将结果集分成组[ HAVING search_conditions ] --结果集的附加筛选 [ ORDER BY order_list [ ASC | DESC ] ] --结果集的附加筛选 一、使用选择列表 1、使用 *号来选择所有列;使用“[表名|别名]。[字段]”选取特定的列。 2、AS 子句可用来更改结果集列的名称或为派生列分配名称,也可以使用空格代替 如: SELECT Name AS Name1,Name Name2 FROM Product ORDER BY Name ASC 3、使用 DISTINCT 消除重复项 如:select distinct [Year] from A 4、使用 TOP 和 PERCENT 限制结果集数量 TOP ( expression ) [ PERCENT ] [ WITH TIES ] --expression 数量、PERCENT按百分比返回数据、WITH TIES返回排序与最后一行并列的行。 如:获取成绩前三名的同学 select top 3 * from Score order by Num desc --不考虑成绩并列 select top 3 WITH TIES * from Score order by Num desc --可解决成绩并列的问题 5、选择列表中的计算值 选择的列不但可以包括数据表列,还可以包括计算值,这些结果集列被称为派生列。 计算并且包括以下运算: 对数值列或常量使用算术运算符或函数进行的计算和运算。如SUM(),

SQL函数用法大全

SQL 是用于访问和处理数据库的标准的计算机语言。 什么是SQL? ?SQL 指结构化查询语言 ?SQL 使我们有能力访问数据库 ?SQL 是一种ANSI 的标准计算机语言 编者注:ANSI,美国国家标准化组织 SQL 能做什么? ?SQL 面向数据库执行查询 ?SQL 可从数据库取回数据 ?SQL 可在数据库中插入新的纪录 ?SQL 可更新数据库中的数据 ?SQL 可从数据库删除记录 ?SQL 可创建新数据库 ?SQL 可在数据库中创建新表 ?SQL 可在数据库中创建存储过程 ?SQL 可在数据库中创建视图 ?SQL 可以设置表、存储过程和视图的权限 SQL 是一种标准- 但是... SQL 是一门ANSI 的标准计算机语言,用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。SQL 可与数据库程序协同工作,比如MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。 不幸地是,存在着很多不同版本的SQL 语言,但是为了与ANSI 标准相兼容,它们必须以相似的方式共同地来支持一些主要的关键词(比如SELECT、UPDATE、DELETE、INSERT、WHERE 等等)。 注释:除了SQL 标准之外,大部分SQL 数据库程序都拥有它们自己的私有扩展! 在您的网站中使用SQL 要创建发布数据库中数据的网站,您需要以下要素: ?RDBMS 数据库程序(比如MS Access, SQL Server, MySQL) ?服务器端脚本语言(比如PHP 或ASP) ?SQL ?HTML / CSS RDBMS

第1节-基本的SQL-SELECT语句

基本的SQL-SELECT语句 1.查看表结构 sql>desc 表名称; 2.查询所有列 select * from 表名称; 3. 查询指定列 select 列名称1 ,列名称2 ,列名称3 from 表名称; 4.如何取消重复行 select distinct 列名称1 ,列名称2 from 表名称; 5. 使用算数表达式 ?显示每个雇员的年工资 select sal*13+nvl(comm,0)*13 "年工资",ename,comm from emp; 6. 使用列的别名 select ename "姓名",sal*12 as "年收入" from emp; 7.如何处理null值(空值不是空格或者0) 使用nvl函数来处理 8. 如何连接字符串(||) selectename || 'is a ' || job from emp; SQL语句分为以下三种类型: ●DML: Data Manipulation Language 数据操纵语言 ●DDL: Data Definition Language 数据定义语言 ●DCL: Data Control Language 数据控制语言

DML用于查询与修改数据记录,包括如下SQL语句: ●INSERT:添加数据到数据库中 ●UPDATE:修改数据库中的数据 ●DELETE:删除数据库中的数据 ●SELECT:选择(查询)数据 SELECT是SQL语言的基础,最为重要。 DDL用于定义数据库的结构,比如创建、修改或删除数据库对象,包括如下SQL语句: ●CREATE TABLE:创建数据库表 ●ALTER TABLE:更改表结构、添加、删除、修改列长度 ●DROP TABLE:删除表 ●CREATE INDEX:在表上建立索引 ●DROP INDEX:删除索引 DCL用来控制数据库的访问,包括如下SQL语句: ●GRANT:授予访问权限 ●REVOKE:撤销访问权限 ●COMMIT:提交事务处理 ●ROLLBACK:事务处理回退 ●SAVEPOINT:设置保存点 ●LOCK:对数据库的特定部分进行锁定

数据库实验五六七八 select语句的使用

实验五select语句的使用(二) 一、实验目的 掌握select语句的嵌套使用方法,能使用sql server对表作复杂查询。 二、实验准备 复习SELECT语句的较高级格式的使用。 了解库函数在分组查询中的使用规则。 三、实验内容 1、找出与李勇在同一个班级的学生信息; 2、找出所有与学生李勇有相同选修课程的学生信息; 3、找出年龄介于学生李勇和25岁之间的学生信息; 4、找出选修了课程操作系统的学生学号和姓名; 5、找出选修了全部课程的学生姓名。(提示:可找出这样的学生,没有一门课程 是他不选修的)。 6、查询选修了3号课程的学生学号及其成绩,并按成绩的降序排列; 7、查询全体学生信息,要求查询结果按班级号升序排列,同一班级学生按年龄 降序排列; 8、求每个课程号及相应的选课人数; 9、查询选修了3门以上课程的学生学号。

实验六视图操作 一、实验目的 建立视图:只读、检查、行列、连接、计算、分组视图。 查询视图:查询所建视图 更新视图:更新所建视图 删除视图:删除所建视图 二、实验内容 1、建立01312班选修了1号课程的学生视图Stu_01312_1; 2、建立01312班选修了1号课程并且成绩不及格的学生视图Stu_01312_1; 3、建立视图Stu_year,由学生学号、姓名、出生年份组成; 4、查询1983年以后出生的学生姓名; 5、查询01312班选修了1号课程并且成绩不及格的学生的学号、姓名、出生年 份。

实验七完整性约束的实现 一、实验目的 掌握SQL中实现数据完整性的方法,加深理解关系数据模型的三类完整性约束。 了解SQL Server中实体完整性、参照完整性和用户自定义完整性的实现手段。 二|、实验内容 表(一)Student 表(二)course 表(三)class

实例学习SQL的Select命令

实例学习SQL的Select命令 1、查找员工的编号、姓名、部门和出生日期,如果出生日期为空值, --显示日期不详,并按部门排序输出,日期格式为yyyy-mm-dd。 select emp_no ,emp_name ,dept , isnull(convert(char(10),birthday,120),'日期不详') birthday from employee order by dept --2、查找与喻自强在同一个单位的员工姓名、性别、部门和职称 select emp_no,emp_name,dept,title from employee where emp_name<>'喻自强' and dept in (select dept from employee where emp_name='喻自强') --3、按部门进行汇总,统计每个部门的总工资 select dept,sum(salary) from employee group by dept --4、查找商品名称为14寸显示器商品的销售情况, --显示该商品的编号、销售数量、单价和金额 select a.prod_id,qty,unit_price,unit_price*qty totprice from sale_item a,product b where a.prod_id=b.prod_id and prod_name='14寸显示器' --5、在销售明细表中按产品编号进行汇总,统计每种产品的销售数量和金额select prod_id,sum(qty) totqty,sum(qty*unit_price) totprice from sale_item group by prod_id --6、使用convert函数按客户编号统计每个客户1996年的订单总金额select cust_id,sum(tot_amt) totprice from sales where convert(char(4),order_date,120)='1996' group by cust_id --7、查找有销售记录的客户编号、名称和订单总额 select a.cust_id,cust_name,sum(tot_amt) totprice from customer a,sales b where a.cust_id=b.cust_id group by a.cust_id,cust_name

SELECT语句练习题答案

SELECT 语句练习题 有下列四个表: 1、学生表 S_NO S_NAME S_SEX S_BIRTHDAY CLASS 108曾华男1905-5-2295033 105匡明男1905-5-1895031 107王丽女1905-5-795033 101李军男1905-5-995033 109王芳女1905-5-1895031 103陆君男1905-5-2095031 2、教师表 T_NO T_NAME TSEX T_BIRTHDAY PROF DEPART 804李诚男1958-12-2副教授计算机系856张旭男1969-3-12讲师电子工程系825王萍女1972-5-5助教计算机系831刘冰女1977-8-14助教电子工程系 3、课程表 C_NO C_NAME T_NO 3-105计算机导论825 3-245操作系统804 6-166数据电路856 9-888高等数学100 4、成绩表 S_NO C_NO DEGREE 1033-24586 1053-24575 1093-24568 1033-10592 1053-10588 1093-10576 1013-10564 1073-10591 1083-10578 1016-16685 1076-10679 1086-16681 Select 语句的最基本结构:Select …. From ….where order by:排序子句(ASC:升序,DESC:降序)

like:模式匹配(通配符:% 可以匹配任意类型和长度的字符; _ 任意单个字符。 聚合函数(SUM A VG、COUNT、COUNT(*)、MAX、MIN) GROUP BY:分组 1、查询Student表中的所有记录的S_NAME、S_SEX和Class列。 2、查询教师所有的单位即不重复的Depart列。 3、查询Student表的所有记录。 4、查询Score表中成绩在60到80之间的所有记录。 5、查询Score表中成绩为85,86或88的记录。 6、查询Student表中“95031”班或性别为“女”的同学记录。 7、以Class降序查询Student表的所有记录。 8、以C_NO升序、Degree降序查询Score表的所有记录。 9、查询“95031”班的学生人数。 10、查询Score表中的最高分的学生学号和课程号。 11、查询‘3-105’号课程的平均分。 12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。 13、查询最低分大于70,最高分小于90的S_NO列。 14、查询所有学生的S_NAME、C_NO和Degree列。 15、查询所有学生的S_NO、C_NAME和Degree列。 16、查询所有学生的S_NAME、C_NAME和Degree列。 17、查询“95033”班所选课程的平均分。 SQL语句练习题参考答案 1、select S_NAME,S_SEX,Class from Student; 2、select distinct depart from teacher; 3、select S_NO as '学号',S_NAME as '姓名',S_SEX as '性别',S_BIRTHDAY as'出生日期',Class as'班号'from student; 或 select S_NO as 学号,S_NAME as 姓名,S_SEX as 性别,S_BIRTHDAY as 出生日期,Class as 班号from student; 4、select * from score where degree between 60 and 80; 或select * from score where degree>=60 and degree<=80; 5、select * from score where degree in (85,86,88); 6、select * from student where class='95031'or S_SEX='女'; 7、select * from student order by class desc; 8、select * from score order by C_NO asc ,degree desc; 或select * from score order by C_NO ,degree desc; 9、select count(*) as CNT from student where class='95031'; 10、select S_NO as '学号',C_NO as '课程号', degree as '最高分' from score where degree=(select max(degree) from score) 11、select avg(degree)as 课程平均分from score where C_NO='3-105'; 12、select C_NO,avg(degree) from score where C_NO like'3%'group by C_NO having count(*) >5; 13、select S_NO from score group by S_NO having min(degree)>70 and max(degree)<90; 14、select student.S_NAME,score.C_NO,score.degree from student,score where student.S_NO=score.S_NO; 15、select x.S_NO,y.C_NAME,x.degree from score x,course y where x.C_NO=y.C_NO; 16、select x.S_NAME,y.C_NAME,z.degree from student x,course y,score z where x.S_NO=z.S_NO and z.C_NO=y.C_NO;

select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型: #include sys/time.h> #include unistd.h> int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 参数maxfd是需要监视的最大的文件描述符值+1;rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集合及异常文件描述符的集合。struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。 fd_set(它比较重要所以先介绍一下)是一组文件描述字(fd)的集合,它用一位来表示一个fd(下面会仔细介绍),对于fd_set类型通过下面四个宏来操作: FD_ZERO(fd_set *fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。 FD_SET(fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。 FD_CLR(fd_set *fdset);用于在文件描述符集合中删除一个文件描述符。 FD_ISSET(int fd,fd_set *fdset);用于测试指定的文件描述符是否在该集合中。 过去,一个fd_set通常只能包含<32的fd(文件描述字),因为fd_set其实只用了一个32位矢量来表示fd;现在,UNIX系统通常会在头文件中定义常量FD_SETSIZE,它是数据类型fd_set的描述字数量,其值通常是1024,这样就能表示<1024的fd。根据fd_set的位矢量实现,我们可以重新理解操作fd_set的四个宏: fd_set set; FD_ZERO(&set); FD_SET(0, &set); FD_CLR(4, &set); FD_ISSET(5, &set); ――――――――――――――――――――――――――――――――――――――― 注意fd的最大值必须

相关主题