欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

从零开始学MySQL(三)

程序员文章站 2022-05-01 09:45:35
经过上两节的洗礼,我们能够连接上服务器,并成功地进入与mysql交互的会话中了。那么现在就可以发起SQL语句,让服务器来执行它了!这听起来很酷吧?接下来,我们开始学习MySQL的相关知识。 本文概览: (一)MySQL体系结构术语 (二)执行SQL语句和清除已输入的SQL语句 (三)数据库术语 (四 ......

经过上两节的洗礼,我们能够连接上服务器,并成功地进入与mysql交互的会话中了。那么现在就可以发起sql语句,让服务器来执行它了!这听起来很酷吧?接下来,我们开始学习mysql的相关知识。

本文概览:

(一)mysql体系结构术语

(二)执行sql语句和清除已输入的sql语句

(三)数据库术语

(四)创建数据库、表

 

(一)mysql体系结构术语


在学习语法前呢,我们还是要先明确一下mysql中的一些术语。这将能起到自然过渡的作用。

实际上,当我们在使用mysql时,显然会用到至少两个程序。原因是mysql采用的是“客户端/服务器”体系结构(这里隐式指出,从客户端连接到服务器的首要条件是网络)。因而,有一个程序为mysql服务器,另外一个程序为mysql客户端。下面介绍一下它们的用途。

mysql服务器:我们通常称它为mysqld。mysqld运行在存放数据库的那台machine上;它主要负责监听网络上的客户端请求,根据这些请求去访问数据库内容,然后再将获取的内容提供给客户端。

mysql客户端:我们通常称它为mysql。mysql可以运行在服务器上,也可以是任意一台将连接参数设为该服务器ip的machine;它主要负责连接到服务器,并向服务器发起查询,以获取查询结果。

在这里需要明确一点,即mysql想要从数据库中拿到什么信息,需要让服务器mysqld去和数据库沟通,而不是越俎代庖。

不过,犀利的小伙伴注意到了,前面用了“至少”一词。的确,另外还有两个主要用于管理的客户端程序,即mysqldump和mysqladmin。

mysqldump:主要用来把表的内容导出到文件里。为什么要导出?备份!

mysqladmin:主要用来检查数据库服务器的工作状态,以及执行一些数据库管理相关的任务,如通知服务器管关闭。

 

 

(二)执行sql语句和清除已输入的sql语句


 

1. 如何在mysql里输入一个“完整”的语句?( 只有sql语句书写完整才能够被执行,故此处使用“完整”作为说辞 )。

直接输入语句,并在语句的结尾处添加一格分号( ; ),之后按下回车键即可。这样,mysql就向mysqld发起了一次请求。这个过程与我们使用电脑连接上网络,打开浏览器进入必应搜索首页,在搜索框中输入想要搜索的内容,再点击搜索按钮或直接回车是一致的,对吧?其中,我们可以将电脑视为客户端,浏览器只是客户端的一个代理,而必应搜索引擎在这里就会通过一些手段向相关的服务器发起查询了。输入想要搜索的内容和点击搜索按钮或回车就相当于发起了一次事务(具体什么是事务,后面学到自会讲解。若受好奇心驱使,还请“摆渡”)。

ps:

  ① 分号( ; )就像我们平时使用句号( 。)的作用一样,标志这语句的结束。只有这样,mysqld才清晰了你此次就想查询这么多的内容,是吧?

  ② 同样的,逗号( , )与我们平时使用逗号(,)的作用一样,可用于分隔语句。但注意,在mysql中,只能用英文状态下的逗号,否则还没送至mysqld,就直接先被语法解析器拦截下来了。(代码是字母组成的对吧,你见过谁用纯中文写代码么?这样一想,逗号用英文状态下的是不是就特别有道理!)

 

这里介绍一下其他终止语句的方法:\g、\g,它们的用法与分号( ; )相同,都是将其放在语句的尾部即可。

  ① \g 的意思是go。显示查询结果与分号( ; )相同。

  ② \g 会以“垂直”的方式显示查询结果,每行显示一个值。这在输出结果中,每一行包含的列数较多时尤为有用。

 

2. 如何在mysql里清除那些已输入了的语句?(应当注意,此时您尚未按下回车。一旦你按下回车,服务器响应是十分迅速的,这意味这你只能使用ctrl+d或ctrl+c来取消执行了)

  ① 使用backspace键进行回退(不通用)。但这个方法有很大的局限性,因为只有当你输入一行时尚可如此做,当输入了多行,就只能清除最下面的一行。ps:输入多行时,除了第一行的提示符为mysql> ,其他行都是-> 。

  ② 使用 \c 取消语句的执行(通用)。\c的意思是cancel。

 

3. 实战:

  ① 使用分号( ; )和 \g作为语句的结束标志。至于\g,请读者自行尝试。

从零开始学MySQL(三)

 

  ②同一行中可以置放多个语句,使用分号( ; )隔开即可。想不通为什么这样做可行,就联想下中文句号在同一行中是否可以使用多次即可。

从零开始学MySQL(三)

ps:与创建选项文件一样,多个语句可以被存储在一个sql脚本中,之后再利用shell的重定向功能就能执行脚本里面的语句了。在这先卖个关子,用到之时再做讲解。

 

 4. 记不住那么多怎么办?答曰:能怎么办?偷懒呗!

看到下面第一行和最后一行了么?就是这么赤裸裸的提示:

从零开始学MySQL(三)

 

 

(三)数据库术语


在创建数据库和表之前,先了解一下有关数据库的一些术语十分必要。提及数据库,我们就要来确定一下mysql的立场了。当前的数据库有几大分类,分别为关系型数据库(rdbms)和非关系型数据库(nosql)。

 

mysql被划分为rdbms,字面中的含义即代表了它的用途。那么将它拆分为三部分,即rdbms → r、db、ms来解读一下

  ① db(database):说白了,“数据库”等同于我们现实中的“仓库”,但它不是用来囤货的,而是用来 “屯数据屯信息” 的。

  ② ms(management system):什么是管理?无非就是对记录进行“检索、插入、修改、删除”。因此,管理系统是建立在mysql的一个上层应用。通过它,我们可以对多个数据库做到心中有数。

  ③ r(relational):一字道出mysql数据库的性质。什么是关系?关系是通过将两个以上的表中的共同元素,将这些表 的信息紧密联系起来,形成一个更大的整体(表)。这样子就将散落在各处的数据规整为一个更大的集合,有点解决了“信息孤岛”的意味。虽然说在设计数据库时,这些“信息孤岛”是我们有意为之的,其目的是为了方便日后提高的一些操作性能。

 

② 有人的地方就有江湖,有“库”的地方就有“表”。下面就来对数据库做进一步的阐述。

潜在的关系链:数据库(database)>表(table)>记录(record)。其中 > 符号表示包含之意。

  ① 数据库:存储分类数据的仓库。为什么说分类呢?因为数据库中的表都是基于某一个主题的。

  ② 表:数据库里的数据集。什么是数据集,基于某个特定目的而搜寻的数据集合。表是先由一个或多个列构成的,存储数据的时候才有行这一说法。

  ③ 记录:一条记录对应表中的一行。因此,每条记录均包含了表中所有列的信息。

从上面可见,数据库和表属于容器层面的,而记录属于细节层面的。因此使用mysql更多时间是对记录的处理,比如检索、修改等等。

 

 

(四)创建数据库、表


 

1. 创建数据库

创建数据库需要使用create database语句。该语句有格式如下:

create database 数据库名;

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

 

需要注意的是,该语句只管创建某个数据库,并不会同时选择它作为默认数据库。不信?那么我们来测试一下:

select database();

结果定然会显示为null。

 

此时,可使用use 数据库名; 语句设置默认数据库。这一点和linux系统的“mkdir 目录名”用法相同,难道不是吗?想一下,你创建了一个目录,你直接就能处于目录中了?当然不可能,系统可不会帮你切换至该目录!啧啧,你还需要用cd命令呢!

use 数据库名;

 

2. 创建表

创建数据表需要使用ceate table语句。该语句格式如下:

create table 表名(列定义);

列定义包括三点:列名、列的数据类型、列的一些其他属性。这里限于篇幅,不再往下讲解。相信您看了这么久,大概也有点“躁”了。若感兴趣,请移步下一节吧。

 

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

create database sims; -- student information mangerment system

select database();

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”的部分。

 

anyway,今天的学习到这里就结束了。对比一下的下面两张图有什么不同吧?然后思考:为什么第一张图中会报错?是什么原因造成的?

ps: 最好自己按照提示做(可能会耗费5~10分钟),实在想不通再尝试从网上查找答案。当然,下面附带了一个链接,可能没那么容易看懂,但比起明显的答案,这更符合您的智力。

从零开始学MySQL(三)

从零开始学MySQL(三)

附上一个链接:https://*.com/questions/15534977/mysql-cannot-add-foreign-key-constraint