Server高端内容之子查询和表链接,查询之提到查询

  1. 分类

一.子查询概念

查询那块是首要, 关系到系统影响时间. 项目完成早先时期,
都是要做质量测试和质量优化的, 优化的时候, 数据库那块是三个大头.

  •   左外连接       ->用前边的表连接前面包车型大巴表
  •   右外接连       ->
  •        全外连接       ->

   (一)便是在查询的where子句中的判别凭借是另3个询问的结果,如此就组成了一个表面包车型客车查询和二个里头的询问,这么些里面包车型客车询问便是自己检查询。

Server高端内容之子查询和表链接,查询之提到查询。sql格式: select 列名/* from 表名 where 条件 group by 列 having 条件
order by 列 asc/desc;

  1. 左连接

   (二)自己检查询的分类

此间牵涉到叁个询问推行各样的标题. 

  用后面包车型的士表(表1)连接后边的表(表二),表壹的富有因素都会被搜查捕获,连接不到表二的为null

  1)独立子查询

单表查询实践顺序: 

--count(null)会自动排出掉
select emp.id,COUNT(ord.id) from employee emp left 
join orders ord on emp.id=ord.emp_id
group by emp.id

     ->独立单值(标量)子查询  (=)

select sex, count(Sex) as count from tch_teacher where id > 15 group by Sex having count > 5 order by Sex asc limit 1;

 

 1 Select
 2 
 3     testID,stuID,testBase,testBeyond,testPro 
 4 
 5 from Score
 6 
 7     where stuID=(
 8     
 9         select stuID from Student where stuName=’Kencery’
10 
11        )

一-> from 表 :
首先获得表tch_teacher

select * from room_type rp
left join room r
on r.type_num=rp.num

   ->独立多值子查询  (in)

二-> where 条件 : 根据where后边的准绳筛选一遍数据集结A

997755.com澳门葡京 1

 1 Select
 2 
 3     testID,stuID,testBase,testBeyond,testPro 
 4 
 5 from Score
 6 
 7     where stuID in(
 8 
 9         select stuID from Student where stuName=’Kencery’
10 
11     )

三-> group by 分组 : 对筛选出的数据A, 遵照group by前边的列实行分组,
获得数码集B

 

   二)相关子查询

四-> having 筛选 : 对数码集B进行更进一步筛选, 获得数码集C

   (3)写子查询的注意事项

5-> select 数据 : 这里有4步

  1)子查询用几个圆括号阔气,有不可缺少的时候供给为表取小名,使用“as 名字”就可以。

                         第贰步 : 根据select前面包车型地铁列名,
去数据集C中取数据. 得到数码集D

2.表连接\

                         第一步 :
对数据集D中的数据开展去重操作(这一步是树立在 sql中有distinct 情形下),
得到数码集E

  (一)表链接就是将两个表合成为一个表,不过不是向union一样做结果集的汇合操作,可是表链接能够将分裂的表合并,并且共享字段。

                         第叁步 : 对数码集E进行排序操作, 获得数码集F

  (2)表连接之交叉连接 (cross join)

                         第4步 : 对数据集F举行截取数据操作,
得到终极的数据集(实行 limit 十 操作)

    一)创设两张表

 在多表的时候, 优化器在优化的时候, 会有个别不一样, 某些地方,
会用到where条件, 然后才连表

 1  use Test
 2 
 3 go
 4 
 5 create table testNum1
 6 
 7 (
 8 
 9     Num1 int
10 
11 );
12 
13 create table testNum2
14 
15 (
16 
17     Num2 int
18 
19 );
20 
21 insert into testNum1 values(1),(2),(3)
22 
23 insert into testNum2 values(4),(5)

 

    2) 执行交叉连接的SQL语句

壹、连表查询

      select * from testNum1 cross join testNum2

  1. 6续连接 — 笛Carl乘积  cross join

    select * from tch_teacher cross join tch_contact

    3)注解

这种连接格局, 没见人用过.
 假设tch_teacher,tch_contact表各有十条数据, 那么连接的结果, 正是 10 x
拾 = 十0 条数据. 

      交叉连接就是将首先张表中的有着数据与第二张表中的全数数据挨个匹配三回,构成二个新表。

997755.com澳门葡京 2

    4)自交叉的兑现

在mysql 中, cross join 前边是能够跟 on 和 where 的, 加上之后, 其实跟
inner join 是一致的

      推行插入SQL语句:

 

      insert into testNum1 values(4),(5),(6),(7),(8),(9),(0)

  1. 内连接 — inner join 

      施行自交叉的SQL语句:

内一连在不加on的动静下, 也是去求笛卡尔乘积. 不加on的用法并不引入使用,
轻松导致内部存款和储蓄器溢出的情状. 加on的时候, 在连表的时候, 就能够对数据开始展览筛选,
以此来裁减有效数据范围

      select t1.num1,t2.num2 from testNum1 as t1 cross join testNum2 as t2

select * from tch_teacher inner join tch_contact 

    伍)别的一种写法:

 997755.com澳门葡京 3

      select * from testNum一,testNum二不提倡使用,首先是有比较新的语法,缺陷是逗号不显明,并且那几个语法与内连接和外连接都足以行使,若是选拔join注明,那么语法错误的时候能够报错,不过使用这一个语法,大概因为一些语法的一无可取,会被SQL Server解释为交叉连接而跳过这一个语法的检讨

从地方的sql和图纸来看, inner join 的时候, 能够不加on, 也能博取一个结出,
而且那个结果和交叉连接的结果是同样的. 

   (3)表连接之内连接

 这里还有其余二种写法:

     1)内链接是在六续连接的根基之上增加三个约束标准

select * from tch_teacher,tch_contact

select * from tch_teacher join tch_contact

     2)语法:select * from 表1 inner join 表2 on 表1.字段=表2.字段

获得的结果是同1的. 

 1 Select  s1.stuID,
 2 
 3     s1.stuName,
 4 
 5     s1.stuSex,
 6 
 7     s2.testBase,
 8 
 9     s2.testBeyond 
10 
11         from Student as s1
12 
13     inner join Score as s2
14 
15         on s1.stuID=s2.stuID
16 
17     where s1.stuIsDel=0;

 

   (四)表连接之外连接

  1. 外连接 — left/right join on 

     一)实施下边包车型地铁SQL语句

那边笔者特意加了1个on在上头, 因为不加on是会报错的.

 1 create table tblMain
 2 
 3 (
 4 
 5     ID int,
 6 
 7     name nvarchar(20),
 8 
 9     fid int
10 
11 );
12 
13 create table tblOther
14 
15 (
16 
17     ID int,
18 
19     name nvarchar(20)
20 
21 )
22 
23 insert into tblMain values(1,'张三',1),(2,'李四',2)
24 
25 insert into tblOther values(1,'C++'),(2,'.net'),(3,'java')
26 
27 select * from 
28 
29     tblMain as t1
30 
31        inner join 
32 
33     tblOther as t2
34 
35         on 
36 
37     t1.fid=t2.id 

left join 称之为左连接, 连接以右边手表数据为准,
当右表未有数据与之同盟的时候, 则会用null填补

 

right join 称之为右连接, 与 left join 相反, 这一个是以右表为准

     二)在内连接的功底之上,在做一件事儿,就是将tblOther中的Java也出示出来,那时候就要动用到外接连,外接连有左外连接和右外连接。

先看下效果啊

     三)左连接和右连接有啥不相同吗??差异便是**连天正是以**表为主表,在内连接的底子之上,将尚未数据的那张表的消息或然要显得出来供用户查看,那么那个主表就是要来得的那张表。左外连接和右外连接的独家是在前面包车型地铁那张表便是左表,在末端的那张表就是右表,左连接使用left join ,有连续使用right join。

select * from tch_teacher left join tch_contact on tch_teacher.Id = tch_contact.TId;

     四)下边重新施行上边的SQL语句,就会议及展览示出tblOther表中的Java。

997755.com澳门葡京 4

1 select * from 
2 
3     tblMain as t1
4 
5         right join tblOther as t2
6 
7     on t1.fid=t2.id 
select * from tch_teacher right join tch_contact on tch_teacher.Id = tch_contact.TId;

 

997755.com澳门葡京 5

 

实际这里还有三个full join , 然而mysql里面包车型大巴full join, 着实有个别令人无语,
反正笔者没这么用过, 略过不表了.

 

此间本身做了1个小测试, 这里的数额, tch_contact的tid值,
小编取的是0~100000里面的即兴数

                              相信本人,你正是下三个有时候(Kencery)

select * from tch_teacher inner join tch_contact on tch_teacher.Id = tch_contact.TId ;

select * from tch_teacher LEFT join tch_contact on tch_teacher.Id = tch_contact.TId ;
tch_teacher tch_contact inner join(s) 结果 left join(s) 结果
十万 十万 0.499 99999 0.526 137017
十万+5000 十万 0.345 99999 0.565 142017
十万-5000 十万 0.472 94949 0.534 130124

那中间的值, 是本身多次运维之后, 在局地离散值里面, 获得相比较接近中央点的值.

 

  1. 友善连友好

mysql里面, 有一个相比较好用的功效, 正是温馨连自身.
作者再tch_teacher表里面参预1列, CreateBy,  存放的是那些表的Id值

select a.*, b.Name as CreateByName from tch_teacher a
left join tch_teacher b on a.createby = b.id

能获得以下结果:

997755.com澳门葡京 6

 

 二、union查询

除去把多少个表经过中间关系拼成3个表结果, 还足以,
把多少个表的查询表结果拼成三个表结果. 所运用的格局正是union.

那边要留意的是, 列的顺序. 借使害怕列的顺序不1致不好排查,
能够把表结果的列名都重命名称叫一样的.

select Id, Sex, BId, `No`, Name, CreateDate from tch_teacher

union

select 0 as Id, Sex, BId, `No`, Name, CreateDate from tch_teacher_temp

union是会对终极的表结果实行去重操作的, 借使笔者不想去重,
只想神速得到拼接的结果, 能够利用 union all 来拼接. 

997755.com澳门葡京 , 

参考:

Mysql架构总览

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website