本机安装的是MySQL5.7数据库,采用离线安装的方式,笔者打算把数据库学懂后再升级为8.0版本的。MySQL其实是一个数据管理系统(DataBase Managment System, DBSM),既包括数据的存储,又具有有数据的管理功能。MySQL5.7默认的引擎是InnoDB,它提供事务安全的存储机制。InnoDB通过建立行级锁来保证事务完整性并以Oracle风格的共享锁来处理Select语句。一般来说,对于MySQL5.0以上的版本,无须指定数据表的存储机制,因为系统默认使用InnoDB存储机制。除了InnoDB外,MySQL早期的数据库引擎是MylSAM,它对事物的支持并不好。SQL(Structured Query Language)是结构化查询语言,是操作和检索关系数据库的标准语言。
1、DQL(Data Query Language)查询语句:主要由select关键字完成,查询语句是SQL语句中最复杂、功能最丰富的语句。
2、DML(Data Manipulation Language,数据操作语言)语句:主要由insert、update和delete三个关键字完成。
3、DDL(Data Definition Language,数据定义语言)语句:主要由create、alter、drop和truncate四个关键字完成。
4、DCL(Data Control Language,数据控制语言)语句:主要由grant和revoke两个关键字来完成。
由于是离线安装,因此并不支持在CMD命令行输入“ net start mysql ”这种启动方式,而是需要去MySQL的bin目录下找到mysqld.exe程序来运行启动数据库;同理,也不支持“ net stop mysql ”这种停止服务的方式,呃,怎么在bin目录里用exe程序来停服我没用过,在写这篇笔记时专门查过这个问题,但没找到答案,所以,我一般都是直接去任务管理器里结束mysql任务来停服。
列类型 |
说明 |
tinyint/smallint/mediumint int/bigint |
1字节/2字节/3字节/4字节/8字节整数,又可分为有符号和无符号两种。这些整数类型的区别仅仅是表示的范围不同。 int默认最多11位, int(2) 必须是2位数字 |
float/double |
单精度、双精度浮点类型 |
decimal/dec |
精确小数类型,相对于float和double不会产生精度丢失的问题 decimal(6,2) |
date |
日期类型,不能保存时间,当把Java中的Date对象保存到date列时,时间部分丢失 |
time |
时间类型,不能保存日期,当把Java中的Date对象保存到date列时,日期部分丢失 |
datetime |
日期、时间类型 |
timestamp |
时间戳类型 不能没有值. 默认是系统当前时间. yyyy-MM-dd |
year |
年类型,仅仅保存时间的年份 |
char |
定长字符串类型 char(10) 必须是10个字符的字符串 |
varchar |
可变长度字符串类型 **** varchar(10) 最多10个字符 |
binary |
定长二进制字符串类型,它以二进制形式保存字符串 |
varbinary |
可变长度的二进制字符串类型,它以二进制形式保存字符串 |
tinyblob/blob/ mediumtblob/longblob |
1字节/2字节/3字节/4字节的二进制大对象,可以用于存储图片,音乐等二进制数据,分别可存储255B/64KB/16MB/4GB大小 |
tinytext/text mediumtext/longtext |
1字节/2字节/3字节/4字节的文本对象,可以用于存储超长的字符串,分别可存储255B/64KB/16MB/4GB大小的文本 |
(1)、查询(显示)所有数据库
show databases;
(2)、创建一个名为“ review ”的数据库
create database review;
(3)、删除名为“ review ”的数据库
drop database review;
(4)、如果存在名为“review”的数据库,则不创建,否则创建名为“ review ”的数据库
create database if not exists review;
(5)、如果存在名为“review”的数据库,则删除它,否则不删除
drop database if exists review;
(6)、查看当前数据库下的所有表
show tables;
(1)、创建一个名为“ tstudent ”的表,若不存在,则创建,否则不创建。
create table if not exists tstudent(
sid int primary key auto_increment comment '主键',
sname varchar(30) not null comment '姓名',
sgae int(2) comment '年龄',
ssex int(1) comment '性别'
);
(2)、查看表“ tstudent ”的表结构
desc tstudent;
(3)、查看建表“ tstudent ”的SQL语句
show create table tstudent;
(4)、删除表“ tstudent ”,若存在则删除(删除表里的数据和表结构)
drop table if exists tstudent;
(5)、UUID函数的用法(其中 “ dual ”是个虚表)
select replace(uuid(),'-','') as uuid from dual;
(6)、给已经建好的表“ tstudent ”新增一个地址的字段
alter table tstudent add(saddr varchar(100) comment '地址');
/**若要增加多个字段,则每个字段结构用逗号隔开**/
(7)、修改“ tstudent ”表里的“ saddr ”字段的信息为“ saddress varchar(200) comment '家庭住址' ”
1、change关键字和modify关键字:
alter table tstudent change saddr saddress varchar(200) comment '家庭住址';
/**change关键字在修改表结构时可以修改字段名**/
alter table tstudent modify saddress varchar(150) comment '现住址';
/**modify关键字在修改表结构时不能修改字段名,只能修改当前字段的结构**/
(8)、重命名表“ tstudent ”的名字为“ t_students ”
alter table tstudent rename to t_students;
(9)、删除表中“ saddress ”这个字段
alter table tstudent drop saddress;
(10)、一次性删除表中的所有数据,但不会删除表结构
truncate table tstudent;
(1)、给表“ tstudent ”里一次添加一条或多条数据数据
1、添加一条数据
insert into tstudent(sname,sage,ssex,saddr) values('张三',12,'男','山东济南');
/**为了性能的优化和后期的维护,建议在插入数据时将需要插入数据的字段依次写上**/
2、一次添加多条数据,每条数据之间用逗号隔开;因主键是自增长,所以在插入时直接给它null
insert into tstudent(sid,sname,sage,ssex,saddr) values(null,'李四',13,'男','山东济南'),(null,'张丽丽',13,'女','山东临沂');
(2)、修改表“ tstudent ”里的信息
1、根据id来修改数据(一次修改一条数据)
update tstudent set sname='小鑫哥',saddr='山东临沂' where sid=2;
/**若要修改多个字段,则依次用逗号隔开即可**/
2、根据其他条件来修改数据(一次修改多条数据)
update tstudent set ssex='女' where ssex is null;
3、根据模糊匹配条件修改数据(一次修改多条数据)
update tstudent set sage=16 where saddr like '%济南%';
(3)、删除表里的数据
1、此语句为删除表里的所有数据
delete from tstudent;
/**与 truncate table tstudent; 这条语句相比,truncate的执行效率更高,而且会删除自增长的主键的信息**/
2、根据主键来删除一条数据
delete from tstudent where sid=2;
3、根据条件来删除多条数据
delete from tstudent where sage>13;
(4)、外键约束,给city表里的创建一个pid为外键来自province表里的pid字段,其中province表叫做主表或父表,city表叫做从表或子表
1、建表时就添加外键约束
create table if not exists province(
pid int primary key auto_increment,
pname varchar(10) not null
);
create table if not exists city(
cid int primary key auto_increment,
cname varchar(10) not null,
pid int,
constraint fk_c_p foreign key(pid) references province(pid)
);
2、已经建好表后,再添加约束
alter table city add constraint fk_c_p foreign key (pid) references province(pid);
(5)、插入、修改、删除具有外键的子表或父表
1、插入数据到父表和子表
insert into province values(null,'山东省'),(null,'青海省');
insert into city values(null,'临沂市',1),(null,'青岛市',1);
insert into city values(null,'西宁市',2),(null,'海西市',2);
2、修改子表时,外间那一字段里的数据只能是父表里被关联的数据,若不是,则无法修改和插入
update city set pid=3 where cname='海东市';
3、删除外键约束
alter table city drop foreign key fk_c_p;
/**通过上述语句完成了外键约束的删除操作,但是创建外键时自动创建的索引会被保留下来,所以需要通过下面这条语句来删除索引达到彻底删除的操作。**/
alter table city drop index fk_c_p;
(6)、级联更新、删除子表中外键的值
1、创建表时在子表外键那一字段后面加上示例中的语句即可设置级联更新和删除
create table if not exists province(
pid int primary key auto_increment,
pname varchar(10) not null
);
create table if not exists city(
cid int primary key auto_increment,
cname varchar(10) not null,
pid int,
constraint fk_c_p foreign key(pid) references province(pid) on update cascade on delete set null
);
2、级联更新
update province set pid=3 where pname='山东省';
/**执行完这条语句后,city表中的pid字段会自动更新,与父表中的pid会保持一致,这就是级联更新**/
3、级联删除
delete from province where pname='青海省';
/**执行完这条语句后,city表中的关联着‘青海省’pid的外键值都将会设置为null,这就是级联删除**/
(7)、级联操作下的多对多建表和中间表
1、级联操作里的多对多建表,role表,power表,t_r_p中间表
create table if not exists role(
rid int primary key auto_increment,
rname varchar(20)
);
create table if not exists power(
pid int primary key auto_increment,
pname varchar(20)
);
create table if not exists t_r_p(
tid int primary key auto_increment,
rid int,
pid int,
constraint fk_t_r foreign key (rid) references role(rid) on update cascade on delete set null,
constraint fk_t_p foreign key (pid) references power(pid) on update cascade on delete set null
);
(8)、索引的建立与删除。索引是存放在模式中的一个数据库对象,虽然索引总是从属于数据表,但它和数据表一样从属于数据库对象。创建索引的唯一作用就是加速对表的查询,索引通过使用快速路径访问方法来快速定位数据,从而减少了磁盘的I/O。索引作为数据库对象,在数据字典中独立存放,但不能独立存在,必须从属于某个表。创建索引有两种方式:
a、自动:当在表上定义主键约束、唯一约束和外键约束时,系统会为该数据列自动创建对应的索引。
b、手动:用户可以通过 create index from tableName 语句来创建索引。
1、查看“tstudent”表中的索引
show index from tstudent;
2、给某一个创建一个索引,也可以给多个字段创建索引,只需将字段名写在括号里,用逗号隔开
create index sname2index on tstudent(sname,sphone);
3、删除索引
drop index snameindex on tstudent;
(9)、视图(view)。视图看上去像一个数据表,但它不是数据表,因为它并不能存储数据。视图只是一个或多个数据表中数据的逻辑显示,使用视图有以下几点好处:
a、可以限制对数据的访问
b、可以使复杂的查询变得简单
c、提供了数据的独立性
d、提供了对相同数据的不同显示。
因为视图只是数据表中数据的逻辑显示,即一个查询结果,所以创建视图就是建立视图名和查询语句的关联。
1、创建一个视图
create or replace view nv201
as
select * from tstudent where ssex='女' and sage<=20;
/**视图里的数据会根据创建视图时的where条件随着原表里的数据而自动更新,当视图里的数据被修改时,则原表里的数据也会被修改**/
2、查询视图里的数据
select * from nv201;
3、删除一个视图
drop view nv201;
4、创建一个视图,限制更改where条件里的字段值的视图,但可以更改where条件之外字段的数据
create or replace view nv202
as
(select * from tstudent where ssex='女' and sage<=20)with check option;
/**若nv202视图存在,则下面这条语句会执行失败**/
update tstudent set sage=22 where sage=17;
(1)、创建、删除一个用户
1、创建一个名为“lcx”的用户,“%”意思是可以在所有主机上登录这个账号
create user 'lcx'@'%' identified by '123456';
2、删除用户“lcx”
drop user 'lcx'@'%';
(2)、给用户设置权限,删除权限
1、给予用户“lcx”在review库里的对tstudent表的select 权限
grant select on review.tstudent to 'lcx'@'%';
2、给“lcx”用户给予多个权限,中间依次用逗号隔开
grant select,update,delete on review.tstudent to 'lcx'@'%';
3、给“lcx”用户给予所有权限
grant all on *.* to 'lcx'@'%';
4、给“lcx”用户给予所有权限以及授权权限,即可以执行“grant....”语句的权限
grant all on *.* to 'lcx'@'%' with grant option;
5、删除用户“lcx”在review库里的对tstudent表的update权限
revoke update on review.tstudent from 'lcx'@'%';
6、删除用户“lcx”的所有权限
revoke all on *.* from 'lcx'@'%';
7、刷新权限,由授权者执行的语句
flush privileges;
(3)、数据库或表的导入与导出
1、使用CMD窗口导出导入数据库或数据表
mysqldump -u Bit -pBit review>D:\Test\review.sql
/**导出review这个数据库(其中第一个“Bit”是用户名,-p后面的“Bit”是对应的密码“>”后面是本地路径)**/
mysqldump -u Bit -pBit review city>D:\Test\review_city.sql
/**导出review这个库里的city表的数据**/
2、导入刚才导出的数据(必须要登录到数据库后,创建一个新库,然后执行以下命令)
source D:\Test\review.sql;