MySQL——连接查询与子查询

一、连接查询

单表查询:在一张表当中查询数据,叫做单表查询。

连接查询,结合俩(多)张表,在俩张(多)表当中查询数据,在一张表当中查询一部分,在另一张表当中查询另一部分数据,这种跨表查询,连接多张表查询数据的方法叫做连接查询!

连接查询分为:SQL92语法,SQL99语法。目前主流使用SQL99语法。

SQL92 的语法 结构更加的粗糙,语法结构不清晰 表连接的判断和其他条件都放在了where 后面,非常的混乱。select.....from .....where....

SQL99的语法结构清晰,某一个表和另一个表连接用 join, 然后判断条件放在on 的后面。select.....from......inner join.....on.....inner join....on....where.....(inner 可以省略,但加上语法结构更清晰)

笛卡尔积现象:

当连接俩张表进行查询的时候,如果没有任何限制的情况下,查询的次数为两张表所有记录的乘积!

这个时候内外连接的限制条件的作用就体现出来了!

1、内连接:

等值连接:查询结果是由where 条件的等号来 决定的

上面虽然查询出来想要的结果,但是查询次数依旧没有减少,只是筛选出来了而已。同时我们也知道在今后连接的表的数量越少越好,否则会使效率降低!

非等值连接:

自连接:一张表当做两张表来解决。

2、外连接(right/left + outer[outer可以省略]):

内连接与外连接的区别:内连接没有主次关系,两(多)张表是平级的,而外连接有主次关系,主要是查什么,其次是查什么!

左外连接(left): 表示join关键字左边的表是主表,主要是查出左边表的数据,顺带将右边的表的数据也查出来。

右外连接(right):表示join关键字右边的表是主表,主要是查出右边表的数据,顺带将左边的表的数据也查出来。

总结:外连接的查询次数 >= 内连接的查询次数。

多表连查:

使用select .....from ......join....on......join....on.....where.....group by .......having........order by .......

例如查:找出每个员工的部门名称和工资等级,上级领导,显示出员工名字,领导名,部门名,工资,工资等级。

select e.ename,d.dname,n.ename as '上级',e.sal,s.grade from emp e join dept d on e.deptno = d.deptno left join emp n on e.mgr = n.empno join salgrade s on e.sal between s.losal and s.hisal;

三、全连接(用的很少)


二、子查询

子查询:select 语句当中嵌套select语句,被嵌套的select语句被称为子查询。

子查询语句可以放在select ,from ,where 后面。

where子句中出现子查询:

例如:查询员工当中大于800元的员工姓名和工资

from 子句当中出现子查询:

注意:from 当中的子查询,可以把子查询当中查出来的东西当中一张临时表。

例如:找出每个岗位的平均工资的薪资等级?

select t.*,s.grade from (select job,avg(sal) as avgsal from emp group by job) t join salgrade s on t.avgsal between s.losal and s.hisal;

select t.*,s.grade from (select ename,avg(sal) as avgsal from emp) t join salgrade s on t.avgsal between s.losal and s.hisal;

select 子句当中的出现的子查询:

查询每个员工的部门名称,要求显示部门名和员工名?

select e.ename,e.deptno,(select dname from dept join emp on emp.deptno = dept.deptno) from emp e;

注意:select后的子查询返回的结果只能是返回一条,当多余一条的时候,就会报错!!!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
MySQL 子查询和多表关联是两种不同的查询技术,用于在查询数据时处理复杂的条件和关系。 子查询是指在一个查询中嵌套另一个查询,内部查询的结果会作为外部查询的条件之一。子查询可以在 SELECT、FROM、WHERE 和 HAVING 子句中使用。例如,你可以使用子查询来获取满足某个条件的记录,然后将其用作外部查询的条件或结果集。 下面是一个使用子查询的示例,假设你有两个表:Customers 和 Orders。你想要获取所有在某个城市下单的顾客信息,可以使用子查询来实现: ``` SELECT * FROM Customers WHERE CustomerID IN (SELECT CustomerID FROM Orders WHERE City = 'New York'); ``` 多表关联用于将多个表相关联起来,以便在查询中使用这些表的字段。通过指定连接条件,你可以根据共同的值将多个表连接在一起。常见的多表关联类型包括内连接、左连接、右连接和全连接。 下面是一个使用多表关联的示例,假设你有两个表:Customers 和 Orders。你想要获取所有顾客及其对应的订单信息,可以使用多表关联来实现: ``` SELECT Customers.CustomerName, Orders.OrderID FROM Customers JOIN Orders ON Customers.CustomerID = Orders.CustomerID; ``` 在这个示例中,我们使用了 INNER JOIN 来连接两个表,并通过 Customers.CustomerID 和 Orders.CustomerID 这两个字段进行关联。 总而言之,子查询和多表关联是在 MySQL 中处理复杂查询的强大工具。它们可以根据具体需求选择使用,以实现所需的查询功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT~郑小菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值