数据表操作
表是一种很重要的数据库对象,是组成数据库的基本元素,由若干个字段组成,主要用来实现存储数据记录。表的操作包括创建表、查询表、修改表 和 删除表。
如何创建一张简单表?
ID(class_id) | 名称(class_name) | 班主任(class_teacher) |
---|---|---|
101 | 六年级一班 | 马老师 |
102 | 六年级二班 | 潘老师 |
create database school;
use school;
create table class(class_id int,class_name varchar(128),class_teacher varchar(64));
insert into class values(101,'六年级一班','马老师');
insert into class values(102,'六年级二班','潘老师');
select * from class;
select * from class where class_id=101;#查询表class中id=101的全部记录
1、表的创建
-
CREATE TABLE 命令语法比较多,其主要是由表创建定义(
create-definition
)、表选项(table-options
)和分区选项(partition-options
)所组成的。CREATE TABLE<表名>([<列名1><类型1>,...,<列名n><类型n>])[表选项][分区选项]
-
表定义选项:
由列名(col_name)、列的定义(column_definition,或者类型定义)以及可能的空值说明、完整性约束或表索引组成-
举例
use school; create table class4(class_id int PRIMARY KEY,class_name varchar(128) NOT NULL,class_teacher varchar(64)UNIQUE);
-
-
列名:字段必须填写描述信息、字段命名使用完整名称、采用字段的名字必须是易于理解,一般不超过三个英文单词
2、列的类型定义
整形

