MySQL5.7安装和常用命令(三)

导读:本篇文章讲解 MySQL5.7安装和常用命令(三),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

文章目录


前言

  • 参考B站的《老杜带你学_mysql入门基础(mysql基础视频+数据库实战)》,记录MySQL5.7数据库的安装教程和常用的命令;

  • B站链接和课程资料添加文章末尾,需要自取


一、表结构的增删改(DDL)

1、介绍

表结构的增删改属于DDL语句,包括:create drop alter

2.数据类型(常见的)

varchar(最长255):可变长度的字符串(类似于string)

会根据实际的数据长度动态分配空间。

char(最长255):定长字符串

不管实际的数据长度是多少。分配固定长度的空间去存储数据。

int(最长11):数字中的整数型

bigint:数字中的长整型

float:单精度浮点型数据

double:双精度浮点型数据

date:短日期类型(只包括年月日信息)

mysql短日期默认格式:%Y-%m-%d

datetime:长日期类型(包括年月日时分秒信息)

mysql长日期默认格式:%Y-%m-%d %h:%i:%s

clob:字符大对象(Character Large Object)

最多可以存储4G的字符串。
比如:存储一篇文章,存储一个说明。
超过255个字符的都要采用CLOB字符大对象来存储。

blob:二进制大对象(Binary Large Object)

专门用来存储图片、声音、视频等流媒体数据。
往BLOB类型的字段上插入数据的时候,例如插入一个图片、视频等,
你需要使用IO流才行。

mysql的日期格式

%Y	年
%m  月
%d  日
%h	时
%i	分
%s	秒

mysql当中获取系统当前时间:now() 函数

now() 函数,并且获取的时间带有:时分秒信息!!!!是datetime类型的。

3.创建表(create)

语法格式

# 表名:建议以t_ 或者 tbl_开始,可读性强。见名知意。
# 表名和字段名都属于标识符。所有的标识符都是全部小写,单词和单词之间使用下划线进行衔接。
create table 表名(
	字段名1 数据类型, 
	字段名2 数据类型, 
	字段名3 数据类型
);

案例

# 创建一个学生表?
# 学号、姓名、年龄、性别、邮箱地址
create table t_student(
	num int,
	name varchar(32),
	sex char(1),
	age int(3),
	email varchar(255)
);

# 创建带有默认值的表
create table t_student(
	no int,
	name varchar(32),
	sex char(1) default 'm',
	age int(3),
	email varchar(255)
);

4.删除表(drop)

案例

# 当这张表不存在的时候会报错!
drop table t_student;
# 如果这张表存在的话,删除
drop table if exists t_student;

5.增加表(alter)

案例

# 要向 t_student 中加入联系电话字段,字段名称为:contatct_tel 类型为 varchar(40)
alter table t_student add contact_tel varchar(40);

二、表中数据的增删改(DML)

1、介绍

表中数据的增删改属于DDL语句,包括:insert delete updata

2.插入数据(insert )

语法格式

# 字段名和值要一一对应
insert into 表名(字段名1,字段名2,字段名3...) values(1,2,3);

案例

# 创建一个学生信息?
insert into t_student(no,name,sex,age,email) values(1,'zhangsan','m',20,'zhangsan@123.com');

# insert语句中的“字段名”可以省略,但等于都写上了!所以值也要都写上!
insert into t_student values(2, 'lisi', 'f', 20, 'lisi@123.com');

# 没有给其它字段指定值的话,默认值是NULL。
insert into t_student(name) values('wangwu');
	+------+----------+------+------+------------------+
	| no   | name     | sex  | age  | email            |
	+------+----------+------+------+------------------+
	|    1 | zhangsan | m    |   20 | zhangsan@123.com |
	|    2 | lisi     | f    |   20 | lisi@123.com     |
	|    3 | NULL     | NULL | NULL | NULL             |
	| NULL | wangwu   | NULL | NULL | NULL             |
	+------+----------+------+------+------------------+

