SELECT id, name, chinese + math + english FROM exam_result; +----+--------- -+--------------------------+ | id | name | chinese + math + english | +----+-----------+--------------------------+ | 1 | 唐三藏 | 221 | | 2 | 孙悟空 | 242 | | 3 | 猪悟能 | 276 | | 4 | 曹孟德 | 233 | | 5 | 刘玄德 | 185 | | 6 | 孙权 | 221 | | 7 | 宋公明 | 170 | +----+-----------+--------------------------+ 7 rows in set (0.00 sec)
3.为查询结果指定别名
语法:
SELECT column [AS] alias_name [...] FROM table_name;
示例:
SELECT id, name, chinese + math + english 总分 FROM exam_result; +----+-----------+--------+ | id | name | 总分 | +----+-----------+--------+ | 1 | 唐三藏 | 221 | | 2 | 孙悟空 | 242 | | 3 | 猪悟能 | 276 | | 4 | 曹孟德 | 233 | | 5 | 刘玄德 | 185 | | 6 | 孙权 | 221 | | 7 | 宋公明 | 170 | +----+-----------+--------+ 7 rows in set (0.00 sec)
4.结果去重
// 98分重复了 SELECT math FROM exam_result; +--------+ | math | +--------+ | 98 | | 78 | | 98 | | 84 | | 85 | | 73 | | 65 | +--------+ 7 rows in set (0.00 sec) // 去重结果 SELECT DISTINCT math FROM exam_result; +--------+ | math | +--------+ | 98 | | 78 | | 84 | | 85 | | 73 | | 65 | +--------+ 6 rows in set (0.00 sec)
3.WHERE条件
1.比较运算符
2.逻辑运算符
3.示例
英语不及格的同学及英语成绩 ( < 60 )
SELECT name, english FROM exam_result WHERE english < 60; +-----------+---------+ | name | english | +-----------+---------+ | 唐三藏 | 56 | | 刘玄德 | 45 | | 宋公明 | 30 | +-----------+---------+ 3 rows in set (0.01 sec)
语文成绩在 [80, 90] 分的同学及语文成绩
# 使用 AND 进行条件连接 SELECT name, chinese FROM exam_result WHERE chinese >= 80 AND chinese <= 90; +-----------+---------+ | name | chinese | +-----------+---------+ | 孙悟空 | 87 | | 猪悟能 | 88 | | 曹孟德 | 82 | +-----------+---------+ 3 rows in set (0.00 sec) # 使用 BETWEEN ... AND ... 条件 SELECT name, chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90; +-----------+---------+ | name | chinese | +-----------+---------+ | 孙悟空 | 87 | | 猪悟能 | 88 | | 曹孟德 | 82 | +-----------+---------+ 3 rows in set (0.00 sec)
数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
# 使用 OR 进行条件连接 SELECT name, math FROM exam_result WHERE math = 58 OR math = 59 OR math = 98 OR math = 99; +-----------+--------+ | name | math | +-----------+--------+ | 唐三藏 | 98 | | 猪悟能 | 98 | +-----------+--------+ 2 rows in set (0.01 sec) # 使用 IN 条件 SELECT name, math FROM exam_result WHERE math IN (58, 59, 98, 99); +-----------+--------+ | name | math | +-----------+--------+ | 唐三藏 | 98 | | 猪悟能 | 98 | +-----------+--------+ 2 rows in set (0.00 sec)
姓孙的同学及孙某同学
# % 匹配任意多个(包括 0 个)任意字符 SELECT name FROM exam_result WHERE name LIKE '孙%'; +-----------+ | name | +-----------+ | 孙悟空 | | 孙权 | +-----------+ 2 rows in set (0.00 sec) # _ 匹配严格的一个任意字符 SELECT name FROM exam_result WHERE name LIKE '孙_'; +--------+ | name | +--------+ | 孙权 | +--------+ 1 row in set (0.00 sec)
语文成绩好于英语成绩的同学
# WHERE 条件中比较运算符两侧都是字段 SELECT name, chinese, english FROM exam_result WHERE chinese > english; +-----------+---------+---------+ | name | chinese | english | +-----------+---------+---------+ | 唐三藏 | 67 | 56 | | 孙悟空 | 87 | 77 | | 曹孟德 | 82 | 67 | | 刘玄德 | 55 | 45 | | 宋公明 | 75 | 30 | +-----------+---------+---------+ 5 rows in set (0.00 sec)
总分在 200 分以下的同学
# WHERE 条件中使用表达式 # 别名不能用在 WHERE 条件中 SELECT name, chinese + math + english 总分 FROM exam_result WHERE chinese + math + english < 200; +-----------+--------+ | name | 总分 | +-----------+--------+ | 刘玄德 | 185 | | 宋公明 | 170 | +-----------+--------+ 2 rows in set (0.00 sec)
语文成绩 > 80 并且不姓孙的同学
# AND 与 NOT 的使用 SELECT name, chinese FROM exam_result WHERE chinese > 80 AND name NOT LIKE '孙%'; +----+-----------+---------+--------+---------+ | id | name | chinese | math | english | +----+-----------+---------+--------+---------+ | 3 | 猪悟能 | 88 | 98 | 90 | | 4 | 曹孟德 | 82 | 84 | 67 | +----+-----------+---------+--------+---------+ 2 rows in set (0.00 sec)
孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80
# 综合性查询,括号()内的可以看成一整个条件 SELECT name, chinese, math, english, chinese + math + english 总分 FROM exam_result WHERE name LIKE '孙_' OR (chinese + math + english > 200 AND chinese < math AND english >80); +-----------+---------+--------+---------+--- ---+ | name | chinese | math | english | 总分 | +-----------+---------+--------+---------+-------+ | 猪悟能 | 88 | 98 | 90 | 276 | | 孙权 | 70 | 73 | 78 | 221 | +-----------+---------+--------+---------+-------+ 2 rows in set (0.00 sec)
NULL 的查询
# 查询 students 表 +-----+-------+-----------+-------+ | id | sn | name | qq | +-----+-------+-----------+-------+ | 100 | 10010 | 唐大师 | NULL | | 101 | 10001 | 孙悟空 | 11111 | | 103 | 20002 | 孙仲谋 | NULL | | 104 | 20001 | 曹阿瞒 | NULL | +-----+-------+-----------+-------+ 4 rows in set (0.00 sec) # 查询 qq 号已知的同学姓名 SELECT name, qq FROM students WHERE qq IS NOT NULL; +-----------+-------+ | name | qq | +-----------+-------+ | 孙悟空 | 11111 | +-----------+-------+ 1 row in set (0.00 sec) # NULL 和 NULL 的比较,= 和 <=> 的区别 SELECT NULL = NULL, NULL = 1, NULL = 0; +-------------+----------+----------+ | NULL = NULL | NULL = 1 | NULL = 0 | +-------------+----------+----------+ | NULL | NULL | NULL | +-------------+----------+----------+ 1 row in set (0.00 sec) SELECT NULL <=> NULL, NULL <=> 1, NULL <=> 0; +---------------+------------+------------+ | NULL <=> NULL | NULL <=> 1 | NULL <=> 0 | +---------------+------------+------------+ | 1 | 0 | 0 | +---------------+------------+------------+ 1 row in set (0.00 sec)
4.结果排序
1.基本语法
-- ASC 为升序(从小到大) -- DESC 为降序(从大到小) -- 默认为 ASC SELECT ... FROM table_name [WHERE ...] ORDER BY column [ASC|DESC], [...];
Tips
升序:Ascending
降序:Descending
注意:没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序
2.示例
同学及数学成绩,按数学成绩升序显示
SELECT name, math FROM exam_result ORDER BY math; +-----------+--------+ | name | math | +-----------+--------+ | 宋公明 | 65 | | 孙权 | 73 | | 孙悟空 | 78 | | 曹孟德 | 84 | | 刘玄德 | 85 | | 唐三藏 | 98 | | 猪悟能 | 98 | +-----------+--------+ 7 rows in set (0.00 sec)
同学及 qq 号,按 qq 号排序显示
# NULL 视为比任何值都小,升序出现在最上面 SELECT name, qq FROM students ORDER BY qq; +-----------+-------+ | name | qq | +-----------+-------+ | 唐大师 | NULL | | 孙仲谋 | NULL | | 曹阿瞒 | NULL | | 孙悟空 | 11111 | +-----------+-------+ 4 rows in set (0.00 sec) # NULL 视为比任何值都小,降序出现在最下面 SELECT name, qq FROM students ORDER BY qq DESC; +-----------+-------+ | name | qq | +-----------+-------+ | 孙悟空 | 11111 | | 唐大师 | NULL | | 孙仲谋 | NULL | | 曹阿瞒 | NULL | +-----------+-------+ 4 rows in set (0.00 sec)
查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
# 多字段排序,排序优先级随书写顺序 SELECT name, math, english, chinese FROM exam_result ORDER BY math DESC, english, chinese; +-----------+--------+---------+---------+ | name | math | english | chinese | +-----------+--------+---------+---------+ | 唐三藏 | 98 | 56 | 67 | | 猪悟能 | 98 | 90 | 88 | | 刘玄德 | 85 | 45 | 55 | | 曹孟德 | 84 | 67 | 82 | | 孙悟空 | 78 | 77 | 87 | | 孙权 | 73 | 78 | 70 | | 宋公明 | 65 | 30 | 75 | +-----------+--------+---------+---------+ 7 rows in set (0.00 sec)
查询同学及总分,由高到低
# ORDER BY 中可以使用表达式 SELECT name, chinese + english + math FROM exam_result ORDER BY chinese + english + math DESC; +-----------+--------------------------+ | name | chinese + english + math | +-----------+--------------------------+ | 猪悟能 | 276 | | 孙悟空 | 242 | | 曹孟德 | 233 | | 唐三藏 | 221 | | 孙权 | 221 | | 刘玄德 | 185 | | 宋公明 | 170 | +-----------+--------------------------+ 7 rows in set (0.00 sec) # ORDER BY 子句中可以使用列别名 SELECT name, chinese + english + math 总分 FROM exam_result ORDER BY 总分 DESC; +-----------+--------+ | name | 总分 | +-----------+--------+ | 猪悟能 | 276 | | 孙悟空 | 242 | | 曹孟德 | 233 | | 唐三藏 | 221 | | 孙权 | 221 | | 刘玄德 | 185 | | 宋公明 | 170 | +-----------+--------+ 7 rows in set (0.00 sec)
查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
# 结合 WHERE 子句 和 ORDER BY 子句 SELECT name, math FROM exam_result WHERE name LIKE '孙%' OR name LIKE '曹%' ORDER BY math DESC; +-----------+--------+ | name | math | +-----------+--------+ | 曹孟德 | 84 | | 孙悟空 | 78 | | 孙权 | 73 | +-----------+--------+ 3 rows in set (0.00 sec)
5.筛选分页结果
语法:
# 起始下标为 0 # 从 0 开始,筛选 n 条结果 SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n; # 从 s 开始,筛选 n 条结果 SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n; # 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用 SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;