经验大分享:MySQL(三)数据库表的查询操作【重要】

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 经验大分享:MySQL(三)数据库表的查询操作【重要】

      序言

          1、MySQL表操作(创建表,查询表结构,更改表字段等),

          2、MySQL的数据类型(CHAR、VARCHAR、BLOB,等),

          本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对于INNER JOIN(内连接)、LEFT JOIN(左连接)、RIGHT JOIN(右连接)等一些复杂查询。 通过本节的学习,可以让你知道这些基本的复杂查询是怎么实现的,但是建议还是需要多动手去敲,虽然理解了什么是内连接等,但是从理解到学会,是完全不一样的感觉。

                                                         --WZY

一、单表查询

      1.1、查询所有字段

      1.2、查询指定字段

      1.3、查询指定记录

      1.4、带IN关键字的查询

      1.5、带BETWEEN AND 的范围查询

      1.6、带LIKE的字符匹配查询

      1.7、查询空值

      1.8、带AND的多条件查询

      1.9、带OR的多条件查询

      1.10、关键字DISTINCT(查询结果不重复)

      1.11、对查询结果排序

      1.12、分组查询(GROUP BY)

      1.13、使用LIMIT限制查询结果的数量

   集合函数查询

      1.14、COUNT()函数

      1.15、SUM()函数

      1.16、AVG()函数

      1.17、MAX()函数

      1.18、MIN()函数             

二、多表查询

   小知识

      为表取别名

      为字段取别名

   基于两张表 

      2.1、普通双表连接查询

      2.2、内连接查询

      2.3、外连接查询

         2.3.1、左外连接查询

         2.3.2、右外连接查询

      2.4、复合条件连接查询

   子查询

      2.5、带ANY、SOME关键字的子查询

      2.6、带ALL关键字的子查询

      2.7、带EXISTS关键字的子查询

      2.8、带IN关键字的子查询

      2.9、带比较运算符的子查询

   合并结果查询

      2.10、UNION【ALL】的使用

三、使用正则表达式查询

      3.1、查询以特定字符或字符串开头的记录

      3.2、查询以特定字符或字符串结尾的记录

      3.3、用符号"."来替代字符串中的任意一个字符

      3.4、使用""和"+"来匹配多个字符

      3.5、匹配指定字符串

      3.6、匹配指定字符中的任意一个

      3.7、匹配指定字符以外的字符

      3.8、使用{n,}或者{n,m}来指定字符串连续出现的次数

四、综合案例 练习数据表查询操作

      4.1、搭建环境

          省略

      4.2、查询操作

          省略

      4.3、在已经创建好的employee表中进行如下操作

         4.3.1、计算所有女员工(F)的年龄

         4.3.2、使用LIMIT查询从第3条记录开始到第六条记录

         4.3.3、查询销售人员(SALSEMAN)的最低工资

         4.3.4、查询名字以字母N或者S结尾的记录

         4.3.5、查询在BeiJing工作的员工的姓名和职务

         4.3.6、使用左连接方式查询employee和dept表

         4.3.7、查询所有2001~2005年入职的员工的信息,查询部门编号为20和30的员工信息并使用UNION合并两个查询结果

         4.3.8、使用LIKE查询员工姓名中包含字母a的记录

         4.3.9、使用REGEXP查询员工姓名中包含T、C或者M 3个字母中任意1个的记录

           想直接做题的,跳过讲解,直接到练习区。

      这张讲解的目录就是想上面这样,可以直接看自己感兴趣的部分,而不用从最基础的看起,接下来就一步步实现这上面庞大的工作量了。