-
use school; create table class(class_id integer(5) zerofill,...,);#指定zerofill之后,自动转换为int unsigned create table class1(class_id integer(5) unsigned,...,);
-
-
AUTO_INCREMENT:
表示自增、从1开始,每一行加1。一个表中最多由 一个AUTO_INCREMENT列。并且该列应该定义为NOT NULL。-
use school; create table clss8(id integer auto_increment PRIMARY KEY, name varchar(128),...) create table clss8(id integer auto_increment UNIQUE, name varchar(128),...) #两个表中,id都具有自增长属性
-
浮点类型和定点数
- MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如
float(7,4)
的 可显示为-999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。对于decimal,M是最大位数(精度),范围是1到65。可不指定,默认值是10。D是小数点右边的位数(小数位)。范围是0到30,并且不能大于M,可不指定,默认值是0。 - DECIMAL默认为(10,0);
当我们需要存储小数,并有精度要求时,通常会使用DECIMAL字段类型
日期和时间类型
YEAR类型表示年,DATE类型表示日期,TIME类型表示时间,DATETIME和TIMESTAMP表示日期和时间
-
超出有效范围会报错
-
插入日期时间、可以用“: - _ /”任意一个来分割
-
use test; create table date_example(e_date date,e_datetime datetime,e_timestamp timestamp,e_time time,e_year year);#创建表 dt_example insert into date_example values('2020_5-9','2020/5:9 15:01:00','20200509150100','15:01:00','2011');
-
也可以使用
mysql
自身函数来实现-
CURDATE() - 获取当前的DATE,可直接插入DATE类型中
NOW() - 获得当前的DATETIME,可直接插入DATETIME 和 TIMESTAMP类型中。
TIME() - 获取参数给定时间串中时分秒,可直接插入TIME类型中
YEAR() - 获取参数给定时间串中的年份,可直接插入YEAR类型中
MONTH()、DAY()、HOUR()、MINUTE()、SECOND()获取时间串中的月、日、时、分、秒
-
use test; insert into date_example values(CURDATE(),NOW(),NOW(),time(NOW()),YEAR(NOW()));
-
字符串类型
CHAR类型和VARCHAR类型 长度不是字节
-
两个类型都在创建时指定了最大长度:
字符串类型(MaxLength)
; -
CHAR类型是固定的,0~255之间的任意值,无论存储的字节达不到指定值,占用字节数都是 MAX
-
VARCHAR类型是可变的,0~65535之间的任意值,如果存储的字节达不到指定值,那么就占用当前用的字节数;
如果字符串尾部要保留空格,必须选择varchar
-
use test; create table char_example(e_char char(5),v_char varchar(5)); insert into char_example values('12345','12345'); insert into char_example values('1 2 ','12 ');#char会屏蔽后面隐藏的空格,varchar不会 select concat('(',e_char,')'),concat('(',v_char,')') from char_example;#让char屏蔽的空格原形必露,根本就没有
TEXT类型 字节而不是长度
-
无需指定长度、允许的长度是实际存储的字节数、例如一个中文字符是占用两个字节。
-
use test; create table text_example(e_text tinytext, v_char varchar(255));#e_text可存储255字节、v_char可存储255字符 insert into char_example values(90个中文字符,90个中文字符);#插入失败、utfmb4用三个字节表示一个中文 insert into char_example values(80个中文字符,90个中文字符);#插入成功
-
实战练习
-
创建一个用户信息表,用来存储用户的如下信息:姓名,手机号码,家庭地址,个人简介,性别,年龄,身份证号。数据库表名可定义为
userinfo
, 同时增加一个列id 用来作为每一条记录的唯一标识,并设为主键,自加! -
use test; create table userinfo( id int(10) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT'主键', name varchar(64) DEFAULT NULL COMMENT'姓名', mobile char(11) DEFAULT NULL COMMENT'手机号码', address varchar(128) DEFAULT NULL COMMENT '居住地址', description text DEFAULT NULL COMMENT '个人简介,不知道具体范围,不常更新用text', sex char(1) DEFAULT NULL COMMENT '性别-男或女', age tinyint unsigned DEFAULT 0 COMMENT '年龄', idno char(18) DEFAULT NULL COMMENT '身份证号码' );
-
ENUM
-
ENUM
类型又称为枚举类型。在创建表时,ENUM类型的取值范围以列表的形式指定-
属性名 ENUM(‘值1’, ‘值2’, … , ‘值n’);
eg:
Enum('男', '女', '选择保密') #'男' = 1,'女' = 2,'选择保密' = 3
use test; create table enum_exampl(e_enum enum('男', '女', '选择保密'));#创建表 insert into enum_example values('男'); insert into enum_example values(1);#也可以用数值来表示,也可以用enum选项中的值 select e_enum+0 from enum_example;#查询enum选项对应的整数值
-
-
如果ENUM类型加上了NOT NULL属性,其默认值为取值列表的第一个值,如果不加NOT NULL,默认值就是NULL。
SET(它的值使用二进制中1来表示的)
-
SET类型的值可以取列表中的一个元素或者多个元素的组合。取多个元素时,不同元素之间用逗号隔开。SET类型的值最多只能是由64个元素构成的组合。
-
再创建表时,SET类型的取值范围就以列表的形式指定了
-
属性名 SET(‘值1’, ‘值2’, … , ‘值n’);
use test; create table set_example(interest set('足球','追剧','篮球','撩妹'));#创建表 insert into set_example values('足球,撩妹');#插入记录,必须时enum选项中的值 insert into set_example values(9);#插入相应位效果等同,9 => 1001 选择1,4 select interest+0 from set_example;#以整数的方式查询 select * inserest from set_example;#输出中文
-
二进制类型
二进制文件和文本数据在mysql中的最大区别在于:
- 二进制类型存储
原始的二进制数据
(如图片,视频,exe文件等),文本类型(TEXT)用来存储字符字符串
(如由英文字符、中文字符或其他语言字符组成的字符串)。- 二进制类型
没有字符集
,并且排序和比较基于列值字节的数值
。而TEXT类型有字符集,并且根据字符集的校对规则对值进行排序和比较
BINARY 和 VARBINARY类型
类型(MaxLength)
BINARY类型长度是固定的,不足的用“\0”补全 max 255
VARBINARY类型是可变的,在最大值范围内使用多少就分配多少。max 65535
use test; create table bin_example(e_bin binary(5),e_varbin varbinary(5)); insert into bin_example values('ab','ab'); insert into bin_example values(b'0110000101100010',b'0110000101100011');#就是ab select * from bin_example;
BIT 类型
BIT (MaxLength)
;MaxLength 的最大值 为 64;BIT(4)存储的数据是0~15.
插入数据时,使用b’位串’的方式插入相应值!
查询时,可以使用bin()、oct()、hex()函数将字段的值转换成相应的二进制、八进制和十六进制
use test; create table bit_example(b bit(8)); insert into bit_example values(b'10110111'); insert into bit_example values('a'); select bin(b) from bit_example;#以二进制的方式显示字段值
BOLB类型
- blob不设置长度,当不知道属性的最大长度时,适合用blob,能用
varbinary
的地方不用blob; - 按查询速度:binary最快
varbinary
次之 blob最慢