本次博客带领大家学习mysql数据库中的多表查询。
多表查询是指基于两个和两个以上的表查询,在实际应用中,查询单个表可能不能满足你的需求。
多表查询练习:
SELECT ename,sal,dname FROM emp,dept WHERE emp.deptno = dept.deptno;
SELECT dname,ename,sal FROM emp,dept WHERE emp.deptno = dept.deptno AND emp.deptno=10;
SELECT ename,sal,grade FROM emp , salgrade WHERE sal>=losal AND sal<= hisal;
SELECT ename,sal,grade FROM emp , salgrade WHERE sal BETWEEN losal AND hisal;
SELECT worker.ename 职员名,boss.ename 上级名
FROM emp worker, emp boss
WHERE worker.mgr = boss.empno;
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。
单行子查询是指只返回一行数据的子查询语句。
SELECT * FROM emp WHERE deptno = (SELECT deptno FROM emp WHERE ename = 'SMITH');
多行子查询:多行子查询指返回多行数据的子查询,使用关键字in。
SELECT ename,job,sal,deptno FROM emp WHERE job IN (
SELECT DISTINCT job
FROM emp
WHERE deptno = 10) AND deptno != 10;
子查询可以当做临时表使用。
SELECT empno,emp.deptno,ename,sal FROM (
SELECT deptno ,MAX(sal) max_sal FROM emp GROUP BY deptno) temp,emp
WHERE emp.deptno = temp.deptno AND emp.sal = temp.max_sal;
在多行子查询中使用all操作符。
SELECT ename,sal,deptno
FROM emp
WHERE sal > ALL(
SELECT sal FROM emp WHERE deptno = 30);
在多行子查询中使用any操作符。
SELECT ename,sal,deptno
FROM emp
WHERE sal > ANY(
SELECT sal FROM emp WHERE deptno = 30);
多列子查询则是指查询返回多个列数据的子查询语句。
SELECT * FROM emp WHERE (deptno , job) = (
SELECT deptno , job FROM emp WHERE ename = 'allen')
AND ename !='allen';
SELECT ename,sal,temp.avg_sal,emp.deptno FROM emp,(
SELECT AVG(sal) avg_sal,deptno FROM emp GROUP BY deptno) temp
WHERE emp.deptno = temp.deptno AND emp.sal > temp.avg_sal;
SELECT * FROM (
SELECT deptno,MAX(sal) max_sal FROM emp GROUP BY deptno) temp,emp
WHERE temp.deptno = emp.deptno AND emp.sal = temp.max_sal;
SELECT dname,dept.deptno,loc,temp.per_num FROM dept,(
SELECT COUNT(*) per_num, deptno FROM emp GROUP BY deptno) temp
WHERE dept.deptno = temp.deptno
CREATE TABLE my_tab01 (
id INT,
`name` VARCHAR(32),
sal DOUBLE,
job VARCHAR(32),
deptno INT);
DESC my_tab01;
SELECT * FROM my_tab01;
-- 演示如何自我复制
-- 1. 先把emp表的记录复制到my_tab01
INSERT INTO my_tab01 (id,`name`,sal,job,deptno)
SELECT empno ,ename, sal,job,deptno FROM emp;
-- 2. 自我复制
INSERT INTO my_tab01 SELECT * FROM my_tab01;
-- 如何删除掉一张表重复记录。
-- 1. 先创建一张表 my_tab02
-- 2. 让 my_tab02 有重复的记录。
CREATE TABLE my_tab02 LIKE emp;
INSERT INTO my_tab02 SELECT * FROM emp;
SELECT * FROM my_tab02;
-- 3.考虑去重
-- (1) 先创建一个临时表 my_tmp, 该表的结构和 my_tab02 一样。
CREATE TABLE my_tmp LIKE my_tab02;
-- (2) 把my_tab02的记录 通过distinct 关键字 处理后把 记录复制到 my_tmp;
INSERT INTO my_tmp SELECT DISTINCT * FROM my_tab02;
SELECT * FROM my_tmp;
-- (3) 清除掉 my_tab02 记录
DELETE FROM my_tab02;
-- (4) 把my_tmp 表的记录复制到 my_tab02
INSERT INTO my_tab02 SELECT * FROM my_tmp;
-- (5) drop 掉 临时表my_tmp
DROP TABLE my_tmp;
SELECT ename,sal,job FROM emp WHERE sal>2500
UNION ALL
SELECT ename,sal,job FROM emp WHERE job='MANAGER';
SELECT ename,sal,job FROM emp WHERE sal>2500
UNION
SELECT ename,sal,job FROM emp WHERE job='MANAGER';
基本语法:select .. from 表1 left join 表2 on 条件
基本语法:select .. from 表1 right join 表2 on 条件
CREATE TABLE stu(
id INT,
`name` VARCHAR(32));
INSERT INTO stu VALUES(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
SELECT * FROM stu
CREATE TABLE exam(
id INT,
grade INT);
INSERT INTO exam VALUES(1,56),(2,76),(11,8);
SELECT * FROM exam;
SELECT `name`,stu.id,grade
FROM stu RIGHT JOIN exam
ON stu.id=exam.id;
SELECT `name`,stu.id,grade
FROM stu RIGHT JOIN exam
ON stu.id=exam.id;
列出部门名称和这些部门的员工信息(名字和工作),同时列出那些没有员工的部门名。
SELECT dept.dname,ename,job,emp.deptno
FROM dept LEFT JOIN emp
ON emp.deptno = dept.deptno;
SELECT dept.dname,ename,job,emp.deptno
FROM emp RIGHT JOIN dept
ON emp.deptno = dept.deptno;