RajXie

通过前面的小节,我们已然有了足够的知识储备。在接下来的章节,我们将真正开始数据库之旅——这一小节主要讲解对数据库数据表进行“创建”、“修改”、“删除”操作。希望读者在读后能够掌握建库、建表,以及对数据库的切换操作。

 

本文概览:

(一)操纵数据库

(二)操纵数据表

(三)实战

(四)总结

 

 

(一)操纵数据库


 (1)创建数据库需要使用  CREATE DATABASE  语句,删除数据库需要使用 DROP DATABASE  语句,修改数据库需要使用 ALTER DATABASE 语句。该语句汇总如下:

 

--创建数据库
----当试图创建一个已存在的数据库时,系统会报错,而加上IF NOT EXISTS子句则可避免此类错误
CREATE DATABASE [ IF NOT EXISTS ] 数据库名 [ CHARACTER SET 指定字符集  ] [ COLLATE 排序规则 ];

--删除数据库
DROP DATABASE 数据库名;

--修改数据库
ALTER DATABASE 数据库名 [ CHARACTER SET 指定字符集  ] [ COLLATE 排序规则 ];

ps:请将“数据库名”更换为你自己的数据库名。

 

 (2)切换到 “默认数据库” 的两种方法

使用 “ USE 数据库名; ” 语句。

创建了数据库并不代表会将该数据库作为当前的上下文。如果对这个说法持怀疑态度,那么可通过以下代码进行测试,结果必然显示为NULL(表示“空”的意思):

CREATE DATABASE 数据库名;
SELECT DATABASE();

 

USE 数据库名;
SELECT DATABASE();

ps:

CREATE DATABASE语句只是创建某个数据库,并不会顺手牵羊,直接地使它作为当前默认的数据库。

这一点和Linux系统的“mkdir 目录名”用法极为相似,难道不是吗?想一下,你创建了一个目录,你直接就能处于目录中了?当然不能,系统可不会帮你切换至该目录!想要达到这效果,你还需要用cd命令呢!

 

② 在连接服务器时,将某个特定的数据库以“参数”的形式一并给出,从而将之设置为上下文,即默认数据库。如下:

mysql -p -uroot 数据库名

 

 

(二)操纵数据表


 (1)创建数据表需要使用 CEATE TABLE 语句,删除数据表需要使用  DROP TABLE 语句,修改数据表需要使用 ALTER TABLE 语句。  

--创建表
----当试图创建一个已存在的数据表时,系统会报错,而加上IF NOT EXISTS子句则可避免此类错误 CREATE TABLE [ IF NOT EXISTS ] 数据表名(列定义) ENGINE=指定要用的存储引擎; --删除表
----当当试图删除一个不存在的数据表时,系统会报错,而加上IF EXISTS子句则可避免此类错误
DROP TABLE [ IF EXISTS ] 数据表名; --修改表 ALTER TABLE 数据表名 操纵动作 列名 列定义; ----改列的数据类型 alter table 数据表名 change 列名 新列名 列定义; ----改表引擎 alter table 数据表名 engine=指定要用的存储引擎; ----改表名 alter table 数据表名 rename to 新表名;

列定义包括三点:列名、列的数据类型、列的一些其他属性,皆在上节做了介绍。

 

(2)切换数据表

① 数据表的切换是依靠 FROM 数据表名 进行的,但这个子句无法单独使用,需要与“特定的操作进行配套使用”,如SELECT、UPDATE、DELETE,指代对数据表里的某些内容进行某项操作。

② 当引用多个数据表时,可能有存在几个相同列名的情况,为此就需要为这几个列额外标注上下文,避免二义性的产生。

ps:本来这点是不值得写的,但由于笔者在前面对数据库的切换进行了说明,为考虑完整的体系,在此画蛇添足。

 

 

(三)实战(请读者亲自实践一下)


 

CREATE DATABASE SIMS; -- Student Information Management System
USE SIMS;

CREATE TABLE student
(
    student_id  INT UNSIGNED AUTO_INCREMENT,
    PRIMARY KEY(student_id),
    name VARCHAR(20) NOT NULL,
    gender ENUM(\'F\', \'M\')
);

CREATE TABLE course
(
    course_id SMALLINT UNSIGNED AUTO_INCREMENT,
    PRIMARY KEY(course_id),
    name VARCHAR(20)
);


CREATE TABLE score
(
    student_id INT UNSIGNED NOT NULL,
    course_id SMALLINT UNSIGNED NOT NULL,
    score DECIMAL(2),
    PRIMARY KEY(student_id, course_id),
    INDEX (course_id),
    FOREIGN KEY (student_id)  REFERENCES student (student_id),
    FOREIGN KEY (course_id) REFERENCES course(course_id)
);

ps:

用于创建score 的SQL语句中,DECIMAL(2)等同于DECIMAL(2, 0)。如果是按百分制规则,那么将score列设置为DECIMAL(2)就恐有不适。下面粗略提下DECIMAL的用法:

DECIMAL(M, D) M表示有效数字的精度,D表示小数点后的位数。

因此,DECIMAL(M, D)表示的是存储D位小数的M位数字。又由于它通常用在定义列中,因此是对该列存储的精度进行限制。举例来说,上面的score DECIMAL(2)解析出来就是score列中存储的数据为2位数且没有小数,即-99~99。而DECIMAL(5, 2)又表示什么?请读者自己尝试回答。注意“2”占用了“5”的部分。

 

鉴于笔者已在本地创建好了数据库,因此下面只使用show等语句代为检验(该语句是下节要讲解的内容,这里不做过多赘述):

 

 

(四)总结


现实生活中,我们时常会说“拿什么”,“做什么”这样类似的话,这同样反映在数据库世界里。这里的“拿”、“做”是施加的一个动作,而“什么”则表现为一个具体的对象——比如我们说数据库A,数据库甲皆是如此,A或甲是我们人为对数据库进行区分的一个标识。

明确下我们的目标是对特定的数据库、数据表进行操纵,因此我们需要了解足够的信息:

数据库关键字为 DATABASE ,数据表关键字为 TABLE 。

操纵关键字有三,依次为 CREATE 、 ALTER 、 DROP 。

③由于是针对于特定的数据库数据表,我们就需要在DATABASE或TABLE之后指定好名称(为什么是在之后而不是之前呢?比如你想叫住a先生,用英文的说法是不是说成Mr. a ?这是我自己于记忆此内容的一个自我解释,供读者参考)。

综合上述,比如当我们需要创建某个数据库,就应该把语句写为 CREATE DATABASE 某个数据库名;,对于数据表的操作亦如是。

 

下面留一个小作业,供心有余力的读者查阅。

对于所学内容,在使用过程中总会遇到一些挫折。因而越早碰见并解决它们便能形成为自己的使用经验。笔者在使用过程中也的确如此,下面分享一下该问题、问题的来源及解决方案。

强烈建议读者在查看解决方案之前,先对比一下的下面两张图有什么不同(按照提示排错),思考为什么第一张图中的语句会报错?应该如何解决?

解决方案链接:https://stackoverflow.com/questions/15534977/mysql-cannot-add-foreign-key-constraint

分类:

技术点:

相关文章: