MySQL操作备忘录
数据库
什么是数据库?
数据库是储存和管理数据的仓库。
数据库的本地访问
cmd进入数据库的bin目录,键入mysql -uroot -p输入密码访问。
数据库退出
\q
数据库的通用语法
注释:– 或#或/* */
SQL的分类
DDL:操作数据库和表
DML:操作数据库的数据
DQL:查询数据库的数据
DCL:授权
数据库的基本操作
操作数据库(DDL)
添加:create
- create database NAME; (创建名为NAME的数据库)
- create database if not exists NAME;(如果NAME不存在,则创建该数据库)
- create database NAME character set xxx;(创建名为NAME的数据库并指定字符编码为xxx)
删除:drop
- drop database NAME;(删除名为NAME的数据库)
- drop database if exists
NAME;(如果NAME存在。则删除该数据库)
修改:alter
- alter database NAME character set xxx;(将NAME的字符编码修改为xxx);
查询:show
- show databases;(查询所有数据库)
- show create database NAME;(查询NAME数据库);
使用:use
- use NAME;(使用NAME数据库)
查询 select
- select database(); (查询正在使用的数据库)
操作表(DML)
添加:create
create table NAME(LineName1 Data1,LineName2 Data2,……………………… ……………,LineNameN DataN); (创建名为NAME的表,表中有N列数据,每列数据对应数据类型)
复制表 | create table 复制 like 被复制; (复制一个NAME1的表,复制于NAME2)
删除:drop
- drop table 表名;(删除名为NAME的数据库)
- drop table if exists 表名;(如果NAME存在。则删除该数据库)
修改:alter
/* 修改 */
alter table 表名 rename to new表名;(将表名更改为new表名);
alter table 表名 character set xxx;(将NAME表的字符编码修改为xxx);
alter table 表名 change 旧列名 新列名 数据类型;(将表中的一列修改为新名字和新的数据类型);
alter table 表名 modify 列名 数据类型;(修改某列的数据类型);
/* 添加 */
alter table 表名 add 列名 数据类型;(在表中新增一列);
/* 删除 */
alter table 表名 drop 列名;(删除表中的某一列);
查询:show
类型 | 含义 |
---|---|
int | 整数 |
double(格式) | 小数 |
date | 日期,仅包含年月日 |
datetime | 日期,包含年月日时分秒 |
timestamp | 时间戳类型,包含年月日时分秒,如果不对其赋值或赋值为null则默认使用当前的系统时间来自动赋值 |
varchar(length) | 字符串 |
SQLyog的基本操作
DQL
添加:insert
- insert into 表名(Line1,Line2,Line3……,LineN)values(Values1,Values2,Values3……ValuesN); (向表中的指定列加入指定数据,如果不指定列,那么就默认添加所有列的数据)
/* 除数字类型,其他的所有类型都要用双引号或者单引号括起来,年月日按照“Y-M-D”的格式。
- insert into 表名(Line1,Line2,Line3……,LineN)values(Values1,Values2,Values3……ValuesN); (向表中的指定列加入指定数据,如果不指定列,那么就默认添加所有列的数据)
删除:delete/truncate
- delete form 表名 where 条件;(删除表中所有符合条件的数据)
- delete form 表名;(删除表中所有的数据,每有一条数据,就会执行一次delete)
- truncate form 表名;(删除表中所有的数据,并新建一个新的空表)
修改:update
- update 表名 set 列名=修改的数据 where 条件(将符合条件的数据的指定列的数据修改);
/* 如果不加条件,则会把所有的数据全部修改 */
- update 表名 set 列名=修改的数据 where 条件(将符合条件的数据的指定列的数据修改);
查询:select
- select *from 表名; (查询表中的信息)
SQLyog查询
- 查询结果集去掉重复:distinct
- select distinct 列名 from 表名;(从表中查询指定列,并去除重复数据)
-查询结果并计算: - select 列1,列2,列1+列2 from 表名; (从表中查询列1,列2的信息并相加)
- select 列1,列2,列1+列2 新表头名 from 表名;(从表中查询列1,列2的信息,并运算,运算的数据储存在新表头名的新列中)
/* null与任何数据运算的结果都是null,所有当出现null时,要判断,此时使用ifnull(列名,值),当指定列中出现null时,用指定的新值来替换它。 */
条件查询:where
逻辑运算符:> / < / != / = / or / and ……………
- select *from 表名 where 条件;
表示区间: between -- and --; 表示选择: age in(数1,数2,数3); 查询数据为(不为)null: where 数据 is (not) null;
- select *from 表名 where 条件;
模糊查询:like
- select * from 表名 where name like “马%”; (查询姓马的人);
占位符 _ 表示一个字符, 百分号 % 表示多个字符。
- select * from 表名 where name like “马%”; (查询姓马的人);
排序查询:order by
- select * from 表名 order by 列名 ASC/DESC ,列名 ASE/DESC;
默认排序方式是升序,要指定排序方式,在列名后加 ASC(升序)/DESC(降序),如果第一列数据相同,按第二列的数据继续排序。
- select * from 表名 order by 列名 ASC/DESC ,列名 ASE/DESC;
聚合函数:
- count:select count (列名) from 表名; (查询表中某列有多少个元素)
- max:select max (列名) from 表名; (查询表中某列的最大值)
- min:select min (列名) from 表名; (查询表中某列的最小值)
- sum:select sum (列名) from 表名; (查询表中某列的总和)
- avg:select avg (列名) from 表名; (查询表中某列的平均值)
分组查询:group by
- select 列名,聚合函数 from 表名 where 条件 group by 列; (查询表中的某列,运算,并根据列来分组)
having
- 对已分组的再判断
select 列名,聚合函数 from 表名 where 条件 group by 列 having 条件;(对某条件进行分组查询后对查询结果进行再判断,不符合having条件的结果不予显示) /* having与where的区别 */ 1.having后可以对聚合函数进行判断,而where不可以。 2.having在分组后进行再判断。where在分组前进行判断。
- select 列名,聚合函数 from 表名 where 条件 group by 列; (查询表中的某列,运算,并根据列来分组)
分页查询:limit
非空约束:not null
- 在创建表时添加非空约束
create table 表名( xxx yyy, ddd qqq not null );
- 创建表完成后再添加非空约束
alter table 表名 modify 列名 数据类型 not null;
- 删除某列的非空约束
alter table 表名 modify 列名 数据类型;
- 在创建表时添加非空约束
唯一约束:unique
- 在创建表时添加唯一约束
create table 表名( xxx yyy, ddd qqq unique );
- 创建表完成后再添加唯一约束
alter table 表名 modify 列名 数据类型 unique;
- 删除某列的唯一约束
alter table 表名 drop index 列名;
- 在创建表时添加唯一约束
主键约束:primary key (非空且唯一,一张表中只能有一个字段时主键,主键时表中记录的唯一标识)
- 在创建表时添加主键约束
create table 表名( xxx yyy, ddd qqq primary key );
- 创建表完成后再添加唯一约束
alter table 表名 modify 列名 数据类型 primary key;
- 删除某列的主键约束
alter table 表名 drop primary key;
- 在创建表时添加主键约束
自动增长:如果某一列是数值类型的,使用 auto_increment来完成数值的自动增长。
- 在创建表时添加自动增长
create table 表名( xxx yyy, ddd qqq primary key auto_increment );
- 创建表完成后再添加唯一约束
alter table 表名 modify 列名 数据类型 auto_increment;
- 删除某列的主键约束
alter table 表名 modify 列名 数据类型;
- 在创建表时添加自动增长
外键约束:foreign key
- 在创建表时添加外键
create table 表名( …… …… 外键列 constraint 外键名称 foreign key (外键列名称) references 主表名称 (主列表名称) );
- 创建表完成后再添加外键
alter table 表名 add constraint 外键名称 foreign key (外键列名称) reference 主表名称(主表列名称);
- 删除外键
alter table 表名 drop foreign key 外键名;
- 在创建表时添加外键
数据库的三大范式:
- 第一范式(1NF) :
每一列都是不可分割的原子数据项
- 第二范式(2NF) :
在1NF的基础上,非码性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖)
- 第三范式(3NF) :
在2NF的基础上,消除传递依赖。
- 几个概念:
- 函数依赖: A–>B ,如果通过AN属性(属性组)的值,可以确定唯一B属性性的值。 则称B依赖于A
例如:学号– >姓名。
(学号,课程名称) –> 分数 - 完全函数依赖: A–>B,如果A是一个属性组,则B的属性值得确定:要依赖于A性组中所有的属性值。
例如: (学号, 课程名称) –> 分数 - 部分函数依赖: A–>B,如果A是一 个的性组,则B属性值得确定只需要依赖于A性组中某- -些值即可。
例如: (学号,课程名称) – >姓名 - 传递函数依赖: A–>B, B – >C .如果通过A:属性(属性性组)的值,可以确定唯一B属性的值, 在通过B属性(属性组)的值可以确定唯一C属性的值,则称C传递函数依赖于A
例如:学号–>系名,系名–>系主任 - 码:如果在一张表中,-个性或后性组,被其他所有属性所完全依赖,则称这个属性(加性组)为该表的码
例如:该表中码为: (学号, 课程名称)* 主属性:码属性组中的所有属性 * 非主属性:除过码屁性组的属性
- 函数依赖: A–>B ,如果通过AN属性(属性组)的值,可以确定唯一B属性性的值。 则称B依赖于A
数据库的备份与还原
在命令行界面操作备份与还原
内连接查询
- 隐式内连接:SELECT * FROM class,student WHERE class.
class_id
=student.class
;select 某表的某个列 ……… from 表名 …… where 条件; 在查询时,两个子集的查询结果会呈现A*B个数个结果,这时需要使用where限定条件来消除无用数据。
- 显式内连接:select * from 表1 inner join 表2 on 条件;
SELECT class.`class_name`,student.`name` FROM class INNER JOIN student ON class.`class_id`=student.`class`;
- 显式内连接:select * from 表1 inner join 表2 on 条件;
- 隐式内连接:SELECT * FROM class,student WHERE class.
外连接查询
- 左外连接: select 查询的值 from 表1 left outer join 表2 on 条件;
查询的是左表所有数据和要查询的数据的交集
- 右外连接: select 查询的值 from 表1 right outer join 表2 on 条件;
查询的是右表所有数据和要查询的数据的交集 /* join左边的就是左边,右边的就是右表 */
- 左外连接: select 查询的值 from 表1 left outer join 表2 on 条件;
子查询(嵌套查询)
- 子查询作为条件:SELECT * FROM student WHERE score < ( SELECT AVG(score) FROM student);
- 子查询作为条件用IN来判断: SELECT * FROM student WHERE NAME IN (SELECT NAME FROM student WHERE NAME=’张三’ OR NAME = ‘李四’ );
- 子查询作为一张新的虚拟表来进行查询 SELECT * FROM student, ( SELECT AVG(score) FROM student) WHERE score < 80;
事务
事务开启: start transaction
事物提交: commit;
事务回滚: rollback;
事物的自动提交与手动提交
查询提交方式 select @@autocommit; 结果为1代表自动提交, 结果为0代表手动提交. 设置提交方式 set @@autocommit = 1; 设置为自动提交
事务的四大特征:
1.原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。 2.持久性:当事务提交或回滚后,数据库会持久化的保存数据。 3.隔离性:多个事务之间。相互独立。 4.一致性:事务操作前后,数据总量不变
事务的隔离级别(了解)
概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同-批数据,则会引发一 些问题,设置不同的隔离级别就可以解决这些问题。 存在问题: 1.脏读:一个事务,读取到另一个事务中没有提交的数据 2.不可重复读(虚读) :在同-个事务中,两次读取到的数据不-样。 3.幻读:一个事务操作(DML )数据表中所有记录,另一个事务添加了-条数据,则第一个事 务查询不到自己的修改。 隔离级别: 1. read uncommitted :读未提交 产生的问题:脏读、不可重复读、幻读 2. read committed :读已提交 产生的问题:不可重复读、幻读 3. repeatable read :可重复读(MySQL默认方式) 产生的问题:幻读 4. serializable :串行化 可以解决所有的问题 从上到下,执行效率越来越低. - 查询数据库的隔离级别 select @@tx_isolation; - 设置数据的隔离级别 set global tr ansaction isolation level;
DCL管理员
管理用户:
- 添加用户:
语法:CREATE USER‘用户名‘@’主机名’IDENTIFIED BY ‘密码’; - 删除用户:
语法:PROP USER ‘用户名‘@”主机名’; - 修改用户密码:
UPDATE USER SET PASSWORD = PASSWORD( ‘新密码’) WHERE USER = ‘用户名’;
SET PASSWORD FOR ‘用户名‘@’主机名’= PASSWORD( ‘新密码’);
- 添加用户:
在MySQL中忘记了root用户的密码。
1. cmd -- > net stop mysql 停止mysq1服务。
(需要管理员运行该cmd)
2. 使用无验证方式启动mysq1服务:
mysqld -- skip- grant -tables
3. 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功!
4. use mysql;
5. update user set password = password( ‘你的新密码') where user = ' root' ;
6. 关闭两个窗口
7. 打开任务管理器,手动结束mysqld. exe的进程
8. 启动mysq1服务
9. 使用新密码登录。
查询用户:
- 1.切换到mysq1数据库USE mysql;
- 2.查询user表
SELECT * FROM USER;
通配符: %表示可以在任意主机使用用户登录数据库
权限管理
查询权限:SHOW GRANTS FOR ‘用户名‘@’主机名’;
授予权限:grant权限列表 on 数据库名.表名 to ‘用户名‘@’主机名’;
给张三用户授予所有权限,在任意数据库任意表上:GRANT ALL ON *.* TO ' zhangsan '@' localhost';
撤销权限:revoke 权限列表 on 数据库名.表名 from ‘用户名‘@主机名’;