Mysql之数据类型

1.  数值类型   

类型

大小

范围(有符号)

范围(无符号)

用途

TINYINT

1 字节

(-128,127)(负号占了一数字位)

(0,255)

小整数值

SMALLINT

2 字节

(-32 768,32 767)

(0,65 535)

大整数值

MEDIUMINT

3 字节

(-8 388 608,8 388 607)

(0,16 777 215)

大整数值

INT或INTEGER

4 字节

(-2 147 483 648,2 147 483 647)

(0,4 294 967 295)

大整数值

BIGINT

8 字节

(-9 233 372 036 854 775 808,9 223 372 036 854 775 807)

(0,18 446 744 073 709 551 615)

极大整数值

FLOAT

4 字节

(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)

0,(1.175 494 351 E-38,3.402 823 466 E+38)

单精度
浮点数值

DOUBLE

8 字节

(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)

0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)

双精度
浮点数值

DECIMAL

对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2

依赖于M和D的值

依赖于M和D的值

小数值

整数型结论:整型默认使用的是有符号的。

   整型是有范围的。

   整型的宽度指的是显示宽度,不是存储宽度。显示宽度只是指明mysql最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充;如果插入了大鱼显示宽度的值,只要该值不超过该类型的取值范围,数值依然可以插入,并且能够显示出来。

 

浮点数类型(默认会按照实际的精度)
定点数类型(默认精度为(10,0))
货币,科学数据使用DECIMAL类型比较好

2.  字符类型

类型

大小

用途

CHAR

0-255字节

定长字符串

VARCHAR

0-65535 字节

变长字符串

TINYBLOB

0-255字节

不超过 255 个字符的二进制字符串

TINYTEXT

0-255字节

短文本字符串

BLOB

0-65 535字节

二进制形式的长文本数据

TEXT

0-65 535字节

长文本数据

MEDIUMBLOB

0-16 777 215字节

二进制形式的中等长度文本数据

MEDIUMTEXT

0-16 777 215字节

中等长度文本数据

LONGBLOB

0-4 294 967 295字节

二进制形式的极大文本数据

LONGTEXT

0-4 294 967 295字节

极大文本数据

    1.  char和varchar类型的存储区别

        

create table temp1 (ch char(4),vch varchar(4));
insert into temp1 values('ab  ','ab  ');
select concat('(',ch,')'),concat('(',vch,')') from temp1;
char类型把后面的空格删除了,varchar类型后面的空格还保留。

结论:char(5)   只能存5个字符。简单粗暴,浪费空间,存取速度快。

    varchar(5)  节省空间,存取速度慢

   1-2bytes+a

   字符类型的宽度是存取的值的宽度。

3.  时间类型

类型

大小
(字节)

范围

格式

用途

DATE

3

1000-01-01/9999-12-31

YYYY-MM-DD

日期值

TIME

3

'-838:59:59'/'838:59:59'

HH:MM:SS

时间值或持续时间

YEAR

1

1901/2155

YYYY

年份值

DATETIME

8

1000-01-01 00:00:00/9999-12-31 23:59:59

YYYY-MM-DD HH:MM:SS

混合日期和时间值

TIMESTAMP

4

1970-01-01 00:00:00/2038

结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07

YYYYMMDD HHMMSS

混合日期和时间值,时间戳

 

    1.  如何分隔时间类型?

   老师的博客地址:http://www.cnblogs.com/yuanchenqi/articles/7250680.html

CURDATE()或CURRENT_DATE() 返回当前的日期
CURTIME()或CURRENT_TIME() 返回当前的时间
DATE_ADD(date,INTERVAL int keyword)返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:SELECTDATE_ADD(CURRENT_DATE,INTERVAL 6 MONTH);
DATE_FORMAT(date,fmt)  依照指定的fmt格式格式化日期date值
DATE_SUB(date,INTERVAL int keyword)返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:SELECTDATE_SUB(CURRENT_DATE,INTERVAL 6 MONTH);
DAYOFWEEK(date)   返回date所代表的一星期中的第几天(1~7)
DAYOFMONTH(date)  返回date是一个月的第几天(1~31)
DAYOFYEAR(date)   返回date是一年的第几天(1~366)
DAYNAME(date)   返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);
FROM_UNIXTIME(ts,fmt)  根据指定的fmt格式,格式化UNIX时间戳ts
HOUR(time)   返回time的小时值(0~23)
MINUTE(time)   返回time的分钟值(0~59)
MONTH(date)   返回date的月份值(1~12)
MONTHNAME(date)   返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE);
NOW()    返回当前的日期和时间
QUARTER(date)   返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);
WEEK(date)   返回日期date为一年中第几周(0~53)
YEAR(date)   返回日期date的年份(1000~9999)

      select DATE_FORMAT(d,"%Y/%m")  from 表

      结果就是:2018/03

