一、如何使用终端操作数据库
如何登陆数据库服务器
1
mysql -uroot -p
如何查询数据库服务器中所有的数据
1
show databases;
如何选中某一个数据库进行操作
1
use sushe;
- SQL语句中的查询
1
select * from admin;
只查询Admin_ID中的一条
1
select * from admin where Admin_ID=1;
如何退出数据库服务器
1
exit;
如何在数据库服务器中创建我们的数据库
1
create database test;
使用test数据库进行操作
1
use test;
查看数据库中的数据表
1
show tables;
创建一个数据表
1
2
3
4
5
6
7CREATE TABLE pet (
name VARCHAR(20),
owner VARCHAR(20),
species VARCHAR(20),
sex CHAR(1),
birth DATE,
death DATE);查看数据表是否创建成功
1
show tables;
查看创建好的数据表的结构
1
describe pet;
查看数据表中的记录
1
select * from pet;
如何往数据表中添加数据记录
1
2INSERT INTO pet
VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);再次查询
1
select * from pet;
删除数据
1
delete from pet where name='Fluffy';
修改数据
1
update pet set name='旺旺才' where owner='周星驰';
mysql常用数据类型
日期选择按照格式;数值字符串按照大小!
MySQL支持多种类型,大致可以分为三类:
数值
类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1 byte (-128,127) (0,255) 小整数值 SMALLINT 2 bytes (-32 768,32 767) (0,65 535) 大整数值 MEDIUMINT 3 bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值 INT或INTEGER 4 bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值 BIGINT 8 bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值 FLOAT 4 bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值 DOUBLE 8 bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值 DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值 日期/时间
类型 大小 ( bytes) 范围 格式 用途 DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值 TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间 YEAR 1 1901/2155 YYYY 年份值 DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值 TIMESTAMP 4 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时间值,时间戳 字符串(字符)
类型 大小 用途 CHAR 0-255 bytes 定长字符串 VARCHAR 0-65535 bytes 变长字符串 TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串 TINYTEXT 0-255 bytes 短文本字符串 BLOB 0-65 535 bytes 二进制形式的长文本数据 TEXT 0-65 535 bytes 长文本数据 MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据 MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据 LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据 LONGTEXT 0-4 294 967 295 bytes 极大文本数据 mysql建表约束
主键约束
它能够唯一确定一张表中的一条记录,也就是我们通过给某个字段添加约束,就可以使得该字段不重复且不为空。
1
2
3
4CREATE TABLE user (
id INT PRIMARY KEY,
name VARCHAR(20)
);- – 联合主键
– 联合主键中的每个字段都不能为空,并且加起来不能和已设置的联合主键重复。
1
2
3
4
5
6CREATE TABLE user (
id INT,
name VARCHAR(20),
password VARCHAR(20),
PRIMARY KEY(id, name)
);1
insert into user values(1,'张三','123');
- – 联合主键
自增约束
- 管控id的值让他可以增长
1
2
3
4
5CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);1
insert into user (name) values('zhangsan');
忘记创建主键约束怎么办,可以通过SQL语句设置(两种方式):
1
2
3
4
5CREATE TABLE user (
id INT,
name VARCHAR(20)
);- ```
desc user1
2
3
4
5
6
7
8
![image-20210419135347642](https://img.imgdb.cn/item/607d33918322e6675c0e993b.png)
* 修改表结构,添加主键
```sql
ALTER TABLE user ADD PRIMARY KEY(id);
ALTER TABLE user MODIFY id INT PRIMARY KEY;
如何删除
1
alter table user drop primary key;
- ```
唯一约束
- 约束修饰的字段的值不能重复
1
2
3
4create table user(
id int,
name varchar(20)
);添加唯一约束
1
alter table user add unique(name);
创建表的时候添加唯一约束
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19create table user(
id int,
name varchar(20),
unique(name)
);
// 或者
create table user(
id int,
name varchar(20) unique
);
//unique(id,name)表示两个键在一起不重复就行
create table user(
id int,
name varchar(20),
unique(id,name)
);删除唯一约束
1
alter table user drop index name;
modify添加
1
alter table user modify varchar(20) unique;
总结:
1
2
3
4
51、建表的时候添加约束
2、可以使用alter... add ...
3、alter... modify ...
4、删除alter ... drop ...
非空约束
修饰的字段不能为空
1
2
3
4CREATE TABLE user (
id INT,
name VARCHAR(20) NOT NULL
);不传入name值会报错
1
2
3insert into user (id) values(1);
//正确用法
insert into uservalues(1,'zhangsan');
默认约束
当我们插入字段值时,如果没有传值,就会使用默认值
1
2
3
4
5create table user(
id int,
name varchar(20),
age int default 10
);
外键约束
涉及到两个表:父表,子表
主表,副表
班级表
1
2
3
4create table classes(
id int primary key,
name varchar(20)
);学生表
1
2
3
4
5
6create table classes(
id int primary key,
name varchar(20),
class_id int,
foreign key(class_id) references classes(id)
);插入四个班
1
2
3
4insert into calsses values(1,'一班');
insert into calsses values(2,'二班');
insert into calsses values(3,'三班');
insert into calsses values(4,'四班');往对应的班级添加学生信息
1
2
3
4insert into calsses values(1001,'一班',1);
insert into calsses values(1002,'二班',2);
insert into calsses values(1003,'三班',3);
insert into calsses values(1004,'四班',4);结论
- 主表classes中没有的数据值,在副表中,是不可以使用的。
- 主表中的记录被副表引用,是不可以被删除的。
数据库的三大设计范式
第一范式(1NF)
数据表中的所有字段都是不可分割的原子值
1
2
3
4
5
6
7
8
9create table student(
id int primary key,
name varchar(20),
address varchar(30)
);
inser into student values(1,'张三','中国四川省成都市武侯区武侯大道100号');
inser into student values(2,'李四','中国四川省成都市武侯区武侯大道200号');
inser into student values(3,'王五','中国四川省成都市武侯区武侯大道300号');字段还可以继续拆分,就不满足第一范式
1
2
3
4
5
6
7
8
9
10
11
12create table student(
id int primary key,
name varchar(20),
country varchar(30),
privence varchar(30),
city varchar(30),
details varchar(30)
);
inser into student values(1,'张三','中国','四川省','成都市','武侯区武侯大道100号');
inser into student values(2,'李四','中国','四川省','成都市','武侯区武侯大道100号');
inser into student values(3,'王五','中国','四川省','成都市','武侯区武侯大道100号');范式,设计的越详细,对于某些实际操作可能更好,单不一定都是好处。
第二范式(2NF)
在满足第一范式的前提下,其他列都必须完全依赖于主键列。
如果出现不完全依赖,只可能发生在联合主键的情况下。
订单表
1
2
3
4
5
6
7CREATE 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
也是没有关系的。拆表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15CREATE 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)
必须先满足第二范式,除开主键的其他列之间不能传递依赖
1
2
3
4
5
6CREATE TABLE myorder (
order_id INT PRIMARY KEY,
product_id INT,
customer_id INT,
customer_phone VARCHAR(15)
);表中的
customer_phone
有可能依赖于order_id
、customer_id
两列,也就不满足了第三范式的设计:其他列之间不能有传递依赖关系。1
2
3
4
5
6
7
8
9
10
11CREATE TABLE myorder (
order_id INT PRIMARY KEY,
product_id INT,
customer_id INT
);
CREATE TABLE customer (
id INT PRIMARY KEY,sql
name VARCHAR(20),
phone VARCHAR(15)
);修改后就不存在其他列之间的传递依赖关系,其他列都只依赖于主键列,满足了第三范式的设计!
参考文献:一天学会 MySQL 数据库