Mysql 数据类型和函数

知识点
数据类型分类

CHAR       VARCHAR       int       float       DATETIME      TIMESTAMP    TEXT        Blob  

函数

avg() 求平均值       count() 求返回的记录行数  max() 计算最大值  min() 计算最小值      sum() 求和      分组函数的空值 NULL    分组函数中的反复值   GROUP BY 子句     

除了sql之外,还整顿了一些Java根底等一系列的内容,欢送大家来探讨!!!

  1. 数据类型分类

    1. 字符类型
      CHAR 10 admin 10
      VARCHAR 10 admin 5
    2. 数值类型
      int
      float
    3. 日期类型
      DATE 准确到秒
      DATETIME
      TIMESTAMP 准确到毫秒
    4. 其余类型
      BLOB
    5. 字符数据类型

      1. CHAR

      2. VARCHAR

      3. float

      4.int

      1. 日期数据类型

      总结: 理论罕用的类型 CHAR VARCHAR , int ,float, DATE ,datetime,TIMESTAMP 大文本 text, 秘密或文件二进制数据用 : BLOB

      创立一个客户表 customer
      CREATE TABLE customer
      (
      id int(10),
      name VARCHAR(10),
      fund float(10,2),
      reg_time DateTime,
      oper_time timestamp,
      content text

       );
  2. 函数

    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' 

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'

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()仅计算一次。
LOCATE(substr,str)
 
POSITION(substr IN str)
返回子串substr在字符串str第一个呈现的地位,如果substr不是在str外面,返回0.
mysql> select LOCATE('bar', 'foobarbar');

  -> 4

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

  -> 0

该函数是多字节牢靠的。
LOCATE(substr,str,pos)
返回子串substr在字符串str第一个呈现的地位,从地位pos开始。如果substr不是在str外面,返回0。
mysql> select LOCATE('bar', 'foobarbar',5);

  -> 7

这函数是多字节牢靠的。

INSTR(str,substr)
返回子串substr在字符串str中的第一个呈现的地位。这与有2个参数模式的LOCATE()雷同,除了参数被颠倒。
mysql> select INSTR('foobarbar', 'bar');

  -> 4

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

  -> 0

这函数是多字节牢靠的。

LPAD(str,len,padstr)
返回字符串str,右面用字符串padstr填补直到str是len个字符长。
mysql> select LPAD('hi',4,'??');

  -> '??hi'

RPAD(str,len,padstr)
返回字符串str,右面用字符串padstr填补直到str是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返回一个len个字符的子串,从地位pos开始。应用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('www.mysql.com', '.', 2);

  -> 'www.mysql'

mysql> select SUBSTRING_INDEX('www.mysql.com', '.', -2);

  -> 'mysql.com'

该函数对多字节是牢靠的。

LTRIM(str)
返回删除了其前置空格字符的字符串str。
mysql> select LTRIM(' barbar');

  -> 'barbar'

RTRIM(str)

返回删除了其拖后空格字符的字符串str。
mysql> select RTRIM('barbar ');

  -> 'barbar'

