联合查询

所谓的联合查询就是将满足条件的结果进行拼接在同一张表中。

基本语法:

  1. select */字段 from 数据表1
  2. union [all | distinct]
  3. select */字段 from 数据表2;
  4. 特别说明:使用union联合查询必须有一个前提,每个表读取的字段数必须是一致的

union联合查询默认是去重的。

union  all :在数据联合时保存所有数据,示例代码:

union  distinct :在数据联合时去重所有重复的数据,示例代码:

union的意义:主要用于大数据的存储,数据分表(针对大数据)。

例:数据库维护发现某个数据表(如产品表共有1亿条记录),运行非常缓慢。这个时候我们可以采用数据分表操作。把数据平均分成N份,每个数据表存储1/N数据量。

多表连接(两张以上的数据表)

1、多数据源

所谓的数据源就是一张提供数据的二维表,基本语法:

  1. select * from 数据源,数据源,数据源...;

但是实际应用中,from后面的数据源可以同时有多个,两个数据源情况:

  ①返回的字段数= 数据源1+数据源2;

  ②返回的记录数 = 数据源1*数据源2; (笛卡儿积)

2、交叉连接

基本语法:

  1. select * from 数据表1 cross join 数据表2;

交叉连接与多数据源(无where条件时),效果是一摸一样的。

  ①返回的字段数= 数据源1+数据源2;

  ②返回的记录数 = 数据源1*数据源2; (笛卡儿积)

特别说明:虽然在MySQL中存在交叉连接与多数据源连接(无where条件时),

    但是返回的结果是笛卡儿积,而且这种数据是无意义的。在实际开发中,要避免出现以上情况。

3、内连接查询

基础语法:

  1. select * from 数据表1 inner join 数据表2 on 关联条件;

  2. select 数据表1.字段,数据表2.字段 from 数据表1 inner join 数据表2 on 关联条件;

  ①字段数= 数据表1 + 数据表2

  ②返回结果= 只获取两个表中满足关联条件的结果,不满条件的结果全部忽略

4、数据表与字段别名

基本语法:

  1. 数据表别名:
  2. select * from 数据表 [as] 表别名;
  3. 字段别名:
  4. select 字段 [as] 别名 from 数据表;

①数据表别名:简化SQL语句

②字段别名:避免产生字段冲突

字段冲突产生的后果就是后一个字段会覆盖前一个字段(PHP读取MySQL数据库),遇到以上情况必须对字段定义别名

5、多数据源查询(功能与inner join...on...类似)

基本语法:

  1. select * from 数据源1,数据源2 where 条件;

6、左右外连接查询

①明确两个基本概念:左表与右表的概念

  在连接查询中,处于左侧的表我们称之为“左表”;处于右侧的表我们称之为“右表”。

②基本语法:

  1. 左外连接查询:
  2. select 左表.字段,右表.字段 from 左表 left join 右表 on 关联条件;
  3. 右外连接查询:
  4. select 左表.字段,右表.字段 from 左表 right join 右表 on 关联条件;

特别说明:

  1. 内连接查询是只读取两个表中满足条件的结果,不满足条件的结果会自动忽略。
  2.  
  3. 左外连接查询:以左表作为主表,读取其所有记录,然后去右表中进行数据匹配,满足条件,则获取匹配的记录,不满足条件则显示NULL
  4.  
  5. 右外连接查询:以右表作为主表,读取其所有记录,然后去左表中进行数据匹配,满足条件,则获取匹配的记录,不满足条件则显示NULL

7、自连接查询

自连接查询:就是自己连接自己。

多级分类是如何实现的,通常我们会在数据表中添加一个额外的字段,叫parent_id(父类id)

子查询

什么是子查询?

  1. 子查询,指的是一个查询语句被其他语句包裹。
  2. 例:
  3. select * from 数据表 where class_id = (select id from 数据表 where 条件);

子查询的分类?

  1. ①按结构划分
  2. from子查询
  3. where子查询
  4. exists 子查询
  5. ②按返回结果划分
  6. 标量子查询,子查询的SQL语句返回固定的某个结果
  7. 列子查询,子查询的SQL语句返回某个字段列(一列信息,可能拥有多个结果)
  8. 行子查询,子查询的SQL语句返回一行记录信息(只有一条记录)
  9. 表子查询,子查询的SQL语句返回的一个表数据

