写在前面: 关于Mysql的学习笔记,我是观看了https://www.bilibili.com/video/BV1Vt411z7wy?p=27
的视频,以及参考了这位大佬的学习笔记;
Mysql速成
文章目录
使用终端操作数据库
Mysql基本操作
- 使用登录Mysql服务器
在命令行输入
mysql -u root -p
Enter password: *************
-
退出Mysql服务器
exit;
-
如何查看有什么数据库?
show databases;
-
如何选择数据库?
use databasesName;
-
如何查看该数据库中有哪些表?
show tables;
-
如何查询表中的数据?
select * from tableName
-
如何在数据库服务器中创建自己的数据库?
create database databaseName;
- 如何创建一个数据表? 比如创建一个pet表
create TABLE pet(
name VARCHAR(20),
owner VARCHAR(20),
specise VARCHAR(20),
sex CHAR(1),
brith DATE,
death DATE );
接着show tables;
我们就可以看是否增加了该数据表
- 如何查看数据表的架构?
describe tableName
其中:
Field : 字段的名称
Type : 字段的类型,可以有int var date varchar
Key : 是否是关键字 如可以定义为: primary key 或者 unique key …
Default: : 若是该字段没有主动设置值的时候,该字段的默认值是什么?
- 如何插入数据
比如往刚刚的pet数据表中添加数据
INSERT INTO pet VALUES('kk','cc','dog','1','1998-8-2',null);
添加完成后,就可以查看一下是否添加成功(这里我添加了两条数据)
- 如何删除数据:
删除语句:DELETE FROM tablesName WHERE 条件;
修改数据:UPDATE tableName SET 字段1=值1,字段2=值2 ... WHERE 条件;
- 删除数据表;
DROP TABLE table_name ;
- 删除数据库;
drop database <数据库名>;
Mysql常用数据类型
数值类型
日期和时间类型
字符串类型
Mysql建表的约束
主键约束
它能够唯一确定一张表中的一条记录,增加主键约束之后,就可以使得字段不重复而且不为空。
例如:
create table user(
id int PRIMARY KEY,
name VARCHAR(20)
);
下面,我们可以使用命令describe user
来查看
复合主键
复合主键只要所有的字段都不是相同的情况下可以允许其中的字段重复:
比如,这里id和name两者加起来不重复就行
CREATE TABLE user2(
id INT,
name VARCHAR(20),
password VARCHAR(20),
PRIMARY key(id,name)
);
自增约束
例如,先创建一个数据表:
CREATE TABLE user3(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);
在添加几条数据:
insert into user3 values(1,'王尼玛')
insert into user3(name) values('赵铁柱')
insert into user3(name) values('张全蛋')
在命令二三,没有自定义id值,但是自动生成了id
唯一约束
先创建一个数据表
CREATE TABLE user5(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);
新增name为唯一约束:
ALTER TABLE user5 ADD UNIQUE(name);
可以通过运行describe user5
来看看改变了什么
说到地,唯一约束,就是限定这个键
添加的值是唯一的,例如,这里试图添加两个’aa’,但是不行
总结一下:
主键约束(primary key)中包含了唯一约束
场景:业务需求:设计一张用户注册表,用户姓名必须要用手机号来注册,而且手机号和用户名称都不能为空,那么:
CREATE TABLE user_test(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT'主键id',
name VARCHAR(20) NOT NULL COMMENT'用户姓名,不能为空',
phone_number VARCHAR(20) UNIQUE NOT NULL COMMENT'用户手机,不能重复且不能为空'
);
运行 DESCRIBE user_test;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| phone_number | int(11) | NO | UNI | NULL | |
+--------------+-------------+------+-----+---------+----------------+
这样的话就达到了每一个手机号都只能出现一次,达到了每个手机号只能被注册一次.
用户姓名可以重复,但是手机号码却不能重复,复合正常的逻辑需求。
非空约束:
在创建数据表的字段时候加上NOT NULL;
create table user6( id int primary key,name varchar(20) Not null);
默认约束
在创建数据表字段时候 加上DEFAULT
例如:
mysql> create table user7(
-> id int primary key,
-> name varchar(20),
-> status int DEFAULT 0);
在往数据表添加字段的时候,可以不用写status的值
应用场景:
业务需求:找正常的用户,对这些正常用户进行发放优惠卷或者积分之类的东西,而被禁封的用户我们不让其参加多动.
我们想要封用户只要将status的值从0改为1就行了,当然我们取用户的时候必须要先判断status是否是0.若是1.说明该用户已经被禁封.
先封手机号为’1234’的用户:
UPDATE user6 SET status = 1 WHERE phone_number= '1234';
SELECT * FROM user6;
+----+------+--------------+--------+
| id | name | phone_number | status |
+----+------+--------------+--------+
| 1 | aa | 123 | 0 |
| 2 | bb | 1234 | 1 |
| 3 | cc | 1263456 | 0 |
+----+------+--------------+--------+
status为1,说明用户已经被封,该用户不可以参加活动
我们取用户的时候加上status的判断,如:
SELECT * FROM user6 WHERE status = 0;
+----+------+--------------+--------+
| id | name | phone_number | status |
+----+------+--------------+--------+
| 1 | aa | 123 | 0 |
| 3 | cc | 1263456 | 0 |
+----+------+--------------+--------+
外键约束
外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列。一个表可以有一个或多个外键。
例如:
先创建一个班级的数据表
CREATE TABLE classes(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT'班级表id',
name VARCHAR(20) COMMENT'班级名称'
);
创建好了后,通过describe classes;
查看一下数据表的架构。
再创建一个学生的数据表
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT'学生表id',
name VARCHAR(20) COMMENT'学生姓名',
class_id int COMMENT'教室id,这张表中的class_id是classes表中id的值',
FOREIGN KEY (class_id) REFERENCES classes(id)
);
班级插入数据:
INSERT INTO CLASSES (name) VALUES ('一班');
INSERT INTO CLASSES (name) VALUES ('二班');
INSERT INTO CLASSES (name) VALUES ('三班');
INSERT INTO CLASSES (name) VALUES ('四班');
查看数据
SELECT * FROM classes;
+----+------+
| id | name |
+----+------+
| 1 | 一班 |
| 2 | 二班 |
| 3 | 三班 |
| 4 | 四班 |
+----+------+
学生插入数据:
INSERT INTO student (name,class_id) VALUES ('小赵',1);
INSERT INTO student (name,class_id) VALUES ('小钱',2);
INSERT INTO student (name,class_id) VALUES ('小孙',3);
INSERT INTO student (name,class_id) VALUES ('小李',4);
查看数据
SELECT * FROM student;
+----+------+----------+
| id | name | class_id |
+----+------+----------+
| 1 | 小赵 | 1 |
| 2 | 小钱 | 2 |
| 3 | 小孙 | 3 |
| 4 | 小李 | 4 |
+----+------+----------+
如果 插入班级为5的数据 如:
INSERT INTO student (name,class_id) VALUES ('小周',5);
报错:
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (
test
.student
, CONSTRAINTstudent_ibfk_1
FOREIGN KEY (class_id
) REFERENCESclasses
(id
))
我们删除正在被学生表引用的’四班’试试:
DELETE classes WHERE name = '四班';
出现:Cannot delete or update a parent row:不能删除主表中的行
我们先删除学生表中的 ‘小李’从而解除班级中’四班’的外键约束,再来删除’四班’(因为小李引用了四班)
DELETE FROM student WHERE name = '小李';
再次删除classes表中的’四班’;
DELETE FROM classes WHERE name = '四班';
最后:
SELECT * FROM classes;
+----+------+
| id | name |
+----+------+
| 1 | 一班 |
| 2 | 二班 |
| 3 | 三班 |
+----+------+
'四班’被成功删除!
总结:
- 主表中没有的数据,在附表中,是不可以使用的.
- 主表中记录的数据现在正在被附表所引用,那么主表中正在被引用的数据不可以被删除
- 若要想删除,先将附表中的数据删除在删除主表数据
- 对于外键约束大家可以联想 省,市 来进行联想 (市必须要依赖于省,只要省还有一个市在引用,那么就不可以删除省,要不然市就没有省了. 那么我们想删除省,必须要将该省下所有的市全部删除之后,才可以删除这个省)
如何建表之后添加主键约束
- 添加主键约束:
ALTER TABLE tableName add PRIMARY KEY(字段);
CREATE TABLE user8(
id INT,
name VARCHAR(20)
);
运行DESCRIBE user8
;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
加入主键约束:
ALTER TABLE user8 add PRIMARY KEY(id);
再次运行DESCRIBE user8;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
结果展示:
- 删除主键约束:
ALERT TABLE user8 DROP PRIMARY KEY(id);
运行DESCRIBE user8
查看表结构:
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
效果展示:
- 使用
modify
修改字段.添加约束:
ALTER TABLE user8 MODIFY id INT PRIMARY key;
使用DESCRIBE user8
查看表结构:
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
- 给主键设置自增长:
ALTER TABLE user8 MODIFY id INT AUTO_INCREMENT;
运行 DESCRIBE user8
查看表结构:
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
Mysql的三大设计范式
第一范式
数据表中的字段都是不可分割的原子值。
例如:
create table student2(
id int primary key,
name varchar(20),
address varchar(30)
);
insert into student2 values(1,'张三','中国四川省成都市武侯大道100号');
insert into student2 values(2,'李四','中国四川省成都市武侯大道200号');
insert into student2 values(3,'王五','中国四川省成都市武侯大道300号');
select * from student2;
+----+------+-------------------------------+
| id | name | address |
+----+------+-------------------------------+
| 1 | 张三 | 中国四川省成都市武侯大道100号 |
| 2 | 李四 | 中国四川省成都市武侯大道200号 |
| 3 | 王五 | 中国四川省成都市武侯大道300号 |
+----+------+-------------------------------+
字段值还可以继续拆分,不满足第一范式
create table student3(
id int primary key,
name varchar(20),
country varchar(30),
privence varchar(30),
city varchar(30),
details varchar(30)
);
insert into student3 values(1,'张三','中国','四川省','成都市','武侯大道100号');
insert into student3 values(2,'李四','中国','四川省','成都市','武侯大道200号');
insert into student3 values(3,'王五','中国','四川省','成都市','武侯大道300号');
select * from student3;
+----+------+---------+----------+--------+---------------+
| id | name | country | privence | city | details |
+----+------+---------+----------+--------+---------------+
| 1 | 张三 | 中国 | 四川省 | 成都市 | 武侯大道100号 |
| 2 | 李四 | 中国 | 四川省 | 成都市 | 武侯大道200号 |
| 3 | 王五 | 中国 | 四川省 | 成都市 | 武侯大道300号 |
+----+------+---------+----------+--------+---------------+
第二范式
必须满足第一范式的前提下,第二范式,除主键外的每一列都必须完全依赖于主键。如果要出现不完全依赖,只可能发生再联合主键的情况下。
例如:
这就不满足第二范式的要求,product_name和customer_name并不依赖于主键部分.
create table myorder(
product_id int,
customer_id int,
product_name varchar(20),
customer_name varchar(20),
primary key(product_id,customer_id)
);
拆分:
create table myorder(
order_id int primary key,
product_id int,
customer_id int
);
create table product(
id int primary key,
name varchar(20)
);
create table customer(
id int primary key,
name varchar(20)
);
第三范式
必须先满足第二范式,除开主键列的其他列之间不能有传递依赖关系。
例如,上面的myorder数据表里面有一个customer_phone的字段
create table myorder(
order_id int primary key,
product_id int,
customer_id int,
customer_phone varchar(15)
);
这样的话,customer_phone和customer_id 有传递依赖关系,那么就应该,放到customer数据表里
create table customer(
id int primary key,
name varchar(20),
phone varchar(15)
);