1. 无条件查询
使用 SELECT 语句可以从一个或多个表中检索所有记录或特定列的数据。这是最基本的查询形式,无需任何筛选条件。
SELECT column_name(s) FROM table_name;
2. 条件查询
2.1 比较查询
通过比较运算符如 =、!=、<、> 等进行数据筛选。
SELECT * FROM students WHERE age > 20;
2.2 范围查询
利用 BETWEEN ... AND ... 进行范围值的筛选。
SELECT * FROM products WHERE price BETWEEN 100 AND 500;
2.3 集合查询
使用 IN 关键字检查字段值是否在指定集合内。
SELECT * FROM employees WHERE department IN ('HR', 'IT');
2.4 模糊查询
借助 LIKE 和通配符 % 或 _ 进行模式匹配。
SELECT * FROM customers WHERE name LIKE 'Jo%';
2.5 空值查询
使用 IS NULL 或 IS NOT NULL 查询空值或非空值。
SELECT * FROM orders WHERE shipped_date IS NULL;
2.6 混合查询
结合使用不同的条件运算符以实现更复杂的查询逻辑。
3. 分组统计
3.1 聚合函数
3.1.1 COUNT()
-
用途:计数函数,用于计算某个列中的行数。
-
语法:
SELECT COUNT(column_name) FROM table_name; -
示例:计算表
employees中的员工数量。SELECT COUNT(*) FROM employees;使用
*表示计算所有行的数量,包括含有NULL值的行。如果想要排除NULL值,可以指定某一列。
3.1.2 SUM()
-
用途:求和函数,用于计算数值列中所有值的总和。
-
语法:
SELECT SUM(column_name) FROM table_name; -
示例:计算表
orders中所有订单的金额总和。SELECT SUM(amount) AS total_amount FROM orders;
3.1.3 AVG()
-
用途:平均值函数,用于计算数值列中所有值的平均值。
-
语法:
SELECT AVG(column_name) FROM table_name; -
示例:计算表
employees中员工薪资的平均值。SELECT AVG(salary) AS avg_salary FROM employees;
等等,我就介绍这三种,其他的基本用法差不多,主播很懒得。
注意事项
-
当使用这些聚合函数时,如果没有匹配的记录,
COUNT()将返回0,而其他函数(如SUM()、AVG()、MAX()、MIN())将返回NULL。 -
可以结合
GROUP BY子句一起使用这些聚合函数来根据一个或多个列对结果进行分组,并对每个组应用聚合函数。例如:SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department;这个查询会按部门分组,并计算每个部门的平均薪资。
3.2 分组查询
如何使用 GROUP BY 子句对结果集进行分组,并结合 HAVING 对分组后的结果进行过滤。
SELECT department, AVG(salary) FROM employees GROUP BY department HAVING AVG(salary) > 5000;
4. 排序查询
使用 ORDER BY 子句按一个或多个列排序,支持升序(ASC)和降序(DESC)排列。
SELECT * FROM sales ORDER BY amount DESC;
5. 限制查询结果数量
使用 LIMIT 子句限制返回的结果数,适用于分页等场景。
SELECT * FROM articles LIMIT 10;
6. 连接查询
6.1 交叉连接
提供两个表的笛卡尔积。
SELECT * FROM table1 CROSS JOIN table2;
6.2 内连接
定义
- 内连接:仅返回两个表中根据连接条件匹配的行。如果一个表中的某些行在另一个表中没有匹配项,那么这些行将不会出现在查询结果中。
应用场景
- 当你需要从多个表中获取相关联的数据,并且只关心那些在所有涉及表中都有对应记录的信息时,内连接是一个非常有用的工具。例如,如果你有两个表——一个是关于订单信息的,另一个是关于客户信息的,你可以使用内连接来获取那些既有订单也有对应客户信息的记录。
示例
假设我们有两个表:
orders表包含订单信息,包括订单ID (order_id)、客户ID (customer_id) 和订单金额 (amount)。customers表包含客户信息,包括客户ID (customer_id) 和客户名称 (name)。
现在,如果你想获取每个订单及其对应的客户名称,可以使用如下SQL语句进行内连接:
sql
浅色版本
SELECT orders.order_id, customers.name, orders.amount
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;
在这个例子中:
- 如果某个订单存在于
orders表中,但是其customer_id在customers表中找不到对应的记录,这个订单将不会出现在查询结果中。 - 同样地,如果
customers表中有客户记录,但这些客户的customer_id没有出现在orders表中,这些客户也不会出现在查询结果中。
特点
- 精确匹配:只有当连接条件两边的表都有匹配的记录时,这些记录才会被选中并显示出来。
- 过滤不相关的数据:自动排除了那些无法在所有参与表中找到匹配的数据行,从而使得结果集更加聚焦和相关。
通过这种方式,内连接能够有效地帮助你筛选出那些在不同表之间具有关联性的数据,同时排除掉那些无关或不完整的数据条目。这对于需要处理多表关系的应用场景来说尤为重要。希望这能帮助你更好地理解和应用内连接!
6.3 外连接
6.3.1左连接(LEFT JOIN)
- 定义:左连接会返回左表中的所有记录,以及右表中满足连接条件的记录。如果右表中没有与左表匹配的记录,则结果集中对应的右表字段将为
NULL。 - 应用场景:当你想要获取左表中的所有数据,并且希望看到哪些数据在右表中不存在匹配项时,左连接就显得特别有用。
- 示例:
SELECT authors.name, books.title
FROM authors
LEFT JOIN books ON authors.id = books.author_id;
在这个例子中,即使某些作者没有书籍(即在 books 表中没有对应记录),这些作者的名字仍会被列出,而 books.title 字段则会显示为 NULL。
6.3.2右连接(RIGHT JOIN)
- 定义:右连接与左连接相反,它会返回右表中的所有记录,以及左表中满足连接条件的记录。如果左表中没有与右表匹配的记录,则结果集中对应的左表字段将为
NULL。 - 应用场景:适用于你希望获取右表中的所有数据,并查看哪些数据在左表中没有匹配项的情况。
- 示例:
SELECT authors.name, books.title
FROM authors
RIGHT JOIN books ON authors.id = books.author_id;
这个查询将列出所有的书籍,包括那些没有关联作者信息的书籍(即在 authors 表中找不到对应的 author_id 的情况)。
注意事项
- 在实际应用中,有时使用左连接或右连接的效果是相同的,这取决于哪张表作为主表(即左侧表或右侧表)。选择哪种连接方式更多地取决于查询逻辑和个人偏好。
- 对于全外连接(FULL OUTER JOIN),虽然MySQL不直接支持,但你可以通过结合左连接和右连接的结果来实现类似的功能。例如:
sql
浅色版本
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION ALL
SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id
WHERE table1.id IS NULL;
这样就可以获得两个表的所有记录,不论是否存在匹配项。
7. 嵌套查询
7.1 不相关子查询
-
定义:不相关子查询是指子查询可以独立于外部查询执行,其结果不会受到外部查询的影响。子查询先于外部查询执行,并返回一个或多个值作为外部查询的一部分。
-
示例:查找所有比公司平均薪资高的员工。
sql 浅色版本 SELECT name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);在这个例子中,内部的子查询
(SELECT AVG(salary) FROM employees)独立计算了所有员工的平均工资,然后外部查询使用这个结果来筛选出工资高于平均值的员工。
7.2 相关子查询
-
定义:相关子查询依赖于外部查询提供的数据,因此对于外部查询中的每一行都会执行一次子查询。这意味着子查询不能独立于外部查询执行。
-
示例:查找每个部门中工资最高的员工。
sql 浅色版本 SELECT e1.name, e1.department, e1.salary FROM employees e1 WHERE e1.salary = (SELECT MAX(e2.salary) FROM employees e2 WHERE e2.department = e1.department);在这个例子中,对于
employees表中的每一个员工(外部查询),都会执行一次子查询(SELECT MAX(e2.salary) FROM employees e2 WHERE e2.department = e1.department)来找到该部门的最高工资,并与当前员工的工资进行比较。
7.3 其他类型的子查询
-
EXISTS 子查询:用于检查子查询是否返回任何行。如果子查询返回一行或多行,则
EXISTS返回真,否则返回假。-
示例:找出有员工的部门。
sql 浅色版本 SELECT department_name FROM departments d WHERE EXISTS (SELECT 1 FROM employees e WHERE e.department_id = d.department_id);
-
-
IN 子查询:用于检查某个值是否在子查询返回的结果集中。
-
示例:找出在特定项目组工作的员工的名字。
sql 浅色版本 SELECT name FROM employees WHERE department_id IN (SELECT department_id FROM projects WHERE project_name = 'Project X');
-
-
FROM 子句中的子查询:可以在
FROM子句中使用子查询来创建临时表,这些临时表可以像普通表一样被查询。-
示例:计算各部门的平均工资,并按平均工资排序。
sql 浅色版本 SELECT department, avg_salary FROM (SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department) AS dept_avg_salary ORDER BY avg_salary DESC;
-
8. 传统的集合运算
简要介绍并集(UNION)、交集(INTERSECT,MySQL不直接支持)、差集(EXCEPT,MySQL不直接支持)等集合操作。这个由于我们学校没做要求我就不再详细做介绍,我的意思是自己翻书,翻书是什么意思,就是下课来办公室的意思。
9. 结论
总结 MySQL 查询语句的重要性,并强调持续学习和实践对于掌握数据库查询技能的重要性。