MYSQLDQL命令

MYSQLDQL命令

1. 课程基础与数据库表结构

1.1 课程目标总览

模块核心能力要求
DQL(一)掌握MySQL删除数据、基础查询/模糊查询、内连接/左外连接,理解连接查询/自连接原理
DQL(二)掌握排序(ORDER BY)、分页(LIMIT)、子查询、聚合函数、分组查询(GROUP BY)

1.2 MySchool数据库表结构(核心业务表)

表名核心字段表作用
studentStudentNo(主键,学号)、StudentName(姓名)、GradeID(外键,年级ID)、Phone/Address存储学生基本信息
subjectSubjectNo(主键,课程ID)、SubjectName(课程名)、ClassHour(课时)、GradeID(外键)存储课程信息
resultStudentNo(外键,学号)、SubjectNo(外键,课程ID)、ExamDate(考试时间)、StudentResult(成绩)存储学生考试成绩
gradeGradeID(主键,年级ID)、GradeName(年级名)存储年级信息

2. DQL核心语法与基础查询

2.1 DQL定义

DQL(Data Query Language,数据查询语言):用于查询数据库数据,是数据库语言中最核心、使用频率最高的语句,支持单表查询、多表复杂查询、嵌套查询。

2.2 SELECT基础语法(完整结构)

SELECT [ALL | DISTINCT]
{ * | table.* | [table.field1 [AS alias1], table.field2 [AS alias2], ...] }
FROM table_name [AS table_alias]
    [LEFT/RIGHT/INNER JOIN table_name2 ON 关联条件]  -- 多表查询
    [WHERE 行过滤条件]                                -- 过滤行数据
    [GROUP BY 分组字段]                               -- 分组
    [HAVING 分组过滤条件]                             -- 过滤分组结果
    [ORDER BY 排序字段 [ASC/DESC]]                    -- 排序
    [LIMIT {[offset, ] row_count | row_count OFFSET offset}] ;  -- 分页
  • []:可选内容;{}:必选内容;#/* */:注释

2.3 基础查询操作

2.3.1 指定查询字段
操作场景语法示例注意事项
查询所有字段(不推荐)SELECT * FROM student;效率低,无法控制返回字段,易出现字段冗余
指定字段查询SELECT StudentNo, StudentName, Phone FROM student;只返回需要的字段,效率高
区分多表同名字段SELECT student.StudentNo, StudentResult FROM student, result;当多表有同名字段(如StudentNo),需用“表名.字段名”指定归属
2.3.2 AS子句(别名)
  • 作用:给字段/表取别名,简化语法;重命名计算/统计结果列。
  • 用法AS可省略,直接用空格分隔。
    -- 字段别名(中文需加引号)
    SELECT StudentNo AS "学号", StudentName AS 姓名 FROM student;
    -- 表别名(简化多表查询)
    SELECT a.StudentNo FROM student AS a;
    -- 计算结果别名
    SELECT ClassHour + 10 AS "新课时" FROM subject;  -- 课时加10后重命名
    
2.3.3 DISTINCT去重
  • 作用:去除查询结果中所有返回列值完全相同的重复记录,只保留1条。
  • 语法SELECT DISTINCT 字段1, 字段2... FROM 表名;
  • 示例:查询成绩表中涉及的所有课程ID(去重)
    SELECT DISTINCT SubjectNo FROM result;  -- 避免重复课程ID
    
  • 注意ALL是默认值,返回所有记录(包括重复),与DISTINCT相反。
2.3.4 表达式列
  • 组成:文本值、列值、NULL、函数、操作符(如+、-、*、/)。
  • 应用场景:SELECT结果列、ORDER BY、HAVING、WHERE条件。
  • 示例
    -- 返回MySQL版本和计算结果
    SELECT version() AS MySQL版本, 100 * 3 AS 计算结果;
    -- 课程课时加10,重命名避免符号干扰开发程序
    SELECT SubjectName "课程名称", ClassHour + 10 AS "新学时" FROM subject;
    

3. 条件查询(WHERE子句)

3.1 WHERE子句作用

筛选符合条件的行数据,条件由“逻辑操作符+比较操作符”组成,结果为“真/假”。

3.2 逻辑操作符

