MySQL安装

通过apt安装MySQL服务

1
2
3
4
# 更新源
sudo apt-get update
# 安装
sudo apt-get install mysql-server

安装完成后,进行初始化配置

1
sudo mysql_secure_installation

配置项如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#1
VALIDATE PASSWORD PLUGIN can be used to test passwords...
Press y|Y for Yes, any other key for No: N (选择N ,不会进行密码的强校验)

#2
Please set the password for root here...
New password: (输入密码)
Re-enter new password: (重复输入)

#3
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them...
Remove anonymous users? (Press y|Y for Yes, any other key for No) : N (选择N,不删除匿名用户)

#4
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network...
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : N (选择N,允许root远程连接)

#5
By default, MySQL comes with a database named 'test' that
anyone can access...
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : N (选择N,不删除test数据库)

#6
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y (选择Y,修改权限立即生效)

Mycil安装

传统的MySQL安装后是没有语法补全的,这当然会令我们比较痛苦,效率也比较低。而Mycil是其MySQL的命令行界面,其具有语法提示和语法高亮。

1
sudo apt-get install mycil

这样便安装好了mycil。

MySQL服务

启动

Linux下要进入mysql服务器首先要启动mysql服务,其命令如下

1
sudo service mysql start

相应的,若要关闭或重启mysql服务,则命令如下

1
2
sudo service mysql stop
sudo service mysql restart

这样后,Linux便启动mysql的服务了,之后我们便可以登陆进mysql

登陆

在最新版本的mysql8.0中,其为了安全性,默认要进行用户验证,必须使用sudo才能进行登陆

1
sudo mysql -u root -p

之后便是输入root用户的密码,然后便可进入mysql数据库了。

mycil与mysql登陆基本一致,不过它是将root密码一次性输入,例如

1
sudo mycil -u root -p 123456

这里的123456即为root密码,这样就可以登陆进mycil了。

数据库操作

查看数据库

进入mysql后,我们可以先查看mysql的版本

1
select version();

可以发现mysql的版本是8.0.23

当进入mysql数据库后,可以使用show语句进行查看所有数据库

1
show databases;

不能忘记分号 “;”

创建新数据库

新建一个数据库

1
create database 数据库名称;

相应的删除操作即为

1
drop database 数据库名称;

数据表操作

对于创建的数据库,如果我们要使用它,便有以下语句

1
use 数据库名称;

在使用这个数据库后,即进入了该数据库,而数据库是由表构成的,于是我们可以新建一个表:

1
create table stuinfo(id int,name varchar(10),loaction char(20));

注意:这里的varchar与char不同,char是固定长度,而varchar为可变长度。故char(20)是固定长度20的字符类型,而varchar(10)则是可变最大长度为10的字符类型。

现在我们可以使用命令,观察刚才创建表的结构

1
desc stuinfo;

现在这个表还是空的,那我们要为它插入一些值,命令如下:

1
2
3
insert into stuinfo values (1,'xiaoming','shanghai');
insert into stuinfo values (2,'lihan','xian');
insert into stuinfo values (3,'wanggang','beijing');

现在我们可以查看整个表,命令如下

1
select * from stuinfo;

其中 * 代表所有列,而表名后不加where,则代表所有行,因此取出所有行,所有列。

但我们需要知道,这条语句是暴力查询,在平时我们应尽量避免使用,当我们要查特定某些列或行时,应指明列名,避免查询整张表,从而减少系统的负担。

当我们要替换其中的一个值时,要怎么办呢?

1
update stuinfo set name='liliang' where id=2;

可以发现,原来’lihan’已经被替换成了’liliang’

删除就是指删除一整行,我们可以使用如下命令

1
delete from stuinfo where id=3;

可以发现,第三行已经删除了。

那如果我们想删除整个表,使用什么命令比较简洁呢?

1
drop table stuinfo;

便可以直接删除整个stuinfo表。

如果我们要特定查看某一行的数值是否存在,则可以使用select语句实现

1
select * from student_1 where name='ppp'

这样name=’ppp’的这一行就能被特定搜索出来了。

当然我们也可以指定特定的某些列,如下

1
select age,location from student_1 where name='王明'

注释

单行注释

1
2
#注释文字
-- 注释,注意--后有空格

多行注释

1
/* 注释文字 */

保存文件

1
tee ~/sql/

将sql文件保存在sql文件夹下

列类型

数值型

