MySQL必备知识多表查询

多表查询

我们在查询表格的过程中,往往要将多个表组合查询使用,并且要实现多个表之间查询数据,例如,查询成绩,再将成绩和学生表连接起来
这个时候就要用到我们的多表查询了

交叉连接

不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积,有where子句,往往会先生成两个表行数乘积的数据表,然后才根据where条件从中选择
交叉连接的语法格式

select <表名1.属性名1>..., 
       <表名n.属性名n>..., 
       from <表名1>,<表名2> 
       where <条件表达式>;

这里有涉及到一个笛卡尔积的概念,也就是多个表中所有数据都相互匹配一次
两个集合X和Y,又称直积,即将所有可以匹配的行数据都匹配上了一次

内连接

交叉连接产生的笛卡尔积的产生的额外的判断和消耗,如果要查询比较大的数据的话查,询的效率相当低下,所以需求一个更高效的一个查询范式,内连接比交叉连接更省空间,并且效率更高
使用比较运算符,根据表中匹配的属性,列出与连接条件相匹配的数据,
内连接关键字: inner join on

select [表名1.属性名1,...][表名n.属性名n,...] 
        from [数据库名1.表名1] 
        inner join [数据库名2.表名2] 
        on 条件表达式;

外连接

外连接就是把内连接再进行筛选再添加进来,会保留一部分的数据又分为左外连接、右外连接和全外连接
1.左外连接(左连接)
是以左表为基准,显示左表查询字段所有记录,右表只显示和左表匹配的记录,没有匹配的用NULL代替。
关键字: left join

select [表名1.属性名1,...,表名n.属性名n.] 
      from <表名1> 
      left join <表名2> 
      on 条件表达式;

2.右外连接(右连接)
是以右表为基准,显示右表查询字段所有记录,左表只显示和右表匹配的记录,没有匹配的用NULL代替。
关键字: right join

select <表名1.属性名1,……,表名n.属性名n> 
       from <表名1> 
       right join <表名2> 
       on 条件表达式; 等于 
select 表名1.属性名1,……, 表名n.属性名n 
       from 表名2 
       left join 表名1 
       on 条件表达式;

3.全外连接(全连接)
全连接的左右表不做限制,显示全部数据,没有匹配的数据用NULL代替。
关键字: full join
注意: mysql 不支持全连接
使用左连接和右连接加上 union 合并实现全连接
取别名
在查询时可以给属性取别名,使得读取出的数据更直观。
语句:as

select <属性名> as <别名> from <表名> as <别名>;

其中语句as可以省略

合并的使用

1.合并: union
MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT语句会删除重复的数据。

select <单个属性> 
       from <表名称> 
       union select <单个属性> 
       from <表名称>;

2.合并查询结果
关键字
UNION 语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)
ALL: 可选,包含重复数据。
使用形式如下:

select <属性名> 
       FROM <表名> 
       union (all) select <列名称> 
       from <表名称>

用于合并多个select语句的结果,要求第一个sql语句返回的列与第二个sql语句返回的列相同
3.通过查询的结果集向表中插入数据

insert into <表名> select <数据> union all

利用左连接和右链接实现全连接

select1.属性1,2.属性2,..., 表n.属性n 
      from1 right join2 
union 
select1.属性1,2.属性2... 表n.属性n 
       from <1> left join2

这里有用到union连接两个查询语句来实现全连接。

多表联查

可以连接查询多个表中的数据(一般最好不要超过4个表)
一般格式:

select <表名1.属性名1,……,表名n.属性名n> 
        from <表名1> 
        inner join <表名2> on <条件表达式> 
        inner join <表名3> on <条件表达式> 
        left join <表名n> on <条件表达式> 
        right join ......

多表联查的两种格式的区别及表取别名的使用:

##将员工和部门已经薪资都查询出来 
select e.e_name as 姓名,enter_date as 入职日期,d_name as 部门, 
s_number as 薪资,m_name as 职位 
from employee_tb as e 
inner join department_tb as d on e.department_id=d.d_id 
inner join salary_tb as s on s.employee_id=e.e_id 
left join management_tb as m on m.employee_id=e.e_id;

总结

  • 交叉连接
    交叉连接连接的效率过低,不推荐使用(会产生n1*n2)
  • 内连接
    找到两张表相符合条件的数据,进行筛选连接
  • 外连接
    外连接会保留一张表的数据,将另外一张表的数据进行条件筛选连接,没有符合连接条件将另外一张表用null填充
  • 多表连接
    连续使用多个 inner join 进行连接
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章