MySQL数据库基本语法四 数据库查询(DQL)(排序、分组、分页、聚合函数、别名)

基础查询

数据查询语言(DQL)是SQL语言中的一部分,主要用于查询数据库中的数据。DQL允许用户根据特定的条件来检索表中的数据,并且可以包含一些基本的操作和条件。

语法结构:

SELECT 列名称1 , 列名称2 FROM 表名称;

其中,SELECT指定要检索的列,FROM指定要查询的表,WHERE指定筛选条件。

以下是一些常用的DQL查询语句的示例:

  1. 查询所有数据

如果要查询表中所有的数据,可以使用以下语句:

SELECT * FROM table_name;

这将返回表中的所有行和所有列。

  1. 查询指定列的数据

如果要查询表中某个或某些列的数据,可以使用以下语句:

SELECT column1, column2 FROM table_name;

这将返回表中指定列的所有行。

-- SELECT 列名称1 , 列名称2 FROM 表名称;
-- 查询学生表所有信息
-- SELECT * FROM student;
-- 查询学生信息,要求显示学号、姓名
SELECT stu_no,stu_name FROM student;
基础查询

条件筛选查询

可以使用WHERE子句对查询结果进行条件筛选。WHERE子句允许你指定一个条件,用于从数据库表中过滤出符合条件的记录。同时,还可以与其他DQL语句(如JOIN、GROUP BY等)结合使用,以满足特定的数据查询需求。

条件运算符

  1. 等于(=)

使用"="运算符来比较两个值是否相等。例如,如果要查询名为"John"的用户信息,可以使用以下查询:

SELECT * FROM users WHERE name = 'John';
  1. 不等于(<>或!=)

使用"<>"或"!="运算符来比较两个值是否不相等。例如,如果要查询不是名为"John"的用户信息,可以使用以下查询:

SELECT * FROM users WHERE name <> 'John';
  1. 大于(>)

使用">"运算符来比较一个值是否大于另一个值。例如,如果要查询年龄大于25岁的用户信息,可以使用以下查询:

SELECT * FROM users WHERE age > 25;
  1. 小于(<)

使用"<"运算符来比较一个值是否小于另一个值。例如,如果要查询年龄小于30岁的用户信息,可以使用以下查询:

SELECT * FROM users WHERE age < 30;
  1. 大于等于(>=)

使用">="运算符来比较一个值是否大于或等于另一个值。例如,如果要查询年龄大于或等于25岁的用户信息,可以使用以下查询:

SELECT * FROM users WHERE age >= 25;
  1. 小于等于(<=)

使用"<="运算符来比较一个值是否小于或等于另一个值。例如,如果要查询年龄小于或等于30岁的用户信息,可以使用以下查询:

SELECT * FROM users WHERE age <= 30;
  1. 模糊匹配LIKE

使用LIKE运算符进行模糊匹配。它允许在模式中使用通配符 "%"(匹配任意字符序列)和 "_"(匹配任意单个字符)。例如,如果要查询名字中包含"J"的用户信息,可以使用以下查询:

SELECT * FROM users WHERE name LIKE '%J%';
-- 查询姓名由5个字母构成的学生记录
SELECT * FROM student WHERE stu_name LIKE '_____';

-- 查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
SELECT * FROM student WHERE stu_name LIKE '____i';

--查询姓名以“z”开头的学生记录
SELECT * FROM student WHERE stu_name LIKE 'z%';

-- 查询姓名中第2个字母为“i”的学生记录
SELECT * FROM student WHERE stu_name LIKE'_i%';

-- 查询姓名包含“三”的学生记录
SELECT * FROM student WHERE stu_name LIKE '%三%';
-- LIKE 模糊查询用法
-- 1、'_'字母占位符
-- 2、'%'任意字符匹配符

-- LIKE 模糊查询案例
-- 初始化数据
-- INSERT INTO student (stu_no,stu_name,age,sex,create_date) VALUES ('stu_12', 'abcde', '23', '女', '2100-08-01 00:00:00');
-- INSERT INTO student (stu_no,stu_name,age,sex,create_date) VALUES ('stu_13', 'abcdi', '23', '女', '2100-08-01 00:00:00');
-- INSERT INTO student (stu_no,stu_name,age,sex,create_date) VALUES ('stu_14', 'zabcde', '23', '男', '2100-08-01 00:00:00');
-- INSERT INTO student (stu_no,stu_name,age,sex,create_date) VALUES ('stu_15', 'aibcdef', '23', '男', '2100-08-01 00:00:00');
-- 1、查询姓名由5个字母构成的学生记录
-- SELECT * FROM student WHERE stu_name LIKE '_____';
-- 2、查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
-- SELECT * FROM student WHERE stu_name LIKE '____i';

