目录
- 一、基本查询
- 二、条件查询
- 2.1 简单条件表达式
- 2.2 逻辑表达式
- 2.3 模糊查询 (`LIKE`)
- 2.4 范围查询 (`BETWEEN ... AND ...`)
- 2.5 列表查询 (`IN`)
- 2.6 空值查询 (`IS NULL` 或 `IS NOT NULL`)
- 三、排序查询
- 3.1 基本语法
- 3.2 单列排序
- 3.2 多列排序
- 3.3 使用表达式排序
- 四、分组查询
- 聚合函数
- 分组查询-基础语法
- 示例
- 多列分组
- 使用HAVING子句
- 注意
- 五、限制查询【`LIMIT`】
- 注意
- 六、多表查询
- 最后当然还需要配合一些题目练习查询语句的技巧,下面的链接是一些比较经典的题目,可以尝试着写一下
- MySQL查询练习题目
- 最后
一、基本查询
select 字段1,字段2,… from 表名;
查询返回的是一张虚拟表
,查询对原表数据没有任何影响,默认查询的全表数据
-- 基本查询
-- 查询所有列
select sid,sname,age,sex,score,cid groupLeaderId from stu;
-- 查询所有列,在测试,练习时可以使用*代替
select * from stu;
-- 查询指定 列
select sid,sname,sex from stu;
-- 查询的列名可以取别名,使用as,但是一般as不写
select sid as 学号,sname as 姓名,score 成绩 from stu-- 年龄+1
select age+1 from stu;
算数运算符 | 描述 |
---|---|
+ | 两列做加法运算 |
- | 两列做减法运算 |
* | 两列做乘法运算 |
/ | 两列做除法运算 |
二、条件查询
MySQL 中的条件查询主要用于从数据库表中筛选出符合特定条件的记录。条件通过 WHERE
子句来指定,可以结合多种运算符和函数来构建复杂的查询条件。以下是一些基本的条件表达式类型及其示例:
2.1 简单条件表达式
- 等于 (
=
): 查询某一列值等于特定值。SELECT * FROM employees WHERE salary = 8000;
- 不等于 (
!=
或<>
): 查询某一列值不等于特定值。SELECT * FROM employees WHERE salary != 8000;
- 大于 (
>
), 小于 (<
), 大于等于 (>=
), 小于等于 (<=
):SELECT * FROM employees WHERE age > 30;
2.2 逻辑表达式
- AND: 用于组合多个条件,所有条件必须同时满足。
SELECT * FROM employees WHERE department = 'Sales' AND salary > 5000;
- OR: 用于组合条件,任一条件满足即可。
SELECT * FROM employees WHERE department = 'Sales' OR department = 'Marketing';
- NOT: 对条件取反。
SELECT * FROM employees WHERE NOT (salary >= 5000);
2.3 模糊查询 (LIKE
)
- 用于匹配包含特定模式的字符串。
SELECT * FROM employees WHERE name LIKE 'J%'; -- 开头为 J 的名字 SELECT * FROM employees WHERE name LIKE '%a%'; -- 包含字母 a 的名字 SELECT * FORM employees WHERE name LIKE '李_'; -- 两个字的李姓
2.4 范围查询 (BETWEEN ... AND ...
)
- 用于查询值在指定范围内的记录。
SELECT * FROM employees WHERE hire_date BETWEEN '2000-01-01' AND '2010-12-31';
2.5 列表查询 (IN
)
- 用于匹配列值是否在给定的值列表中。
SELECT * FROM employees WHERE department IN ('HR', 'IT');
2.6 空值查询 (IS NULL
或 IS NOT NULL
)
- 用于查询某列值是否为空或非空。
SELECT * FROM employees WHERE email IS NULL;
三、排序查询
在MySQL中,排序查询主要通过ORDER BY
子句来实现。以下是一些关于如何使用ORDER BY
进行排序的关键点和示例:
3.1 基本语法
SELECT column1, column2, ...
FROM table_name
ORDER BY column_to_sort [ASC|DESC], [another_column_to_sort [ASC|DESC]];
column_to_sort
是要根据其值进行排序的列名。ASC
表示升序排序,默认值,可以省略。DESC
表示降序排序。
3.2 单列排序
-- 按照年龄升序排序
SELECT * FROM students ORDER BY age ASC;-- 按照分数降序排序
SELECT * FROM scores ORDER BY score DESC;
3.2 多列排序
当有多列参与排序时,先按照第一个列排序,如果第一个列有相同值,则按照第二个列排序,以此类推。
-- 先按班级升序,班级相同则按学号降序
SELECT * FROM students ORDER BY class ASC, student_id DESC;
3.3 使用表达式排序
可以在ORDER BY
中使用表达式,比如计算列或函数。
-- 计算年薪并按其降序排序
SELECT *, (salary * 12) AS year_salary -- AS 也可以省略
FROM employees
ORDER BY year_salary DESC;
注意:ORDER BY
子句通常置于查询的末尾,但在LIMIT
子句之前。
四、分组查询
在MySQL中,分组查询是通过GROUP BY
子句来实现的,它允许你根据一个或多个列的值将查询结果分成多个组,以便于进行聚合操作,如计算每个组的总数、平均值、最大值、最小值等。以下是进行分组查询的基本概念和示例:
分组查询通常配合聚合函数进行查询,下面先讲一下聚合函数
聚合函数
MySQL支持多种聚合函数,以下是一些常用的聚合函数及其用途:
-
COUNT():
- 功能:计算行数。
- 用法:
COUNT(*)
计算所有行,包括 NULL 值;COUNT(column_name)
计算指定列中非 NULL 值的数量。
-
SUM():
- 功能:计算一列的总和。
- 用法:
SUM(column_name)
返回指定列所有值的和。
-
AVG():
- 功能:计算平均值。
- 用法:
AVG(column_name)
返回指定列所有值的平均数。
-
MAX():
- 功能:找出最大值。
- 用法:
MAX(column_name)
返回指定列中的最大值。
-
MIN():
- 功能:找出最小值。
- 用法:
MIN(column_name)
返回指定列中的最小值。
注意,聚合函数不能直接嵌套调用,例如,不能直接写成AVG(SUM(column_name))
的形式,如果需要这样的复合聚合操作,通常需要使用子查询或者临时变量。
分组查询-基础语法
SELECT column1,column2...
FROM table_name
WHERE conditions
GROUP BY column1 [ASC|DESC], column2...;
column1
,column2
是用于分组的列名。table_name
是表的名称。WHERE conditions
是可选的,用于在分组前过滤数据。ASC
或DESC
可用于指定分组的排序顺序,但不常用,因为通常是在聚合后对结果进行排序。
示例
假设有一个销售订单表orders
,包含product_id
(产品ID)、quantity
(数量)和order_date
(订单日期)字段,你想要按产品ID分组并计算每个产品的总销售数量:
SELECT product_id, SUM(quantity) AS total_quantity
FROM orders
GROUP BY product_id;
多列分组
如果你需要根据多个列进行分组,只需在GROUP BY
后面列出这些列名,例如,同时按产品ID和订单日期分组:
SELECT product_id, order_date, SUM(quantity) AS daily_total_quantity
FROM orders
GROUP BY product_id, order_date;
使用HAVING子句
HAVING
子句用于在分组后对结果进行过滤,通常与聚合函数一起使用:
SELECT product_id, SUM(quantity) AS total_quantity
FROM orders
GROUP BY product_id
HAVING SUM(quantity) > 100;
这将只显示总销售数量超过100的产品。
注意
GROUP BY
必须出现在WHERE
子句之后,ORDER BY
之前。- 未包含在聚合函数中的、且不在
GROUP BY
子句中的列不能出现在SELECT
列表中,除非该列也在GROUP BY
子句中。 ORDER BY
可以用来对最终的分组结果进行排序。
五、限制查询【LIMIT
】
在MySQL中,限制查询结果数量通常使用LIMIT
子句。LIMIT
允许你指定从查询结果中返回的行数。其基本语法如下:
SELECT column1, column2, ...
FROM table_name
LIMIT [offset,] row_count;
offset
是一个可选参数,表示从哪一行开始返回结果,第一行的索引是0。如果省略,默认从0(即第一行)开始。row_count
是必需的,指定了想要返回的最大行数。
例如,如果你想从employees
表中获取前5条记录,可以这样写:
SELECT * FROM employees LIMIT 5;
如果你想从第10条记录开始,获取接下来的10条记录,可以这样写:
SELECT * FROM employees LIMIT 10, 10;
这里,10
是索引,表示从第10条记录开始,10
是行数,表示需要获取10条记录。
注意
- 限制查询通常用于实现分页功能
例如:假如 student 表中有50个学生
如果在页面显示所有学生信息,50个学生全部都显示在一页上,显然是不可能的,就算显示出来,也很难找到想要查看的信息。 - 那么,就要通过实现分页显示功能,来进行显示信息
假设 一页显示10个学生,也就是十条数据,那就分成5页 - 页数:pageNum = 5
- 单页数据量:pageSize = 10
- 查询第n页数据:
select * from student limit (n-1) * pageSize , pageSize
六、多表查询
MySQL中的多表查询主要用于从两个或更多表中联合检索数据,主要通过以下几种方式实现:
-
内连接(INNER JOIN):
内连接只返回两个表中匹配的行。如果表A的某行在表B中没有匹配,或者反过来,那么这行就不会出现在结果集中。SELECT columns FROM table1 INNER JOIN table2 ON table1.column = table2.column;
也可以这样写:
SELECT columnsFROM table1 , table2where table1.column = table2.column;
-
外连接(OUTER JOIN):
- 左连接(LEFT JOIN/LEFT OUTER JOIN):返回左表的所有行,即使在右表中没有匹配项。如果右表中没有匹配,则结果为NULL。
SELECT columns FROM table1 LEFT JOIN table2 ON table1.column = table2.column;
- 右连接(RIGHT JOIN/RIGHT OUTER JOIN):与左连接相反,返回右表的所有行,即使左表中没有匹配项。
SELECT columns FROM table1 RIGHT JOIN table2 ON table1.column = table2.column;
- 全连接(FULL JOIN):返回左表和右表中的所有行。如果某一边没有匹配,则另一边的结果为NULL。MySQL本身不直接支持FULL JOIN,但可以通过UNION来模拟实现。
- 左连接(LEFT JOIN/LEFT OUTER JOIN):返回左表的所有行,即使在右表中没有匹配项。如果右表中没有匹配,则结果为NULL。
-
交叉连接(CROSS JOIN):
返回左表的每一行与右表的每一行的笛卡尔积,即所有可能的组合。如果不带ON子句,那么就是一个交叉连接。SELECT columns FROM table1 CROSS JOIN table2;
-
子查询(Nested Select或Subquery):
在一个查询内部嵌套另一个查询,外部查询可以使用内部查询的结果。SELECT column FROM table1 WHERE column IN (SELECT column FROM table2);
-
使用表别名(Aliases):
为表指定别名可以简化复杂的查询,提高代码的可读性。SELECT a.column1, b.column2 FROM table1 AS a INNER JOIN table2 AS b ON a.id = b.id;
其中
AS
可以省略:SELECT a.column1, b.column2 FROM table1 a INNER JOIN table2 b ON a.id = b.id;
最后当然还需要配合一些题目练习查询语句的技巧,下面的链接是一些比较经典的题目,可以尝试着写一下
MySQL查询练习题目
最后
如果感觉有收获的话,点个赞 👍🏻 吧。
❤️❤️❤️本人菜鸟修行期,如有错误,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