MySQL 学习笔记
1. 如何使用终端操作数据库
1.1 常见操作
# 登录MySQL
$ mysql -u root -p12345612
# 退出MySQL数据库服务器
exit;
# 显示所有数据库
show databases;
# 进入某个数据库
use 数据库名;
# 创建数据库
create database test;
# 切换进入数据库
use test;
# 查看数据库中的表
mysql> show tables;
Empty set (0.00 sec)
# 创建数据表
CREATE TABLE pet (
name VARCHAR(20),
owner VARCHAR(20),
species VARCHAR(20),
sex CHAR(1),
birth DATE,
death DATE
);
# 查看数据表是否创建成功
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| pet|
+----------------+
1 row in set (0.00 sec)
# 查看数据表结构
mysql> describe pet;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| owner | varchar(20) | YES | | NULL | |
| species | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| birth | date | YES | | NULL | |
| death | date | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
# 查看表中的数据
mysql> select * from pet;
Empty set (0.00 sec)
# 插入单条数据
mysql> insert into pet
-> value ('puffball', 'Diane', 'hamster', 'f', '1990-03-30', NULL);
Query OK, 1 row affected (0.00 sec)
# 删除数据
mysql> delete from pet where name='puffball';
Query OK, 0 rows affected (0.00 sec)
# 修改数据
update pet set name="zhangsi" where owner ="lisi";
mysql 数据类型
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
# 总结一下
增加 insert
删除 delete
修改 update
查询 select
1.2 mysql 建表约束
1.2.1 主键约束
能够唯一确定一张表中的一条记录,给某个字段添加约束后该字段不可重复,且不为空。
# 创建带主键约束的user表
create table user(
id int primary key,
name varchar(20)
);
mysql> describe user;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.04 sec)
insert into user value(1,"张三");
# 联合主键
# 联合主键中的每个字段都不能为空,并且加起来不能和已设置的联合主键重复。
create table user2(
id int,
name varchar(20),
password varchar(20),
primary key(id,name)
);
mysql> describe user2;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | NO | PRI | NULL | |
| password | varchar(20) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
# 自增约束
# 自增约束的主键由系统自动递增分配
create table user3(
id int primary key auto_increment,
name varchar(20)
);
# 而外添加主键约束
# 如果忘记设置主键,还可以通过SQL语句设置(两种方式)
alter table user4 add primary key(id);
alter table user4 modify id int primary key;
# 删除主键
alter table user4 drop primary key;
1.2.2 唯一约束
约束修饰的字段的值不可以重复
# 建表时创建唯一约束
create table user5(
id int,
name varchar(20),
unique(name)
);
# 如果建表时没有设置唯一约束,还可以通过SQL语句设置(两种方式)
alter table user5 add unique(name);
alter table user5 modify name varchar(20) unique;
# 删除唯一约束
alert table user5 drop index name;
# 总结
# 1. 建表时可以添加约束
# 2. 可以使用alter ... add ...
# 3. 使用alter ... modify ...
# 4. 删除 alter ... drop ...
1.2.3 非空约束
修饰的字段不能为空 null
create table user6 (
id int ,
name varchar(20) not null
);
mysql> describe user6;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.04 sec)
# 移除非空约束
alter table user6 modefy name varchar(20);
1.2.4 默认约束
当插入字段值时,如果没有传值,就会使用默认值
create table user7(
id int,
name varchar(20),
age int default 10
);
mysql> desc user7;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| age | int(11) | YES | | 10 | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
# 移除默认约束
alter table user7 modify age int;
1.2.5 外键约束
涉及两个表:主表,附表。
# 班级表
create table classes(
id int primary key,
name varchar(20)
);
# 学生表
# 学生表的class_id 与班级表 id 绑定
create table students(
id int primary key,
name varchar(20),
class_id int ,
foreign key(class_id) references classes(id)
);
insert into classes values (1,"一班");
insert into classes values (2,"二班");
insert into classes values (3,"三班");
insert into classes values (4,"四班");
insert into students values(1001,"张三",1);
insert into students values(1002,"张三",2);
insert into students values(1003,"张三",3);
insert into students values(1004,"张三",4);
# 1. 主表 classes 中没有的数据值,在副表中是不可以使用的。
# 2. 主表的记录被副表引用时,主表是不可以被删除。
1.3 数据库的三大范式
1NF
数据表中所有字段都是不可分割的原子值。
只要字段值还可以继续拆分,就不满足第一范式。
范式设计得越详细,对某些实际操作可能会更好,但并非都有好处,需要对项目的实际情况进行设定。
2NF
在满足第一范式的前提下,其他列都必须完全依赖于主键。
如果出现不完全依赖,只可能发生在联合主键的情况下。
# 订单表
create table myorder(
product_id int,
customer_id int,
product_name varchar(20),
customer_name varchar(20),
primary key(product_id,customer_id)
);
实际上,在这张订单表中,product_name
只依赖于 product_id
,customer_name
只依赖于 customer_id
。也就是说,product_name
和 customer_id
是没用关系的,customer_name
和 product_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
表中的 product_id
和 customer_id
完全依赖于 order_id
主键,而 product
和 customer
表中的其他字段又完全依赖于主键。满足了第二范式的设计!
3NF
在满足第二范式的前提下,除了主键列之外的其他列不能有传递依赖关系。
create table myorder(
order_id int primary key,
product_id int,
customer_id int,
customer_phone varchar(15)
);
表中的 customer_phone
有可能依赖于 order_id
、 customer_id
两列,也就不满足了第三范式的设计:其他列之间不能有传递依赖关系。
create table myorder(
order_id int primary key,
product_id int,
customer_id int
);
create table customer(
id int primary key,
name varchar(20),
customer_phone varchar(15)
);
修改后就不存在其他列之间的传递依赖关系,其他列都只依赖于主键列,满足了第三范式的设计!