-- 3、查询姓名以“z”开头的学生记录
-- SELECT * FROM student WHERE stu_name LIKE 'z%';

-- 4、查询姓名中第2个字母为“i”的学生记录
-- SELECT * FROM student WHERE stu_name LIKE '_i%';
-- 5、查询姓名包含“三”的学生记录
-- SELECT * FROM student WHERE stu_name LIKE '%三%';
-- 6、查询姓名包含“三”的学生记录,并且三在最后面
-- SELECT * FROM student WHERE stu_name LIKE '%三';
模糊查询
  1. IN

使用IN运算符来检查一个值是否在给定的列表中。例如,如果要查询ID为1、3或5的用户信息,可以使用以下查询:

SELECT * FROM users WHERE id IN (1, 3, 5);
  1. BETWEEN

使用BETWEEN运算符来指定一个值是否在指定的范围之间。它包括范围的最小值和最大值。例如,如果要查询年龄在20到30岁之间的用户信息,可以使用以下查询:

SELECT * FROM users WHERE age BETWEEN 20 AND 30;
条件查询
-- 条件运算符
-- 1、=  !=  <>  <  <=  >  >=
-- 2、BETWEEN…AND 在什么条件之间的
-- 3、IN()   在什么集合里面
-- 4、IS NULL  条件是空
-- 5、AND  并且,多个条件全部满足
-- 6、OR  或者,多个条件有一个满足就行
-- 7、NOT  取反,真为假假为真
-- 8、IS NOT NULL  条件不为空

-- 条件查询案例
-- 1、查询性别为女,并且年龄等于21的记录(=、and)
-- SELECT * FROM student WHERE sex = '女' AND age = 21;

-- 2、查询学号为'stu_01',或者姓名为‘张三’的记录(=  OR)
-- SELECT  * FROM student WHERE stu_no = 'stu_01' OR stu_name = '张三';

-- 3、查询学号为‘stu_01’,'stu_02','stu_03'的记录(OR) -- ['stu_01','stu_02','stu_03']
-- SELECT * FROM student WHERE stu_no = 'stu_01' OR stu_no = 'stu_02' OR stu_no = 'stu_03';
-- SELECT * FROM student WHERE stu_no IN('stu_01','stu_02','stu_03');

-- 4、查询学号不是‘stu_01’,'stu_02','stu_03'的记录
-- SELECT * FROM student WHERE stu_no NOT IN('stu_01','stu_02','stu_03');
-- 5、查询年龄为null的记录
-- 初始化插入一条年龄为空的数据
-- INSERT INTO student (stu_no,stu_name,sex,create_date) VALUES ('stu_09', '赵六六', '女', '2100-08-01 00:00:00');
-- INSERT INTO student (stu_no,stu_name,sex,create_date) VALUES ('stu_10', '朱七七', '男', '2100-08-01 00:00:00');
-- INSERT INTO student (stu_no,stu_name,sex,create_date) VALUES ('stu_11', '谢八八', '男', '2100-08-01 00:00:00');
-- SELECT * FROM student WHERE age IS NULL;
-- 6、查询年龄在20到40之间的学生记录(BETWEEN…AND)
-- SELECT * FROM  student WHERE age BETWEEN 20 AND 40;
-- SELECT * FROM student WHERE age >= 20 AND age <= 40;
-- 7、查询性别非女的学生记录(NOT、!=、<>)
-- SELECT * FROM student WHERE NOT sex = '女';
-- SELECT * FROM student WHERE sex != '女';
-- SELECT * FROM student WHERE sex <> '女';
-- 8、查询姓名不为null的学生记录
-- SELECT * FROM student WHERE stu_name IS NOT NULL;

列与表取别名

在DQL中,可以为表和列取别名,以便在查询中引用它们。使用别名可以使SQL语句更易读、易写,也可以在查询中消除歧义。

  1. 为表取别名

可以为表取一个别名,以便在查询中引用该表。例如:

SELECT t.name FROM table1 AS t;