该函数对多字节是牢靠的。
TRIM([[BOTH | LEA

DING | 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的一个同音字符串。听起来“大致相同”的2个字符串应该有雷同的同音字符串。
一个“规范”的同音字符串长是4个字符,然而SOUNDEX()函数返回一个任意长的字符串。
你能够在后果上应用SUBSTRING()失去一个“规范”的 同音串。所有非数字字母字符在给定的字符串中被疏忽。所有在A-Z之外的字符国内字母被当作元音。
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('www.mysql.com', 'w', 'Ww');

  -> 'WwWwWw.mysql.com'

该函数对多字节是牢靠的。

REPEAT(str,count)
返回由反复countTimes次的字符串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)
如果字符串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)的位,
你失去一个“off”字符串。每个字符串用“separator”分隔(缺省“,”),并且只有“bits”的“number_of_bits” (缺省64)位被应用。
mysql> select EXPORT_SET(5,'Y','N',',',4)

  -> Y,N,Y,N 

LCASE(str)
 
LOWER(str)
返回字符串str,依据以后字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符扭转成小写。该函数对多字节是牢靠的。
mysql> select LCASE('QUADRATICALLY');

  -> 'quadratically'

UCASE(str)
 
UPPER(str)
返回字符串str,依据以后字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符扭转成大写。该函数对多字节是牢靠的。
mysql> select UCASE('Hej');

  -> 'HEJ' 

MySQL必要时主动变换数字为字符串,并且反过来也如此:
mysql> SELECT 1+"1";

  -> 2

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

  -> '2 test'

如果你想要明确地变换一个数字到一个字符串,把它作为参数传递到CONCAT()。
如果字符串函数提供一个二进制字符串作为参数,后果字符串也是一个二进制字符串。被变换到一个字符串的数字被当作是一个二进制字符串。这仅影响比拟

                                     mysql 工夫函数用法汇合这里是一个应用日期函数的例子。上面的查问抉择了所有记录,其date_col的值是在最初30天以内:   mysql> SELECT something FROM table  WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;    DAYOFWEEK(date)    返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。这些索引值对应于ODBC规范。    mysql> select DAYOFWEEK('1998-02-03');    -> 3    WEEKDAY(date)    返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。    mysql> select WEEKDAY('1997-10-04 22:23:00');    -> 5    mysql> select WEEKDAY('1997-11-05');    -> 2    DAYOFMONTH(date)    返回date的月份中日期,在1到31范畴内。    mysql> select DAYOFMONTH('1998-02-03');    -> 3    DAYOFYEAR(date)    返回date在一年中的日数, 在1到366范畴内。    mysql> select DAYOFYEAR('1998-02-03');    -> 34    MONTH(date)    返回date的月份,范畴1到12。    mysql> select MONTH('1998-02-03');    -> 2    DAYNAME(date)    返回date的星期名字。    mysql> select DAYNAME("1998-02-05");    -> 'Thursday'  MONTHNAME(date)    返回date的月份名字。    mysql> select MONTHNAME("1998-02-05");    -> 'February'  QUARTER(date)    返回date一年中的季度,范畴1到4。    mysql> select QUARTER('98-04-01');    -> 2    WEEK(date)         WEEK(date,first)    对于星期天是一周的第一天的中央,有一个单个参数,返回date的周数,范畴在0到52。2个参数模式WEEK()容许你指定星期是否开始于星期天或星期一。

如果第二个参数是0,星期从星期天开始,如果第二个参数是1,从星期一开始。

  mysql> select WEEK('1998-02-20');    -> 7    mysql> select WEEK('1998-02-20',0);    -> 7    mysql> select WEEK('1998-02-20',1);    -> 8    YEAR(date)    返回date的年份,范畴在1000到9999。    mysql> select YEAR('98-02-03');    -> 1998    HOUR(time)    返回time的小时,范畴是0到23。    mysql> select HOUR('10:05:03');    -> 10    MINUTE(time)    返回time的分钟,范畴是0到59。    mysql> select MINUTE('98-02-03 10:05:03');    -> 5    SECOND(time)    回来time的秒数,范畴是0到59。    mysql> select SECOND('10:05:03');    -> 3    PERIOD_ADD(P,N)    减少N个月到阶段P(以格局YYMM或YYYYMM)。以格局YYYYMM返回值。留神阶段参数P不是日期值。    mysql> select PERIOD_ADD(9801,2);    -> 199803    PERIOD_DIFF(P1,P2)    返回在期间P1和P2之间月数,P1和P2应该以格局YYMM或YYYYMM。留神,期间参数P1和P2不是日期值。    mysql> select PERIOD_DIFF(9802,199703);    -> 11    DATE_ADD(date,INTERVAL expr type)         DATE_SUB(date,INTERVAL expr type)         ADDDATE(date,INTERVAL expr type)         SUBDATE(date,INTERVAL expr type)    这些性能执行日期运算。对于MySQL 3.22,他们是新的。ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同义词。   在MySQL 3.23中,你能够应用+和-而不是DATE_ADD()和DATE_SUB()。(见例子)date是一个指定开始日期的   DATETIME或DATE值,expr是指定加到开始日期或从开始日期减去的距离值一个表达式,expr是一个字符串;它能够以   一个“-”开始示意负距离。type是一个关键词,指明表达式应该如何被解释。EXTRACT(type FROM date)函数从日期   中返回“type”距离。下表显示了type和expr参数怎么被关联: type值 含意 冀望的expr格局    SECOND 秒 SECONDS    MINUTE 分钟 MINUTES    HOUR 工夫 HOURS    DAY 天 DAYS    MONTH 月 MONTHS    YEAR 年 YEARS    MINUTE_SECOND 分钟和秒 "MINUTES:SECONDS"  HOUR_MINUTE 小时和分钟 "HOURS:MINUTES"  DAY_HOUR 天和小时 "DAYS HOURS"  YEAR_MONTH 年和月 "YEARS-MONTHS"  HOUR_SECOND 小时, 分钟, "HOURS:MINUTES:SECONDS"  DAY_MINUTE 天, 小时, 分钟 "DAYS HOURS:MINUTES"  DAY_SECOND 天, 小时, 分钟, 秒 "DAYS HOURS:MINUTES:SECONDS"  MySQL在expr格局中容许任何标点分隔符。示意显示的是倡议的分隔符。

如果date参数是一个DATE值并且你的计算仅仅蕴含YEAR、MONTH和DAY局部(即,没有工夫局部),后果是一个DATE值。否则后果是一个DATETIME值。

  mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;    -> 1998-01-01 00:00:00    mysql> SELECT INTERVAL 1 DAY + "1997-12-31";    -> 1998-01-01    mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND;    -> 1997-12-31 23:59:59    mysql> SELECT DATE_ADD("1997-12-31 23:59:59",    INTERVAL 1 SECOND);    -> 1998-01-01 00:00:00    mysql> SELECT DATE_ADD("1997-12-31 23:59:59",    INTERVAL 1 DAY);    -> 1998-01-01 23:59:59    mysql> SELECT DATE_ADD("1997-12-31 23:59:59",    INTERVAL "1:1" MINUTE_SECOND);    -> 1998-01-01 00:01:00    mysql> SELECT DATE_SUB("1998-01-01 00:00:00",    INTERVAL "1 1:1:1" DAY_SECOND);    -> 1997-12-30 22:58:59    mysql> SELECT DATE_ADD("1998-01-01 00:00:00",    INTERVAL "-1 10" DAY_HOUR);    -> 1997-12-30 14:00:00    mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);    -> 1997-12-02    mysql> SELECT EXTRACT(YEAR FROM "1999-07-02");    -> 1999    mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");    -> 199907    mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");    -> 20102    如果你指定太短的距离值(不包含type关键词冀望的距离局部),MySQL假如你省掉了距离值的最右面局部。

