MySQL查询与结构

1 多表关联查询

交叉连接:

交叉连接返回的结果,是被连接的两个表中所有数据行的笛卡尔积,也就是返回第一个表中符合查询条件的数据行数,乘以第二个表中符合查询条件的数据行数

比如,Department表中有4个部门,employee表中有4个员工,那么,交叉连接的结果就有16条数据

SELECT * FROM 表1 CROSS JOIN 表2;

交叉连接关键字: CROSS JOIN

交叉连接语法:

SELECT * FROM 表名1 CROSS JOIN 表名2

案例:

CROSS JOIN,用于连接两个要查询的表,通过该语句,可以查询两个表中所有的数据组合

首先,在chapter05数据库中,创建两个表,department表和employee表

在两个表中,分别插入相关数据

为department表,添加数据

为employee表,添加数据

使用交叉连接,查询部门表和员工表中的所有数据

可以看出,交叉连接的结果,就是两个表中所有数据的组合

注意:在实际开发中,这种业务需求是很少见的,一般不会使用交叉连接,而是使用具体的条件,对数据进行有目的的查询

内连接:

内连接也叫等值连接,内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。

数据表内数据如下:

books表:

articles表:

内连接的关键字:INNER JOIN

命令执行代码如下:

select * from books as b inner join articles as a on b.title=a.title

其中a.title 表示books表中的title字段,b.title表示的articles表中的字段,这行命令的意思是使用mysql中的inner join关键字来连接两张表(books表与articles表)组合两张表的字段并且返回关联字段相对应的字段(a.title=b.title)

运行结果如图下所示:

注意:这里也可以省略inner直接写为join,也能实现上述功能。

inner join 获取的就是两个表中的交集部分

左连接:

左连接关键字:LEFT JOIN

左表:books  右表:articles

左连接会读取左边数据表的全部数据,即使右边数据表没有对应数据。(如果两个表中数据有相同部分,只显示一个)

右连接:

右连接关键字:

左表:books  右表:articles

右连接会读取右边数据表的全部数据,即使左边数据表没有对应数据。(如果两个表中数据有相同部分,只显示一个)

分页查询:

分页查询关键字:LIMIT

查询第1条到第10条的数据的sql是:select * from table limit 0,10;   ->对应我们的需求就是查询第一页的数据:select * from table limit (1-1)*10,10;

查询第10条到第20条的数据的sql是:select * from table limit 10,10;  ->对应我们的需求就是查询第二页的数据:select * from table limit (2-1)*10,10;

查询第20条到第30条的数据的sql是:select * from table limit 20,10;  ->对应我们的需求就是查询第三页的数据:select * from table limit (3-1)*10,10;

子查询:

定义

子查询允许把一个查询嵌套在另一个查询当中。

子查询,又叫内部查询,相对于内部查询,包含内部查询的就称为外部查询。

子查询可以包含普通select可以包括的任何子句,比如:distinct、 group by、order by、limit、join和union等;

但是对应的外部查询必须是以下语句之一:select、insert、update、delete。

位置

select 中、from 后、where 中.

group by 和order by 中无实用意义。

MySQL逻辑架构图

MySQL的最重要、最与众不同的特性就是它的存储引擎架构,这种架构将查询处理以及其他系统任务和数据的存储/提取相分离。所带来的好处就是可以在使用时根据性能、特性,以及其他需求来选择数据存储的方式。

下图就是MySQL的逻辑架构图:

MySQL架构总共三层,在上图中以虚线作为划分。

首先,最上层的服务并不是MySQL独有的,大多数给予网络的客户端/服务器的工具或者服务都有类似的架构。比如:连接处理、授权认证、安全等。

第二层的架构包括大多数的MySQL的核心服务。包括:查询解析、分析、优化、缓存以及所有的内置函数(例如:日期、时间、数学和加密函数)。同时,所有的跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。