一、单表查询

      创建查询环境

         CREATE TABLE fruits(

           f_id CHAR(10) NOT NULL,

           s_id INT NOT NULL,

           f_name char(255) NOT NULL,

           f_price DECIMAL(8,2) NOT NULL,

           PRIMARY KEY(f_id)

         );

         解释:

            f_id:主键 使用的是CHAR类型的字符来代表主键

            s_id:这个其实是批发商的编号,也就是代表该水果是从哪个批发商那里过来的,写这个字段的目的是为了方便后面扩增表。

            f_name:水果的名字

            f_price:水果的价格,使用的是DECIMAL这个数据类型,如果不清楚这个类型去查看一下上面一篇讲解数据类型的文章。

       添加数据。

         INSERT INTO fruits(f_id,s_id,f_name,f_price) VALUES

            ('a1' , 101 , 'apple' , 5.2),

            ('b1' , 101 , 'blackberry' , 10.2),

            ('bs1' , 102 , 'orange' , 11.2),

            ('bs2' , 105 , 'melon' , 8.2),

            ('t1' , 102 , 'banana' , 10.3),

            ('t2' , 102 , 'grape' , 5.3),

            ('o2' , 103 , 'coconut' , 9.2),

            ('c0' , 101 , 'cherry' , 3.2),

            ('a2' , 103 , 'apricot' , 2.2),

            ('l2' , 104 , 'lemon' , 6.4),

            ('b2' , 104 , 'berry' , 7.6),

            ('m1' , 106, 'mango' , 15.6),

            ('m2' , 105 , 'xbabay' , 2.6),

            ('t4' , 107, 'xbababa' , 3.6),

            ('m3' , 105 , 'xxtt' , 11.6),

            ('b5' , 107, 'xxxx' , 3.6 );

      blackberry:黑莓  melon:甜瓜  grape:葡萄  coconut:椰子  cherry:樱桃  apricot:杏子  berry:浆果  mango:芒果  后面几个xbabay都是为了测试所编写的,没有实际意义。

      注意:在复制我的代码到cmd窗口时,应注意语句之间不能有空格,不然会报错,我这里是为了使你们观看更清楚,所以每行前面度加有空格,              

      1.1、查询所有字段

          SELECT FROM fruits;

            解释: 代表所有字段,也就是从表中将所有字段下面的记录度查询出来

      1.2、查询指定字段

            查询f_name 和 f_price 字段的记录

            SELECT f_name, f_price FROM fruits;

      1.3、查询指定记录

            指定记录:也就是按条件进行查询,将满足一定条件的记录给查询出来,使用WHERE关键字

            SELECT FROM fruits WHERE f_name = 'apple';  //将名为apple的记录的所有信息度查询出来

            SELECT FROM fruits WHERE f_price > 15;    //将价格大于15的记录的所有字段  查询出来

      1.4、带IN关键字的查询

            IN关键字:IN(xx,yy,...) 满足条件范围内的一个值即为匹配项

            SELECT FROM fruits WHERE f_name IN('apple','orange');

            SELECT FROM fruits WHERE s_id IN(101, 105); //s_id 为101 或者 105 的记录

            SELECT FROM fruits WHERE s_id NOT IN(101,105); //s_id 不为101或者105的记录

      1.5、带BETWEEN AND 的范围查询

            BETWEEN ... AND ... : 在...到...范围内的值即为匹配项,

            SELECT FROM fruits WHERE f_price BETWEEN 5 AND 15;  //f_price 在5到15之间,包括5和15。

            SELECT FROM fruits WHERE f_price NOT BETWEEN 5 AND 15;  //fprice 不在5到15之间。

      1.6、带LIKE的字符匹配查询

             LIKE: 相当于模糊查询,和LIKE一起使用的通配符有 "%"、""

                 "%":作用是能匹配任意长度的字符。

                 "_":只能匹配任意一个字符

             SELECT FROM fruits WHERE f_name LIKE 'b%';  //f_name以b字母开头的所有记录

             SELECT FROM fruits WHERE f_name LIKE 'b%y';  //f_name以b字母开头,y字母结尾的所有记录

             SELECT FROM fruits WHERE fname LIKE '____y';   //此处有四个,说明要查询以y字母结尾并且y之前只有四个字符的记录

             总结:'%'和''可以在任意位置使用,只需要记住%能够表示任意个字符,只能表示一个任意字符

      1.7、查询空值

             空值不是指为空字符串""或者0,一般表示数据未知或者在以后在添加数据,也就是在添加数据时,其字段上默认为NULL,也就是说,如果该字段上不插入任何值,就为NULL。此时就可以查询出来。

             SELECT FROM 表名 WHERE 字段名 IS NULL;  //查询字段名是NULL的记录

             SELECT FROM 表名 WHERE 字段名 IS NOT NULL;  //查询字段名不是NULL的记录

             这里由于没有合适的数据,就不自己在创建表,添加数据,然后来测试这条语句了,很简单,看一下就应该懂了

      1.8、带AND的多条件查询

             AND: 相当于"逻辑与",也就是说要同时满足条件才算匹配

             SELECT FROM fruits WHERE s_id = 101 AND f_price > 5;  //同时满足s_id = 101、f_price >5 这两个条件才算匹配。

      1.9、带OR的多条件查询

             OR: 相当于"逻辑或",也就是说只要满足其中一个条件,就算匹配上了,跟IN关键字效果差不多

             SELECT FROM fruits WHERE s_id = 101 OR f_price > 10;  //s_id =101 或者 f_price >10 ,只要符合其中一个条件,就算匹配

              可以看到,查询出来的记录,f_price有低于10的,那么其肯定s_id=101,s_id不等于101的,其f_price肯定大于10,这就说明了OR的效果。只要满足其中一个条件,就算匹配。

      1.10、关键字DISTINCT(查询结果不重复)

              SELECT s_id FROM fruits;  //查询所有的s_id,会出现很多重复的值。

              使用DISTINCT就能消除重复的值

              SELECT //代码效果参考:http://www.zidongmutanji.com/bxxx/44206.html