子查询演示

①标量子查询,子查询返回的结果是固定的,例:求qz01中的所有学员信息

解析:子查询都是分段解析与执行的

  1. 第一步:求出全栈01期中的id信息
  2. select id from tt_class where class_name=’qz01’;
  3.  
  4. 第二步:在第一步的基础上,查询所有全栈01期的小伙伴信息
  5. select * from tt_student where class_id = (?);

②列子查询,子查询返回的结果是一个字段列,例:求所有已经入班的学员信息

  1. 第一步:首先求出所有班级的id
  2. select id from tt_class;
  3.  
  4. 第二步:在第一步的基础上读取所有已经入班的学员信息,
  5. 一般情况下列子查询通常结合innot...in...、allany以及some语句。
  6. select * from tt_student where class_id in (?);

③ all、any以及some语句

all :必须满足all中的所有条件,其结果才会正常返回。id > all(1,3,5):要求id字段必须大于1且大于3且大于5。

any与some同义词:只要满足any中的某个条件,其结果就会立即返回。id> any(1,3,5) :只要id大于1,3,5中的某个值,其就可以正常返回。

  1. select * from tt_student where class_id = all(select id from tt_class)
  2.  
  3. select * from tt_student where class_id = any(select id from tt_class)

④<>或!=与all、any以及some

  != + all 是not...in...的同义词:

  ############

  !=与any :要求class_id不能等于any中的某个值。

  ########

⑤行子查询,子查询返回的结果是一个行信息(字段信息)

求:学员中年龄最大且身高最高的学员信息

  1. 第一步:获取班级中年龄与身高的最大值
  2. select max(age),max(height) from tt_student;
  3.  
  4. 第二步:获取学员的信息
  5. select * from tt_student where (age,height) = (?);

⑥表子查询,返回的结果是一张数据表(多行多列)

求:每个班级中年龄最大的小伙伴信息

  1. 第一步:获取所有班级信息
  2. select id from tt_class;
  3.  
  4. 第二步:获取班级中的小伙伴信息
  5. select * from tt_student where class_id in (?)
  6.  
  7. 第三步:对第二步中的数据进行排序,按age降序
  8. select * from (?)

⑦exists子查询

exists:判断内容是否存在,exists返回的结果就是true或false。

如果子查询返回1条以上的记录,mysql就认为其返回为true,反之,如果返回结果为空,则mysql就认为其返回false。

基本语法:

  1. select * from 数据表where exists(子查询);

exists执行原理:咱们用过的子查询大多数都是把内层的子查询返回结果拿到外层的子查询中去运算。

  但是exists比较特殊,其是把外层查询中的所有记录,

  通过loop遍历循环的方式一条一条拿出来与exists中的返回结果进行比对,如果exists返回true,

  则显示此记录,反之,则不显示此记录。

