文档库 最新最全的文档下载
当前位置:文档库 › SELECT 和 WHERE 子句的函数

SELECT 和 WHERE 子句的函数

SELECT 和 WHERE 子句的函数
SELECT 和 WHERE 子句的函数

MySQL Reference Manual for version 4.1.0-alpha.

6.3 用于SELECT和WHERE子句的函数

一个 SQL 语句中的select_expression或where_definition可由任何使用

了下面所描述函数的表达式组成。

包含NULL的表达式总是得出一个NULL值结果,除非表达式中的操作和函数在文档中有另外的说明。

注意:在一个函数名和跟随它的括号之间必须不存在空格。这有助于 MySQL 语法分析程序区分函数调用和对恰巧与函数同名表或列的引用。然而,参数左右两边的空格却是允许的。

你可以强制 MySQL 接受函数名后存在空格的形式,这需要通过以--ansi选项启动mysqld,或在mysql_connect()中使用CLIENT_IGNORE_SPACE,但是,在这种情况下,所有的函数名均将成为保留字。查看章节1.8.2 以 ANSI 模式运行 MySQL.

为了简洁,从mysql程序输出的例子以缩写的形式显示。因此:

mysql> SELECT MOD(29,9);

1 rows in set (0.00 sec)

+-----------+

| mod(29,9) |

+-----------+

| 2 |

+-----------+

将被显示为这样:

mysql> SELECT MOD(29,9);

-> 2

6.3.1 无类型的特殊运算符和函数

6.3.1.1 圆括号

( ... )

括号,使用它来强制一个表达式的计算顺序。

mysql> SELECT 1+2*3;

-> 7

mysql> SELECT (1+2)*3;

-> 9

6.3.1.2 比较运算符

比较运算符的结果是1(TRUE)、0(FALSE) 或NULL。这些函数可工作于数字和字符串上。根据需要,字符串将会自动地被转换到数字,以及数字被转换成字符串(比如在 Perl 中)。

MySQL 使用下列规则进行比较:

?如果一个或两个参数是NULL,比较的结果是NULL,除了<=>运算符。

?如果在一个比较操作中两个参数均是字符串,他们将作为字符串被比较。

?如果两个参数均是整数,他们作为整数被比较。

?十六进制值如果不与一个数字进行比较,那么它将当作一个二进制字符串。

?如果参数之一是一个TIMESTAMP或DATETIME列,而另一参数是一个常数,在比较执行之前,这个常数被转换为一个时间戳。这样做是为了对

ODBC 更友好。

?在所有其它情况下,参数作为浮点(real)数字被比较。

缺省地,字符串使用当前字符集以忽略字母大小写的方式进行比较(缺省的字符集为 ISO-8859-1 Latin1,它对英语处理得很出色)。

下面的例子演示了对于比较操作字符串到数字的转换:

mysql> SELECT 1 > '6x';

-> 0

mysql> SELECT 7 > '6x';

-> 1

mysql> SELECT 0 > 'x6';

-> 0

mysql> SELECT 0 = 'x6';

-> 1

=

等于:

mysql> SELECT 1 = 0;

-> 0

mysql> SELECT '0' = 0;

-> 1

mysql> SELECT '0.0' = 0;

-> 1

mysql> SELECT '0.01' = 0;

-> 0

mysql> SELECT '.01' = 0.01;

-> 1

<>

!=

不等于:

mysql> SELECT '.01' <> '0.01';

-> 1

mysql> SELECT .01 <> '0.01';

-> 0

mysql> SELECT 'zapp' <> 'zappp';

-> 1

<=

小于或等于:

mysql> SELECT 0.1 <= 2;

-> 1

<

小于:

mysql> SELECT 2 < 2;

-> 0

>=

大于或等于:

mysql> SELECT 2 >= 2;

-> 1

>

大于:

mysql> SELECT 2 > 2;

-> 0

<=>

NULL 值安全等于:

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;

-> 1 1 0

IS NULL

IS NOT NULL

测试一个值是或不是NULL:

mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;

-> 0 0 1

mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;

-> 1 1 0

为了能够与其它程序更好的工作,在使用IS NULL是 MySQL 支持下列额外选择性:

?通过它,你可以找到最后插入的记录行:

?SELECT * FROM tbl_name WHERE auto_col IS NULL

这个操作可以通过设置SQL_AUTO_IS_NULL=0来禁止。查看章节

5.5.6 SET句法.

?对于NOT NULL的DATE和DATETIME列,可以通过使用下列语句找到特殊的值0000-00-00:

?SELECT * FROM tbl_name WHERE date_column IS NULL

这需要通过某些 ODBC 应用程序才能工作(因为 ODBC 不支持一个

0000-00-00日期)

expr BETWEEN min AND max

如果expr大于或等于min,并且expr小于或等于max,BETWEEN返

回1,否则返回0。它等价于表达式(min <= expr AND expr <= max),只要所有的参数均是相同的类型。否则类型会依照上面的规则发生转换,但是应用于所有三个参数。注意,在 MySQL 4.0.5 之前,参数被转换到

expr的类型。

mysql> SELECT 1 BETWEEN 2 AND 3;

-> 0

mysql> SELECT 'b' BETWEEN 'a' AND 'c';

-> 1

mysql> SELECT 2 BETWEEN 2 AND '3';

-> 1

mysql> SELECT 2 BETWEEN 2 AND 'x-3';

-> 0

expr NOT BETWEEN min AND max

等同于NOT (expr BETWEEN min AND max)。

expr IN (value,...)

