zoukankan      html  css  js  c++  java
  • 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

    ...

  • 相关阅读:
    SoftMax 回归(与Logistic 回归的联系与区别)
    OneNote转PDF
    数据库的模式分解相关算法规范步骤
    机器学习
    Java学习
    K-means 聚类
    Java学习
    [DBNETLIB][ConnectionOpen(connect()).]SQL Server 不存在或拒绝访问解决方方法
    sql语句技巧
    刚看到《SQL语法大全》、补全一下
  • 原文地址:https://www.cnblogs.com/Doaoao/p/10599357.html
Copyright © 2011-2022 走看看