特殊形式的查詢:
1、 子查詢:SELECT 字段名稱,… FROM tb1_name WHERE col_name=(SELECT col_name FROM tb2_name);
——內層語句的查詢結果可以作爲外層語句的查詢條件
a) 由IN引發的子查詢
SELECT * FROM emp WHERE depId [NOT]IN (SELECT id FROM dep);
b) 由比較運算符引發的子查詢:SELECT 字段名稱,… FROM tb1_name WHERE col_name>=[<=…](SELECT col_name FROM tb2_name);
c) 由EXISTS引發的子查詢(內層查詢語句不返回記錄,而返回Boolean值):
SELECT 字段名稱,… FROM tb1_name WHERE EXISTS (SELECT col_name FROM tb2_name);——內層查詢語 句爲 真,則查詢外層語句,反之不查詢
SELECT * FROM emp WHERE EXISTS SELECT depName FROM dep WHERE id=10;
d) ANY SOME ALL的子查詢
運算符\關鍵字 | ANY | SOME | ALL |
>、>= | 最小值 | 最小值 | 最大值 |
<、<= | 最大值 | 最大值 | 最小值 |
= | 任意值 | 任意值 |
|
<>、!= |
|
| 任意值 |
Eg: SELECT * FROM stu WHERE score>= ANY(SELECT score FROM level);----大於等於內層查詢的最小值
SELECT * FROM stu WHEREscore>= ALL(SELECT score FROM level);----大於等於內層查詢的最大值
e) INSERT… SELECT:
INSERT user1(name) SELECT nameFROM user;
f) CREATE… SELECT:
CREATE TABLE user1(
id tinyint unsigned auto_increment key,
name varchar(20) unique
)engine=innodb charset=utf8 select id,name from emp;
g) INSERT tb_name SET col_name=(SELECT…);
INSERT user2 SET name=(SELECT name FROM user WHERE id=1);
2、 聯合查詢
a) UNION:會去掉表中的重複記錄
SELECT 字段名稱… FROM tb1_name
UNION
SELECT 字段名稱… FROM tb2_name;
b) UNION ALL:簡單的合併
SELECT 字段名稱… FROM tb1_name
UNION ON
SELECT 字段名稱… FROM tb2_name;
3、 自身連接查詢:無限級分類
//無限級分類表設計
CREATE TABLE cate(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
cateName VARCHAR(40) NOT NULL UNIQUE,
pId SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '父id'
)ENGINE=INNODB CHARSET=UTF8;
INSERT cate(cateName) VALUES('服裝'),
('數碼'),
('玩具');
INSERT cate(cateName, pId)VALUES('男裝',1),
('女裝',1),
('內衣',1);
INSERT cate(cateName, pId)VALUES('電視',2),
('冰箱',2),
('洗衣機',2);
INSERT cate(cateName, pId)VALUES('愛馬仕',3),
('LV',3),
('GUCCI',3);
INSERT cate(cateName, pId)VALUES('夾克',4),
('襯衫',4),
('褲子',4);
INSERT cate(cateName, pId) VALUES('液晶電視',10),
('等離子電視',10),
('背投電視',10);
//查詢各個分類的父分類
SELECT s.id, s.cateName ASsCateName, p.cateName AS pCateName FROM cate AS s
LEFT JOIN cate AS p
ON s.pId=p.id;
//查詢父分類下有哪些子分類
SELECT p.id, p.cateName AS pCateName, s.cateName AS sCateName FROM cate AS s
RIGHT JOIN cate AS p
ON s.pId=p.id;
//統計各分類下的條數
SELECT p.id, p.cateName AS pCateName, COUNT(s.cateName) FROM cate AS s
RIGHT JOIN cate AS p
ON s.pId=p.id
GROUP BY p.cateName
ORDER BY id;
//統計各分類下的條數,及顯示詳細信息
SELECT GROUP_CONCAT(s.id),GROUP_CONCAT(s.cateName) AS sCateNames, COUNT(s.cateName), p.cateName AS pCateName FROM cate AS s
LEFT JOIN cate AS p
ON s.pId=p.id
GROUP BY p.cateName;