javaweb_MySQL

# MySQL简介

待完成...

# MySQL的安装过程

待完成...

# MySQL的基本命令

1:启动和停止服务

启动和停止方式一:

右键我的电脑 -> 管理 -> 服务和应用程序 -> 服务 -> 找到MySQL开头的 -> 右键选择启动或停止

启动和停止方式二:

以管理元权限启动命令提示符 -> 启动输入:net start mysql -> 停止输入:net stop mysql

2:登录mysql

打开命令提示符(管理员身份) -> 输入:mysql -u root -p -> 按下回车输入密码

远程登录数据库:输入 mysql -h 远程服务器ip地址 -u root -p

例如:mysql -h 192.168.2.128 -u root -p

注:如果无法进行登录,情查看是否配置环境变量

3:忘记密码时的解决办法

1:停止mysql服务
2:打开命令提示符(管理员权限的),输入:mysqld –skip-grant-tables 按下回车键(不要关闭该窗口)
3:新打开一个命令提示符(管理员权限的),输入:mysql -u root -p 提示输入密码时,什么都不输入,直接按下回车键,进入mysql中
4:输入:use mysql
5:输入:update user set password=password(‘monkey’) WHERE User=’root’;其中的monkey是要设置的新密码
6:关闭两个命令提示符,在任务管理器中将mysqld.exe的进程杀掉,之后启动mysql服务登录即可

 

 # MySQL中常用的命令

# 操作数据库相关

# 创建数据库
mysql> create database doaoao2;
Query OK, 1 row affected (0.00 sec)

# 创建数据库时指定其编码
mysql> create database doaoao3 character set gbk;
Query OK, 1 row affected (0.01 sec)

# 查看数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| af_school          |
| demo1              |
| doaoao1            |
| doaoao2            |
| doaoao3            |
| emaildemo          |
| mydatabase         |
| mydatabase2        |
| mylogin            |
| mysql              |
| performance_schema |
| tantan             |
| test               |
| web2_pagequery     |
| web2_restful       |
| webdb              |
| xiaochouyushu      |
+--------------------+
18 rows in set (0.03 sec)

# 修改指定数据库信息
mysql> alter database doaoao3 character set utf8;
Query OK, 1 row affected (0.00 sec)

# 删除指定数据库
mysql> drop database doaoao3;
Query OK, 0 rows affected (0.02 sec)

# 查看当前所使用的数据库
mysql> select database();
+------------+
| database() |
+------------+
| NULL       |
+------------+
1 row in set (0.00 sec)

# 切换数据库
mysql> use doaoao2;
Database changed

# 查看数据库定义信息
mysql> show create database doaoao2;
+----------+--------------------------------------------------------------------+
| Database | Create Database                                                    |
+----------+--------------------------------------------------------------------+
| doaoao2  | CREATE DATABASE `doaoao2` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)

# 操作数据库表相关

# 创建表
mysql> create table employee(
    -> id int,
    -> name varchar(20),
    -> sex char(1),
    -> birthday date,
    -> job varchar(50),
    -> salary double(7,2));
Query OK, 0 rows affected (0.02 sec)

# 查看表
mysql> show tables;
+-----------------------+
| Tables_in_mydatabase2 |
+-----------------------+
| employee              |
+-----------------------+
1 row in set (0.00 sec)

mysql>

# 查看表中的结构
mysql> desc employee;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | YES  |     | NULL    |       |
| name     | varchar(20) | YES  |     | NULL    |       |
| sex      | char(1)     | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
| job      | varchar(50) | YES  |     | NULL    |       |
| salary   | double(7,2) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.01 sec)
# 为表中添加字段
mysql> alter table employee add address varchar(100);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc employee;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id       | int(11)      | YES  |     | NULL    |       |
| name     | varchar(20)  | YES  |     | NULL    |       |
| sex      | char(1)      | YES  |     | NULL    |       |
| birthday | date         | YES  |     | NULL    |       |
| job      | varchar(50)  | YES  |     | NULL    |       |
| salary   | double(7,2)  | YES  |     | NULL    |       |
| address  | varchar(100) | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+
7 rows in set (0.01 sec)

