简单测试
由于我们之前没学过多表查询
我们简单测试一下初学者认为的多表查询
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连接