**MySQL多表查询(笛卡尔集)**
SELECT * FROM emp
可以看到emp表中共有13条记录和8个字段,用同样的方式查看一下dept表和salgrade表
SELECT * FROM salgrade SELECT * FROM dept
4.现在我们试着一起查询查询emp和dept表
SELECT * FROM emp,dept
我们发现记录变成了52行,字段变成了13个而且显示在一张表里面了,这是怎么回事呢,我们仔细观察,发现emp表中的每一条员工记录(每一行)都和dept表中所有行都拼接了一次 即13*4=52,结果正好是52条记录,由此我们引出概念 取第一张表的每一行记录和第二张表所有的记录拼接,返回的结果就含有两张表的所有字段
5.那我们试着做一道题:显示雇员名 ,雇员工资以及所在部门的部门名称
分析一下,雇员名字段和雇员工资字段分别是ename,sal ,都在emp表中,但是部门名字段dname在dept表中,不在同一表中,这时候我们该怎么办呢,我的答案是找相同的地方,发现都有deptno这个字段
SELECT ename,sal,dname FROM emp,dept WHERE emp.`deptno` =dept.`deptno`
命令的前半段很好理解,要我们找什么字段,我们都写出来就行,但where条件是什么意思呢,这就是找相同的地方了,再用表名.出来就可以了。结果如下:
6.那我们想要把deptno字段显示出来该怎么办呢
思考一下这样写可以吗
SELECT ename,sal,dname,deptno FROM emp,dept WHERE emp.`deptno` =dept.`deptno`
我们发现报错了
Column ‘deptno’ in field list is ambiguous 它说字段列表中的“deptno”列不明确,这什么意思啊,是不是说系统不知道我们要显示哪个表中的deptno啊,那我们加上限制条件呢
SELECT ename,sal,dname,emp.`deptno` FROM emp,dept WHERE emp.`deptno` =dept.`deptno`
我们发现这样就可以了
7.简单了解后我们再做几道题
如何显示部门号是10的部门名,员工名,工资
分析一下 :这道题加了个条件,明确部门号是10,该怎么写呢 很简单我们也加个条件不就好咯
SELECT dname,ename,sal FROM emp,dept WHERE dept.`deptno`=emp.`deptno` AND emp.`deptno`=10
8.若两张表没有相同的部分该怎么办呢,比如下面一题
显示每个员工的姓名,工资,及其工资的级别
emp表和salgrade表没有重复的字段啊,但是salgrade表是不是对emp中sal子段操作的一张表啊,那这道题就很简单了
SELECT ename ,sal ,grade FROM emp,salgrade WHERE sal BETWEEN losal AND hisal
9.再补充一题让大家多多体会多表查询
显示雇员名,雇员工资以及所在部门的名字,并按部门排降序
命令如下
SELECT ename,sal,dname,emp.`deptno` FROM emp,dept WHERE emp.`deptno`=dept.`deptno` ORDER BY emp.`deptno` DESC
补充 :我在b站韩顺平老师那学的。