数据库管理及数据类型

**作者:行癫(盗版必究)** ------ ## 一:数据类型 #### 1.数值类型 ##### 整数类型 ​ 整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT ​ 作用:用于存储用户的年龄、游戏的Level、经验值等 ![image-20220920124821420](https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220920124821420.png) ##### 浮点数类型 ​ 浮点数类型:FLOAT DOUBLE ​ 作用:用于存储用户的身高、体重、薪水等 ![image-20220920124919373](https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220920124919373.png) ```shell float(5,3) 5宽度 3精度 注意: 宽度不算小数点 宽度-精度=点前 案例: MySQL [(none)]> create database diandian; Query OK, 1 row affected (0.00 sec) MySQL [(none)]> use diandian Database changed MySQL [diandian]> create table t1(id float(6,2)); Query OK, 0 rows affected (0.24 sec) MySQL [diandian]> insert into t1 values('2.22'); ``` ##### 定点数类型 ​ 定点数类型:DEC ​ 定点数在MySQL内部以字符串形式存储,比浮点数更精确,适合用来表示货币等精度高的数据 ##### 位类型 ​ 位类型:BIT ​ BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写默认为1位 #### 2.字符串类型 ​ CHAR系列 CHAR VARCHAR ​ TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT ​ BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB ​ BINARY系列 BINARY VARBINARY ![image-20220920132114919](https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220920132114919.png) ##### 枚举类型 ​ 枚举类型:枚举列可以把一些不重复的字符串存储成一个预定义的集合 ```shell mysql> create table enum_table( e ENUM('fish','apple','dog')); Query OK, 0 rows affected (0.35 sec) mysql> insert into enum_table(e) values('fish'); Query OK, 1 row affected (0.11 sec) mysql> select * from enum_table; +------+ | e | +------+ | fish | +------+ 1 row in set (0.00 sec) mysql> insert into enum_table(e) values('nihao'); ERROR 1265 (01000): Data truncated for column 'e' at row 1 ``` ##### 时间和日期类型 ​ 时间和日期类型:DATE TIME DATETIME TIMESTAMP YEAR ​ 作用:用于存储用户的注册时间,文章的发布时间,文章的更新时间,员工的入职时间等 ![image-20220920132630856](https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220920132630856.png) ```shell mysql> create table t8 ( id1 timestamp NOT NULL default CURRENT_TIMESTAMP, id2 datetime default NULL ); timestamp 类型的列还有个特性:默认情况下,在 insert, update 数据时,timestamp 列会自动以当前时间(CURRENT_TIMESTAMP)填充/更新。“自动”的意思就是,你不去管它,MySQL 会替你去处理。 mysql> insert into t8(id1) values('20180109000000'); mysql> select * from t8; +---------------------+------+ | id1 | d2 | +---------------------+------+ | 2018-01-09 00:00:00 | NULL | +---------------------+------+ 1 row in set (0.00 sec) 扩展: select now();查看当前时间 ``` ## 二:表操作 #### 1.案例 表::school.student1 ``` 字段 字段 字段 id name sex age 1 tom male 23 记录 2 jack male 21 记录 3 alice female 19 记录 ``` 语法: ```shell create table 表名(自定义)( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型[(宽度) 约束条件] )[存储引擎 字符集]; ==在同一张表中,字段名是不能相同 ==宽度和约束条件可选 ==字段名和类型是必须的 ``` 创建库表: ```shell mysql> CREATE DATABASE school; //创建数据库school mysql> use school; mysql> create table student1( id int, name varchar(50), sex enum('m','f'), age int ); Query OK, 0 rows affected (0.03 sec) ``` 查看库: ```shell mysql> show tables; +------------------+ | Tables_in_school | +------------------+ | student1 | +------------------+ 1 row in set (0.00 sec) ``` 插入语法: ``` insert into 表名(字段1,字段2...) values(字段值列表...); ``` 插入数据: ```shell mysql> insert into student1(id,name,sex,age) values(1,'xingdia','m','26'); ``` 查看表结构: ```shell mysql> desc student1; +-------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(50) | YES | | NULL | | | sex | enum('m','f') | YES | | NULL | | | age | int(11) | YES | | NULL | | +-------+---------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) ``` 查询数据: ```shell mysql> select id,name,sex,age from student1; //查询表中所有字段的值 Empty set (0.00 sec) mysql> select * from student1; /查询表中所有字段的值 Empty set (0.00 sec) mysql> select name,age from student1; //查询表中指定字段的值 Empty set (0.00 sec) ``` 扩展插入: ```shell mysql> insert into student1 values (1,'xingdian','m',33),(2,'alice','m',20),(3,'jack','m',40); //顺序插入 Query OK, 3 rows affected (0.14 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> insert into student1(name,age) values ('zhuzhu',10),('gougou',20); //只向指定的字段插入值 Query OK, 2 rows affected (0.12 sec) Records: 2 Duplicates: 0 Warnings: 0 ``` #### 2.案例 表:school.student2 ```shell 字段名 数据类型 编号 id int 姓名 name varchar(50) 出生年份 born_year year 生日 birthday date 上课时间 class_time time 注册时间 reg_time datetime ``` 创建表: ```shell mysql> create table student2( id int, name varchar(50), born_year year, birthday date, class_time time, reg_time datetime ); ``` 插入数据: ```shell mysql> insert into student2 values(1,'tom',now(),now(),now(),now()); mysql> insert into student2 values(2,'jack',1982,19821120,123000,20140415162545); ``` 表:school.student3 ```shell id id int 姓名 name varchar(50) 性别 sex enum('male','female') 爱好 hobby set('music','book','game','disc') ``` 创建表: ```shell mysql> create table student3( id int, name varchar(50), sex enum('male','female'), hobby set('music','book','game','disc') ); ``` 查看表结构: ```shell mysql> desc student3; mysql> show create table student3\G ``` 插入数据: ```shell mysql> insert into student3 values (1,'tom','male','book,game'); mysql> insert into student3 values (2,'jack','male','film'); ``` 注意: ​ DESCRIBE查看表结构 ```shell DESCRIBE 表名; DESC 表名; ``` ​ 查看表详细结构 ```shell SHOW CREATE TABLE 表名; ``` ## 三:表完整性约束 #### 1.作用 ​ 用于保证数据的完整性和一致性 #### 2.约束条件 PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录,不可以为空 UNIQUE + NOT NULL FOREIGN KEY (FK) 标识该字段为该表的外键,实现表与表(父表主键/子表1外键/子表2外键)之间的关联 NOT NULL 标识该字段不能为空 UNIQUE KEY (UK) 标识该字段的值是唯一的,可以为空,一个表中可以有多个UNIQUE KEY AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键) DEFAULT 为该字段设置默认值 注意: ​ 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值 ​ 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值 ```shell MySQL [(none)]> sex enum('male','female') not null default 'male' MySQL [(none)]> age int unsigned NOT NULL default 20 必须为正值(无符号) 不允许为空 默认是20 ``` ​ 是否是key 主键 primary key 外键 forengn key #### 3.NOT NULL 表:school.student4 创建表:(注意前提需要有库) ```shell mysql> create table school.student4( id int not null, name varchar(50) not null, sex enum('m','f') default 'm' not null, age int unsigned default 18 not null, hobby set('music','disc','dance','book') default 'book,dance' ); ``` 插入数据:(注意观察查询到的数据) ```shell MySQL [(none)]> insert into school.student4(id,name) values(2,'robin'); Query OK, 1 row affected (0.08 sec) MySQL [(none)]> select * from school.student4; +----+-------+-----+-----+------------+ | id | name | sex | age | hobby | +----+-------+-----+-----+------------+ | 2 | robin | m | 18 | dance,book | +----+-------+-----+-----+------------+ 1 row in set (0.00 sec) ``` 注意报错的原因: ```shell MySQL [(none)]> insert into school.student4 values(3,NULL,'m',40,'book'); ERROR 1048 (23000): Column 'name' cannot be null ``` #### 4.唯一约束 作用: ​ MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度 表:company.department1 创建表: ```shell MySQL [(none)]> create database company; Query OK, 1 row affected (0.01 sec) MySQL [(none)]> CREATE TABLE company.department1 (dept_id INT,dept_name VARCHAR(30) UNIQUE,comment VARCHAR(50)); Query OK, 0 rows affected (0.34 sec) ``` 查看表结构: ```shell MySQL [(none)]> desc company.department1; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | dept_id | int(11) | YES | | NULL | | | dept_name | varchar(30) | YES | UNI | NULL | | | comment | varchar(50) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) ``` 数据插入:(注意查看插入数据时的提示) ```shell MySQL [(none)]> insert into company.department1 values ("1","xingdian","hr"); Query OK, 1 row affected (0.04 sec) MySQL [(none)]> insert into company.department1 values ("1","xingdian","hr"); ERROR 1062 (23000): Duplicate entry 'xingdian' for key 'dept_name' ``` #### 5.主键约束 注意:primary key 字段的值是不允许重复,且不允许不NULL(UNIQUE + NOT NULL) 表:school.student6 创建表: ```shell MySQL [(none)]> create table school.student6( id int primary key not null auto_increment, name varchar(50) not null, sex enum('male','female') not null default 'male', age int not null default 18 ); Query OK, 0 rows affected (0.47 sec) ``` 插入数据: ```shell MySQL [(none)]> insert into school.student6 values (1,'alice','female',22); Query OK, 1 row affected (0.18 sec) MySQL [(none)]> insert into school.student6(name,sex,age) values -> ('jack','male',19), -> ('tom','male',23); Query OK, 2 rows affected (0.14 sec) Records: 2 Duplicates: 0 Warnings: 0 MySQL [(none)]> select * from school.student6; +----+-------+--------+-----+ | id | name | sex | age | +----+-------+--------+-----+ | 1 | alice | female | 22 | | 2 | jack | male | 19 | | 3 | tom | male | 23 | +----+-------+--------+-----+ 3 rows in set (0.00 sec) ``` ## 四:修改表 语法格式: 修改表名 ​ ALTER TABLE 表名 RENAME 新表名; 增加字段 ​ ALTER TABLE 表名 ​ ADD 字段名 数据类型 [完整性约束条件…], ​ ADD 字段名 数据类型 [完整性约束条件…]; ​ ALTER TABLE 表名 ​ ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; 删除字段 ​ ALTER TABLE 表名 DROP 字段名; 修改字段 ​ ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…]; ​ ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…]; ​ ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…]; #### 1.修改数据库引擎 ```shell mysql> alter table service engine=innodb; //engine=myisam|memory|.... ``` #### 2.添加字段 ```shell mysql> create table student10 (id int); mysql> alter table student10 add name varchar(20) not null, add age int not null default 22; mysql> alter table student10 add stu_num int not null after name; //添加name字段之后 mysql> alter table student10 add sex enum('male','female') default 'male' first; //添加到最前面 ``` #### 3.删除字段 ```shell mysql> alter table student10 drop sex; ``` #### 4.修改字段类型 ```shell MySQL [school]> desc student10; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | age | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.01 sec) MySQL [school]> alter table student10 modify age tinyint not null ; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 MySQL [school]> desc student10; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | age | tinyint(4) | NO | | NULL | | +-------+------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) MySQL [school]> alter table student10 modify id int not null primary key ; ////修改字段类型、约束、主键 Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 MySQL [school]> desc student10; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | age | tinyint(4) | NO | | NULL | | +-------+------------+------+-----+---------+-------+ ``` #### 5.增加约束 ```shell MySQL [school]> alter table student10 modify id int not null primary key ; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 MySQL [school]> desc student10; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | age | tinyint(4) | NO | | NULL | | +-------+------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) MySQL [school]> alter table student10 modify id int not null primary key auto_increment; ERROR 1068 (42000): Multiple primary key defined //错误,该字段已经是primary key MySQL [school]> alter table student10 modify id int not null auto_increment; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 MySQL [school]> desc student10; +-------+------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | age | tinyint(4) | NO | | NULL | | +-------+------------+------+-----+---------+----------------+ ``` #### 6.增加主键 ```shell MySQL [school]> desc student1; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | age | int(11) | YES | | NULL | | | name | char(1) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 3 rows in set (0.00 sec) MySQL [school]> alter table student1 add primary key(id); MySQL [school]> desc student1; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | age | int(11) | YES | | NULL | | | name | char(1) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 3 rows in set (0.00 sec) ``` #### 7.修改主键和自增 ```shell MySQL [school]> alter table student1 modify id int auto_increment; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 MySQL [school]> desc student1; +-------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | age | int(11) | YES | | NULL | | | name | char(1) | YES | | NULL | | +-------+---------+------+-----+---------+----------------+ ``` #### 8.删除主键 ```shell MySQL [school]> desc student10; +-------+------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | age | tinyint(4) | NO | | NULL | | +-------+------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) MySQL [school]> alter table student10 drop primary key; ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key 删除自增 ySQL [school]> alter table student10 modify id int not null; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 MySQL [school]> desc student10; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | age | tinyint(4) | NO | | NULL | | +-------+------------+------+-----+---------+-------+ MySQL [school]> alter table student10 drop primary key; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 MySQL [school]> desc student10; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | age | tinyint(4) | NO | | NULL | | +-------+------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) ``` #### 9.复制表 复制表结构+记录 (key不会复制: 主键、外键和索引)复制表结构/记录+表结构,不会将Key复制 ```shell mysql> create table new_service select * from service; ``` 只复制表结构 ```shell mysql> create table new1_service select * from service where 1=2; //条件为假,查不到任何记录 ``` 可以复制主键,只复制表结构 ```shell mysql> create table t4 like employees; ``` #### 10.删除表 ```shell mysql> DROP TABLE 表名; ``` #### 11.修改数据表中字段的值 语法: ​ Update 表名 set 列名=值where 条件 ```shell mysql> update student set name='123' where id=1; ``` 删除某一行: ​ delete from 表名 where id=1 ```shell mysql> delete from type where id=1; ``` ## 五:库操作 #### 1.简介 ​ 系统自带库的含义及作用 ```shell MySQL [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ ``` information_schema:虚拟库,主要存储了系统中的一些数据库对象的信息,例如用户表信息、列信息、权限信息、字符信息等 performance_schema:主要存储数据库服务器的性能参数 mysql:授权库,主要存储系统用户的权限信息 sys:主要存储数据库服务器的性能参数 注意:information_schema ​ SCHEMATA 存放的是系统中的库 ```shell MySQL [information_schema]> select * from information_schema.SCHEMATA; +--------------+--------------------+----------------------------+------------------------+----------+ | CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | +--------------+--------------------+----------------------------+------------------------+----------+ | def | information_schema | utf8 | utf8_general_ci | NULL | | def | mysql | latin1 | latin1_swedish_ci | NULL | | def | performance_schema | utf8 | utf8_general_ci | NULL | | def | school | latin1 | latin1_swedish_ci | NULL | | def | sys | utf8 | utf8_general_ci | NULL | +--------------+--------------------+----------------------------+------------------------+----------+ 目录_名称 实际库_名称 默认_字符_设置_名称 默认_分类_名称 ``` ​ TABLES 存储表名 ```shell MySQL [information_schema]> select * from information_schema.TABLES\G *************************** 283. row *************************** TABLE_CATALOG: def TABLE_SCHEMA: xingdian TABLE_NAME: t1 TABLE_TYPE: BASE TABLE ENGINE: InnoDB VERSION: 10 ROW_FORMAT: Dynamic TABLE_ROWS: 1 AVG_ROW_LENGTH: 16384 DATA_LENGTH: 16384 MAX_DATA_LENGTH: 0 INDEX_LENGTH: 0 DATA_FREE: 0 AUTO_INCREMENT: NULL CREATE_TIME: 2022-09-22 08:18:38 UPDATE_TIME: 2022-09-22 08:18:54 CHECK_TIME: NULL TABLE_COLLATION: latin1_swedish_ci CHECKSUM: NULL CREATE_OPTIONS: TABLE_COMMENT: 283 rows in set (0.02 sec) ``` ​ COLUMNS 存储字段 ```shell *************************** 3083. row *************************** TABLE_CATALOG: def TABLE_SCHEMA: xingdian TABLE_NAME: t1 COLUMN_NAME: id ORDINAL_POSITION: 1 COLUMN_DEFAULT: NULL IS_NULLABLE: YES DATA_TYPE: int CHARACTER_MAXIMUM_LENGTH: NULL CHARACTER_OCTET_LENGTH: NULL NUMERIC_PRECISION: 10 NUMERIC_SCALE: 0 DATETIME_PRECISION: NULL CHARACTER_SET_NAME: NULL COLLATION_NAME: NULL COLUMN_TYPE: int(11) COLUMN_KEY: EXTRA: PRIVILEGES: select,insert,update,references COLUMN_COMMENT: GENERATION_EXPRESSION: 3083 rows in set (0.03 sec) ``` #### 2.创建库 方案一:交互式操作 ```shell mysql> create database xingdian; ``` 数据库命名规则: ​ 区分大小写 ​ 唯一性 ​ 不能使用关键字如 create select ​ 不能单独使用数字 方案二:非交互式 ```shell mysql -u root -pQianFeng@123 -e "create database diandian" ``` #### 3.查看数据库 ```shell mysql> show databases; mysql> show create database xingdian; mysql> select database(); 查看当前所在的库 ``` #### 4.切换数据库 ```shell mysql> use xingdian; ``` #### 5.删除数据库 ```shell mysql> DROP DATABASE 数据库名; ```