DISTINCT s_id FROM fruits;

              将重复的值删除后,就只留下7条记录了。

      1.11、对查询结果排序(ORDER BY)

              看上面输出的值没顺序,可以给他们进行排序。使用关键字 ORDER BY,有两个值供选择 DESC 降序 、 ASC 升序(默认值)

              SELECT DISTINCT s_id FROM fruits ORDER BY s_id;    //默认就是升序,

              SELECT DISTINCT s_id FROM fruits ORDER BY s_id DESC;  //使用降序,也就是从高到底排列

      1.12、分组查询(GROUP BY)

              分组查询很多人不知道什么意思,一开始我也是很蒙圈的,所以没关系,一起来看看。

              分组查询就是将相同的东西分到一个组里面去,现实生活中举个例子,厕所分男女,这也是一个分组的应用,在还没有分男女厕所前,大家度共用厕所,后面通过分男女性别,男的跟男的分为一组,女的和女的分为一组,就这样分为了男女厕所了。这就是分组的意思, 在上面对s_id进行查询的时候,发现很多重复的值,我们也就可以对它进行分组,将相同的值分为一组,

              SELECT s_id FROM fruits GROUP BY s_id;  //将s_id进行分组,有实际意义,按批发商进行分组,从101批发商这里拿的水果度会放在101这个组中

              解释:将s_id分组后,就没有重复的值了,因为重复的度被分到一个组中去了,现在在来看看每个组中有多少个值

              SELECT s_id, COUNT(f_name), GROUP_CONCAT(f_name) FROM fruits GROUP BY s_id;//代码效果参考:http://www.zidongmutanji.com/bxxx/544522.html

              解释:

                COUNT():这个是下面要讲解到的一个函数,作用就是计算有多少条记录, 

                GROUP_CONCAT(): 将分组中的各个字段的值显示出来 

              SELECT s_id, COUNT(f_name), GROUP_CONCAT(f_name), GROUP_CONCAT(f_price) FROM fruits GROUP BY s_id;         

              分组之后还可以进行条件过滤,将不想要的分组丢弃,使用关键字 HAVING

              SELECT s_id,COUNT(f_name),GROUP_CONCAT(f_name) FROM fruits GROUP BY s_id HAVING COUNT(f_name) > 1;//他能够过s_id分组,然后过滤出水果种类大于1的分组信息。

              总结:

                 知道GROUP BY的意义,并且会使用HAVING对分组进行过滤, HAVING和WHERE都是进行条件过滤的,区别就在于 WHERE 是在分组之前进行过滤,而HAVING是在分组之后进行条件过滤。

      1.13、使用LIMIT限制查询结果的数量  

              LIMIT【位置偏移量】 行数 通过LIMIT可以选择数据库表中的任意行数,也就是不用从第一条记录开始遍历,可以直接拿到 第5条到第10条的记录,也可以直接拿到第12到第15条的记录。 具体看下面例子

              SELECT FROM fruits LIMIT 4;  //没有写位置偏移量,默认就是0,也就是从第一条开始,往后取4条数据,也就是取了第一条数据到第4条的数据。

              SELECT FROM fruits LIMIT 4,3;  //从第5条数据开始,往后取3条数据,也就是从第5条到第8条

              注意:LIMIT的第一个参数不写默认就是0,也就是说,第一条记录的索引是0,从0开始的,第二个参数的意思是取多少行的记录,需要这两个才能确定一个取记录的范围

   集合函数查询

      1.14、COUNT()函数

              这个函数在上面其实用过,作用是统计数据表中包含的记录行的总数,或者根据查询结果返回列中包含的数据行数,

                COUNT():计算表中的总的行数,不管某列有数值或者为空值,因为就是代表查询表中所有的数据行

                COUNT(字段名):计算该字段名下总的行数,计算时会忽略空值的行,也就是NULL值的行。

              SELECT COUNT() FROM fruits;

              SELECT COUNT(f_name) FROM fruits;  //查询fruits表中f_name字段名下有多少个行数,

                    没有空值,所以计算出来的行数和总的记录行数是一样的。

      1.15、SUM()函数

              SUM()是一个求总和的函数,返回指定列值的总和

              SELECT SUM(f_price) FROM fruits;  //这个没有实际的意义,只是测试SUM()函数有求总和的能力

                   如果有人觉得这个测试的不准,可以手动去加一下所有的f_price。然后来进行对比,反正我是信了。

      1.16、AVG()函数

             AVG()函数通过计算返回的行数和每一行数据的和,求的指定列数据的平均值(列数据指的就是字段名下的数据,不要搞不清楚列和行,搞不清就对着一张表搞清楚哪个是列哪个是行),通俗点讲,就是将计算得来的总之除以总的记录数,得出一个平均值,

              SELECT AVG(f_price) FROM fruits;  

                    就相当于  116/16 = 7.25

      1.17、MAX()函数

              MAX()返回指定列中的最大值

               SELECT MAX(f_price) FROM fruits;

      1.18、MIN()函数             

             MIN()返回查询列中的最小值

              SELECT MIN(f_price) FROM fruits;

