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 总结

相关推荐
huaqianzkh1 小时前
了解MySQL 高可用架构:主从备份
数据库·mysql·架构
向往风的男子2 小时前
【mysql】mysql之读写分离以及分库分表
数据库·mysql
阳光开朗_大男孩儿2 小时前
DBUS属性原理
linux·服务器·前端·数据库·qt
挠背小能手3 小时前
达梦数据库SCHEMA使用初探
数据库·oracle
楠神说软件测试3 小时前
接口自动化框架入门(requests+pytest)
运维·数据库·自动化
惟长堤一痕3 小时前
医学数据分析实训 项目一 医学数据采集
数据库
xuan哈哈哈3 小时前
web基础—dvwa靶场(八)SQL Injection(Blind)
数据库·web安全·网络安全
Lill_bin3 小时前
Lua编程语言简介与应用
开发语言·数据库·缓存·设计模式·性能优化·lua
惜.己4 小时前
MyBatis中一对多关系的两种处理方法
java·开发语言·后端·sql·mysql·mybatis·idea
终末圆4 小时前
MyBatis动态SQL中的`if`标签使用【后端 19】
java·数据结构·数据库·sql·算法·spring·mybatis