如果expr是IN列表中的作一值,它将返回1,否则返回0。如果所有的值均是常数,那么所有的值被依照expr的类型进行计算和排序。然后以一个二进制搜索方式完成项目的搜索。这就意味着,如果IN列表完全由常数组成,IN将是非常快的。如果expr是一个字母大小写敏感的字

符串表达式,字符串比较将以大小写敏感方式执行:

mysql> SELECT 2 IN (0,3,5,'wefwf');

-> 0

mysql> SELECT 'wefwf' IN (0,3,5,'wefwf');

-> 1

从 MySQL 4.1 开始(符合 SQL-99 标准),如果左手边的表达式是NULL,或者在列表中没有发现相匹配的值并且列表中的一个表达式是NULL,IN

均返回NULL。

expr NOT IN (value,...)

等同于NOT (expr IN (value,...))。

ISNULL(expr)

如果expr是NULL,ISNULL()返回1,否则返回0:

mysql> SELECT ISNULL(1+1);

-> 0

mysql> SELECT ISNULL(1/0);

-> 1

注意,对NULL值使用=进行比较总是为 false !

COALESCE(list)

返回列表中第一个非NULL的元素:

mysql> SELECT COALESCE(NULL,1);

-> 1

mysql> SELECT COALESCE(NULL,NULL,NULL);

-> NULL

INTERVAL(N,N1,N2,N3,...)

Returns 如果N< N1返回0,如果N< N2返回1,等等。所有的参数

均被当作整数。为了函数能正确地工作,它要求N1< N2< N3< ...< Nn。

这是因为它使用的是一个二进制的搜索(非常地快):

mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);

-> 3

mysql> SELECT INTERVAL(10, 1, 10, 100, 1000);

-> 2

mysql> SELECT INTERVAL(22, 23, 30, 44, 200);

-> 0

如果以任何一个标准运算符(=, <>..., 但除了LIKE)对一个忽略大小写的字符串进行比较,尾部的空白空间(空格、TAB 和换行)均被忽略。

mysql> SELECT "a" ="A \n";

-> 1

6.3.1.3 逻辑运算符

在 SQL 中,所有的逻辑运算符返回的值均为 TRUE、FALSE 或 NULL (未知)。在MySQL 中,它们由1(TRUE)、0(FALSE) 和NULL实现。这些大部分在不同的 SQL 数据库间是相同的,然而某些可能会以一个非零值返回 TRUE。

NOT

!

逻辑非。如果操作数为0,返回1;如果操作数为非零,返回0;如果操作数为NOT NULL,返回NULL。

mysql> SELECT NOT 10;

-> 0

mysql> SELECT NOT 0;

-> 1

mysql> SELECT NOT NULL;

-> NULL

mysql> SELECT ! (1+1);

-> 0

mysql> SELECT ! 1+1;

-> 1

最后一个例子返回1,因为表达式是与(!1)+1一样被计算的。

AND

&&

逻辑与。如果所有的操作数都是非零或非NULL的,返回1;如果有一个或多个操作数为0,则返回0,只要操作数中有NULL返回值就为NULL。

mysql> SELECT 1 && 1;

-> 1

mysql> SELECT 1 && 0;

-> 0

mysql> SELECT 1 && NULL;

-> NULL

mysql> SELECT 0 && NULL;

-> 0

mysql> SELECT NULL && 0;

-> 0

请注意,在 MySQL 4.0.5 以前版本中,当遇到一个NULL时就停止计算,而不是继续进程检查可能存在的0。这就意味着,在这些版本中,SELECT (NULL AND 0)返回NULL,而不是0。在 4.0.5 中,代码已被重新设计

了,已便于在任何仍然使用优化情况下,返回值总是能如 ANSI 所规定的那样。

OR

||

逻辑或。如果任何一个操作数是非零的,返回值为1,如果任一操作数为NULL,返回值为NULL,否则返回0。

mysql> SELECT 1 || 1;

-> 1

mysql> SELECT 1 || 0;

-> 1

mysql> SELECT 0 || 0;

-> 0

mysql> SELECT 0 || NULL;

-> NULL

mysql> SELECT 1 || NULL;

-> 1

XOR

逻辑异或。如果任一操作数为NULL,返回值为NULL。对于非NULL的操作数,如果有奇数个非零的操作数,结果返回为1,否则返回0。

mysql> SELECT 1 XOR 1;

-> 0

mysql> SELECT 1 XOR 0;

-> 1

mysql> SELECT 1 XOR NULL;

-> NULL

mysql> SELECT 1 XOR 1 XOR 1;

-> 1

a XOR b算术相等于(a AND (NOT b)) OR ((NOT a) and b)。XOR在 MySQL

4.0.2 中被添加。

6.3.1.4 控制流函数

IFNULL(expr1,expr2)

如果expr1为非NULL的,IFNULL()返回expr1,否则返回expr2。

IFNULL()返回一个数字或字符串值,这取决于它被使用的语境:

mysql> SELECT IFNULL(1,0);

-> 1

mysql> SELECT IFNULL(NULL,10);

-> 10

mysql> SELECT IFNULL(1/0,10);

-> 10

mysql> SELECT IFNULL(1/0,'yes');

-> 'yes'

在 MySQL 4.0.6 和更新版本中,IFNULL(expr1,expr2)的默认返回值以

STRING、REAL或INTEGER顺序更加'general'了两个表达式。当你基于

一个表达式创建一个表或在一个临时表中 MySQL 不得不存储一个从

IFNULL()返回的值时,这个与较早 MySQL 版本的不同将更加值得注意。