MySQL开发——【联合查询、多表连接、子查询】的更多相关文章

  1. mysql表查询、多表查询(增强查询的使用)子查询、合并查询,外连接,mysql5种约束,自增长

    一.查询加强 1.在mysql中,日期类型可以直接比较,需要注意格式 2.%:表示0到多个字符, _:表示单个字符 exp:显示第二个字符为大写O的所有员工的姓名和工资 select  name fr ...

  2. MySQL 子查询(四)子查询的优化、将子查询重写为连接

    MySQL 5.7 ref ——13.2.10.10优化子查询 十.子查询的优化 开发正在进行中,因此从长远来看,没有什么优化建议是可靠的.以下列表提供了一些您可能想要使用的有趣技巧.See also ...

  3. mysql数据库:mysql增删改、单表、多表及子查询

    一.数据增删改 二.单表查询 三.正表达式匹配 四.多表查询 五.子查询       一..数据增删改     增加  insert [into] 表名[(可选字段名)] values(一堆值1),( ...

  4. Orcla 数据库复习2 --子查询和表连接

    子查询和表连接  ①.查询挣钱最多的人的名字  SELECT ename,sal FROM emp  WHERE sal=(SELECT MAX(sal) FROM emp);  ②.查询有哪些人的工 ...

  5. ylb:SQL 表的高级查询-多表连接和子查询

    ylbtech-SQL Server: SQL Server-表的高级查询-多表连接和子查询 SQL Server 表的高级查询-多表连接和子查询. 1,ylb:表的高级查询-多表连接和子查询 返回顶 ...

  6. MySQL 进阶6: 连接查询 (多表连接) : 等值连接/非等值连接 /左右全连接/内连接

    #进阶6: 连接查询 (多表连接) : 等值连接/非等值连接 /左右全连接/内连接 /* 含义: 当查询的字段来自于多个表时, 就会用到连接查询 一: sql 92标准 :等值连接 ,(#内连接) 1 ...

  7. mysql中【update/Delete】update中无法用基于被更新表的子查询,You can't specify target table 'test1' for update in FROM clause.

    关键词:mysql update,mysql delete update中无法用基于被更新表的子查询,You can't specify target table 'test1' for update ...

  8. laravel利用subquery使左连接查询右表数据唯一查询

    如:表a,连接表b,b中有多条符合查询的记录 1.建立需要的子查询 $sub = DB::table('b')->select(['aid'])->selectRaw('max(id) a ...

  9. MYSQL数据库学习十一 多表数据记录查询

    11.1 关系数据操作 并(UNION):把具有相同字段数目和字段类型的表合并到一起. 笛卡尔积(CARTESIAN PRODUCT):没有连接条件表关系的返回结果.字段数=table1字段数+tab ...

  10. [sql Server]除非另外还指定了TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效

    今天遇到一个奇怪的问题,项目突然要从mysql切换到sql server数据库,包含order by 子句的嵌套子查询报错. 示例:select top 10 name,age,sex from ( ...

随机推荐

  1. Excel函数之rank应用

    该函数的功能就是对现有数据指标进行排名 示例:对产品进行销售总额的排名 首先要知道排名需要用到rank函数 number参数就是你要进行排名的数据 ref参数就是该指标需要在哪个区域内进行比较定位排名 ...

  2. 自己动手开发智能聊天机器人完全指南(附python完整源码)

    一.前言 人工智能时代,开发一款自己的智能问答机器人,一方面提升自己的AI能力,另一方面作为转型AI的实战练习.在此把学习过程记录下来,算是自己的笔记. 二.正文 2.1 下载pyaiml 下载pya ...

  3. centos7如何查询已运行服务?

    使用 systemctl list-unit-files 可以查看启动项 , 因为用chkconfig --list命令出现如下提示: 左边是服务名称,右边是状态,enabled是开机启动,disab ...

  4. Django_admin组件

    1.Django_admin组件的意义 作者:Eric 微信:loveoracle11g 新建Django项目bms图书管理系统 App为book book/models.py添加表关系 from d ...

  5. Java笔记Spring(一)

    一.Spring框架 源码地址:https://github.com/spring-projects/spring-framework 构建工具:Gradle,Gradle教程:https://www ...

  6. 用GDB调试程序(六)

    七.设置显示选项 GDB中关于显示的选项比较多,这里我只例举大多数常用的选项. set print address     set print address on         打开地址输出,当程 ...

  7. 转:StarUML3.0的破解方法

    转自:https://blog.csdn.net/sam_shan/article/details/80585240 StarUML3.0的破解方法 最近StarUML由2.0更新到3.0.原来的破解 ...

  8. 性能测试day07_性能瓶颈和分析

    其实如果之前都做的很到位的话,那么再加上APM工具(dynaTrace等),监控到非常细节,那么我们跑一个业务,我们就能完全清楚的知道每个请求的时间,也能知道请求所产生sql的时间,这样你自然而然都知 ...

  9. jdbc与TiDB数据库交互的过程

    以下是使用jdbc操作TiDB数据库,得到的交互过程和指令的说明 ==>代表发送给数据库的指令 // 加载驱动程序Class.forName(driver); // 连接数据库 Connecti ...

  10. input输入限制

    1:只能输入两位小数点:function keepTwoPointNum(that){ var val=that.value; if(isNaN(val)){ $(that).val(''); ret ...