前言
数据查询是数据库管理系统应用的主要内容,也是用户对数据库最频繁、最常见的操作请求。 数据查询可以根据用户提供的限定条件,从已存在的数据表中检索用户需要的数据。 MySQL使用SELECT语句既可以完成简单的单表查询、联合查询,也可以完成复杂的联接查询、子查询,从数据库中检索符合用户需求的数据,并将结果集以表格的形式返回给用户。
学习目标
熟练应用SELECT语句进行数据查询。 掌握应用SELECT语句进行分组聚合查询。 掌握应用SELECT语句多表联接查询和子查询。 能够应用SELECT语句进行嵌套查询
单表查询
查询语句的基本用法
主要语法格式如下:
代码语言:javascript复制SELECT 字段名1 [,字段名2.....]
FROM 表名1 [,表名2.....]
[WHERE 条件表达式]
[GROUP BY 字段名列表[HAVING 条件表达式]]
[ORDER BY 字段名[ASC|DESC]];
GROUP BY 用于对查询结果进行分组 ORDER BY 用来指定查询结果集的排序方式 ,ASC代表升序排列|DESC代表降序排列
字段的别名
方法 一:字段名 AS 别名 二:字段名 别名
代码语言:javascript复制SELECT name 姓名, id AS 学号
FROM STUDENT;
DISTINCT消除重复记录
如果查询结果中出现了重复的行,消除结果中重复的行,则使用DISTINCT关键字可达成此要求。 DISTINCT关键字要在SELECT关键字和第一个字段之间。 对于DISTINCT关键字来说,所有的空值NULL将被认为是重复的内容,当SELECT语句中包括DISTINCT关键字时,不论遇到多少个空值,在结果中只返回一个NULL。
WHERE子句指定查询条件
- 语法
SELECT 字段名1[,字段名2...]
FROM 表名1[,表名2...]
WHERE 条件表达式
当条件表达式中出现数据类型为 CHAR、NCHAR、VARCHAR、NVARCHAR、text、datetime和smalldatetime的数据时,在引用时需要用单引号括起来。 比较运算符 = , > , < , >= , <= , <> , != , !> , !< , 可以让表中的值与指定值或表达式作比较。
逻辑运算符 逻辑运算符包括AND(逻辑与)、OR(逻辑或)、NOT(逻辑非)。
- AND :连接两个条件表达式当且仅当两个条件表达式都成立时,组合起来的条件才成立。
- OR: 连接两个条件表达式,两个条件表达式之一成立,组合起来的条件就成立。
- NOT: 连接一个条件表达式,对给定条件取反。
- AND运算符的优先级高于OR运算符,因此当两个同时使用时,优先处理AND的表达式
字符串匹配运算符 在指定条件不是很明确的时候可以使用LIKE 运算符与指定的字符串进行匹配。其语法格式如下:
代码语言:javascript复制字段名 LIKE ‘指定字符串’;
通配符和字符串比逊在单引号中。
通配符 | 含义 |
---|---|
% | 代表任意长度(0个或多个)的字符串 |
- | 代表任意1个字符 |
- 比如 LIKE ‘c%’ 其意为 匹配以字母c开头的字符串。 LIKE ‘!’ 其意为 匹配以数字21结尾的字符串 LIKE ‘_c%’其意为 匹配以字母c为第二个字符的字符串。
范围运算符 使用 BETWEEN AND 可以查询一个连续的范围
列表运算符 列表运算符主要用于在SQL查询中对一组值进行匹配。常见的列表运算符包括 IN 和 BETWEEN。它们能够使得查询更加简洁高效。
- IN 运算符 IN 运算符用于检查某个值是否存在于一个指定的列表中。例如,如果我们想查询某个部门的所有员工,可以使用 IN 运算符来指定多个部门编号。
sql
SELECT * FROM Employees
WHERE DepartmentID IN (1, 2, 3);
在这个例子中,查询所有属于部门1、2或3的员工。使用 IN 运算符可以使查询更清晰,并减少重复代码。
- BETWEEN 运算符 BETWEEN 运算符用于选择在某个范围内的值。例如,查询某个时间段内的订单,可以使用 BETWEEN 运算符:
SELECT * FROM Orders
WHERE OrderDate BETWEEN '2024-01-01' AND '2024-12-31';
空值判断运算符
- IS NULL 运算符 IS NULL 运算符用于检测字段是否为NULL值。如果需要查找没有指定值的记录,可以使用此运算符。例如,查询所有没有邮箱地址的员工:
sql
SELECT * FROM Employees
WHERE Email IS NULL;
- IS NOT NULL 运算符 IS NOT NULL 运算符则用于查找那些字段有值的记录。例如,查询所有拥有邮箱地址的员工:
sql
SELECT * FROM Employees
WHERE Email IS NOT NULL;
在处理空值时,特别是在数据清理和完整性检查中,空值判断运算符是非常重要的工具。
统计查询
- COUNT 函数 COUNT 函数用于计算记录的数量。例如,计算员工总数:
SELECT COUNT(*) FROM Employees;
- SUM 函数 SUM 函数用于计算某一列的总和。例如,计算所有订单的总金额:
SELECT SUM(TotalAmount) FROM Orders;
AVG 函数 AVG 函数用于计算平均值。例如,计算员工的平均薪资:
代码语言:javascript复制sql
SELECT AVG(Salary) FROM Employees;
- MAX 和 MIN 函数 MAX 和 MIN 函数分别用于查找某一列的最大值和最小值。例如,查找最高薪资和最低薪资:
SELECT MAX(Salary) AS HighestSalary, MIN(Salary) AS LowestSalary FROM Employees;
多表查询
- 内连接(INNER JOIN) 内连接用于返回两个表中匹配的记录。例如,查询每个订单及其对应的客户信息:
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
- 外连接(OUTER JOIN) 外连接分为左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接(FULL OUTER JOIN)。左外连接返回左表的所有记录以及右表中符合条件的记录,而右外连接则相反。
– 左外连接示例
代码语言:javascript复制SELECT Employees.EmployeeID, Orders.OrderID
FROM Employees
LEFT JOIN Orders ON Employees.EmployeeID = Orders.EmployeeID;
- 自连接 自连接是一种特殊的连接方式,用于从同一张表中提取数据。例如,查找所有员工及其经理的信息:
SELECT E1.EmployeeName AS Employee, E2.EmployeeName AS Manager
FROM Employees E1
LEFT JOIN Employees E2 ON E1.ManagerID = E2.EmployeeID;
子查询
- 在 WHERE 子句中的子查询 例如,找出那些工资高于公司平均工资的员工:
sql
SELECT * FROM Employees
WHERE Salary > (SELECT AVG(Salary) FROM Employees);
- 在 FROM 子句中的子查询 子查询也可以作为虚拟表使用。例如,查询每个部门的平均薪资:
SELECT DepartmentID, AVG(Salary) AS AverageSalary
FROM (SELECT DepartmentID, Salary FROM Employees) AS DeptSalaries
GROUP BY DepartmentID;
联合查询
- UNION UNION 用于合并两个或多个查询的结果集,并去除重复记录。例如,查询来自不同部门的员工姓名:
sql
SELECT EmployeeName FROM Employees WHERE DepartmentID = 1
UNION
SELECT EmployeeName FROM Employees WHERE DepartmentID = 2;
- UNION ALL UNION ALL 则会返回所有记录,包括重复的。例如:
SELECT EmployeeName FROM Employees WHERE DepartmentID = 1
UNION ALL
SELECT EmployeeName FROM Employees WHERE DepartmentID = 2;