CREATE TABLE foo SELECT IFNULL(1,"test") as test;

在 MySQL 4.0.6 中,列 'test' 的类型为CHAR(4),然而在较早的版本

中,你得到的却是BIGINT。

NULLIF(expr1,expr2)

如果expr1 = expr2为真,返回NULL,否则返回expr1。它等同于CASE WHEN x = y THEN NULL ELSE x END:

mysql> SELECT NULLIF(1,1);

-> NULL

mysql> SELECT NULLIF(1,2);

-> 1

注意,如果参数不相等,在 MySQL 中,expr1被求值两次。

IF(expr1,expr2,expr3)

如果expr1为真(expr1 <> 0以及expr1 <> NULL),那么IF()返回

expr2,否则返回expr3。IF()返回一个数字或字符串,这取决于它被使用的语境:

mysql> SELECT IF(1>2,2,3);

-> 3

mysql> SELECT IF(1<2,'yes','no');

-> 'yes'

mysql> SELECT IF(STRCMP('test','test1'),'no','yes');

-> 'no'

如果expr2或expr3明确地为NULL,那么函数IF()的返回值类型为

非NULL列的类型。(这在选择在 MySQL 4.0.3 中新加入)。expr1是作为一个整数值被计算的,这就意味着,如果测试的是一个浮点型或字符串值,就必须进行比较操作:

mysql> SELECT IF(0.1,1,0);

-> 0

mysql> SELECT IF(0.1<>0,1,0);

-> 1

在上面第一种情况下,IF(0.1)返回0,是因为0.1被转换为一个整数

值,返回IF(0)的测试结果。这可能不是你所期望的。在第二种情况下,比较测试原浮点数是否为一个非零值。比较的结果被作为整数使用。缺

省的IF()返回值类型 (当结果存储在临时表中时,这是非常重要的) 在

略字母大小写的,那么返回值也是忽略字母大小写的(从 MySQL 3.23.51 开始)。

CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END

CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END

第一个形式当value=compare-value时返回result。第二个形式当第一个为真值的condition出现时,返回该条件的结果。如果没有匹配的结

果值,那么ELSE后的结果将被返回。如果没有ELSE部分,那么NULL被返回:

mysql> SELECT CASE 1 WHEN 1 THEN "one"

WHEN 2 THEN "two" ELSE "more" END;

-> "one"

mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END;

-> "true"

mysql> SELECT CASE BINARY "B" WHEN "a" THEN 1 WHEN "b" THEN 2 END;

-> NULL

返回值的类型 (INTEGER、DOUBLE或STRING) 与第一个返回值(第一个THEN后的表达式)的类型相同。

6.3.2 字符串函数

如果返回结果的长度超过服务器参数max_allowed_packet的大小,字符串值函数将返回NULL。查看章节 5.5.2 调节服务器参数。

对于操作字符串位置的函数,第一个位置被标记为 1。

ASCII(str)

返回字符串str最左边的那个字符的 ASCII 码值。如果str是一个空

字符串,那么返回值为0。如果str是一个NULL,返回值也是NULL:

mysql> SELECT ASCII('2');

-> 50

mysql> SELECT ASCII(2);

-> 50

mysql> SELECT ASCII('dx');

-> 100

也可参看ORD()函数。

ORD(str)

如果字符串str的最左边的字符是一个多字节的字符,根据多字节字符

