Bootstrap

MySQL基础(四)-----简单查询和带附带条件的查询

目录

一、简单查询

1、准备工作

1.1建表

1.2为表中插入数据

2、查询单个列

2.1列的别名

3、查询多个列

4、查询所有列

5、给查询的结果去重

5.1去除单列的重复结果

5.2去除多列的重复结果

6、限制结果记录条数

1、用于强制返回指定的记录行数

2、分页

7、对查询结果排序

7.1按照单个列的值进行排序

7.2按照多个列的值进行排序

补充

 二、带附带条件的查询

1、搜索条件

2、多个搜索条件

3、通配符

3.1、转义通配符


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跟上一些查询条件即可,这个地方先了解一下基本的比较运算符:

76b9c28a96986daf302e0235f844c7b0.jpeg

具体的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基础(五)-----表达式&函数和分组查询。

今天的分享就到此结束了,如果觉得对您有帮助,麻烦给个三连!

以上内容为本人的经验总结和平时操作的笔记。若有错误和重复请联系作者删除!!感谢支持!!

;