4.  枚举类型

   enum('male','female')   单选

   set('play','read')  多选

5.  如何选择数据类型

    1.  整数和浮点数

        根据用户需求,选择对应的整数类型;小数类型为float类型,如果要求精度高,优先选择DOUBLE。

    2.  浮点数和定点数

        对于精度要求更高的话,选择DECIMAL类型。如果进行数值比较,还是选择DECIMAL类型。

    3.  日期与时间类型

        只记录年份,使用YEAR类型

        只记录时间,使用TIME类型

        记录日期和时间,使用TIMESTAMP或者DATETIME。TIMESTAMP比DATETIME取值范围小。    

    4.  CHAR与VARCHAR

        CHAR是固定长度字符,VARCHAR是可变长度字符

        CHAR会自动删除插入数据的尾部空格,VARCHAR不会删除尾部空格

        对于MyISAM存储引擎,最好使用CHAR,可以使整个表静态化,从而使数据检索更快

        对于InnoDB存储引擎,使用VARCHAR,比较节省空间,对磁盘I/O和数据存储总量比较好。

    5.  ENUM和SET

        ENUM只能取单值。

        SET可取多值。

    6.  BLOB和TEXT

        BLOB是二进制字符串,主要存储图片,音频信息

        TEXT是非二进制字符串,只能存储纯文本文件

    7.  各表使用一致的数据类型

    8.  选择更短的数据类型

    9.  简单的数据类型能够进行更快的处理

    10.  尽可能避免NULL值

6.  运算符

    1.  算术运算符

        

        1.  例子:     

mysql> select num+2,num-2,num*2,num/2,num%2 from temp2;
+-------+-------+-------+---------+-------+
| num+2 | num-2 | num*2 | num/2   | num%2 |
+-------+-------+-------+---------+-------+
|    52 |    48 |   100 | 25.0000 |     0 |
|   102 |    98 |   200 | 50.0000 |     0 |
+-------+-------+-------+---------+-------+
2 rows in set (0.00 sec)   

    2.  比较运算符

        

        1.  等于运算符(=)

            用来判断数字,字符串和表达式是否相等。如果相等,则返回值为1,否则返回值为0.

            例子:  select 1=1,1='1','a'='b','b'='b',(1+5)=(2+4);   

+-----+-------+---------+---------+-------------+
| 1=1 | 1='1' | 'a'='b' | 'b'='b' | (1+5)=(2+4) |
+-----+-------+---------+---------+-------------+
| 1 | 1 | 0 | 1 | 1 |
+-----+-------+---------+---------+-------------+

            注意:  字符'1',进行判断时候,mysql把它转换成1   

                 字符串必须使用引号,否则报错。 ERROR 1054 (42S22): Unknown column 'b' in 'field list'

                 若有一个或者两个参数为NULL,则比较运算的结果为NULL

        2.  安全等于运算符(<=>)

            此操作符与=号一样,不过<=>可以用来判断NULL值。在两个操作数均为NULL,其返回值为1而不为NULL;当一个操作数为NULL时,其返回值为0而不为NULL

            例子:  select 1=1,1='1','a'='b','b'='b',(1+5)=(2+4),NULL<=>NULL,NULL<=>1;           

+-----+-------+---------+---------+-------------+-------------+----------+
| 1=1 | 1='1' | 'a'='b' | 'b'='b' | (1+5)=(2+4) | NULL<=>NULL | NULL<=>1 |
+-----+-------+---------+---------+-------------+-------------+----------+
| 1 | 1 | 0 | 1 | 1 | 1 | 0 |
+-----+-------+---------+---------+-------------+-------------+----------+     