操作符名称语法描述示例(查询80-90分的成绩)
逻辑与AND&&所有条件同时为真,结果才为真WHERE StudentResult >=80 AND StudentResult <=90
逻辑或OR 或 ``
逻辑非NOT!条件为假时,结果为真WHERE NOT StudentResult = 100

3.3 比较操作符

操作符名称语法描述示例
IS NULLa IS NULL判断字段a是否为NULL(无值)SELECT * FROM student WHERE Address IS NULL;
IS NOT NULLa IS NOT NULL判断字段a是否不为NULLSELECT * FROM student WHERE Address IS NOT NULL;
BETWEEN ANDa BETWEEN b AND c判断a是否在[b, c]范围内(含边界)SELECT * FROM subject WHERE ClassHour BETWEEN 110 AND 120;(等同于>=110 AND <=120
LIKEa LIKE b模糊匹配(%匹配0/多个字符,_匹配1个字符)SELECT * FROM subject WHERE SubjectName LIKE "%数学%";(含“数学”的课程);SELECT * FROM student WHERE StudentName LIKE "李__";(姓“李”的3字姓名)
INa IN (a1,a2,a3...)判断a是否等于列表中的任意一个值SELECT * FROM subject WHERE ClassHour IN (100,110,120);(比OR更简洁高效)

3.4 关键注意点

  1. 数值类型字段才能进行算术运算(如StudentResult + 5);
  2. 相同数据类型才能比较(如字符串不能和数值比较);
  3. NULL≠0≠空字符串"",判断NULL必须用IS NULL/IS NOT NULL,不能用=

4. 连接查询(多表查询)

4.1 连接查询分类

用于获取多张表的关联数据,核心是通过“外键”建立表间关联(如student.GradeID = grade.GradeID)。

4.2 内连接(INNER JOIN)

  • 逻辑:只返回两张表中匹配成功的记录(无匹配的记录不显示)。
  • 语法INNER JOINJOIN等效。
    SELECT 字段1, 字段2... FROM table1
    INNER JOIN table2 ON table1.关联字段 = table2.关联字段;
    
  • 示例:查询课程名及所属年级名(关联subjectgrade
    -- 内连接方式
    SELECT s.SubjectName, g.GradeName 
    FROM subject AS s
    INNER JOIN grade AS g ON s.GradeID = g.GradeID;
    
    -- 等值连接(等效于内连接,逗号分隔表,WHERE写关联条件)
    SELECT s.SubjectName, g.GradeName 
    FROM subject AS s, grade AS g
    WHERE s.GradeID = g.GradeID;
    
    -- 非等值连接(无关联条件,返回两表记录数乘积,慎用)
    SELECT s.SubjectName, g.GradeName FROM subject AS s, grade AS g;
    

4.3 外连接(OUTER JOIN)

连接类型语法逻辑(以table1为左表,table2为右表)
左外连接SELECT ... FROM table1 LEFT [OUTER] JOIN table2 ON 关联条件;返回左表所有记录,右表匹配成功则显示,无匹配则显示NULL
右外连接SELECT ... FROM table1 RIGHT [OUTER] JOIN table2 ON 关联条件;返回右表所有记录,左表匹配成功则显示,无匹配则显示NULL
  • 示例:查询所有学生及成绩(无成绩的学生也显示)
    SELECT s.StudentNo, s.StudentName, r.StudentResult
    FROM student AS s
    LEFT JOIN result AS r ON s.StudentNo = r.StudentNo;
    

4.4 自连接

  • 逻辑:将一张表视为两张表,通过别名区分,实现表内数据关联查询(如查询父子栏目)。
  • 示例:查询栏目表(category)的父栏目与子栏目名称
    -- 1. 创建栏目表
    CREATE TABLE IF NOT EXISTS category(
        categoryId INT(10) AUTO_INCREMENT PRIMARY KEY,  -- 栏目ID
        categoryName VARCHAR(32) NOT NULL,              -- 栏目名称
        pid INT(10)                                     -- 父栏目ID(关联categoryId)
    );
    
    -- 2. 自连接查询(a为子栏目表,b为父栏目表)
    SELECT a.categoryName AS "子栏目", b.categoryName AS "父栏目"
    FROM category AS a
    LEFT JOIN category AS b ON a.pid = b.categoryId;
    

4.5 不同JOIN对比

连接类型描述
INNER JOIN只返回两表匹配成功的记录
LEFT JOIN返回左表所有记录,右表匹配则显示
RIGHT JOIN返回右表所有记录,左表匹配则显示

5. 结果排序与分页

5.1 ORDER BY排序

  • 作用:对查询结果按指定字段排序。
  • 语法ORDER BY 字段1 [ASC/DESC], 字段2 [ASC/DESC]
    • ASC:升序(默认,如1→10,A→Z);DESC:降序(如10→1,Z→A)。
  • 示例:查询《数据库结构-1》的考试结果,按成绩降序排列
    SELECT r.StudentNo, r.StudentResult
    FROM result AS r
    INNER JOIN subject AS s ON r.SubjectNo = s.SubjectNo
    WHERE s.SubjectName = "数据库结构-1"
    ORDER BY r.StudentResult DESC;
    

5.2 LIMIT分页

  • 作用:限制查询结果的行数,常用于分页显示(如第1页显示5条,第2页显示6-10条)。
  • 语法:两种形式等效
    1. LIMIT [offset, row_count]offset为起始偏移量(从0开始),row_count为返回行数;
    2. LIMIT row_count OFFSET offset
  • 示例
    SELECT * FROM result LIMIT 5;          -- 返回前5条记录(offset=0,默认)
    SELECT * FROM result LIMIT 5, 10;      -- 返回第6-15条记录(offset=5,row_count=10)
    SELECT * FROM result LIMIT 10 OFFSET 5;-- 与上句等效
    

6. 子查询

6.1 定义

子查询:在WHERE条件子句中嵌套另一个查询语句,由里及外求解,子查询结果通常为集合(建议用IN匹配)。

6.2 示例

查询“《高等数学-2》且分数≥80分”的学生学号和姓名:

-- 1. 先查《高等数学-2》的课程ID(子查询)
-- 2. 再查该课程中分数≥80的学生ID,关联学生表获取姓名
SELECT s.StudentNo, s.StudentName
FROM student AS s
INNER JOIN result AS r ON s.StudentNo = r.StudentNo
WHERE r.SubjectNo = (SELECT SubjectNo FROM subject WHERE SubjectName = "高等数学-2")
  AND r.StudentResult >= 80;

6.3 注意点

  • 子查询可多层嵌套;
  • 若子查询返回多个结果,需用IN代替=(如查询多门课程的高分学生)。

7. 聚合函数与分组查询

7.1 聚合函数(统计函数)

对数据进行统计计算,常用函数如下:

函数名称描述示例(基于result表)
COUNT()返回满足条件的记录数(COUNT(*)统计所有行,COUNT(字段)排除NULL)SELECT COUNT(*) AS 总考试次数 FROM result;
SUM()返回数值字段的总和(非数值字段无效)SELECT SUM(StudentResult) AS 成绩总和 FROM result WHERE SubjectNo=1;
AVG()返回数值字段的平均值SELECT AVG(StudentResult) AS 平均成绩 FROM result WHERE SubjectNo=1;
MAX()返回字段的最大值(支持数值、字符串、日期)SELECT MAX(StudentResult) AS 最高分 FROM result WHERE SubjectNo=1;
MIN()返回字段的最小值(支持数值、字符串、日期)SELECT MIN(StudentResult) AS 最低分 FROM result WHERE SubjectNo=1;
  • 注意COUNT(*)效率较低,建议用COUNT(主键字段)(如COUNT(StudentNo))。

7.2 GROUP BY分组查询

  • 作用:按指定字段对结果分组,对每组进行聚合计算(如按课程分组算平均分)。
  • 语法GROUP BY 分组字段1, 分组字段2... [HAVING 分组条件]
  • 关键区别
    • WHERE:分组过滤行数据(不能用聚合函数);
    • HAVING:分组过滤分组结果(可使用聚合函数)。

7.3 示例

按课程分组,计算每门课程的平均分、最高分、最低分,且只显示平均分≥60的课程:

SELECT s.SubjectName, 
       AVG(r.StudentResult) AS 平均成绩,
       MAX(r.StudentResult) AS 最高分,
       MIN(r.StudentResult) AS 最低分
FROM subject AS s
INNER JOIN result AS r ON s.SubjectNo = r.SubjectNo
GROUP BY s.SubjectNo, s.SubjectName  -- 分组字段需包含非聚合字段
HAVING AVG(r.StudentResult) >= 60;   -- 过滤平均分≥60的分组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值