05 -数据库查询
本文最后更新于11 天前,其中的信息可能已经过时,如有错误请留言

基础查询

单表简单查询

案例5.1查询指定字段

USE lib;
//在学生表(tb_student)表中,查询全部学生的姓名和专业,即显示 name 和 major 列的内容。
SELECT name, major FROM tb_student;
//在书目表(tb_bibliography)中,查询全部图书的图书名称和作者名,即显示 name 和 author 列的内容
SELECT name, author FROM tb_bibliography;

案例5.2 查询所有字段及理论点睛之投影运算

USE lib;
//查询学生表(tb_student)中的全部字段
SELECT stu_num, name, gender, birth, school, major FROM tb_student;
//查询书目表(tb_bibliography)中的全部字段
SELECT * FROM tb_bibliography;

案例5.13 模糊查询

SELECT 字段名 FROM 表名 WHERE 字段名 LIKE “% 或者_构成的模糊查询条件”;

USE lib;
SELECT name FROM tb_bibliography WHERE name LIKE "%计算%";
SELECT name, intro FROM tb_bibliography WHERE intro LIKE "%教材%";
SELECT name FROM tb_student WHERE name LIKE "马%";
SELECT name FROM tb_student WHERE name LIKE "马_";
SELECT name,intro FROM tb_bibliography
WHERE intro LIKE "%/90/%%" ESCAPE '/';
SELECT name,intro FROM tb_bibliography
WHERE intro LIKE "%学术研究/_个人阅读都非常适合%" ESCAPE '/';

表明在忽视第一次遇到/时后面的符号

利用函数查询

案例5.14 聚合函数的使用

-- 1. 切换到名为lib的数据库(后续操作都在该数据库中执行)
USE lib;

-- 2. 从书目表(tb_bibliography)中,查询图书价格(price)的最大值和最小值
SELECT MAX(price), MIN(price) FROM tb_bibliography;

-- 3. 从书目表(tb_bibliography)中,计算所有图书价格(price)的总和
SELECT SUM(price) FROM tb_bibliography;

-- 4. 从借阅表(tb_record)中,统计借阅记录的总条数(COUNT(*)会统计所有行,包括非空行)
SELECT COUNT(*) FROM tb_record;

-- 5. 从书目表(tb_bibliography)中,筛选出类型(category)为"TP"的图书,计算它们的平均价格
SELECT AVG(price) FROM tb_bibliography WHERE category='TP';

-- 6. 从书目表(tb_bibliography)中,统计含有图书简介(intro)的记录数(COUNT(intro)仅统计intro列非NULL的行)
SELECT COUNT(intro) FROM tb_bibliography;

案例5.15 数学函数的使用

Truncate 截断

ROUND(x, y) 是 数值四舍五入函数,用于将数值 x 按指定精度(保留 y 位小数)进行四舍五入,返回四舍五入后的数值结果

函数核心作用返回类型核心场景
ROUND(x,y)对数值四舍五入到指定精度数值型数值计算、统计结果处理
FORMAT(x,y)对数值 ** 格式化(含四舍五入)** 并转为字符串字符串型结果展示、可读性优化
-- 2. 使用ABS函数计算绝对值:ABS(正数)返回自身,ABS(负数)返回其正数形式
SELECT ABS(5), ABS(-5);  -- 结果:5, 5

-- 3. 使用FLOOR函数向下取整:取小于等于该数的最大整数
SELECT FLOOR(1.5), FLOOR(-1.5);  -- 结果:1, -2(1.5向下取整为1;-1.5向下取整为-2)

-- 4. 使用CEIL函数向上取整:取大于等于该数的最小整数
SELECT CEIL(1.5), CEIL(-1.5);  -- 结果:2, -1(1.5向上取整为2;-1.5向上取整为-1)

-- 5. 使用RAND函数生成0到1之间的随机浮点数(每次执行结果不同)
SELECT RAND();  -- 示例结果:0.723456(具体值随机)

-- 6. 使用TRUNCATE函数截断小数:保留指定小数位数,直接截断(不四舍五入)
SELECT TRUNCATE(3.1415926, 2);  -- 结果:3.14(保留2位小数,截断后的值)

-- 7. 使用SQRT函数计算平方根:返回非负数的平方根
SELECT SQRT(4), SQRT(5);  -- 结果:2, 2.2360679775(4的平方根是2;5的平方根是近似值)

