当前位置:网站首页>《MySQL核心知识》第6章:查询语句
《MySQL核心知识》第6章:查询语句
2022-08-01 11:31:00 【冰河】
「大家好,我是冰河~~」
今天是《MySQL核心知识》专栏的第6章,今天为大家系统的讲讲MySQL中的查询语句,希望通过本章节的学习,小伙伴们能够举一反三,彻底掌握MySQL中的各种查询语句。好了,开始今天的正题吧。
语法
MySQL中select的基本语法形式
select 属性列表
from 表名和视图列表
[where 条件表达式]
[group by 属性名[having 条件表达式]]
[order by 属性名[asc|desc]]
[limit <offset>,row count]
说明:
where子句:按照“条件表达式”指定的条件进行查询。 group by子句:按照“属性名”指定的字段进行分组。 having子句:有group by才能having子句,只有满足“条件表达式”中指定的条件的才能够输出。 group by子句通常和count()、sum()等聚合函数一起使用。 order by子句:按照“属性名”指定的字段进行排序。排序方式由“asc”和“desc”两个参数指出,默认是按照“asc”来排序,即升序。
建立测试表
创建测试表
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)
)
插入测试数据
INSERT INTO fruits(f_id,s_id,f_name,f_price)
VALUES('a1',101,'apple',5.2),
('b1',102,'blackberry',5.2),
('bs1',105,'orange',5.2),
('bs2',103,'melon',5.2),
('t1',106,'banana',5.2);
使用select语句查询f_id字段的数据
SELECT f_id,f_name FROM fruits

「注意:MYSQL中SQL语句是不区分大小写的,因此select和SELECT作用是相同的」
常用查询
SELECT * FROM fruits
SELECT f_id,f_name FROM fruits WHERE f_price >5.1
SELECT f_id,f_name FROM fruits WHERE s_id IN(101,102)
SELECT f_id,f_name FROM fruits WHERE s_id NOT IN(101,102)
SELECT f_id,f_name FROM fruits WHERE f_price BETWEEN 2 AND 10
SELECT f_id,f_name FROM fruits WHERE f_price NOT BETWEEN 2 AND 10
带like的字符匹配查询
1、百分号通配符“%”,匹配任意长度的字符,甚至包括零字符
SELECT f_id,f_name FROM fruits WHERE f_name LIKE 'b%y'

2、下划线通配符“_”,一次只能匹配任意一个字符
下面语句有四个下划线
SELECT f_id,f_name FROM fruits WHERE f_name LIKE '____n'

查询空值
CREATE TABLE customers
(
c_id INT NOT NULL AUTO_INCREMENT,
c_name CHAR(25) NOT NULL,
c_city CHAR(50) NULL,
PRIMARY KEY(c_id)
)
INSERT INTO customers(c_name,c_city)
VALUES('liming','china'),
('hongfang',NULL)
SELECT * FROM customers WHERE c_city IS NULL

SELECT * FROM customers WHERE c_city IS NOT NULL

AND、OR、DISTINCT关键字
SELECT f_id,f_name FROM fruits WHERE f_name LIKE '____n' AND f_id='bs2'
SELECT f_id,f_name FROM fruits WHERE f_name LIKE '____n' OR f_id='bs2'
SELECT DISTINCT s_id FROM fruits
GROUP BY
SELECT s_id ,COUNT(1) AS total FROM fruits GROUP BY s_id

再插入两条记录
INSERT INTO fruits(f_id,s_id,f_name,f_price) VALUES('a6',101,'cherry',6), ('a8',102,'coconut',7)
如果要查看每个供应商提供的水果的种类的名称,MYSQL中可以在GROUP BY中使用GROUP_CONCAT()函数,将每个分组中各个字段的值显示出来
SELECT s_id,GROUP_CONCAT(f_name) AS NAMES FROM fruits GROUP BY s_id

SQLSERVER是没有GROUP_CONCAT()函数的,SQLSERVER要达到同样效果需要使用xml函数,MYSQL这方面做得非常好
having:过滤分组
根据s_id对fruits表中的数据进行分组,并显示水果种类大于1的分组信息
SELECT s_id ,GROUP_CONCAT(f_name) AS NAMES FROM fruits GROUP BY s_id HAVING COUNT(f_name)>1

在group by中使用with rollup
SELECT s_id ,COUNT(1) AS total FROM fruits GROUP BY s_id WITH ROLLUP

增加了最后一行,7表示total列的所有值的总和
「注意:当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即ROLLUP和ORDER BY是互相排斥的!」
limit限制查询结果的数量
在SQLSERVER中是使用「TOP」关键字,而在MYSQL中是使用「LIMIT」关键字
LIMIT[位置偏移量],行数
第一个“位置偏移量”参数指示MYSQL从哪一行开始显示,是一个可选参数,如果不指定“位置偏移量”
将会从表中第一条记录开始(第一条记录的位置偏移量是0,第二天记录的位置偏移量是1......以此类推)
第二个参数“行数”指示返回的记录条数
SELECT * FROM fruits

