数据库学习2

文章目录
  1. 1. MySQL进阶
    1. 1.1. AS用法与条件替换
    2. 1.2. 限制结果条目
    3. 1.3. 聚合函数
    4. 1.4. 去重与条件NULL关键字
    5. 1.5. NULL条件函数
    6. 1.6. 排序
    7. 1.7. 分组统计
    8. 1.8. 多表查询
  2. 2. SQL查询方法

MySQL进阶

  本文将简述MySQL进阶查询基本语法,如 “AS用法”、“条件判断”、“限制结果条目”、“聚合函数”、“排序”、“分组统计”、“多表查询”。

AS用法与条件替换

  关键字AS用来设置别名。
●使用AS语句设置别名时,关键字AS可省略。
●设置别名时,保证不能与库中其他表或字段名起冲突。

  条件判断(CASE WHEN XX THEN XX1 ELSE XX2 END)用于将结果集中的数据根据条件替换为指定字符。
●如果字段值XX为真,则返回结果XX1,否则返回结果XX2。

例:查询地址为上海的员工姓名和性别,性别要求F显示为女而M显示为男。

1
2
3
4
-- 条件替换即若性别为F显示女否则显示男,将字段重命名为sex
SELECT ename,(CASE WHEN sex='F' THEN '女' ELSE '男' END) AS sex
FROM emp
WHERE address='上海'

限制结果条目

  LIMIT [offset,] number
  LIMIT的第一个参数是位置偏移量(可选参数),即设置 MySQL 从哪一行开始显示,第二个参数是设置返回记录行的最大数目。
●offset作为可选参数,第一条记录的位置偏移量为0。
●返回SELECT查询结果的前几行或指定开始行显示条目数。

例:查询学生表信息3-6行的姓名与年龄。

1
2
3
4
-- 查询3-6行数据即 偏移量为3-1,显示数量为6-3+1
SELECT stuName,stuAge
FROM student
LIMIT 2,4

聚合函数

  聚合函数是对表中数据记录进行集中概括而设计的一类函数,常用聚合函数有平均值、最大值、最小值、总和、计数等。
●avg()返回指定列的平均值
●max()返回指定列的最大值
●min()返回指定列的最小值
●sum()返回指定列的所有值之和
●count()返回指定列中非NULL值的个数

例:查询计算机专业学生最大年龄、最小年龄、平均年龄、总年龄、总人数。

1
2
3
SELECT MAX(stuAge),MIN(stuAge),AVG(stuAge),SUM(stuAge),COUNT(*)
FROM student
WHERE stuMajor='计算机';

去重与条件NULL关键字

  查询数据时若显示重复的行记录,删除重复行可在SELECT语句中使用DISTINCT子句。语法如下:

1
2
3
SELECT DISTINCT columns
FROM table_name
WHERE where_conditions;

例:查询所有的员工来自那些城市(不能重复显示地名且NULL不显示)。

1
2
3
SELECT DISTINCT city 
FROM emp
WHERE city IS NOT NULL;

  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
2
SELECT IF(TRUE,'A','B');    -- 输出结果:A
SELECT IF(FALSE,'A','B'); -- 输出结果:B

●IFNULL()函数
IFNULL(expr1,expr2)
如果expr1的值为null,则返回expr2的值,如果expr1的值不为null,则返回expr1的值。

1
2
SELECT IFNULL(NULL,'A');    -- 输出结果:A
SELECT IFNULL('HELLO','A'); -- 输出结果:HELLO

●NULLIF()函数
NULLIF(expr1,expr2)
如果expr1=expr2成立,那么返回值为null,否则返回值为expr1的值。

1
2
SELECT NULLIF('A','A');     -- 输出结果:null
SELECT NULLIF('A','B'); -- 输出结果:A

●ISNULL()函数
ISNULL(expr)
如果expr的值为null,则返回1,如果expr1的值不为null,则返回0。

1
2
SELECT ISNULL(NULL);        -- 输出结果:1
SELECT ISNULL('HELLO'); -- 输出结果:0

排序

  按关键字排序查询数据时使用ORDER BY语句来实现排序。语法如下:

1
2
3
SELECT column1, column2,…
FROM table_name
ORDER BY column1, column2,…ASC|DESC;

●排序可针对一个或多个字段
●ASC:升序,默认排序方式
●DESC:降序

例:查询产品表所有信息,根据库存由小到大排列。

1
2
3
SELECT productID,pName,price,pes
FROM product
ORDER BY pes ASC;

分组统计

  查询数据结果同时包括普通字段和聚合函数需进行分组统计,这时使用GROUP BY语句对结果进行分组。语法如下:

1
2
3
4
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

●通常结合聚合函数一起使用
●以按一个或多个字段对结果进行分组

例:查询员工表每个专业的员工总人数,显示专业名称和总人数。

1
2
3
SELECT major,COUNT(*)
FROM emp
GROUP BY major

  HAVING子句的使用。在SELECT语句中使用HAVING子句来指定一组行或聚合的过滤条件。HAVING子句通常与GROUP BY子句一起使用,以根据指定的条件过滤分组。如果省略GROUP BY子句,则HAVING子句的行为与WHERE子句类似。
  注意:HAVING子句将过滤条件应用于每组分行,而WHERE子句将过滤条件应用于每个单独的行。

例:查询除北京外的每个城市的客户总人数,只显示1人以上的城市名称和总人数。

1
2
3
4
5
SELECT cAddress,COUNT(*) AS TotalNumber
FROM customer
WHERE cAddress<>'北京'
GROUP BY cAddress
HAVING TotalNumber>1

多表查询

  多表查询常使用内连接即查询操作列出与连接条件匹配的数据行。语法如下:

1
2
3
4
5
6
7
8
-- 法1
SELECT column name(s)
FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

-- 法2
SELECT T1.column1, T2.column2,…
FROM table_name1 AS T1,table_name2 AS T2,…
WHERE T1.column_keyname=T2.column_keyname

例:查询IOT2020班和IOT2022班的软件方向的班级名称和学生姓名。

1
2
3
SELECT c.bjname,s.stuName
FROM classes c,student s
WHERE c.bjid=s.bjid AND c.bjname IN ('IOT2020','IOT2022') AND s.stuMajor='软件';

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博客,版权所有,侵权必究。

本文永久链接:https://scholargeek.github.io/2023/02/03/MySQL2/

更新日期:


本站总访问量