SQL的高级查询练习知识点中(day25)

1 学习目标

  1. 重点掌握聚合函数的使用
  2. 重点掌握字段别名
  3. 重点掌握分组查询的语法
  4. 重点掌握having的使用方法
  5. 了解子查询的语法
  6. 重点掌握排序查询语法

2 排序查询

2.1 语法

sql 复制代码
SELECT
	要查询的东西
FROM
	表
WHERE 
	条件
ORDER BY 排序的字段|表达式|函数|别名 [ASC|DESC]
  • ASC 升序(默认)(从小到大) ascend
  • DESC 降序(从大到小) descend

2.2 例子

①员工薪水升序排列

sql 复制代码
SELECT employee_id, first_name, salary
FROM employees
ORDER BY salary;

②按部门升序,相同部门按工资降序

sql 复制代码
SELECT employee_id, first_name, salary, department_id
FROM employees
ORDER BY department_id ASC, salary DESC;

2.3 小练习

①50部门的员工,按工资降序排列

sql 复制代码
SELECT employee_id,first_name,salary,department_id
FROM employees
WHERE department_id = 50 
ORDER BY salary DESC;

②岗位后缀是'CLERK',按主管id排序,相同主管按工资降序

sql 复制代码
SELECT employee_id,first_name,salary,job_id,manager_id
FROM employees
WHERE job_id LIKE '%CLERK'
ORDER BY manager_id ASC, salary DESC;

3 别名

3.1 表别名

3.1.1 特点

  • 使用 MySQL 查询时,当表名很长或者执行一些特殊查询的时候,为了方便操作或者需要多次使用相同的表时,可以为表指定别名,用这个别名代替表原来的名称。

  • 在为表取别名时,要保证不能与数据库中的其他表的名称冲突

3.1.2 语法格式

复制代码
<表名> [AS] <别名>
  • <表名>:数据中存储的数据表的名称
  • <别名>:查询时指定的表的新名称
  • AS:关键字为可选参数

3.1.3 例子

①查询出部门信息

sql 复制代码
SELECT d.department_id,d.department_name,d.location_id,d.manager_id 
FROM departments AS d;
或者
SELECT d.department_id,d.department_name,d.location_id,d.manager_id 
FROM departments d;

3.2 字段别名

3.2.1 特点

  • 在使用 SELECT 语句显示查询结果时,MySQL 会显示每个 SELECT 后面指定输出的列,在有些情况下,显示的列名称会很长或者名称不够直观,MySQL 可以指定列的别名,替换字段或表达式
  • 在where 中不能使用字段别名
  • order by 可以使用字段别名

3.2.2 语法格式

sql 复制代码
<列名> [AS] <列别名>
  • <列名>:为表中字段定义的名称。
  • <列别名>:字段新的名称。
  • AS:关键字为可选参数

3.2.3 例子

①计算出每个员工的年薪

sql 复制代码
SELECT employee_id 员工id,first_name 姓,salary 薪资,salary*12 年薪
FROM employees
WHERE salary*12>=120000
ORDER BY 年薪 DESC;

4 多行函数(聚合函数)

4.1 特点

  • 多行数据,运算产生一行结果
  • 多行函数,不能和其他普通字段一起查询

    • 其他数据库会禁止执行
    • mysql可以执行,只是把第一条数据显示出来
  • 多行函数可以一起查询

  • 多行函数会忽略null值

  • count(a)对指定字段的值计数,重复值会重复计数

  • 可以用distinct去除重复

  • count() 计算行数

  • count(*) 数据量大时(千万),效率低

4.2 例子

①查询全体员工的平均薪资

sql 复制代码
SELECT AVG(salary) 平均薪资 FROM employees;

注意:但是注意,不能和其他字段一起查询

sql 复制代码
SELECT AVG(salary),employee_id,first_name FROM employees;

​ mysql可以执行,只是把第一条数据显示出来,容易造成误解

②查询全体员工的薪资总和,平均薪资,最大薪资,最低薪资,人员数量(多行函数可以一起查询)

sql 复制代码
SELECT SUM(salary) 薪资总和,AVG(salary) 平均薪资,MAX(salary) 最大薪资,MIN(salary) 最低薪资,COUNT(salary) 人员数量 
FROM employees;

③查询commission_pct字段非null值的总数(多行函数会忽略null值)

sql 复制代码
SELECT COUNT(commission_pct),COUNT(*) 
FROM employees;