SELECT * FROM fruits LIMIT 4,3
正在上传…重新上传取消
上面结果返回从第5条记录行(因为从0开始数)开始之后的3条记录
注意:在MYSQL5.6中可以使用 LIMIT 「4」 OFFSET 「3」 ,意思是获取从第5行记录开始的3条记录,和 LIMIT「4」,「3」 返回的结果是一样的
子查询
「子查询」这个特性从「MYSQL4.1」开始引入。
插入测试数据
CREATE TABLE tbl1(num1 INT NOT NULL); CREATE TABLE tbl2(num2 INT NOT NULL) INSERT INTO tbl1 VALUES(1),(4),(13),(27); INSERT INTO tbl2 VALUES(6),(14),(11),(20)
ANY关键字接在一个比较操作符的后面,表示若与子查询返回的任何值比较为TRUE,则返回TRUE。返回tbl2表的所有num2列,然后将tbl1中的num1的值与之进行比较,只要大于num2的任何一个值,即为符合查询条件的结果
SELECT num1 FROM tbl1 WHERE num1>ANY(SELECT num2 FROM tbl2)

ALL关键字接在一个比较操作符的后面,表示与子查询返回的所有值比较为TRUE,则返回TRUE
SELECT num1 FROM tbl1 WHERE num1>ALL(SELECT num2 FROM tbl2)

合并查询
使用UNION关键字,合并结果时,两个查询对应的列数和数据类型必须相同。
各个SELECT语句之间使用UNION或UNION ALL关键字分隔
UNION:执行的时候删除重复的记录,所有返回的行都是唯一的
UNION ALL:不删除重复行也不对结果进行自动排序
SELECT s_id,f_name,f_price
FROM fruits
WHERE f_price<9.0
UNION
SELECT s_id,f_name,f_price
FROM fruits
WHERE s_id IN (101,103)

第一个查询把f_price小于9.0的记录查询出来,第二个查询把s_id为101和103的记录查询处理
因为f_price小于9.0的记录里有些记录的s_id是102、105、106,这些结果不会被去掉会跟第二个查询进行合并
所以最终的结果会有s_id为102、105、106的记录
正则表达式查询
正则表达式在「SQLSERVER」里面是没有的,但是在MYSQL里不单只有,而且功能也比较丰富MySQL中使用REGEXP关键字指定正则表达式的字符匹配模式。
1、查询以特定字符或字符串开头的记录
字符“^”匹配以特定字符或者字符串开头的文本
SELECT * FROM fruits WHERE f_name REGEXP '^b'
返回f_name字段以b开头的记录

2、查询以特定字符或字符串结尾的记录
字符“$”匹配以特定字符或者字符串结尾的文本
SELECT * FROM fruits WHERE f_name REGEXP 'y$'
返回f_name字段以y结尾的记录


3、用符号“.”来代替字符串中的任意一个字符
字符“.”匹配任意一个字符
SELECT * FROM fruits WHERE f_name REGEXP 'a.g'

a和g两个字母之间包含单个字符,orange符合要求
4、使用“*”和“+”来匹配多个字符
星号“*”匹配前面的字符任意多次,包括0次。加号“+”匹配前面的字符至少一次
SELECT * FROM fruits WHERE f_name REGEXP '^ba*'

blackberry和banana符合要求,b开头,a匹配任意多次,不管出现的顺序在哪里
SELECT * FROM fruits WHERE f_name REGEXP '^ba+'

“a+”匹配字母“a”至少一次,只有banana满足匹配条件
5、匹配指定字符串
正则表达式可以匹配指定字符串,只要这个字符串在查询文本中即可,如要匹配多个字符串,多个字符串之间使用分隔符“|”隔开
SELECT * FROM fruits WHERE f_name REGEXP 'on|ap'

可以看到apple 、melon 、coconut 3个值中都包含有字符串“on”和“ap”,满足匹配条件
6、匹配指定字符中的任意一个
方括号“[]”指定一个字符集合,只匹配其中任何一个字符,即为所查找的文本
SELECT * FROM fruits WHERE f_name REGEXP '[ot]'

方括号[]还可以指定数值集合
SELECT * FROM fruits WHERE s_id REGEXP '[456]'

s_id字段值中有3个数字中的1个即为匹配记录字段
[456]也可以写成[4-6]即指定集合区间
7、匹配指定字符以外的字符
“[^字符集合]”匹配不在指定集合中的任何字符
SELECT * FROM fruits WHERE f_id REGEXP '[^a-e1-2]'

返回开头不在a-e 1-2字母的记录,例如a1,b1这些记录就不符合要求
8、使用{n,} 或者{n,m}来指定字符串连续出现的次数
“字符串{n,}”,表示至少匹配n次前面的字符;“字符串{n,m}”表示匹配前面的字符串不少于n次,不多于m次。
SELECT * FROM fruits WHERE f_name REGEXP 'b{1,}'

