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;

posted on 2026-01-20 22:57  ljbguanli  阅读(0)  评论(0)    收藏  举报