MySQL

【重学 MySQL】二、MySQL 介绍 MySQL 是一种流行的开源关系型数据库管理系统(RDBMS),它使用结构化查询语言(SQL)来管理或操作数据库。MySQL 由瑞典的 MySQL AB 公司开发,并在 2008 年被 Sun Microsystems 收购,随后 Sun Microsystems 又被 Oracle Corporation 收购。尽管经历了多次所有权变更,MySQL 仍然保持着其开源和免费的特性,并且被广泛用于各种应用程序中,包括 Web 应用、数据仓库、电子商务网站等。 阅读详情

SQL相关概述

DB DBM SQL的关系

  • DB (DataBase):数据库,数据库实际上在硬盘上以文件的形式存在。

  • DBMS(DataBase Management System):数据库管理系统。常见的有:MySQL Oracle DB2 Sybase SqlServer…

  • SQL: 结构化查询语言,是一门标准通用的语言。标准的SQL适合于所有的数据库产品。SQL属于高级语言。SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行SQL。(SQL语句的编译由DBMS完成)

  • 联系:DBMS负责执行SQL语句,通过执行SQL语句来操作DB当中的数据。DBMS -(执行)-> SQL -(操作)-> DB

表的理解

  • 表(table):数据库的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强。

  • 一个表包括行和列。
    行:被称为数据/记录(data)
    列:被称为字段(column)

  • 每个字段应该包括:字段名,数据类型,相关的约束这些属性。

SQL语句的分类

  • DQL(数据查询语言): 查询语句,凡是select语句都是DQL。

  • DML(数据操作语言):insert delete update,对表当中的数据进行增删改。

  • DDL(数据定义语言):create drop alter,对表结构的增删改。

  • TCL(事务控制语言):commit提交事务,rollback回滚事务。(TCL中的T是Transaction)

  • DCL(数据控制语言): grant授权、revoke撤销权限等。

SQL脚本的理解

  • SQL脚本:当一个文件的扩展名是.sql,并且该文件中编写了大量的sql语句。

  • sql脚本中的数据量太大的时候,无法打开,请使用source命令完成初始化。(注意:直接使用source命令可以执行sql脚本,直接把文件拖到source命令后面)

SQL常用命令

  • select database();
    

    查看当前使用的是哪个数据库。

  • select version(); 
    

    查看mysql的版本号。

  • 创建数据库

    create database 数据库名

  • 选择数据库

    use 数据库名

  • 删除数据库

    drop database 数据库名

  • \c 命令,结束一条语句。

  • \q QUIT EXIT ctrl + c(强制退出),退出mysql。

DQL(数据查询语言)

简单查询

  1. 语法格式:select 字段名1,字段名2,字段名3,… from 表名;
  2. 给查询结果的列重命名:select ename,sal * 12 as yearsal from emp; select ename,sal * 12 as ‘年薪’ from emp;
    • 字段可以参与数学运算。
    • 标准sql语句中要求字符串使用单引号括起来。虽然mysql支持双引号,尽量别用。
    • as关键字可以忽略,用空格代替。
  3. 查询所有字段:select * from 表名; (实际开发中不建议使用*,效率较低)
  4. 提示
    • 任何一条sql语句以“;”结尾。
    • sql语句不区分大小写。

条件查询

语法格式:select
字段,字段…
from
表名
where
条件;

执行顺序:先from,然后where,最后select。

<>和!=

between…and…

等同于>=…and<=… 。between…and…在使用的时候必须左小右大,是闭区间,除了可以使用在数字方面之外,还可以使用在字符串方面(左闭右开)。

is null和is not null

在数据库当中NULL不是一个值,代表什么也没有,为空。空不是一个值,不能用等号衡量。

and or

and的优先级要高于or。当运算符的优先级不确定的时候加小括号。

in

等同于or,后面的值不是区间,是具体的值。

not in

不在这几个值当中。

模糊查询(like)

在模糊查询当中,必须掌握两个特殊的符号,一个是%,一个是_。

%代表任意多个字符,_代表任意1个字符。

举例

  • select ename from emp where ename like ‘%O%’; 找出名字当中含有O的。
  • select ename from emp where ename like ‘_A%’; 找出名字中第二个字母是A的。
  • select name from t_user where name like ‘%_%’; 找出名字中有下划线的。(\转义字符,使其没有特殊含义)
  • select ename from emp where ename like ‘%T’; 找出名字中最后一个字母是T的。

数据排序

asc表示升序,desc表示降序。(默认是升序)

举例

  • 按照工资的降序排列,当工资相同的时候再按照名字的升序排列。

    select ename,sal from emp order by sal desc , ename asc;

    注意:越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的时候,才会启用后面的字段。

  • select 3
    字段

    from 1
    表名

    where 2
    条件

    order by 4
    …

    order by是最后执行的。

