CREATE TABLE exam_result (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT '同学姓名',
chinese FLOATDEFAULT0.0 COMMENT '语文成绩',
math FLOATDEFAULT0.0 COMMENT '数学成绩',
english FLOATDEFAULT0.0 COMMENT '英语成绩'
);
-- 指定列的顺序不需要按定义表的顺序来SELECT id, name, english FROM exam_result;
可以根据需要查找任意列。
2.3 查询字段为表达式
SELECT id, name, chinese + english, 1FROM exam_result;
SELECT 可跟任意合法表达式,并返回表达式计算的结果,图中 1 就是表达式 1 计算的结果。
为查询结果指定别名
SELECT id, name, chinese + english AS'语文 + 英语'FROM exam_result;
使用 AS 可对表达式进行重命名,AS 可以省略。
2.4 结果去重 DISTINCT
SELECTDISTINCT math FROM exam_result;
2.5 WHERE 条件筛选
比较运算符:
注意 = 不可直接用于 NULL 值比较,可以使用 <=> 进行比较
NULL 不参与运算
逻辑运算符:
接下来结合实例,了解运算符的使用。
1、查找 students 表中 qq 为空的
SELECT name, qq FROM students WHERE qq <=>NULL;
SELECT name, qq FROM students WHERE qq ISNULL;
2、查找 students 表中 qq 不为空的
SELECT name, qq FROM students WHERE qq ISNOT NULL;
3、英语不及格的同学及英语成绩 (< 60)
SELECT name, english FROM exam_result WHERE english <60;
4、语文成绩在 [80, 90] 分的同学及语文成绩
SELECT name, chinese FROM exam_result WHERE chinese >=80AND chinese <90;
SELECT name, chinese FROM exam_result WHERE chinese BETWEEN80AND90;
注意使用 BETWEEN...AND... 查找的区间为闭区间。
5、数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
SELECT name, math FROM exam_result WHERE math =58OR math =59OR math =99OR math =98;
SELECT name, math FROM exam_result WHERE math IN (58, 59, 98, 99);
6、姓孙的同学
LIKE 模糊匹配:% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符
SELECT id, name FROM exam_result WHERE name LIKE'孙%';
% 表示可以匹配任意多字符。
7、孙某同学
SELECT id, name FROM exam_result WHERE name LIKE'孙_';
_ 表示仅匹配一个字符。
8、语文成绩好于英语成绩的同学
SELECT name, chinese, english FROM exam_result WHERE chinese > english;
9、总分在 200 分以下的同学
SELECT name, chinese + math + english FROM exam_result WHERE chinese + math + english <200;
10、语文成绩 > 80 并且不姓孙的同学
SELECT name, chinese FROM exam_result WHERE chinese >80AND name NOTLIKE'孙%';
11、孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80
SELECT name, chinese, math, english, chinese + math + english AS'总分'FROM exam_result WHERE name LIKE'孙_'OR (chinese + math + english >200AND chinese < math AND english >80);
2.6 ORDER BY 语句(结果排序)
ASC 为升序(Ascending)(从小到大)
DESC 为降序(Descending)(从大到小)
不做显示声明默认为 ASC 方式排序并且没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序
MySQL 中认为 NULL 值是最小的
SELECT ... FROM table_name [WHERE...] ORDERBYcolumn [ASC|DESC], [...];
1、同学及数学成绩,按数学成绩升序显示
SELECT name, math FROM exam_result ORDERBY math ASC;
2、查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
SELECT name, math, english, chinese FROM exam_result
ORDERBY math DESC, -- 数学降序
english ASC, -- 英语升序(默认可省略 ASC)
chinese ASC; -- 语文升序(默认可省略 ASC)
3、查询同学及总分,由高到低
SELECT name, chinese + math + english AS total FROM exam_result ORDERBY chinese + math + english DESC;
这种写法在标准 SQL 中是不支持的,这里可以直接使用 chinese+math+english 的别名 total 进行排序操作,是因为该版本做了特殊处理,而在 WHERE 的操作下则不被允许:
出现这种差异是因为 SQL 语句的执行顺序造成的,WHERE 子句在 SELECT 之前执行,此时 total 别名尚未生成,因此无法引用。
标准 SQL 执行顺序(理论上会报错)FROM exam_result
读取表数据。
WHERE(隐式)
无过滤条件,保留所有行。
计算表达式
计算 chinese + math + english,但此时未命名为 total。
ORDER BY total DESC
报错:total 是 SELECT 中定义的别名,此时尚未生效。
MySQL 的实际执行流程(允许 ORDER BY 引用别名)FROM + 计算表达式
读取表数据,并计算 chinese + math + english,暂存结果(未命名)。
ORDER BY total DESC
MySQL 允许 ORDER BY 引用尚未正式定义的别名,实际使用步骤 1 中暂存的计算结果进行排序。
SELECT name, … AS total
将排序后的结果命名为 total,返回最终结果集。