# 创建一条当前系统时间的数据:now() 函数可以获取系统当前时间
insert into t_user(id,name,birth,create_time) values(2,'lisi','1991-10-01',now());

# 插入多条数据
# 语法:insert into t_user(字段名1,字段名2) values(),(),(),();
insert into t_user(id,name,birth,create_time) values
(1,'zs','1980-10-11',now()), 
(2,'lisi','1981-10-11',now()),
(3,'wangwu','1982-10-11',now());

注意1:insert语句但凡是执行成功了,那么必然会多一条记录。

3.修改数据(update)

语法格式

# 没有条件限制会导致所有数据全部更新
update 表名 set 字段名1=1,字段名2=2,字段名3=3... where 条件;

案例

# 修改id是2的数据,将name改成jsck,birth改为'2000-10-11'
update t_user set name = 'jack', birth = '2000-10-11' where id = 2;
+------+----------+------------+---------------------+
| id   | name     | birth      | create_time         |
+------+----------+------------+---------------------+
|    1 | zhangsan | 1990-10-01 | 2020-03-18 15:49:50 |
|    2 | jack     | 2000-10-11 | 2020-03-18 15:51:23 |
+------+----------+------------+---------------------+

# 修改id为2的数据,将创建时间改为当前系统事件
update t_user set name = 'jack', birth = '2000-10-11', create_time = now() where id = 2;

注意:没有条件,会导致所有数据全部更新

4.删除数据(delete )

语法格式

# 没有条件,整张表的数据会全部删除!
delete from 表名 where 条件;

案例

# 删除id是2的数据
delete from t_user where id = 2;

注意:没有条件,整张表的数据会全部删除!

5.快速删除数据(truncate)

语法格式

# (这种操作属于DDL操作。)
truncate table dept_bak; 

truncate和delete区别

delete语句删除数据的原理?(delete属于DML语句!!!)
	表中的数据被删除了,但是这个数据在硬盘上的真实存储空间不会被释放!!!
	这种删除缺点是:删除效率比较低。
	这种删除优点是:支持回滚,后悔了可以再恢复数据!!!

truncate语句删除数据的原理?
	这种删除效率比较高,表被一次截断,物理删除。
	这种删除缺点:不支持回滚。
	这种删除优点:快速。

大表非常大,上亿条记录????
	删除的时候,使用delete,也许需要执行1个小时才能删除完!效率较低。
	可以选择使用truncate删除表中的数据。只需要不到1秒钟的时间就删除结束。效率较高。
	但是使用truncate之前,必须仔细询问客户是否真的要删除,并警告删除之后不可恢复!

	truncate是删除表中的数据,表还在!

三、约束★★★★★★★★

1、介绍和分类

什么是约束?

约束对应的英语单词:constraint
在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性、有效性!!!
约束的作用就是为了保证:表中的数据有效!!

约束的分类

非空约束:not null

唯一性约束: unique

主键约束: primary key (简称PK)

外键约束:foreign key(简称FK)

检查约束:check(mysql不支持,oracle支持)

2.非空约束:not null

案例

# 非空约束not null约束的字段不能为NULL。
drop table if exists t_vip;
create table t_vip(
	id int,
	name varchar(255) not null  // not null只有列级约束,没有表级约束!
);
insert into t_vip(id,name) values(1,'zhangsan');
insert into t_vip(id,name) values(2,'lisi');

# 报错案例
insert into t_vip(id) values(3);
ERROR 1364 (HY000): Field 'name' doesn't have a default value

3.小插曲:关于sql脚本文件

xxxx.sql这种文件被称为sql脚本文件。
sql脚本文件中编写了大量的sql语句。
我们执行sql脚本文件的时候,该文件中所有的sql语句会全部执行!
批量的执行SQL语句,可以使用sql脚本文件。
在mysql当中怎么执行sql脚本呢?
	mysql> source D:\course\03-MySQL\document\vip.sql

4.唯一性约束: unique

案例