-- 保留3位小数:3.1415926 四舍五入后为 3.142(第4位是5,进1)
SELECT FORMAT(3.1415926, 3);  
 -- ROUND:返回数值3.15,可直接用于后续计算
 ROUND(3141.59, 2) AS round_result,  
-- round_result: 3141.59(数值型,可做 3141.59 + 100 = 3241.59)

 -- FORMAT:返回字符串"3,141.59",带千位分隔符,仅用于展示
 FORMAT(3141.59, 2) AS format_result;  
-- format_result: "3,141.59"(字符串型,若做 "3,141.59" + 100 会报错)

案例5.16 字符串函数的使用

-- 切换到lib数据库
USE lib;

-- 1. UPPER:将字符串转为大写
SELECT UPPER('hello');  -- 结果:HELLO

-- 2. LOWER:将字符串转为小写
SELECT LOWER('HELLO');  -- 结果:hello

-- 3. LEFT:取字符串左侧的指定长度字符(取'hello'前3个字符)
SELECT LEFT('hello',3);  -- 结果:hel

-- 4. RIGHT:取字符串右侧的指定长度字符(取'hello'后3个字符)
SELECT RIGHT('hello',3);  -- 结果:llo

-- 5. SUBSTRING:截取字符串(参数:原字符串, 起始位置, 长度;从'hello'第2位开始取3个字符)
SELECT SUBSTRING('hello',2,3);  -- 结果:ell(注意:多数数据库中起始位置从1开始)

-- 6. LENGTH:计算字符串长度('hello'是5个字符;'你好'在部分数据库中占4字节,结果可能为4)
SELECT LENGTH('hello'), LENGTH('你好');  -- 结果:5, 4(不同数据库对中文字符的长度计算可能不同)

-- 7. INSTR:查找子串在原字符串中的首次出现位置(没找到返回0)
SELECT INSTR('hello','e'), INSTR('hello','T'), INSTR('hello','i');  
-- 结果:2('e'在第2位)、0('T'不存在)、0('i'不存在)

-- 8. LPAD:左填充字符串(将'world'填充到10位,不足部分用'hello'循环填充)
SELECT LPAD('world', 10, 'hello');  -- 结果:hello wor('world'长度5,补5位:取'hello'的前5位)

-- 9. INSERT:替换字符串(参数:原字符串, 起始位置, 替换长度, 新子串;在'hello'第2位开始,替换1个字符为'T')
SELECT INSERT('hello', 2, 1, 'T');  -- 结果:hTllo

案例5.17 日期和时间函数的使用

# 查询当前系统日期(CURDATE()和CURRENT_DATE()是等效函数)
SELECT CURDATE(), CURRENT_DATE(); 
结果示例:2025-11-25, 2025-11-25

# 查询当前系统时间(CURTIME()和CURRENT_TIME()是等效函数)
SELECT CURTIME(), CURRENT_TIME(); 
结果示例:15:30:45, 15:30:45

# 查询当前系统的日期+时间(NOW()返回当前完整的时间戳)
SELECT NOW();  
#结果示例:2025-11-25 15:30:45

# 从学生表(tb_student)中查询学生姓名,并计算学生年龄
#YEAR(NOW()):取当前年份;YEAR(birth):取学生出生日期的年份;两者相减得到年龄
SELECT name, YEAR(NOW())-YEAR(birth) FROM tb_student; 
#结果示例:"张三", 20

# 从借阅表(tb_record)中查询学生编号,并计算借阅时长(天数)
DATEDIFF(结束日期, 开始日期):返回两个日期之间的天数差(return_time是归还日期,borrow_time是借阅日期)
SELECT stu_num, DATEDIFF(return_time, borrow_time) FROM tb_record;
#结果示例:"2025001", 7

分组查询

案例5.18 单字段分组查询

连接查询

案例5.24 建立实例表

-- 创建t1表
CREATE TABLE t1 (
    id INT,
    name1 CHAR(5)
) CHARACTER SET UTF8MB4;

-- 创建t2表
CREATE TABLE t2 (
    id INT,
    name2 CHAR(5)
) CHARACTER SET UTF8MB4;

-- 向t1表插入数据
INSERT INTO t1 (id, name1) VALUES
(1, '张三'),
(2, '李四'),
(NULL, 't1');