# 修改表中某个字段长度(将job的varchar(50)改成了varchar(30))
mysql> alter table employee modify job varchar(30);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc employee;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id       | int(11)      | YES  |     | NULL    |       |
| name     | varchar(20)  | YES  |     | NULL    |       |
| sex      | char(1)      | YES  |     | NULL    |       |
| birthday | date         | YES  |     | NULL    |       |
| job      | varchar(30)  | YES  |     | NULL    |       |
| salary   | double(7,2)  | YES  |     | NULL    |       |
| address  | varchar(100) | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+
7 rows in set (0.02 sec)

# 删除表中的某个字段
mysql> alter table employee drop address;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc employee;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | YES  |     | NULL    |       |
| name     | varchar(20) | YES  |     | NULL    |       |
| sex      | char(1)     | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
| job      | varchar(30) | YES  |     | NULL    |       |
| salary   | double(7,2) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.02 sec)

# 修改表的名称
mysql> rename table employee to user;
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+-----------------------+
| Tables_in_mydatabase2 |
+-----------------------+
| user                  |
+-----------------------+
1 row in set (0.00 sec)

# 修改表的字符编码
mysql> alter table user character set gbk;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

# 查看表的细节
mysql> show create table user;
+-------+-----------------------------------------------------------------------------------+
| Table | Create Table                                                                                     |
+-------+-----------------------------------------------------------------------------------+
| user  | CREATE TABLE `user` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `sex` char(1) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `job` varchar(30) DEFAULT NULL,
  `salary` double(7,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk |    <<<-------------------看!字符编码
+-------+-----------------------------------------------------------------------------------+
1 row in set (0.00 sec)

# 修改表中字段
mysql> alter table user change name username varchar(20);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc user;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | YES  |     | NULL    |       |
| username | varchar(20) | YES  |     | NULL    |       |
| sex      | char(1)     | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
| job      | varchar(30) | YES  |     | NULL    |       |
| salary   | double(7,2) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.01 sec)

# 删除表
mysql> drop table user;
Query OK, 0 rows affected (0.01 sec)
     再次查看表 表已经不存在了
mysql> desc user;
ERROR 1146 (42S02): Table 'mydatabase2.user' doesn't exist

 

 # MySQL中的注释方式

-- MySql注释方式1
/*MySql注释方式2*/

 

...

 

 # DML

# 对数据库进行增,删,改,查的操作

注:MySQL Workbench的基本操作如下

# 数据库中的增删改查

-- 表中插入数据方式1
insert into test_test_emp (id,name,sex,birthday,salary) values(001,'zhangsan','male','1997-11-14',10000);
insert into test_test_emp values(002,"lisi","famale","1995-10-10",20000);


-- 表中插入数据方式2
insert into test_test_emp (id,name,sex,birthday,salary) values
(1,'laoda','male','1991-05-15',100000),
(1,'laoer','male','1992-05-15',110000),
(1,'laosan','male','1993-05-15',120000),
(1,'laosi','male','1994-05-15',130000);

-- 当无法进行修改数据库数据时
-- 这是因为MySql运行在safe-updates模式下,该模式会导致非主键条件下无法执行update或者delete命令,
-- 执行命令SET SQL_SAFE_UPDATES = 0;修改数据库模式
-- 修改表中数据(下方的写法会将数据全部修改,因为没有加入条件) update test_test_emp set salary=3000; -- 修改表中数据(限定修改的数据) update test_test_emp set salary=5000 where name="lisi"; -- 修改多个字段,使用","将字段隔开(修改性别,工资) update test_test_emp set sex="femal",salary=4000 where name='laoda'; -- 删除(删除一条数据) delete from test_test_emp where name='laosi'; -- 将表中数据全部删除 delete from test_test_emp; -- 只删除数据,不删除表,可进行恢复 -- 将表中数据全部删除 truncate table test_test_emp; -- 将数据删除,也将表删除,无法进行恢复

 

# 数据库中的简单查询

-- 查询表test_emp中的name字段
select name from test_emp;

-- 查询表test_emp中的name和num字段
select name,num from test_emp;

-- 查询表中所有字段
select * from test_emp;

-- 查询员工编号,姓名,年薪(因为只有月薪,所以将其*12,后利用as进行重命名)
select num,name,salary*12 as yearsalary from test_emp;
select num,name,salary*12 yearsalary from test_emp;        -- 可不加 as
select num,name,salary*12 as '年薪' from test_emp;

-- 查询薪水是5000的员工
select name,num from test_emp where salary = 5000;

-- 查询job是manager的员工
select name,num from test_emp where job = 'mabeger';

-- 查询薪水不等于5000的员工
select name,num from test_emp where salary != 5000;        -- 建议使用这个
select name,num from test_emp where salary <> 5000;        -- <>符号也表示不等于

-- 查询薪水为1500到5000之间的员工
select name,num from test_emp where salary>1500 and saalry<5000;
select name,num from test_emp where salary between 1500 and 5000;

-- 查询津贴为空的员工
select name,num,comm from test_emp where comm is null;

-- 查询工作职位为manager并且薪水大于3000的员工
select name,num from test_emp where job = 'mabeger' and salary>3000;

-- 查询工作职位为manager或salesman的员工
select name,num from test_emp where job = 'mabeger' or job='salesman';
select name,num from test_emp where job in ('mabeger','salesman');

-- 查询工作职位不是manager或salesman的员工
select name,num from test_emp where job not in ('mabeger','salesman');

-- and和or的优先级,and的优先级大于or
-- 查询薪水大于5000,且部门编号为20或30的员工
select name,num from test_emp where salary > 5000 and (deptnum=20 or deptnum=30);

-- 查询姓名以M开头的员工
select name from test_emp where name like "M%";

-- 查询姓名以M结尾的员工
select name from test_emp where name like "%M";

-- 查询姓名中含有M的员工
select name from test_emp where name like "%M%";

-- 查询姓名中的第二位为M的员工
select name from test_emp where name like "_M%";        -- 一个"_"表示一个字母占的位符

 

 # 数据库中的排序操作

-- order by默认为升序排序

-- 按薪水从小到大排序
select name,salary from test_emp order by salary;

-- 按薪水从小到大排序(手动指定)
select name,salary from test_emp order by salary asc;

-- 按薪水从大到小排序(手动指定)
select name,salary from test_emp order by salary desc;

-- 工作为manager的员工,薪水从小到大排序
select name,salary from test_emp where job='manager' order by salary;

-- 按照jon和薪水进行排序(先依据job进行排序,再依据salary进行排序)
select name,salary from test_emp order by job,salary;

 

# 数据库中的处理函数

-- 查询员工姓名,并将姓名转成小写
select lower(name) from test_emp;

-- 查询员工姓名,并将姓名转成大写
select upper(name) from test_emp;

-- substr()截取字符串(下标从1开始)
-- 查询并显示员工姓名的第二个字母
select substr(name,2,1) from test_emp;    -- 表示从下标2开始截取1个

-- 查询员工姓名中第二个字母为A的所有员工
select name from test_emp where substr(name,2,1)='A';

-- 取得员工姓名长度
select name,length(name) as namelength from test_emp;

-- ifnull(x,y)将字段值为null的字段替换为指定字符
-- 查询员工姓名及补助,将补助为null的字段设置为null
select name,ifnull(comm) as comm from test_emp;

-- 在数学运算时,根null做数学运算结果都为Null
-- 查询员工的总薪水
select name,(salart + ifnull(comm)) as totoSal from test_emp;

-- 如果没有补助的员工,每月补助100求员工的年薪
select name,(salary + ifnull(comm,100))*12 from test_emp;