的成分字符的 ASCII 码值通过下面的公式计算返回那个的编码:((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte

ASCII code...]。如果最左边的字符不是一个多字节字符,返回值与

ASCII()函数相同:

mysql> SELECT ORD('2');

-> 50

CONV(N,from_base,to_base)

在不同的数字基数之间转换数字。将数字N从from_base转换到

to_base,并以字符串表示形式返回。如果任何一个参数为NULL,那么返回值也为NULL。参数N被解释为是一个整数,但是也可以被指定为一个整数或一个字符串。最小基为2,最大基为36。如果to_base是一个负值,N将被看作为是一个有符号数字。否则,N被视为是无符号的。CONV

以 64 位精度工作:

mysql> SELECT CONV("a",16,2);

-> '1010'

mysql> SELECT CONV("6E",18,8);

-> '172'

mysql> SELECT CONV(-17,10,-18);

-> '-H'

mysql> SELECT CONV(10+"10"+'10'+0xa,10,10);

-> '40'

BIN(N)

返回N的字符串表示的二进制值形式,在这里,N长长的(BIGINT)数字。

这个函数等价于CONV(N,10,2)。如果N是一个NULL,返回值也是NULL:mysql> SELECT BIN(12);

-> '1100'

OCT(N)

返回N的字符串表示的八进制值形式,在这里,N是一个长长的数字。

这个函数等价于CONV(N,10,8)。如果N是一个NULL,返回值也是

NULL:

mysql> SELECT OCT(12);

-> '14'

HEX(N_or_S)

如果 N_OR_S 是一个数字,返回N的字符串表示的十六进制值形式,这里N是一个长长的(BIGINT)数字。这个函数等价于CONV(N,10,16)。如果 N_OR_S 是一个字符串,N_OR_S 中的每个字符均被转换为 2 位十六进制数字,并以十六进制的字符串形式返回。这是0xff形式的字符串反转操作。

mysql> SELECT HEX(255);

-> 'FF'

mysql> SELECT HEX("abc");

-> 616263

mysql> SELECT 0x616263;

-> "abc"

CHAR(N,...)

CHAR()以整数类型解释参数,返回这个整数所代表的 ASCII 码值给出的字符组成的字符串。NULL值将被忽略:

mysql> SELECT CHAR(77,121,83,81,'76');

-> 'MySQL'

mysql> SELECT CHAR(77,77.3,'77.3');

-> 'MMM'

CONCAT(str1,str2,...)

将参数连接成字符串返回。如果有任何一个参数为NULL,返回值也为

NULL。可以有超过 2 个的参数。数字参数将被转换为相等价的字符串形式:

mysql> SELECT CONCAT('My', 'S', 'QL');

-> 'MySQL'

mysql> SELECT CONCAT('My', NULL, 'QL');

-> NULL

mysql> SELECT CONCAT(14.3);

-> '14.3'

CONCAT_WS(separator, str1, str2,...)

CONCAT_WS()支持 CONCAT 加上一个分隔符,它是一个特殊形式的

CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是NULL,返回值也将为NULL。这个函数会跳过分隔符参数后的任何NULL和空字符串。分隔符将被加到被连接的字符串之间:

mysql> SELECT CONCAT_WS(",","First name","Second name","Last

Name");

-> 'First name,Second name,Last Name'

mysql> SELECT CONCAT_WS(",","First name",NULL,"Last Name");

-> 'First name,Last Name'

LENGTH(str)

OCTET_LENGTH(str)

CHAR_LENGTH(str)

CHARACTER_LENGTH(str)

返回字符串str的长度:

mysql> SELECT LENGTH('text');

-> 4

mysql> SELECT OCTET_LENGTH('text');

-> 4

注意,CHAR_LENGTH()和CHARACTER_LENGTH()对于多字节字符只计数一次。

BIT_LENGTH(str)

返回字符串str的比特长度:

mysql> SELECT BIT_LENGTH('text');

-> 32

LOCATE(substr,str)

POSITION(substr IN str)

返回子串substr在字符串str中第一次出现的位置。如果子串substr 在str中不存在,返回值为0:

mysql> SELECT LOCATE('bar', 'foobarbar');

-> 4

mysql> SELECT LOCATE('xbar', 'foobar');

-> 0

这个函数是多字节安全的。在 MySQL 3.23 中,这个函数是字母大小写敏感的,当在 MySQL 4.0 中时,如有任一参数是一个二进制字符串,它才是字母大小写敏感的。

LOCATE(substr,str,pos)

返回子串substr在字符串str中的第pos位置后第一次出现的位置。

如果substr不在str中返回0:

mysql> SELECT LOCATE('bar', 'foobarbar',5);

-> 7

这个函数是多字节安全的。在 MySQL 3.23 中,这个函数是字母大小写敏感的,当在 MySQL 4.0 中时,如有任一参数是一个二进制字符串,它才是字母大小写敏感的。

INSTR(str,substr)

返回子串substr在字符串str中第一次出现的位置。这与有两个参数形式的LOCATE()相似,只是参数的位置被颠倒了:

mysql> SELECT INSTR('foobarbar', 'bar');

-> 4

mysql> SELECT INSTR('xbar', 'foobar');

-> 0

这个函数是多字节安全的。在 MySQL 3.23 中,这个函数是字母大小写敏感的,当在 MySQL 4.0 中时,如有任一参数是一个二进制字符串,它才是字母大小写敏感的。

LPAD(str,len,padstr)

用字符串padstr对str进行左边填补直至它的长度达到len个字符

长度,然后返回str。如果str的长度长于len',那么它将被截除到len 个字符。

mysql> SELECT LPAD('hi',4,'??');

-> '??hi'

RPAD(str,len,padstr)

用字符串padstr对str进行右边填补直至它的长度达到len个字符

长度,然后返回str。如果str的长度长于len',那么它将被截除到len 个字符。

mysql> SELECT RPAD('hi',5,'?');

-> 'hi???'

LEFT(str,len)

返回字符串str中最左边的len个字符:

mysql> SELECT LEFT('foobarbar', 5);

-> 'fooba'

这个函数是多字节安全的。

RIGHT(str,len)

返回字符串str中最右边的len个字符:

mysql> SELECT RIGHT('foobarbar', 4);

-> 'rbar'

这个函数是多字节安全的。

SUBSTRING(str,pos,len)

SUBSTRING(str FROM pos FOR len)

MID(str,pos,len)

从字符串str的pos位置起返回len个字符的子串。使用FROM的变体形式是 ANSI SQL92 的句法:

mysql> SELECT SUBSTRING('Quadratically',5,6);

-> 'ratica'

这个函数是多字节安全的。

SUBSTRING(str,pos)

SUBSTRING(str FROM pos)

从字符串str的pos位置起返回子串:

mysql> SELECT SUBSTRING('Quadratically',5);

-> 'ratically'

mysql> SELECT SUBSTRING('foobarbar' FROM 4);

-> 'barbar'

这个函数是多字节安全的。

SUBSTRING_INDEX(str,delim,count)

返回字符串str中在第count个出现的分隔符delim之前的子串。如果count是一个正数,返回从最后的(从左边开始计数)分隔符到左边所

有字符。如果count是负数,返回从最后的(从右边开始计数)分隔符到右边所有字符:

mysql> SELECT SUBSTRING_INDEX('https://www.wendangku.net/doc/dc9445171.html,', '.', 2);

-> 'www.mysql'

mysql> SELECT SUBSTRING_INDEX('https://www.wendangku.net/doc/dc9445171.html,', '.', -2);

-> 'https://www.wendangku.net/doc/dc9445171.html,'

这个函数是多字节安全的。

LTRIM(str)

返回移除了领头的空格字符后的str:

mysql> SELECT LTRIM(' barbar');

-> 'barbar'

RTRIM(str)

返回移除了尾部的空格字符后的str:

mysql> SELECT RTRIM('barbar ');

-> 'barbar'

这个函数是多字节安全的。

TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)

移除字符串str中所有的remstr前缀或后缀,然后将其返回。如果没有任何BOTH、LEADING或TRAILING修饰符被给出,BOTH被假定。如果remstr没有被指定,空格将被移除:

mysql> SELECT TRIM(' bar ');

-> 'bar'

mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');

-> 'barxxx'

mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');

-> 'bar'

mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');

-> 'barx'

这个函数是多字节安全的。

SOUNDEX(str)

返回str的近音字。两个发音差不多的字符串应该有同样的近音字。一个标准的近音字为 4 个字符长,但是函数SOUNDEX()却返回一个任意长的字符串。你可以在结果上使用SUBSTRING()标准的近音字。提供的字符中所有的非数字字母的字符均被忽略。所有在 A-Z 范围之外的国际

alpha 字符被视为元音:

mysql> SELECT SOUNDEX('Hello');

-> 'H400'

mysql> SELECT SOUNDEX('Quadratically');

-> 'Q36324'

SPACE(N)

返回有N空格字符组成的字符串:

mysql> SELECT SPACE(6);

-> ' '

REPLACE(str,from_str,to_str)

在字符串str中所有出现的字符串from_str均被to_str替换,然后

返回这个字符串:

mysql> SELECT REPLACE('https://www.wendangku.net/doc/dc9445171.html,', 'w', 'Ww');

-> 'https://www.wendangku.net/doc/dc9445171.html,'

这个函数是多字节安全的。

REPEAT(str,count)

返回一个由重复了count次的字符串str组成的字符串。如果count

<= 0,返回一个空字符串。如果str或count是NULL,返回值也为

NULL:

mysql> SELECT REPEAT('MySQL', 3);

-> 'MySQLMySQLMySQL'

REVERSE(str)

以颠倒的字符顺序返回字符串str:

mysql> SELECT REVERSE('abc');

-> 'cba'

这个函数是多字节安全的。

INSERT(str,pos,len,newstr)

在字符串str中,将从pos位置开始,len个字符长的子串替换为字符串newstr,然后将结果返回:

mysql> SELECT INSERT('Quadratic', 3, 4, 'What');

-> 'QuWhattic'

这个函数是多字节安全的。

ELT(N,str1,str2,str3,...)

如果N= 1,返回str1,如果N= 2,返回str2,等等。如果N小于1或大于参数的数量,返回NULL。ELT()FIELD()反运算:

mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo');

-> 'ej'

mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo');

-> 'foo'

FIELD(str,str1,str2,str3,...)

返回str在列表str1, str2, str3, ...中的索引。如果str没有发现,返回0。FIELD()是ELT()的反运算:

mysql> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');

-> 2

mysql> SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');

-> 0

FIND_IN_SET(str,strlist)

Returns a value 如果字符串str在由N个子串组成的列表strlist

中,返回一个1到N的值。一个字符串列表是由通过字符“,”分隔的多个子串组成。如果第一个参数是一个常数字符串,并且第二个参数是一个SET列类型,FIND_IN_SET()函数将被优化为使用位运算!如果str 在不strlist中或者如果strlist是一个空串,返回值为0。如果任何一个参数为NULL,返回值也是NULL。如果第一个参数包含一个“,”,这个函数将完全不能工作:

mysql> SELECT FIND_IN_SET('b','a,b,c,d');

-> 2

MAKE_SET(bits,str1,str2,...)

返回一个集合 (包含由字符“,”分隔的多个子串组成的一个字符串),它由在bits集合中有相应的比特位的字符串组成。str1对应于比特位

0,str2对应比特位 1,等等。在str1, str2, ...中的NULL串不允

许被添加到结果中:

mysql> SELECT MAKE_SET(1,'a','b','c');

-> 'a'

mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world');

-> 'hello,world'

mysql> SELECT MAKE_SET(0,'a','b','c');

-> ''

EXPORT_SET(bits,on,off,[separator,[number_of_bits]])

返回一个字符串,对于在 'bits' 中的每个比特字位,你将得到一个 'on' 字符,而如果比特字位是一个清零比特位(reset bit)你将得到一个

'off' 字符串。每个字符串均被“分隔符”(缺省为“,”)分隔,并且只

有 'number_of_bits'(缺省为 64) 个 'bits' 被使用:

mysql> SELECT EXPORT_SET(5,'Y','N',',',4)

-> Y,N,Y,N

示例(译者注):

mysql> select EXPORT_SET(1,'1','0','',5);

-> 10000

# 最左边第一位为 2 的 0 次幂

mysql> select EXPORT_SET(2,'1','0','',5);

-> 01000

# 最左边第一位为 2 的 0 次幂,第二位为 2 的 1 次幂

mysql> select EXPORT_SET(4,'1','0','',5);

-> 00100

# 最左边第一位为 2 的 0 次幂,第二位为 2 的 1 次幂,第三位为 2 的

2 次幂

mysql> select EXPORT_SET(15,'1','0','',5);

-> 11110

# 最左边第一位为 2 的 1 次幂,第四位为 2 的 3 次幂

mysql> select EXPORT_SET(16,'1','0','',5);

-> 00001

# 最左边第一位为 2 的 1 次幂,第五位为 2 的 4 次幂

# 以上结果在 MySQL 4.0.12 中测试通过

示例结束(译者注)

LCASE(str)

LOWER(str)

依照当前字符集设置映射(缺省为 ISO-8859-1 Latin1),将字符串str

中的所有字符改变为小写,然后返回该值:

mysql> SELECT LCASE('QUADRATICALLY');

-> 'quadratically'

这个函数是多字节安全的。

UCASE(str)

UPPER(str)

依照当前字符集设置映射(缺省为 ISO-8859-1 Latin1),将字符串str

中的所有字符改变为大写,然后返回该值:

mysql> SELECT UCASE('Hej');

-> 'HEJ'

这个函数是多字节安全的。

LOAD_FILE(file_name)

读入文件,并将文件内容作为一个字符串返回。这个文件必须在服务器上,必须指定文件完整的路径名,并且你必须有FILE权限。文件必须完全可读,并且小于max_allowed_packet。如果该文件不存在,或因为上面的任一原因而不能被读出,函数返回NULL:

mysql> UPDATE tbl_name

SET blob_column=LOAD_FILE("/tmp/picture")

WHERE id=1;

如果你没有使用 MySQL 3.23,你不得不在你的应用程序中读取文件,以

文件的信息创建一个INSERT语句,来更新数据库。如果你使用 MySQL++ 库,下面有一个示例,详细请查看

https://www.wendangku.net/doc/dc9445171.html,/documentation/mysql++/mysql++-examples.htm

l。

QUOTE(str)

引用一个字符串,并返回一个结果,该结果可作为一个适当转义过的数据值在一个 SQL 语句中使用。字符串被单引号包围着返回,并且在该字符

串中每个单引号(“'”)、反斜线符号(“\”)、ASCII NUL 和 Control-Z 出现的地方,在该字符之前均被加上了一个反斜线。如果参数是NULL,

那么结果值是一个没有单引号包围的单词“NULL”。QUOTE函数在

MySQL 4.0.3 中被加入。

mysql> SELECT QUOTE("Don't");

-> 'Don\'t!'

mysql> SELECT QUOTE(NULL);

-> NULL

6.3.2.1 字符串比较函数

在必要的时候,MySQL 会自动地将数字转换到字符串,反之亦然:

mysql> SELECT 1+"1";

-> 2

mysql> SELECT CONCAT(2,' test');

-> '2 test'

如果你希望明确地将一个数字转换为字符串,将它参数传递到CONCAT()中。

如果将一个二进制字符串作为参数传递给一个字符串函数,结果返回也是一个二进制字符串。一个数字被转换到字符串,该字符串被视为是一个二进制字符串。这仅仅会影响结果。

通常,只要字符串比较中的任何一个表达式是区分大小写的,比较就会以字母大小写敏感方式执行。

expr LIKE pat [ESCAPE 'escape-char']

使用 SQL 的简单的正规表达式进行比较的模式匹配。返回1 (TRUE) 或

-> 1

mysql> SELECT 'David!' LIKE '%D%v%';

-> 1

为了测试一个含有通配符的文字实例,可以用转义符加在能配符前。如果

-> 0

mysql> SELECT 'David_' LIKE 'David\_';

-> 1

为了指定一个不同的转义字符,可以使用ESCAPE子句:

mysql> SELECT 'David_' LIKE 'David|_' ESCAPE '|';

-> 1

下面两个语句表明,字符串比较是忽略大小写的,除非任一操作数是一个二进制字符串:

mysql> SELECT 'abc' LIKE 'ABC';

-> 1

mysql> SELECT 'abc' LIKE BINARY 'ABC';

-> 0

LIKE允许用在一个数字表达式上。(这是 MySQL 对 ANSI SQL LIKE的扩展。)

mysql> SELECT 10 LIKE '1%';

-> 1

注意:因为 MySQL 在字符串中使用的是 C 的转义句法(例如“\n”),

所以在LIKE字符串中使用的任何一个“\”必须被双写。例如,为了

查找“\n”,必须以“\\n”形式指定它。为了查找“\”,必须指定它为“\\\\” (反斜线被语法分析器剥离一次,另一次在模式匹配时完

成,留下一条单独的反斜线被匹配)。

expr NOT LIKE pat [ESCAPE 'escape-char']

相同于NOT (expr LIKE pat [ESCAPE 'escape-char'])。

expr SOUNDS LIKE expr

等同于SOUNDEX(expr)=SOUNDEX(expr) (适用于 MySQL 4.1 或更新的版

本)。

expr REGEXP pat

expr RLIKE pat

依照模式pat对字符串表达式expr执行一个模式比较。模式可以是一

个扩展的正则表达式。查看章节G MySQL 正则表达式。Returns 如果表

达式expr匹配pat,返回1,否则返回0。RLIKE是REGEXP的同义词,它提供了与mSQL的兼容。注意:MySQL 在字符串中使用的是 C 的转义

句法(例如“\n”),所以在REGEXP字符串中使用的任何一个“\”必须被双写。在 MySQL 3.23.4 中,REGEXP对于正常的(不是二进制)字符

串是忽略大小写的:

mysql> SELECT 'Monty!' REGEXP 'm%y%%';

-> 0

mysql> SELECT 'Monty!' REGEXP '.*';

-> 1

mysql> SELECT 'new*\n*line' REGEXP 'new\\*.\\*line';

-> 1

mysql> SELECT "a" REGEXP "A", "a" REGEXP BINARY "A";

-> 1 0

mysql> SELECT "a" REGEXP "^[a-d]";

-> 1

当决定一个字符的类型时,REGEXP和RLIKE使用当前使用的字符集(缺

省为 ISO-8859-1 Latin1)。

expr NOT REGEXP pat

expr NOT RLIKE pat

等同于NOT (expr REGEXP pat)。

STRCMP(expr1,expr2)

如果字符串是相同,STRCMP()返回0,如果第一个参数根据当前排序次

序小于第二个参数,返回-1,否则返回1:

mysql> SELECT STRCMP('text', 'text2');

-> -1

mysql> SELECT STRCMP('text2', 'text');

-> 1

mysql> SELECT STRCMP('text', 'text');

-> 0

MATCH (col1,col2,...) AGAINST (expr)

MATCH (col1,col2,...) AGAINST (expr IN BOOLEAN MODE)

MATCH ... AGAINST()用于全文搜索,返回在列(col1,col2,...)和查询expr之间文本的相关相似的尺度。相关性是一个正的浮点型数字。零相关性意味着不相似。MATCH ... AGAINST()可用于 MySQL 3.23.23 或更新的版本中。IN BOOLEAN MODE扩展在 MySQL 4.0.1 中被新加入。详细描述和使用范例,请查看6.8 MySQL 全文搜索。

6.3.2.2 字母大小写敏感性

BINARY

BINARY操作符将跟在它后面的字符串强制作为一个二进制字符串。这可以很容易地强制一个列的比较以字母大小写敏感方式进行,即使该列没有定义为BINARY或BLOB?

mysql> SELECT "a" = "A";

-> 1

mysql> SELECT BINARY "a" = "A";

-> 0

BINARY string是CAST(string AS BINARY)的缩写。查看章节6.3.5 Cast 函数。BINARY在 MySQL 3.23.0 中被加入。注意,当将一个索引列强制为BINARY时,在某些语境中,MySQL 将不能有效地使用索引。

如果希望对一个 blob 进行忽略字母大小的比较时,你通常可以在比较前将它转换到大写:

SELECT 'A' LIKE UPPER(blob_col) FROM table_name;

我们计划不久推出在不同字符集间的转化,以使字符串比较有更好的伸缩性。

6.3.3 数字函数

6.3.3.1 算术运算

常用的算术操作符均是可用的。注意,如果两个参数均是整型,`-', `+'和`*'以BIGINT (64 位)精度运算并返回结果!如果一个参数是一个无符号的整数,另一个参数也是一个整数,结果也将是一个无符号整数。查看章节6.3.5 Cast 函数。

+

加法:

mysql> SELECT 3+5;

-> 8

-

减法:

mysql> SELECT 3-5;

-> -2

*

乘法:

mysql> SELECT 3*5;

-> 15

mysql> SELECT 18014398509481984*18014398509481984.0;

-> 324518553658426726783156020576256.0

mysql> SELECT 18014398509481984*18014398509481984;

-> 0

最后一个表达式的结果是错误的,这是因为乘法结果超过了 64 位

BIGINT计算范围。

/

除法:

mysql> SELECT 3/5;

-> 0.60

被 0 除将返回一个NULL结果:

mysql> SELECT 102/(1-1);

-> NULL

只有当在一个结果被转换到一个整数的语境中执行时,除法将会以

BIGINT进行算术计算。

6.3.3.2 数学函数

所有的数学函数在发生错误的情况下,均返回NULL。

-

一元减。改变参数的符号:

mysql> SELECT - 2;

-> -2

注意,如果这个操作符被用于一个BIGINT,返回值也是一个BIGINT!这就意味着,应该避免在一个可能有值-2^63的整数上使用-操作符!ABS(X)

返回X的绝对值:

mysql> SELECT ABS(2);

-> 2

mysql> SELECT ABS(-32);

-> 32

这个函数可安全地使用于BIGINT值。

SIGN(X)

以-1、0或1方式返回参数的符号,它取决于参数X是负数、0 或正数。

mysql> SELECT SIGN(-32);

-> -1

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 别名和自连接查询

实验4--SQL语言--SELECT查询操作

实验4--SQL语言--SELECT查询操作 1、基于?教学管理?数据库jxgl,试用SQL的查询语句表达下列查询。(1)--检索年龄大于23的男学生的学号和姓名-- select sno,sn from s where sex='男'and age > 23 (2)--检索至少选修一门课程的女学生姓名-- select sn from S,SC where sex='女' AND S.Sno=SC.Sno group by S.Sn having count(*)>=1; (3)--检索王同学没有选修的课程的课程号-- select cno from c where https://www.wendangku.net/doc/dc9445171.html,o not in (select cno from sc,s where sc.sno=s.sno and sn like'王%') (4)--检索至少选修两门课程的学生学号-- select distinct s.sno from s,sc where sc.sno=s.sno group by s.sno having count(*)>=2; (5)--检索全部学生都选修的课程的课程号与课程名-- select cno,cn from c where not exists (select*from s where not exists (select*from sc where s.sno=sc.sno and https://www.wendangku.net/doc/dc9445171.html,o=https://www.wendangku.net/doc/dc9445171.html,o)) (6)--检索选修了所有3学分课程的学生学号和姓名-- select distinct s.sno,s.sn from s,sc where exists (select*from c where ct='3'and s.sno=sc.sno and https://www.wendangku.net/doc/dc9445171.html,o=https://www.wendangku.net/doc/dc9445171.html,o) 2、基于“教学管理”数据库jxgl,试用SQL的查询语句表达下列查询。 (1)--统计有学生选修的课程门数-- select count(distinct https://www.wendangku.net/doc/dc9445171.html,o)from sc; (2)--查询选修4号课程的学生的平均年龄-- select avg(s.age) from s,sc where s.sno=sc.sno and cno='4';

整理的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

mysql中select简单查询

1.简单查询select语句(1) (1) create database chapter04; use chapter04; create table exam ( id int not null primary key default null auto_increment, name varchar(20) not null, Chinese double, math double, english double ); insert into exam values(null,'关羽',85,76,70); insert into exam values(null,'张飞',70,75,70); insert into exam values(null,'赵云',90,65,95); (2) select name,english from exam; (3) select distinct english from exam; 2.简单查询select语句(2) (1)select Chinese+10,math+10,english+10 from exam; (2)select sum(Chinese+math+english) from exam where name='关羽’;

select sum(Chinese+math+english) from exam where name='张飞’; select sum(Chinese+math+english) from exam where name='赵云’; (3)select sum(Chinese+math+english) as score from exam; 3.简单查询select语句(3) (1)select name,score from exam where name='张飞'; (2)select name,english from exam where english>90; (3)select name,score from exam where score>230; 4.简单查询select语句(4) (1)select name,english from exam where english between 80 and 100; (2)select name,math from exam where math in (75,76,77); (3)insert into exam values(null,'张三',80,70,78); select score,name from exam where name like'张%'; (4)select name,score from exam where math>70 and Chinese>80; 5.聚合函数-count (1)select count (*) from exam; (2)select count (*) from exam where math>70;

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 类型的语句,有注意到条件的前后顺序吗?我今天做个小实验。 比如查询地址里包含“海口市”及“振兴路” 两个关键字的数据,一般时候可能会用

[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(),

第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

Select 查询语句

Select 查询语句 语法:SELECT [ALL|DISTINCT] <目标列表达式> [AS 列名] [,<目标列表达式> [AS 列名] ...] FROM <表名> [,<表名>…] [WHERE <条件表达式> [AND|OR <条件表达式>...] [GROUP BY 列名[HA VING <条件表达式>> [ORDER BY 列名[ASC | DESC> 解释:[ALL|DISTINCT] ALL:全部;DISTINCT:不包括重复行 <目标列表达式> 对字段可使用A VG、COUNT、SUM、MIN、MAX、运算符等 <条件表达式> 查询条件谓词 比较=、>,<,>=,<=,!=,<>, 确定范围BETWEEN AND、NOT BETWEEN AND 确定集合IN、NOT IN 字符匹配LIKE(“%”匹配任何长度,“_”匹配一个字符)、NOT LIKE 空值IS NULL、IS NOT NULL 子查询ANY、ALL、EXISTS 集合查询UNION(并)、INTERSECT(交)、MINUS(差) 多重条件AND、OR、NOT 对查询结果分组 [HA VING <条件表达式>] 分组筛选条件 [ORDER BY 列名[ASC | DESC> 对查询结果排序;ASC:升序DESC:降序 例1:select student.sno as 学号, https://www.wendangku.net/doc/dc9445171.html, as 姓名, course as 课程名, score as 成绩from score,student where student.sid=score.sid and score.sid=:sid 例2:select student.sno as 学号, https://www.wendangku.net/doc/dc9445171.html, as 姓名,A VG(score) as 平均分from score,student where student.sid=score.sid and student.class=:class and (term=5 or term=6) group by student.sno, https://www.wendangku.net/doc/dc9445171.html, having count(*)>0 order by 平均分DESC 例3:select * from score where sid like '9634' 例4:select * from student where class in (select class from student where 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的最大值必须

Oracle数据库Select函数基本用法

1、当使用聚集函数时,SELECT中的列不出现在聚集函数中就必须出现在GROUP BY中,否则会出现语法错误;例如下列语句是非法的: SELECT department_id, COUNT(last_name) FROM employees; SELECT department_id,job_id,COUNT(last_name) FROM employees GROUP BY department_id; 2、where部分不能使用聚集函数,例如下面的查询语句是非法的: SELECT department_id, AVG(salary) FROM employees WHERE AVG(salary) > 8000 GROUP BY department_id; 3、使用HAVING关键字限制分组查询的结果,当语句含有HAVING时,先分组再执行含有聚集函数的语句,最后执行HAVING语句: SELECT department_id, MAX(salary) FROM employees GROUP BY department_id HAVING MAX(salary)>10000 ; 4、分组函数的嵌套,出现两个分组函数嵌套时,必须出现GROUP BY 语句,否则会发生错误,例如: SELECT MAX(AVG(salary)) FROM employees; 5、自然连接的练习;使用别名进行连接查询减少内存占用,提高查询效率,能区别不同表中的相同列; NATURAL JOIN 基于不同表中的相同名字的列,当相同名字的列数据类型不同时,就会返回错误信息。 因为表departments、locations中都含有location_id,故可进行如下自然连接查询: SELECT department_id, department_name,, city FROM departments NATURAL JOIN locations ; 6、当具有相同名称的列数据类型不同时可使用USING关键字;当用多列同时满足条件时,可使用USING关键字只匹配其中的一列。 不能对USING关键字后的列进行限制,如下列语句是错误的: SELECT l.city, d.department_name FROM locations l JOIN departments d USING (location_id) WHERE d.location_id = 1400; 7、ON关键字的练习 SELECT e.employee_id,https://www.wendangku.net/doc/dc9445171.html,st_name,e.department_id,d.department_id, d.location_id FROM employees e JOIN departments d ON (e.department_id = d.department_id);

相关文档