From ecbe5c9ec55ef2a9fa8b3c54cc590cba63195e2b Mon Sep 17 00:00:00 2001 From: expressgy Date: Sun, 31 Mar 2024 00:58:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=A6=E4=B9=A0mysql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/MySQL/mysql是怎样使用的.md | 57 +++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/docs/MySQL/mysql是怎样使用的.md b/docs/MySQL/mysql是怎样使用的.md index d4fd3f1..6a36156 100644 --- a/docs/MySQL/mysql是怎样使用的.md +++ b/docs/MySQL/mysql是怎样使用的.md @@ -993,15 +993,72 @@ SELECT CONCAT('学科:', subject), COUNT(student_score.number) AS 人数 FROM st ## 11.2 标量子查询 - 标量子查询代表的仅仅是一个值 +- 子查询必须用括号括起来 +```sql +-- 标量子查询 查名字叫狗哥的人的所有学科成绩 +SELECT * FROM student_score WHERE number = (SELECT number FROM student_info WHERE name = '狗哥'); + +-- 查比狗哥学号大的所有人的信息 +SELECT * FROM student_info WHERE number > (SELECT number FROM student_info WHERE name = '狗哥'); +``` + +## 11.3 列子查询 + +```sql +-- 列子查询 查计算机科学与工程的学生的成绩 +SELECT * FROM student_score WHERE number IN (SELECT number FROM student_info WHERE major = '计算机科学与工程'); +``` + +## 11.4 行子查询 + +- 加入不知道子查询会出现几条记录,加上`LIMIT 1`吧 +- 两边均要用括号 + +```sql +SELECT * FROM student_score WHERE (number, subject) = (SELECT number, 'MySQL是怎样运行的' FROM student_info LIMIT 1); +``` +## 11.5 表子查询 (多行多列) +```sql +-- 此版本的MySQL还不支持“LIMIT&IN/ALL/AANY/SOME子查询” MYSQL8.3 +SELECT * FROM student_score WHERE (number, subject) IN (SELECT number, 'MySQL是怎样运行的' FROM student_info WHERE major = '计算机科学与工程'); +``` +## 11.6 `EXISTS` 和 `NOT EXISTS`子查询 +```sql +-- 如果存在记录就查 +SELECT * FROM student_info WHERE EXISTS(SELECT * FROM student_info WHERE number = 10086); +-- 如果不存在记录就查 +SELECT * FROM student_info WHERE NOT EXISTS(SELECT * FROM student_info WHERE number = 10086); +-- 相等 +SELECT * FROM student_info WHERE (SELECT COUNT(*) FROM student_info WHERE number != 10086) > 1; +``` +## 11.7 不相关子查询和相关子查询 +- 像上面的,外层查询和子查询不想管,独立运行叫做不相关查询 +- 相关查询是,外层查询的值需要被子查询应用,外层查询每查到一行,再拿行数据和子查询进行匹配 +```sql +-- 相关子查询 查存在成绩的学生信息 +SELECT * FROM student_info a WHERE EXISTS(SELECT number FROM student_score b WHERE a.number = b.number); +-- 显然这个效率很低 +SELECT * FROM student_info a WHERE number = IF((SELECT COUNT(number) FROM student_score b WHERE a.number = b.number) > 0, a.number, NULL); +``` + +## 11.8 对同一个表的子查询 + +```sql +-- 查大于平均分的成绩 +SELECT * FROM student_score WHERE score > (SELECT AVG(score) FROM student_score); +-- 查和狗哥一个学院的人 +SELECT * FROM student_info WHERE department = (SELECT department FROM student_info WHERE name = '狗哥'); +``` +# 第十二章 连接查询