MySQL安装
通过apt安装MySQL服务
1 | # 更新源 |
安装完成后,进行初始化配置
1 | sudo mysql_secure_installation |
配置项如下:
1 | #1 |
Mycil安装
传统的MySQL安装后是没有语法补全的,这当然会令我们比较痛苦,效率也比较低。而Mycil是其MySQL的命令行界面,其具有语法提示和语法高亮。
1 | sudo apt-get install mycil |
这样便安装好了mycil。
MySQL服务
启动
Linux下要进入mysql服务器首先要启动mysql服务,其命令如下
1 | sudo service mysql start |
相应的,若要关闭或重启mysql服务,则命令如下
1 | sudo service mysql stop |
这样后,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 | insert into stuinfo values (1,'xiaoming','shanghai'); |
现在我们可以查看整个表,命令如下
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 | #注释文字 |
多行注释
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 |
我们根据上表建立数据表,