④共有多少个工作岗位(可以用distinct去除重复)

sql 复制代码
SELECT COUNT(DISTINCT job_id) 
FROM employees;

⑤50部分的人数

sql 复制代码
SELECT COUNT(*) 
FROM employees 
WHERE department_id=50;

5 分组查询

5.1 含义

  • 按指定字段,相同的值,分组计算

5.2 语法

sql 复制代码
SELECT 查询的字段,分组函数
FROM 表
GROUP BY 分组的字段

5.3 特点

  • 可以按单个字段分组
  • 和分组函数一同查询的字段最好是分组后的字段
  • 可以按多个字段分组,字段之间用逗号隔开
  • 可以支持排序

5.4 例子

①每个部门的人数(分组字段,可以和多行函数一起查询)

sql 复制代码
SELECT department_id, COUNT(*)
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id;

②每个工作岗位的最高工资

sql 复制代码
SELECT job_id,MAX(salary)
FROM employees
GROUP BY job_id;

③每个部门中,每个岗位的人数,按人数排序

sql 复制代码
SELECT department_id,job_id,COUNT(*) c
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id,job_id
ORDER BY c;

6 HAVING

6.1 含义

  • having对分组求出的多行函数结果进行过滤

6.2 where和having

  • where最先执行,只能过滤普通条件
  • having分组计算完多行函数之后,执行过滤
  • having也可以过滤普通条件,但不应该这样做
针对的表 位置 关键字
分组前筛选 原始表 group by的前面 where
分组后筛选 分组后的结果集 group by的后面 having

6.3 例子

①只有一个人的部门

sql 复制代码
SELECT department_id, COUNT(*) c
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id
HAVING c=1;

②平均工资大于8000的工作岗位

sql 复制代码
SELECT job_id,AVG(salary) s
FROM employees
GROUP BY job_id
HAVING s>8000
ORDER BY s DESC;

7 子查询

7.1 含义

  • 一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询 在外面的查询语句,称为主查询或外查询,简单理解,就是将一个查询的结果,作为另一个查询的过滤条件

7.2 特点

  • 子查询都放在小括号内
  • 子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧
  • 子查询优先于主查询执行,主查询使用了子查询的执行结果
  • 子查询根据查询结果的行数不同分为单行子查询和多行子查询

7.3 单行子查询

7.3.1 特点

  • 结果集只有一行
  • 一般搭配单行操作符使用:> < = <> >= <=
  • 非法使用子查询的情况:
  • 子查询的结果为一组值
  • 子查询的结果为空

7.3.2 例子

①拿最低工资的所有员工

sql 复制代码
SELECT employee_id,first_name,salary
FROM employees
WHERE salary=(
    SELECT MIN(salary) FROM employees
);

②工资低于平均工资的员工

sql 复制代码
SELECT employee_id, first_name, salary
FROM employees
WHERE salary<(
    SELECT AVG(salary) FROM employees
)
ORDER BY salary DESC;

7.4 多行子查询

7.4.1 特点

  • 结果集有多行
  • in: 属于子查询结果中的任意一个就行

7.4.2 例子

①只有一个人的部门中的员工

sql 复制代码
SELECT employee_id,first_name,salary,department_id
FROM employees
WHERE department_id IN(
    SELECT department_id
    FROM employees
    WHERE department_id IS NOT NULL
    GROUP BY department_id
    HAVING COUNT(*)=1
);

②每个部门中,拿最低工资的员工

sql 复制代码
SELECT employee_id,first_name,department_id,salary
FROM employees
WHERE (department_id,salary) IN(
    SELECT department_id,MIN(salary)
    FROM employees
    WHERE department_id IS NOT NULL
    GROUP BY department_id
)
ORDER BY department_id;

8 总结

相关推荐
瓜牛_gn40 分钟前
mysql特性
数据库·mysql
奶糖趣多多2 小时前
Redis知识点
数据库·redis·缓存
数新网络3 小时前
《深入浅出Apache Spark》系列②:Spark SQL原理精髓全解析
大数据·sql·spark
CoderIsArt3 小时前
Redis的三种模式:主从模式,哨兵与集群模式
数据库·redis·缓存
师太,答应老衲吧5 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
Channing Lewis6 小时前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
毕业设计制作和分享7 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
ketil277 小时前
Redis - String 字符串
数据库·redis·缓存
NiNg_1_2347 小时前
高级 SQL 技巧详解
sql
Hsu_kk8 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql