MySQL2-多表查询、子查询、union、limit机制

一、多表查询
在实际开发中,大部分情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的结果。一般一个业务都会对应多张表。
1.表的连接方式的分类
内连接:等值连接、非等值连接、自连接
外连接:左外连接(又称左连接)、右外连接(又称右连接)
全连接:(很少用,不介绍)
2.笛卡尔积连接
示例:
员工表emp(员工编号EMPNO,员工姓名ENAME,员工职位JOB,MGR上级领导编号,入职时间HIREDATE,工资SAL,津贴COMM,所属部门编号DEPTNO):
在这里插入图片描述
部门表dept(部门编号DEPTNO,部门名称DNAME,部门位置LOC):
在这里插入图片描述
select ename,dname from emp,dept;
上述sql语句emp表与dept表进行笛卡尔积连接,结果为56条记录(4*14)。
表的别名
select e.ename,d.dname from emp e,dept d;//emp表的别名为e,dept表的别名为d,使用表的别名是为了在select时区分不同表的同名字段
3.避免笛卡尔积现象
避免笛卡尔积现象的方法是加条件进行过滤,但是要注意,加条件进行过滤不会减少记录的匹配次数,只不过显示的是有效记录(即最开始的连接还是笛卡尔积连接,再在笛卡尔积连接的基础上进行过滤)。
在这里插入图片描述
说明:上述sql语法是sql92版本,现在很少使用。
4.内连接之等值连接
最大的特点是条件是等值关系。
语法:… <表A > join <表B> on <连接条件> where …(sql99语法)
示例:
在这里插入图片描述
上例中的sql语句也可以写为:select e.ename,d.dname from emp e join dept d on e.depton = d.deptno;
说明:(1)shang述sql语句省略了inner,即“select e.ename,d.dname from emp e join dept d on e.depton = d.deptno;”等价于“select e.ename,d.dname from emp e innner join dept d on e.depton = d.deptno;"。
(2)可以看出sql99语法的结构更清晰,把“表的连接条件”与“连接后的筛选条件(where)”区分开。
5.内连接之非等值连接
特点是连接条件是非等量关系。
工资等级表salgrade(GRADE工资等级,LOSAL该等级工资下限,HISAL该等级工资上限):
在这里插入图片描述
员工表emp(员工编号EMPNO,员工姓名ENAME,员工职位JOB,MGR,入职时间HIREDATE,工资SAL,津贴COMM,所属部门编号DEPTNO):
在这里插入图片描述
在这里插入图片描述
实现的sql语句为:
在这里插入图片描述
可以看出非等值连接就是连接条件不为等式的内连接。
6.内连接之自连接
特点是一张表看作两张表,自己连自己。
示例:
员工表emp(员工编号EMPNO,员工姓名ENAME,员工职位JOB,MGR上级领导编号,入职时间HIREDATE,工资SAL,津贴COMM,所属部门编号DEPTNO):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结:可以看出,自连接适用于一个表的两个字段属于同一类,两个字段之间具有一定的关联,这种关联有些类似于表之间的外键。
7.外连接
内连接:表A和表B进行连接,使用内连接,凡是A表与B表能够匹配上的记录查询出来,A、B两张表没有主副之分,两张表是平等的。
外连接:假设A和B进行连接,使用外连接,A、B两张表中有一张是主表,有一张是副表。主要查询主表中的数据,另外带上查询副表。当副表中的数据没有和主表中的数据匹配上,副表自动模拟出null与之匹配。即外连接的特点是主表的数据无条件的全部查询出来。
左外连接(左连接):表示左边的表是主表。
右外连接(右连接):表示右边的表是主表。
在这里插入图片描述
可以看出,如果使用内连接的自连接,上图中的empno为7839的记录会被去除,因为mgr无法匹配。这里需要使用外连接。
使用左外连接:
在这里插入图片描述
等价于:
在这里插入图片描述
说明:任何一个左外连接都有一个对应的右外连接写法。left和right后省略了outer,outer可写可不写。
8.三张以上表连接查询
案例:找出每一个员工的部门名称以及工资等级。
员工表emp(员工编号EMPNO,员工姓名ENAME,工资SAL,所属部门编号DEPTNO)
在这里插入图片描述
部门表dept:
在这里插入图片描述
工资等级表salgrade(GRADE工资等级,LOSAL该等级工资下限,HISAL该等级工资上限):
在这里插入图片描述
执行的sql语句为:
在这里插入图片描述
再例:
在这里插入图片描述
二、子查询(这里举的例子参考上面例子中出现的表)
子查询就是select语句中嵌套了select语句,被嵌套的select语句是子查询。子查询可以出现的位置:
select …<select子句>
from …<select子句>
where …<select子句>
1.where后嵌套select语句
员工表emp(员工编号EMPNO,员工姓名ENAME,工资SAL,所属部门编号DEPTNO)
在这里插入图片描述
在这里插入图片描述
使用子查询:
在这里插入图片描述
2.from后嵌套select子查询
员工表emp(员工编号EMPNO,员工姓名ENAME,工资SAL,所属部门编号DEPTNO)
在这里插入图片描述
工资等级表salgrade(GRADE工资等级,LOSAL该等级工资下限,HISAL该等级工资上限):
在这里插入图片描述
在这里插入图片描述
使用嵌套子查询:
在这里插入图片描述
3.select后嵌套子查询
在这里插入图片描述
另一种方式是在select后嵌套子查询(能看懂就行):
在这里插入图片描述
解释:如果内层子查询不依赖外层子查询,称为不相关嵌套查询,可由内向外逐层处理,也就是每个内层子查询在上一层查询处理之前求解,内层子查询的结果用于建立其外层查询。如果内层查询依赖于外层查询称为相关嵌套查询,对于外层查询结果的每一行根据它与内层查村相关的列值处理内层查询。
三、union(将查询结果集相加)
在这里插入图片描述
在这里插入图片描述
注意:union的结果union前面的子句的查询结果排在前面,union后面的子句的查询结果排在后面。
除此之外,unon可以处理or和in子句不能处理的情况,即将两张不相关的表的查询结果拼在一起:
在这里插入图片描述
注意:union连接的两个查询结果的列数需相同。
四、limit(limit是mysql特有的,其他数据库中没有,不通用;Oracle中有一个相同的机制,叫做rownum)
limit机制很重要,是分页机制的基础。
limit取结果集中的部分数据。
语法机制:limit startIndex, length
startIndex表示起始位置,length表示取几个。如果只写了一个数字,则表示length,startIndex默认为0。
在这里插入图片描述
注意:limit是select语句最后执行(在order by之后)的环节。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习MySQL单表查询多表查询时,可以按照以下实验步骤进行: 1. 准备数据库和表:首先,创建一个数据库,并在其中创建需要的表用于实验。可以使用MySQL的命令行工具或图形化界面工具(如phpMyAdmin)进行创建。 2. 插入测试数据:在创建的表中插入一些测试数据,用于后续的查询操作。确保数据量足够,能够涵盖各种查询场景。 3. 单表查询实验: - 使用SELECT语句,检索整个表中的数据。 - 使用WHERE子句,根据条件筛选数据。 - 使用ORDER BY子句,按照特定的列对结果进行排序。 - 使用LIMIT子句,限制返回的记录数量。 - 使用聚合函数(如COUNT、SUM、AVG)和GROUP BY子句,进行分组查询和统计操作。 - 使用子查询,嵌套其他查询语句进行更复杂的筛选和查询操作。 4. 多表查询实验: - 使用INNER JOIN操作,连接两个表,并检索相关联的数据。 - 使用ON条件,指定连接两个表的关联条件。 - 尝试使用LEFT JOIN、RIGHT JOIN和FULL JOIN等其他类型的JOIN操作。 - 使用别名为表和列指定简化的名称。 - 实践使用子查询进行多表查询和相关操作。 5. 组合查询实验:尝试将单表查询多表查询结合起来,构建更复杂的查询语句。使用UNIONUNION ALL、INTERSECT和EXCEPT等操作符进行数据集合操作。 6. 进行性能测试和优化:对实验过程中的查询语句进行性能测试,并尝试优化查询性能,如添加索引、调整JOIN操作顺序等。 7. 总结和复习:对实验过程中的查询语句和结果进行总结和复习,思考不同查询方式的适用场景和优缺点。 通过以上实验步骤,你可以在实践中掌握MySQL单表查询多表查询的基本技能。不断练习和尝试不同的查询场景,将帮助你深入理解查询语句的语法和用法,并提升你在MySQL查询方面的技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值