逻辑运算符在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或不为NULL | SELECT * 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 Name | Type |
---|---|
product_id | int |
low_fats | enum |
recyclable | enum |
product_id 是该表的主键(具有唯一值的列)。
low_fats 是枚举类型,取值为以下两种 (‘Y’, ‘N’),其中 ‘Y’ 表示该产品是低脂产品,‘N’ 表示不是低脂产品。
recyclable 是枚举类型,取值为以下两种 (‘Y’, ‘N’),其中 ‘Y’ 表示该产品可回收,而 ‘N’ 表示不可回收。
编写解决方案找出既是低脂又是可回收的产品编号。
返回结果 无顺序要求 。
返回结果格式如下例所示:
示例 1:
输入:
Products 表:
product_id | low_fats | recyclable |
---|---|---|
0 | Y | N |
1 | Y | Y |
2 | N | Y |
3 | Y | Y |
4 | N | N |
输出:
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');
我的解题方法是在使用了SELECT
、FROM
、WHERE
的基础上,使用AND
逻辑操作符来确保两个条件(低脂和可回收)同时得到满足。
SELECT product_id
FROM Products
WHERE low_fats = 'Y' AND recyclable = 'Y';
运行结果如下,我的应该是最常见的解法
OR(||)
这个也是力扣的题库。
原题链接:高频SQL50题:584
表: Customer
Column Name | Type |
---|---|
id | int |
name | varchar |
referee_id | int |
在 SQL 中,id 是该表的主键列。
该表的每一行表示一个客户的 id、姓名以及推荐他们的客户的 id。
找出那些 没有被 id = 2 的客户 推荐 的客户的姓名。
以 任意顺序 返回结果表。
结果格式如下所示。
示例 1:
输入:
Customer 表:
id | name | referee_id |
---|---|---|
1 | Will | null |
2 | Jane | null |
3 | Alex | 2 |
4 | Bill | null |
5 | Zack | 1 |
6 | Mark | 2 |
输出:
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 NULL
和IS 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;
EXISTS
和NOT 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;