目录
MySQL的查询分为普通查询(简单查询)和带条件的查询、以及复杂查询,本章主要介绍一下普通查询和带条件查询。
一、简单查询
1、准备工作
1.1建表
要做查询,首先得创建一个表;这个地方建一个学生样例表,包含主键id、学号、姓名、邮箱、身份证号、所属学院、专业、时间八个列,其中给id设置主键、身份证号设置唯一约束
CREATE TABLE `student` (
`id` int(11) unsigned NOT NULL COMMENT '主键id',
`sn` int(11) DEFAULT NULL COMMENT '学号',
`name` varchar(20) DEFAULT NULL COMMENT '姓名',
`qq_mail` varchar(20) DEFAULT NULL COMMENT 'QQ邮箱',
`id_number` varchar(18) DEFAULT NULL COMMENT '身份证号',
`department` varchar(30) DEFAULT NULL COMMENT '所属学院',
`major` varchar(30) DEFAULT NULL COMMENT '专业',
`created` date DEFAULT NULL COMMENT '时间',
PRIMARY KEY (`id`),
UNIQUE KEY `id_number` (`id_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生表样例';
再建一个学生成绩表,包含学生id,学科,分数三个列,主键id设置列组合(学生id,学科),外键绑定学生表的学生id。
CREATE TABLE `student_score` (
`number` int(10) unsigned NOT NULL COMMENT '学生id',
`subject` varchar(30) NOT NULL COMMENT '学科',
`score` tinyint(4) DEFAULT NULL COMMENT '分数',
PRIMARY KEY (`number`,`subject`),
CONSTRAINT `student_score_ibfk_1` FOREIGN KEY (`number`) REFERENCES `student` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生成绩表';
1.2为表中插入数据
表已经创建好了,接下来为表里面添加一些数据。
/**学生表**/
INSERT INTO `test`.`student` (`id`, `sn`, `name`, `qq_mail`, `id_number`, `department`, `major`, `created`) VALUES (20230101, 2023010101, '韩信', '16461689qq.com', '123456789456789123', '计算机学院', '计算机科学与技术', '2023-06-03');
INSERT INTO `test`.`student` (`id`, `sn`, `name`, `qq_mail`, `id_number`, `department`, `major`, `created`) VALUES (20230102, 2023010102, '赵云', '16461123689qq.com', '123456789123456789', '计算机学院', '计算机科学与技术', '2023-06-03');
INSERT INTO `test`.`student` (`id`, `sn`, `name`, `qq_mail`, `id_number`, `department`, `major`, `created`) VALUES (20230103, 2023010103, '李信', '1646163223389qq.com', '123456789999123456', '计算机学院', '软件工程', '2023-06-03');
INSERT INTO `test`.`student` (`id`, `sn`, `name`, `qq_mail`, `id_number`, `department`, `major`, `created`) VALUES (20230104, 2023010104, '程咬金', '164633231689qq.com', '123456799456789123', '计算机学院', '软件工程', '2023-06-03');
INSERT INTO `test`.`student` (`id`, `sn`, `name`, `qq_mail`, `id_number`, `department`, `major`, `created`) VALUES (20230105, 2023010105, '妲己', '1646wrf1689qq.com', '123456788456789123', '音乐学院', '声乐', '2023-06-03');
INSERT INTO `test`.`student` (`id`, `sn`, `name`, `qq_mail`, `id_number`, `department`, `major`, `created`) VALUES (20230106, 2023010106, '小乔', '16461rwfr689qq.com', '987654321456789123', '音乐学院', '乐器', '2023-06-03');
/**成绩表**/
INSERT INTO `test`.`student_score` (`number`, `subject`, `score`) VALUES (20230101, 'MySQL技术', 88);
INSERT INTO `test`.`student_score` (`number`, `subject`, `score`) VALUES (20230101, '计算机技术', 78);
INSERT INTO `test`.`student_score` (`number`, `subject`, `score`) VALUES (20230102, 'MySQL技术', 98);
INSERT INTO `test`.`student_score` (`number`, `subject`, `score`) VALUES (20230102, '计算机技术', 100);
INSERT INTO `test`.`student_score` (`number`, `subject`, `score`) VALUES (20230103, 'MySQL技术', 61);
INSERT INTO `test`.`student_score` (`number`, `subject`, `score`) VALUES (20230103, '计算机技术', 89);
INSERT INTO `test`.`student_score` (`number`, `subject`, `score`) VALUES (20230104, 'MySQL技术', 59);
INSERT INTO `test`.`student_score` (`number`, `subject`, `score`) VALUES (20230104, '计算机技术', 55);
现在我们的表里已经有了数据,可以去做相应的操作了;
2、查询单个列
在MySQL基础三中我们拆分了MySQL的查询语句做分析,这个地方再解释一遍。
select 列名 from 表名;
- select 子句:select 列名 --表示的是要查询的列名是什么;
- from 子句:from 表名--表示的是要查询的表是什么
如果我们要查询学生表的id。就可以这样写:
select id from student;
/**
id
20230105
20230102
20230101
20230103
20230104
20230106
**/
这个地方会发现id的值并不是按照顺序来排列的,这个地方留个疑问点,后面介绍排序方式的时候说明。
2.1列的别名
select子句查询的时候我们可以给返回的列起一个别名,具体语法如下:
select 列名 [as] 列的别名 from 表名;
/**这里的as可以省略,用空白符代替即可**/
/**查询id为例**/
select id as 学生id from 表名;
select id 学生id from 表名;
两个语句的查询结果都是一样的
3、查询多个列
查询多个列的语法如下:
select 列1,列2,...,列n from 表名;
/**查询学生的id、学号、姓名、身份证号为例**/
select id,sn,name,id_number from student;
/**起别名例子**/
select id 学生id,sn 学号,name 学生姓名,id_number 身份证号 from student;
4、查询所有列
select * from 表名;
/**查询学生表为例**/
select * from student;
5、给查询的结果去重
去重的方式主要有两种,一种是给单列去重,一种是给多列去重。所用的语法关键字是distinct
5.1去除单列的重复结果
原本我们使用下面的查询语句会有6条数据,但是我们会发现,有许多数据都是重复的。
SELECT department from student;
/**
department
计算机学院
计算机学院
计算机学院
计算机学院
音乐学院
音乐学院
**/
这个时候就要用去重做一下信息处理。具体操作如下:
SELECT DISTINCT department from student;
/**去重后**/
/**
department
计算机学院
音乐学院
**/
可以看到通过去重,我们拿到了想要的不重复的数据。
5.2去除多列的重复结果
首先我们先执行一下下面的语句:
SELECT department,major from student;
/**
department major
计算机学院 计算机科学与技术
计算机学院 计算机科学与技术
计算机学院 软件工程
计算机学院 软件工程
音乐学院 声乐
音乐学院 乐器
**/
可以发现这两个列都有重复的数据,我们想要去重后得到理想数据应该是返回4条。我们可以使用这个SQL。
SELECT DISTINCT department,major from student;
/**
department major
计算机学院 计算机科学与技术
计算机学院 软件工程
音乐学院 声乐
音乐学院 乐器
**/
如果我们想要对多个列进行去重,直接将distinct放在被查询的列的最前面即可。
6、限制结果记录条数
限制结果记录条数,在实际工作中也可以叫做分页。具体语法如下
limit [偏移量],限制条数;
/**偏移量可不写,也可以加上,如果不加偏移量,默认从第一条记录开始**/
/**例如**/
select id,sn,name from student limit 2;
/**
id sn name
20230101 2023010101 韩信
20230102 2023010102 赵云
**/
select id,sn,name from student limit 2,2;
/**
id sn name
20230103 2023010103 李信
20230104 2023010104 程咬金
**/
注意:
如果偏移量大于或等于原先结果集中的行数,那么查询结果就是空集;
(第一条记录的偏移量是0,第二条记录是1,第三条记录是2,第n条记录是n-1)
1、用于强制返回指定的记录行数
在查询中,经常要返回前几条或者中间某几行数据时,用到limit语法如下:
select * from 表名 limit [offset,] rows
参数说明:
- offset:指定第一个返回记录行的偏移量(即从哪一行开始返回),注意:初始行的偏移量为0。
- rows:返回具体行数。
如果limit后面是一个参数,就是检索前多少行。如果limit后面是2个参数,就是从offset+1行开始,检索rows行记录。举例:
select * from 表名 limit 10;//检索前10行记录
select * from 表名 limit 5 ,10;//从第6行开始,检索10行记录,即:检索记录行 6-15
2、分页
客户端通过传递start(页码),pageSize(每页显示的条数)两个参数去分页查询数据库表中的数据,那我们知道MySql数据库提供了分页的函数limit m,n,但是该函数的用法和我们的需求不一样,
所以就需要我们根据实际情况去改写适合我们自己的分页语句,具体的分析如下:
样例:查询第1条到第10条的数据的sql是:select * from 表名 limit 0,10; ->对应我们的需求就是查询第一页的数据:select * from 表名 limit (1-1)*10,10;
查询第10条到第20条的数据的sql是:select * from 表名 limit 10,10; ->对应我们的需求就是查询第二页的数据:select * from 表名 limit (2-1)*10,10;
查询第20条到第30条的数据的sql是:select * from 表名 limit 20,10; ->对应我们的需求就是查询第三页的数据:select * from 表名 limit (3-1)*10,10;
通过分析,可以得出符合我们需求的分页sql格式是:
select * from 表名 limit (start-1)*pageSize,pageSize;
7、对查询结果排序
这个地方可以解决第二小节里面的疑问,查询的学生id并不是有序的原因是因为,MySQL服务器在处理查询请求时会考虑效率问题,因此并不是简单的按照记录插入顺序去读取记录,而是采用某些特殊的方式来提升查询效率。
如果想要实现按照顺序进行排序的话,必须使用order by 子句来显式的指定排序规则。
7.1按照单个列的值进行排序
语法如下:
order by 列名 [asc|desc]
这里面的asc和desc指的是排序的方向。asc指的是按照指定列的值从小到大的排序,称为升序;desc指的是按照指定列的值从大到小的排序,称为降序;“|”表示两个排序方式只能选一个,并且当不写排序方式时,默认的排序方式为升序(asc);样例:
/**升序**/
SELECT number,subject,score from student_score ORDER BY score;
/**
number subject score
20230104 计算机技术 55
20230104 MySQL技术 59
20230103 MySQL技术 61
20230101 计算机技术 78
20230101 MySQL技术 88
20230103 计算机技术 89
20230102 MySQL技术 98
20230102 计算机技术 100
**/
/**降序**/
SELECT number,subject,score from student_score ORDER BY score DESC;
/**
number subject score
20230102 计算机技术 100
20230102 MySQL技术 98
20230103 计算机技术 89
20230101 MySQL技术 88
20230101 计算机技术 78
20230103 MySQL技术 61
20230104 MySQL技术 59
20230104 计算机技术 55
**/
7.2按照多个列的值进行排序
除了对单个列进行排序,我们还可以进行多个列的排序,看具体语法:
order by 列1 [asc|desc],列2 [asc|desc]...
样例:
SELECT number,subject,score from student_score ORDER BY subject,score DESC;
/**
number subject score
20230102 MySQL技术 98
20230101 MySQL技术 88
20230103 MySQL技术 61
20230104 MySQL技术 59
20230102 计算机技术 100
20230103 计算机技术 89
20230101 计算机技术 78
20230104 计算机技术 55
**/
注意:
不光可以对数字进行排序,字符串也可以进行排序,而字符串比较大小的方式就比较每个字符的大小。具体如下:
- 先比较字符串的第一个字符,第一个字符小的那个字符串就比较小;
- 如果两个字符串的第一个字符相同,再比较第二字符,第二个字符比较晓得那个字符串就比较小;
- 如果两个字符串的前两个字符都相同,就比较第三个字符,以此类推。
补充
排序还可以和分页一起使用,具体SQL如下:
SELECT 查询列名 from 表名 ORDER BY 列名1,列名2 [asc|desc] LIMIT [偏移量],限制条数;
/**样例**/
SELECT number,subject,score from student_score ORDER BY subject,score DESC LIMIT 4;
/**
number subject score
20230102 MySQL技术 98
20230101 MySQL技术 88
20230103 MySQL技术 61
20230104 MySQL技术 59
**/
二、带附带条件的查询
附带条件,简而言之就是我们要根据条件过滤一些数据,留下我们想要的数据。这个地方用到where子句。
1、搜索条件
如果我们要查询学生表里面叫“韩信”同学,那我们的SQL可以这样写
SELECT * FROM `test`.`student` WHERE `name` = '韩信' ;
/**
20230101 2023010101 韩信 16461689qq.com 123456789456789123 计算机学院 计算机科学与技术 2023-06-03
**/
“*”最好用具体的字段写,这个地方为了简单表明查询条件的用法,就用“*”代替返回列了,不要模仿!
where跟上一些查询条件即可,这个地方先了解一下基本的比较运算符:
具体的SQL,大家可以把相关的条件放在where后面自己操作一下试试,这个地方不做多的演示。
2、多个搜索条件
当我们一个查询里面有多个条件时我们就需要用到and和or运算符了。
- and表示的是,如果A AND B 那么只有当A和B都满足的情况下才会查询到结果,有一个不满足,返回的结果都是为空;
- or表示的,如果A OR B 那么当A和B中任意一个条件被满足,那么就可以返回结果,如果都不满足,那么返回结果为空。
- 当我们出现嵌套的查询条件时,就需要根据条件的先后顺序来进行处理了,和数学的处理方式一样,都是有优先级的,而且可以用()提高优先级。比如A OR B AND C,这里面可以看成 A OR D,其中D指的就是B AND C,如果你给上面加上括号,(A OR B) AND C,那就可以看做E AND C ,其中E就是A OR B。
3、通配符
在上面图片中展示的通配符只有%,是和like和not like一起使用的,其实MySQL还有一个通配符,为“_”。下面给两个通配符做具体的介绍:
%:代表任意数量的字符,0个字符也可以;
用法:
- 查询以某个字符开头:举例查询以a开头的数据
select 查询列 from 表名 where 列名 like 'a%';
- 查询以某个字符结尾的数据:举例查询以a结尾的数据
select 查询列 from 表名 where 列名 like '%a';
- 查询包含某个字符的数据:举例查询字符中包含a的数据
select 查询列 from 表名 where 列名 like '%a%';
_:代表任意一个字符。
用法:
- 查询以某个字符开头:举例查询以a开头的数据
select 查询列 from 表名 where 列名 like 'a_';
/**注意,因为_代替的只是一个字符,所以这个地方查询的数据只能是两个字符的数据,比如ab、ac,但是abc、acd就不行了**/
- 查询以某个字符结尾的数据:举例查询以a结尾的数据
select 查询列 from 表名 where 列名 like '_a';
/**注意,因为_代替的只是一个字符,所以这个地方查询的数据只能是两个字符的数据,比如ba、ca,但是bac、cad就不行了**/
- 查询包含某个字符的数据:举例查询字符中包含a的数据
select 查询列 from 表名 where 列名 like '_a_';
/**注意,因为_代替的只是一个字符,所以这个地方查询的数据只能是两个字符的数据,比如cab、bac,但是babc、cacd就不行了**/
需要注意的是:通配符不能代表NULL,如果需要匹配NULL ,则需要使用is null 或者is not null
3.1、转义通配符
如果待匹配的字符串本身就包含普通字符%和_,那我们就要查询的时候要在前面加一个反斜杠(\)来和通配符区分开来。即:
- '\%'代表普通字符'%';
- '\_'代表普通字符'_'
样例:
select 查询列 from 表名 where 列名 like 'a\_';
select 查询列 from 表名 where 列名 like 'a\%';
MySQL基础(四)-----简单查询和带附带条件的查询。就分享到这个地方,后续会更新MySQL基础(五)-----表达式&函数和分组查询。
今天的分享就到此结束了,如果觉得对您有帮助,麻烦给个三连!
以上内容为本人的经验总结和平时操作的笔记。若有错误和重复请联系作者删除!!感谢支持!!