注意:  当比较数字和字符串,表达式的时候,那么它与=的结果一样,但是比较NULL的时候,就不一样了。 

        3.  不等于运算符(<>或者!=)

            此操作符用来判断数字,字符,表达式是否不相等。如果不相等,返回值为1;否则,返回值为0.不能判断NULL

            例子:  select 1!=1,1!='1','a'!='b','b'!='b',(1+5)!=(3+4),NULL!=NULL,NULL<>1;

+------+--------+----------+----------+--------------+------------+---------+
| 1!=1 | 1!='1' | 'a'!='b' | 'b'!='b' | (1+5)!=(3+4) | NULL!=NULL | NULL<>1 |
+------+--------+----------+----------+--------------+------------+---------+
| 0 | 0 | 1 | 0 | 1 | NULL | NULL |
+------+--------+----------+----------+--------------+------------+---------+ 

        4.  小于或等于运算符(<=)                       

mysql> select 1<=1,1<=0,'a'<='b','b'<='a';
+------+------+----------+----------+
| 1<=1 | 1<=0 | 'a'<='b' | 'b'<='a' |
+------+------+----------+----------+
| 1 | 0 | 1 | 0 |
+------+------+----------+----------+

注意:数字比大小,字符比顺序(按照英文字母顺序)

   比较NULL,返回NULL

        5.  小于运算符(<) 

mysql> select 1<1,1<0,'a'<'b','b'<'a';
+-----+-----+---------+---------+
| 1<1 | 1<0 | 'a'<'b' | 'b'<'a' |
+-----+-----+---------+---------+
| 0 | 0 | 1 | 0 |
+-----+-----+---------+---------+

注意:比较NULL,返回NULL

        6.  大于或等于运算符(>=)

mysql> select 1>=1,1>=0,'a'>='b','b'>='a',NULL>=NULL;
+------+------+----------+----------+------------+
| 1>=1 | 1>=0 | 'a'>='b' | 'b'>='a' | NULL>=NULL |
+------+------+----------+----------+------------+
| 1 | 1 | 0 | 1 | NULL |
+------+------+----------+----------+------------+                    

        7.  大于运算符(>) 

mysql> select 1>1,1>0,'a'>'b','b'>'a',NULL>NULL;
+-----+-----+---------+---------+-----------+
| 1>1 | 1>0 | 'a'>'b' | 'b'>'a' | NULL>NULL |
+-----+-----+---------+---------+-----------+
| 0 | 1 | 0 | 1 | NULL |
+-----+-----+---------+---------+-----------+  

        8.  is NULL, isnull, is not null        

mysql> select null is NULL,isnull(null),isnull(10),10 is not null,null is not null;
+--------------+--------------+------------+----------------+------------------+
| null is NULL | isnull(null) | isnull(10) | 10 is not null | null is not null |
+--------------+--------------+------------+----------------+------------------+
| 1 | 1 | 0 | 1 | 0 |
+--------------+--------------+------------+----------------+------------------+

        9.  BETWEEN AND  区间判断

mysql> select 4 between 4 and 10,10 between 4 and 10;
+--------------------+---------------------+
| 4 between 4 and 10 | 10 between 4 and 10 |
+--------------------+---------------------+
| 1 | 1 |
+--------------------+---------------------+

        10.  LEAST  取最小值

            取最小值的运算符,如果值有一个为NULL,则返回值为NULL

mysql> select least(38,383,38385696,384522787),least('a','b','d','y','ww'),least(null,'a','1');
+----------------------------------+-----------------------------+---------------------+
| least(38,383,38385696,384522787) | least('a','b','d','y','ww') | least(null,'a','1') |
+----------------------------------+-----------------------------+---------------------+
| 38 | a | NULL |
+----------------------------------+-----------------------------+---------------------+  

        11.  GREATEST  取最大值

            取最大值的运算符,如果值有一个为NULL,则返回值为NULL 

mysql> select greatest(38,383,38385696,384522787),greatest('a','b','d','y','ww'),greatest(null,'a','1');
+-------------------------------------+--------------------------------+------------------------+
| greatest(38,383,38385696,384522787) | greatest('a','b','d','y','ww') | greatest(null,'a','1') |
+-------------------------------------+--------------------------------+------------------------+
| 384522787 | y | NULL |
+-------------------------------------+--------------------------------+------------------------+

        12.  IN,NOT IN   

