## 一、聚合函数 #### 1、MAX()与MIN() 功能:返回某列的最大、最小值。 ##### 查询入职日期最早和最晚的日期 ```sql SELECT MAX(emp.hiredate) '最早日期',MIN(emp.hiredate) '最晚日期' FROM emp; ``` ##### 查找员工表中最高和最低的薪资 ```sql SELECT MAX(emp.sal) '最高薪资',MIN(emp.sal) '最低薪资' FROM emp; ``` ##### 查找最大的员工编号 ```sql SELECT MAX(emp.EMPno) '最大编号' FROM emp; ``` ##### 查找员工表中的最高津贴 ```sql SELECT MAX(emp.comm) '最高津贴' FROM emp; ``` #### 2、SUM()与AVG() 功能:返回某列的值总和与平均值。 ##### 查询职位以SALES开头的所有员工平均工资、最低工资、最高薪资、工资和 ```sql SELECT AVG(emp.sal),MIN(emp.sal),MAX(emp.sal),SUM(emp.sal) FROM emp WHERE emp.job LIKE 'SALES%'; ``` ##### 查询部门编号为10的所有员工的最大薪资,最小薪资,薪资总和,平均薪资 ```sql SELECT MAX(emp.sal),MIN(emp.sal),SUM(emp.sal),AVG(emp.sal) FROM emp WHERE emp.DEPTno=10; ``` ##### 查询部门编号不为10的所有员工的最大薪资,最小薪资,薪资总和,平均薪资 ```sql SELECT MAX(emp.sal),MIN(emp.sal),SUM(emp.sal),AVG(emp.sal) FROM emp WHERE emp.DEPTno<>10; ``` ##### 查询津贴不为空的所有人的最大津贴,最小津贴,平均津贴,津贴总和 ```sql SELECT MAX(emp.comm),MIN(emp.comm),SUM(emp.comm),AVG(emp.comm) FROM emp WHERE emp.comm IS NOT NULL; ``` ##### 查询入职日期在1981-05-05日之后入职,并且津贴不为空的所有员工的最大薪资,最小薪资,薪资总和,平均薪资 ```sql SELECT MAX(emp.comm),MIN(emp.comm),SUM(emp.comm),AVG(emp.comm) FROM emp WHERE emp.hiredate>'1981-05-05' AND emp.comm IS NOT NULL; ``` #### 3、COUNT() 功能:返回某列记录的数量 **COUNT(字段):统计某个字段值的数量** **COUNT(\*):统计整个记录的数量** ##### 查询部门30有多少个员工 ```sql SELECT COUNT(*) FROM emp WHERE emp.DEPTno=30; SELECT COUNT(emp.EMPno) FROM emp WHERE emp.DEPTno=30; ``` ##### 查询有员工的部门数 ```sql SELECT COUNT(DISTINCT DEPTno) FROM emp; ``` **除了COUNT(*)之外,其他所有分组函数都会会略列中的NULL** **IFNULL函数可以使分组函数强制计算为空的记录** ```sql SELECT AVG(IFNULL(emp.comm,0)) FROM emp; ``` ##### 查询部门为20的员工,每个月的工资总和及平均工资 ```sql SELECT SUM(emp.sal),AVG(emp.sal) FROM emp WHERE emp.DEPTno=20; ``` ##### 查询工作在CHICAGO的员工人数,最高工资及最低工资 ```sql SELECT COUNT(emp.EMPno),MAX(emp.sal),MIN(emp.sal) FROM emp WHERE emp.DEPTno=30; ``` ##### 查询员工表中一共有几种岗位类型 ```sql SELECT COUNT(DISTINCT emp.job) FROM emp; ``` ## 二、子句 #### 1、GROUP BY GROUP BY 分组,分组的目的不是为了显示数据,一定是为了统计数据,GROUP BY 子句,一定是出现在WHERE子句后面 `GROUP_CONCAT(字段)`:将分组里的某个字段全部保留 **语法:** ```sql SELECT COLUMN, group_function(COLUMN) FROM tableName [WHERE CONDITION] [GROUP BY group_by_expression] ``` 在SELECT列表中除了分组函数那些项,所有列都必须包含在GROUP BY子句中,GROUP BY 所指定的列并不是必须出现在SELECT列表中。 ##### 查询每个部门的编号,平均工资 ```sql SELECT emp.DEPTno,AVG(sal) FROM emp GROUP BY emp.DEPTno; ``` ##### 多列分组:查询每个部门每个岗位的工资总和 ```sql SELECT emp.DEPTno,emp.job,AVG(emp.sal) FROM emp GROUP BY emp.DEPTno,emp.job; ``` ##### 查询每个经理所管理的人数,经理编号,经理姓名,要求包括没有经理的人员信息 ```sql SELECT emp.mgr,COUNT(emp.EMPno) FROM emp GROUP BY emp.mgr; ``` #### 2、HAVING 类似where子句,是用来进行筛选数据的; HAVING是针对已经分组后的数据,再次进行筛选,必须出现在GROUP BY子之后(如果同时存在); HAVING针对的数据是在内存里已经加载的数据,一般HAVING筛选的字段需要出现SELECT的字段中。 ##### 查询每个部门最高薪资大于2900的部门编号,最高工资 ```sql SELECT emp.DEPTno,MAX(emp.sal) FROM emp GROUP BY emp.DEPTno HAVING MAX(emp.sal)>2900; ``` ##### 查询每个职位薪资总和大于5000,职位名字开头不包含SALES的职位名称,最大薪资 ```sql SELECT emp.job '职位',MAX(emp.sal) '最大薪资' FROM emp WHERE emp.job NOT LIKE 'SALES%' GROUP BY emp.job HAVING SUM(emp.sal)>5000; ``` #### 3、ORDER BY 排序,ORDER BY要在Having语句之后,`ASC`表示升序(默认),`DESC`表示降序 ##### 查询所有员工姓名,职位,部门编号,入职日期,并把结果集按入职日期升序排列 ```sql SELECT emp.ename,emp.job,emp.EMPno,emp.hiredate FROM emp ORDER BY emp.hiredate ASC; ``` ##### 按别名排序:查询所有员工编号,姓名,全年工资总和,并把结果按全年工资总和升序排列,全年工资总和别名是annsal ```sql SELECT emp.EMPno,emp.ename,emp.sal*12+IFNULL(emp.comm,0) 'annsal' FROM emp ORDER BY annsal; ``` ##### 按照序号排序:查询显示员工表的员工名字,部门编号,薪资,并根据第二个部门编号进行排序 ```sql SELECT emp.ename,emp.DEPTno,emp.sal FROM emp ORDER BY 2; ``` ##### 同时按照多列排序:查询员工姓名,部门编号,工资,并把查询结果先按部门编号升序,再按工资降序 ```sql SELECT emp.ename,emp.DEPTno,emp.sal FROM emp ORDER BY emp.DEPTno,emp.sal DESC; ``` ##### 查询部门在20或30的员工姓名,部门编号,并按照工资升序排序 ```sql SELECT emp.ename,emp.DEPTno FROM emp WHERE emp.DEPTno IN (20,30) ORDER BY emp.sal; ``` ##### 查询工资在2000-3000之间,部门不在10号的员工姓名,部门编号,工资,并按照部门升序,工资降序 ```sql SELECT emp.ename,emp.DEPTno,emp.sal FROM emp WHERE emp.DEPTno NOT IN (10) AND emp.sal BETWEEN 2000 AND 3000 ORDER BY emp.DEPTno, emp.sal DESC; ``` ##### 查询入职日期在81年后半年入职,职位以SALES或者MAN开头的员工姓名,入职日期,职位,并按照入职日期降序 ```sql SELECT emp.ename,emp.hiredate,emp.job FROM emp WHERE emp.hiredate BETWEEN '1981-6-30' AND '1981-12-31' AND (emp.job LIKE 'SALES%' OR emp.job LIKE 'MAN%') ORDER BY emp.hiredate DESC; ``` #### 4、LIMIT 分页,必须放在语句的最后,有两种用法: 1、LIMIT数量:限制获取的数量,不能保证获取到的数量 2、LIMIT起始位置,数量:从第几条起,限制获取的数量 ##### 获取emp表的6-10条数据 ```sql SELECT * FROM emp LIMIT 5,5; ``` ##### 获取薪资最高的前五个人的信息 ```sql SELECT * FROM emp ORDER BY emp.sal DESC LIMIT 5; ``` ##### 获取薪资总和最高的部门编号和薪资总和 ```sql SELECT emp.DEPTno,SUM(emp.sal) FROM emp GROUP BY emp.DEPTno ORDER BY SUM(emp.sal) DESC LIMIT 1; ``` ##### 分页查询公式 ```sql LIMIT (n-1)*m,m n:当前页数,m:每页显示的行数 ``` ## 三、完整的SELECT语句 ```sql 完整的select句子 SELECT <字段名> FROM <表名或识图> [WHERE <查询条件>] ---------------内存↑和磁盘↓的分界线 [GROUP BY <分组的字段>] [HAVING <过滤>] [ORDER BY <排序的字段> ASC/DESC] LIMIT <分页>; ``` ## 四、多表查询 #### 1、联合查询 `union`(去重) 或者 `union all`(不去重) 作用:可以将两个sql语句的查询结果连接起来(多条SELECT) 要求:1、多个联合查询的字段结果数量必须一致 2、联合查询的字段来源与第一个查询语句的字段 3、表结构一致 注意:`WHERE`子句只对当前的`SELECT`语句有效,联合查询排序时`ORDER BY`对整个结果集进行排序。 ##### 查询部门为10的员工姓名,编号,薪资与查询部门为20的员工姓名,编号,薪资 ```sql SELECT emp.ename,emp.DEPTno,emp.sal FROM emp WHERE emp.DEPTno=10 UNION SELECT emp.ename,emp.DEPTno,emp.sal FROM emp WHERE emp.DEPTno=20; ``` ##### 查询emp,emp02中薪资大于3000的人 ```sql CREATE TABLE emp02 LIKE emp; INSERT INTO emp02 VALUES(8000,"张三","MANAGER",7878,"2025-09-09",4000.00,200.00,10); SELECT * FROM emp WHERE emp.sal>3000 UNION SELECT * FROM emp02 WHERE emp02.sal>3000; ``` ##### 联合查询排序 ```sql SELECT * FROM emp WHERE emp.sal>1000 UNION SELECT * FROM emp02 WHERE emp02.sal>1000 ORDER BY sal DESC LIMIT 5; ``` ##### 对联合查询的总结果进行排序 ```sql (SELECT * FROM emp WHERE emp.sal>1000 LIMIT 0,5) UNION (SELECT * FROM emp02 WHERE emp02.sal>1000 LIMIT 0,5) ORDER BY sal DESC; ``` #### 2、多表连接-内连接(INNER JOIN) 内连接,INNER JOIN (INNER可以省略):将两张表根据指定的条件连接起来 SQL92标准语法: ```sql SELECT * FROM TABLENAME_01 INNER JOIN TABLENAME_02 ON TABLENAME_01.字段 = TABLENAME_02.字段 WHERE 查询条件; ``` SQL89标准:直接使用WHRER进行连接 ```sql SELECT * FROM TABLENAME_01, TABLENAME_02 WHERE TABLENAME_01.字段 = TABLENAME_02.字段 AND 查询条件; ``` ##### 查询员工的所有信息,以及部门所在地 ```sql SELECT emp.*,dept.loc FROM emp INNER JOIN dept ON emp.DEPTno = dept.DEPTno; ``` ##### 查询员工的所有信息,以及部门所在地(89) ```sql SELECT emp.*,dept.loc FROM emp, dept WHERE emp.DEPTno = dept.DEPTno; ``` ##### 查询所有员工的员工编号,姓名,部门编号,部门名称,工作地点 ```sql SELECT emp.EMPno,emp.ename,emp.DEPTno,dept.dname,dept.loc FROM emp INNER JOIN dept ON emp.DEPTno=dept.DEPTno; ``` ##### 查询所有员工的员工编号,姓名,部门编号,部门名称,工作地点(89) ```sql SELECT emp.EMPno,emp.ename,emp.DEPTno,dept.dname,dept.loc FROM emp,dept WHERE emp.DEPTno=dept.DEPTno; ``` ##### 查询工作地点在NEW YORK的员工编号,姓名,部门编号,工作地点 ```sql SELECT emp.EMPno,emp.ename,emp.DEPTno,dept.loc FROM emp INNER JOIN dept ON emp.DEPTno=dept.DEPTno WHERE dept.loc='NEW YORK'; ``` ##### 查询工作地点在NEW YORK的员工编号,姓名,部门编号,工作地点(89) ```sql SELECT emp.EMPno,emp.ename,emp.DEPTno,dept.loc FROM emp,dept WHERE emp.DEPTno=dept.DEPTno AND dept.loc='NEW YORK'; ``` ##### 查询部门编号为20的员工信息和部门名称 ```sql SELECT emp.*,dept.dname FROM emp JOIN dept ON emp.DEPTno=dept.DEPTno WHERE emp.DEPTno=20; ``` ##### 查询部门编号为20的员工信息和部门名称(89) ```sql SELECT emp.*,dept.dname FROM emp, dept WHERE emp.DEPTno=dept.DEPTno AND emp.DEPTno=20; ``` ##### 查询部门名称为SALES的所有员工信息,以及部门名称和部门地址 ```sql SELECT emp.*,dept.dname,dept.loc FROM emp JOIN dept ON emp.DEPTno=dept.DEPTno WHERE dept.dname='SALES'; ``` ##### 查询部门名称为SALES的所有员工信息,以及部门名称和部门地址(89) ```sql SELECT emp.*,dept.dname,dept.loc FROM emp, dept WHERE emp.DEPTno=dept.DEPTno AND dept.dname='SALES'; ``` #### 3、非等值内连接 语法 ```sql SELECT * FROM TABLENAME_01 INNER JOIN TABLENAME_02 ON TABLENAME_01.字段 <连接条件> TABLENAME_02.字段 WHERE 查询条件; ``` ##### 查询每个员工的薪资等级,并显示出来 ```sql -- emp,salgrade SELECT salgrade.grade,emp.EMPno,emp.ename,emp.sal FROM emp JOIN salgrade ON emp.sal BETWEEN salgrade.losal AND salgrade.hisal ORDER BY salgrade.grade,emp.sal; ``` ##### 查询每个员工的薪资等级,并显示出来(89) ```sql -- emp,salgrade SELECT salgrade.grade,emp.EMPno,emp.ename,emp.sal FROM emp, salgrade WHERE emp.sal BETWEEN salgrade.losal AND salgrade.hisal ORDER BY salgrade.grade,emp.sal; ``` ##### 查询所有员工姓名,部门编号,部门名称 ```sql SELECT emp.ename,emp.DEPTno,dept.dname FROM emp JOIN dept ON emp.DEPTno=dept.DEPTno; ``` ##### 查询所有员工姓名,部门编号,部门名称(89) ```sql SELECT emp.ename,emp.DEPTno,dept.dname FROM emp, dept WHERE emp.DEPTno=dept.DEPTno; ``` -- 查询所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金 ```sql SELECT emp.ename,dept.loc,emp.comm FROM emp JOIN dept ON emp.DEPTno=dept.DEPTno WHERE dept.loc='CHICAGO' AND emp.comm IS NOT NULL; ``` ##### 查询所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金(89) ```sql SELECT emp.ename,dept.loc,emp.comm FROM emp, dept WHERE emp.DEPTno=dept.DEPTno AND dept.loc='CHICAGO' AND emp.comm IS NOT NULL; ``` ##### 查询所有姓名中含有A字符的员工姓名,工作地点 ```sql SELECT emp.ename,dept.loc FROM emp JOIN dept ON emp.DEPTno=dept.DEPTno WHERE emp.ename LIKE '%A%'; ``` ##### 查询所有姓名中含有A字符的员工姓名,工作地点(89) ```sql SELECT emp.ename,dept.loc FROM emp, dept WHERE emp.DEPTno=dept.DEPTno AND emp.ename LIKE '%A%'; ``` #### 4、大于2张表的内连接 ##### 查询当前员工的所有信息,包括员工部门相关信息,以及当前员工所在薪资等级 ```sql -- SQL89 SELECT * FROM emp ,dept,salgrade WHERE emp.DEPTno=dept.DEPTno AND emp.sal BETWEEN salgrade.losal AND salgrade.hisal; -- SQL92 SELECT * FROM emp JOIN dept JOIN salgrade ON emp.DEPTno=dept.DEPTno AND emp.sal BETWEEN salgrade.losal AND salgrade.hisal; ``` ##### 查询当前员工的所有信息,包括员工部门相关信息,以及当前员工距离下一级别的薪资差(89) ```sql SELECT *,salgrade.hisal-emp.sal '薪资差' FROM emp,dept,salgrade WHERE emp.DEPTno=dept.DEPTno AND emp.sal BETWEEN salgrade.losal AND salgrade.hisal ORDER BY salgrade.grade,emp.sal; ``` Loading... ## 一、聚合函数 #### 1、MAX()与MIN() 功能:返回某列的最大、最小值。 ##### 查询入职日期最早和最晚的日期 ```sql SELECT MAX(emp.hiredate) '最早日期',MIN(emp.hiredate) '最晚日期' FROM emp; ``` ##### 查找员工表中最高和最低的薪资 ```sql SELECT MAX(emp.sal) '最高薪资',MIN(emp.sal) '最低薪资' FROM emp; ``` ##### 查找最大的员工编号 ```sql SELECT MAX(emp.EMPno) '最大编号' FROM emp; ``` ##### 查找员工表中的最高津贴 ```sql SELECT MAX(emp.comm) '最高津贴' FROM emp; ``` #### 2、SUM()与AVG() 功能:返回某列的值总和与平均值。 ##### 查询职位以SALES开头的所有员工平均工资、最低工资、最高薪资、工资和 ```sql SELECT AVG(emp.sal),MIN(emp.sal),MAX(emp.sal),SUM(emp.sal) FROM emp WHERE emp.job LIKE 'SALES%'; ``` ##### 查询部门编号为10的所有员工的最大薪资,最小薪资,薪资总和,平均薪资 ```sql SELECT MAX(emp.sal),MIN(emp.sal),SUM(emp.sal),AVG(emp.sal) FROM emp WHERE emp.DEPTno=10; ``` ##### 查询部门编号不为10的所有员工的最大薪资,最小薪资,薪资总和,平均薪资 ```sql SELECT MAX(emp.sal),MIN(emp.sal),SUM(emp.sal),AVG(emp.sal) FROM emp WHERE emp.DEPTno<>10; ``` ##### 查询津贴不为空的所有人的最大津贴,最小津贴,平均津贴,津贴总和 ```sql SELECT MAX(emp.comm),MIN(emp.comm),SUM(emp.comm),AVG(emp.comm) FROM emp WHERE emp.comm IS NOT NULL; ``` ##### 查询入职日期在1981-05-05日之后入职,并且津贴不为空的所有员工的最大薪资,最小薪资,薪资总和,平均薪资 ```sql SELECT MAX(emp.comm),MIN(emp.comm),SUM(emp.comm),AVG(emp.comm) FROM emp WHERE emp.hiredate>'1981-05-05' AND emp.comm IS NOT NULL; ``` #### 3、COUNT() 功能:返回某列记录的数量 **COUNT(字段):统计某个字段值的数量** **COUNT(\*):统计整个记录的数量** ##### 查询部门30有多少个员工 ```sql SELECT COUNT(*) FROM emp WHERE emp.DEPTno=30; SELECT COUNT(emp.EMPno) FROM emp WHERE emp.DEPTno=30; ``` ##### 查询有员工的部门数 ```sql SELECT COUNT(DISTINCT DEPTno) FROM emp; ``` **除了COUNT(*)之外,其他所有分组函数都会会略列中的NULL** **IFNULL函数可以使分组函数强制计算为空的记录** ```sql SELECT AVG(IFNULL(emp.comm,0)) FROM emp; ``` ##### 查询部门为20的员工,每个月的工资总和及平均工资 ```sql SELECT SUM(emp.sal),AVG(emp.sal) FROM emp WHERE emp.DEPTno=20; ``` ##### 查询工作在CHICAGO的员工人数,最高工资及最低工资 ```sql SELECT COUNT(emp.EMPno),MAX(emp.sal),MIN(emp.sal) FROM emp WHERE emp.DEPTno=30; ``` ##### 查询员工表中一共有几种岗位类型 ```sql SELECT COUNT(DISTINCT emp.job) FROM emp; ``` ## 二、子句 #### 1、GROUP BY GROUP BY 分组,分组的目的不是为了显示数据,一定是为了统计数据,GROUP BY 子句,一定是出现在WHERE子句后面 `GROUP_CONCAT(字段)`:将分组里的某个字段全部保留 **语法:** ```sql SELECT COLUMN, group_function(COLUMN) FROM tableName [WHERE CONDITION] [GROUP BY group_by_expression] ``` 在SELECT列表中除了分组函数那些项,所有列都必须包含在GROUP BY子句中,GROUP BY 所指定的列并不是必须出现在SELECT列表中。 ##### 查询每个部门的编号,平均工资 ```sql SELECT emp.DEPTno,AVG(sal) FROM emp GROUP BY emp.DEPTno; ``` ##### 多列分组:查询每个部门每个岗位的工资总和 ```sql SELECT emp.DEPTno,emp.job,AVG(emp.sal) FROM emp GROUP BY emp.DEPTno,emp.job; ``` ##### 查询每个经理所管理的人数,经理编号,经理姓名,要求包括没有经理的人员信息 ```sql SELECT emp.mgr,COUNT(emp.EMPno) FROM emp GROUP BY emp.mgr; ``` #### 2、HAVING 类似where子句,是用来进行筛选数据的; HAVING是针对已经分组后的数据,再次进行筛选,必须出现在GROUP BY子之后(如果同时存在); HAVING针对的数据是在内存里已经加载的数据,一般HAVING筛选的字段需要出现SELECT的字段中。 ##### 查询每个部门最高薪资大于2900的部门编号,最高工资 ```sql SELECT emp.DEPTno,MAX(emp.sal) FROM emp GROUP BY emp.DEPTno HAVING MAX(emp.sal)>2900; ``` ##### 查询每个职位薪资总和大于5000,职位名字开头不包含SALES的职位名称,最大薪资 ```sql SELECT emp.job '职位',MAX(emp.sal) '最大薪资' FROM emp WHERE emp.job NOT LIKE 'SALES%' GROUP BY emp.job HAVING SUM(emp.sal)>5000; ``` #### 3、ORDER BY 排序,ORDER BY要在Having语句之后,`ASC`表示升序(默认),`DESC`表示降序 ##### 查询所有员工姓名,职位,部门编号,入职日期,并把结果集按入职日期升序排列 ```sql SELECT emp.ename,emp.job,emp.EMPno,emp.hiredate FROM emp ORDER BY emp.hiredate ASC; ``` ##### 按别名排序:查询所有员工编号,姓名,全年工资总和,并把结果按全年工资总和升序排列,全年工资总和别名是annsal ```sql SELECT emp.EMPno,emp.ename,emp.sal*12+IFNULL(emp.comm,0) 'annsal' FROM emp ORDER BY annsal; ``` ##### 按照序号排序:查询显示员工表的员工名字,部门编号,薪资,并根据第二个部门编号进行排序 ```sql SELECT emp.ename,emp.DEPTno,emp.sal FROM emp ORDER BY 2; ``` ##### 同时按照多列排序:查询员工姓名,部门编号,工资,并把查询结果先按部门编号升序,再按工资降序 ```sql SELECT emp.ename,emp.DEPTno,emp.sal FROM emp ORDER BY emp.DEPTno,emp.sal DESC; ``` ##### 查询部门在20或30的员工姓名,部门编号,并按照工资升序排序 ```sql SELECT emp.ename,emp.DEPTno FROM emp WHERE emp.DEPTno IN (20,30) ORDER BY emp.sal; ``` ##### 查询工资在2000-3000之间,部门不在10号的员工姓名,部门编号,工资,并按照部门升序,工资降序 ```sql SELECT emp.ename,emp.DEPTno,emp.sal FROM emp WHERE emp.DEPTno NOT IN (10) AND emp.sal BETWEEN 2000 AND 3000 ORDER BY emp.DEPTno, emp.sal DESC; ``` ##### 查询入职日期在81年后半年入职,职位以SALES或者MAN开头的员工姓名,入职日期,职位,并按照入职日期降序 ```sql SELECT emp.ename,emp.hiredate,emp.job FROM emp WHERE emp.hiredate BETWEEN '1981-6-30' AND '1981-12-31' AND (emp.job LIKE 'SALES%' OR emp.job LIKE 'MAN%') ORDER BY emp.hiredate DESC; ``` #### 4、LIMIT 分页,必须放在语句的最后,有两种用法: 1、LIMIT数量:限制获取的数量,不能保证获取到的数量 2、LIMIT起始位置,数量:从第几条起,限制获取的数量 ##### 获取emp表的6-10条数据 ```sql SELECT * FROM emp LIMIT 5,5; ``` ##### 获取薪资最高的前五个人的信息 ```sql SELECT * FROM emp ORDER BY emp.sal DESC LIMIT 5; ``` ##### 获取薪资总和最高的部门编号和薪资总和 ```sql SELECT emp.DEPTno,SUM(emp.sal) FROM emp GROUP BY emp.DEPTno ORDER BY SUM(emp.sal) DESC LIMIT 1; ``` ##### 分页查询公式 ```sql LIMIT (n-1)*m,m n:当前页数,m:每页显示的行数 ``` ## 三、完整的SELECT语句 ```sql 完整的select句子 SELECT <字段名> FROM <表名或识图> [WHERE <查询条件>] ---------------内存↑和磁盘↓的分界线 [GROUP BY <分组的字段>] [HAVING <过滤>] [ORDER BY <排序的字段> ASC/DESC] LIMIT <分页>; ``` ## 四、多表查询 #### 1、联合查询 `union`(去重) 或者 `union all`(不去重) 作用:可以将两个sql语句的查询结果连接起来(多条SELECT) 要求:1、多个联合查询的字段结果数量必须一致 2、联合查询的字段来源与第一个查询语句的字段 3、表结构一致 注意:`WHERE`子句只对当前的`SELECT`语句有效,联合查询排序时`ORDER BY`对整个结果集进行排序。 ##### 查询部门为10的员工姓名,编号,薪资与查询部门为20的员工姓名,编号,薪资 ```sql SELECT emp.ename,emp.DEPTno,emp.sal FROM emp WHERE emp.DEPTno=10 UNION SELECT emp.ename,emp.DEPTno,emp.sal FROM emp WHERE emp.DEPTno=20; ``` ##### 查询emp,emp02中薪资大于3000的人 ```sql CREATE TABLE emp02 LIKE emp; INSERT INTO emp02 VALUES(8000,"张三","MANAGER",7878,"2025-09-09",4000.00,200.00,10); SELECT * FROM emp WHERE emp.sal>3000 UNION SELECT * FROM emp02 WHERE emp02.sal>3000; ``` ##### 联合查询排序 ```sql SELECT * FROM emp WHERE emp.sal>1000 UNION SELECT * FROM emp02 WHERE emp02.sal>1000 ORDER BY sal DESC LIMIT 5; ``` ##### 对联合查询的总结果进行排序 ```sql (SELECT * FROM emp WHERE emp.sal>1000 LIMIT 0,5) UNION (SELECT * FROM emp02 WHERE emp02.sal>1000 LIMIT 0,5) ORDER BY sal DESC; ``` #### 2、多表连接-内连接(INNER JOIN) 内连接,INNER JOIN (INNER可以省略):将两张表根据指定的条件连接起来 SQL92标准语法: ```sql SELECT * FROM TABLENAME_01 INNER JOIN TABLENAME_02 ON TABLENAME_01.字段 = TABLENAME_02.字段 WHERE 查询条件; ``` SQL89标准:直接使用WHRER进行连接 ```sql SELECT * FROM TABLENAME_01, TABLENAME_02 WHERE TABLENAME_01.字段 = TABLENAME_02.字段 AND 查询条件; ``` ##### 查询员工的所有信息,以及部门所在地 ```sql SELECT emp.*,dept.loc FROM emp INNER JOIN dept ON emp.DEPTno = dept.DEPTno; ``` ##### 查询员工的所有信息,以及部门所在地(89) ```sql SELECT emp.*,dept.loc FROM emp, dept WHERE emp.DEPTno = dept.DEPTno; ``` ##### 查询所有员工的员工编号,姓名,部门编号,部门名称,工作地点 ```sql SELECT emp.EMPno,emp.ename,emp.DEPTno,dept.dname,dept.loc FROM emp INNER JOIN dept ON emp.DEPTno=dept.DEPTno; ``` ##### 查询所有员工的员工编号,姓名,部门编号,部门名称,工作地点(89) ```sql SELECT emp.EMPno,emp.ename,emp.DEPTno,dept.dname,dept.loc FROM emp,dept WHERE emp.DEPTno=dept.DEPTno; ``` ##### 查询工作地点在NEW YORK的员工编号,姓名,部门编号,工作地点 ```sql SELECT emp.EMPno,emp.ename,emp.DEPTno,dept.loc FROM emp INNER JOIN dept ON emp.DEPTno=dept.DEPTno WHERE dept.loc='NEW YORK'; ``` ##### 查询工作地点在NEW YORK的员工编号,姓名,部门编号,工作地点(89) ```sql SELECT emp.EMPno,emp.ename,emp.DEPTno,dept.loc FROM emp,dept WHERE emp.DEPTno=dept.DEPTno AND dept.loc='NEW YORK'; ``` ##### 查询部门编号为20的员工信息和部门名称 ```sql SELECT emp.*,dept.dname FROM emp JOIN dept ON emp.DEPTno=dept.DEPTno WHERE emp.DEPTno=20; ``` ##### 查询部门编号为20的员工信息和部门名称(89) ```sql SELECT emp.*,dept.dname FROM emp, dept WHERE emp.DEPTno=dept.DEPTno AND emp.DEPTno=20; ``` ##### 查询部门名称为SALES的所有员工信息,以及部门名称和部门地址 ```sql SELECT emp.*,dept.dname,dept.loc FROM emp JOIN dept ON emp.DEPTno=dept.DEPTno WHERE dept.dname='SALES'; ``` ##### 查询部门名称为SALES的所有员工信息,以及部门名称和部门地址(89) ```sql SELECT emp.*,dept.dname,dept.loc FROM emp, dept WHERE emp.DEPTno=dept.DEPTno AND dept.dname='SALES'; ``` #### 3、非等值内连接 语法 ```sql SELECT * FROM TABLENAME_01 INNER JOIN TABLENAME_02 ON TABLENAME_01.字段 <连接条件> TABLENAME_02.字段 WHERE 查询条件; ``` ##### 查询每个员工的薪资等级,并显示出来 ```sql -- emp,salgrade SELECT salgrade.grade,emp.EMPno,emp.ename,emp.sal FROM emp JOIN salgrade ON emp.sal BETWEEN salgrade.losal AND salgrade.hisal ORDER BY salgrade.grade,emp.sal; ``` ##### 查询每个员工的薪资等级,并显示出来(89) ```sql -- emp,salgrade SELECT salgrade.grade,emp.EMPno,emp.ename,emp.sal FROM emp, salgrade WHERE emp.sal BETWEEN salgrade.losal AND salgrade.hisal ORDER BY salgrade.grade,emp.sal; ``` ##### 查询所有员工姓名,部门编号,部门名称 ```sql SELECT emp.ename,emp.DEPTno,dept.dname FROM emp JOIN dept ON emp.DEPTno=dept.DEPTno; ``` ##### 查询所有员工姓名,部门编号,部门名称(89) ```sql SELECT emp.ename,emp.DEPTno,dept.dname FROM emp, dept WHERE emp.DEPTno=dept.DEPTno; ``` -- 查询所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金 ```sql SELECT emp.ename,dept.loc,emp.comm FROM emp JOIN dept ON emp.DEPTno=dept.DEPTno WHERE dept.loc='CHICAGO' AND emp.comm IS NOT NULL; ``` ##### 查询所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金(89) ```sql SELECT emp.ename,dept.loc,emp.comm FROM emp, dept WHERE emp.DEPTno=dept.DEPTno AND dept.loc='CHICAGO' AND emp.comm IS NOT NULL; ``` ##### 查询所有姓名中含有A字符的员工姓名,工作地点 ```sql SELECT emp.ename,dept.loc FROM emp JOIN dept ON emp.DEPTno=dept.DEPTno WHERE emp.ename LIKE '%A%'; ``` ##### 查询所有姓名中含有A字符的员工姓名,工作地点(89) ```sql SELECT emp.ename,dept.loc FROM emp, dept WHERE emp.DEPTno=dept.DEPTno AND emp.ename LIKE '%A%'; ``` #### 4、大于2张表的内连接 ##### 查询当前员工的所有信息,包括员工部门相关信息,以及当前员工所在薪资等级 ```sql -- SQL89 SELECT * FROM emp ,dept,salgrade WHERE emp.DEPTno=dept.DEPTno AND emp.sal BETWEEN salgrade.losal AND salgrade.hisal; -- SQL92 SELECT * FROM emp JOIN dept JOIN salgrade ON emp.DEPTno=dept.DEPTno AND emp.sal BETWEEN salgrade.losal AND salgrade.hisal; ``` ##### 查询当前员工的所有信息,包括员工部门相关信息,以及当前员工距离下一级别的薪资差(89) ```sql SELECT *,salgrade.hisal-emp.sal '薪资差' FROM emp,dept,salgrade WHERE emp.DEPTno=dept.DEPTno AND emp.sal BETWEEN salgrade.losal AND salgrade.hisal ORDER BY salgrade.grade,emp.sal; ``` 最后修改:2025 年 10 月 22 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 👆请简单粗暴地爱我。