javaweb_MySQL ╰半橙微兮° 2021-12-20 11:31 187阅读 0赞 \# MySQL简介 > 待完成... \# MySQL的安装过程 > 待完成... \# MySQL的基本命令 > **1:启动和停止服务** > > 启动和停止方式一: > > 右键我的电脑 -> 管理 -> 服务和应用程序 -> 服务 -> 找到MySQL开头的 -> 右键选择启动或停止 > > ![1455397-20190326105832111-1232195658.png][] > > 启动和停止方式二: > > 以管理元权限启动命令提示符 -> 启动输入:net start mysql -> 停止输入:net stop mysql > > ![1455397-20190326110057528-1245888930.png][] > > **2:登录mysql** > > 打开命令提示符(管理员身份) -> 输入:mysql -u root -p -> 按下回车输入密码 > > ![1455397-20190326110403894-514468559.png][] > > 远程登录数据库:输入 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的基本操作如下 > > ![1455397-20190326115144376-1553677275.png][] > > **\# 数据库中的增删改查** > > -- 表中插入数据方式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 > > 连接查询的分类 > > ![1455397-20190326134006129-2075011863.png][] > > 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只能排队等待,这样保证了同一个时间点上只有一个事务操作数据库,该级别可以解决“幻读”的问题。但是这种级别一般很少使用,因为吞吐量太低,用户体验不好。 > > ![1455397-20190326145836579-1895156909.png][] \# 索引和视图 > \#\# 索引 > > 索引可以提高数据库的查询效率,表中的每一个字段都可以添加索引,表中的主键会自动添加索引 > > 在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 ... 转载于:https://www.cnblogs.com/Doaoao/p/10599357.html [1455397-20190326105832111-1232195658.png]: /images/20211220/0df19acafa614afaa08ae13a9a2184b5.png [1455397-20190326110057528-1245888930.png]: /images/20211220/47f8ee80e97d402fa6e7e786f90ddbb1.png [1455397-20190326110403894-514468559.png]: /images/20211220/ef68ba0591cc47889fdac73d4e081ed7.png [1455397-20190326115144376-1553677275.png]: /images/20211220/bdf707defc71422da414cb8bdc38fb57.png [1455397-20190326134006129-2075011863.png]: /images/20211220/0c40298fed2547868a3a0d14cfa2a74b.png [1455397-20190326145836579-1895156909.png]: /images/20211220/6b3312659ca940dd98bf9650cd872005.png
还没有评论,来说两句吧...