目錄
- 子查詢
- 標量子查詢
- 數據準備
子查詢
SQL語句中嵌套select語句,稱為嵌套查詢,又稱子查詢。
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 ... );
子查詢外部的語句可以是insert / update / delete / select 的任何一個,最常見的是 select。
根據子查詢結果的不同分為:
-
標量子查詢(子查詢結果為單個值[一行一列])
-
列子查詢(子查詢結果為一列,但可以是多行)
-
行子查詢(子查詢結果為一行,但可以是多列)
-
表子查詢(子查詢結果為多行多列[相當于子查詢結果是一張表])
子查詢可以書寫的位置:
- where之后
- from之后
- select之后
標量子查詢
子查詢返回的結果是單個值(數字、字符串、日期等),最簡單的形式,這種子查詢稱為標量子查詢。
常用的操作符: = <> > >= < <=
案例1:查詢"教研部"的所有員工信息
可以將需求分解為兩步:
- 查詢 “教研部” 部門ID
- 根據 “教研部” 部門ID,查詢員工信息
-- 1.查詢"教研部"部門ID
select id from tb_dept where name = '教研部'; #查詢結果:2
-- 2.根據"教研部"部門ID, 查詢員工信息
select * from tb_emp where dept_id = 2;-- 合并出上兩條SQL語句
select * from tb_emp where dept_id = (select id from tb_dept where name = '教研部');
案例2:查詢在 “方東白” 入職之后的員工信息
可以將需求分解為兩步:
- 查詢 方東白 的入職日期
- 查詢 指定入職日期之后入職的員工信息
-- 1.查詢"方東白"的入職日期
select entrydate from tb_emp where name = '方東白'; #查詢結果:2012-11-01
-- 2.查詢指定入職日期之后入職的員工信息
select * from tb_emp where entrydate > '2012-11-01';-- 合并以上兩條SQL語句
select * from tb_emp where entrydate > (select entrydate from tb_emp where name = '方東白');
數據準備
-- 部門表
create table tb_dept
(id int unsigned primary key auto_increment comment '主鍵ID',name varchar(10) not null unique comment '部門名稱',create_time datetime not null comment '創建時間',update_time datetime not null comment '修改時間'
) comment '部門表';
-- 部門表測試
insert into tb_dept (id, name, create_time, update_time)
values (1, '學工部', now(), now()),(2, '教研部', now(), now()),(3, '咨詢部', now(), now()),(4, '就業部', now(), now()),(5, '人事部', now(), now());-- 員工表
create table tb_emp
(id int unsigned primary key auto_increment comment 'ID',username varchar(20) not null unique comment '用戶名',password varchar(32) default '123456' comment '密碼',name varchar(10) not null comment '姓名',gender tinyint unsigned not null comment '性別, 說明: 1 男, 2 女',image varchar(300) comment '圖像',job tinyint unsigned comment '職位, 說明: 1 班主任,2 講師, 3 學工主管, 4 教研主管, 5 咨詢師',entrydate date comment '入職時間',dept_id int unsigned comment '部門ID',create_time datetime not null comment '創建時間',update_time datetime not null comment '修改時間'
) comment '員工表';
-- 員工表測試數據
INSERT INTO tb_emp(id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time)
VALUES(1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),(2,'zhangwuji','123456','張無忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),(3,'yangxiao','123456','楊逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),(4,'weiyixiao','123456','韋一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),(5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),(6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),(7,'jixiaofu','123456','紀曉芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),(8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),(9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),(10,'zhaomin','123456','趙敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),(11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,now(),now()),(12,'hebiweng','123456','鶴筆翁',1,'12.jpg',5,'2008-08-18',3,now(),now()),(13,'fangdongbai','123456','方東白',1,'13.jpg',5,'2012-11-01',3,now(),now()),(14,'zhangsanfeng','123456','張三豐',1,'14.jpg',2,'2002-08-01',2,now(),now()),(15,'yulianzhou','123456','俞蓮舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),(16,'songyuanqiao','123456','宋遠橋',1,'16.jpg',2,'2007-01-01',2,now(),now()),(17,'chenyouliang','123456','陳友諒',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());