今日內(nèi)容
1.多表查詢
2.事務(wù)
3.DCL
多表查詢:
- 查詢語(yǔ)法:
select
列名列表
from
表名列表
where....
-
數(shù)據(jù)準(zhǔn)備(數(shù)據(jù)庫(kù)表以及數(shù)據(jù)的創(chuàng)建):
# 新增數(shù)據(jù) INSERT INTO dept (NAME) VALUES('開(kāi)發(fā)部'),('市場(chǎng)部'),('財(cái)務(wù)部'); # 創(chuàng)建員工表 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) -- 外鍵 ); # 新增數(shù)據(jù) INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孫悟空','男',7200,'2014-02-24',1); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('豬八戒','男',4200,'2015-03-15',2); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('沙師弟','男',3600,'2013-02-24',2); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2013-02-24',2); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','男',5400,'2018-08-08',3); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','男',6100,'2019-01-01',1);
-
笛卡爾積
- 有兩個(gè)集合a,b,取這兩個(gè)集合的所以組成情況
- 要完成多表查詢,需要消除無(wú)用的數(shù)據(jù)
-
多表查詢分類
1.內(nèi)鏈接查詢:
(1)隱式內(nèi)鏈接:使用where條件,消除無(wú)用的數(shù)據(jù)。- 例子:
-- 查詢員工表的名稱,性別。部門表的名稱
-- 正規(guī)寫法 方便添加注釋(符合企業(yè)sql規(guī)范)
SELECT
t1.name, -- 員工表的姓名
t1.gender, -- 員工表的性別
t2.name -- 部門表的名稱
FROM
emp t1,
dept t2
WHERE
t1.dept_id=t2.id;
(2)顯式內(nèi)鏈接
- 語(yǔ)法:
select 字段列表 from 表明 inner join 表明2 on 條件 - 例如:
-- 查詢員工表的名稱,性別。部門表的名稱(使用顯式內(nèi)鏈接)
SELECT * FROM emp [INNER] JOIN dept ON emp.dept_id = dept.id;
-- INNER 是可選操作,可以直接使用 JOIN ON 如下:
SELECT * FROM emp JOIN dept ON emp.dept_id = dept.id;
(3)內(nèi)鏈接查詢注意事項(xiàng):
- 從哪些表中查詢數(shù)據(jù)
- 條件是什么?
- 查詢哪些字段?
2.外鏈接查詢:
(1)左外連接:
- 語(yǔ)法:
select 字段列表 from 表1 left [outer] join 表2 on 條件 -
查詢的是左表所有數(shù)據(jù)以及其交集部分。
左外連接,圖片來(lái)自互聯(lián)網(wǎng)
-- 左外連接 (LEFT JOIN ON)
SELECT
t1.*,
t2.name
FROM
emp t1
LEFT JOIN
dept t2
ON
t1.dept_id = t2.id;
(2)右外連接:
- 語(yǔ)法:
select 字段列表 from 表1 right [outer] join 表2 on 條件 -
查詢的是右表所有數(shù)據(jù)以及其交集部分。
右外連接,圖片來(lái)自互聯(lián)網(wǎng)
-- 右外連接 (RIGHT JOIN ON)
SELECT
t1.*,
t2.name
FROM
dept t2
RIGHT JOIN
emp t1
ON
t1.dept_id = t2.id;
3.子查詢:
- 概念:查詢中嵌套查詢,稱嵌套查詢?yōu)樽硬樵儭?/li>
-- 子查詢
-- 查詢工資最高的員工的信息
-- 1、查詢最高的工資是多少?
SELECT MAX(salary) FROM emp;
-- 查詢的結(jié)果是 9000
-- 2.查詢員工信息,并且工資等于最高的
SELECT * FROM emp WHERE emp.salary=9000;
-- 一條SQL就能完成
SELECT * FROM emp WHERE emp.salary=(
SELECT MAX(salary) FROM emp
);
- 子查詢的不同情況
1、子查詢的結(jié)果是單行單列的:- 子查詢可以作為條件,使用運(yùn)算符(
>、<、>=、<=、=)去判斷。
- 子查詢可以作為條件,使用運(yùn)算符(
-- 查詢員工工資小于平均工資的人
SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);
2、子查詢的結(jié)果是多行單列的:
- 可以使用運(yùn)算符
IN來(lái)判斷
-- 查詢‘財(cái)務(wù)部’和'市場(chǎng)部'所有的員工信息
-- 1、先查詢財(cái)務(wù)部的id
SELECT id FROM dept WHERE name='財(cái)務(wù)部' OR name='市場(chǎng)部';
-- 2、再根據(jù)ID查詢信息
SELECT * FROM emp WHERE dept_id = 3 OR dept_id=2;
-- 其中第二條語(yǔ)句可以改寫成如下:(相當(dāng)與上面這條 )
SELECT * FROM emp WHERE dept_id IN(3,2);
-- 子查詢
SELECT * FROM emp WHERE dept_id IN(SELECT id FROM dept WHERE name='財(cái)務(wù)部' OR name='市場(chǎng)部');
3、子查詢的結(jié)果是多行多列的:
- 子查詢可以作為一張?zhí)摂M表來(lái)進(jìn)行查詢
-- 多行多列
-- 例:查詢員工入職日期是2015年-11-11之后的員工信息和部門信息(子查詢)
-- 括號(hào)里的叫做虛擬表
SELECT * FROM dept t1,(SELECT * FROM emp WHERE emp.join_date > '2015-11-11') t2
WHERE t1.id = t2.dept_id;
-- 例:查詢員工入職日期是2015年-11-11之后的員工信息和部門信息(普通內(nèi)鏈接查詢)
SELECT * FROM emp t1, dept t2
WHERE t1.dept_id = t2.id AND t1.join_date > '2015-11-11';

