MySQL总结4_多表查询
生活随笔
收集整理的這篇文章主要介紹了
MySQL总结4_多表查询
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
MySQL總結4_多表查詢
一、多表查詢
語法:
select列名列表 from表名列表 where....案例
# 創建部門表 CREATE TABLE dept(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20) ); INSERT INTO dept (NAME) VALUES ('開發部'),('市場部'),('財務部'); # 創建員工表 CREATE TABLE emp (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(10),gender CHAR(1), -- 性別salary DOUBLE, -- 工資join_date DATE, -- 入職日期dept_id INT,FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外鍵,關聯部門表(部門表的主鍵) ); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孫悟空','男',7200,'2013-02-24',1); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('豬八戒','男',3600,'2010-12-02',2); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);笛卡爾積
二、分類
2.1 內連接查詢
隱式內連接:使用where條件消除無用數據。
示例:
-- 查詢所有員工信息和對應的部門信息SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`;-- 查詢員工表的名稱,性別。部門表的名稱SELECT emp.name 姓名,gender 性別,dept.name 部門 FROM emp,dept WHERE emp.`dept_id` = dept.`id`; -- 標準寫法 SELECT t1.name, -- 員工表的姓名t1.gender, -- 員工表的性別t2.name -- 部門表的名稱 FROMemp t1,dept t2 WHEREt1.`dept_id`= t2.`id`;顯式內連接:
語法:
語法: select 字段列表 from 表名1 [inner] join 表名2 on 條件 -- inner可省略示例
SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`; -- 省略inner的寫法 SELECT * FROM emp JOIN dept ON emp.`dept_id` = dept.`id`;注意事項
- 從哪些表中查詢數據
- 條件是什么
- 查詢哪些字段
2.2 外連接查詢
左外連接:
語法:
select 字段列表 from 表1 left [outer] join 表2 on 條件;注意:查詢的是左表所有數據以及其交集部分。
示例:
SELECT t1.*,t2.`name` FROM emp t1 LEFT JOIN dept t2 ON t1.`dept_id` = t2.`id`;右外連接
語法:
select 字段列表 from 表1 right [outer] join 表2 on 條件;注意:查詢的是右表所有數據以及其交集部分。
示例:
SELECT t1.*,t2.`NAME` FROM dept t2 RIGHT JOIN emp t1 ON t1.`dept_id`= t2.`id`;2.3 子查詢
概念:查詢中嵌套查詢,稱嵌套查詢為子查詢。
示例:
-- 1 查詢最高的工資是多少 9000 SELECT MAX(salary) FROM emp;-- 2 查詢員工信息,并且工資等于9000的 SELECT * FROM emp WHERE emp.`salary` = 9000;-- 一條sql就完成這個操作。子查詢 SELECT * FROM emp WHERE emp.`salary` = (SELECT MAX(salary) FROM emp);子查詢不同情況
子查詢的結果是單行單列的:
-
子查詢可以作為條件,使用運算符去判斷。 運算符: > >= < <= =
示例:
-- 查詢員工工資小于平均工資的人 SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);
子查詢的結果是多行單列的:
-
子查詢可以作為條件,使用運算符in來判斷
示例:
-- 查詢'財務部'和'市場部'所有的員工信息 SELECT id FROM dept WHERE NAME = '財務部' OR NAME = '市場部'; SELECT * FROM emp WHERE dept_id = 3 OR dept_id = 2; -- 子查詢 SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = '財務部' OR NAME = '市場部');
子查詢的結果是多行多列的:
-
子查詢可以作為一張虛擬表參與查詢
示例:
-- 查詢員工入職日期是2011-11-11日之后的員工信息和部門信息 -- 子查詢 SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.`join_date` > '2011-11-11') t2 WHERE t1.id = t2.dept_id;-- 普通內連接 SELECT * FROM emp t1,dept t2 WHERE t1.`dept_id` = t2.`id` AND t1.`join_date` > '2011-11-11';
總結
以上是生活随笔為你收集整理的MySQL总结4_多表查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12、OpenCV Python 图像梯
- 下一篇: Thread类中的join方法