~ DDL 操作数据库
数据定义语言(DDL),主要是操作数据库(DataBase)和数据库表(table)。
对数据库(DataBase)进行“增删改查”
数据库可以看做是一个专门存储数据对象的容器,每个数据库都有唯一的名称,并且,数据库的名称都是有实际意义的,这样就可以清晰的看出每个数据库用来存放什么数据。
在 MySQL 数据库中,存在系统数据库和自定义数据库,系统数据库是安装 MySQL 后系统自带的数据库,自定义数据库是由用户定义创建的数据库。
- information_schema:主要存储了系统中的一些数据库对象信息,比如用户表信息、列信息、权限信息、字符集信息和分区信息等。
- mysql:MySQL 的核心数据库,类似于 SQL Server 中的 master 表,主要负责存储数据库用户、用户访问权限等 MySQL 自己需要使用的控制和管理信息。常用的比如在 mysql 数据库的 user 表中修改 root 用户密码。
- performance_schema:主要用于收集数据库服务器性能参数。
- sys:MySQL 5.7 安装完成后会多一个 sys 数据库,主要提供了一些视图,数据都来自 performation_schema,主要是让开发者和使用者更方便地查看性能问题。
......
[1]
创建一个数据库// MySQL 不允许在同一系统下创建两个相同名称的数据库CREATE DATABASE 数据库名; // 安装时默认的编码 或 CREATE DATABASE 数据库名 CHARSET utf8;[2]
删除一个数据库// 需要注意的是,MySQL 安装后,系统会自动创建名为 information_schema 和 mysql 的两个系统数据库,系统数据库存放一些和数据库相关的信息,如果删除了这两个数据库,MySQL 将不能正常工作。
另外,使用 DROP DATABASE 命令时,要非常谨慎。在执行该命令后,MySQL 不会给出任何提示确认信息。DROP DATABASE 删除数据库后,数据库中存储的所有数据表和数据也将一同被删除,而且不能恢复。
因此,最好在删除数据库之前先将数据库进行备份。
drop database users1;[3]
切换数据库(修改当前使用哪个数据库)在 MySQL 中就有很多系统自带的数据库,那么在操作数据库之前就必须要确定是哪一个数据库。当用 CREATE DATABASE 语句创建数据库之后,该数据库不会自动成为当前数据库,需要用 USE 来指定当前数据库。
use 数据库名;[ AlERT DATABASE(略) ] 在 MySQL 数据库中只能对数据库使用的字符集和校对规则进行修改,数据库的这些特性都储存在 db.opt 文件中,可以使用 ALTER DATABASE 来修改已经被创建或者存在的数据库的相关参数。
[4]
查看正在使用哪个数据库select database();查看的所有数据库 show databases; 查看某个数据库的定义(详细)信息 show create database 数据库名;
以上内容不是很重要,了解即可;在图形工具中不需要,在命令行中可能会用到
对数据表(table)_ 及其结构(即,字段)进行操作
数据表是数据库的重要组成部分,每一个数据库都是由若干个数据表组成的。换句话说,没有数据表就无法在数据库中存放数据。
比如,在电脑中创建一个空文件夹,如果要把“MySQL 数据库学习”字样存放到文件夹中,必须把它写在 Word 文档、记事本或其它能存放文本的文档中。这里的空文件夹就相当于数据库,存放文本的文档就相当于数据表。
创建数据库后,可使用 SQL 语句来对数据表的进行操作,主要包括创建数据表、查看数据表结构、修改数据表和删除数据表等。创建数据表,需要以下信息:表名(& 表类型)、字段名(及数据类型)。
[ MySQL 数据类型和存储引擎?! ] 需要说明的是,数据表由多个字段组成,每个字段在进行数据定义的时候都要确定不同的数据类型,向每个字段插入的数据内容决定了该字段的数据类型。MySQL 提供了丰富的数据类型,根据实际需求,用户可以选择不同的数据类型。
不同的数据类型,存储方式是不同的。因此,MySQL 还提供了存储引擎,可以通过存储引擎决定数据表的类型。