分组函数(多行处理函数)

  • count 计数
    sum 求和
    avg 平均值
    max 最大值
    min 最小值
    记住:所有的分组函数都是对“某一组”数据进行操作的。

    多行处理函数的特点:输入多行,最终输出的结果是1行。

  • 单行处理函数:输入一行,输出一行。

    ifnull(可能为NULL的数据,被当做什么处理) : 属于单行处理函数。

    select ename,ifnull(comm,0) as comm from emp;

    重点:所有数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL。

  • ***分组函数自动忽略NULL。***

    select sum(comm) from emp where comm is not null; // 不需要额外添加这个过滤条件。sum函数自动忽略NULL。

  • 分组函数也能组合起来用。

    select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;

  • count(*)和count(具体的某个字段)的区别

    count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)
    count(comm): 表示统计comm字段中不为NULL的数据总数量。

  • 思考题:找出工资高于平均工资的员工。

    select ename,sal from emp where sal > avg(sal);

    无效的使用分组函数

    原因:SQL语句当中有一个语法规则,分组函数不可中直接使用在where子句中。

    group by是在where后面执行。

    完整的DQL语句(顺序不能乱)

    select 5
    …

    from 1
    …
    where 2
    …

    group by 3
    …
    having 4
    …
    order by 6
    …

    子查询: select ename, sal from emp where sal > (select avg(sal) from emp);

分组查询

group by

  1. 定义:按照某个字段或者某些字段进行分组。

  2. 案例:找出每个工作岗位的最高薪资。

    • select max(sal),job from emp group by job;

      注意:分组函数一般都会和group by联合使用,这也是它被称为分组函数的原因。并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。
      当一条sql语句没有group by的话,整张表的数据会自成一组。

    • select ename,max(sal),job from emp group by job;

      以上在mysql当中,查询结果是有的,但是结果没有意义,在Oracle数据库当中会报语法错误。Oracle的语法规则比MySQL语法规则严谨。

      记住一个规则:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段。

  3. 多个字段联合起来分组(看成一个字段)

    案例:找出每个部门不同工作岗位的最高薪资。

    select deptno,job,max(sal) from emp group by deptno, job;

having

  1. 定义:对分组之后的数据进行再次过滤。

  2. where过滤和having过滤。

    • 案例:找出每个部门的最高薪资,要求显示薪资大于2900的数据。

      select max(sal), deptno from emp group by deptno having max(sal) > 2900; (效率低,因为是分完组后找出最大值后再过滤出大于2900的数据)

      select max(sal), deptno from emp where sal > 2900 group by deptno; (效率高,因为是先过滤出大于2900的sal,再开始分组找最大值)能用where过滤就用where。

    • 找出每个部门的平均薪资,要求显示薪资大于2000的数据。

      select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000;

      不能使用where过滤:avg是在分组过后进行的。使用where过滤会使结果出现偏差。(凡是对分组过后的数据进行的操作,都不能使用where来过滤)

查询结果集的去重

  • distinct关键字去除重复记录。

    eg. select distinct job from emp;

    distinct只能出现在所有字段的最前面。

  • select distinct deptno, job from emp;

    后面俩字段联合起来去重。

连接查询

概述

在实际开发中,大部分的情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的结果。

在实际开发中,一般一个业务都会对应多张表。(信息存储到一张表中,数据会存在大量的重复,导致数据的冗余)

分类

  1. 年代划分

    SQL92

    SQL99(比较新的语法)

  2. 表的连接方式划分

    内连接

    • 等值连接
    • 非等值连接
    • 自连接

    外连接

    • 左外连接(左连接)
    • 右外连接(右连接)

    全连接(很少用)

笛卡尔乘积现象

  1. 定义:当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。

  2. 举例:找出每一个员工的部门名称,要求显示员工名和部门名。

    select e.ename, d.dname from emp e, dept d;

    表的别名的好处:①执行效率高。 ②可读性好。

  3. 避免笛卡尔积现象(加条件进行过滤)

    避免了笛卡尔积现象,不会减少记录的匹配次数,只不过显示的是有效记录。

内连接

等值连接
  • 最大特点:条件是等量关系。

  • 举例:找出每一个员工的部门名称,要求显示员工名和部门名。

    • select e.ename, d.dname from emp e, dept d where e.deptno = d.deptno;(SQL92 过时了)

    • select e.ename, d.dname from emp e inner join dept d on e.deptno = d.deptno;(SQL99 常用的)

      inner可以省略的,带着inner可读性要好一些。

      语法:

      …
      A
      join
      B
      on
      连接条件
      where
      …
      SQL99语法结构更清晰一些:表的连接条件和后来的where条件分离了。

非等值连接
  • 最大特点:条件是非等量关系。
  • 举例: select e.ename, e.sal, s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
自连接
  • 最大特点:一张表看作两张表,自己连接自己。

  • 案例:找出每个员工的上级领导,要求显示员工名和对应的领导名。

    员工的领导编号 = 领导的员工编号

    select a.ename as ‘员工名’,b.ename as ‘领导名’ from emp a inner join emp b on a.mgr = b.empno;

外连接

  • 含义 与内连接的区别

    内连接:
    假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。
    AB两张表没有主副之分,两张表是平等的。

    外连接:
    假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中
    的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。

  • 分类

    左外连接(左连接):表示左边的这张表是主表。
    右外连接(右连接):表示右边的这张表是主表。

    左连接有右连接的写法,右连接也会有对应的左连接的写法。

  • 举例:找出每个员工的上级领导?(所有员工必须全部查询出来)

