MySQL中的常用逻辑操作符

逻辑运算符在MySQL查询中扮演着重要角色,通过AND、OR、NOT等运算符的组合使用,可以提高查询的准确性和灵活性,确保查询结果满足业务需求。合理使用这些运算符还能优化查询性能,减少不必要的数据检索,并提高SQL语句的可读性和可维护性。
本来是想借助力扣的题目来巩固学习,结果刷了三道题后感觉太慢,还是从网上下载了一个动漫角色战力数据,自己建了两个数据库,操作更快更方便一点。
常用的MySQL逻辑运算符如下

逻辑运算符描述示例
AND (或 &&)当且仅当两个操作数都为真时,条件才为真SELECT * FROM 数据表 WHERE 列1 = '数值1' AND 列2 = '数值2';
OR (或 ||)当至少有一个操作数为真时,条件就为真SELECT * FROM 数据表 WHERE 列1 = '数值1' OR 列2 = '数值2';
NOT (或 !)用于反转操作数的逻辑状态SELECT * FROM 数据表 WHERE NOT 列1 = '数值1';
BETWEEN用于在某个范围内选择值SELECT * FROM 数据表 WHERE 列1 BETWEEN '数值1' AND '数值2';
IN用于测试某个值是否在给定的列表中SELECT * FROM 数据表 WHERE 列1 IN ('数值1', '数值2', '数值3');
IS NULL, IS NOT NULL用于测试某个字段是否为NULL或不为NULLSELECT * FROM 数据表 WHERE 列1 IS NULL;
EXISTS, NOT EXISTS用于测试子查询是否返回任何结果SELECT * FROM 数据表1 WHERE EXISTS (SELECT 1 FROM 数据表2 WHERE 数据表2.column = 数据表1.column);
LIKE用于在字符串中搜索模式SELECT * FROM 数据表 WHERE 列1 LIKE 'pattern%';
<> (或 !=)用于检查两个值是否不等SELECT * FROM 数据表 WHERE 列1 <> '数值1';

AND(&&)

借助力扣的题库来演示下。
原题链接:高频SQL50题:1757
题目要求如下:
表:Products

Column NameType
product_idint
low_fatsenum
recyclableenum

product_id 是该表的主键(具有唯一值的列)。
low_fats 是枚举类型,取值为以下两种 (‘Y’, ‘N’),其中 ‘Y’ 表示该产品是低脂产品,‘N’ 表示不是低脂产品。
recyclable 是枚举类型,取值为以下两种 (‘Y’, ‘N’),其中 ‘Y’ 表示该产品可回收,而 ‘N’ 表示不可回收。

编写解决方案找出既是低脂又是可回收的产品编号。

返回结果 无顺序要求 。

返回结果格式如下例所示:

示例 1:

输入:
Products 表:

product_idlow_fatsrecyclable
0YN
1YY
2NY
3YY
4NN

输出:

product_id
1
3

解释:
只有产品 id 为 1 和 3 的产品,既是低脂又是可回收的产品。

先建立以下表格模拟:

CREATE TABLE Products (  
    product_id INT PRIMARY KEY,  
    low_fats ENUM('Y', 'N'),  
    recyclable ENUM('Y', 'N')  
);
-- 一口气插入数据
INSERT INTO Products (product_id, low_fats, recyclable) VALUES  
(0, 'Y', 'N'),  
(1, 'Y', 'Y'),  
(2, 'N', 'Y'),  
(3, 'Y', 'Y'),  
(4, 'N', 'N');

我的解题方法是在使用了SELECTFROMWHERE的基础上,使用AND逻辑操作符来确保两个条件(低脂和可回收)同时得到满足。

SELECT product_id  
FROM Products  
WHERE low_fats = 'Y' AND recyclable = 'Y';

运行结果如下,我的应该是最常见的解法
在这里插入图片描述

在这里插入图片描述

OR(||)

这个也是力扣的题库。
原题链接:高频SQL50题:584
表: Customer

Column NameType
idint
namevarchar
referee_idint

在 SQL 中,id 是该表的主键列。
该表的每一行表示一个客户的 id、姓名以及推荐他们的客户的 id。
找出那些 没有被 id = 2 的客户 推荐 的客户的姓名。

以 任意顺序 返回结果表。

结果格式如下所示。

示例 1:

输入:
Customer 表:

idnamereferee_id
1Willnull
2Janenull
3Alex2
4Billnull
5Zack1
6Mark2

输出:

