一、创建表的完整语法
   create table 表(
   字段名1 类型 [(宽度) 约束条件],
   字段名2 类型 [(宽度) 约束条件],
   字段名3 类型 [(宽度) 约束条件]
   );

   1.类型:使用限制字段必须以什么样的数据类型传值
      约束条件:约束条件是在类型之外添加一种额外的限制

    2.注意点
       1.在同一张表中,字段名不能相同
        2.宽度和约束条件可选,字段名和类型是必须的
         3.最后一个字段后不用加逗号

二、基本的数据类型:
    1、整型
        1、作用:id号,各种号码,年龄,等级
        2、分类: tinyint,int,bigint
        3、注意:强调:对于整型来说,数据类型后的宽度并不是存储限制,而是显示限制
                                   所以在创建表示,如果字段采用的是整型类型,完全无需指定显示宽度,
                                   默认的显示宽度,足够显示完整当初存放的数据

int的存储宽度是4个Bytes,即32个bit,即2**32

无符号最大值为:4294967296-1

有符号最大值:2147483648-1

有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的

最后:整形类型,其实没有必要指定显示宽度,使用默认的就ok


   2、浮点型
      1.作用:存储身高、体重、薪资
      2.分类:float、double、decimal

create table t3(x,float(255,30));
create table t4(x,double(255,30));
create table t5(x,decimal(65,30));

insert into t3 values(1.111111111111111111111111111111)
insert into t4 values(1.111111111111111111111111111111)
insert into t5 values(1.111111111111111111111111111111)


cmd运行
mysql> select * from t9;
+----------------------------------+
| x                                |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select * from t10;
+----------------------------------+
| x                                |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select * from t11;
+----------------------------------+
| x                                |
+----------------------------------+
| 1.111111111111111111111111111111 |
+----------------------------------+
1 row in set (0.00 sec)

        3.相同点:
            1.对于三者来说,都能存放30位小数,
         4.不同点:
             1.精度的排序从低到高:float、double、decimal
             2.float与double类型能存放的整数位比becimal更多

    3、字符类型
        1.作用:姓名,地址,描述性的信息
        2.分类
                  char :  定长,简单粗暴,浪费空间,存取速度快
                        字符长度范围:0-255(一个中文是一个字符,是utf8编码的3字节)
                        例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储
                  varchar :变长,精确,节省空间,存取速度慢
                         字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8

                          强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)

                           存储:varchar类型存储数据的真实内容,不会用空格填充,如果'ab ',尾部的空格也会被存起来

create table t12(x char(4)); # 超出4个字符则报错,不够4个字符则用空格补全成4个字符
create table t13(y varchar(4));# 超出4个字符则报错,不够4个字符那么字符有几个就存几个

insert into t12 values('hello');
insert into t13 values('hello');


insert into t12 values('a'); #'a    '
insert into t13 values('a'); #'a'


set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
select char_length(x) from t12; #4
select char_length(y) from t13; #1
     注意:
          针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中
          但会在读出结果时自动去掉末尾的空格,因为末尾的空格在字段明确地等于一个值的场景中是无用


     4、日期类型
         分类:
               date:1999-01-27
               time:11:11:11
               datetime:1999-01-27  11:11:11
               year: 1999

create table student(
    -> id int,
    -> name varchar(20),
    -> born_year year,
    -> birth date,
    -> class_time time,
    -> reg_time datetime);

insert into student values
    -> (1,'alex',"1995","1995-11-11","11:11:11","2017-11-11 11:11:11"),
    -> (2,'egon',"1997","1997-12-12","12:12:12","2017-12-12 12:12:12"),
    -> (3,'wsb',"1998","1998-01-01","13:13:13","2017-01-01 13:13:13");

MariaDB [db1]> select * from student;
+------+------+-----------+------------+------------+---------------------+
| id   | name | born_year | birth      | class_time | reg_time            |
+------+------+-----------+------------+------------+---------------------+
|    1 | alex |      1995 | 1995-11-11 | 11:11:11   | 2017-11-11 11:11:11 |
|    2 | egon |      1997 | 1997-12-12 | 12:12:12   | 2017-12-12 12:12:12 |
|    3 | wsb  |      1998 | 1998-01-01 | 13:13:13   | 2017-01-01 13:13:13 |
+------+------+-----------+------------+------------+---------------------+


     5、枚举与集合类型
         作用与分类:
               枚举enum,多选一个
               集合set,多选多

create table consumer(
name char(16),
sex enum('male','female'),
level enum('vip1','vip2','vip3','vip4','vip5',)
hobby set ('play','music',read','study'));

insert into consumer values
('egon','male','vip5','read,study'),
('alex','female','vip1','girl');

cmd 运行
select * from consumer;
+------+--------+-------+------------+
| name | sex    | level | hobby      |
+------+--------+-------+------------+
| egon | male   | vip5  | read,study |
| alex | female | vip1  |            |
+------+--------+-------+------------+

 
三、约束条件
     1、not null 与default
          是否可空,null表示空,非字符串
          not null   不可空
          null    可空

          默认值,创建列表可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值

create table t15(
    id int,
    name char(16) not null,
    sex enum('male','female','other') not null default "male"
);

insert into t15(id,name) values
(1,'egon1'),
(2,'egon2'),
(3,'egon3');

cmd 运行

mysql> desc t15;
+-------+-------------------------------+------+-----+---------+-------+
| Field | Type                          | Null | Key | Default | Extra |
+-------+-------------------------------+------+-----+---------+-------+
| id    | int(11)                       | YES  |     | NULL    |       |
| name  | char(16)                      | NO   |     | NULL    |       |
| sex   | enum('male','female','other') | NO   |     | male    |       |
+-------+-------------------------------+------+-----+---------+-------+
3 rows in set (0.04 sec)


      2、unique:限制字段的值唯一(就是独一无二)

#单列唯一
create table t16(
    id int unique,
    name char(16)
);


# 联合唯一
create table server(
    id int unique,
    ip char(15),
    port int,
    unique(ip,port)
);


      3、primary key:单单从约束角度去看,primary key 就等同于not null unique
          1.强调
               1.一张表中必须有,并且只能有一个主键
               2.一张表中都应该有一个id字段,而且应该把id字段做成主键

单列做主键
create  table t11(
id int primary key,
name char(16),
age int,
sex char(6)
);

联合主键
create table t12(
ip char(15),
port int,
primary key(ip,port)
);

单列cmd查看:
mysql> desc t11;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | NO   | PRI | NULL    |       |
| name  | char(16) | YES  |     | NULL    |       |
| age   | int(11)  | YES  |     | NULL    |       |
| sex   | char(6)  | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+


联合cmd查看:
mysql> desc t12;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| ip    | char(15) | NO   | PRI |         |       |
| port  | int(11)  | NO   | PRI | 0       |       |
+-------+----------+------+-----+---------+-------+


      4、auto_increment
          约束字段为自动增长,被约束的字段必须同时被key约束

create table t13(
id int primary key auto_increment,
name char(16)
);

mysql> insert into t13(name) values('egon'),('alex');

cmd 运行:
mysql> select * from t13;
+----+------+
| id | name |
+----+------+
|  1 | egon |
|  2 | alex |
+----+------+
2 rows in set (0.02 sec)

      1.注意点:
            1.通常与primary key连用,而且通常是给id字段加
            2.auto_incremnt只能给被定义成key(unique key,primary key)的字段加

 

posted on 2018-05-11 17:45  muzinianhua  阅读(87)  评论(0编辑  收藏  举报