简明:本文详细记录个人学习MySQL数据库的知识总结,包括常用SQL语句的理解、多表查询、事务、索引和表设计等等内容。

(以后学习所遇到的问题,将会持续补充在本文.........)

  (个人记录学习总结内容,若出现错误/改进地方,请指出/分享,共同学习进步!!!)

一、MySQL数据库基础知识

1、简要

数据库中最基本的单元:表table

行(row):称为数据/记录              列(column):称为字段

数据库:DataBase,简称DB,存储数据的仓库,仓库中一堆文件,文件中的数据以一定的格式存储。

     数据库管理系统:DataBase Management System,简称DBMS,对数据库中的数据进行增删改查。

     常见的数据库管理系统:MySQL、Oracle、MS、 SqlServer、BD2、sybase等等。

     SQL:结构化查询语言,学习SQL语句,DBMS负责执行SQL语句,对DB中的数据进行增删改查。

2、启动与关闭MySQL服务

注意:只有启动服务,才能连接得上MySQL数据库。

启动服务:net  start  mysql                       关闭服务:net  stop  mysql

登录MySQL数据库:mysql   -u(用户名)   -p(密码)

mysql如何将两个无相关的表一对多对应 mysql两张表联合查询sql语句_mysql

mysql如何将两个无相关的表一对多对应 mysql两张表联合查询sql语句_mysql_02

3、MySQL常用命令

注意:MySQL语句执行时,必须以  ";"  结尾,语句可以换行编写。

退出Mysql:exit
查看Mysql中有哪些数据库:show databases; (mysql默认自带了4个数据库)
使用数据库:use 对应数据库名字;
创建数据库:create database 新建数据库名字;
查看数据库下的表:show tables;
查看Mysql数据库的版本号:select version();
查看当前所使用的数据库:select database();

4、SQL语句分类

DQL(数据查询语言):凡是带有select关键字都是查询语句。
                        select......

DML(数据操作语言):对表中的数据进行增删改查都是DML。
                        insert 增  、 delete 删 、 update 改

DDL(数据定义语言):对表的结构进行操作,凡是带有create、drop、alter都是DLL。
                        create 新建 、drop 删除 、 alter 修改

TCL(事务控制语言):commit 事务提交 、 事务回滚 rollback

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

二、数据库中数据的操作(单表)

  简明:此部分内容并非详细说明CRUD操作,只是罗列个人在实际操作中遇到较容易遗忘的地方。

1、简单查询( 起别名情况 )

# as可以省略,起别名只是在最终显示结果改变,原字段不变
select name as "地点名称" from city;

2、条件查询( 排序情况 )

执行顺序:from  ---->  where  ----->  select  ------>  order by
           (  理解:来自哪张表,查询条件是什么,进行查询,最后排序  )

# 来自city表,(没有查询条件),查询所有字段,最终以provinceid字段进行降序
select * from city order by provinceid desc;

mysql如何将两个无相关的表一对多对应 mysql两张表联合查询sql语句_mysql_03

(多行处理函数)

特点:输入多个,输出一个;多行(多条)数据,最终只输出一个数据结果

注意:分组函数不能直接使用在where子句中,必须先进行分组。

(1)count -----------> 计算总行数(记录数),不包括Null字段

mysql如何将两个无相关的表一对多对应 mysql两张表联合查询sql语句_mysql_04

4、分组查询(先进行分组,然后操作每一组数据)

执行顺序:from  ---->  where  ----->  group by  -------->  select  ------>  order by

#来自sale表,(无查询条件),按照gid字段分组,查询gid、nums(对该字段求和)字段,最终结果以sum(nums)字段降序(默认asc)
select gid,sum(nums) from sale group by gid order by sum(nums);

mysql如何将两个无相关的表一对多对应 mysql两张表联合查询sql语句_mysql_05

5、单表查询总结

SQL语句:select  .......  from  ......  where  ........  group by   ........  having  .......  order by

执行顺序:from  ----> where ----> group by -----> having  -----> select -----> order by

理解:来自哪张表,查询条件是什么,按照哪个字段分组,分组后过滤一下,查询哪些字                 段,最终结果按照哪些字段排序

三、数据库中数据的查询操作(多表) 

简明:多张表联合起来查询数据,也称为连接查询

根据表的连接方式分为:内连接、外连接

内连接:等值连接、非等值连接、自连接(两张表的匹配是精确的,平等关系)

外连接:左外连接、右外连接(两张表有主次关系:将主表全部数据查出来的同时,附带查询两张表之间满足条件的数据)

1、笛卡尔积现象

简明:两张表连接在没有任何限制条件下,一张表的一条记录会对应另一张表的所有记录。

最终记录总数:第一张表总记录数   ×   第二张表总记录数