-- 向t2表插入数据
INSERT INTO t2 (id, name2) VALUES
(1, '王五'),
(2, '赵六'),
(NULL, 't2');

案例5.25 等值与非等值连接

INNER JOIN(显式连接) 与逗号分隔 + WHERE(隐式连接)

# 第一问
-- 功能:查询t1表和t2表中id相等的记录(内连接),返回所有字段
SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.id;


# 第二问
-- 功能:从学生表(tb_student)和学生信息表(tb_inf_student)中,
-- 查询学生学号、姓名、爱好、籍贯(通过学号关联两张表)
SELECT t1.stu_num, t1.name, t2.hobby, t2.ori_loca 
FROM tb_student t1
INNER JOIN tb_inf_student t2 ON t1.stu_num = t2.stu_num;


# 第三问
-- 功能:从学生表(tb_student)和借阅记录表(tb_record)中,
-- 查询学生学号、姓名、借阅时间、归还时间(通过学号关联两张表)
SELECT t1.stu_num, t1.name, t2.borrow_time, t2.return_time 
FROM tb_student t1
INNER JOIN tb_record t2 ON t1.stu_num = t2.stu_num;


# 第四问
-- 功能:关联学生表、借阅记录表、图书表、书目表,
-- 查询学生学号、姓名、图书名称(通过学号、条形码、ISBN依次关联四张表)
SELECT t1.stu_num, t1.name, t4.name 
FROM tb_student t1
JOIN tb_record t2 ON t1.stu_num = t2.stu_num  -- 学生表关联借阅表(学号)
JOIN tb_book t3 ON t2.barcode = t3.barcode    -- 借阅表关联图书表(条形码)
JOIN tb_bibliography t4 ON t3.ISBN = t4.ISBN; -- 图书表关联书目表(ISBN)


# 第五问
-- 功能:与第四问结果一致(用“多表逗号分隔+WHERE条件”的方式实现关联),
-- 查询学生学号、姓名、图书名称
SELECT t1.stu_num, t1.name, t4.name 
FROM tb_student t1, tb_record t2, tb_book t3, tb_bibliography t4
WHERE t1.stu_num = t2.stu_num    -- 学生表关联借阅表
  AND t2.barcode = t3.barcode    -- 借阅表关联图书表
  AND t3.ISBN = t4.ISBN;         -- 图书表关联书目表

ON后面跟的是表关联条件,WHERE后面跟的是结果过滤条件

案例5.26 自然接

01 任务

  1. 查询书目表(tb_bibliography)中,和《管理信息系统实用教程 (第 2 版)》作者相同的书目的名称(name)和作者(author)
  2. 查询学生表(tb_student),显示每个学院(school)中年龄最小的学生的姓名(name)和出生日期(birth)

02 分析

  • 若某个表与自身进行连接,称为自表连接(或自身连接),简称自连接
  • 自连接本质上仍然是内连接,它是把一张表当成两张表来连接,从而得到需要的查询结果。
  • 使用自连接时,需要为表指定至少两个不同的别名;且对所有查询字段的引用,必须用表别名限定 —— 否则 SELECT 操作会因无法准确定位字段而失败
-- 切换到lib数据库(后续操作基于该库)
USE lib;


-- -------------- 第一条SQL:查询同作者的图书 --------------
-- 功能:找到与“管理信息系统实用教程(第2版)”同作者的所有图书(包含自身)
-- 逻辑:将书目表(tb_bibliography)自连接(自己和自己关联),通过作者字段匹配
SELECT 
  t2.name,   -- 图书名称
  t2.author  -- 图书作者
FROM tb_bibliography t1  -- 别名t1:作为“参照图书”的表
JOIN tb_bibliography t2  -- 别名t2:作为“匹配同作者”的表(自连接)
  ON t1.author = t2.author  -- 关联条件:t1和t2的作者相同
WHERE 
  t1.name = "管理信息系统实用教程(第2版)";  -- 过滤条件:参照图书是指定书名


-- -------------- 第二条SQL:查询各学校中出生日期最大的学生 --------------
-- 功能:找出每个学校里“出生日期最晚(年龄最小)”的学生的姓名和出生日期
-- 逻辑:先通过子查询获取每个学校的最大出生日期,再关联学生表匹配对应记录
SELECT 
  s1.name,   -- 学生姓名
  s1.birth   -- 学生出生日期