# 唯一性约束unique约束的字段不能重复,但是可以为NULL(NULL不需要唯一)。
drop table if exists t_vip;
create table t_vip(
	id int,
	name varchar(255) unique,
	email varchar(255)
);
insert into t_vip(id,name,email) values(1,'zhangsan','zhangsan@123.com');
insert into t_vip(id,name,email) values(2,'lisi','lisi@123.com');
insert into t_vip(id,name,email) values(3,'wangwu','wangwu@123.com');

# 报错案例
insert into t_vip(id,name,email) values(4,'wangwu','wangwu@sina.com');
ERROR 1062 (23000): Duplicate entry 'wangwu' for key 'name'

# name字段虽然被unique约束了,但是可以为NULL。
insert into t_vip(id) values(4);
insert into t_vip(id) values(5);
+------+----------+------------------+
| id   | name     | email            |
+------+----------+------------------+
|    1 | zhangsan | zhangsan@123.com |
|    2 | lisi     | lisi@123.com     |
|    3 | wangwu   | wangwu@123.com   |
|    4 | NULL     | NULL             |
|    5 | NULL     | NULL             |
+------+----------+------------------+

# name和email两个字段联合起来具有唯一性!!!!
drop table if exists t_vip;
create table t_vip(
	id int,
	name varchar(255),
	email varchar(255),
	unique(name,email) // 约束没有添加在列的后面,这种约束被称为表级约束。
);
insert into t_vip(id,name,email) values(1,'zhangsan','zhangsan@123.com');
insert into t_vip(id,name,email) values(2,'zhangsan','zhangsan@sina.com');

# 什么时候使用表级约束呢?
# 需要给多个字段联合起来添加某一个约束的时候,需要使用表级约束。

# unique 和not null可以联合吗?
#在mysql当中,如果一个字段同时被not null和unique约束的话,该字段自动变成主键字段。(注意:oracle中不一样!)
drop table if exists t_vip;
create table t_vip(
	id int,
	name varchar(255) not null unique
);

5.主键约束(primary key,简称PK)★★★★★★★★

基本介绍

主键约束的相关术语?
	主键约束:就是一种约束。一张表,主键约束只能添加1个。(主键只能有1个。)
	主键字段:该字段上添加了主键约束,这样的字段叫做:主键字段
	主键值:主键字段中的每一个值都叫做:主键值。

什么是主键?有啥用?
	主键值是每一行记录的唯一标识。
	主键值是每一行记录的身份证号!!!
	主键值存在的意义就是这行记录的身份证号,只要意义达到即可,单一主键可以做到。复合主键比较复杂,不建议使用!!!

记住:任何一张表都应该有主键,没有主键,表无效!!

案例

# 给一张表添加主键约束
drop table if exists t_vip;
// 1个字段做主键,叫做:单一主键
create table t_vip(
	id int primary key,  //列级约束
	name varchar(255)
	primary key(id)  // 也可以写成表级约束(列级约束取消)
);
insert into t_vip(id,name) values(1,'zhangsan');
insert into t_vip(id,name) values(2,'lisi');

# 错误:不能重复
insert into t_vip(id,name) values(2,'wangwu');
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'

# 错误:不能为NULL
insert into t_vip(name) values('zhaoliu');
ERROR 1364 (HY000): Field 'id' doesn't have a default value

主键建议使用的类型

建议使用:
	int
	bigint
	char
	等类型。
	
不建议使用:varchar来做主键。主键值一般都是数字,一般都是定长的!

主键-自然主键:主键值是一个自然数,和业务没关系。

在实际开发中使用业务主键多,还是使用自然主键多一些?
	自然主键使用比较多,因为主键只要做到不重复就行,不需要有意义。
	业务主键不好,因为主键一旦和业务挂钩,那么当业务发生变动的时候,
	可能会影响到主键值,所以业务主键不建议使用。尽量使用自然主键。

主键-业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值。这就是业务主键!

主键-自增主键(auto_increment)

