个人对于数据库的学习和理解:
数据库典型安装目录(bin):C:\Program Files (x86)
(不同的版本之间的安装路径也是不一致的,当然也支持自定义安装路径)
使用命令行指令进入MySQL方法:
打开运行指令输入
net start mysql
mysql -h localhost -u root -p
#顺序可换
输入登录密码即可
在mysql状态下输入一下代码可以退出mysql:exit、\q、quit
(myqsl8.0以上的版本是没有在环境变量里面添加路径的,所以要么进入到安装路径MySQL-server-8.0.x,要么添加server这个路径到环境变量钟)
#数据库密码忘记了怎么办:
首先确定MySQL服务已停止,使用命令行指令(cmd)
输入代码:net stop mysql#停止MySQL数据库服务
重新打开一个cmd.exe进入数据库安装的bin目录(cd:进入下一级目录)
输入代码:mysqld --skip-grant-tables;#意思是绕过密码登录数据库
然后打开一个新的cmd.exe,还是进入数据库的根目录
输入mysql,回车,即可绕过密码启动数据库
如果需要修改密码:
按照顺序输入:
use mysql;#使用数据库中的MySQL数据库
update user set password=password('newPassword')where user='root' and host='localhost';#更新密码(不经过MD5加密)
flush privileges;#刷新权限表,使重置的密码生效
#8.0版本以后是不可以的,具体操作方式暂时还没有更新,其他博客可以找到
#分别设置服务器、返回结果、客户端、数据库、连接处的字符集为GBK(安装时可以直接设置为GBK,以下是为了安装时没有设置为GBK的同学使用);
(本操作不需要明确,在安装数据库的时候可以选择数据库字符集默认为GBK)
set character_set_server=gbk;
set character_set_results=gbk;
set character_set_client=gbk;
set character_set_database=gbk;
set character_set_connection=gbk;
#cmd命令行关于数据库的操作:
net start mysql:启动数据库服务
net stop mysql:停止数据库服务
net restart mysql:重启数据库服务
net status mysql:查询数据库的服务状态
数据库的常用简单操作:
指令 简写 作用
? \? 显示帮助
status \s 从服务器获取mysql的状态信息
clear \c 明确(清楚)当前输入语句
exit \q 退出数据库
#注意事项:
数据库中的注释为#符号
数据库每一个命令都要用英语状态下的分号(;)结尾方可执行
#每一次进入数据库都需要修改字符集为GBK
数据库指令不区分大小写
使用数据库时注意语句逻辑关系,在excel中有的函数在数据库中部分一样可以使用,例如:mod(num1,num2)(数字1取数字2的余数,可以作为条件判断使用)
MySQL数据库操作
数据库入门级别简单操作:
show databases;#查看当前数据库(系统默认四个数据库分别是:information_schema\mysql\performance_schema\test);
create database databaseName;#创建数据库databaseName(数据库名);
show create database databaseName;#查看已创建的数据库databaseName(数据库名);
drop database databaseName;#删除已创建的数据库databaseName(数据库名);
use databaseName;#选择创建表的数据库(databaseName);
数据表简单操作:
describe eg_tableeg_table查看表(tableName)的字段信息
show tables;#查看所有表;
show create table eg_table;#查看创建的数据表eg_table
drop table eg_table删除数据库表eg_table(表名);
create table test
(
字段名1 数据类型(完整性约束条件),
字段名2 数据类型(完整性约束条件),
字段名3 数据类型(完整性约束条件),
......
字段名n 数据类型(完整性约束条件)
);(p39)
For example:
create table test
(
ID int(10),
Name char(20),
Class char(20),
Score float(10)
);
#修改数据库表名
alter table test rename slist;
#修改字段名
alter table slist change ID xuhao int(4);
#修改某字段的数据类型
alter table slist modify xuhao float(6);
#添加字段
alter table slist add mingzu varchar(30) after|before [某字段];
#删除字段
alter table slist drop mingzu;
#更改字段排列顺序
alter table slist modify Name char(20) first|after [某字段];
#表的约束:
primary key :主键约束,用于唯一标识对应的记录
not null :非空约束
unique :唯一性约束
default :默认值约束
foreign key :外键约束
#设置表的字段值自动增加:
auto_increment;
#数据表中表的约束简单应用:
create table numtest
(
id int primary key auto_increment,
name varchar(12) not null,
calss varchar(12) default '软件二班';
);
#添加内容:在创建数据表、在已存在的数据表中添加字段时,可以通过以下代码进行对默认值的设置
create table test
(
id int primary key auto_increment,
name varchar(8),
class varchar(10) default '软件二班',#默认设置"class"为“软件二班”
);#该方法为创建数据表的时候设置默认值
alter table test add collage varchar(10) default '信息工程系';
#该方法为在已存在的数据表中添加字段时设置默认值
#创建索引的两种方式:
#1、在创建数据表的时候创建索引,代码示例如下:
create table index_test
(
ID int primary key auto_increment,
name varchar(16) not null,
sex enum('男','女'),
index index_id (ID)#使用index关键字创建名为index_id的ID索引
);
#2、在已创建的数据表中添加索引,代码示例如下:
create [unique|fulltext|spatial] index index_name on index_test(name);#在数据表index_test中创建name的索引名为index_name;
#3、创建组合索引:
create index name_sex on index_test(name,sex);#创建name与sex的组合索引
#4、其他创建索引方法:
alter table [表名] add [约束条件(可不添加)] index index_id (ID);#创建索引
#删除索引:
drop index index_name on index_test;
alter tables index_test drop index index_name;
#删除数据表index_test中名为index_name的索引的两种方式
#在表(Test_table)中添加数据:
insert Test_table values();
#可以不写字段名,但是后面的values语句必须要按照顺序全部写完才可以正常添加。
insert Test_table(id,name,age) values(1,'Empty',10);
#字段名可以不写完,也可以顺序打乱,但是后面的values中插入的值的类型和顺序要与前面的字段名一致
insert [表名] values
(1,'name1',12),
(2,'name2',13),
(3,'name3',14),
(4,'name4',15);
#一次添加多条数据
#更新数据:
update [表名] set [字段名]=[新的值] where [约束条件]=[条件];
#EG:
update [表名] set name='newname' where id=1;
#添加了约束条件则仅仅更新id为1的那一条数据中的name字段,将其值变为newname;
update [表名] set name='newname';
#不添加约束条件则设置name字段中所有的值为newname;
#将外部文件导入到数据表:
load data local infile '文件路径' into table [即将被导入的数据表名];
#其中的反斜杠要被更改为正斜杠
#空值的设置:
update [表名] set [某字段]='NULL' where [约束条件];
#将某字段设置为空,并且不显示
update [表名] set [某字段]=NULL where [约束条件];
#将某字段设置为空,可以显示在表的查询界面
#表的查询:
select * from test;#查看表tone的所有字段信息(*可以替换为其他字段[ID/Name/Class/Score])
#按条件查询:
#带关系运算符的查询:
select * from test where [查询条件];
#EG:select ID from stuList where name='孔维';
#查询stuList数据表中的name为孔维的ID字段信息
#EG:select name form stuList where ID>3 and ID<12;
#查询stuList表中的ID为3~12的name字段信息
#特别注意日期的查询语法格式:
select * from [表名] where year(birth)<1998;#查询在1998之前的所有年份的所有字段信息
select * from [表名] where birth<'1998-01-01';#查询在1998一月一号之前的所有字段信息
#带IN的关键字查询:
select * from test where id [not] in(1,2,3);
#查询test表中的id字段[不]为1,2,3的所有字段信息
#not为可选参数,使用not查询不在IN关键字指定集合范围内的记录
#带BETWEEN AND关键字的查询:
select * from test where id [not] between [num1] and [num2];
#查询处于num1和num2之间的所有字段信息,其中not用法与带IN的关键字查询用法一致
#空值的查询:
select * from test where [字段名] is [not] null;
#查询test表中的[不]为空的所有字段信息,not用法与带IN的关键字查询用法一致
#带DISTINCT关键字的查询:
select distinct sex from [表名字];
#distinct关键字的作用是挑选显示sex字段所有的重复信息(‘男’,‘女’,null)(支持多字段的挑选显示)
#带LIKE的关键字的查询:
#语法结构:select * from [表名] where [字段名] [not] like '匹配字符串'
select * from [表名] where name like '王%';
#使用like关键字查询表中name的所有以‘王’开头的数据
select * from [表名] where name like '%林';
#使用like关键字查询表中name的所有以‘林’结尾的数据
#:%(百分比符号)通配符(通配字符长度不计,通配符使用时,无论这个字符串长度为多少都可以配对)
#:_(下划线符号)通配符(可以充当一个字符长度,通配符使用时,只能充当一个字符长度)
#带AND和OR的多条件关键字查询:
and:并且关系、or:或者关系
select * from test where name='kongwei' and id=1;#表示并且关系,正在查询的这个数据必须满足and前后的所有条件
select * form test where name='kongwei' or id=1;#表示或者关系,or前后某个条件满足即可查询
#如果需要连续使用AND和OR两个关键字,必须注意其中的逻辑关系
例如:
#查询计算机和工商的女学生所有字段信息:
select * from stuList where (part='计算机' or port='工商') and sex='女';
#数据库的子查询(顺带一提,后期将进行系统学习):
select * from stuList where part=(select part from stuList where name='Tom');
#查询stuList数据表中的与Tom同一专业的学生的所有字段信息
#关于LIMIT关键字的使用语法:
select * from [表名] where id limit 2,3;#查看id从3(偏移量)开始,往后三个(3,4,5)的所有字段信息
#聚合函数(通常配合GROUP BY分组查询使用):
#count函数的使用:
select count(number) from [表名];#查询表中的number字段的个数
#max函数的使用:
select max(number) from [表名];#查询表中的number字段的最大值
#min函数的使用:
select min(number) from [表名];#查询表中的number字段的最小值
#avg函数的使用
select avg(number) from [表名];#查询表中的number字段的平均值
#sum函数的使用:
select sum(number) from [表名];#查询表中number字段的平均值
#GROUP BY分组查询:
select count(*) from [表名] group by [某字段];#使用某字段作为分组依据,将相同的值分在一个组,之后通过访问组来确定count(*)的值
#例如:select count(*) from stuList group by Part;#查询在stuList表中有多少个不同Part
特别注意:group by分组查询后面不能跟where条件语句,只能跟having语句
(与where功能一致,并且其后面可以跟聚合函数,而where后面不可以跟聚合函数,如果语句中必要使用where关键字,请将where关键字放在group分组关键字之前使用)
#ORDER BY排序语句的语法:
select score from [表名] order by [字段名] [asc](升序)|[desc](降序);
select score from stulist order by score asc;#将学生的表按照score字段的升序排列
#多表操作:
1.建立两个表的外键约束:
alter table [主表名] add constraint [外键名] foreign key(需要建立的主表外键的字段名) references [外表(从表)表名](从表主键字段名);
eg:alter table stulist add constraint FK_Part foreign key(Part) references class(gid);
2.删除主表的外键约束:
alter table [主表名] drop foreign key [外键名];
#注意如果要删除表中的内容,要先删除主表中的内容,在删除从表中的内容
3.多表查询:
#使用语句 [表名.字段名] 指代查询某个表中的某个字段
(1).交叉连接查询:
select * from [表1] cross join [表2];
select stulist.id,stulist.name,class.major from stulist cross join class;
(2).内连接查询:
select * from [表一] join [表二] on [表一.关系字段]=[表二.关系字段] [where条件表达式];
select stulist.id,stulist.name,class.major from stulist join class on stulist.part=class.gid;
(3).外连接(左右连接查询):
左连接关键字:LEFT JOIN,具体功能:返回包括左表中的所有记录和右表中符合连接条件的记录,没有则返回空
语法:select * from [表一] left join [表二] on [表一.关系字段]=[表二.关系字段] [where条件表达式];
#EG:select * from stulist left join class on stulist.part=class.gid;
右连接关键字:RIGHT JOIN,具体功能:返回包括右表中的所有记录和左表中符合连接条件的记录,没有则返回空
语法:select * from [表一] right join [表二] on [表一.关系字段]=[表二.关系字段] [where条件表达式];
#EG:select * from stulist right join class on stulist.part=class.gid;
#视图是一种虚拟存在的、从一个或多个表中导入的表;
#视图的创建与查询以及简单操作:
#视图关键字:VIEW
1.在单表上创建视图:
创建了一个叫做stulist的表,在这个表的基础上创建视图:
create VIEW view_stulist
as
select id,Name,Class,Gender from stulist;
#创建完毕
2.在多表上创建视图:
创建了一个stuinfo表,用来存放学生信息,并使用内连接将两个表连接查询:
create VIEW view_stuInfo
as
select stulist.id,student.Name,student.Class,stuInfo.addr from stulist,stuInfo where
stulist.id=stuInfo.sid;
3.视图查询:
select * from [视图名];
4.视图结构的查询:
desc [视图名];
show table status like [视图名(可以使用通配符)];
#如果想查看在数据库中有多少视图,使用show tables;可以实现
5.视图的修改(视图字段的修改):
alter(create/replace) VIEW [视图名]
as
select [字段名(可以多个)] from [需要创建视图的表名];
举个栗子:
alter VIEW view_stuInfo
as
select stulist.id,student.Name,student.Class,stuInfo.addr,stulist.math+stulist.chinese as sum from stulist,stuInfo where
stulist.id=stuInfo.sid;
6.视图的更新操作:
#注意:在使用视图的更新,删除等操作的时候一定要注意,在视图里面的操作会应用到创建视图的基本表中
#注意,当视图中包含了以下内容时,视图的 更新 操作将不能进行:
(1).视图中包含基本表中被定义为非空的列
(2).在定义视图的SELECT语句后的字段列表中使用了数学表达式或者聚合函数
(3).在定义视图的SELECT语句中使用了DISTINCT、UNION、TOP、GROUP BY、或者HAVING结构
使用update更新视图(指直接使用update语句更新视图):
update [视图名] set [更新] (where) [条件];
使用insert更新视图(指在创建视图的基础表中添加数据以实现更新视图的操作):
insert [基础表名] values([字段信息]);
使用delete更新视图(删除某一个字段):
delete from [视图名] where [条件];
7.删除整个视图(本操作不会对基础表造成影响):
drop VIEW [视图名];
事务:
事务概述:事务具有很严格的定义,他必须同时满足四个条件(原子性、一致性、隔离性、持久性)
事务处理机制在程序开发过程中有着非常重要的作用,他可以使整个系统更安全,保证在同一个事务的操作中具有同步性
#事务的四个条件详细说明:
1、原子性:
原子性是指一个事物必须被视为一个不可分割的最小工作单元,只有事务中所有的数据库操作都执行成功,才算整个事务执行成功,事务中如果有任何一个SQL语句执行失败,已经执行成功的语句也必须撤销,数据库的状态退回到执行事务前的状态;
2、一致性:
一致性是指事务将数据库从一种状态转变为下一种一致的状态,
3、隔离性:
隔离性也可以称为并发控制、可串行化、锁等,当用户并发访问数据库是,数据库为每一个用户开启的事务,不能被其他事务的操作数据干扰,多个并发事务之间要相互隔离
4、持久性:
事务一旦提交,其所做的修改就会永远保存到数据库中,即使数据库发生故障也不会对其有任何影响。
#关于事务的语法,特点:
1、事务以start transaction;语句开始,后面跟随一条或者多条SQL语句,如果其中一条语句执行失败则自动回滚,撤销在start transaction语句之后的所有SQL操作
2、事务以commit;语句提交,如果只进行了操作没有提交,则在你下一次登陆数据库的时候自动回滚到事务开始之前的状态(数据)
3、事务撤销(手动回滚)语句:rollback;
事务的隔离级别:
#当我们数据库用户进行并发操作时,需要设置一定的隔离级别来避免数据干扰
事务一共被分为四个隔离级别,分别是:
1、读未提交(READ UNCOMMITTED):
最低的级别,该级别可以读取到其他一个事务中更新了但是没有提交的数据(也被称为‘脏读’)
2、读提交(READ COMMITTED):
#大多数数据库管理系统默认为该级别;
该级别可以读取到其他事务已经更新了并且提交的内容(可有效避免‘脏读’、但是不能避免重复读和幻读的情况)
#幻读:在一个事务中两次查询的数据结果条数不一致(原因是在该事物执行过程中,其他事务进行了添加操作并提交)
3、可重复读(REPEATABLE READ):
这是Mysql数据库中的默认级别可避免脏读,不可重复读的情况,(理论上该级别会出现幻读的情况,不过MySQL的存储引擎通过多版本并发控制机制解决了该问题,因此该级别是可以避免幻读的)
4、可串行化(锁)(SERIALIZABLE):
该级别是事务隔离的最高级别,他会强制对事务进行排序,使之不会发生冲突,从而解决幻读、脏读、重复读的问题。实际上就是在每个读的数据行上加锁。这个级别可能会大致大量的超时现象和锁竞争,实际应用中很少使用
怎么设置事务的隔离级别呢?
方法如下:
set session transaction isolation level [隔离级别];
(该设置设置的隔离级别应用到并发执行的数据库用户)
怎么查看数据库的隔离级别呢?
方法如下:
select @@tx_isolation;
到此就结束了,该笔记仅个人学习时记录,如果有问题欢迎指出,个人联系方式:
QQ:509743852
WeChat:mmmmmj1125
十分开心收到同学们的意见