name
Will
Jane
Bill
Zack

建立表格先,这里我在建立时添加了外键约束,可以允许referee_id列有NULL

CREATE TABLE Customer (  
    id INT PRIMARY KEY,  
    name VARCHAR(255),  
    referee_id INT,  
    FOREIGN KEY (referee_id) REFERENCES Customer(id) ON DELETE SET NULL  
);  
  
INSERT INTO Customer (id, name, referee_id) VALUES  
(1, 'Will', NULL),  
(2, 'Jane', NULL),  
(3, 'Alex', 2),  
(4, 'Bill', NULL),  
(5, 'Zack', 1),  
(6, 'Mark', 2);

在这里插入图片描述
使用OR

SELECT name  
FROM Customer  
WHERE referee_id != 2 OR referee_id IS NULL;

在这里插入图片描述
在这里插入图片描述
刷题太费劲了,我还是自建一个小数据库吧

创建超级英雄战力数据库

CREATE DATABASE superheroes;
USE superheroes; 
CREATE TABLE IF NOT EXISTS characters (    
    `Character` VARCHAR(255),    
    `Universe` VARCHAR(255),    
    `Strength` INT,    
    `Speed` INT,    
    `Intelligence` INT,    
    `SpecialAbilities` VARCHAR(255),    
    `Weaknesses` VARCHAR(255),    
    `BattleOutcome` INT    
);

插入超级英雄信息

INSERT INTO `characters` (`Character`, `Universe`, `Strength`, `Speed`, `Intelligence`, `SpecialAbilities`, `Weaknesses`, `BattleOutcome`) VALUES 
('Wonder Woman', 'Marvel', 7, 8, 3, 'Telekinesis', 'Kryptonite', 0),  
('Iron Man', 'Marvel', 4, 7, 9, 'Telekinesis', 'Kryptonite', 0),  
('Ass Man', 'DC Comics', 8, 7, 5, 'Telekinesis', 'Magic', 0),  
('Spider-Dick-Man', 'DC Comics', 5, 6, 10, 'Telekinesis', 'Kryptonite', 0),  
('Flash', 'Marvel', 7, 6, 2, 'Invisibility', 'Magic', 0),  
('Spider-Man', 'DC Comics', 10, 9, 7, 'Invisibility', 'Wooden Stake', 1),  
('Wonder Woman', 'Marvel', 3, 6, 2, 'Super Strength', 'Silver', 1),  
('Thor', 'DC Comics', 7, 2, 4, 'Invisibility', 'Magic', 1),  
('Batman', 'DC Comics', 8, 2, 7, 'Flight', 'Silver', 0),  
('Iron Man', 'DC Comics', 5, 5, 4, 'Flight', 'Wooden Stake', 0),  
('Superman', 'DC Comics', 4, 4, 7, 'Telekinesis', 'Kryptonite', 0),  
('Thor', 'DC Comics', 8, 2, 7, 'Flight', 'Wooden Stake', 0),  
('Iron Man', 'DC Comics', 8, 3, 1, 'Super Strength', 'Silver', 0),  
('Batman', 'Marvel', 3, 7, 6, 'Invisibility', 'Wooden Stake', 0),  
('Flash', 'DC Comics', 6, 8, 9, 'Invisibility', 'Kryptonite', 0),  
('Superman', 'Marvel', 5, 6, 2, 'Invisibility', 'Wooden Stake', 0),  
('Iron Man', 'Marvel', 2, 5, 3, 'Flight', 'Kryptonite', 0),  
('Captain America', 'Marvel', 8, 1, 10, 'Invisibility', 'Magic', 1),  
('Wonder Woman', 'Marvel', 6, 8, 5, 'Telekinesis', 'Silver', 1),  
('Thor', 'Marvel', 2, 3, 9, 'Telekinesis', 'Kryptonite', 0),  
('BigDick', 'Marvel', 100, 100, 100, 'Flight', 'Kryptonite', 0);

查看下数据库是否正创建成功,使用CREATE VIEW创建一个虚拟表格来展示下:

CREATE VIEW superheroes_view AS  
SELECT `Character`, `Universe`, `Strength`, `Speed`, `Intelligence`, `SpecialAbilities`, `Weaknesses`, `BattleOutcome`  
FROM characters;

SELECT * FROM superheroes_view;

在这里插入图片描述

NOT (或 !)

根据superheroes数据库查询非漫威宇宙的角色

