Mysql之多表查询

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

简单测试

由于我们之前没学过多表查询
我们简单测试一下初学者认为的多表查询

SELECT * FROM emp,dept

在这里插入图片描述
这是我们的输出结果
其实不难发现
1.返回的结果就是第一张表一个个数据取出然后和第二张表所有组合
最后返回的是含有两张表的所有列
2.一共返回的记录数=第一章表行数*第二张表的行数
3.这样表查询默认返回的结果成为笛卡尔集
4.关键就是怎么去筛选返回的数据比如WHERE

这里就是我们需要获取部门名和工资但是不在同一张表就用相关的数据做踏板进行跳进判断

筛选关键就是找两个表有联系/相同的数据或者说有效信息的特征比如这两个都有deptno可以用这个做条件
在这里插入图片描述
看这几行数据其实有效信息只有第二行也就是dept的deptno和emp的deptno相同的时候其他的deptno都不一样根本无效

需要分析

SELECT *
	FROM emp,dept
	WHERE emp.deptno = dept.deptno

这样就能筛选出我们需要的信息了
在这里插入图片描述

解决需求

在这里插入图片描述

-- 部门名和部员的工资,且不能差deptno因为两个表都有这一列
-- 不知道显示哪一列,可以写emp.deptno就是emp表里的了
SELECT ename,sal FROM dept,emp
	WHERE dept.`deptno` = emp.`deptno`

技巧至少要有n-1个筛选条件才可能使n个表的查询不出现笛卡尔集
2个表1个筛选条件可能是笛卡尔集也可能不是我们上面那个就不是不过你换个条件就是了因为两张表不是笛卡尔集一定需要那个条件

-- 显示部门名为10的部门名员工名和工资
SELECT ename,sal,dname,emp.`deptno`
	FROM emp,dept
	WHERE emp.`deptno`=dept.`deptno` AND emp.`deptno`=10
	-- 这个条件也是不能瞎写
-- 显示各个员工姓名工资和工资级别
-- 思路姓名工资来自emp
-- 工资级别来自salgrade表
SELECT ename,sal,grade 
	FROM emp,salgrade
	WHERE sal>losal AND hisal>sal 

一定要注意表达式的形式不要瞎写比如我刚开始就是写为hisal>sal>losal不能这样写按照编程规范写
最好是几个条件分开用AND连接

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: mysql

“Mysql之多表查询” 的相关文章