drop table if exists t_vip;
create table t_vip(
	id int primary key auto_increment, //auto_increment表示自增,从1开始,以1递增!
	name varchar(255)
);
insert into t_vip(name) values('zhangsan');
insert into t_vip(name) values('zhangsan');
insert into t_vip(name) values('zhangsan');

6.外键约束(foreign key,简称FK)★★★★★★★★

介绍和业务背景

外键约束涉及到的相关术语:
	外键约束:一种约束(foreign key)
	外键字段:该字段上添加了外键约束
	外键值:外键字段当中的每一个值。

业务背景:
	请设计数据库表,来描述“班级和学生”的信息?

	第一种方案:班级和学生存储在一张表中???
	t_student
	no(pk)			name		classno			classname
	----------------------------------------------------------------------------------
	1					jack			100			北京市大兴区亦庄镇第二中学高三1班
	2					lucy			100			北京市大兴区亦庄镇第二中学高三1班
	3					lilei			100			北京市大兴区亦庄镇第二中学高三1班
	4					hanmeimei	100			北京市大兴区亦庄镇第二中学高三1班
	5					zhangsan		101			北京市大兴区亦庄镇第二中学高三2班
	6					lisi			101			北京市大兴区亦庄镇第二中学高三2班
	7					wangwu		101			北京市大兴区亦庄镇第二中学高三2班
	8					zhaoliu		101			北京市大兴区亦庄镇第二中学高三2班
	分析以上方案的缺点:
		数据冗余,空间浪费!!!!
		这个设计是比较失败的!
	
	第二种方案:班级一张表、学生一张表??
	
	t_class 班级表
	classno(pk)			classname
	------------------------------------------------------
	100					北京市大兴区亦庄镇第二中学高三1班
	101					北京市大兴区亦庄镇第二中学高三1班

	t_student 学生表
	no(pk)			name				cno(FK引用t_class这张表的classno)
	----------------------------------------------------------------
	1					jack				100
	2					lucy				100
	3					lilei				100
	4					hanmeimei		100
	5					zhangsan			101
	6					lisi				101
	7					wangwu			101
	8					zhaoliu			101

	当cno字段没有任何约束的时候,可能会导致数据无效。可能出现一个102,但是102班级不存在。
	所以为了保证cno字段中的值都是100和101,需要给cno字段添加外键约束。
	那么:cno字段就是外键字段。cno字段中的每一个值都是外键值。

	注意:
		t_class是父表
		t_student是子表

		删除表的顺序?
			先删子,再删父。

		创建表的顺序?
			先创建父,再创建子。

		删除数据的顺序?
			先删子,再删父。

		插入数据的顺序?
			先插入父,再插入子。

	思考:子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?
		不一定是主键,但至少具有unique约束。

	测试:外键可以为NULL吗?
		外键值可以为NULL。

案例

drop table if exists t_student;
drop table if exists t_class;

create table t_class(
	classno int primary key,
	classname varchar(255)
);
create table t_student(
	no int primary key auto_increment,
	name varchar(255),
	cno int,
	foreign key(cno) references t_class(classno)
);

insert into t_class(classno, classname) values(100, '北京市大兴区亦庄镇第二中学高三1班');
insert into t_class(classno, classname) values(101, '北京市大兴区亦庄镇第二中学高三1班');

insert into t_student(name,cno) values('jack', 100);
insert into t_student(name,cno) values('lucy', 100);
insert into t_student(name,cno) values('lilei', 100);
insert into t_student(name,cno) values('hanmeimei', 100);
insert into t_student(name,cno) values('zhangsan', 101);
insert into t_student(name,cno) values('lisi', 101);
insert into t_student(name,cno) values('wangwu', 101);
insert into t_student(name,cno) values('zhaoliu', 101);

select * from t_student;
select * from t_class;

相关链接

B站视频链接:https://www.bilibili.com/video/BV1Vy4y1z7EX?p=11&spm_id_from=pageDriver
课程资料链接: https://pan.baidu.com/s/1i7YTlAML6S77AvSes6s4SQ 提取码: 6vbb

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84966.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!