SQL查询语句详解与实战 - 教程

SELECT 语句使用非常灵活,功能丰富,
语法格式为:
SELECT [ALL | DISTINCT] 字段列表
FROM 表名
[WHERE 条件表达式]
[GROUP BY 字段名]
[HAVING 条件表达式]
[ORDER BY 字段名 [ASC| DESC]
[LIMIT [行号,] 行数 ]
* 表示所有的字段,
SELECT * FROM student;
语法格式为 SELECT 字段列表 FROM 表名 WHERE 条件表达式;
【例1】查询学生2000年以后出生的学生学号、姓名。
select 学号,姓名
from student
where year(出生日期) >2000 ;



1. 带AND的多条件查询
SELECT 字段列表 FROM 表名 WHERE 条件表达式1 AND 条件表达式2 […AND 条件N];
【例2】在学生信息表student中查询“01”班的“女”生有哪些?
SELECT 学号, 姓名, 出生日期
FROM student
WHERE 班级编号='01' AND 性别='女';

2.指定范围
SELECT 字段列表 FROM 表名 WHERE 字段名 [not] Between 值1 and 值2
select * from course where not 学分=4;

方法一:SELECT * FROM course
WHERE 学分 >=2 AND 学分 <=4;
方法二:SELECT * FROM course
WHERE 学分 BETWEEN 2 AND 4;

3.带OR的多条件查询
SELECT 字段列表
FROM 表名
WHERE 条件表达式1 OR
条件表达式2 […OR 条件表达式N];
SELECT 字段列表
FROM 表名
WHERE 字段名 [NOT] IN(值1,值2……值N);
【例3】在学生信息表student中查询“01”班、“03”班的学生详细信息。
方法一: select * from student where 班级编号='01' or 班级编号='03'
方法二:使用IN关键字查询
select * from student where 班级编号 in ('01','03');
4.模糊查询
模糊查询:like
通配符: % -
- “%”可以匹配一个或多个字符,可以代表任意长度的字符串,长度可以为0
- “_”只匹配一个字符。
字段名 [ not ] like 模式
【例3】 查询课程信息表中课程名称包含“数据库”字符的课程名称和学分。
select 课程名称, 学分
from course
where 课程名称 like '%数据库%';

【例4】 查询学生信息表中姓名的第二字是“浅”的学生信息。
select * from student where 姓名 like '_浅%';

5.空值查询
表达式 is [ not ] NULL
is NULL用于判断表达式的值是否为空值NULL
【例5】 查询学生选课表中成绩为空的信息
select 学号,课程号,成绩 from choose where 成绩 is null;
update choose set 成绩=NULL where 学号='01640405';
select 学号,课程号,成绩 from choose where 成绩 = null
说明:不能将“score is NULL”写成“score = NULL;”,
原因是NULL是一个不确定的数,不能使用“=”、“!=”等比较运算符与NULL进行比较。
6.查询结果排序
Order by子句
排序, 根据某个字段进行升序或者降序排序。
排序可以进行多字段排序: 先根据某个字段进行排序, 然后排序好的内部再按照某个数据进行再次排序。
ORDER BY 字段名1 [ASC|DESC]
[ … ,字段名N [ASC|DESC] ]
【例6】查询学生选课表choose选修“1”号课程的成绩,并按成绩降序排列,如果成绩相同则按学号排序。
select 学号,课程号,成绩
from choose
where 课程号='1'
order by 成绩 desc,学号;

【例7】查询学生信息表studnet的学生的详细信息,按出生年月升序排列。
select 学号,姓名,性别,year(now())-year(出生日期) as 年龄, 班级编号
from student
order by 年龄;

7.使用LIMIT子句
limit 开始行号,行数
第一行的行号为 0
【例8】查询学生选课表中选修“1”号课程的前三名的成绩
select 学号,课程号,成绩
from choose
where 课程号=1order by 成绩 desc,学号 limit 3;

8.用DISTINCT关键字去除结果中的重复行
字段列表前面加上DISTINCT关键字
select distinct 字段名 from 表名
【例9】查询选了课的学生学号
select distinct 学号 from choose;

9.聚合函数与GROUP BY 子句

(1) COUNT()函数
统计函数:返回选择集合中所有行的数目
Count(列名) 放在select 后
【例10】查询学生信息表student中学生人数。
select count(学号) as 总人数
from student;

【例11】查询学生信息表student中学生人数以及性别数量。
select count(distinct 性别), count(学号) as 总人数
from student;

(2)MAX()函数,MIN()函数
MAX()函数可以求出表中某个字段取值的最大值。
MAX ( 列名 ) 放在select 后
MIN()函数可以求出表中某个字段取值的最小值
MIN ( 列名 ) 放在select 后
【例12】查询学生选课表choose中的“1”号课程成绩的最高分和最低分。
select max(成绩), min(成绩)
from choose
where 课程号='1';

(3)SUM()、AVG()函数
SUM():求和
AVG():平均值
【例13】查询订单表dingdan中总的下单数量和平均下单数量。
select sum(下单数量), avg(下单数量)
from dingdan;

(4)分组查询group by子句
group by子句将查询数据按照某个字段(或多个字段)进行分组(字段值相同的记录作为一个分组)。
SELECT 字段列表 FROM 表名
Where 条件
GROUP BY 字段列表
【例14】将学生信息表student按照“班级编号”分组,统计各班级的学生人数。
select 班级编号, count(*)
from student
group by 班级编号;

【例15】统计每个学生选修了多少门课程,以及该学生所获得的总成绩和平均成绩。
select 学号, count(课程号),sum(成绩),avg(成绩)
from choose
group by 学号;

(5)Having子句
Having与where语法格式相似;
常与GROUP BY一起使用。
用于设置分组或聚合函数的过滤条件。
SELECT 字段列表 from 表名
GROUP BY 字段名
HAVING 条件表达式;
Where是针对磁盘数据进行判断,进入到内存之后,会进行分组操作, 分组结果就需要having来处理;
Having能做where能做的几乎所有事情, 但是where却不能做having能做的很多事情;
分组统计的结果或者统计函数都只有having能够使用,Having能够使用字段别名,where不能。
【例16】统计选课门数超过2门的学号和课程门数。
select 学号, count(课程号) 课程门数
from choose
group by 学号
having count(课程号)>2;

浙公网安备 33010602011771号