二、多表查询

   小知识

      为表取别名

          因为是对两张表进行查询了,那么每次写表名的话就有点麻烦,所以用一个简单别名来代表表名

           格式:表名 AS 别名

           在下面的例子中会用的到,到时候不要不认识

      为字段取别名

          给字段名取别名的原因是有些字段名是为了显示更加清楚,比如

                SELECT f_price AS '价格' FROM fruits;

      语句执行顺序问题

            一、sql执行顺序 、

              (1)from   

              (2) on

              (3) join

              (4) where

              (5)group by

              (6) avg,sum....

              (7)having

              (8) select

              (9) distinct

              (10) order by

<span style="font-family: tahoma, arial, 宋体; font-size: 14px; li

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
并行计算 关系型数据库 MySQL
如何用 esProc 将数据库表转储提速查询
当数据库查询因数据量大或繁忙变慢时,可借助 esProc 将数据导出为文件进行计算,大幅提升性能。以 MySQL 的 3000 万行订单数据为例,两个典型查询分别耗时 17.69s 和 63.22s。使用 esProc 转储为二进制行存文件 (btx) 或列存文件 (ctx),结合游标过滤与并行计算,性能显著提升。例如,ctx 并行计算将原查询时间缩短至 0.566s,TopN 运算提速达 30 倍。esProc 的简洁语法和高效文件格式,特别适合历史数据的复杂分析场景。
|
1月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
1月前
|
数据库 Python
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
|
1月前
|
数据库
【YashanDB知识库】数据库用户所拥有的权限查询
【YashanDB知识库】数据库用户所拥有的权限查询
|
1月前
|
存储 运维 监控
百万指标,秒级查询,零宕机——时序数据库 TDengine 在 AIOps 中的硬核实战
本篇文章详细讲述了七云团队在运维平台中如何利用 TDengine 解决海量时序数据存储与查询的实际业务需求。内容涵盖了从数据库选型、方案落地到业务挑战及解决办法的完整过程,特别是分享了升级 TDengine 3.x 时的实战经验,给到有需要的小伙伴参考阅读。
62 1
|
1月前
|
缓存 NoSQL 关系型数据库
WordPress数据库查询缓存插件
这款插件通过将MySQL查询结果缓存至文件、Redis或Memcached,加速页面加载。它专为未登录用户优化,支持跨页面缓存,不影响其他功能,且可与其他缓存插件兼容。相比传统页面缓存,它仅缓存数据库查询结果,保留动态功能如阅读量更新。提供三种缓存方式选择,有效提升网站性能。
51 1
|
2月前
|
算法 关系型数据库 MySQL
join查询可以⽆限叠加吗?MySQL对join查询有什么限制吗?
大家好,我是 V 哥。本文详细探讨了 MySQL 中 `JOIN` 查询的限制及其优化方法。首先,`JOIN` 查询不能无限叠加,存在资源(CPU、内存、磁盘 I/O)、性能和语法等方面的限制。过多的 `JOIN` 操作会导致数据库性能急剧下降。其次,介绍了三种常见的 `JOIN` 查询算法:嵌套循环连接(NLJ)、索引嵌套连接(INL)和基于块的嵌套循环连接(BNL),并分析了它们的触发条件和性能特点。最后,分享了优化 `JOIN` 查询的方法,包括 SQL 语句优化、索引优化、数据库配置调整等。关注 V 哥,了解更多技术干货,点赞👍支持,一起进步!
|
1月前
|
数据库
|
2月前
|
存储 人工智能 监控
时序数据库 TDengine 化工新签约:存储降本一半,查询提速十倍
化工行业在数字化转型过程中面临数据接入复杂、实时性要求高、系统集成难度大等诸多挑战。福州力川数码科技有限公司科技依托深厚的行业积累,精准聚焦行业痛点,并携手 TDengine 提供高效解决方案。
67 0
|
3月前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
321 6
下一篇
oss创建bucket