存储数据是处理数据的第一步 。只有正确地把数据存储起来,我们才能进行有效的处理和分析。否则,只能是一团乱麻,无从下手。那么,怎样才能把用户各种经营相关的、纷繁复杂的数据,有序、高效地存储起来呢? 在 MySQL 中,一个完整的数据存储过程总共有 4 步,分别是创建数据库、确认字段、创建数据表、插入数据。
我们要先创建一个数据库,而不是直接创建数据表呢?
因为从系统架构的层次上看,MySQL 数据库系统从大到小依次是 数据库服务器 、 数据库 、 数据表 、数据表的 行与列 。
MySQL 数据库服务器之前已经安装。所以,我们就从创建数据库开始。
数据库名、表名不得超过30个字符,变量名限制为29个
必须只能包含 A–Z, a–z, 0–9, _共63个字符
数据库名、表名、字段名等对象名中间不要包含空格
同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使用`(着重号)引起来
保持字段名和类型的一致性:在命名字段并为其指定数据类型的时候一定要保证一致性,假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了
其中,常用的几类类型介绍如下:
CREATE DATABASE 数据库名;
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
查看一下字符集
CREATE DATABASE IF NOT EXISTS 数据库名;
如果MySQL中已经存在相关的数据库,则忽略创建语句,不再创建数据库。
注意:DATABASE 不能改名。一些可视化工具可以改名,它是建新库,把所有表复制到新库,再删旧库完成的。
SHOW DATABASES; #有一个S,代表多个数据库
SELECT DATABASE(); #使用的一个 mysql 中的全局函数
SHOW TABLES FROM 数据库名;
USE 数据库名;
注意:要操作表格和数据之前必须先说明是对哪个数据库进行操作,否则就要对所有对象加上“数据库名.”。
ALTER DATABASE 数据库名 CHARACTER SET 字符集; #比如:gbk、utf8等
DROP DATABASE 数据库名;
DROP DATABASE IF EXISTS 数据库名
必须具备:
语法格式:
CREATE TABLE [IF NOT EXISTS] 表名(
字段1, 数据类型 [约束条件] [默认值],
字段2, 数据类型 [约束条件] [默认值],
字段3, 数据类型 [约束条件] [默认值],
……
[表约束条件]
)指定引擎,字符集等额外信息;
加上了IF NOT EXISTS关键字,则表示:如果当前数据库中不存在要创建的数据表,则创建数据表;如果当前数据库中已经存在要创建的数据表,则忽略建表语句,不再创建数据表。
必须指定:
表名
列名(或字段名),数据类型,长度
可选指定:
创建表举例1:
CREATE TABLE `customer_bank` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`customerBankId` bigint(20) DEFAULT NULL COMMENT '唯一Id',
`customerName` varchar(100) DEFAULT NULL COMMENT '客户名称',
`customerId` bigint(20) DEFAULT NULL COMMENT '客户customerId(关联customer表customerId)',
`companyCode` bigint(20) DEFAULT NULL COMMENT '公司编号关联(company.companyCode)',
`bankName` varchar(100) DEFAULT NULL COMMENT '开户银行',
`subbranch` varchar(150) DEFAULT NULL COMMENT '开户支行(全称)',
`provice` varchar(20) DEFAULT NULL COMMENT '省份',
`city` varchar(20) DEFAULT NULL COMMENT '城市',
`accountNumber` varchar(50) DEFAULT '' COMMENT '银行账号',
`accountName` varchar(50) DEFAULT NULL COMMENT '银行户名',
`mobile` varchar(11) DEFAULT '' COMMENT '手机号(手机号为您办理银行卡预留的手机号)',
`createTime` datetime DEFAULT NULL COMMENT '创建时间',
`updateTime` datetime DEFAULT NULL COMMENT '修改时间',
`isDelete` int(2) DEFAULT '0' COMMENT '有效状态:0 有效,1:无效',
`status` int(2) DEFAULT '1' COMMENT '银行卡状态: 0 冻结 1有效 2 变更中',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_customerBankId` (`customerBankId`) USING BTREE,
KEY `idx_customerId` (`customerId`) USING BTREE,
KEY `idx_companyCode` (`companyCode`) USING BTREE,
KEY `idx_isDelete` (`isDelete`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COMMENT='用户银行卡表';
DESC customer_bank;
指定的列和子查询中的列要一一对应
通过列名和默认值定义列
create table customer_bank_1 as select * from customer_bank;
create table customer_bank_2 as select * from customer_bank where 1!=2; -- 创建的emp2是空表
CREATE TABLE dept80
AS
SELECT employee_id, last_name, salary*12 ANNSAL, hire_date
FROM employees
WHERE department_id = 80;
DESCRIBE dept80;
在MySQL中创建好数据表之后,可以查看数据表的结构。MySQL支持使用 DESCRIBE/DESC 语句查看数据表结构,也支持使用 SHOW CREATE TABLE 语句查看数据表结构。
语法格式如下:
SHOW CREATE TABLE 表名\G
使用SHOW CREATE TABLE语句不仅可以查看表创建时的详细语句,还可以查看存储引擎和字符编码。
修改表指的是修改数据库中已经存在的数据表的结构。
使用 ALTER TABLE 语句可以实现:
向已有的表中添加列
修改现有表中的列
删除现有表中的列
重命名现有表中的列
语法格式如下:
ALTER TABLE 表名 ADD 【COLUMN】 字段名 字段类型 【FIRST|AFTER 字段名】;
举例:
ALTER TABLE dept80 ADD job_id varchar(15);
可以修改列的数据类型,长度、默认值和位置
修改字段数据类型、长度、默认值、位置的语法格式如下:
ALTER TABLE 表名 MODIFY 【COLUMN】 字段名1 字段类型 【DEFAULT 默认值】【FIRST|AFTER 字段名2】;
ALTER TABLE dept80 MODIFY last_name VARCHAR(30);
ALTER TABLE dept80 MODIFY salary double(9,2) default 1000;
对默认值的修改只影响今后对表的修改
此外,还可以通过此种方式修改列的约束。
使用 CHANGE old_column new_column dataType
子句重命名列。语法格式如下:
ALTER TABLE 表名 CHANGE 【column】 列名 新列名 新数据类型;
举例:
ALTER TABLE dept80 CHANGE department_name dept_name varchar(15);
4.4 删除一个列
删除表中某个字段的语法格式如下:
ALTER TABLE 表名 DROP 【COLUMN】字段名
举例:
ALTER TABLE dept80 DROP COLUMN job_id;
RENAME TABLE emp TO myemp;
ALTER table dept
RENAME [TO] detail_dept; -- [TO]可以省略
在MySQL中,当一张数据表 没有与其他任何数据表形成关联关系 时,可以将当前数据表直接删除。
数据和结构都被删除
所有正在运行的相关事务被提交
所有相关索引被删除
语法格式:
DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, …, 数据表n];
IF EXISTS
的含义为:如果当前数据库中存在相应的数据表,则删除数据表;如果当前数据库中不存在相应的数据表,则忽略删除语句,不再执行删除数据表的操作。
DROP TABLE dept80;
TRUNCATE TABLE detail_dept;
对比DELETE TABLE:
总结区别主要有以下:
truncate 不带任何条件(包括where ,order by,limit等) 语法只有一条: TRUNCATE [TABLE] tbl_name 而delete可以。
truncate 不能一次删除多个表的数据,而delete可以。
truncate不能带条件,所以可以看出truncate 属于表级别删除,一次行删除表中所有数据,而不能指定某行而delete可以。
truncate 会删掉自增的值,而delete 会保留.
delete 是属于dml语句,truncate是属于ddl 删除,因此,delete 作用与事务,删除时会进入回滚段中,在没有设置自动提交的前提下,还以rollback 操作进行回滚,而truncate则不可回滚。
delete 是一条一条删除,日志会记录每行数据的删除记录,而truncate 只记录TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
对于有 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。
truncate比delete 快,大量数据时切不考虑事务时,可用truncate.
当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。
SET autocommit = FALSE; # 自动提交事务关闭
DELETE FROM emp2;
#TRUNCATE TABLE emp2;
SELECT * FROM emp2; # 数据没了
ROLLBACK; # 回滚
SELECT * FROM emp2; #数据回来了
阿里开发规范:
【参考】TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE 无事务且不触发 TRIGGER,有可能造成事故,故不建议在开发代码中使用此语句。
说明:TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。