MySQL进阶
本文将简述MySQL进阶查询基本语法,如 “AS用法”、“条件判断”、“限制结果条目”、“聚合函数”、“排序”、“分组统计”、“多表查询”。
AS用法与条件替换
关键字AS用来设置别名。
●使用AS语句设置别名时,关键字AS可省略。
●设置别名时,保证不能与库中其他表或字段名起冲突。
条件判断(CASE WHEN XX THEN XX1 ELSE XX2 END)用于将结果集中的数据根据条件替换为指定字符。
●如果字段值XX为真,则返回结果XX1,否则返回结果XX2。
例:查询地址为上海的员工姓名和性别,性别要求F显示为女而M显示为男。
1 | -- 条件替换即若性别为F显示女否则显示男,将字段重命名为sex |
限制结果条目
LIMIT [offset,] number
LIMIT的第一个参数是位置偏移量(可选参数),即设置 MySQL 从哪一行开始显示,第二个参数是设置返回记录行的最大数目。
●offset作为可选参数,第一条记录的位置偏移量为0。
●返回SELECT查询结果的前几行或指定开始行显示条目数。
例:查询学生表信息3-6行的姓名与年龄。
1 | -- 查询3-6行数据即 偏移量为3-1,显示数量为6-3+1 |
聚合函数
聚合函数是对表中数据记录进行集中概括而设计的一类函数,常用聚合函数有平均值、最大值、最小值、总和、计数等。
●avg()返回指定列的平均值
●max()返回指定列的最大值
●min()返回指定列的最小值
●sum()返回指定列的所有值之和
●count()返回指定列中非NULL值的个数
例:查询计算机专业学生最大年龄、最小年龄、平均年龄、总年龄、总人数。
1 | SELECT MAX(stuAge),MIN(stuAge),AVG(stuAge),SUM(stuAge),COUNT(*) |
去重与条件NULL关键字
查询数据时若显示重复的行记录,删除重复行可在SELECT语句中使用DISTINCT子句。语法如下:
1 | SELECT DISTINCT columns |
例:查询所有的员工来自那些城市(不能重复显示地名且NULL不显示)。
1 | SELECT DISTINCT city |
MySQL中处理NULL必须使用 IS NULL 和 IS NOT NULL 运算符。
MySQL使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。为了处理这种情况,MySQL提供了三大运算符:
● IS NULL: 当列的值是 NULL,此运算符返回 true。
● IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
● <=>: 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true。
NULL条件函数
IF()、IFNULL()、NULLIF()、ISNULL()函数的使用。
●IF()函数IF(expr1,expr2,expr3)
如果expr1的值为true,则返回expr2的值,如果expr1的值为false,则返回expr3的值。
1 | SELECT IF(TRUE,'A','B'); -- 输出结果:A |
●IFNULL()函数IFNULL(expr1,expr2)
如果expr1的值为null,则返回expr2的值,如果expr1的值不为null,则返回expr1的值。
1 | SELECT IFNULL(NULL,'A'); -- 输出结果:A |
●NULLIF()函数NULLIF(expr1,expr2)
如果expr1=expr2成立,那么返回值为null,否则返回值为expr1的值。
1 | SELECT NULLIF('A','A'); -- 输出结果:null |
●ISNULL()函数ISNULL(expr)
如果expr的值为null,则返回1,如果expr1的值不为null,则返回0。
1 | SELECT ISNULL(NULL); -- 输出结果:1 |
排序
按关键字排序查询数据时使用ORDER BY
语句来实现排序。语法如下:
1 | SELECT column1, column2,… |
●排序可针对一个或多个字段
●ASC:升序,默认排序方式
●DESC:降序
例:查询产品表所有信息,根据库存由小到大排列。
1 | SELECT productID,pName,price,pes |
分组统计
查询数据结果同时包括普通字段和聚合函数需进行分组统计,这时使用GROUP BY
语句对结果进行分组。语法如下:
1 | SELECT column_name, aggregate_function(column_name) |
●通常结合聚合函数一起使用
●以按一个或多个字段对结果进行分组
例:查询员工表每个专业的员工总人数,显示专业名称和总人数。
1 | SELECT major,COUNT(*) |
HAVING子句的使用。在SELECT语句中使用HAVING子句来指定一组行或聚合的过滤条件。HAVING子句通常与GROUP BY子句一起使用,以根据指定的条件过滤分组。如果省略GROUP BY子句,则HAVING子句的行为与WHERE子句类似。
注意:HAVING子句将过滤条件应用于每组分行,而WHERE子句将过滤条件应用于每个单独的行。
例:查询除北京外的每个城市的客户总人数,只显示1人以上的城市名称和总人数。
1 | SELECT cAddress,COUNT(*) AS TotalNumber |
多表查询
多表查询常使用内连接即查询操作列出与连接条件匹配的数据行。语法如下:
1 | -- 法1 |
例:查询IOT2020班和IOT2022班的软件方向的班级名称和学生姓名。
1 | SELECT c.bjname,s.stuName |
SQL查询方法
①搭建查询结构:SELECT ... FROM ... WHERE ...
②找出需要查询的表名写在FROM后
③建立关系即将各表外键进行内连接
④将需求筛选条件写在WHERE后
⑤将需求显示的要素写在SELECT后
版权声明
Scholar’s Blog by scholargeek is licensed under a Creative Commons BY-NC-ND 4.0 International License.
由董仕麟创作并维护的scholargeek博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于Scholar’s Blog博客,版权所有,侵权必究。