1.数据库常用操作及三大范式

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_idcustomer_name 只依赖于 customer_id 。也就是说,product_namecustomer_id 是没用关系的,customer_nameproduct_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_idcustomer_id 完全依赖于 order_id 主键,而 productcustomer 表中的其他字段又完全依赖于主键。满足了第二范式的设计!

3NF

在满足第二范式的前提下,除了主键列之外的其他列不能有传递依赖关系。

create table myorder(
    order_id int primary key,
    product_id int,
    customer_id int,
    customer_phone varchar(15)
);

表中的 customer_phone 有可能依赖于 order_idcustomer_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)
);

修改后就不存在其他列之间的传递依赖关系,其他列都只依赖于主键列,满足了第三范式的设计!

猜你喜欢

转载自www.cnblogs.com/qiaoyurensheng/p/12891324.html
今日推荐