-- 查询学生的学号、姓名、成绩SELECT sid, sname, score FROM stu;
-- 别名查询(显示'姓名''成绩')SELECT sname 姓名,score 成绩 FROM stu;
5.2 条件查询(WHERE)
条件查询就是在基础查询基础上,再给 sql 设置条件,只查询部分符合条件 的数据
条件语句 : select 字段 1,字段 2,... from 表名 where 字段 条件 值;
语法:
SELECT 列名 FROM 表名 WHERE 条件;
常用条件运算符:
类型
运算符 / 关键字
说明
比较
=、!=、>、<、>=、<=
等于、不等于、大于、小于等
逻辑
AND、OR、NOT
且、或、非
范围
BETWEEN 值 1 AND 值 2
在值 1 到值 2 之间(包含边界)
集合
IN(值 1, 值 2, ...)、NOT IN(...)
在 / 不在指定集合中
空值
IS NULL、IS NOT NULL
判断是否为空(不能用 = 或 !=)
示例:
-- ============== 条件查询 ==============-- 查询学号为 1001 的学生信息SELECT*FROM stu WHERE sid =1001;
-- 查询学生成绩大于 60 的学生 id 姓名,成绩SELECT sid,sname,score FROM stu WHERE score >60;
-- 查询学生性别为女,并且年龄小于 50 的记录SELECT*FROM stu WHERE sex ='女'AND age <50;
-- 查询学生学号为 1001,或者姓名为李四的记录SELECT*FROM stu WHERE sid =1001OR sname ='李四';
-- 查询学号为 1001,1002,1003 的记录SELECT*FROM stu WHERE sid IN (1001,1002,1003);
SELECT*FROM stu WHERE sid >=1001AND sid <=1003;
-- 查询学号不是 1001,1002,1003 的记录SELECT*FROM stu WHERE sid NOTIN (1001,1002,1003);
SELECT*FROM stu WHERE sid !=1001AND sid !=1002AND sid !=1003;
-- 查询学生年龄在 20 到 40 之间的学生记录SELECT*FROM stu WHERE age BETWEEN20AND40;
-- 查询性别非男的学生记录SELECT*FROM stu WHERE sex !='男';
SELECT*FROM stu WHERE sex ='女';
-- 查询性别为 null 的学生记录-- 注意:不能使用 = null 运算,需使用 IS NULLSELECT*FROM stu WHERE sex ISNULL;
-- 查询性别不为 null 的学生记录SELECT*FROM stu WHERE sex ISNOT NULL;
-- 按班级分组,统计每班人数和平均成绩SELECT cid, COUNT(sid) 人数,AVG(score) 平均分 FROM stu GROUPBY cid;
-- 筛选平均分 > 80 的班级(分组后过滤)SELECT cid, AVG(score) 平均分 FROM stu GROUPBY cid HAVING 平均分 >80;
-- 左外连接:查询所有学生(含无班级的学生)及班级名称SELECT s.sname, c.cname FROM stu s LEFTJOIN class c ON s.cid = c.cid;
-- 右外连接:查询所有班级(含无学生的班级)及学生姓名SELECT c.cname, s.sname FROM stu s RIGHTJOIN class c ON s.cid = c.cid;
6.4 子查询(嵌套查询)
将一个查询结果作为另一个查询的条件或表。
子查询 (subquery) 也叫嵌套查询
1.将 sql 语句查询的结果当成一张表,写在 from 后面 必须起别名的,不起报错!
2.将 sql 语句当条件,写在 where 后面
(1)子查询作为条件
-- 单行子查询:查询年龄大于'张三'的学生SELECT*FROM stu WHERE age > (SELECT age FROM stu WHERE sname ='张三');
-- 多行子查询:查询与'张三'同班级的学生SELECT*FROM stu WHERE cid IN (SELECT cid FROM stu WHERE sname ='张三');
(2)子查询作为表(需起别名)
-- 查询男生中年龄 > 20 的用户SELECT*FROM (
SELECT*FROM stu WHERE sex ='男'
) AS temp WHERE temp.age >20;
七、SQL 执行与书写顺序
7.1 书写顺序(推荐)
SELECT 列名 FROM 表名 WHERE 条件 GROUPBY 分组列 HAVING 分组后条件 ORDERBY 排序列 LIMIT 起始索引,条数;
7.2 执行顺序(核心)
FROM:获取表的所有数据;
WHERE:过滤不符合条件的行;
GROUP BY:按指定列分组;
HAVING:过滤不符合条件的组;
SELECT:提取指定列(含聚合运算);
ORDER BY:对结果排序;
LIMIT:限制返回行数。