select a.ename ‘员工’,b.ename ‘领导’ from emp a left (outer) join emp b on a.mgr = b.empno; (左连接)

select a.ename ‘员工’,b.ename ‘领导’ from emp b right (outer) join emp a on a.mgr = b.empno; (右连接)

  • 最主要的特点:主表的数据无条件的全部查询出来。

  • 举例:找出哪个部门没有员工。

    select d.* from emp e right join dept d on e.deptno = d.deptno where e.empno is null;

多表查询

…
A
join
B
join
C
on
…

表示:A表和B表先进行表连接,连接之后A表继续和C表进行连接。

  • 举例:找出每一个员工的部门名称以及工资等级。

    select e.ename,d.dname,s.grade from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and s.hisal;

  • 举例:找出每一个员工的部门名称,工资等级,上级领导。

    select e.ename ‘员工’,d.dname,s.grade,el.ename ‘领导’ from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and s.hisal left join emp el on e.mgr = el.empno;

子查询

  • 定义:select语句当中嵌套select语句,被嵌套的select语句是子查询。

  • select
    …(select).
    from
    …(select).
    where
    …(select).

where后面嵌套子查询

举例:找出高于平均薪资的员工信息。

select * from emp where sal > (select avg(sal) from emp);

from后面嵌套子查询

  • 举例:找出每个部门平均薪水的等级。

    • 第一步:找出每个部门平均薪水的等级。

      select deptno,avg(sal) as avgsal from emp group by deptno;

    • 第二步:将以上的查询结果当做临时表t,让t表和salgrade s表连接。

      条件是:t.avgsal between s.losal and s.hisal

    select 
    t.*,s.grade
     from
    (select deptno,avg(sal) as avgsal from emp group by deptno) t
     join
    salgrade s
    on
    t.avgsal between s.losal and s.hisal;
    
  • 举例:找出每个部门平均的薪水等级。

    • 第一步:找出每个员工的薪水等级。
      select e.ename,e.sal,e.deptno,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
    • 第二步:基于以上结果,继续按照deptno分组,求grade平均值。
      select
      e.deptno,avg(s.grade)
      from
      emp e
      join
      salgrade s
      on
      e.sal between s.losal and s.hisal
      group by
      e.deptno;

select后面嵌套子查询

举例:找出每个员工所在的部门名称,要求显示员工名和部门名。

  • select
    e.ename,d.dname
    from
    emp e
    join
    dept d
    on
    e.deptno = d.deptno;
  • select
    e.ename,(select d.dname from dept d where e.deptno = d.deptno) as dname
    from
    emp e;

union

  • 可以将查询结果集相加。
  • 举例:找出工作岗位是SALESMAN和MANAGER的员工。
    • select ename,job from emp where job = ‘MANAGER’ or job = ‘SALESMAN’;
    • select ename,job from emp where job in(‘MANAGER’,‘SALESMAN’);
    • select ename,job from emp where job = ‘MANAGER’
      union
      select ename,job from emp where job = ‘SALESMAN’;
  • 两张不相干的表中的数据拼接在一起显示。
  • 连接起来的表的列数要一样。

limit及通用分页SQL

  • 重中之重,分页查询全靠它。

  • mysql特有的,其他数据库没有,不通用。

  • 作用:取结果集中的部分数据。

  • 语法机制

    limit startIndex, length
    startIndex表示起始位置。从0开始,0表示第一条数据。
    length表示取几个。

  • 举例:取出工资前5名的员工(思路:降序取前5个)

    • 降序

      select ename,sal from emp order by sal desc;

    • 取前5个

      select ename,sal from emp order by sal desc limit 0, 5;
      select ename,sal from emp order by sal desc limit 5;

  • limit是sql语句最后执行的一个环节

    select		         5
    		...
    	from			1
    		...		
    	where			2
    		...	
    	group by		3
    		...
    	having		    4
    		...
    	order by		6
    		...
    	limit			7
    		...;
    
  • 举例:找出工资排名在第4到第9名的员工。

    select ename,sal from emp order by sal desc limit 3,6;

  • 通用的标准分页sql

    每页显示3条记录:
    第1页:0, 3
    第2页:3, 3
    第3页:6, 3
    第4页:9, 3

    每页显示pageSize条记录:
    第pageNo页:(pageNo - 1) * pageSize, pageSize

    pageSize:每页显示多少条记录
    pageNo:显示第几页

DML DDL

增删改查有一个术语:CRUD操作
Create(增) Retrieve(检索) Update(修改) Delete(删除)

create

基本内容

  • 语法格式

    create table 表名(
    字段名1 数据类型,
    字段名2 数据类型,
    字段名3 数据类型,
    …
    );

  • MySQL当中字段的常见数据类型

    • int 整数型(java中的int)
    • bigint 长整型(java中的long)
    • float 浮点型(java中的float double)
    • float 浮点型(java中的float double)
    • varchar 可变长字符串(StringBuffer/StringBuilder)
    • date 日期类型 (对应Java中的java.sql.Date类型)
    • BLOB 二进制大对象(存储图片、视频等流媒体信息) Binary Large OBject (对应java中的Object)
    • CLOB 字符大对象(存储较大文本,比如,可以存储4G的字符串。) Character Large OBject(对应java中的Object)
  • char和varchar怎么选择?

    • char:在实际的开发中,当某个字段中的数据长度不发生改变的时候,是定长的。例如:性别、生日等
    • varchar:当一个字段的数据长度不确定。例如:简介、姓名等。
  • 表名在数据库当中一般建议以:t_或者tbl_开始。

