文章目录
- 一、基本查询语句。
- 二、单表查询。
- 1.`select…from` 基本子句的使用。
- 2.使用`where`子句过滤结果集
- (1)查询符合指定条件的记录数据。
- (2)带in关键字的查询。
- (3)带`between and`的范围查询。
- (4)带like的字符匹配查询
- (5)用is null关键字查询空值。
- (6)带and的多条件查询。
- (7)带`or`的多条件查询。
- 3.使用`order by`子句对结果集排序
- 4.`group by`子句和`having`子句的使用
- (1)使用`group by`关键字来分组。单独使用`group by`关键字,查询结果只显示每组的一条记录。
- (2)`group by`关键字与`group_concat()`函数一起使用。
- (3)`group by`关键字与`having`一起使用。
- 5.用`limit`限制查询结果的数量
数据检索是指从数据库中按照预定条件查询数据,及引用相关数据进行计算而获取所需信息的过程。
MySQL
是通过select
语句查询实现数据检索的。
何云辉 CSDN
一、基本查询语句。
select
语句是SQL
语言从数据库中获取信息的一个基本语句。该语句可以实现从一个或多个数据库中的一个或多个表中查询信息,并将结果显示为另外一个二维表的形式,称之为结果集(result set
)。
select
语句的基本的语法格式可归纳如下:
select [all|distinct]selection_list
from table_source [where search_condition]
[group by grouping_columns][with rollup]
[having search_condition]
[order by order_expression [asc|desc]]
[limit count]
1.使用select
语句查询一个数据表。使用select
语句时,首先要确定所要查询的列。“*”代表所有的列。
查询teaching数据库course表中的所有数据。
mysql> use teaching;
mysql> select * from course;
2.查询表中的指定列。针对表中的多列进行查询,只要在select
后面指定要查询的列名即可,多列之间用“,”分隔。
查询student表中的studentno、sname和phone数据。
mysql> select studentno,sname,phone from student;
3.可以从一个或多个表中获取数据。
使用select
语句进行查询,需要确定所要查询的数据在哪个表中,或在哪些表中,在对多个表进行查询时,同样使用“,”对多个表进行分隔。进行多表查询,主要采用多表连接或子查询的方式,也可以通过where
子句中使用连接运算来确定表之间的联系,然后根据这个条件返回查询结果。
何云辉 CSDN
二、单表查询。
1.select…from
基本子句的使用。
select
子句的主要功能是输出字段或表达式的值,form
子句的主要功能是指定数据源。这两个子句在进行数据库表查询时,都是必选项。
为字段取别名
利用select
语句查询数据时,输出项一般显示创建表时定义的字段名。MySQL
可以为查询显示的每个输出字段或表达式取一个别名,以增加结果集的可读性。例如,可以用as
关键字给字段取一个中文名。实现给select
子句中的各项取别名其语法格式为:select项的原名 as 别名
在student表中查询出生日期在2001年以后的学生的学号、姓名、电话和年龄。
分析:可以通过as
为列或表达式更改名称,增加可读性。
mysql> select studentno as '学号',sname as '姓名',
-> phone as '手机号',year(now())-year(birthdate) as '年龄'
-> from student
-> where year(birthdate)>2001;
(1)使用谓词过滤记录
如果希望一个列表没有重复值,可以利用distinct
子句从结果集中除去重复的行。当使用distinct
子句时,需要注意以下事项:
(1)选择列表的行集中,所有值的组合决定行的唯一性。
(2)数据检索包含任何唯一值组合的行,如果不指定distinct子句则将所有行返回到结果集中。
在score
表中查询期末成绩中有高于95的学生的学号和课程号,并按照学号排序。
分析:不管学生有几门课的成绩高于95,只要有一门就可以显示,利用distinct
子句可将重复行消除。
mysql> select distinct studentno,courseno
-> from score
-> where final>95
-> order by studentno;
2.使用where
子句过滤结果集
(1)查询符合指定条件的记录数据。
如果要从很多记录中查询出指定的记录,那么就需要一个查询的条件。设定查询条件应用的是where
子句,通过where
子句可以实现很多复杂的条件查询。在使用where
子句时,需要使用一些比较运算符来确定查询的条件。
查询表student中入学成绩在800分以上的学生的学号、姓名和电话信息。
分析:本例中要求输出学号、姓名和电话信息,即为select
子句输出表列数据源为表student,条件为入学成绩在800分以上。
mysql> select studentno,sname,phone
-> from student
-> where entrance>800;
(2)带in关键字的查询。
in
关键字可以判断某个字段的值是否在于指定的集合中。如果字段的值在集合中,则满足查询条件,该记录将被查询出来;如果不在集合中,则不满足查询条件。实际上,使用in搜索条件相当于用or连接两个比较条件,如“ xin(10,15)
” 相当于表达式“ x=10 or x=15
”。也可以使用not in
关键词查询不在某取值范围内的记录行数据。
查询学号分别为的18135222201、18137221508和19123567897的学生学号、课程号、平时成绩和期末成绩。
分析:检索条件中枚举某些确定值的范围,一般可以利用 in关键字实现。
mysql> select studentno,courseno ,daily ,final
-> from score
-> where studentno in('18135222201','18137221508','19123567897');
(3)带between and
的范围查询。
在where
子句中,可以使用between
搜索条件检索指定范围内的行。使用between
搜索条件时,使用between
搜索条件相当于用and连接两个比较条件,如“ x between 10 and 27
” 相当于表达式“ x>=10 and x<=27
”。由此可见,在生成结果集中,边界值也是符合条件的。检索条件指定排除某个范围的值,一般可以利用 not between
关键字实现。
查询选修课程号为c05109 的学生学号和期末成绩,并且要求平时成绩在80到95之间。
分析:检索条件设置在某个的范围内,一般可以利用between关键字实现。
mysql> select studentno, final
-> from score
-> where courseno='c05109' and daily between 80 and 95;
(4)带like的字符匹配查询
使用通配符结合的like
搜索条件,通过进行字符串的比较来选择符合条件的行。当使用like
搜索条件时,模式字符串中的所有字符都有意义,包括开头和结尾的空格。like
主要用于字符类型数据。字符串内的英文字母和汉字都算一个字符。也可用通配符并使用 not like
作为查询条件。
like
属于较常用的比较运算符,通过它可以实现模糊查询。它有两种通配符:“%”和下划线“”:
“%”可以匹配一个或多个字符,可以代表任意长度的字符串,长度可以为0。
“”只匹配一个字符。
在student表中显示所有姓何或姓韩的学生的姓名、生日和Email。
分析:设置where条件实现上述要求,需要采用or和like等逻辑运算。Like 操作符可以和通配符一起将列的值与某个特定的模式作比较,列的数据类型可以是任何字符串类型。
mysql> select sname, birthdate, Email
-> from student
-> where sname like '何%' or sname like '韩%';
(5)用is null关键字查询空值。
涉及空值的查询用null
来表示。create table
语句或alter table
语句中的null
表明在列中允许存在被称为null
的特殊数值,它不同于数据库中的其他任何值。在select
语句中,where
子句通常会返回比较的计算结果为真的行。那么,在where
子句中,如何处理null的值的比较呢?为了取得列中含有null
的行,MySQL
语句包含了操作符功能is [not] null
。
一个字段值是空值或者不是空值,要表示为:“is null
”或“is not null
”。不能表示为:“=null
”或“<>null
”。
如果写成 “字段=null
”或“字段<>null
”,系统的运行结果都直接处理为null
值,按照false
处理而不报错。
where
子句有以下通用格式: column is [not] null
在se_score表中添加成绩字段score,查询se_score表中学生的学号、课程号和成绩。
分析:学生选修课程表se_course中的成绩是允许空值,以此是否成绩为空值作为查询条件,即可查到学生的选课情况。
mysql> alter table se_course
-> add score float(3,1) null AFTER teacherno;
mysql> select studentno, courseno,teacherno, score
-> from se_course
-> where score is null;
(6)带and的多条件查询。
where
子句的主要功能是利用指定的条件选择结果集中的行。符合条件的行出现在结果集中,不符合条件的行将不出现在结果集中。利用where
子句指定行时,条件表达式中的字符型和日期类型值要放到单引号内,数值类型的值直接出现在表达式中。
在score表中显示期中高于90分、期末成绩高于85分的学生学号、课程号和成绩。
分析:设置where条件实现上述要求,需要采用and逻辑运算,将两个比较运算表达式连接起来。
mysql> select studentno,courseno,daily,final
-> from score
-> where daily >=90 and final >= 85;
(7)带or
的多条件查询。
带or
的多条件查询,实际上是指只要符合多条件中的一个,记录就会被搜索出来;如果不满足这些查询条件中的任何一个,这样的记录将被排除掉。or
可以用来连接两个条件表达式。而且,可以同时使用多个or
关键字连接多个条件表达式。
查询计算机学院的具有高级职称教师的教师号、姓名和从事专业。
分析:where
子句设置的条件包括部门和职称,其中高级职称又包括教授和副教授两类,需要包括or
和and
两种逻辑运算。
mysql> select teacherno,tname, major
-> from teacher
-> where department='计算机学院' and (prof='副教授'or prof='教授');
何云辉 CSDN
3.使用order by
子句对结果集排序
利用order by子句可以对查询的结果进行升序(asc)或降序(desc)排列。
排序可以依照某个列的值,若列值相等则根据第二个属性的值,依此类推。
利用order by
子句进行排序,需要注意如下事项和原则:
(1)默认情况下,结果集按照升序排列。也可以在输出项的后面加上关键字desc
来实现降序输出。如果对含有null
值的列进行排序时,如果是按升序排列,null
值将出现在最前面,如果是按降序排列,null
值将出现在最后。
(2)order by
子句包含的列并不一定出现在选择列表中。
(3)order by
子句可以通过指定列名、函数值和表达式的值进行排序。
(4)order by
子句不可以使用text
、ntext
或image
类型的列。
(5)在 order by
子句中可以同时指定多个排序项。
在student表中查询高于850分的学生学号、姓名和入学成绩,并按照入学成绩的降序排列。
分析:升序asc是默认值,而降序desc必须表明,也可以给字段取别名。
mysql> select studentno 学号,sname 姓名 ,entrance 入学成绩
-> from student
-> where entrance>850
-> order by entrance desc;
在score表中查询总评成绩大于90分的学生的学号、课程号和总评成绩,并先按照课程号的升序、再按照总评成绩的降序排列。总评成绩计算公式如下:
总评成绩=daily0.2+final0.8
分析:本例利用表达式作比较和排序的依据。
mysql> select courseno 课程号,daily *0.2+ final*0.8 as '总评',studentno 学号
-> from score
-> where daily *0.2+ final*0.8>90
-> order by courseno, daily *0.2+ final*0.8 desc;
4.group by
子句和having
子句的使用
group by
子句可以将查询结果按属性列或属性列组合在行的方向上进行分组,每组在属性列或属性列组合上具有相同的聚合值。如果聚合函数没有使用 group by
子句,则只为 select
语句报告一个聚合值。
将一列或多列定义成为一组,使组内所有的行在那些列中的数值相同。出现在查询的select
列表中的每一列都必须同时出现在group by
子句中。
(1)使用group by
关键字来分组。单独使用group by
关键字,查询结果只显示每组的一条记录。
利用group by子句对score表数据分组,显示每个学生的学号和平均总评成绩。总评成绩计算公式如下:
总评成绩=daily0.3+final0.7
分析:通过学号分组,可以求出每个学生的平均总评成绩。avg()函数用于求平均值,round()函数用于对平均值的某位数据进行四舍五入。
mysql> select studentno 学号, round(avg(daily*0.3+final*0.7),2) as'平均分'
-> from score
-> group by studentno;
(2)group by
关键字与group_concat()
函数一起使用。
使用group by
关键字和group_concat()
函数查询,可以将每个组中的所有字段值都显示出来。
使用group by关键字和group_concat()函数对score表中的studentno字段进行分组查询。可以查看选学该门课程的学生学号。
mysql> select courseno 课程号,group_concat(studentno) 选课学生学号
-> from score
-> group by courseno ;
(3)group by
关键字与having
一起使用。
select
语句中的 where
和having
子句控制用数据源表中的那些行来构造结果集。where
和having
是筛选,这两个子句指定一系列搜索条件,只有那些满足搜索条件的行才用来构造结果集。
having
子句通常与 group by
子句结合使用,尽管指定该子句时也可以不带 group by
。having
子句指定在应用 where
子句的筛选后要进一步应用的筛选。
查询选课在3门以上且各门课程期末成绩均高于75分的学生的学号及其总成绩,查询结果按总成绩降序列出。
分析:可以利用having 子句筛选分组结果,使之满足count(*)>=3的条件即可。
mysql> select studentno 学号,sum(daily*0.3+final*0.7) as '总分'
-> from score
-> where final>=75
-> group by studentno
-> having count(*)>=3
-> order by sum(daily*0.3+final*0.7) desc;
5.用limit
限制查询结果的数量
(1)limit
是用来限制查询结果的数量的子句。
可以指定查询结果从哪条记录开始显示。还可以指定一共显示多少条记录。Limit
可以指定初始位置,也可以不指定初始位置。
查询student表的学号、姓名、出生日期和电话,按照entrance进行降序排列,显示前3条记录。
mysql> select studentno,sname,birthdate,phone
-> from student
-> order by entrance desc
-> limit 3;
(2)使用limit还可以从查询结果的中间部分取值。
首先要定义两个参数,参数1是开始读取的第1条记录的编号(注意在总查询结果中,第1条记录编号为0);参数2是要查询记录的个数。
查询score表中,期末成绩final高于85分的,按照平时成绩daily进行升序排列,从编号2开始,查询5条记录。
mysql> select * from score
-> where final>85
-> order by daily asc
-> limit 2,5;
何云辉 CSDN