2、数据类型与操作数据表

2、 数据类型与操作数据表

数据类型:指的是列、存储过程中参数、表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型。

2.1、myql 数据类型之整型

有符号位的范围大致是无符号位范围的 2 倍,无符号位只有正数,选择合适的数据类型很重要,尤其是要存储的数据量特别大的时候,不同的数据类型占的字节不同。

五种整型

2.2、mysql 数据类型之浮点型

有些数据适合用整型,而有些数据是小数,使用浮点型更合适,双精度大约是单精度范围的 10 倍。

浮点型

2.3、mysql 数据类型之日期时间型

日常项目开发中很少使用 日期时间型,大多使用数字的形式存储,主要是因为存在时区的问题。

  • date:1000年1月1日--9999年12月31日
  • datetime:1000年1月1日00:00点--9999年12月31日23:59分
  • timestamp(时间戳):1970年1月1日00:00点---2017年(现在)的一个值
  • time:-8385959--8285959
  • year:可以存储 2 位也可以是 4位,默认 4 位(可以70-69,表示19070-2069年)
日期时间型

2.4、mysql 数据类型之字符型

字符型

2.5、mysql 创建数据表

数据表(或称表)是数据库最重要的组成部分之一,是其他对象的基础。

打开数据库命令:

# USE 数据库名称
mysql> USE test;
Database changed
mysql>

检查当前打开的数据库是否为我们刚打开的数据库:

# SELECT DATABASE();
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| test       |
+------------+
1 row in set (0.00 sec)

2.5.1、创建数据表

语法结构:

CREATE TABLE [IF NOT EXISTS] table_name(column_name data_type,
...
DROP TABLE table_name           # 删除数据表
)
# column_name(列名称)  事先需要经过分析计算出需要多少列,而不是凭空想象
# data_type(数据类型)

示例:

# 创建一个名为 tb1 的数据表,其中包含名字、年龄、工资(salary)
mysql> CREATE TABLE tb1(
    -> username VARCHAR(20),                     # VARCHAR(20) 表示名字长度最长为20
    -> age TINYINT UNSIGNED,                     # 因为年龄是正的,所有是无符号位(UNSIGNED)
    -> salary FLOAT(8,2) UNSIGNED                # 最后一个字段,不需要在最后➕逗号
    -> );
Query OK, 0 rows affected (0.07 sec)

2.5.2、查看数据表

在当前数据库下查看别的数据库下的数据表,并不会改变数据库。

语法结构:

SHOW TABLES [FROM db_name] [LIKE 'pattern' | WHERE expr]

示例:

# 查看当前数据库下的数据表
mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| tb1            |
+----------------+
1 row in set (0.00 sec)

# 不仅可以查看当前数据库下的数据表,还可以查看别的数据库下的数据表
mysql> SHOW TABLES FROM mysql;

2.5.3、查看数据表结构

语法结构:

SHOW COLUMNS FROM tbl_name

示例:

# 查看 tb1 的数据表结构
mysql> SHOW COLUMNS FROM tb1;
+----------+---------------------+------+-----+---------+-------+
| Field    | Type                | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+-------+
| username | varchar(20)         | YES  |     | NULL    |       |
| age      | tinyint(3) unsigned | YES  |     | NULL    |       |
| salary   | float(8,2) unsigned | YES  |     | NULL    |       |
+----------+---------------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

2.6、mysql 记录的插入与查找

通过上面的创建,我们创建了数据表的列,行就是(记录)。

2.6.1、数据表的记录(行)插入

语法结构:

INSERT [INTO] tbl_name [ (col_name,...)] VALUES(CAL,...)
# col_name 表示数据表中哪几个列要赋值,可省略,省略的时候表示所有的列都必须赋值,否则出错
# VALUES 为要赋的值

示例:

# 省略 col_name时,需要给每个列度都赋值
mysql> INSERT tb1 VALUES('Tom',25,7863.25);
Query OK, 1 row affected (0.01 sec)

# 没有给全部列赋值,程序出错
mysql> INSERT tb1 VALUES('Tom',25);
ERROR 1136 (21S01): Column count doesn't match value count at row 1

# 也可以只给其中一个或几个列赋值
mysql> INSERT tb1(username,salary) VALUES('John',4500.69);
Query OK, 1 row affected (0.01 sec)

2.6.2、查看记录

语法结构:

# expr 表达式
SELECT expr,...FROM tbl_name

示例:

# * 在这里表示的是字段的过滤(可以理解为全部字段的过滤),这里只是比较简单的表示
mysql> SELECT * FROM tb1;
+----------+------+---------+
| username | age  | salary  |
+----------+------+---------+
| Tom      |   25 | 7863.25 |
| John     | NULL | 4500.69 |
+----------+------+---------+
2 rows in set (0.00 sec)

2.7、mysql 空值与非空