例如,如果你指定一个type是DAY_SECOND,值expr被心愿有天、小时、分钟和秒局部。
如果你象"1:10"这样指定值,MySQL假如日子和小时局部是失落的并且值代表分钟和秒。换句话说,"1:10" DAY_SECOND以它等价于"1:10" MINUTE_SECOND的形式解释,
这对那MySQL解释TIME值示意通过的工夫而非作为一天的工夫的形式有二义性。如果你应用的确不正确的日期,后果是NULL。
如果你减少MONTH、YEAR_MONTH或YEAR并且后果日期大于新月份的最大值天数,日子在新月用最大的天调整。

  mysql> select DATE_ADD('1998-01-30', Interval 1 month);    -> 1998-02-28    留神,从后面的例子中词INTERVAL和type关键词不是辨别大小写的。      TO_DAYS(date)    给出一个日期date,返回一个天数(从0年的天数)。    mysql> select TO_DAYS(950501);    -> 728779    mysql> select TO_DAYS('1997-10-07');    -> 729669    TO_DAYS()  不打算用于应用格列高里历(1582)呈现前的值。   FROM_DAYS(N)    给出一个天数N,返回一个DATE值。    mysql> select FROM_DAYS(729669);    -> '1997-10-07'  DATE_FORMAT(date,format)    依据format字符串格式化date值。下列修饰符能够被用在format字符串中: %M 月名字(January……December)  

