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 +10AS"新课时"FROM subject;-- 课时加10后重命名
SELECT 字段1, 字段2...FROM table1
INNERJOIN table2 ON table1.关联字段 = table2.关联字段;
示例:查询课程名及所属年级名(关联subject和grade)
-- 内连接方式SELECT s.SubjectName, g.GradeName
FROM subject AS s
INNERJOIN 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
LEFTJOIN result AS r ON s.StudentNo = r.StudentNo;
4.4 自连接
逻辑:将一张表视为两张表,通过别名区分,实现表内数据关联查询(如查询父子栏目)。
示例:查询栏目表(category)的父栏目与子栏目名称
-- 1. 创建栏目表CREATETABLEIFNOTEXISTS category(
categoryId INT(10)AUTO_INCREMENTPRIMARYKEY,-- 栏目ID
categoryName VARCHAR(32)NOTNULL,-- 栏目名称
pid INT(10)-- 父栏目ID(关联categoryId));-- 2. 自连接查询(a为子栏目表,b为父栏目表)SELECT a.categoryName AS"子栏目", b.categoryName AS"父栏目"FROM category AS a
LEFTJOIN 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
INNERJOIN subject AS s ON r.SubjectNo = s.SubjectNo
WHERE s.SubjectName ="数据库结构-1"ORDERBY r.StudentResult DESC;
SELECT*FROM result LIMIT5;-- 返回前5条记录(offset=0,默认)SELECT*FROM result LIMIT5,10;-- 返回第6-15条记录(offset=5,row_count=10)SELECT*FROM result LIMIT10OFFSET5;-- 与上句等效
-- 1. 先查《高等数学-2》的课程ID(子查询)-- 2. 再查该课程中分数≥80的学生ID,关联学生表获取姓名SELECT s.StudentNo, s.StudentName
FROM student AS s
INNERJOIN 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;
SELECT s.SubjectName,AVG(r.StudentResult)AS 平均成绩,MAX(r.StudentResult)AS 最高分,MIN(r.StudentResult)AS 最低分
FROM subject AS s
INNERJOIN result AS r ON s.SubjectNo = r.SubjectNo
GROUPBY s.SubjectNo, s.SubjectName -- 分组字段需包含非聚合字段HAVINGAVG(r.StudentResult)>=60;-- 过滤平均分≥60的分组