约束(Constraint)

定义:在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的
合法性、有效性、完整性。

非空约束(not null)
  • 约束的字段不能为NULL。
  • 只有列级约束,没有表级约束。
唯一约束(unique)
  • 约束的字段不能重复。

  • 唯一约束修饰的字段具有唯一性,不能重复,但可以为NULL。

  • 表级约束:多个字段联合起来添加1个约束unique。

    unique( , , )

  • 列级约束:直接在列后面加。

主键约束(primary key)(简称PK)
  • 概念:约束的字段既不能为NULL,也不能重复。

  • 相关术语

    • 主键约束:primary key
    • 主键字段:某字段添加primary key之后,某叫做主键字段
    • 主键值:某字段中的每一个值都是主键值
  • 作用

    • 这行记录在这张表当中的唯一标识。(就像一个人的身份证号码一样)
    • 表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键。
  • 分类

    根据主键字段的字段数量来划分

    • 单一主键(推荐的,常用的)
    • 复合主键:多个字段联合起来添加一个主键约束。(复合主键不建议使用,因为复合主键违背三范式)

    根据主键性质来划分

    • 自然主键:主键值最好就是一个和业务没有任何关系的自然数。(推荐的)

    • 业务主键:主键值和系统的业务挂钩。(不推荐用)

      例如:拿着银行卡的卡号做主键,拿着身份证号码作为主键。
      最好不要拿着和业务挂钩的字段作为主键。因为以后的业务一旦发生改变的时候,主键值可能也需要随着发生变化,但有的时候没有办法变化,因为变化可能会导致主键值重复。

  • 一张表的主键约束只能有1个。(必须记住)

  • mysql提供主键值自增(非常重要)

    cteate table t_user(

    ​ id int primary key auto_increment, //id字段自动维护一个自增的数字,从1开始,以1递增

    ​ uername varchar(255)

    );

    提示:Oracle当中也提供了一个自增机制,叫做:序列(sequence)对象。

外键约束(foreign key)(简称FK)
  • 概念:表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。

    • 删除数据的时候,先删除子表,再删除父表。
    • 添加数据的时候,先添加父表,再添加子表。
    • 创建表的时候,先创建父表,再创建子表。
    • 删除表的时候,先删除子表,再删除父表。
  • 相关术语

    • 外键约束
    • 外键字段
    • 外键值
  • 外键可以为NULL。

  • 外键字段引用其他表的某个字段的时候,被引用的字段不一定是主键,但至少具有unique约束。

检查约束(check)

注意Oracle数据库有check约束,但是mysql没有,目前mysql不支持该约束。

insert

  • 语句格式:insert into 表名(字段名1,字段名2,字段名3,…) values(值1,值2,值3,…);
    - 要求:字段的数量和值的数量相同,并且数据类型要对应相同。
    - 可以不全部写出,没写出的字段自动插入NULL。可以颠倒顺序,但要前后对应。

  • 当一条insert语句执行成功之后,表格当中必然会多一行记录。即使多的这一行记录当中某些字段是NULL,后期也没有办法在执行insert语句插入数据了,只能使用update进行更新。

  • 字段可以省略不写,但是后面的value对数量和顺序都有要求。

  • 一次插入多行数据。

    insert into 表名(字段名1,字段名2,字段名3,…) values(值1,值2,值3,…),(值1,值2,值3,…);

  • 表的复制

    create table 表名 as select语句;
    将查询结果当做表创建出来。

  • 将查询结果插入到一张表中(表结构要对应)

    insert into 表名 select语句;

update

  • 语句格式:update 表名 set 字段名1=值1,字段名2=值2… where 条件;

    注意:没有条件整张表数据全部更新。

delete

  • 语句格式:delete from 表名 where 条件;

    注意:没有条件全部删除。

  • 删除大表中的数据

    truncate table 表名; (表被截断,不可回滚,永久丢失)

drop

  • drop table 表名; (常用)
  • drop table if exists 表名; (oracle不支持这种写法)