FROM tb_student s1,  -- 主表:学生表(别名s1)
-- 子查询s2:按学校分组,获取每个学校的最大出生日期
(SELECT 
  MAX(birth) AS max_birth,  -- 别名max_birth:每个学校的最大出生日期
  school                    -- 学校字段(分组依据)
 FROM tb_student 
 GROUP BY school) s2
WHERE 
  s1.birth = s2.max_birth  -- 匹配条件1:学生的出生日期等于该学校的最大出生日期
  AND s1.school = s2.school;  -- 匹配条件2:学生所属学校与子查询的学校一致

案例5.27 自然链接

01 任务

  1. 用自然连接显示图书表(tb_book)中每本书的索书号(barcode)ISBN 号(ISBN),以及书目表(tb_bibliography)的图书名称(name)和作者(author)
  2. 用自然连接显示每名学生的信息:学生表(tb_student)中的学号(stu_num)姓名(name),以及学生详细表(tb_inf_student)的爱好(hobby)和生源地(ori_loca)

02 分析

自然连接是自动使用表内相同字段作为连接条件的连接过程(所以两个表中应该有相同的元素),且会在查询结果集中去掉重复的属性;自然连接使用的关键字是NATURAL JOIN

-- -------------- 第一条SQL:关联图书表和书目表 --------------
-- 功能:查询图书的条形码、ISBN,以及对应书目的名称、作者
-- 逻辑:通过NATURAL JOIN(自然连接)关联tb_book和tb_bibliography
-- 自然连接的规则:自动匹配两张表中“名称相同的字段”作为关联条件
SELECT 
  t1.barcode,  -- 图书表的条形码
  t1.ISBN,     -- 图书表的ISBN
  t2.name,     -- 书目表的图书名称
  t2.author    -- 书目表的作者
FROM tb_book t1  -- 别名t1:图书表
NATURAL JOIN tb_bibliography t2;  -- 自然连接书目表(自动匹配同名字段,通常是ISBN)


-- -------------- 第二条SQL:关联学生表和学生信息表 --------------
-- 功能:查询学生的学号、姓名,以及对应的爱好、籍贯
-- 逻辑:通过NATURAL JOIN自然连接tb_student和tb_inf_student
-- 自然连接的规则:自动匹配两张表中“名称相同的字段”作为关联条件(通常是stu_num)
SELECT 
  t1.stu_num,  -- 学生表的学号
  t1.name,     -- 学生表的姓名
  t2.hobby,    -- 学生信息表的爱好
  t2.ori_loca  -- 学生信息表的籍贯
FROM tb_student t1  -- 别名t1:学生表
NATURAL JOIN tb_inf_student t2;  -- 自然连接学生信息表(自动匹配同名字段,通常是stu_num)

案例5.28 左外链接

-- 1. t1左连接t2(保留t1所有记录,匹配t2中id相等的记录)
SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id;


-- 2. 学生表左连接借阅表(保留所有学生,匹配其借阅记录)
SELECT * FROM tb_student t1
LEFT JOIN tb_record t2 ON t1.stu_num = t2.stu_num;