整型

  • tinyint

    占据空间:1字节(八位),存储范围:(有符号):-128~127,(无符号):0~255。

  • smallint

    占据空间:2字节(16位),存储范围:-32768~32767,0~65535

  • mediumint

    占据空间:3字节(24位)

  • int

    占据空间:4字节(32位)

  • bigint

    占据空间:8字节(64位)

    $n$字节,其共有$8n$位,则存储范围为:

但在申明类型时,例如int型,我们该如何选择它是无符号还是有符号的呢?

首先创建一个表,其中age采用tinyint 型

向表里插入一个age值为128的人

可以发现,其报错了,128超过了tinyint的范围,则证明tinyint不加特殊说明时,默认是有符号的,其范围为-128~127。

为表再加一列,其命令为

1
alter table 表名 add 列明 参数

上述即为创建了一个名为score的列,其tinyint为unsigned,即无符号;不允许为空,默认值为0。

可以发现,在定义了tinyint 为unsigned后,其范围即变为0~255。

但如果现在要求我们给班级的每个人添加上学号应该怎么办?学号一般是有固定长度的,例如:000001,000029等,这应该怎么实现呢?

在这里我们使用了(6)与zerofill两个参数,可以发现num的默认值变为000000了。同时可以发现num的类型多出来了unsigned(由于零填充不可能为负值,故zerofill同时也是unsigned类型)现在插入几个值试试。

于是我们可以总结一下int型的参数:

浮点型

float(M,D)decimal(M,D)

其中M表示“精度”——代表总位数,而D代表“标度”——小数点右边的位数。

同时浮点型也可以在其后面定义unsigned,如下所示定义

而float的整数部分能存10\^38,小数部分能存10\^-38。

如果M<24,则其占4个字节,否则占8个字节。

另一种存储方式叫定点decimal,是把整数部分和小数部分分开存储的,其比float精确。

我们通过实验可以发现两者差异,首先创建一个表

后向表中插入值,可以发现

acc1中的值与真实值不相符,为1234567.38,而真实值为1234567.36。其中acc1是float型的,acc2是decimal型的。故可以发现float的精度有时会有损精度

字符型

  • char

    定长,例如char(4)即创建4个长度的字符型,不管内容如何其长度都为4。这会导致浪费空间。创建n个长度,如果内容不够nn个长度,则会用空格补齐至n个长度。

    但char类型由于其每个是固定长度的,所以其查找较快,因为可通过固定长度直接计算得到文件指针位置。

  • varchar

    变长,其不用空格补齐。例如varchar(10),如果现在存储字符串’小明’,则它的存储长度并不是2,在’小明’的前面会有前缀,来记录内容的长度,在这个例子里该前缀的填入的内容即为2

则以上可以发现char的利用率可能得到100%,但varchar的利用率一定<100%。

注意char(M),varchar(M)限制的是字符,不是字节。

  • text:

    文本类型,可以存比较大的文本,但搜索较慢。因此,如果不是特别大的内容,建议用char、varchar来代替。

    注意,声明text列时,不必给它默认值。

时期时间类型

可能我们会有这样的一个疑问?既然已经有了char型与varchar型,那么用它们进行存储时期与时间不就完事了吗?为什么还要用专门的时期时间类型。从存储空间上来说,时期时间类型对存储的时期与时间进行了优化,其存储空间会小于用char与varchar存储的空间。

date型

创建一个具有date列类型的表,一般例如一个人的生日会用到时期。

插入数值,可以得到

date型的的标准格式为:YYYY-MM-DD,而其范围为1000-01-01~9999-12-31。

time

time类型与date类型格式较相同,不过其表示的为HH-MM-SS,即时-分-秒

datetime

datetime类型是date与time的结合体,就是年-月-日-时-分-秒。

timestamp

timestamp在取默认值时,比较特殊,其可以记录当前的时间。例如新增一列sign,其type:timestamp。其defalut:CURRENT_TIMESTAMP,其为系统常量,时时刻刻指向当前时间

插入值,可得:

其默认值即为当前的时间。

建表

在实际开发中,我们需要创建表时,需要首先分析需求,并进行优化。

一般来说,优化原则为:经常使用并查看的信息,可以放在一张表中,并采取定长,可以极大优化搜索效率;不常用的信息,可以放在另外一张表中,可采取变长,可以节省空间。

列名称 列类型 默认值 是否主键
Id int unsigned PRL
Username char(20)
Gender char(1)/tinyint
weight tinyint unsigned
Birth date
Salary decimal(8,2)
lastlogin int unsigned

我们根据上表建立数据表,