文章目录
查询数据库中部分字段的信息
SELECT 语句可以实现对表的选择及连接等操作。
SELECT 语句可以从一个或多个表中选取特定的行和列,结果通常是生成一个临时表。在执行过程中系统根据用户的 标准从数据库中选出匹配的行和列,并将结果放到临时的表中。
子任务 1 查询数据表中所有字段的值
语法:
select * from 表名;
其中 * 代表表中的所有列
例 1:查看 Student 表中的所有数据
select * from Student;
例 2:查询 Course 表中的所有数据
select * from Course;
注:当使用 select 语句进行数据查询时,检索出的列是未排序的,其显示是按 mysql 底层的存储顺序进行显示。
子任务 2 查询数据表中部分字段的值
如果一个表中存储的信息较多,有时并不需要查看所有字段的值,只是根据需要查看某个或某些字段的 值,这时也可以使用 select 语句实现。从上一任务可以看到,如果表的字段特别多,而用户又不关注所有列时,可以只查看关注的某一列。
1、只查询一个字段
语法:
select 字段名 from 表名;
例 3:查询 Student 表中有哪些同学
select StuName from Student;
例 4:查询课程表中有哪些课程名
select CourseName from Course;
2、查询多个字段:
如果关注表中多个列的内容,可以使用 select 语句检索多个列。
语法:
select 字段名 1,字段名 2......字段名 n from 表名;
注:每个字段名后用逗号隔开,但最后一个字段名后不加逗号。
例 5:查询 Student 表中的学生的学号、姓名和性别
select StuID,StuName,StuSex from Student;
例 6:查询课程表中的课程编号和课程名
select CourseID, CourseName from Course;
子任务 3 定义别名
给列重新起一个名字
语法
select 字段名 [as] 列标题
其中 as 可以省略,通常情况下不建议省略。
例 7:查询 Student 表的 StuName 字段将显示列名为 name,并显示原表
select StuName as name from Student;
在给列起列别名时,只是在显示结果的临时表中有效,即只改变显示结果,原表并没有被改变。如果起的列别名标题中有空格,要使用单引号引起来,但如果含_.则不用单引号。
子任务 4 查询数据表中表达式的值
1、使用计算字段
使用 select 语句进行查询时,待查询的字段可以不是表中原有的字段,而是表中各字段之间或字段与数 值的运算构成的表达式,这通常称为计算字段。
CREATE TABLE tmp_score(
id int,
name varchar(20),
sx int comment '数学',
yy int comment '英语',
yw int comment '语文'
);
INSERT INTO tmp_score values('1','张三',80,81,82);
INSERT INTO tmp_score values('2','李四',70,71,72);
INSERT INTO tmp_score values('3','王五',90,91,92);
select name, yw+sx+yy from tmp_score;
例 8:如上例表中数据,为所有同学的 yy 成绩加 10 分。
select *,yy+10
from tmp_score;
注:mysql 支持+ - * / 的基本运算
当使用计算字段时,只是在查询结果中显示了计算的结果,原表中的数据并没有改变。
2、使用拼接字段 concat
有时我们希望将显示查询结果按我们需求的格式进行显示,这就要用到拼接,即将多个值联结到一起构 成单个值。mysql 中,使用 concat()函数来拼接列。
concat 函数使用方法:
concat(参数 1,参数 2......参数 n)
其中参数可以是表中的字段名或者加入的字符串,若为字符串,应用引号引起来。
例 9:在上例 tmp_score表中,以 name(yw,sx,yy)的格式来显示每个同学的姓名及成绩。
select concat(name,'(',yw,',',sx,',',yy,')')
from tmp_score;
例 5.10:以姓名(学号,性别)的方式显示学生表中的信息
select concat(StuName,'(',StuID,',',StuSex,')')
from Student;
例 11:以学号(课程号,期末成绩) 的格式显示成绩表中的信息。
select concat(StuID,'(',CourseID,',',ExamScore,')')
from Score;
子任务 5 使用查询语句的输出功能
select 语句可以从数据表中查询信息,进行显示。
例 12:以下 select 语句均只完成输出后面内容,当为表达式时,输出表达式的计算结果。
select 'aa';
select 3*2;
select 3*2 as 乘积;
select 'hello'; # select 后面直接跟字符串,还可以跟转义字符
select now(); #输出当前日期和时间。
任务 2 根据指定条件进行查询
子任务 1 消除结果集中的重复行
语法:
SELECT DISTINCT | DISTINCTROW column_name [ , column_name…]
例 13:在 Student 表中查询学生的生源地都有哪些,去掉结果中的重复行。
select distinct Native from Student;
当检索多个字段时,必须每个字段的值都一样才认为是重复行
例 14:在 Student 表中查询学生的生源地和民族都有哪些,去掉结果中的重复行。
select distinct Native, National from Student;
当检索多个字段时,必须每个字段的值都一样才认为是重复行
例 15:在 tb_Student 表中查询学生的生源地和民族都有哪些,去掉结果中的重复行。
select distinct Native, National from Student;
本例中必须 Native 和 Natioal 都相同才认为是重复行。
即 distinct 用于后面的所有字段而不仅是紧跟在其后的字段。
子任务 2 实现有条件的筛选
**
mysql 中的运算符
**
1、简单条件运算符
< = <> != >= <= <=>安全等于
2、逻辑运算符
&& and
|| or
! not
3、模糊查询
like:一般搭配通配符使用,可以判断字符型或数值型
通配符:%任意多个字符,_任意单个字符between 条件一 and 条件二
is null /is not null:用于判断null值
2、where 子句的使用
在实际查询中,我们经常只需要符合条件的某些行而不是全部行,这时,可以使用 where 子句和特定的 操作符来实现选择行的目的。
语法:
select
字段名 1,字段名 2....字段名 n
from 表名
where
选条件
例 5.16:查询 Student 表中所有男生的学号、姓名。
select
StuId,StuName,StuSex
from Student
where
StuSex='男';
字符串常量在查询语句中要用单引号引起来。
例 17:查询 Student 表中生源地不是石家庄的同学的信息。
select * from Student
where Native !='河北石家庄';
--或写为:where Native <>'河北石家庄';
例 18:查询 Course 表中学分小于 5 分的课程。
select *
from
Course
where
Credit<5;
例 19:查询 Course 表中学分大于等于 6 分的课程。
select *
from
Course
where
Credit>=6;
- between 操作符
语法:
(not)between 表达式 1 and 表达式 2
表示值在表达式 1 和表达式 2 之间,包含表达式 1 和表达式 2
例 20:查询所有期末考试成绩在 80-90 之间的同学的成绩。
select *
from
Score
where
ExamScore between 80 and 90;
例 21:查询期末考试成绩在 90 以上或者 70 以下的同学的成绩。
例 5.22:查询课程表中备注为空的课程信息。
select *
from
Course
where
CourseRemark is null;
例 23:查询课程表中备注不为空的课程信息。
select *
from
Course
where
CourseRemark is not null;
3、多条件查询
有时候查询时指定了多个条件并存,where 子句使用操作符来实现该功能。
where 子句中经常使用的操作符有:
- and 操作符:两个或多个条件同时满足,如果有多个条件,可以使用多个 and 操作符。
- or 操作符:满足多个条件中的任何一个即检索成功
- in 操作符:满足多个条件中的一个
- like 操作符:配合%通配符和_通配符实现模糊查询
and
例 24:查询 mb1502 班的男生的信息
select *
from
Student
where
ClassID=’mb1502’
and StuSex=’男’;
例 25:查询生源地为石家庄且为汉族的男生。
select *
from
Student
where
Native='河北石家庄'
and National='汉族'
and StuSex='男';
or
连接两个或多个条件,检索出满足其中某一个或多个条件的记录
例 26:查询生源地为保定或石家庄的同学的信息。
select *
from
Student
where
Native='河北保定' or Native='河北石家庄';
注:or 操作符连接的是两个或多个完整的条件,上例中的 where 子句不能写成:where Native=河北保定’or ’河北石家庄’;
in
使用 in 关键字可以指定一个值表,值表中列出所有可能的值,当与值表中的任一个匹配时,即 返回 TRUE,否则返回 FALSE。
语法:
(not) in (值 1,值 2,值 3....)
例 27:查询 10101 课程或 10102 课程或 20201 课程的成绩。
select *
from
Score
where
CourseID in (‘10101’,’10102’,’20201’);
通常情况下,能用 in 操作符完成的查询用 or 操作符也可以完成,如上例可以用 or 操作符改写如下:
select * from Score
where CourseID=‘10101’ or CourseID=’10102’ or CourseID=’20201’;
in 和 or 的区别
例 28:查询生源地既不是保定也不是石家庄的同学的信息。
select *
from
Student
where
Native not in('河北保定','河北石家庄');
like与通配符%
有时查询给定的条件并不精确,sql 语句提供了模糊查询功能,其实现方法是在 where 子句中使用 like 操
作符,当其与%通配符搭配使用时,可实现匹配任意多个任意字符,包含零个字符。
例 29:查询 Student 表中姓李的同学的信息。
select *
from
Student
where
StuName like '李%';
例 30:查询 Student 表中名字中含有“浩”字的同学的信息。
select *
from
Student
where
StuName like '%浩%';
例 31:查询姓名为两个字的李姓同学。
select *
from
Student
where
StuName like '李_';
- %不能匹配 null
4、多个操作符时的计算次序
当 where 子句的条件中有多个操作符时,SQL 语言优先组合 and 操作符。
例 32:查询 Student 表中生源地为保定或石家庄的男生信息。
select *
from
Student
where
Native='河北保定' or Native='河北石家庄' and Stusex='男';
任务 3 完成对查询结果的排序
子任务 1 使用一个字段进行排序
order by 子句可以实现排序(升序、降序)
语法:
ORDER BY {col_name | expr | position} [ASC | DESC] , ...
ORDER BY 子句后可以是一个列、一个表达式或一个正整数。正整数表示按结果表中该位置上的列排序。
如 ORDER BY 3 表示对SELECT 的列清单上的第 3 列进行排序。 升序:ASC 降序:DESC 默认升序
例 32:查询 Student 表中学生的学号和姓名,并按学号升序排列。
select
StuID,
StuName
from
Student
order by
StuID [ASC];
例 33:查询 Score 表中 10101 课程的成绩,并按成绩降序排列。
select *
from
Score
where
CourseID=’10101’
order by
ExamScore DESC;
mysql 中的 orber by 子句还可以用非检索的列来进行排序。
例 34: 查询 Student 表中的学生的姓名和性别并按学号升序排列。
select
StuName,
StuSex
from
Student
order by
StuID;
例 35:查询 Student 表中的信息,并按显示结果的第四列进行升序排列。
select *
from
Student
order by 4;
子任务 2 使用多个字段进行排序
在实际应用中,往往需要按多个字段对检索结果进行排序
举例
语法:
select
字段名 1,字段名 2,......字段名 n
from
表名
order by
字段名 1,字段名 2,......字段名 n
order by 子句的各个字段名间用逗号隔开,最后一个字段后不加逗号。
例 36:查询 Student 表中的同学的学号、姓名和性别信息,同名学生按学号升序排列。
select
StuID,
StuName,
StuSex
from
Student
order by
StuName,StuID;
例 37:查询 Score 表中的信息,按课程号降序排列,相同课程号按学号降序排列。
select *
from
Score
order by
CourseID DESC,StuID DESC;
当 order by 后面有多个字段时,需逐个指定排序方向,即每个待排序字段后都要加关键字 ASC 或 DESC,
否则未加关键字的字段将默认为 ASC。
任务 4 实现分页查询的基础
如果对检索结果有条件的筛选显示,则要用到 LIMIT 子句。
LIMIT 子句是 SELECT 语句的最后一个子句, 主要用于限制被 SELECT 语句返回的行数。
语法:
LIMIT {[offset,] row_count | row_count OFFSET offset}
offset 和 row_count 都必须是非负的整数常数,offset 指定返回的第一行的偏移量,row_count 是返回的行数。
例如,“LIMIT 3”表示返回 SELECT 语句的结果集中最前面 3 行。
“LIMIT 5,3”则表示从第 6 行开始返回 3 行。值得注意的是初始行的偏移量为 0 而不是 1。
例 38:查询 Student 表中的前三个同学的信息。
select *
from
Student
limit 3;
例 39:查看 Score 表中 10101 课程成绩前三名的同学。
select *
from
Score
where
CourseID='10101'
order by
ExamScore DESC
limit 3;