• 创建表的完整语法和基本数据类型


    创建表的完整语法

    语法:
    create table 表名(
    字段名1 类型[(宽度) 约束条件],
    字段名2 类型[(宽度) 约束条件],
    字段名3 类型[(宽度) 约束条件]
    );
    解释
    类型:使用限制字段必须以什么样的数据类型传值
    约束条件:是在类型之外添加一种额外的限制
    注意

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

    基本数据类型

    1.整形:
    tinyint,int,bigint

    1#tinyint默认为有符号
    2MariaDB [db1]> create table t1(x tinyint); #默认为有符号,即数字前有正负号
    3#设置无符号tinyint
    4MariaDB [db1]> create table t2(x tinyint unsigned);
    5======用zerofill测试整数类型的显示宽度--使用0填充=============
    6MariaDB [db1]> create table t7(x int(3) zerofill);

    注意:
    为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关,存储范围如下

    其实我们完全没必要为整数类型指定显示宽度,使用默认的就可以了
    默认的显示宽度,都是在最大值的基础上加1

    2.浮点型

    1#三种浮点型,精度依次升高,一般使用float即可。
    2FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]#单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
    3DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]# 双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
    4decimal[(m[,d])] [unsigned] [zerofill]#准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。

    3.字符类型
    1.分类:
    char(定长,简单粗暴,浪费空间,存取速度快) varchar(变长,精准,节省空间,存取速度慢)

    注意:char和varchar括号内的参数指的都是字符的长度

    1create table t12(x char(4));超出4个字符则报错,不够用空格补全
    2create table t13(y varchar(4));超出4个字符报错,不够4个则有几个存几个
    3set global sql_mode = 'PAD_CHAR_TO_FULL_LIENGTH'#取数据时,保留尾部空格

    ** 注意:**
    针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中
    但会在读出结果时自动去掉末尾的空格,因为末尾的空格在以下场景中是无用
    mysql> select * from t14 where name="lxx"; # name字段明确地等于一个值,该值后填充空格是没有用的
    mysql> select * from t14 where name like "lxx"; # name字段模糊匹配一个值,该值后填充空格是有用的

    varchar真的比char节省空间吗?

    Value char(4) Storage Required varchar(4) Storage Required
    '' '四个空格' 4 bytes '' 1bytes
    'ab' 'ab ' 4 bytes 'ab' 3bytes
    'abcd' 'abcd' 4 bytes 'abcd' 5bytes
    'abcdef' 'abcd' 4 bytes 'abcd' 5bytes

    varchar并不是什么时候都比char节省空间,所以推荐使用char

    1测试前了解两个函数
    2length:查看字节数
    3char_length:查看字符数
    1mysql> create table t1(x char(5),y varchar(5));
    2Query OK, 0 rows affected (0.26 sec)
    1#char存5个字符,而varchar存4个字符
    2mysql> insert into t1 values('你瞅啥 ','你瞅啥 ');
    3Query OK, 1 row affected (0.05 sec)
    4

    1mysql> SET sql_mode='';
    2Query OK, 0 rows affected, 1 warning (0.00 sec)

    在检索时char很不要脸地将自己浪费的2个字符给删掉了,装的好像自己没浪费过空间一样,而varchar很老实,存了多少,就显示多少

    1mysql> select x,char_length(x),y,char_length(y) from t1; 
    2+-----------+----------------+------------+----------------+
    3| x | char_length(x) | y | char_length(y) |
    4+-----------+----------------+------------+----------------+
    5|
    你瞅啥 | 3 | 你瞅啥 | 4 |
    6+-----------+----------------+------------+----------------+
    71 row in set (0.00 sec)
    1#略施小计,让char现出原形
    2mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
    3Query OK, 0 rows affected (0.00 sec)
    1#这下子char原形毕露了......
    2mysql> select x,char_length(x),y,char_length(y) from t1;
    3+-------------+----------------+------------+----------------+
    4| x | char_length(x) | y | char_length(y) |
    5+-------------+----------------+------------+----------------+
    6|
    你瞅啥 | 5 | 你瞅啥 | 4 |
    7+-------------+----------------+------------+----------------+
    81 row in set (0.00 sec)
    1#char类型:3个中文字符+2个空格=11Bytes
    2#varchar类型:3个中文字符+1个空格=10Bytes
    3mysql> select x,length(x),y,length(y) from t1;
    4+-------------+-----------+------------+-----------+
    5| x | length(x) | y | length(y) |
    6+-------------+-----------+------------+-----------+
    7|
    你瞅啥 | 11 | 你瞅啥 | 10 |
    8+-------------+-----------+------------+-----------+
    91 row in set (0.00 sec)

    4.日期类型

    ============注意啦,注意啦,注意啦===========

    1. 单独插入时间时,需要以字符串的形式,按照对应的格式插入
    2. 插入年份时,尽量使用4位值
    3. 插入两位年份时,<=69,以20开头,比如50, 结果2050
      =70,以19开头,比如71,结果1971
     1YEAR
    2 YYYY(1901/2155
    3DATE
    4 YYYY-MM-DD(1000-01-01/9999-12-31
    5TIME
    6 HH:MM:SS('-838:59:59'/'838:59:59'
    7DATETIME
    8 YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y)
    9TIMESTAMP
    10 YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)
     1MariaDB [db1]> create table student(
    2 -> id int,
    3 -> name varchar(20),
    4 -> born_year year,#无论year指定何种宽度,最后都默认是year(4)
    5 -> birth date,
    6 -> class_time time,
    7 -> reg_time datetime);
    8MariaDB [db1]> insert into student values
    9 -> (1,'alex',"1995","1995-11-11","11:11:11","2017-11-11 11:11:11"),
    10 -> (2,'egon',"1997","1997-12-12","12:12:12","2017-12-12 12:12:12"),
    11 -> (3,'wsb',"1998","1998-01-01","13:13:13","2017-01-01 13:13:13");

    datetime 和 timestamp的区别
    在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。下面就来总结一下两种日期类型的区别。
    1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。
    2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,操作系统以及客户端连接都有时区的设置。
    3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。
    4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。

    5.枚举和集合类型
    字段的值只能在给定范围中选择,如单选框,多选框
    枚举 enum 单选
    只能在给定的范围内选一个值,如性别 sex 男male/女female

    1CREATE TABLE shirts (name VARCHAR(40),size ENUM('x-small', 'small', 'medium', 'large', 'x-large'));
    2INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');

    集合 set 多选
    在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3…)

    1CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
    2INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
     1#综合示例
    2MariaDB [db1]> create table consumer(
    3 -> name varchar(50),
    4 -> sex enum('male','female'),
    5 -> level enum('vip1','vip2','vip3','vip4','vip5'), #在指定范围内,多选一
    6 -> hobby set('play','music','read','study') #在指定范围内,多选多
    7 -> );
    8MariaDB [db1]> insert into consumer values
    9 -> ('egon','male','vip5','read,study'),
    10 -> ('alex','female','vip1','girl');
    11MariaDB [db1]> select * from consumer;
    12+------+--------+-------+------------+
    13| name | sex | level | hobby |
    14+------+--------+-------+------------+
    15|
    egon | male | vip5 | read,study |
    16| alex | female | vip1 | |
    17+------+--------+-------+------------+
    18

    补充sql_mode

     1# 查看sql_mode
    2mysql> show variables like "%sql_mode%";
    3+----------------------------+---------------------+
    4| Variable_name | Value |
    5+----------------------------+---------------------+
    6|
    binlogging_impossible_mode | IGNORE_ERROR |
    7| block_encryption_mode | aes-128-ecb |
    8|
    gtid_mode | OFF |
    9| innodb_autoinc_lock_mode | 1 |
    10|
    innodb_strict_mode | OFF |
    11| pseudo_slave_mode | OFF |
    12|
    slave_exec_mode | STRICT |
    13| sql_mode | STRICT_TRANS_TABLES |
    14+----------------------------+---------------------+
    158 rows in set (0.00 sec)
    16

    1#修改sql_mode为严格模式:在该模式下,如果插入的数据超过限制,则会立即报错
    2mysql> set global sql_mode="strict_trans_tables";
  • 相关阅读:
    Application
    Intent
    C#Winform实现自动更新
    Activity的四种启动模式
    小白学Python——用 百度翻译API 实现 翻译功能
    小白学Python——用 百度AI 实现 OCR 文字识别
    小白学Python——Matplotlib 学习(3) 函数图形
    小白学Python——Matplotlib 学习(2):pyplot 画图
    小白学Python——Matplotlib 学习(1)
    小白学Python(20)—— Turtle 海龟绘图
  • 原文地址:https://www.cnblogs.com/guodengjian/p/9008218.html
Copyright © 2020-2023  润新知