mysql> select 5 in (1, 2, 4, 6), 'ab' in ('bc','ab','sdsfsdf'), 8 not in (1, 22,33);
+-------------------+-------------------------------+---------------------+
| 5 in (1, 2, 4, 6) | 'ab' in ('bc','ab','sdsfsdf') | 8 not in (1, 22,33) |
+-------------------+-------------------------------+---------------------+
| 0 | 1 | 1 |
+-------------------+-------------------------------+---------------------+         

        13.  LIKE

            用来匹配字符串

            LIKE %  匹配任何字符

            LIKE _  匹配单一字符

mysql> select 'a' like 'b%a';
+----------------+
| 'a' like 'b%a' |
+----------------+
| 0 |
+----------------+
1 row in set (0.00 sec)

mysql> select 'a' like 'a%';
+---------------+
| 'a' like 'a%' |
+---------------+
| 1 |
+---------------+
1 row in set (0.00 sec)

mysql> select 'a' like 'a_';
+---------------+
| 'a' like 'a_' |
+---------------+
| 0 |
+---------------+
1 row in set (0.00 sec)                       

        14.  REGEXP

            ^  匹配以某个字符开头的字符串

            $  匹配以某个字符结尾的字符串

            .  匹配任何一个单一字符

            [...]  匹配在括号内的任何字符

            *  匹配任何数量的任何字符           

mysql> select 'a' regexp '^a','ab' regexp 'b$','abcefgg' regexp '[abc]','sdffsdf' regexp 'a.c';
+-----------------+------------------+--------------------------+------------------------+
| 'a' regexp '^a' | 'ab' regexp 'b$' | 'abcefgg' regexp '[abc]' | 'sdffsdf' regexp 'a.c' |
+-----------------+------------------+--------------------------+------------------------+
| 1 | 1 | 1 | 0 |
+-----------------+------------------+--------------------------+------------------------+                                                                                 

    3.  逻辑运算符

        

 

 

        1.  NOT或者!

            表示当操作数为0时,返回值为1,不为0时,返回值为0,为null时,返回值为null.            

mysql> select not 10,not 0,not null;
+--------+-------+----------+
| not 10 | not 0 | not null |
+--------+-------+----------+
| 0 | 1 | NULL |
+--------+-------+----------+

        2.  AND或者&&

            表示当所有操作数为非零值并且不为null时,计算所得结果为1;当一个或多个操作数为0时,所得结果为0,其余情况返回值为null

mysql> select 1 and 5,1 and 0,1 and null;
+---------+---------+------------+
| 1 and 5 | 1 and 0 | 1 and null |
+---------+---------+------------+
| 1 | 0 | NULL |
+---------+---------+------------+       

        3.  OR或者||

            表示当两个操作数均为非NULL值,且任意一个操作数为非零时,返回值1,否则为0;当有一个为NULL,且另一个操作数为非零值时,则返回1,否则为NULL;当两个操作数均为NULL,结果为NULL           

mysql> select 1 or 2 ,1 or 0, null or 1,null or 0 ,null or null ,0 or 0;
+--------+--------+-----------+-----------+--------------+--------+
| 1 or 2 | 1 or 0 | null or 1 | null or 0 | null or null | 0 or 0 |
+--------+--------+-----------+-----------+--------------+--------+
| 1 | 1 | 1 | NULL | NULL | 0 |
+--------+--------+-----------+-----------+--------------+--------+     

        4.  XOR

            表示当任意一个操作数为NULL时,返回值为NULL;对于非NULL的操作数,如果两个操作数都是非0值或者都是0值,则返回为0;如果一个为0,另外一个非0,则返回1.              

mysql> select null xor null,1 xor 1 ,0 xor 0,1 xor 0;
+---------------+---------+---------+---------+
| null xor null | 1 xor 1 | 0 xor 0 | 1 xor 0 |
+---------------+---------+---------+---------+
| NULL | 0 | 0 | 1 |
+---------------+---------+---------+---------+

             a XOR b 等同于(a AND (NOT b))或者(NOT a) AND b                  

    4.  位操作运算符  

         

    5.  运算符的优先级

        

         

                   

posted @ 2018-03-10 20:23  奋斗史  阅读(216)  评论(0)    收藏  举报