MySQL-WHERE搜索数据

我们在使用数据库提取数据的时候一般都不会整行都需要,往往是提取符合条件的子集数据。因此有必要增加一个搜索条件来精确查找我们需要的数据。WHERE将会帮助我们搜索数据.

#我们先来看一下由产品名称和价格组成的数据
SELECT prod_name, prod_price
FROM products

这里写图片描述

如果我现在想要买名为Fuses的产品,我想快速知道它的价格,我们可以

SELECT prod_name, prod_price
FROM products
WHERE prod_name = 'Fuses';

这里写图片描述

如果我想购买的价位在10~35之间的,哪些商品符合我的条件呢?

SELECT prod_name, prod_price
FROM products
WHERE prod_price BETWEEN 10 AND 35;

这里写图片描述

格式:BETWEEN 开始值 AND 结束值;
开始值和结束值都包含在内,是闭区间!

当然,还有一个特别的要求,比如说我作为老板,想看看哪个产品的价格忘了填写,即NULL值,这是我们可以这样写

SELECT prod_name, prod_price
FROM products
WHERE prod_price IS NULL;

由于所给的表中的价格都填好了,因此就不给出图片了。

可以使用的操作符有:

操作符说明
=等于
!=不等于
>大于
.>=大于等于
<小于
<=小于等于
BETWEEN范围取值

注:上面>=的点要去掉,此处加点是因为博客MARKDOWN编辑的问题

使用AND,OR,IN,NOT来进行多条件过滤

上面我们用WHERE都是过滤单个条件,如果我们的条件有多个的话就用AND,OR,IN,NOT来过滤

AND

我们先看下由供应商,产品名,产品价格组成的表

这里写图片描述

现在我只想看供应商为1003的产品,并且价格不要超过30

SELECT vend_id, prod_name, prod_price
FROM products
WHERE vend_id = 1003 AND prod_price <=30;

这里写图片描述

OR 和 IN

如果我想要看供应商为1002和1003的产品

SELECT vend_id, prod_name, prod_price
FROM products
WHERE vend_id = 1002 OR vend_id = 1003;

或者

SELECT vend_id, prod_name, prod_price
FROM prodcuts
WHERE vend_id IN (1002, 1003);

这里写图片描述

NOT

如果我不想看供应商是1002和1003的产品

SELECT vend_id, prod_name, prod_price
FROM products
WHERE vend_id NOT IN (1002, 1003);

这里写图片描述

注意:vend_id = 1002 OR vend_id = 1003 AND prod_price<=30;
以上语句意为:想要供应商为1003的且价格不超过30的产品,或者供应商为1002的所有产品。

操作符之间也是有次序的,AND 比 OR高。不过不用记,只要加括号就可以了,要养成加括号的习惯。

MySQL索引的核心实现依赖于高效的数据结构,具体根据存储引擎的不同而有所差异。在InnoDB存储引擎中,索引主要采用 **B+树** 作为其数据结构。B+树是一种平衡的多路搜索树,它能够确保数据的快速检索、插入和删除操作的时间复杂度保持在对数级别 $$^3$$。 ### B+树的特点 - **叶子节点包含数据**:在InnoDB中,聚簇索引(Clustered Index)的叶子节点存储了完整的行数据,这意味着主键索引的B+树最终指向的是实际的数据存储位置。 - **非叶子节点仅包含键值**:非叶子节点用于导航,仅存储索引键值和指向子节点的指针,这使得每个节点能够容纳更多的键值,从而减少树的高度。 - **所有查询最终落到叶子节点**:无论查询是否命中某个键值,最终都会遍历到叶子节点,保证了查询性能的稳定性。 此外,MySQL也支持 **哈希索引(Hash Index)**,尤其是在Memory存储引擎中,默认使用哈希索引。哈希索引适用于等值查询(如 `WHERE column = value`),但在范围查询(如 `WHERE column > value`)中效率较低,因为哈希索引不支持排序操作 $$^1$$。 对于MyISAM存储引擎,虽然它也使用B+树作为索引结构,但与InnoDB不同的是,MyISAM的索引是 **稀疏索引(Non-clustered Index)**,即索引节点中仅包含指向数据文件中行位置的指针,而不是直接包含完整的行数据 $$^3$$。 ### 示例:创建索引的表结构 以下是一个简单的InnoDB表定义,其中 `id` 是主键,`name` 字段上建立了二级索引: ```sql CREATE TABLE `user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(64) DEFAULT NULL, PRIMARY KEY (`id`), KEY `name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 在此结构中,`id` 的主键索引构建了一个聚簇索引,而 `name` 字段上的索引是一个二级索引,其叶子节点中存储的是主键值,而不是完整的行数据。查询时,MySQL会通过二级索引找到主键值,再通过聚簇索引定位到实际的数据行 $$^4$$。 ### 其他索引类型 - **联合索引(Composite Index)**:多个字段组成的索引,遵循最左前缀原则,适用于多条件查询。 - **全文索引(Full-text Index)**:用于文本内容的模糊匹配,支持自然语言搜索- **空间索引(Spatial Index)**:用于地理数据类型(如 `GEOMETRY`),适用于空间查询。 MySQL索引的设计目标是通过高效的数据结构提升查询性能,同时在写入操作时保持良好的维护效率。不同的数据结构适用于不同的查询场景,因此选择合适的索引类型和结构对于数据库性能优化至关重要 $$^1$$。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值