至少匹配1次字母b,blackberry和banana都符合要求
SELECT * FROM fruits WHERE f_name REGEXP 'ba{1,3}'

“ba”字符串最少出现一次,最多三次,banana这个字符串符合要求。
「好了,如果文章对你有点帮助,记得给冰河一键三连哦,欢迎将文章转发给更多的小伙伴,冰河将不胜感激~~」
关于星球
「冰河技术」 知识星球《RPC手撸专栏》已经开始了,我会将《RPC手撸专栏》的源码放到知识星球中,同时在微信上会创建专门的知识星球群,冰河会在知识星球上和星球群里解答球友的提问。
星球提供的服务
冰河整理了星球提供的一些服务,如下所示。
加入星球,你将获得:
1.学习从零开始手撸可用于实际场景的高性能、可扩展的RPC框架项目
2.学习SpringCloud Alibaba实战项目—从零开发微服务项目
3.学习高并发、大流量业务场景的解决方案,体验大厂真正的高并发、大流量的业务场景
4.学习进大厂必备技能:性能调优、并发编程、分布式、微服务、框架源码、中间件开发、项目实战
5.提供站点 https://binghe001.github.io 所有学习内容的指导、帮助
6.GitHub:https://github.com/binghe001/BingheGuide - 非常有价值的技术资料仓库,包括冰河所有的博客开放案例代码
7.可以发送你的简历到我的邮箱,提供简历批阅服务
8.提供技术问题、系统架构、学习成长、晋升答辩等各项内容的回答
9.定期的整理和分享出各类专属星球的技术小册、电子书、编程视频、PDF文件
10.定期组织技术直播分享,传道、授业、解惑,指导阶段瓶颈突破技巧
如何加入星球
「链接」 :打开链接 http://m6z.cn/6aeFbs 加入星球。 「回复」 :在公众号 「冰河技术」 回复 「星球」 领取优惠券加入星球。
「特别提醒:」 苹果用户进圈或续费,请加微信 「hacker_binghe」 扫二维码,或者去公众号 「冰河技术」 回复 「星球」 扫二维码加入星球。
「好了,今天就到这儿吧,我是冰河,我们下期见~~」
边栏推荐
- 【likeshop】回收租凭系统100%开源无加密 商城+回收+租赁
- sql中ddl和dml(数据库表与视图的区别)
- 大众碰到点评的一个字体反爬,落地技术也是绝了
- jmeter
- 一篇文章,带你详细了解华为认证体系证书(1)
- Endorsed in 2022 years inventory | product base, science and technology, guangzhou automobile group striding forward
- Introduction to data warehouse layering (real-time data warehouse architecture)
- 机器学习 | MATLAB实现支持向量机回归RegressionSVM参数设定
- 新书上市 |《谁在掷骰子?》在“不确定性时代”中确定前行
- [Open class preview]: Research and application of super-resolution technology in the field of video image quality enhancement
猜你喜欢
mysql进阶(二十二)MySQL错误之Incorrect string value中文字符输入错误问题分析
Audio and Video Technology Development Weekly | 256
音视频技术开发周刊 | 256
Excel表格打印时不打印标记填充颜色
进制与转换、关键字
Favorites|Mechanical Engineer Interview Frequently Asked Questions
在线GC日志分析工具——GCeasy
Small application project works WeChat gourmet recipes applet graduation design of finished product (1) the development profile
【随心笔记】假期快过去了,都干了点什么
The four methods of judging JS data type
随机推荐
leetcode/submatrix element sum
Promise learning (2) An article takes you to quickly understand the common APIs in Promise
Golang内存分析工具gctrace和pprof实战
.NET性能优化-使用SourceGenerator-Logger记录日志
[Open class preview]: Research and application of super-resolution technology in the field of video image quality enhancement
Flutter Widget 如何启用和屏蔽点击事件
表达式引擎在转转平台的实践
收藏|机械工程师面试常问问题
July 31, 2022 -- Take your first steps with C# -- Use C# to create readable code with conventions, spaces, and comments
R语言检验时间序列的平稳性:使用tseries包的adf.test函数实现增强的Dickey-Fuller(ADF)检验、检验时序数据是否具有均值回归特性(平稳性)、具有均值回归特性的案例
图解MySQL内连接、外连接、左连接、右连接、全连接......太多了
博弈论(Depu)与孙子兵法(42/100)
How to find out hidden computer software (how to clean up the computer software hidden)
How to use DevExpress controls to draw flowcharts?After reading this article, you will understand!
重庆市大力实施智能建造,推动建筑业数字化转型,助力“建造强市”
bat倒计时代码
Excel表格打印时不打印标记填充颜色
Android Security and Protection Policy
用户体验 | 如何度量用户体验 ?
深入理解 Istio —— 云原生服务网格进阶实战