-- 匹配工作岗位,当工作为manager时,薪水上调10%,当工作为salesman时,薪水上调50%
select name,salary,job,
(case job
    when 'manager' then salary*1.1
    when 'selesman' then salary*1.5
    else salary 
    end) as newSalary
from test_emp;

-- trin()去除首尾空格
select name,job from test_emp where job=trim(' manager        ');

-- 查看员工薪水并保留一位小数        round(数字,保留小数位数)
select round(salary,1) as sal from test_emp;

-- rand()生成随机数
select rand();

-- 生成多个随机数 
select rand(),salary from test_emp;

-- 生成0-100之间的随机数
select round(rand()*100),salary from test_emp;

-- str_to_daate()    字符串转日期格式·
-- 该函数接收两个参数,str_to_date(‘日期字符串’,’日期格式’)。
-- 其中日期格式如下:
-- %Y 代表四位的年份
-- %y 代表两位的年份
-- %m 代表月,格式(01 … 12)
-- %c 代表月,格式(1 … 12)
-- %d 代表日
-- %H 代表24小时制
-- %h 代表12小时制
-- %i 代表分种,格式(00 … 59)
-- %S或%s 代表秒 , 格式(00..59)

-- 查询1981-12-03入职的员工
select ename,hiredate from test_emp where hiredate = '1981-12-03';

-- 使用str_to_date()函数查询02-20-1981年入职的员工:
select ename,hiredate from test_emp where hiredate = str_to_date('02-20-1981','%m-%d-%Y'); 

-- date_format()格式化日期 该函数接收两个参数,date_format(日期类型数据,’日期格式’)
-- 查询员工的入职日期,以’10-12-1980’的格式显示到窗口中;
select ename,date_format(hiredate,'%m-%d-%Y') hiredate from test_emp ;

 

# 聚合函数 

-- 取得薪水的合计
select sum(sal) as salary from test_emp;

-- 取得薪水总和(薪水+津贴)
select sum(sal + ifnull(comm)) as totasal from test_emp;

-- sum()在处理时 会默认不处理null的值
select sum(comm) as totasal from test_emp;

-- 取得平均薪水
select avg(sal) as avgSal from test_emp;

-- 取得最高的薪水
select max(sal) as maxSal from test_emp;

-- 取得最低的薪水
select min(sal) as minSal from test_emp;

-- 取得最晚入职的日期
select max(hiredate) as lastHiredate from test_emp;

-- 取得所有员工数  count()取得数据总数
select count(*) from test_emp;

-- 取得补助不为空得员工数 聚合函数会忽略空值
select count(comm) from test_emp;

-- 统计没有补助得员工数
select count(*) from test_emp where comm is null;

-- 组合聚合函数
-- sum、avg、max、min、count这些函数可以一起使用:
select count(*),sum(sal),avg(sal),max(sal),min(sal) from test_emp;

-- distinct 去除重复得记录
-- 用法distinct 字段,  distinct 字段1 字段2
select distinct job from test_emp;

-- 查询公司工作岗位得数量
select count(distinct job) from test_emp;

-- 去除部门编号和工作岗位重复的记录
select distinct job,deptno from test_emp;

-- 利用group by 对数据进行分组
-- 找出每个职位最高薪水
select max(salary) as maxsalary from test_emp group by job;

-- 计算每个工作岗位的最高薪水,并且按照由低到高进行排序:
select job,max(sal) as maxsal from test_emp group by job order by maxsal;

-- 计算每个部门的平均薪水:
select deptno,avg(sal) as avgsal from test_emp group by deptno;

-- 计算出不同部门不同岗位的最高薪水:
select deptno,job,max(sal) as maxsal from test_emp group by deptno,job;

-- 计算除了manager之外的每个工作岗位的最高薪水:
select job,max(sal) as maxsal from test_emp where job <> 'MANAGER' group by job;