%W 星期名字(Sunday……Saturday)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun……Sat)
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(Jan……Dec)
%j 一年中的天数(001……366)
%H 小时(00……23)
%k 小时(0……23)
%h 小时(01……12)
%I 小时(01……12)
%l 小时(1……12)
%i 分钟, 数字(00……59)
%r 工夫,12 小时(hh:mm:ss [AP]M)
%T 工夫,24 小时(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一个星期中的天数(0=Sunday ……6=Saturday )
%U 星期(0……52), 这里星期天是星期的第一天
%u 星期(0……52), 这里星期一是星期的第一天
%% 一个文字“%”。

  所有的其余字符不做解释被复制到后果中。   mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');    -> 'Saturday October 1997'  mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');    -> '22:23:00'  mysql> select DATE_FORMAT('1997-10-04 22:23:00',    '%D %y %a %d %m %b %j');    -> '4th 97 Sat 04 10 Oct 277'  mysql> select DATE_FORMAT('1997-10-04 22:23:00',    '%H %k %I %r %T %S %w');    -> '22 22 10 10:23:00 PM 22:23:00 00 6'  MySQL3.23中,在格局修饰符字符前须要%。在MySQL更早的版本中,%是可选的。   TIME_FORMAT(time,format)    这象下面的DATE_FORMAT()函数一样应用,然而format字符串只能蕴含解决小时、分钟和秒的那些格局修饰符。其余修饰符产生一个NULL值或0。      CURDATE()         CURRENT_DATE  以'YYYY-MM-DD'或YYYYMMDD格局返回明天日期值,取决于函数是在一个字符串还是数字上下文被应用。    mysql> select CURDATE();    -> '1997-12-15'  mysql> select CURDATE() + 0;    -> 19971215    CURTIME()         CURRENT_TIME  以'HH:MM:SS'或HHMMSS格局返回以后工夫值,取决于函数是在一个字符串还是在数字的上下文被应用。    mysql> select CURTIME();    -> '23:50:26'  mysql> select CURTIME() + 0;    -> 235026    NOW()         SYSDATE()         CURRENT_TIMESTAMP  以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格局返回以后的日期和工夫,取决于函数是在一个字符串还是在数字的上下文被应用。    mysql> select NOW();    -> '1997-12-15 23:50:26'  mysql> select NOW() + 0;    -> 19971215235026    UNIX_TIMESTAMP()         UNIX_TIMESTAMP(date)    如果没有参数调用,返回一个Unix工夫戳记(从'1970-01-01 00:00:00'GMT开始的秒数)。

如果UNIX_TIMESTAMP()用一个date参数被调用,它返回从'1970-01-01 00:00:00' GMT开始的秒数值。
date能够是一个DATE字符串、一个DATETIME字符串、一个TIMESTAMP或以YYMMDD或YYYYMMDD格局的本地工夫的一个数字。

  mysql> select UNIX_TIMESTAMP();    -> 882226357    mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00');    -> 875996580    当UNIX_TIMESTAMP被用于一个TIMESTAMP列,函数将间接承受值,没有隐含的“string-to-unix-timestamp”变换。   FROM_UNIXTIME(unix_timestamp)    以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格局返回unix_timestamp参数所示意的值,取决于函数是在一个字符串还是或数字上下文中被应用。    mysql> select FROM_UNIXTIME(875996580);    -> '1997-10-04 22:23:00'  mysql> select FROM_UNIXTIME(875996580) + 0;    -> 19971004222300    FROM_UNIXTIME(unix_timestamp,format)    返回示意 Unix 工夫标记的一个字符串,依据format字符串格式化。format能够蕴含与DATE_FORMAT()函数列出的条目同样的修饰符。    mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(),    '%Y %D %M %h:%i:%s %x');    -> '1997 23rd December 03:43:30 x'  SEC_TO_TIME(seconds)    返回seconds参数,变换成小时、分钟和秒,值以'HH:MM:SS'或HHMMSS格式化,取决于函数是在一个字符串还是在数字上下文中被应用。    mysql> select SEC_TO_TIME(2378);    -> '00:39:38'  mysql> select SEC_TO_TIME(2378) + 0;    -> 3938    TIME_TO_SEC(time)    返回time参数,转换成秒。    mysql> select TIME_TO_SEC('22:23:00');    -> 80580    mysql> select TIME_TO_SEC('00:39:38');    -> 2378   Mysql取零碎函数:  Select curtime();  Select curdate():  Select sysdate():  select now();
  1. 分组函数
    avg() 求平均值

    //返回所有员工的工资
       SELECT avg(salary) FROM emp;      count() 求返回的记录行数      //返回所有员工的记录行数       SELECT count(*) FROM emp;       SELECT count(1) FROM emp;       SELECT count(id) FROM emp;       max() 计算最大值      //返回所有员工工资的最大数      SELECT max(salary) FROM emp;       min() 计算最小值      //返回所有员工工资的最小数      SELECT min(salary) FROM emp;           sum() 求和      //返回所有员工工资的总和      SELECT sum(salary) FROM emp;           DISTINCT() 去掉反复,不反复的记录数    返回员工的部门编号, 去掉反复的编号    SELECT DISTINCT(dept_id) FROM emp;       返回员工,不反复的部门数量    SELECT count(DISTINCT(dept_id)) FROM emp;
  1. 分组函数的空值 NULL
    除了 count(1),count(*) 外所有其余分组函数疏忽空值
    向 emp 插入一条 salary 为NULL 的记录
    INSERT INTO emp(id,name)VALUES(9,'晓巍');