第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。服务器通过API和存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明化。存储引擎API包含十几个底层函数,用于执行“开始一个事务”等操作。但存储引擎一般不会去解析SQL(InnoDB会解析外键定义,因为其本身没有实现该功能),不同存储引擎之间也不会相互通信,而只是简单的响应上层的服务器请求。

更加详细的MySQL系统架构图

看完上图后,大家是不是觉得MySQL的系统架构挺简单的?其实不然。上图只是MySQL系统架构的大的模块图,其实每一层的结构都相当复杂,下图就是详细模块图:

首先,我们对该图中的各个模块做一简单介绍:

1、Connectors

指的是不同语言中与SQL的交互。

2、Connection Pool

管理缓冲用户连接,线程处理等需要缓存的需求。负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。而连接线程的主要工作就是负责 MySQL Server 与客户端的通信,接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。

3、 Management Serveices & Utilities

系统管理和控制工具。

4、 SQL Interface

接受用户的SQL命令,并且返回用户需要查询的结果。

5、 Parser

SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。在 MySQL中我们习惯将所有 Client 端发送给 Server 端的命令都称为 query ,在 MySQL Server 里面,连接线程接收到客户端的一个 Query 后,会直接将该 query 传递给专门负责将各种 Query 进行分类然后转发给各个对应的处理模块。

主要功能:

a 、 将SQL语句进行语义和语法的分析,分解成数据结构,然后按照不同的操作类型进行分类,然后做出针对性的转发到后续步骤,以后SQL语句的传递和处理就是基于这个结构的;

b、 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的。

6、 Optimizer

查询优化器:SQL语句在查询之前会使用查询优化器对查询进行优化。就是优化客户端请求query,根据客户端请求的 query 语句,和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略,告诉后面的程序如何取得这个 query 语句的结果。

使用的是“选取-投影-联接”策略进行查询:

用一个例子就可以理解: select uid,name from user where gender = 1;

这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤;然后根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤。最后将这两个查询条件联接起来生成最终查询结果。

7 、Cache和Buffer

查询缓存:主要功能是将客户端提交 给MySQL 的 Select 类 query 请求的返回结果集 cache 到内存中,与该 query 的一个 hash 值 做一个对应。该 query 所取数据的基表发生任何数据的变化之后, MySQL 会自动使该 query 的Cache 失效。在读写比例非常高的应用系统中, Query Cache 对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。

如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等。

8 、存储引擎接口

MySQL区别于其他数据库的最重要的特点就是其插件式的表存储引擎。MySQL插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都必需的,如SQL分析器和优化器等,而存储引擎是底层物理结构的实现,每个存储引擎开发者都可以按照自己的意愿来进行开发。

注意:存储引擎是基于表的,而不是数据库。