-- 找出每个工作岗位的平均薪水,要求显示平均薪水大于2000的:
-- select job,avg(sal) as avgsal from test_emp where avg(sal)>2000 group by job;  错误写法,where后不能写聚合函数
select avg(sal) from test_emp group by job having avg(sal)>2000;


-- where和having区别
-- where和having都是为了完成数据的过滤,它们后面都是添加条件;
-- where是在 group by之前完成过滤;
-- having是在group by之后完成过滤;


-- 一个的SQL语句如下:
        select 
            xxxx
        from
            xxxx
        where 
            xxxx
        group by
            xxxx
        having
            xxxx
        order by
            xxxx
以上关键字的顺序不能变,严格遵守
以上语句的执行顺序:

from      将硬盘上的表文件加载到内存
where      将符合条件的数据筛选出来。生成一张新的临时表
group by     根据列中的数据种类,将当前临时表划分成若干个新的临时表
having     可以过滤掉group by生成的不符合条件的临时表
select     对当前临时表进行整列读取
order by   对select生成的临时表,进行重新排序,生成新的临时表
limit     对最终生成的临时表的数据行,进行截取

# 连接查询

在开发的过程中,往往将数据存储在多张表中,这些存储数据的表之间存在着关系,在对表中数据进行检索时,往往需要多张表联合起来检索,这样的多表联合查询称为链接查询

笛卡尔积:在对多个表进行连接查询时,没有指定查询的条件,这种查询的结果是多表数量的乘积

第一种:笛卡尔积

select e.ename,d.dname from dept d,test_emp e;    -- 会将表中的数据做一个乘法14 * 4 = 56条数据

第二种:SQL92语法(加入一个限定条件)

select e.ename,d.dname from dept d,test_emp e where d.deptno=e.deptno;

 第三种:SQL99语法(test_emp e join dept d:两个表做连接查询,条件是e.deptno = d.deptno)

select e.ename,d,dname from test_emp e join dept d on e.deptno=d.deptno

 

 连接查询的分类

 

1:内连接

指的是多张表的交集,如上图的C所表示的部分

select e.ename,d.dname from test_emp e join dept d on e.deptno = d.deptno;

2:左外连接(outer可省略)

表示图中A的部分加上C的部分

select e.ename,d.dname from dept d left outer join test_emp e on e.deptno = d.deptno;

3:右外连接(outer可省略)

表示途中B的部分加上C的部分

select e.ename,d.dname from test_emp e right  outer  join dept d on e.deptno = d.deptno;

4:全外连接

MySQL中不支持

 

 # 子查询

定义:在select语句中嵌套select语句

select可以出现在from,select,where语句后面

将select查询出来的语句看作是一张新的表

-- 找出薪水比公司平均薪水高的员工,要求显示员工名和薪水
select ename,sal from test_emp where sal > (select avg(sal) from test_emp);

# 使用union关键字合并结果(注意:两个被合并的字段个数必须一致)

select ename,job from test_emp where job='manager'
union
select ename,job from test_emp where job='salesman';

# Limit关键字(分页功能) MySql特有的
用法limit起始下标m,长度n
下标默认从0开始

-- 取前五个员工的信息
select * from test_emp limit 0,5;

-- 找出工资排在前五的员工
select * from test_emp order by sal desc limit 0,5;

-- 找出工资排在[3-9]的员工
select * from test_emp order by sal desc limit 2,7;

 

 ... 

 # MySQL存储引擎

存储引擎简介:

MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。

存储引擎分类:

MyISAM        \
有较高的插入,查询速度,但不支持事务
InnoDB
5.5版本后Mysql的默认数据库,事务型数据库的首选引擎,支持ACID事务,支持行级锁定
BDB
源自Berkeley DB,事务型数据库的另一种选择,支持COMMIT和ROLLBACK等其他事务特性
Memory
所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失
Merge
将一定数量的MyISAM表联合而成一个整体,在超大规模数据存储时很有用
Archive
非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive拥有高效的插入速度,但其对查询的支持相对较差
Federated
将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用
Cluster
/NDB
高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用
CSV
逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个.CSV文件。这是一种普通文本文件,每个数据行占用一个文本行
CSV存储引擎不支持索引。
BlackHole
黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继

 # 存储引擎的一些操作