存储引擎(了解)

  • 概念:“表的存储方式”。

    存储引擎这个名字只有在mysql中存在。(Oracle中有对应的机制,但是不叫做存储引擎)

    mysql支持很多存储引擎,每一个存储引擎都对应了一种不同的存储方式。

  • 完整的建表语句

    CREATE TABLE t_x (
    id int(11) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    • 在MySQL当中,凡是标识符是可以使用飘号括起来的。最好别用,不通用。
    • 建表的时候可以指定存储引擎,也可以指定字符集。
    • mysql默认使用的存储引擎是InnoDB方式,默认采用的字符集是UTF8。
  • 查看当前sql支持的存储引擎

    show engines \G;

MyISAM存储引擎

  • MyISAM存储引擎是MySQL最常用的引擎,但不是默认的。
  • 特征:使用三个文件表示每个表
    • 格式文件 — 存储表结构的定义(mytable.frm)
    • 数据文件 — 存储表行的内容(mytable.MYD)
    • 索引文件 — 存储表上索引(mytable.MYI)
  • 灵活的AUTO_INCREMENT字段处理
  • 优点:可被压缩,节省存储空间。并且可以转换为只读表,提高检索效率。
  • 缺点:不支持事务。

InnoDB存储引擎

  • InnoDB存储引擎是MySQL的缺省引擎。
  • 特征
    • 优点:支持事务、行级锁、外键等。这种存储引擎数据的安全得到保障。
    • 每个InnoDB表在数据库目录中以.frm格式文件表示。
    • 数据存储在tablespace这样的表空间中(逻辑概念),无法被压缩,无法转换成只读。
    • 这种InnoDB存储引擎在MySQL数据库崩溃之后提供自动恢复机制。
    • InnoDB支持级联删除和级联更新。

MEMORY存储引擎

  • MEMORY存储引擎以前被称为HEAP引擎。
  • 缺点:不支持事务。数据容易丢失。因为所有数据和索引都是存储在内存当中的。
  • 优点:查询速度最快。
  • 在数据库目录内,每个表均以.frm格式的文件表示。
  • 不能包含TEXT或BLOB字段。

选择合适的存储引擎

  • MyISAM表最适合于大量的数据读而少量数据更新的混合操作。MyISAM表的另一种适用情形是使用压缩的只读表。
  • 如果查询中包含较多的数据更新操作,应使用InnoDB。其行级锁机制和多版本的支持为数据读取和更新的混合操作提供了良好的并发机制。
  • 可使用MEMORY存储引擎来存储非永久需要的数据,或者是能够从基于磁盘的表中重新生成的数据。

事务(Transaction)

概述

  • 概念:一个完整的业务逻辑单元,不可再分。

    可以保证多个操作原子性,要么全成功,要么全失败。对于数据库来说事务保证批量的DML要么全成功,要么全失败。要想保证以上的两条DML语句同时成功或者同时失败,那么就需要使用数据库的“事务机制”。

    • 事务(Transaction):一批操作(一组DML)

    执行DML语句是其实就是开启一个事务。

    • 关闭自动提交机制(start transaction)

      mysql事务默认情况下是自动提交的。只要执行任意一条DML语句则提交一次。

    • 回滚事务(rollback)

    • 提交事务(commit)

    • set autocommit:禁用或启用事务的自动提交模式

      • set autocommit = 0 关闭自动提交事务的机制
      • submit或是set autocommit = 1; 开启自动提交
  • 和事务相关的语句只有:DML语句。(insert delete update)

    因为它们这三个语句都是和数据库表当中的“数据”相关的。

    事务的存在是为了保证数据的完整性,安全性。

  • 四个特性ACID

    • A: 原子性:事务是最小的工作单元,不可再分。整个事务中的所有操作,必须作为一个单元全部完成(或全部取消)。
    • C: 一致性:事务必须保证多条DML语句同时成功或者同时失败。
    • I:隔离性:事务A与事务B之间具有隔离。一个事务不会影响其他事务的运行。
    • D:持久性:最终数据必须持久化到硬盘文件中,事务才算成功的结束。

隔离级别

  • 事务隔离性存在隔离级别,理论上隔离级别包括4个。

    • 第一级别:读未提交(read uncommitted)

    对方事务还没有提交,我们当前事务可以读取到对方未提交的数据。

    读未提交存在脏读(Dirty Read)现象:一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交。

    • 第二级别:读已提交(read committed)

    对方事务提交之后的数据我方可以读取到。

    这种隔离级别解决了脏读现象。

    读已提交存在的问题是不可重复读:在同一个事务中,同一个读操作对同一个数据的前后两次读取产生了不同的结果。

    • 第三级别:可重复读(repeatable read)

    这种隔离级别解决了不可重复读问题。

    这种隔离级别存在的问题是:读取到的数据是幻象。

    • 第四级别:序列化读/串行化读(serializable)

    解决了所有问题。

    效率低。需要事务排队。

    • 隔离级别与其他的关系
  • oracle数据库默认的隔离级别是:读已提交。

    mysql数据库默认的隔离级别是:可重复读。

  • 查看和改变隔离级别

    • 服务器变量tx_isolation(包括会话级和全局级两个变量)

      • 查看会话级的当前隔离级别

        select @@tx_isolation;

        select @@session.tx_isolation;

      • 查看全局级的当前隔离级别

        select @@global.tx_isolation;

    • 隔离级别可以在运行的服务器中动态设置。

      set transaction isolation level 隔离级别。

索引

概述

  • 概念

    索引就相当于一本书的目录,通过目录可以快速的找到对应的资源。

    在数据库方面,查询一张表的时候有两种检索方式

    • 第一种方式:全表扫描

    • 第二种方式:根据索引检索(效率很高)

      最根本的原理是缩小了扫描的范围。

  • 创建和删除索引对象

    • 创建索引对象:create index 索引名称 on 表名(字段名);
    • 删除索引对象:drop index 索引名称 on 表名;
  • 查看是否有索引

    explain select sal from emp where sal > 5000;

  • 什么时候考虑给字段添加索引?

    • 数据量庞大。(根据客户的需求,根据线上的环境)
    • 该字段很少的DML操作。(因为字段进行修改操作,索引也需要维护)
    • 该字段经常出现在where子句中。(经常根据哪个字段查询)
  • 索引虽然可以提高检索效率,但是不能随意的添加索引,因为索引也是数据库当中的对象,也需要数据库不断的维护。是有维护成本的。比如,表中的数据经常被修改这样就不适合添加索引,因为数据一旦修改,索引需要重新排序,进行维护。

  • 主键和具有unique约束的字段自动会添加索引。

    根据主键查询效率较高。尽量根据主键检索。

  • 索引失效

    select ename from emp where ename like ‘%A%’;

    模糊查询的时候,第一个通配符使用的是%,这个时候索引是失效的。

实现原理

  • 索引底层采用的数据结构是:B + Tree
  • 通过B Tree缩小扫描范围,底层索引进行了排序,分区,索引会携带数据在表中的“物理地址”,最终通过索引检索到数据之后,获取到关联的物理地址,通过物理地址定位表中的数据,效率是最高的。
  • 索引实现原理

分类

  • 单一索引:给单个字段添加索引
  • 复合索引: 给多个字段联合起来添加1个索引
  • 主键索引:主键上会自动添加索引
  • 唯一索引:有unique约束的字段上会自动添加索引

视图(view)

  • 定义:根据查询(也就是SELECT表达式)定义的数据库对象,用于获取想要看到和使用的局部数据。有时也被成为“虚拟表”。可以被用来从常规表(称为“基表”)或其他视图中查询数据。

  • 相对于从基表中直接获取数据,视图有以下好处

    • 访问数据变得简单
    • 可被用来对不同用户显示不同的表的内容
  • 作用

    • 提高检索效率
    • 隐藏表的实现细节(面向视图检索)
    • 对视图进行增删改查,会影响到原表数据。(通过视图影响原表数据的,不是直接操作的原表)
      可以对视图进行CRUD操作。
  • 创建 删除视图

    • create view myview as select empno,ename from emp;
    • drop view myview;
    • 只有DQL语句才能以视图对象的方式创建出来。mysql不支持子查询创建视图。

DBA命令(了解)

新建用户

授权

回收权限

导出导入

  • 导出

    • 导出整个数据库

      在windows的dos命令窗口中执行:mysqldump bjpowernode>D:\bjpowernode.sql -uroot -p333

    • 导出指定数据库当中的指定表

      mysqldump bjpowernode emp>D:\bjpowernode.sql -uroot –p123

  • 导入

    create database bjpowernode;
    use bjpowernode;
    source D:\bjpowernode.sql

数据库设计三范式

重点内容,面试经常问。

  • 定义:设计表的依据。按照这个三范式设计的表不会出现数据冗余。

  • 三范式

    • 第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分。

    • 第二范式:建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖。

      多对多 三张表 关系表两个外键

    • 第三范式:建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。

      一对多 两张表 多的表加外键

  • 提醒:在实际的开发中,以满足客户的需求为主,有的时候会拿冗余换执行速度。

  • 一对一的设计

    • 第一种:主键共享。
    • 第二种:外键唯一。

行增删改查,会影响到原表数据。(通过视图影响原表数据的,不是直接操作的原表)
可以对视图进行CRUD操作。

  • 创建 删除视图

    • create view myview as select empno,ename from emp;
    • drop view myview;
    • 只有DQL语句才能以视图对象的方式创建出来。mysql不支持子查询创建视图。

DBA命令(了解)

新建用户

授权

回收权限

导出导入

  • 导出

    • 导出整个数据库

      在windows的dos命令窗口中执行:mysqldump bjpowernode>D:\bjpowernode.sql -uroot -p333

    • 导出指定数据库当中的指定表

      mysqldump bjpowernode emp>D:\bjpowernode.sql -uroot –p123

  • 导入

    create database bjpowernode;
    use bjpowernode;
    source D:\bjpowernode.sql

数据库设计三范式

重点内容,面试经常问。

  • 定义:设计表的依据。按照这个三范式设计的表不会出现数据冗余。

  • 三范式

    • 第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分。

    • 第二范式:建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖。

      多对多 三张表 关系表两个外键

    • 第三范式:建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。

      一对多 两张表 多的表加外键

  • 提醒:在实际的开发中,以满足客户的需求为主,有的时候会拿冗余换执行速度。

  • 一对一的设计

    • 第一种:主键共享。
    • 第二种:外键唯一。
【MySQL】C语言连接MySQL 想必大家在学校也学习过MySQL,可能学的懵懵懂懂,这个板块我们从入门开始,从最新的安装MySQL到学习MySQL语句,一步一步开始,一切都是新的,新的板块新的开始,大家一起努力,一起进步!!!​二初始化 MYSQL 结构体指针 – mysql_init。连接 MySQL – mysql_real_connect:需要指定数据库服务所在主机、端口以及登录mysql的用户和密码等信息。下发 MySQL 指令 – mysql_query。 阅读详情

相关推荐

MySQL 一一 MySQL基本使用

1、数据库 简单来说,所谓的数据库就是存储数据的容器,而且是永久存储的。 2、为什么需要数据库 3、为什么要学习MySQL数据库 最早MySQL数据,瑞典AB公司开发的一款开源型的关系型数据库。 随着时间的推移,瑞典AB公司把MySQL数据库转让给Sun公司(Java语言的创始公司) 后来,Sun公司经营不善,又把MySQL数据库转让给甲骨文公司(Oracle数据库) 4、数

Guizy 7万+

mysql 视图不支持子查询6_mysql 视图不支持子查询的解决办法

今天领导让我写一个视图,需要把三张没有任何关联关系的表数据整合到一张视图上,我按照最初的方式先把SQL整理出来后,结果mysql建视图时报错了:下面是最初的方案,CREATE OR REPLACE VIEW view_systeminfo_detailASSELECTf.filesystemSize,f.used,f.unUsed,c.totalContentInfo,s.totalTask,s2...

weixin_36487107的博客 544

子查询 连接查询 视图详细笔记

这是数据库和pycharm之间的连接,以及子查询和连接查询

mysql 功能稀少_为什么mysql中很少见到使用视图功能

mysql> show create table t2\G*************************** 1. row ***************************Table: t2Create Table: CREATE TABLE `t2` (`id` int(11) NOT NULL AUTO_INCREMENT,`rank1` int(11) DEFAULT NUL...

weixin_39590472的博客 1102

分布式光纤传感(DFOS)DTS/DAS/DSS 三合一:10公里管线监测实战与数据解读

本文详细介绍了分布式光纤传感(DFOS)技术在10公里管线监测中的实战应用,通过DTS(温度)、DAS(振动)、DSS(应变)三合一系统,实现对管线健康状态的立体感知。文章涵盖工程部署、数据采集、多物理量数据融合及噪声抑制等关键技术,展示了如何通过一根光纤完成复杂监测任务,显著提升管线安全性和维护效率。

weixin_29168153的博客 315

医学图像处理入门:如何用Python将CT灰度图转换为伪彩色图像(附代码)

本文详细介绍了如何使用Python将CT灰度图转换为伪彩色图像,提升医学图像的可读性和诊断效率。通过OpenCV和Matplotlib等工具,实现灰度值到彩色空间的映射,特别适用于突出显示特定组织密度差异。文章包含完整代码示例和临床实用技巧,适合医学影像分析初学者和Python开发者。

gitlab7runner的博客 326

MySql创建视图不支持子查询解决方案(left join)

Mysql创建视图 默认是不支持子查询 需要改变下方式 1.创建简单视图 CREATE VIEW v_user_role AS SELECT ur.user_id , ur.role_id FROM t_user_role ur 2.创建关联性视图 错误的创建方法: CREATE VIEW v_user_role AS SELECT ur.user_id , ur.role_id ,u.us...

david的博客 7538

复现论文报错解决

博主复现论文代码过程中遇到的各种报错及解决方案~

rellvera的博客 1060

mysql 创建视图提示1349错误

MySQL5.6视图创建问题解决方案摘要 问题核心:MySQL5.6视图FROM子句禁止直接使用子查询,否则报错1349。 解决方案采用分步视图创建: 创建基础月份视图view_re_1(1-7月) 建立统计视图view_re_2处理实际数据 通过LEFT JOIN关联生成最终视图view_re 关键技术: 使用IFNULL处理空值显示为0 严格按视图依赖顺序创建 反引号处理保留字table 优势: 完全规避错误1349 保持原始查询逻辑 兼容MySQL5.6环境 验证方式: 执行创建后立即SELECT查询

小刘的博客 2735

yolov5 onnx推理时报错[ONNXRuntimeError] : 2 : INVALID_ARGUMENT : Unexpected input data type.

yolov5 onnxruntime 推理报错

zjulkw的博客 1223

c++2048小游戏编写

最近编写了一个小游戏,叫作2048,用到了面向对象的知识。

一个学生的博客 2373

mysql视图子查询_mysql创建视图不能包涵子查询的解决办法。View's SELECT contains a subquery in the FROM clause...

如下查询是没问题,但要创建成视图就报View's SELECT contains a subquery in the FROM clause错误。CREATE or REPLACE VIEW `v_user_adunion_reg` ASselect a.name as user_name,b.* from t_users a,t_adunion_result b where a.id = b.u...

weixin_36333122的博客 463

5G无线关键技术 — 新型传输波形技术和先进编码与调制技术

目录 1、OFDM传输波形技术 2、滤波器组多载波 (Filterbank multicarrier:FBMC) 3、先进编码与调制技术 4、空间调制(Spatial Modulation SM) 5、频率正交幅度调制 1、OFDM传输波形技术 OFDM是当前Wi-Fi和LTE标准中的高速无线通信的主要传信模式。 LTECP配置 子载波间隔 CP长度Tcp 有用符号长度Tu CP比例..

Fanjufei的博客 2130

【MySQL】MySQL高手是如何练成的?

Mysql 是开源的,可以定制的,采用了 GPL 协议,可以根据业务需要修改源码来开发自己的 Mysql 系统。MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 使用标准的 SQL 数据语言形式Mysql 可以允许于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、 Eiffel、Ruby 和 Tcl 等。

小冷coding的博客 2万+

Python从0到100(一):初识Python及安装Pycharm

Python从0到100(一):初识Python及安装Pycharm。Python是由荷兰人吉多·范罗苏姆(Guido von Rossum)发明的一种编程语言,是目前世界上最受欢迎和拥有最多用户群体的编程语言。

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 8万+

华为OD机试真题:明日之星选举 (Java/Py/C/ C++/JS/GO)

华为OD机试(机考)双机位C卷 【明日之星选举】,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 明日之星选举。

qq_45776114的博客 920

【MySQL】mysql访问

从开始到选择我们用的都是命令行式的mysql访问mysqld,向mysqld下达我们的指令,其实在数据库层面上,连接数据库的客户端除了现在命令行式的客户端,还有图形化界面、网页版的,当然也包括语言级别的库或者包帮我们去访问数据库。

fight_p的博客 4471

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【MySQL】带你了解MySQL & 如何学习MySQL以及MySQL的用途以及意义

提起 MySQL 我们大多数与这个行业有相关联系或者说是细微联系的人都知道这个“东西”,为什么有那么多相似的产品我们大多数人都说学习 MySQL 而不是其他的系统。我们在学习时,一定要知其然也要知其所以然,我们不能说是:啊,我要学MySQL! 之后就找到MySQL的讲解课程开始直接的学习语句。这样确实是可以学会去操作MySQL,可是,你是否知道你学习它的意义在于哪里吗?所以呢,我们在开始学习之前一定要去了解一下MySQL,去了解下它的用途,它的功能,这样的话,我们就会对自己学习的知识有一个清晰的对应认知了

感谢您的关注! 8863

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Ubuntu20.04安装MySQL及配置MySQL workbench

文章目录前言一、MySQL安装与配置1. 安装MySQL2. 配置MySQL二、配置MySQL远程访问三、安装配置MySQL workbench1. 安装MySQL workbench2.使用MySQL workbench连接到数据库总结 前言 最近在学习林子雨老师的大数据时,发现为 Hadoop 安装 Hive 需要使用 MySQL 数据库保存 Hive 的元数据,而不是采用 Hive 自带的 derby 来存储元数据。为了填补大数据专栏的空白,查阅资料完成此篇博客。 系统版本:Ubuntu20.04

程序必须为人类阅读而编写,并且仅仅碰巧可以让机器执行 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【mySQL】C++ 操作mySQL|mySQL++|Mysql connector c++

MySQL其实提供了C实现的接口,而MySQL++则是一个C++实现的封装MySQL C接口的一个Wrapper,遵循了标准C++的规则,是个跨平台的开源工具。我们主要用MySQL++来开发C++程序。 1. 安装和配置 还是万年不变的新手主题——安装和配置 安装MySQL++之前需要先安装MySQL: [root@ollen mysql++]# yum install mysql...

我的笔记本 6836

【MySQL】 MySQL安装

将mysql相关的内容 以 xargs的形式 给予卸载程序,由于安装包是通过yum进行安装的,使用 yum remove 即可卸载。正常来说,应该为上一个mysql残留的数据,但是由于这里没有使用过mysql,所以就什么都没有。rpm为mysql层面上,在linux的一个安装包,里面包含的是mysql的yum源。当前系统中没有系统安装包了,也没有mysql对应的进程,对应的环境就被卸载干净了。采用yum的方式,获取到MySQL的安装包 ,一般都是.rpm。配置server端的编码格式 采用 utf8。

qq_62939852的博客 2388

MySQL —— MySQL 程序

本篇文章将会介绍 MySQL 中常见程序 mysqld 与 mysql 的基本概念,以及详细介绍 mysql 客户端程序的使用,这里我们会介绍 mysql 客户端命令的常用选项,使用 mysql 客户端从 .sql 文件中执行 SQL 语句,下面开始本篇文章的内容介绍。

HKJ_numb1的博客 2537

MySQL-MySQL访问

通过之前的章节,我们已经学会了MySQL的大部分基本操作和概念,今天我们将要学习通过C语言接口来访问MySQL。需要注意的是,今天我们要使用的接口都来自于第三方库,这个库是由MySQL提供的,我们需要用到 mysql.h 和 mysqlclient.so ,头文件一般在,动态库文件有的在/usr/lib/或者中,不过我的就在目录下,所以如果你找不到的话,可以直接使用来直接查找。当然前提是你的主机安装了mysql,一般会自动给你添加这些库文件。

fengjunziya的博客 2210

Mac 上如何安装Mysql? 如何配置 Mysql?以及如何开启并使用MySQL

有许多开发的小伙伴,使用的是mac,那么在mac上如何安装,配置Mysql,以及使用Mysql了,今天来一个系统的教程。

m0_74825223的博客 4169

MySQL——MySQL的使用

MySQL——MySQL的使用

致力于分享在各类技术领域的学习与实践经验,涵盖编程、虚拟化、开源工具、网络安全等。 2855
上一篇: 枚举类&注解
下一篇: 找出段落中每个字母 构造哈夫曼树
ZoeLandia
博客等级 码龄6年 734粉丝 183原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值