注意:两个表之间匹配次数越多,执行效率越低,应要尽量避免笛卡尔积现象。

mysql如何将两个无相关的表一对多对应 mysql两张表联合查询sql语句_字段_06

2、内连接(等值连接:连接条件是一个等量关系)(inner可省略)

语法:select..字段..from....表A....(inner)join.....B表....on...连接条件....where....过滤条件

#   来自city表,加上(join)dept表,条件是city表的provinceid字段与dept表的manager字段相等的记录,
查询两个表所有的字段
select c.*,d.* from city c join dept d on c.provinceid = d.manager;

mysql如何将两个无相关的表一对多对应 mysql两张表联合查询sql语句_数据_07

3、内连接(非等值连接:连接条件不是一个等量关系)

#  来自city表,(inner)join加入goods表,连接条件是city表的id字段大于goods表的id字段,查询所有字段
select c.*,g.* from city c inner join goods g on c.id > g.id;

mysql如何将两个无相关的表一对多对应 mysql两张表联合查询sql语句_数据_08

4、内连接(自连接:自连接对应的是同一张表)

理解:自连接查询的是同一张表的数据,可理解成把一张表拆分成两张表,与多表查询一样

#  来自emp表,连接条件emp表的mgr字段与emp表的empno字段相等数据,查询字段ename
select a.ename as "员工",b.ename as "上级" from emp a join emp b on a.mgr = b.empno;

mysql如何将两个无相关的表一对多对应 mysql两张表联合查询sql语句_数据_09

5、外连接(右外连接:右表为主表,左表为次表)

(主表查询所有结果,附带查询次表)(左外连接同理)

理解:右连接(right join),把右表的数据全部查询出来,附带查询满足b.mgr = a.empno条件数据,即有些上级无员工(右表的mgr字段数据未能找到左表empno相等的字段)。

#  此处是用同一张表,可拆分成两张表
select a.ename as "员工",b.ename as "上级" from emp a right join emp b on b.mgr = a.empno;

mysql如何将两个无相关的表一对多对应 mysql两张表联合查询sql语句_数据库_10

四、补充内容(待持续补充)

简明:该部分为MySQL学习总结的剩余知识点。

1、约束

简明:约束(constraint)对表中的字段加一些约束条件,以来保证表中数据的完整性、有效性,也就是对字段下的数据进行限定。

2、约束分类

非空约束:not null  (所约束的字段下数据不能为空)

唯一性约束:unique  (所约束的字段下数据不能重复)

主键约束:primary key (作为每一行记录的唯一标识,区分每一行记录)

3、事务(重点)(注解式开发,理解即可)

简明:一个事务就是一个完整的业务逻辑,是一个最小的工作单元,不可再分,要么成功,要么失败,只能有一个结果。(只有DML语句才有事务概念  增、删、改)

理解:一个事务实际上就是多条DML语句,同时成功/失败,否则就会导致数据出错,生成不完整,无法进行关联。

4、事务实现过程

InnoDB存储引擎:提供一组用来记录事务性活动的日志文件。

如:事务开始  ...... insert  ----->insert  -----> insert ----> delete ...... 事务结束

注意:MySQL默认事务行为是提交事务,执行一次语句提交一次,不符合实际开发,需关闭MySQL自动提交事务机制(命令:start transaction;)。

 5、索引

简明:索引是在数据库表的字段上添加的,是提高查询效率的一种机制。

不考虑索引的问题:如果字段上没有添加索引,MySQL会对该表字段进行全扫描,效率较低,等同于一页一页查询字典;若添加索引,则可以直接定位到某字段,对该字段下的数据进行匹配。

MySQL查询方式:1、全表扫描     2、根据索引检索

注意:在任何数据库中,表的主键会自动加上索引;被unique约束的字段也会自动加上索引。

6、考虑添加索引的情况 

情况1:处理数据量相对硬件处理能力而言,较庞大。

情况2:字段经常出现在where后面,以条件的形式存在,即经常被扫描。

注意:不随意添加索引,索引需要维护;建议通过主键查询、通过unique约束的字段查询。

7、总结表的设计思路 

一对多:两张表,多的表加外键。(一个班级对应多个学生,学生表加外键)

多对多:三张表,关系表加2个外键。(一个教师教学多个班级,一个班级有多个教师,需建立第三张表管理两者的关系)

一对一:若遇到一张表中太多字段,可以进行拆分成2个表,在子表中另新建一个字段,设为
外键,同时用unique约束。

五、总结 

         本文详细记录个人学习MySQL数据库总结内容,个人认为较经常使用的知识、概念已写在文中,若有理解错误 / 编写瑕疵的地方,请指出/分享,共同学习!!!