在上述列子中,我们给数据表 tb1 插入记录时,John 没有指定年龄,在我们查看数据表结构时,发现年龄的位置为空(NULL),而大多数情况下,我们在网站用户名创建时,往往有些地方不能为空,或者说是显示的不是空,为此我们可以更加深入地完善空。

  • NULL:字段值可以为空(默认为可以为空)
  • NOT NULL:字段值禁止为空

示例:

# 创建一个数据表 tb2,将列(username 设置为非空(NOT NULL), age 设置为可以为空(NULL),可省略不写)
mysql> CREATE TABLE tb2(
    -> username VARCHAR(20) NOT NULL,
    -> age TINYINT UNSIGNED NULL
    -> );
Query OK, 0 rows affected (0.04 sec)

# 查看数据表结构
mysql> SHOW COLUMNS FROM tb2;
+----------+---------------------+------+-----+---------+-------+
| Field    | Type                | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+-------+
| username | varchar(20)         | NO   |     | NULL    |       |
| age      | tinyint(3) unsigned | YES  |     | NULL    |       |
+----------+---------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

# 插入记录,将年龄设置为 NULL,显示可以
mysql> INSERT tb2 VALUES('TOM',NULL);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tb2;
+----------+------+
| username | age  |
+----------+------+
| TOM      | NULL |
+----------+------+
1 row in set (0.00 sec)

# 插入记录,将用户名(username设置为空)出错,因为在创建时,设置它不能为空
mysql> INSERT tb2 VALUES(NULL,26);
ERROR 1048 (23000): Column 'username' cannot be null

2.8、mysql 自动编号

为了保证记录的唯一性,避免在数据表中,记录不能出现重复,可以为某个字段添加 AUTO_INCREMENT(自动编号) 属性。

  • 自动编号,且必须与主键组合使用
  • 默认起始值为1,每次增量为1

示例:

# 创建一个数据表,id 设置为自动编号
mysql> CREATE TABLE tb3(
    -> id SMALLINT UNSIGNED AUTO_INCREMENT,
    -> username VARCHAR(30) NOT NULL
    -> );

# 出错内容意思是必须与主键配合(it must be defined as a key)
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

2.8.1、初涉主键(PRIMARY KEY)约束

主键可以理解为一个表格的类别(自我理解的)

  • 主键约束
  • 每张数据表只能存在一个主键
  • 主键保证记录的唯一性
  • 主键自动为 NOT NULL
  • 可以不用赋值

示例:

# 创建一个数据表 tb3
mysql> CREATE TABLE tb3(
    -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,  # 将id 定义为主键(AUTO_INCREMENT PRIMARY KEY)
    -> username VARCHAR(30) NOT NULL
    -> );
Query OK, 0 rows affected (0.05 sec)

# 查看数据表结构
mysql> SHOW COLUMNS FROM tb3;   # 查看这个结构,发现 id 为主键(PRI),还有一个 Extra(增量)
+----------+----------------------+------+-----+---------+----------------+
| Field    | Type                 | Null | Key | Default | Extra          |
+----------+----------------------+------+-----+---------+----------------+
| id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
| username | varchar(30)          | NO   |     | NULL    |                |
+----------+----------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

# 插入 4 条记录(Tom、John、Rose、Alice)
mysql> INSERT tb3(username) VALUES('John');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT tb3(username) VALUES('Tom');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT tb3(username) VALUES('Rose');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT tb3(username) VALUES('Alice');
Query OK, 1 row affected (0.00 sec)

# 查看记录
mysql> SELECT * FROM tb3;    # 发现数据表结构自动编号,起始值为1,每次递增为1
+----+----------+
| id | username |
+----+----------+
|  1 | John     |
|  2 | Tom      |
|  3 | Rose     |
|  4 | Alice    |
+----+----------+
4 rows in set (0.00 sec)

AUTO_INCREMENT 字段必须定位为主键,但主键不一定与 AUTO_INCREMENT 字段使用

可以理解为,AUTO_INCREMENT 为递增量,它必须定义为主键才能使用,如果没有给 第一个列(id)插入值,那么起始值为 1,插入记录时,那么第 2 条记录的编号则为2,依次增加1,但是主键可以自己使用,当把 第一个列(id )定义为主键时,插入记录时,每条记录都需要插入值(编号),它没有递增量。

示例:

# 创建一个数据表 tb4
mysql> CREATE TABLE tb4(
    -> id SMALLINT UNSIGNED PRIMARY KEY,   # 将 id 定义为主键,但没有设置 AUTO_INCREMENT 属性
    -> age VARCHAR(20) NOT NULL
    -> );
Query OK, 0 rows affected (0.05 sec)

# 查看数据表结构
mysql> SHOW COLUMNS FROM tb4;     # 发现 Extra 位置,id 为空,并没有出现 AUTO_INCREMENT(增量)
+-------+----------------------+------+-----+---------+-------+
| Field | Type                 | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+-------+
| id    | smallint(5) unsigned | NO   | PRI | NULL    |       |
| age   | varchar(20)          | NO   |     | NULL    |       |
+-------+----------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

