MySQL
MySQL简介
- MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
- MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
- MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库。
MySQL安装
1.sudo apt-get install mysql-server
安装完成后可以输入 mysql --version来查看mysql的版本信息,也确定安装成功了。
2.我们如果此时按照书上的输入mysql_secure_installation
,会出现两种情况,一种是比较顺利的,一路键入"y"到底就可以设置安全设置了。但是还有一种会出现让你输入密码的情况。这种情况又分为两种结果:①初始默认没有密码,此时我们直接enter
回车即可,便可进入mysql界面;②第二种情况比较难办,我就遇到了这种情况,输入回车后提示Access denied
,输入我的ubuntu root密码也依旧拒绝连接。对于这种情况虽然我不知道是什么原因造成的,但网上也有蛮多类似的情况的,我找到了比较好的办法,就是直接cd 到它的一个.ini文件所在目录下,一般是 cd /etc/mysql/mysql.conf.d
添加一行'skip-table'
,先设置成免密码登录,后续进入数据库之后再进行密码的修改。
具体的操作过程可参看这个博客,对较多可能会出现的情况都做了详细的解决描述。
可以看到成功进入mysql界面了
显示数据库
用show databases;
可显示当前数据库的内容,这里大小写字母都可以,但是一定不要忘记句末加分号。
我们可以看到初始的数据库自带了几个数据库。
新建数据库
这里我们可以新建一个数据库。输入create database testdb;创建一个新的数据库testdb。
我们可以看到多出一个数据库testdb。
删除数据库
一旦数据库被删除,就无法撤回或恢复,所以删除命令要谨慎使用。删除数据库使用drop database testdb;
这里我们删除了刚刚创建的数据库testdb。
选择数据库
我们刚刚创建了一个名为cs360的数据库。现在如果我们要进入此数据库在里边进行建表等相关操作时,需要用use cs360
语句。
创建表
如图所示,我们用
create table runoob_tbl(
runoob_id INT NOT NULL AUTO_INCREMENT,
...
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
语句来在cs360中创建一个表runoob_tbl。
我们用describe runoob_tbl语句来展示
在这里我们又创建了一个表dummy
删除表
我们show tables;查看现在的数据库中的表的情况
在使用drop table dummy;语句之后,可以发现名为dummy的表被删除了
插入行
我们先create一个新的表students。
我们用语句 insert into students values(1001,'lucy','50');
语句来在此数据库表中插入新的一行。
我们用select * from students;
查看插入结果:
可以看到students表中多了一行。
我们还可以运行.sql脚本文件来插入行
如图所示,我们先在终端vim 一个.sql文件,之后打开mysql,在漆面用source my.sql(my为这个脚本文件的名字)运行此脚本文件,可见成功插入了三行。脚本文件里边的内容每行其实和单独一次次插入的语句书写格式一样。
删除行
依旧以此表为例,用delete drom students where name='haha';
来删除姓名为haha的那一行数据。
再次 select * from students;
我们可以发现表少了一行
修改表
我们可以用update语句来进行表中行信息的修改。如下图所示:
关联表
一对多
1.建表存储员工信息
如果我们把员工所有信息放在一张表中,类似于我们将所有的代码都写在用一个py文件内,把所有数据都存放于一张表的弊端
1.组织结构不清晰
2.浪费硬盘空间(重复存储公共信息)
3.扩展性极差(如果部门名称变化你去一个一个员工的更改部门名称?肯定不能)
应该怎么做?——解耦合。可将上述一张表拆成员工和部门两张表。
员工表和部门表之间仅仅是单向的多对一,那么它们的表关系就是"一对多" 表关系中没有多对一一说,只有一对多。(无论是多对一还是一对多都叫"一对多")
2.外键(Foreign Key)
如何让两种表有代码层面上真正的关联 就必须使用外键——让表与表有硬性层面上的关系foreign key
外键约束
1.在创建表的时候 必须先创建被关联表;
2.插入数据的时候 也必须先插入被关联表的数据。
我们以下面为例子。
1.建表
在创建表时,先建被关联的表dep,才能建关联表emp
我们在数据库cs360中创建一个新的表 dep。如上图所示。
再创建一个emp表,如上图所示。
2.插入数据
* 在插入记录时,必须先插被关联的表dep,才能插关联表emp
* 建表的时候使用了自动增加id和默认值,只能用下面指定姓名方式传入个别值,如果使用传统按坑位传值,一个值都不能少,还要按顺序来
* id自动的不用传,默认值也不用,需要传入默认值时单独传一下
我们查看插入行之后的两个表的内容:
3.修改表数据
update dep set id=200 where id = 1; #失败
update emp set dep_id = 300 where id = 1; #失败
delete from dep where id = 3; #失败
# 当我想修改emp里的dep_id或dep里面的id时发现都无法成功
# 当我想删除dep表的某个部门或者整个表的时候,也无法删除
#外键虽然能够帮你强制建立表关系 但是也会给表之间增加数据相关的约束
#删除数据的时候,先删员工表的数据 再删相应部门部门表的数据,或者先删除整个员工表再删除整个部门表,才可以删除
我们删除员工的id,发现可以删除成功。
3.级联更新 级联删除
能否有一张简单的方式,让我不需要考虑在操作目标表的时候还需要考虑关联表的情况,比如我删除部门,那么这个部门对应的员工就应该跟着立即清空呢?
先把之前创建的表删除,先删员工表,再删部门表,最后按章下面的方式重新创建表关系:
1.建表
create table dep(
id int primary key auto_increment,
dep_name varchar(32),
dep_desc varchar(128)
);
create table emp(
id int primary key auto_increment,
emp_name varchar(64),
emp_gender enum('male','female','others') default 'male',
dep_id int,
foreign key(dep_id) references dep(id) ①
on update cascade ②
on delete cascade ③
); # 注意这里插入了三行新的语句。
2.插入数据
insert into dep(dep_name,dep_desc) values('外交部','搞外交'),
('教学部','教书育人'),
('技术部','技术能力有限部门')
;
insert into emp(emp_name,dep_id) values('jason',1),
('egon',2),
('tank',2),
('kevin',3);
3.删除数据
update dep set id=200 where id = 3; #成功
delete from dep where id = 2; #成功
多对多
图书表与作者表之间的关系:
仍然站在两张表的角度:
1.站在图书表:一本书可不可以有多个作者,可以,那就是书多对一作者
2.站在作者表:一个作者可不可以写多本书,可以,那就是作者多对一书
双方都能一条数据对应对方多条记录,这种关系就是多对多。
多对多的关系如下图所示:
多对多关系的建立 必须手动创建第三张表 用来专门记录两种表之间的关系,该表中有一个字段表示左表的id,还有一个字段是右表的id
当删除book表或者author表中的数据时,关系表中相关联的的数据会一同删除
当删除关系表中数据时,不会影响book和author表
1.先建两种普通的表 不需要设置外键
create table book(
id int primary key auto_increment,
title varchar(32),
price int
);
create table author(
id int primary key auto_increment,
name varchar(32),
age int
);
2.建第三张表,关联书和作者
create table book2author(
id int primary key auto_increment,
book_id int,
foreign key(book_id) references book(id)
on update cascade
on delete cascade,
author_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade
);
insert into book(title,price) values('仙剑奇侠传',199),('聊斋',299),('jason',1);
insert into author(name,age) values('jason',18),('tank',38);
insert into book2author(book_id,author_id) values(1,1),(1,2),(2,1),(3,1),(3,2);