mysql能将查询结果与表左查询,MySQL查询与结构相关推荐

  1. MySQL数据库性能优化由浅入深(表设计、慢查询、SQL索引优化、Explain分析、Show Profile分析、配置优化)

    文章目录 0 SQL性能分析 1 表的设计合理化 1.1 为什么需要范式 1.2 三范式原理 1.3 什么样的表才满足三范式 2 慢查询 2.1 慢查询介绍 2.2 慢查询步骤 3 添加适当索引 3. ...

  2. mysql 快捷查询数据库各表占用空间,mysql查看索引占用空间,mysql查看数据占用空间

    先贴一张图! 第一步,"很重要" 在mysql中,有一个创建之初自带的库information_schema,这个库中包含着数据库相关信息,查询数据占用空间就是使用该库,所以首先进 ...

  3. mysql 关键字模糊查询_MySQL单表多关键字模糊查询的实现方法

    在最近的一个项目需要实现在MySQL单表多关键字模糊查询,但这数个关键字并不一定都存在于某个字段.例如现有table表,其中有title,tag,description三个字段,分别记录一条资料的标题 ...

  4. MySQL——导出表,单个表单个列查询以及单个表多个条件查询

    目录 引入,导出表 单个表单个列查询 单个表多个条件查询 引入,导出表 右键表 获得表 遇到关键词的用'``'分割 单个表单个列查询 SELECT nickname,`from` from y_mem ...

  5. 4,表查询语法,表连接,子查询

    数据库基础四: 今日内容: 一:单表查询语法 from 找表 where 第一次筛选 group by 分组 having 二次筛选 distinct 去重(数据一模一样时去重复的,在from之前使用 ...

  6. mssql 将查询结果作为表名参数_MySQL·查询(一)

    最近把时间都放在了回顾SQL语言上,因为能够按照需求在数据库中提取数据是非常重要的,太久没有去碰SQL,所以就花了一段时间去重新总结关于MySQL中的查询,希望下面简单的总结可以帮助大家理解SQL的查 ...

  7. mysql全备和指定库和表备份,mysql日志的分类简介和作用, mysql加速跳过域名解析,mysql权限授予与收回,数据库实用篇~~Tring

    mysql改密,重置,备份,权限和日志 改密~ 修改密码 重置密码 步骤 数据库备份 用到的命令: 可加参数 : -A 参数 例子: -B 参数 例子: 备份指定数据库的某个表 恢复表 创建用户 操作 ...

  8. oracle查询挂起,表挂起更新查询Oracle 11g(Table hangs on Update query Oracle 11g)

    表挂起更新查询Oracle 11g(Table hangs on Update query Oracle 11g) 我正在更新一个Oracle表字段,引用另一个具有类似Key字段的表,但在此特定表上, ...

  9. mysql 单表多字段查询_单表多字段MySQL模糊查询的实现

    MySQL模糊查询是我们经常会遇到的,下面就为您介绍MySQL模糊查询的实现方法,希望对您学习MySQL模糊查询方面能够有所帮助. 在最近的一个项目需要实现在单表中对多字段进行多个关键字的MySQL模 ...

  10. mysql select查询2个表_mysql – 为SELECT查询合并2个表?

    首先..这里是我创建的两个表(没有相关的列)- CREATE TABLE users_history1 ( circuit tinyint(1) unsigned NOT NULL default ' ...

最新文章

  1. Python+OpenCV 图像处理系列(8)—— Numpy 对象及图像对象创建与赋值
  2. mysql cert_Mysql使用SSL连接
  3. java error could_Java.lang.Error: Properties init: Could not determine current working directory.
  4. Java学习总结:4
  5. Linux用户查看系统有多少用户在登录
  6. 代码跑得慢?分分钟教你如何给代码提速30%!!!
  7. 模拟红绿灯交替指示编程思路
  8. Android博客文章整理
  9. PHP Warning: Xdebug MUST be loaded as a Zend extension
  10. 【PC工具】大神开源项目-配色调色工具Colorpicker颜色选择器
  11. Java学习之javassist
  12. cassandra_Apache Cassandra和低延迟应用程序
  13. 面试突击第 3 期 | Redis 如何实现查询附近的人?视频实战版
  14. vscode 连接docker_在VS Code中使用带Docker容器的Java开发环境 – Bruno Borge
  15. Jmeter系列之接口自动化实战
  16. nvidia refelx_AMD这么猛?!NVIDIA三款新卡胎死腹中
  17. java 利用Future异步获取多线程任务结果
  18. 还在为生产环境中用什么样的 Kubernetes 架构困惑吗,或许看完这篇你的问题就迎刃而解了!...
  19. MSSQL存储过程调用 C#DLL
  20. (持续更新)C语言笔试题整理

热门文章

  1. ORB-SLAM 解读(五) 地图点投影进行特征匹配
  2. scala case class与class区别
  3. C# 模拟Form提交
  4. NATS--NATS Streaming持久化
  5. 隐式类型转换 与 隐式类型转换操作符
  6. QTP的那些事--打开脚本文件弹出“unexpected file format”错误
  7. Java集合之map 集合使用
  8. 【中文分词】结构化感知器SP
  9. mycat数据库中间件透明实现MYSQL读写分离
  10. CentOS release5.5 (Final)搭建个人本地网站