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连接