MySql数据库入门
一、数据库基础知识
数据库database:是按照数据库结构来组织、存储、管理数据库的仓库
特点:数据结构化、数据共享、数据间独立性高、数据统一管理与控制
数据库系统:
数据库管理系统(DBMS)–>数据库
二、SQL语言(结构化查询语言)
1、关系型数据库的标准语言
关系型数据库
(SQLite、Oracle、mysql),是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。
非关系型数据库
(MongoDb、redis、HBase),非关系型数据库主要是基于“非关系模型”的数据库(由于关系型太大,所以一般用“非关系型”来表示其他类型的数据库)
列模型:存储的数据是一列列的。关系型数据库以一行作为一个记录,列模型数据库以一列为一个记录。(这种模型,数据即索引,IO很快,主要是一些分布式数据库)
键值对模型:存储的数据是一个个“键值对”,比如name:liming,那么name这个键里面存的值就是liming
1、使用键值对存储数据;
2、分布式;
3、一般不支持ACID特性;
4、非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
2、sql语言
1、数据库定义语言(DDL)用于定义数据库和表。create、alter、drop
2、数据库操作语言(DML)用于对数据库的增删改。insert、delete、update
3、数据库查询语言(DQL)用于对查询数据。select
4、数据库控制语言(DCL)用于控制用户的访问权限. grant增加用户权限、revoke收回用户权限、commit提交事务、rollback回滚事务
三、数据类型
1、整数类型:tinyint、samllint、mediumint、int、bigint
2、浮点类型:float、double、decimal(定点数类型)
decimal(6,2)表示该数长度为6,小数点后的数长度为2 如:1234.56
3、日期与时间类型:year(年)、date(日期)、time(时间)、datetime(日期和时间)、timestamp(日期和时间,范围小)
YY-MM-DD HH:MM:SS
4、字符串类型:char(固定长度字符串)、varchar(可变长度)、binary(固定长度二进制)、varbinary(可变长度二进制)
char:不管插入长度多少都为4个字节。varchar:插入数据的字节数为长度加1
四、数据库和表操作
1、创建查看数据库
create database 库名;
show databases;
2、查看创建好的数据库
show create database 库名;
3、修改数据库
alter database 库名 default character set 编码方式 collate (要修改的)编码方式_bin
4、删除数据库
drop database 库名;
五、数据表的基本操作
1、创建数据表
create table 表名(字段名,数据类型,完整性约束条件,…)
2、查看数据表
show create table 表名(查看表名称,编码,定义语句)
desc 表名(查看字段信息)
3、修改数据表
1)修改表名
alter table 旧表名 rename 新表名;
2)修改字段名
alter table 表名 change 旧字段名 新字段名 数据类型;
3)修改字段类型
alter table 表名 modify 字段名 数据类型;
4)添加字段
alter table 表名 add 新字段名 数据类型 [约束条件] [first|after 已存在字段名];
5)删除字段
alter table 表名 drop 字段名;
6)修改字段排列位置
alter table 表名 modify 字段名1 数据类型 first|after 字段名2
4、删除数据表
drop 表名;
5、表的约束
约束条件 | 说明 |
---|---|
primary key | 主键约束,用于唯一标识对应的记录 |
foreign key | 外键约束,用于关联表 |
not null | 非空约束 |
unique | 唯一性约束,表中字段的值不能重复出现 |
default | 默认值约束,用于设置字段的默认值 |
6、表中字段值自动增加(自增):auto_increment
六、索引
对数据表中的一列或多列的值进行排序后的一种结构,作用是提高表中数据的查询速度
索引 | 说明 |
---|---|
普通索引 | 由key或index定义的索引 |
唯一索引 | 有unique定义的索引,该索引在字段的值必须唯一 |
全文索引 | 有fulltext定义的索引只能创建在char,varchar,text类型的字段上 |
单列索引 | 表中单个字段上建立索引,可以使普通,唯一,全文索引 |
多列索引 | 表中多个字段建立索引,只有查询条件使用第一个字段时,该索引才会被使用 |
空间索引 | 有spatlal定义的索引只能创建在空间数据类型的字段上,空间数据类型:geometry,point,linestring,polygon必须声明为not null |
1、创建索引
1.创建表的时候创建索引
2.使用create index语句在已经存在的表上创建索引
create [unique|fulltext| spatial] index 索引名 on 表名(字段名 [(长度)] [desc|asc])
如:create index index_id on book (bookid);
3、使用alter table 语句在已经存在的表上创建索引
alter table 表名 add [unique|fulltext| spatial] index 索引名(字段名 [(长度)] [desc|asc])
如:alter table book add index index_id(bookid);
2、删除索引
drop index 索引名 on 表名;
七、数据表的增删改查
增加:insert into 表名(字段名1,字段名2…) values (值1,值2…);
删除:delete from 表名 where 条件;
truncate table 表名(也可以实现删除操作但不能加条件且,删除后在添加数据时id自动增加字段初始化默认由1重新开始)
修改:update 表名 set (值1,值2…)where 条件;
查询:select from 表名 where 条件;
简单查询:
select [distinct] *|字段名1,字段名2…
from 表名
[where 条件表达式]
[group by 字段名 [having 条件表达式2]]
[order by 字段名 [asc|desc]]
[limit [offset] 记录数]
distinct:可选参数,用于剔除查询结果中重复的数据。
group by:可选参数,用于对查询结果指定字段进行分组。
having :用于对分组结果进行过滤。
order by:用于对查询结果指定字段进行排序。排序方式有asc【升序】和desc【降序】控制。
limit:用于限制查询结果显示的数量。后面跟两个参数,offset表示偏移量,记录数表示返回的结果条数。
where 条件查询:
in 集合 表示:指定字段是否在指定集合中,满足结果把该字段所在的记录查询出来。
如:select * from student where id in {1,2,3};字段id是否在集合123中,结果把id为1,2,3的记录查询出来。
between and 表示:某个字段的值是否在指定范围内。
如:select * from student where id between 2 and 5;查询id范围在2到5内的记录。
like 表示:判断两个字符串=相等的意思,有时候是对字符串进行模糊查询的意思。
如:select * from student where 字段名 [not] like ‘匹配字符串’;
% 表示通配符:匹配任意长度的字符串。
如:select * from student where name [not] like “张%”; 查询学生表名字有张开头的记录。
_ 表示单个通配符:只能匹配一个字符,如要匹配多个需要添加多个_ 且不能有空格。
如:select * from student where name [not] like “张_”; 查询学生表名字有张开头的两位数记录。
\ 表示转义字符:如果要匹配百分号或下划线就需要\进行转义。
or 表示:不同于and ,只需满足其中一个条件即可。注意:and的优先级高于or。
八、高级查询-聚合函数
函数名称 | 说明 |
---|---|
count() | 返回某列的行数 ,用来统计记录的条数,select count(*)from 表名 |
sum() | 返回某列值的和,用于求某个字段所有值的总数,select sum(字段名) from 表名 |
avg() | 返回某列的平均值,用于求某个字段所有值的平均值,select avg(字段名) from 表名 |
max() | 返回某列的最大值,用于求某个字段所有值的最大值,select max(字段名) from 表名 |
min() | 返回某列的最小值,用于求某个字段所有值的最小值,select min(字段名) from 表名 |
为表和字段取别名
在查询表操作时,如果表名很长使用起来不方便时可以为表取个别名,用这个别名代替表名
select * from 表名 [as] 别名;
为字段取别名
select 字段名 [as] 别名 from 表名;
九、多表操作
1、外键
是指引用另一张表中的一列或多列,被引用的列应该具有主键约束和唯一约束。外键用于加强两个表之间的连接。
alter table 表名 add constraint 外键名 foreign key (外键字段名)references 外表表名(主键字段名)
如:alter table
student
add constraint FK_ID foreign key (
gid
) references
book(id)
;
删除外键名称:
alter table 表名 drop foreign key 外键名;
2、操作关联表
关系:
一对一:人和身份证就是一对一的关系,通常在一个表中就可表示。
一对多:部门和员工就是一对多的关系。一个部门对应多个员工。一个员工只属于一个部门。所以需要在多的一方(员工表)建立外键。
多对多:课程与学生就属于多对多的关系。一门课程可以被多名学生选择,而一名学生可以选择多名课程。实现这种关系需要一个中间表关联。
当有关联表做删除操作时,需要先将关联的数据删除再删除自身数据。
3、子查询
指查询语句嵌套在另一个查询语句内部中的查询。
在查询结果时,先执行子查询中的语句作为外层查询的过滤条件
关键字 | 说明 |
---|---|
in | 内层查询返回一个数据列,作为外层查询的条件 |
exists | 可以是任意子查询语句,并返回true或false,当返回true时外层查询才执行 |
all | 和and有点类似,只是返回的结果需要满足所有内层查询条件 |
=,>,<,!= | 带比较运算符的子查询 |
十、事务与存储过程
1、事务管理
保证同一个事务的操作具有同步性。
严格遵守4个特性:
原子性 :一个事务必须视为不可分割的最小工作单元。
一致性:事务将数据库的一种状态转变成下一种状态。
持久性:一旦提交永久保存到数据库。
隔离性:也称并发控制,可串行化,锁等,多用户访问时,为每个用户开启一个事务,互不干扰。
开启事务:start transaction;
提交事务:commit;提交事务后,数据库数据才发生改变。
回滚事务:rollback;不想提交事务可以取消相关事务(也称回滚)
2、事物的隔离级别
1、read uncommitted(读未提交)事务中最低级别,可以读取未提交的数据,也称脏读。危险少用。
2、read commited(读提交)大多数数据库默认隔离级别,只能读取已经提交的内容。但无法避免重复读和幻读。
3、repeatable read(可重复读)Mysql默认事务隔离级别。可避免不可重复度和脏读的问题,确保同一个事务的多个实例在并发读取数据时,会看到同样的数据。
4、serializable(可串行化)事务的最高隔离级别。他它对强行对事务进行排序,使之不会发生冲突,实际上是在每个读的数据行前加个锁,这种级别可能导致大量的超时现象和锁竞争。
脏读:指事务读取了另一个事务未提交的数据。
不可重复度:事务中两次查询的数据不一致,原因是在查询过程中其他事务做了更新操作。
幻读:一次事务查询中数据的条数不一致。
可串行化:在每个读的数据行前加上锁,使之不可相互冲突,因此会造成大量超时现象。
3、存储过程的创建
开发中经常要重复使用一段代码实现功能的情况,存储过程就是对这一段代码进行封装,当调用存储过程时就会执行里面的代码实现功能。以便重复使用。
create procedure 存储过程名称(参数列表)
[characteristics…] routine_body
delimiter // // 将MySql的结束符设置为//,默认是;但为了避免与其他冲突
create procedure Proc()
begin
select * from student
end // 以end//结束存储过程
........
delimiter //存储过程完毕后再使用delimit恢复默认结束符;
变量:用于保存数据处理过程的值
declare 变量名 数据类型 default 默认值;
set 变量名=值; //修改变量值
4、流程控制
流程控制语句将多个Sql语句划分或组成符合业务逻辑的业务代码块。
判断结果为true或false执行相应的语句。
if语句
if 判断条件 then SQL语句列表 //条件判断语句只需为true,相应的SQL语句就会执行,如果判断条件没有匹配,else子句里面的SQL语句就会执行
[elseif 条件判断 then SQL语句]
[else SQL语句]
end if
case语句
case 条件判断表达式
where 条件判断表达式可能的值 then SQL语句
where 条件判断表达式可能的值 then SQL语句
[else SQL语句]
end case
loop 循环语句
loop只是创建一个循环操作的过程,并不进行条件判断,loop一直重复执行直到跳出循环
[loop语句的注释名称:] loop
循环执行的语句
end loop
level 跳出语句
循环语句进行跳出作用
level 标签
declare in int default 0;
add_loop:loop
set id=id+1; //循环执行id+1的操作
if id>=10 then level add_loop; //进行条件判断id>=10,满足条件level跳出并结束循环
end if;
end loop add_loop;
iterate 再次循环语句
将执行顺序转到语句段的开头处。
iterate 标签
repeat 条件判断循环语句
用于创建一个带有条件判断的循环过程,每次语句只需完毕之后进行判断如果为真就跳出循环,为假就重复执行循环中的语句。
[注释名称:] repate
执行语句
until 判断条件
end repate [注释名]
where 条件判断循环语句
也是创建一个带有条件判断的循环过程,与repate不同的是,where会先对指定的表达式进行判断,在执行语句。
declare i int default 0;
where i<10 do
set i=i+1;
end where;
5、存储过程的使用
存储过程可以是程序执行效率更高,安全性更好,增强程序的可重用性和维护性。
1、存储过程必须使用call 语句调用
call 存储过程名称([存储过程参数])
2、查看存储过程
这个语句是一个MySql的扩展,他返回子程序的特征,如数据库,名字,类型,创建时间等
show [procedure|function] startus [like 'pattern'] //procedure|function表示查看存储过程和函数 like 'pattern'表示查看匹配的名称
3、修改存储过程
alter {procedure | function} startus [characteristic...] //characteristic...表示修改存储过程的哪个部分
4、修改存储过程
drop {procedure | function} [if exists] startus
十一、视图
视图是从一个表或多个表导出来的表,是一张虚拟的表,并且表结构和数据都依赖基本表。
它不仅可以看到不仅能看到存放在基本表中的数据,并且还可以像操作基本表中的数据一样对视图存放的数据进行增删改查。
优点:简化查询语句、安全性、逻辑数据的独立性
1、创建视图
create [or replace] [algorithm = {undefined | merge | temptable}] //[or replace]给定此子句,表名该语句能够替换已有视图 algorithm视图选择的算法 {undefined | merge | temptable}表示mysql将自动选择算法|表示视图语句与视图定义合并起来|表示视图的结果放入临时表中,然后使用临时表执行语句。
view 视图名称 [(属性清单))]
as 一个完整的查询语句
[with [cascaded | local] check option ] //with check option表示创建视图时要保证要在视图的权限范围之内 [cascaded | local] 表示要满足跟视图相关的所有视图和表的条件,默认 | 表示只需要满足视图本身定义的条件即可。
如:
create view view_stu as select math,chinese,math+chinese from student;
创建了视图,并从学生表中查询出数学、语文、和重新定义数学+语文的成绩之和的字段。默认情况下,创建的名称和基本表字段名称一样,但也可以根据实际需要指定视图字段名称。
2、查看视图
1、show view
可以使用
describe 视图名;
查看视图的字段信息,简写
desc 视图名;
2、匹配查看的视图名称
show table status like '视图名称'
3、查看视图时的定义语句,和字符编码
show create view 视图名;
3、修改视图
create or replace view 视图名 as SQL语句;
alter view 视图名 as SQL语句;
4、更新视图
对视图原有的数据进行更新
update 视图名 set 字段名=值;
insert into 表名 value(值)
delete from 表名 where 字段名=值;
5、删除视图
drop view 视图名1,视图名2;
十二、数据库的高级操作
1、数据库备份与还原
数据库备份mysqldump
备份单个数据库
mysqldump -u用户名 -p密码 数据库名称 [数据库表名1,数据库表名2...] >存放路径sql文件名称.sql
备份多个数据库
mysqldump -u用户名 -p密码 --database 数据库名称 [数据库表名1,数据库表名2...] >存放路径sql文件名称.sql
备份单个数据库
mysqldump -u用户名 -p密码 --all-database>存放路径sql文件名称.sql
数据的还原
mysqldump -u用户名 -p密码 [数据库名称] <存放路径sql文件名称.sql
删除数据库
drop database 数据库名称;
2、用户管理
1、创建用户
grant不仅可以创建用户还可以对用户进行授权,该语句会自动记载权限表。最常用。
grant user 创建新用户服务器会自动修改相应的权限表,但新用户没有任何权限。
2、删除用户
drop user 用户信息;
3、修改用户密码
修改root用户密码
mysqladmin -u用户名 [-h 主机名] -p密码 新密码
update mysql.user set password=PASSWORD('新密码')
where user='用户名' and host='主机名';
flush privileges;//重新加载权限表
root用户修改普通用户密码
grant usage on *.* to '用户名'@'主机名' identified by [password] '新密码';
普通用户修改密码
set password=password('新密码');
如何解决root用户密码丢失问题
1停止MySql服务
net stop mysql;
2.使用--skip-grant-tables启动mysql服务,他可以停止MySQL的权限判断任何人都可以访问数据库,也可以启动mysql服务
--skip-grant-tables
3.登录mysql服务器(重新开一个对话框)
mysql -u root
4.使用update语句设置root用户密码
update mysql.user set password=PASSWORD('新密码')
where user='用户名' and host='主机名';
5。加载权限表,使密码生效
flush privileges;//重新加载权限表
3、权限管理
grant privileges [(columns)] ... on database.table //privileges表示权限类型 columns参数表示权限作用于某一列
to '用户名'@'主机名' [identified by [password] '密码'] //identified by参数为用户设置密码
[with with_option...] //with后面带多个参数with_option(5个参数。。。)
查看权限
show grant for ''@'';
回收权限
revoke privileges [(columns)] ... on database.table //privileges表示权限类型 columns参数表示权限作用于某一列
from '用户名'@'主机名' [,'username'@'hostname']... //identified by参数为用户设置密码
如:收回指定用户insert权限
revoke insert on *.* from '指定用户名'@'主机名';