[ 1 - 创建一张数据表 ]
CREATE TABLE [IF NOT EXISTS] 表名( 字段1 数据类型(长度) [字段属性|约束][索引][注释], 字段2 数据类型(长度) [字段属性|约束][索引][注释], ... 字段n 数据类型(长度) [字段属性|约束][索引][注释] )[表类型][表字符集][注释]; // MySQL 中,如果使用的数据库名、表名或字段名与保留字冲突,需使用撇号(`)括起来; // 使用 CREATE TABLE 语句创建表时,多字段之间使用逗号分隔,最后一个字段无需逗号;
// 学生表代码示例 CREATE TABLE `student`( `studentNo` INT(4) NOT NULL PRIMARY KEY COMMENT '学号', #非空,主键 `loginPwd` VARCHAR(20) NOT NULL COMMENT '密码', `studentName` VARCHAR(50) NOT NULL COMMENT '学生姓名', `sex` CHAR(10) DEFAULT '男' NOT NULL COMMENT '性别', #非空,默认值为'男' `gradeId` INT(4) UNSIGNED COMMENT '年级编号', #无符号数 `phone` VARCHAR(50) COMMENT '联系电话', `address` VARCHAR(255) DEFAULT '地址' COMMENT '地址不详', # 默认值为‘地址不详’ `bornDate` DATETIME COMMENT '出生日期', `email` VARCHAR(50) COMMENT '邮件账号', `identifyCard` VARCHAR(18) UNIQUE KEY COMMENT '身份证号' # 唯一 )COMMENT='学生表';
[ 字段约束 / 属性 ] // 约束的目的在于:确保数据的完整性
数据完整性是指:数据的准确性和一致性。如,学生的学号必须唯一,性别只能是男或女。
- 实体完整性: 对数据行(记录)的约束,如:主键约束,唯一约束
- 域完整性: 对数据列(字段)的约束,如:数据类型,默认约束,非空约束
- 引用完整性: 外键约束(表和表之间的关系)
数据库是否具备数据完整性关系到数据库系统是否能真实的反映现实世界。因此,数据库的完整性是非常重要的。
MySQL 中,提供了约束机制以保证数据的完整性。为了对各字段的数据做进一步的确定,可以为字段设置字段约束或属性,以下为常用的 { 字段约束?!}:
[ 注释 ] 在创建表的同时可以为表或字段添加说明性文字,即注释。
注释,使用 COMMENT 关键字来添加。
CREATE TABLE test( id int(11) UNSIGNED COMMENT '编号' )COMMENT='测试表';
[ 编码格式设置 ] 默认情况下,MySQL 所有数据库、表、字段等使用 MySQL 默认字符集。
(安装时,设置 MySQL 默认字符集或通过 my.ini 文件中的 default-character-set 参数来修改默认字符集)
特定需求情况下,为达到特殊存储内容的要求,如某表需存储西欧文字内容,可以在创建表时指定其他字符集。
CREATE TABLE [ IF NOT EXISTS ] 表名( # 代码省略 )CHARSET = 字符集名;
[ 表类型 - 存储引擎 ?! ] 存储引擎是 MySQL 数据库管理系统的重要特征。
项目开发时,为了提高 MySQL 数据库的使用率和灵活性,可以根据实际需要来选择存储引擎。因为存储引擎指定了表的存储类型,即如何存储和索引数据、是否支持事务等,同时存储引擎也决定了表在计算机中的存储方式。
[ 2 - 删除一张数据表 ]
语法:drop table [if exist] 表名;
如果当前数据库中已存在student表,则再次创建时系统将提示出错。
drop table student;
我们需要预先检测当前数据库中是否存在该表,若存在,则先删除,然后创建,需使用 IF EXISTS 语句进行判断
// 以下为完整的创建表的语句 USE myschool; DROP TABLE IF EXISTS `student`; CREATE TABLE `student`( # 代码省略 ); 注意,使用DROP TABLE语句之前,首先要确认表中是否有业务数据,防止人为造成业务数据的丢失。 正确的方式为:与数据库管理员进行联系,对数据库数据进行备份并确认,再执行删除操作。
[ 3 - 修改表名和表结构(字段)]
[3-1] 修改表名:在一个数据库中,表名是唯一的,可以通过 SQL 语句对已创建表的表名进行修改。
// 修改表名 alter table 表名 rename 新表名; 或 rename table 表名 to 新表名; 例如,ALTER TABLE student TO stu;
[3-2] 修改表结构(字段):表创建后,有时可能会因为某些原因需要修改表结构,如添加列等。如果删除原表重建还需要考虑表中现有的数据,风险可能较大,可以通过 ALTER 关键字在已存在的数据表结构上对其进行修改。
- 添加字段
alter table 表名 add 字段名 类型(长度) [约束]; 例如:ALTER TABLE student ADD sphone VARCHAR(20) NOT NULL; # 在表的最后位置添加字段
- 删除字段
alter table 表名 drop 列名; 例如:ALTER TABLE student DROP sphone;
- 修改字段:表中一个字段包含字段名和数据类型。若修改字段,则包括修改字段名和修改数据存储的类型
// 由于不同类型的数据存储方式和长度不同,修改数据类型可能会影响数据表中已有数据,因此,慎重修改 1. 修改列名(/数据类型):alter table 表名 change 旧列名 新列名 类型(长度) 约束; 如,ALTER TABLE student CHANGE name username Char(10) NOT NULL; // 数据类型指的是修改后的数据类型,如果不需要修改则与原数据类型保持一致,但“数据类型”不能为空。 2. 修改列的类型长度和约束 alter table 表名 modify 列名 类型(长度) 约束; 例如:为分类表的描述字段进行修改,类型varchar(50) 添加约束 not null ALTER TABLE student MODIFY sname VARCHAR(50) NOT NULL; 3. 修改表的字符集(一般不修改) alter table 表名 character set 字符集;(一般不修改) 例如:为分类表 student 的编码表进行修改,修改成 gbk ALTER TABLE category CHARACTER SET gbk;
- 实际中,可能还会用到其他修改表结构的 SQL 语句,可通过 HELP ALTER TABLE 查看系统帮助找到它们
1. 添加主键约束 ANTER TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY 表名(主键字段); 如,将grade表中的gradeid设为主键 ANTER TABLE `grade` ADD CONSTRAINT `pk_grade` PRIMARY KEY `grade`(`graded`); 2. 添加外键约束 ANTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (外键字段) REFERENCES 关联表名(关联字段) 如,设置student表中的gradeid字段与grade表中的gradeid字段建立主外键关联 ALTER TABLE `student` ADD CONSTRANT `fk_student_gradeid` FOREIGN KEY(`gradeid) FEFERENCES `grade`(`gradeid`);
[ 4- 查看表结构(一个表的详细信息)]
// 查看表结构 describe 表名; 或 desc 表名; // 如,desc student; // 查看数据库中的所有表(选中哪个数据库,查看哪个) show tables; # 需要先选择数据库 use test;
在 DOS 中显示 MySQL 数据库内容中的信息时,中文内容可能会出现乱码,这是因为 DOS 窗口默认的字符格式为 GBK 格式。如果当前 MySQL 设置的默认编码格式为非 GBK 格式,则可能会产生乱码。输入信息前,可以执行:
SET NAMES gbk;
以下内容不是很重要(在命令行中可能会用到,在可视化工具中不需要),了解即可。
查看数据库(假设存在自定义数据库:webpiece)
- 查看所有的数据库
mysql> show databases
- 查看正在使用哪个数据库
mysql> select database();
- 查看某个数据库的详细信息
mysql> show create database webpiece;
创建一个数据库(test)
mysql> create database test; // 采用安装时的默认编码 或 mysql> create database test charset utf8;
切换当前使用哪个数据库(webpiece --> test)
mysql> use test;
删除一个数据库(test)
mysql> drop database test;