在上述查询中,表table1被赋予了别名"t",然后可以通过"t"来引用该表。

  1. 为列取别名

同样,也可以为列取别名。例如:

SELECT name AS player_name FROM table_name;

在上述查询中,列"name"被赋予了别名"player_name"。在结果集中,"player_name"将代表"table_name"表中的"name"列。

-- 给表取别名
-- 给列取别名

-- 作用:方便、增强可读性
-- SELECT *,IFNULL(t.age,0) AS age_1 FROM student AS t ;
-- 
-- SELECT *,IFNULL(t.age,0) age_1 FROM student t ;
取别名
  1. 同时为表和列取别名

还可以同时为表和列取别名。例如:

SELECT t.name AS player_name FROM table1 AS t;

聚合函数

运算函数

DQL中的聚合函数是一组用于对查询结果进行统计的函数。常见的聚合函数包括:

  1. COUNT函数:用于计算查询结果中的行数。

    SELECT COUNT(*) FROM table_name; -- 计算表中的行数
    SELECT COUNT(column_name) FROM table_name; -- 计算符合条件的行数
  1. SUM函数:用于计算某个列的总和。

    SELECT SUM(column_name) FROM table_name; -- 计算列的总和
  1. AVG函数:用于计算某个列的平均值。

    SELECT AVG(column_name) FROM table_name; -- 计算列的平均值
  1. MAX函数:用于找出某个列的最大值。

    SELECT MAX(column_name) FROM table_name; -- 找出列的最大值
  1. MIN函数:用于找出某个列的最小值。

    SELECT MIN(column_name) FROM table_name; -- 找出列的最小值
-- 1、统计:COUNT()
--  2、最大值:MAX()
--  3、最小值:MIN()
--  4、求和:SUM()
--  5、求平均值:AVG()


-- 1、查询student表中记录数
-- SELECT COUNT(*) FROM student;

-- 2、查询student表中年龄大于23的人数
-- SELECT * FROM student;
-- SELECT COUNT(*) FROM student t WHERE t.age > 23;

-- 3、查询student表中最大年龄
-- SELECT MAX(age) FROM student;
-- 4、查询student表中最小年龄
-- SELECT MIN(age) FROM student;

-- 4、查询成绩表中,所有成绩的总和
-- SELECT SUM(stu_score) FROM score;

-- 5、查询成绩表中,所有成绩的平均值
-- SELECT AVG(stu_score) FROM score;
聚合函数

条件筛选查询

ORDER BY排序

在DQL中,可以通过ORDER BY子句对查询结果进行排序。排序可以按照升序(ASC)或降序(DESC)进行。

语法结构:

SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式, 字段2 排序方式2;

其中,排序方式可以是ASC(升序,默认值)或DESC(降序)。

以下是一些排序查询的示例:

  1. 单列排序:

    SELECT * FROM employees ORDER BY last_name ASC; -- 按姓氏升序排序
    SELECT FROM employees ORDER BY last_name DESC; -- 按姓氏降序排序
  1. 多列排序:

    SELECT * FROM employees ORDER BY last_name ASC, first_name ASC; -- 先按姓氏升序排序,再按名字升序排序
    SELECT FROM employees ORDER BY last_name DESC, first_name DESC; -- 先按姓氏降序排序,再按名字降序排序
  1. 对聚合结果进行排序:

SELECT COUNT(*) FROM employees GROUP BY department_id ORDER BY COUNT(*) DESC; -- 按部门人数降序排序

GROUP BY 查询(分组查询)

GROUP BY子句在DQL中用于根据一个或多个列对查询结果进行分组。它通常与聚合函数一起使用,以便对每个组应用计算并生成汇总数据。

语法如下:

SELECT 列1, 列2, ... FROM 表名 GROUP BY 列1, 列2, ... ;

其中,列1、列2等是要选择的列,表名是要查询的表的名称,GROUP BY子句指定了根据哪些列进行分组。

以下是一些GROUP BY查询的示例:

  1. 根据单个列分组:

SELECT department_id, COUNT(*) FROM employees GROUP BY department_id; -- 按部门分组并计算每个部门的员工数
  1. 根据多个列分组:

SELECT department_id, job_title, COUNT(*) FROM employees GROUP BY department_id, job_title; -- 按部门和职位分组并计算每个部门中每个职位的员工数
  1. 使用聚合函数与GROUP BY结合:

SELECT department_id, AVG(salary) FROM employees GROUP BY department_id; -- 按部门分组并计算每个部门的平均工资

GROUP BY子句还可以与HAVING子句一起使用,以进一步筛选分组结果。HAVING子句允许你指定一个条件,用于在分组之后对分组结果进行筛选。

SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING AVG(salary) > 50000; -- 按部门分组并计算每个部门的平均工资,仅返回平均工资大于50000的部门

HAVING子句

HAVING子句是SQL语句中的一个条件筛选语句,它用于在分组查询(group by)之后进一步筛选满足条件的分组结果。

语法上,HAVING子句位于GROUP BY子句之后,完整的语法如下:

SELECT 列1, 列2, ... FROM 表名 GROUP BY 列1, 列2, ... HAVING 条件;

其中,列1、列2等是要选择的列,表名是要查询的表的名称,GROUP BY子句指定了根据哪些列进行分组,HAVING子句则指定了进一步筛选分组的条件。

HAVING子句可以与聚合函数一起使用,例如COUNT、SUM、AVG等,以便对每个组应用计算并生成满足条件的汇总数据。

以下是一些HAVING子句的示例:

  1. 根据分组后的计数筛选:

SELECT department_id, COUNT(*) FROM employees GROUP BY department_id HAVING COUNT(*) > 10; -- 按部门分组并计算每个部门的员工数,仅返回员工数大于10的部门
  1. 根据聚合函数的计算结果筛选:

SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING AVG(salary) > 50000; -- 按部门分组并计算每个部门的平均工资,仅返回平均工资大于50000的部门

注意事项:

  • HAVING子句只能用于在分组查询(group by)之后进行筛选,不能单独使用。
  • HAVING子句后面的字段必须是分组字段或聚合函数的结果,不能是表中的其他字段。
  • 在使用HAVING子句时,SELECT子句中必须包含一个或多个聚合函数,否则会报错。
-- 1、ORDER BY 排序
-- 2、GROUP BY分组查询
-- 3、HAVING子句
-- 4、LIMIT分页查询


-- 1、查询所有学生记录,按年龄升序排序(默认为升序:ASC)
-- SELECT * FROM student ORDER BY age ASC;

-- 2、查询所有学生记录,按年龄降序排序(降序:DESC)
-- SELECT * FROM student ORDER BY age DESC,stu_no ASC;

-- 3、查询学生成绩表,找出各科最高成绩和课程编号
-- SELECT * FROM score;
-- SELECT MAX(stu_score),course_no FROM score GROUP BY course_no;

-- 4、查询每门课程的平均成绩,显示平均成绩和课程编号
-- SELECT AVG(stu_score),course_no FROM score GROUP BY course_no;

-- 5、查询每门课程的平均成绩,并找出平均成绩大于60分的课程编号和平均成绩
-- SELECT AVG(stu_score) AS avg_score,course_no FROM score GROUP BY course_no HAVING avg_score > 60;

-- 6、查询学生表前5行记录
-- SELECT * FROM student LIMIT 0,5;
条件筛选查询

 LIMIT分页查询

LIMIT分页查询是在SQL查询语句中用于实现分页功能的一种方法。通过LIMIT子句,可以限制从查询结果返回的记录数量。

语法上,LIMIT子句可以接受两个参数:偏移量(offset)和行数(row count)。偏移量表示从查询结果中的第几行开始返回,而行数表示要返回的行数。

完整的语法如下:


SELECT 列1, 列2, ... FROM 表名 LIMIT 偏移量, 行数;

其中,偏移量是一个可选参数,如果没有提供偏移量,默认从查询结果的第1行开始返回。行数是必需的参数,指定要返回的行数。

以下是一些LIMIT分页查询的示例:

  1. 返回前5条记录:

SELECT * FROM 表名 LIMIT 5;
  1. 返回从第3条记录开始的5条记录:

SELECT * FROM 表名 LIMIT 3, 5;
  1. 返回从第10条记录开始的后5条记录:

SELECT * FROM 表名 LIMIT 10 OFFSET 5;

这些示例展示了如何使用LIMIT子句实现分页查询。通过调整偏移量和行数,可以方便地获取查询结果的一部分,从而实现分页效果。

posted @ 2023-08-27 09:34  乐瓜乐虫  阅读(80)  评论(0编辑  收藏  举报