

select * from emp, dept
SELECT * FROM dept, empWHERE emp.deptno = dept.deptno
有一个小技巧:多表查询的条件(where引导的)不能少于(表的个数-1) ,否则会出现笛卡尔集
还有一点需要注意,我们的条件中语句的表达方式 WHERE emp.deptno = dept.deptno

-- 如何显示部门号为 10 的部门名、员工名和工资SELECT ename,sal,dname,emp.deptno FROM dept, empWHERE emp.deptno = dept.deptno AND emp.deptno =10

-- 显示各个员工的姓名,工资,及其工资的级别-- 方法一: between and 引导SELECT *FROM emp, salgradeWHERE sal BETWEEN losal AND hisal-- 方法二:SELECT *FROM emp, salgradeWHERE losal < sal AND sal < hisal

SELECT*FROM emp, empSELECT *FROM emp AS worker, emp AS boss

-- 思考题:显示公司员工和他的上级的名字SELECT worker.ename AS '员工名', boss.ename AS '上级名'FROM emp AS worker, emp AS bossWHERE worker.mgr = boss.empno

单行子查询指,只返回「一行一列」这一个值的子查询。注意与后面多行子查询进行区分,多行子查询返回「多行一列」。思考下面这一个例子:如何显示与smith同一部门的所有员工?思路分解如下:
先查询到smith的部门号
把上面的select语句当成一个子查询来使用
SELECT deptnoFROM empWHERE ename = 'SMITH'

SELECT *FROM empWHERE deptno = 20

SELECT *FROM empWHERE deptno = (SELECT deptnoFROM empWHERE ename = 'SMITH')
多行子查询,就是子查询会返回「多行、但只有一列」的结果,相当于得到一个值列表,主查询不能用 => 直接比较,必须搭配 IN / ANY / ALL 来使用。
如何查询和部门10的员工工作相同的雇员的
名字、岗位、工资、部门号,但是不含10号部门自己的员工信息
SELECT ename, job, sal, deptnoFROM empWHERE job IN (SELECT DISTINCT jobFROM empWHERE deptno = 10) AND deptno != 10


子查询当作临时表,专业叫法是表子查询 / 派生表,核心就一句话:把一个查询的结果,当成一张临时存在的小表,放在 FROM 后面,再对这张 “临时表” 做二次查询。
具体任务:查询emp表中各部门中,工资最高的员工。思路分解:
SELECT deptno, MAX(sal)FROM empGROUP BY deptno
SELECT enameFROM (SELECT deptno, MAX(sal) AS hisalFROM empGROUP BY deptno) AS temp_tab, empWHERE emp.deptno=temp_tab.deptnoAND emp.sal = temp_tab.hisal

SELECT deptno, ename,MAX(sal)FROM empGROUP BY deptno


GROUP BY 的核心规则,这个写法✅ 是「非标准、错误的写法」✅ 查询出的 ename 绝对不是 MAX(sal) 对应的数据行的名字✅ 这在大多数数据库中直接报错,仅 MySQL 旧模式会乱返回一个值,这里返回的是原数据库的第一个值。SELECT 后面的列,只能是两种:一是GROUP BY 后面的分组列(这里是 deptno)MAX(sal))而 ename 既不是分组列,也没有用聚合函数 → 违反 SQL 标准!学废了
在多行子查询中使用all操作符。思考1:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
-- 方法一,使用all,就是比其中所有的都比较SELECT ename,sal,deptnoFROM empWHERE sal> ALL(SELECT salFROM empWHERE deptno = 30)
-- 方法二:使用max,只要比其中的最大值高就可以SELECT ename,sal,deptnoFROM empWHERE sal> (SELECT max(sal)FROM empWHERE deptno = 30)
思考2:显示工资比部门30中任何一个员工的工资都高的员工的姓名、工资和部门号
-- 方法一,使用ANY,就是比其中任意一个进行比较SELECT ename,sal,deptnoFROM empWHERE sal> ANY(SELECT salFROM empWHERE deptno = 30)
-- 方法二,使用min,就是和其中最小的那个进行比较SELECT ename,sal,deptnoFROM empWHERE sal> (SELECT min(sal)FROM empWHERE deptno = 30)
(二)多列子查询
思考3:如何查询与smith的部门和岗位完全相同的所有雇员,且不含他本人(字段1,字段2,...)=(select 字段1,字段2 from ...)
-- 分析1.先得到allen的部门和岗位SELECT deptno, jobFROM empWHERE ename = 'allen'-- 分析2.把上面的查询当成子查询来使用,-- 并且使用多列子查询语法进行匹配SELECT *FROM empWHERE (deptno, job)=(SELECT deptno, jobFROM empWHERE ename = 'allen') AND ename != 'allen'
