mysql数据库的操作
数据库的创建和删除
数据库的创建
create database 数据库名 charset=utf8;
查看所有数据库
show databases;
查看当前使用的数据库
select database();
数据库的删除
drop database 数据库名;
数据表的创建和删除
数据表的创建create
CREATE TABLE table_name(
字段名称 数据类型 可选的约束条件,
column1 datatype contrai,
column2 datatype,
column3 datatype,
.....
columnN datatype,
-- 主键说明可以放在字段中单独说明 也可以放在最后统一说明
PRIMARY KEY(one or more columns)
);
查看创表语句
show create table 表名;
数据表的删除 drop
drop table 表名;
查看当前数据库中所有的表show
show tables;
查看表结构dese
desc 表名;
修改表结构alter
添加字段
alter table 表名 add 列名 类型;
重命名字段
alter table 表名 change 原名 新名 类型及约束;
修改字段类型
alter table 表名 modify 列名 类型及约束;
删除字段
alter table 表名 drop 列名;
数据的增删改查
数据的查找select
select 查询字段 from 表名;
where操作
select * from 表名 where 条件;
where比较运算
-
等于: =
-
大于: >
-
大于等于: >=
-
小于: <
-
小于等于: <=
-
不等于: != 或 <>
where逻辑运算
- and,表示有多个条件时, 多个条件必须同时成立(值为True)
- or, 表示有多个条件时,满足任意一个条件时成立
- not,表示取反操作
where模糊查询
- like
- %表示任意多个任意字符
- _表示一个任意字符
where范围查询
1. in表示在一个非连续的范围内
2. between ... and ...表示在一个连续的范围内
注意: between A and B在匹配数据的时候匹配的范围空间是 [A,B]
where空值判断
1. null与''是不同的
2. is null
优先级
- 优先级由高到低的顺序为:小括号,not,比较运算符,逻辑运算符
- and比or先运算,如果同时出现并希望先算or,需要结合()使用
总结
- 常见的比较运算符有 >,<,>=,<=,!=
- 逻辑运算符and表示and连接的多个条件同时成立则为真,or表示or连接的多个条件有一个成立则为真,not表示对条件取反
- like和%结合使用表示任意多个任意字符,like和_结合使用表示一个任意字符
- bettween-and限制连续性范围 in限制非连续性范围
- 判空用IS NULL 判非空用 IS NOT NULL
order排序
select * from 表名 order by 排序列1 asc|desc [,排序列2 asc|desc,...]
聚合函数

group分组查询
group by分组
group by + group_concat()
group by + 聚合函数
group by + having
group by + with rollup
limit限制记录
可以使用limit限制取出记录的数量,但limit要写在sql语句的最后。
select * from students limit 0,3; 意思是:从第下标为0的记录开始取,取3条。
分页查询
- 从start开始,获取count条数据
- start默认值为0
- 也就是当用户需要获取数据的前n条的时候可以直接写上 xxx limit n;
select * from 表名 limit start=0,count
连接查询
内连接
语法1
select 字段 from 表1 inner join 表2 on 表1.字段1 = 表2.字段2
语法2
select 字段 from 表1 , 表2 where 表1.字段1 = 表2.字段2
外连接
左连接
主表 left join 从表 on 连接条件;
右链接
从表 right join 主表 on连接条件;
自然连接
子查询
select 字段名 from 表名 where 字段 in (select 字段名 from 表名);
数据的添加insert
insert into 表名 values (...)

数据的删除
物理删除,不可找回
delete from 表名 where 条件
逻辑删除,本质是修改
update students set isdelete=1 where id=1;
数据的更改update
update 表名 set 列1=值1,列2=值2... where 条件
事务
什么是事务
事务Transaction,是指作为一个基本工作单元执行的一系列SQL语句的操作,要么完全地执行,要么完全地都不执行。
事务的四个特性
原子性(atomicity)
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性
一致性(consistency)
数据库总是从一个一致性的状态转换到另一个一致性的状态。
隔离性(isolation)
通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。当一个事务操作数据时,其他事务的操作必须等待,当前事务提交后才可以执行。
持久性(durability)
一旦事务提交,则其所做的修改会永久保存到数据库。(此时即使系统崩溃,修改的数据也不会丢失。)
查看表引擎
表的引擎类型必须是innodb类型才可以使用事务
show engines; # 查看数据库服务器支持的表存储引擎
开启事务
开启事务后执行修改命令,变更会维护到本地缓存中,而不维护到物理表中
begin;
或者
start transaction;
提交事务
将缓存中的数据变更维护到物理表中
commit;
回滚事务
放弃缓存中变更的数据 表示事务执行失败 应该回到开始事务前的状态
rollback;
原子的ACID特性
- 事务有原子性、一致性、隔离性、持久性
- 原子性强调事务中的多个操作时一个整体
- 一致性强调数据库中不会保存不一致状态
- 隔离性强调数据库中事务之间相互不可见
- 持久性强调数据库能永久保存数据,一旦提交就不可撤销
关于事务需要注意的几个问题
- 修改数据的命令会自动的触发事务,包括insert、update、delete
- 在mysql命令行中会自动提交事务,所以当我insert语句执行完成后没有commit数据库也看到了提交的数据。
- 当我们不需要mysql命令行自动提交的时候 键入
set autocommit=0即可 - SQL语句中有手动开启事务的原因是:可以进行多次数据的修改,如果成功一起成功,否则一起会滚到之前的数据
- 不可撤销的操作(隐式提交): 除了对表数据insert/update/delete语句之外的绝大多数语句都是不能撤销的,比如数据库、表结构的操作,大家可以动手验证。
索引
为什么使用索引(适用于不经常变动的表)
索引是一种数据结构,用于快速查找和访问表中的数据。它可以看作是一个目录,帮助我们在数据库表中快速找到所需的信息。索引的作用是提高查询效率,因为它能够减少数据库系统需要扫描的数据量,从而加快查询速度。
查看索引
show index from 表名;
创建索引
create index 索引名称 on 表名(字段名称(长度))
删除索引
drop index 索引名称 on 表名;
关于索引的使用问题
- 索引可以明显提高某些字段的查询效率
-
索引使用
- 创建 create index xxx on 表名(字段名[(索引长度 字符串类型才需要指定)])
- 查看 show index for xxx
-
索引的副作用-索引虽好 不要贪杯
- 要注意的是,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。
- 建立索引会占用磁盘空间
用户
查看所有用户
- 所有用户及权限信息存储在mysql数据库的user表中
select host,user,authentication_string from user;
- 主要字段说明:
- Host表示允许访问的主机,%为所有主机都可以登录
- User表示用户名
- authentication_string表示密码,为加密后的值
创建用户
create user '用户名'@'主机' identified by '密码';
给用户授权(需要刷新权限,重新登录)
grant 权限 on 数据库.表名 to '用户名'@'主机名';
flush privileges;
查看用户的权限
show grants for '用户名'@'localhost';
更改用户的权限(需要刷新权限重新登录)
grant 权限名称 on 数据库 to 账户@主机 with grant option;
flush privileges;
删除用户
语法1
delete from user where user='用户名';
语法2
drop user '用户名'@'主机';
修改用户的密码
ALTER user 'root'@'%' IDENTIFIED BY '密码';
flush privileges;
忘记密码时免密登录
先停止服务
编辑MySQL配置文件mysqld.cnf
添加跳过验证
[mysqld]段下加入一行“skip-grant-tables
启动服务
使用mysql -u root -p回车直接登录
修改密码,先设置为空
use mysql
update user set authentication_string='' where user='root';