题目中最终结果保留了t1表的所有记录(包括id=NULLt1行),同时匹配t2表中id相等的记录(t2中无匹配的部分显示为NULL 这正是 **LEFT JOIN(左连接)的特性:

案例5.29 右外链接

-- 1. t1右连接t2:保留t2所有记录,匹配t1中id相等的记录(t1无匹配则补NULL)
SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id;


-- 2. 借阅表(tb_record)右连接学生表(tb_student):保留所有学生,匹配其借阅记录(无借阅则补NULL)
SELECT * FROM tb_record t2 RIGHT JOIN tb_student t1 ON t1.stu_num = t2.stu_num;

案例5.30 交叉链接

-- 1. t1和t2交叉连接:返回t1和t2的所有行的笛卡尔积(即两表行数的乘积)
SELECT * FROM t1 CROSS JOIN t2;


-- 2. 学生表和学生信息表交叉连接:返回两表所有行的组合,查询学生学号、姓名及信息表的爱好、籍贯
SELECT t1.stu_num,t1.name,t2.hobby,t2.ori_loca 
FROM tb_student t1
CROSS JOIN tb_inf_student t2;

嵌套查询

案例5.31 标量子查询

-- 1. 根据图书条形码查图书的名称和作者
SELECT name, author FROM tb_bibliography  -- 从书目表tb_bibliography取书名、作者
WHERE ISBN=(  -- 条件:ISBN等于子查询结果
    SELECT ISBN FROM tb_book  -- 子查询:从图书表tb_book查条形码对应的ISBN
    WHERE barcode="TP311.13"  -- 筛选条件:条形码是TP311.13
);

-- 2. 根据学生姓名查该学生的借阅记录
SELECT stu_num, barcode FROM tb_record  -- 从借阅记录表tb_record取学号、图书条形码
WHERE stu_num =(  -- 条件:学号等于子查询结果
    SELECT stu_num FROM tb_student  -- 子查询:从学生表tb_student查姓名对应的学号
    WHERE name="邓承明"  -- 筛选条件:学生姓名是邓承明
);

查询后面加了一个条件嘛,怎么就成子查询了:确实看起来像 “加了个条件”,但核心区别在于:这个条件的值不是直接写死的,而是通过另一个 SELECT 语句动态查出来的—— 这种 “嵌套在主查询里的 SELECT 语句” 就叫子查询(也叫嵌套查询)。

案例5.32 列子查询(IN关键词)

-- 1. 查询和“黄弘”同专业的学生信息
SELECT stu_num, name, major FROM tb_student  -- 从学生表取学号、姓名、专业
WHERE major IN (  -- 条件:专业属于子查询的结果(IN用于匹配多个值)
    SELECT major FROM tb_student  -- 子查询:先查“黄弘”对应的专业
    WHERE name='黄弘'  -- 筛选条件:学生姓名是“黄弘”
);

-- 2. 查询有未归还图书的学生学号和姓名
SELECT stu_num, name FROM tb_student  -- 从学生表取学号、姓名
WHERE stu_num IN (  -- 条件:学号属于子查询的结果
    SELECT stu_num FROM tb_record  -- 子查询:从借阅表查“未归还”对应的学号
    WHERE return_time IS NULL  -- 筛选条件:归还时间为空(代表未归还)
);
  • 标量子查询:只能返回单个值(一行一列),所以用 = 匹配;
  • 你现在用的 IN 子查询:能返回多个值(一列多行),所以用 IN 匹配这些值
    • 比如查 “黄弘” 的专业,子查询只返回 “计算机” 一个值(标量),可以用 =;但如果查 “所有未归还图书的学号”,子查询可能返回 1001、1002、1003 多个值,就得用 IN 来匹配

案例5.33 列子查询(ALL和AND关键词)

USE lib;  -- 切换到lib数据库

# 1. 显示信息学院学生,按出生日期升序排列
SELECT birth, school FROM tb_student  
WHERE school="信息学院"  -- 筛选“信息学院”的学生
ORDER BY birth ASC;  -- 按出生日期(birth)从小到大排序(ASC是升序,可省略)


# 2. 查出生日期比“信息学院最大出生日期”还大的学生
SELECT name, birth, school FROM tb_student  
WHERE birth >ALL(  -- >ALL:大于子查询结果里的“所有值”(即大于最大的那个)
    SELECT birth FROM tb_student WHERE school = "信息学院"  -- 子查询:取信息学院所有学生的出生日期
);


# 3. 查出生日期比“信息学院最小出生日期”还小的学生
SELECT name, birth, school FROM tb_student  
WHERE birth <ALL(  -- <ALL:小于子查询结果里的“所有值”(即小于最小的那个)
    SELECT birth FROM tb_student WHERE school = "信息学院"
);


# 4. 查出生日期比“信息学院最小出生日期”还大的学生
SELECT name, birth, school FROM tb_student  
WHERE birth >ANY(  -- >ANY:大于子查询结果里的“任意一个值”(即大于最小的那个)
    SELECT birth FROM tb_student WHERE school = "信息学院"
);


# 5. 查出生日期比“信息学院最大出生日期”还小的学生
SELECT name, birth, school FROM tb_student  
WHERE birth <ANY(  -- <ANY:小于子查询结果里的“任意一个值”(即小于最大的那个)
    SELECT birth FROM tb_student WHERE school = "信息学院"
);

关键字含义(搭配比较运算符)等价逻辑(以>为例)例子对应效果
>ALL大于子查询结果的所有值大于子查询结果的最大值出生日期比信息学院所有学生都晚
<ALL小于子查询结果的所有值小于子查询结果的最小值出生日期比信息学院所有学生都早
>ANY大于子查询结果的任意一个值大于子查询结果的最小值出生日期比信息学院至少一个学生晚
<ANY小于子查询结果的任意一个值小于子查询结果的最大值出生日期比信息学院至少一个学生早

案例5.34 列子查询(ANY关键词)

-- 从tb_bibliography表中查询“名称(name)”和“价格(price)”
SELECT name, price FROM tb_bibliography
-- 筛选条件:价格等于“各分类下的最高价格”中的任意一个
WHERE price=ANY(
    -- 子查询:按category(分类)分组,计算每个分类下的最高价格
    SELECT MAX(price) FROM tb_bibliography
    GROUP BY category
);

但上述代码有一个问题:这时候用之前的 SQL 查询 “各分类最高价的书籍”,会把 “不是本类最高价、但刚好等于其他类最高价” 的书也查出来,外层查询的条件只是price等于这个列表里的任意一个值完全没关联 “当前行属于哪个分类”

解决方案是使用行子查询

案例5.35 行子查询

-- 第一个查询:根据书籍名称,找“同一作者+同一分类”的所有书籍
SELECT name, author, category FROM tb_bibliography
WHERE (author, category) = (  -- 条件:作者和分类 同时等于子查询的结果
    -- 子查询:先找到“管理信息系统实用教程(第3版)”对应的作者和分类
    SELECT author, category FROM tb_bibliography
    WHERE name="管理信息系统实用教程(第3版)"
);

-- 第二个查询:根据学生姓名,找“学号前2位相同+同一学院”的所有学生
SELECT stu_num, name, school FROM tb_student
WHERE (LEFT(stu_num,2), school) = (  -- 条件:学号前2位 + 学院 同时等于子查询的结果
    -- 子查询:先找到“邹睿睿”对应的学号前2位和学院
    SELECT LEFT(stu_num,2), school  -- LEFT(stu_num,2):取学号的前2个字符
    FROM tb_student WHERE name='邹睿睿'
);
特点列子查询行子查询
返回结果单列(1 列,可多行 / 单行)多列(多列,仅单行,是 “一行数据”)
匹配方式单个字段匹配(比如只比价格)多个字段组合匹配(比如同时比作者 + 分类)
语法特征=/IN等匹配单个列(字段1,字段2)匹配一组列

案例5.36 表子查询

-- 最终查询:获取ISBN、书籍名称,以及对应的记录数量
SELECT ISBN, name, COUNT(*)
-- 从“子查询生成的临时表tb”中查询数据
FROM(
    -- 子查询:先关联tb_book和tb_bibliography表,筛选状态为1的记录
    SELECT b.ISBN, name  -- 从关联结果中取ISBN和书籍名称
    FROM tb_book b  -- 别名b代表tb_book表(书籍表)
    -- 左连接tb_bibliography表(书目信息表),关联条件是ISBN一致
    LEFT JOIN tb_bibliography bi ON b.ISBN=bi.ISBN
    WHERE status='1'  -- 筛选条件:书籍状态为1(通常代表“可用”等含义)
) AS tb  -- 将子查询结果命名为临时表tb
GROUP BY ISBN;  -- 按ISBN分组,统计每个ISBN对应的记录数

— ON 用来指定两张表连接的“匹配条件”(这里是通过ISBN字段关联) LEFT JOIN tb_bibliography bi ON b.ISBN=bi.ISBN

因为要根据图书的借阅状态,将图书对应的ISBN和书的名字显示出来,但是无法从书目表中直接获得该结果,因为只有图书表才有借阅状态,因此需要左连接,完全保留状态信息

案例5.37 EXISTS子查询及嵌套查询总结

-- 1. 检查tb_student表中是否存在名为“黄弘”的学生
-- EXISTS会返回1(存在)或0(不存在)
SELECT EXISTS(SELECT name FROM tb_student WHERE name='黄弘');


-- 2. 从tb_bibliography表中查询“在tb_book表中没有对应ISBN”的书籍名称
-- NOT EXISTS表示“子查询无结果时才满足条件”
SELECT name FROM tb_bibliography
WHERE NOT EXISTS(
    -- 子查询:检查tb_book中是否有相同ISBN的记录
    SELECT ISBN FROM tb_book
    WHERE tb_book.ISBN=tb_bibliography.ISBN
);
学习笔记如有侵权,请提醒我,我会马上删除
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