查问出emp 所有工资不为空的员工的总工资, 平均工资

   SELECT sum(salary),count(*),avg(salary) FROM emp;SELECT sum(salary),count(1),avg(salary) FROM emp;SELECT sum(salary),count(id),avg(salary) FROM emp;   SELECT sum(salary),count(salary),avg(salary) FROM emp;理论利用中如果要将空值纳入到分组统计计算 能够应用 nvl 函数转换SELECT sum(nvl(salary,0)),count(nvl(salary,0)),avg(nvl(salary,0)) FROM emp;
  1. 分组函数中的反复值
    DISTINCT 过滤掉反复值
    ALL 不过滤掉反复值

    SELECT sum(salary),count(salary),avg(salary) FROM emp;
    SELECT sum(ALL(salary)),count(ALL(salary)),avg(ALL(salary)) FROM emp;
    SELECT sum(DISTINCT(salary)),count(DISTINCT(salary)),avg(DISTINCT(salary)) FROM emp;

  2. GROUP BY 子句
    SELECT 字段名 | 表达式,分组函数 ...
    FROM 表名
    [WHERE 查问条件]
    [GROUP BY 分组字段列表]
    [ORDER BY 排序字段列表]

WHERE 子句最先执行, 而后 GROUP BY 子句分组 , ORDER BY 子句对分组的后果排序最初执行

  1. 基于单字段分组

计算每个部门的平均工资
SELECT dept_id,avg(salary) FROM emp GROUP BY dept_id;

计算每个部门的平均工资, 按部门编号倒序排列
SELECT dept_id,avg(salary) FROM emp GROUP BY dept_id ORDER BY dept_id DESC;

计算每个部门的平均工资, 按平均工资倒序排列
SELECT dept_id,avg(salary) FROM emp GROUP BY dept_id ORDER BY avg(salary) DESC;

分组中用别名
SELECT dept_id,avg(salary) avg_salary FROM emp GROUP BY dept_id ORDER BY avg_salary DESC;

留神: 应用分组函数时, 呈现在 SELECT 列表中的字段如果不蕴含在组函数中, 那么该字段必须同时在 GROUP BY 字句中呈现,
反之蕴含在 GROUP BY 子句中的字段则不必须呈现在 SELECT 列表中.

//谬误
SELECT dept_id,name,avg(salary) FROM emp GROUP BY dept_id;

//正确
SELECT avg(salary) FROM emp GROUP BY dept_id;

// 分组时能够用WHERE 语句
SELECT dept_id,avg(salary) FROM emp WHERE salary>5000 GROUP BY dept_id;

但WHERE条件不容许用分组函数
//谬误 起因是WHERE 语句先执行 数据还没有分组
SELECT dept_id,avg(salary) FROM emp WHERE avg(salary)>5000 GROUP BY dept_id;

//解决办法: 分组条件判断 HAVING 子句

  SELECT dept_id,avg(salary)  FROM emp GROUP BY dept_id HAVING avg(salary)>5000;

WHERE 和 GROUP BY 先判断再分组 并且WHERE 不能用分组函数
GROUP BY 和 Having 先分组再 判断 Having 能够用分组函数

  1. 两个表关联分组

    计算每个部门的平均工资,显示出部门名称SELECT a.name,avg(b.salary)  FROM dept a,emp b WHERE a.id=b.dept_id GROUP BY a.name;