SELECT * FROM characters WHERE NOT Universe = 'Marvel';  
-- 或者SELECT * FROM characters WHERE Universe != 'Marvel';

在这里插入图片描述

BETWEEN

查询力量值在5到8之间的角色:

SELECT * FROM characters WHERE Strength BETWEEN 5 AND 8;

在这里插入图片描述

IN

查询宇宙为漫威或DC的角色(这里再插入几个Pig Pig Man中的角色):

INSERT INTO `characters` (`Character`, `Universe`, `Strength`, `Speed`, `Intelligence`, `SpecialAbilities`, `Weaknesses`, `BattleOutcome`) VALUES 
('Pig Woman', 'Pig Pig Man', 7, 8, 3, 'Telekinesis', 'Kryptonite', 0),  
('Super People Strang', 'Pig Pig Man', 4, 7, 9, 'Telekinesis', 'Kryptonite', 0),  
('Teacher MiHu', 'Pig Pig Man', 8, 7, 5, 'Telekinesis', 'Magic', 0),  
('GGBond', 'Pig Pig Man', 5, 6, 10, 'Telekinesis', 'Kryptonite', 0);
SELECT * FROM characters WHERE Universe IN ('Marvel', 'DC Comics');

在这里插入图片描述

IS NULLIS NOT NULL

插入含有NULL值的角色信息,随后查询字段不为NULL的角色:

INSERT INTO `characters` (`Character`, `Universe`, `Strength`, `Speed`, `Intelligence`, `SpecialAbilities`, `Weaknesses`, `BattleOutcome`) VALUES 
('Fei Fei', 'Pig Pig Man', NULL, 8, 3, 'Telekinesis', 'Kryptonite', 0),  
('Old Eight', 'Pig Pig Man', 4, 7, NULL, 'Telekinesis', 'Kryptonite', 0),  
('Doger', 'Pig Pig Man', NULL, 7, 5, 'Telekinesis', 'Magic', 0),  
('Hu Ge', 'Pig Pig Man', 5, NULL, 10, 'Telekinesis', 'Kryptonite', 0);

查询能力的三个数值字段中不存在NULL值的角色

SELECT * FROM `characters` WHERE `Strength` IS NOT NULL AND `Speed` IS NOT NULL AND `Intelligence` IS NOT NULL;

在这里插入图片描述

查询能力的三个数值字段存在NULL值的角色:

SELECT * FROM `characters` WHERE `Strength` IS NULL OR `Speed` IS NULL OR `Intelligence` IS NULL;

在这里插入图片描述

EXISTSNOT EXISTS

这是一个稍微复杂的操作符,需要有两个表格,先新建一个名为missions的表格,在里面记录角色的战斗任务:

SELECT `Character`, `Universe`  
FROM `characters` c  
WHERE EXISTS (  
    SELECT 1  
    FROM `missions` m  
    WHERE m.`Character` = c.`Character`  
);

给角色安排下任务:

CREATE TABLE IF NOT EXISTS missions (  
    `MissionID` INT AUTO_INCREMENT PRIMARY KEY,  
    `Character` VARCHAR(255),  
    `MissionName` VARCHAR(255),  
    `Success` BOOLEAN  
);  
  
INSERT INTO `missions` (`Character`, `MissionName`, `Success`) VALUES  
('Spider-Man', 'Save the PigWord', TRUE),  
('Batman', 'Love the Joker', TRUE),  
('Iron Man', 'Defend the Earth', TRUE),  
('Wonder Woman', 'Find the Lost Artifact', FALSE),  
('GGBond', 'Rescue the Piglets', TRUE);

使用EXISTS查询有任务的英雄:

SELECT `Character`, `Universe`  
FROM `characters` c  
WHERE EXISTS (  
    SELECT 1  
    FROM `missions` m  
    WHERE m.`Character` = c.`Character`  
);

在这里插入图片描述

使用NOT EXISTS查询没有任务的英雄:

SELECT `Character`, `Universe`  
FROM `characters` c  
WHERE NOT EXISTS (  
    SELECT 1  
    FROM `missions` m  
    WHERE m.`Character` = c.`Character`  
);

在这里插入图片描述

LIKE

查询名字以"G"开头的角色:

SELECT * FROM `characters` WHERE `Character` LIKE 'G%';

在这里插入图片描述

<> (或 !=)

查询力量值不等于7的角色:

SELECT * FROM characters WHERE Strength <> 7;  
-- 或者SELECT * FROM characters WHERE Strength != 7;

在这里插入图片描述

  • 32
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值