-- 创建表时指定存储引擎
mysql> create table table_test(
    -> no int
    -> )engine=MyISAM;
Query OK, 0 rows affected (0.01 sec)

# 查看当前表使用的存储引擎
mysql> show create table table_test;

 

# 事务

事务的英文是transaction
事务可以保证多个操作原子性,对于数据库来说
事务可以保证批量的DML要么全成功,要么全失败

 

事务具有四个特征ACID

1:原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

2:一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。

3:隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

4:持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。

# 事务的提交和回滚

-- MySQL事务的提交和回滚
    MySQL中默认情况下,事务是自动提交的,当执行一条DML语句时,就开启并且自动提交了事务。
  可以通过下面的语句查看事务是否是自动提交的: show variables
like '%commit%'; -- 如果想要关闭MySQL事务的自动提交,可以使用下面语句手动开启事务: start transaction;

# 事务的并发问题

1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

 # 事务的隔离级别

1:read uncommitted 读未提交
事务A和事务B,事务A未提交的数据,事务B可以读取,这里读取到的数据叫做“脏数据”,该级别最低,一般只是理论上存在,数据库的默认隔离级别都高于该级别。

2:read committed 读已提交

事务A和事务B,事务A提交的数据,事务B才可读取到,换句话说:对方事务提交之后的数据,当前事务才可读取到,可以避免读取“脏数据”,但是改级别会有“不可重复读”的问题,事务B读取一条数据,当事务A修改这条数据并提交后,事务B再读取这条数据时,数据发生了变化,即事务B每次读取的数据有可能不一致,这种情况叫做“不可重复读”。

3:repeatable read 重复读

MySQL默认的隔离级别是重复读,该级别可以达到“重复读”的效果,但是会有“幻读”的问题,即事务A读取数据,此时事务B修改了这条数据,但是事务A读取的还是之前的旧数据的内容,这样就出现了幻读。

4:serializable 串行化
事务A和事务B,事务A在操作数据库表中数据的时候,事务B只能排队等待,这样保证了同一个时间点上只有一个事务操作数据库,该级别可以解决“幻读”的问题。但是这种级别一般很少使用,因为吞吐量太低,用户体验不好。

 

# 索引和视图

## 索引

索引可以提高数据库的查询效率,表中的每一个字段都可以添加索引,表中的主键会自动添加索引

在MySQL数据库中,数据库表的检索通常有两种方式

1:全表扫描

当数据库中有10000行的数据是,要查找的数据为name="doaoao",如果要想拿到该条数据

select * from test_emp where name="doaoao"

在没有建立索引时,mysql就要扫描10000条数据找该数据,效率低

2:通过索引检索

-- 创建索引
语法:create index 索引名 on 表名(列名);
示例:create index dept_dname_index on dept(dname);

-- 查看索引
语法:show index from 表名;
示例:show index from dept;

-- 删除索引
语法:drop index 索引名 on 表名;
示例:drop index dept_dname_index on dept;

 

## 视图

视图
视图就是一个查询结果,视图的作用就是可以隐藏表的实现细节

-- 创建视图
create view 视图名层 as 查询语句

-- 创建视图示例,将emp表中的empno、ename、sal作为视图展示: create view e_info as select empno,ename,sal from emp;
-- 使用视图 select * from e_info -- 修改视图 alter view 视图名称 as 查询语句

-- 示例 alter view e_info as select ename,job from emp; -- 删除视图 drop view if exists 视图名称;

-- 示例 drop view exists e_info;

# 数据库的导入和导出

# 导出
mysql> mysqldump -u root -p doaoao > d:/mysql.sql

# 导入
mysql> source d:/mysql.sql

 

...

posted @ 2019-04-08 13:57  一头牛这么多人放  阅读(660)  评论(0编辑  收藏  举报