# 插入两条记录
mysql> INSERT tb4 VALUES(4,'Tom');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT tb4 VALUES(20,'Rose');
Query OK, 1 row affected (0.01 sec)

# 查看插入记录
mysql> SELECT * FROM tb4;         # 第一条记录的编号为 4,第二条为 20,如果再插入 20 则会出错
+----+------+
| id | age  |
+----+------+
|  4 | Tom  |
| 20 | Rose |
+----+------+
2 rows in set (0.00 sec)

2.8.2、初涉唯一约束(UNIQUE KEY)

每张表中只能有一个主键,而往往主键与 AUTO_INCREMENT 使用了,要保证记录的唯一性,也可以使用唯一约束。

  • 唯一约束
  • 唯一约束可以保证记录的唯一性
  • 唯一约束的字段可以为空(NULL)
  • 每张数据表可以存在多个唯一约束

示例:

# 创建一个数据表 tb5
mysql> CREATE TABLE tb5(
    -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,  # 将 id 定位为主键
    -> username VARCHAR(20) NOT NULL UNIQUE KEY,       # 将 username 定义为UNIQUE KEY
    -> age TINYINT UNSIGNED
    -> );
Query OK, 0 rows affected (0.04 sec)

# 查看数据表结构
mysql> SHOW COLUMNS FROM tb5;
+----------+----------------------+------+-----+---------+----------------+
| Field    | Type                 | Null | Key | Default | Extra          |
+----------+----------------------+------+-----+---------+----------------+
| id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
| username | varchar(20)          | NO   | UNI | NULL    |                |
| age      | tinyint(3) unsigned  | YES  |     | NULL    |                |
+----------+----------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

# 插入两条一样的记录
mysql> INSERT tb5(username,age) VALUES('Tom',22);
Query OK, 1 row affected (0.00 sec)

# 插入第二条时,发生错误,提示 Tom 重复,也就是说唯一约束的唯一性
mysql> INSERT tb5(username,age) VALUES('Tom',22);
ERROR 1062 (23000): Duplicate(重复的) entry 'Tom' for key 'username'

# 查看插入记录
mysql> SELECT * FROM tb5;
+----+----------+------+
| id | username | age  |
+----+----------+------+
|  1 | Tom      |   22 |
+----+----------+------+
1 row in set (0.00 sec)

2.8.3、初涉默认约束(DEFAULT)

  • 默认值
  • 当插入记录时,如果没有明确为字段赋值,则自动赋予默认值

示例:

# 创建一个数据表 tb6
mysql> CREATE TABLE tb6(
    -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    -> username VARCHAR(20) NOT NULL UNIQUE KEY,
    -> sex ENUM('男','女','保密') DEFAULT '保密'   # 性别列设置默认值(DEFAULT)为保密
    -> );
Query OK, 0 rows affected (0.04 sec)

# 仓库数据表结构
mysql> SHOW COLUMNS FROM tb6;
+----------+------------------------+------+-----+---------+----------------+
| Field    | Type                   | Null | Key | Default | Extra          |
+----------+------------------------+------+-----+---------+----------------+
| id       | smallint(5) unsigned   | NO   | PRI | NULL    | auto_increment |
| username | varchar(20)            | NO   | UNI | NULL    |                |
| sex      | enum('男','女','保密') | YES  |     | 保密    |                |
+----------+------------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

# 插入记录
mysql> INSERT tb6(username) VALUES('Tom');  # 性别没有赋值,将使用默认值
Query OK, 1 row affected (0.01 sec)

# 查看插入记录
mysql> SELECT * FROM tb6;
+----+----------+------+
| id | username | sex  |
+----+----------+------+
|  1 | Tom      | 保密 |
+----+----------+------+
1 row in set (0.00 sec)

2.9、总结

数据类型:

字符型、整型、浮点型、日期时间型

数据表操作:

插入记录、查找记录

记录操作:

创建数据表、约束的使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 内容回顾 mysql默认端口号:3306mysql中的超级用户:root创建数据库:CREATE DATABASE...
    齐天大圣李圣杰阅读 260评论 0 0
  • 数据类型:1 整型 tinyint smallint mediumint int bigi...
    vs陈默阅读 269评论 0 0
  • 新年第一天,换个发型,换个心情。2017年没有达到我的满意,2018只有一个要求,拒绝懒惰,去做就好了。
    郁离风阅读 110评论 0 0
  • 找不出是哪里出了错,之前提的好好的RNA再也不想完整的跟我见面,不管我怎么尝试改变,完善之前并没注意么细节,都唤不...
    Helsa阅读 186评论 0 1
  • 那是一张充满诱惑的网 在这网里 能使你忘却死的恐惧 渴望生的意义 可人啊,是最经不得考验的 在那存在的生里 意志被...
    蓬蒿居士李阅读 197评论 0 7