MySQL多表查詢---Java學(xué)習(xí)之?dāng)?shù)據(jù)庫(kù)

/*
-- 創(chuàng)建部門表
create table tb_dept(
id int primary key auto_increment,
name varchar(20)
);

insert into tb_dept (name) values ('開(kāi)發(fā)部'),('市場(chǎng)部'),('財(cái)務(wù)部');
--創(chuàng)建員工表
create table tb_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 tb_dept(id) -- 外鍵诈嘿,關(guān)聯(lián)部門表(部門表的主鍵)
);

insert into tb_emp(name,gender,salary,join_date,dept_id) values('孫悟空','男',7200,'2013-02-24',1);
insert into tb_emp(name,gender,salary,join_date,dept_id) values('豬八戒','男',3600,'2010-12-02',2);
insert into tb_emp(name,gender,salary,join_date,dept_id) values('唐僧','男',9000,'2008-08-08',2);
insert into tb_emp(name,gender,salary,join_date,dept_id) values('白骨精','女',5000,'2015-10-07',3);
insert into tb_emp(name,gender,salary,join_date,dept_id) values('蜘蛛精','女',4500,'2011-03-14',1);

*/

###############################多表查詢的操作########################

1.多表查詢的經(jīng)典問(wèn)題:笛卡兒積現(xiàn)象

CREATE DATABASE dlei;
直接進(jìn)行兩張表的相乘組合窃肠。
就是笛卡爾積現(xiàn)象,應(yīng)該被避免西疤,因?yàn)樗泻芏鄶?shù)據(jù)是無(wú)效的
SELECT * FROM tb_emp , tb_dept;

2.內(nèi)連接可以解決笛卡爾積現(xiàn)象迈倍,得到準(zhǔn)確的有效的結(jié)果數(shù)據(jù)
內(nèi)連接分為:顯示內(nèi)連接迎变,隱式內(nèi)鏈接蟆技,功能是一樣的熊楼,只是寫法不同而已。

a.隱式內(nèi)連接

SELECT * FROM tb_emp e , tb_dept d WHERE e.dept_id = d.id;

b.顯示內(nèi)連接 INNER JOIN ... ON 連表的條件觉啊。

SELECT * FROM tb_emp e INNER JOIN tb_dept d ON e.dept_id = d.id;

INNER可以省略不寫(這種可以采用)

SELECT * FROM tb_emp e JOIN tb_dept d ON e.dept_id = d.id;

1.查詢出唐僧的部門名稱

SELECT d.name 部門名稱 , e.name員工名稱
FROM tb_emp e JOIN tb_dept d ON e.dept_id= d.id WHERE e.name = '唐僧';

#######################外連接的操作###################################

外連接:分為左外連接(左連接)拣宏,右外連接(右連接)

1.左連接:在內(nèi)連接的基礎(chǔ)之上,保全左表的全部數(shù)據(jù),右表沒(méi)有對(duì)應(yīng)的數(shù)據(jù)默認(rèn)為null
格式:LEFT OUTER JOIN 右表 ON 左表外鍵=右表主鍵
OUTER可以省略不寫
SELECT * FROM tb_emp e LEFT JOIN tb_dept d ON e.dept_id= d.id;

2.右連接:在內(nèi)連接的基礎(chǔ)之上杠人,保全右表的全部數(shù)據(jù),左表沒(méi)有對(duì)應(yīng)的數(shù)據(jù)默認(rèn)為null
格式:RIGHT OUTER JOIN 右表 ON 左表外鍵=右表主鍵
OUTER可以省略不寫
SELECT * FROM tb_emp e RIGHT JOIN tb_dept d ON e.dept_id= d.id;

在內(nèi)鏈接的基礎(chǔ)上保留左右表的全部數(shù)據(jù)

SELECT * FROM tb_emp e LEFT JOIN tb_dept d ON e.dept_id = d.id
UNION
SELECT * FROM tb_emp e RIGHT JOIN tb_dept d ON e.dept_id = d.id

############################子查詢的操作####################################

子查詢:是多表查詢方案中的一種(表連接勋乾,子查詢)

子查詢的含義是:一條SQL語(yǔ)句中又包含了一條select語(yǔ)句。
1.需求:查詢出工資最高的那個(gè)人的名字嗡善。
a.查詢出最高工資
SELECT MAX(salary) FROM tb_emp ;
b.查詢出最高工資的那個(gè)人的名字(以下SQL語(yǔ)句就是子查詢)
第一種情況:子查詢的結(jié)果是單列情況辑莫,只能用=這樣的判斷(有一個(gè)值)
SELECT NAME FROM tb_emp WHERE salary = (SELECT MAX(salary) FROM tb_emp)
--查詢工資小于平均工資的員工有哪些?
SELECT * FROM tb_emp WHERE salary < (SELECT AVG(salary) FROM tb_emp )

第二種情況:子查詢的結(jié)果是多行單列數(shù)據(jù)(有多個(gè)值):必須用IN來(lái)實(shí)現(xiàn)判斷

SELECT 查詢字段 FROM 表 WHERE 字段 IN (子查詢);
2.需求:查詢工資大于4000的員工罩引,來(lái)自于哪些部門的名字
a.查詢工資大于4000的員工的部門編號(hào)
SELECT dept_id FROM tb_emp WHERE salary > 4000;
b.再查詢出他們所屬的部門信息
SELECT NAME FROM tb_dept WHERE id IN(SELECT dept_id FROM tb_emp WHERE salary > 4000)

3.需求:查詢開(kāi)發(fā)部與財(cái)務(wù)部所有的員工信息
a.查詢出開(kāi)發(fā)部和財(cái)務(wù)部的編號(hào)
SELECT id FROM tb_dept WHERE NAME = '開(kāi)發(fā)部' || NAME = '財(cái)務(wù)部';
b.再查詢出這個(gè)部門下的員工信息
SELECT * FROM tb_emp WHERE dept_id IN (SELECT id FROM tb_dept WHERE NAME = '開(kāi)發(fā)部' || NAME = '財(cái)務(wù)部');

第三種情況:子查詢的結(jié)果是多行多列(查詢出來(lái)就是一個(gè)新表(虛表)各吨,直接當(dāng)表使用)
4.需求查詢出2011年以后入職的員工信息,包括部門名稱
a.查詢出2011年之后的員工信息
SELECT * FROM tb_emp WHERE join_date >= '2011-01-01'
b.把新查詢出的員工表(2011年之后的員工)與部門表左外連接
SELECT * FROM (SELECT * FROM tb_emp WHERE join_date >= '2011-01-01') new_emp LEFT JOIN tb_dept d
ON new_emp.dept_id = d.id;

多表查詢練習(xí)題

-- 部門表
CREATE TABLE dept (
id INT PRIMARY KEY PRIMARY KEY, -- 部門id
dname VARCHAR(50), -- 部門名稱
loc VARCHAR(50) -- 部門位置
);

-- 添加4個(gè)部門
INSERT INTO dept(id,dname,loc) VALUES
(10,'教研部','北京'),
(20,'學(xué)工部','上海'),
(30,'銷售部','廣州'),
(40,'財(cái)務(wù)部','深圳');

-- 職務(wù)表袁铐,職務(wù)名稱揭蜒,職務(wù)描述
CREATE TABLE job (
id INT PRIMARY KEY,
jname VARCHAR(20),
description VARCHAR(50)
);

-- 添加4個(gè)職務(wù)
INSERT INTO job (id, jname, description) VALUES
(1, '董事長(zhǎng)', '管理整個(gè)公司,接單'),
(2, '經(jīng)理', '管理部門員工'),
(3, '銷售員', '向客人推銷產(chǎn)品'),
(4, '文員', '使用辦公軟件');

-- 員工表
CREATE TABLE emp (
id INT PRIMARY KEY, -- 員工id
ename VARCHAR(50), -- 員工姓名
job_id INT, -- 職務(wù)id
mgr INT , -- 上級(jí)領(lǐng)導(dǎo)
joindate DATE, -- 入職日期
salary DECIMAL(7,2), -- 工資
bonus DECIMAL(7,2), -- 獎(jiǎng)金
dept_id INT, -- 所在部門編號(hào)
CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id),
CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (id)
);

-- 添加員工
INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES
(1001,'孫悟空',4,1004,'2000-12-17','8000.00',NULL,20),
(1002,'盧俊義',3,1006,'2001-02-20','16000.00','3000.00',30),
(1003,'林沖',3,1006,'2001-02-22','12500.00','5000.00',30),
(1004,'唐僧',2,1009,'2001-04-02','29750.00',NULL,20),
(1005,'李逵',4,1006,'2001-09-28','12500.00','14000.00',30),
(1006,'宋江',2,1009,'2001-05-01','28500.00',NULL,30),
(1007,'劉備',2,1009,'2001-09-01','24500.00',NULL,10),
(1008,'豬八戒',4,1004,'2007-04-19','30000.00',NULL,20),
(1009,'羅貫中',1,NULL,'2001-11-17','50000.00',NULL,10),
(1010,'吳用',3,1006,'2001-09-08','15000.00','0.00',30),
(1011,'沙僧',4,1004,'2007-05-23','11000.00',NULL,20),
(1012,'李逵',4,1006,'2001-12-03','9500.00',NULL,30),
(1013,'小白龍',4,1004,'2001-12-03','30000.00',NULL,20),
(1014,'關(guān)羽',4,1007,'2002-01-23','13000.00',NULL,10);

-- 工資等級(jí)表
CREATE TABLE salarygrade (
grade INT PRIMARY KEY,
losalary INT,
hisalary INT
);

-- 添加5個(gè)工資等級(jí)
INSERT INTO salarygrade(grade,losalary,hisalary) VALUES
(1,7000,12000),
(2,12010,14000),
(3,14010,20000),
(4,20010,30000),
(5,30010,99990);

1.查詢所有員工信息昭躺。顯示員工編號(hào)忌锯,員工姓名,工資领炫,職務(wù)名稱偶垮,職務(wù)描述

-- a.明確表:?jiǎn)T工表,職務(wù)表
-- b.連接表:左連接
SELECT e.id , e.ename , e.salary, j.jname , j.description
FROM emp e LEFT JOIN job j ON e.job_id = j.id;

2.查詢所有員工信息。顯示員工編號(hào)似舵,員工姓名脚猾,工資,職務(wù)名稱砚哗,職務(wù)描述龙助,部門名稱,部門位置

-- a.明確表:?jiǎn)T工表蛛芥,職務(wù)表,部門表
-- b.連接表:左連接
SELECT e.id, e.ename , e.salary , j.jname, j.description , d.dname, d.loc
FROM emp e LEFT JOIN job j ON e.job_id= j.id LEFT JOIN dept d
ON e.dept_id= d.id

不考慮員工沒(méi)有部門和職位的人提鸟!

--SELECT * FROM emp e INNER JOIN job j INNER JOIN dept d ON e.job_id=j.id AND e.dept_id=d.id;

3.查詢所有員工信息。顯示員工姓名仅淑,工資称勋,職務(wù)名稱,職務(wù)描述涯竟,部門名稱赡鲜,部門位置,工資等級(jí)

-- a.明確表:?jiǎn)T工表庐船,職務(wù)表, 部門表 ,工資等級(jí)表
-- b.連接表:左連接
-- 最通用做法:

SELECT e.ename,e.salary,j.jname,j.description,d.dname,d.loc, sg.grade , sg.losalary,sg.hisalary FROM emp e LEFT JOIN job j ON e.job_id=j.id
LEFT JOIN dept d ON e.dept_id= d.id
JOIN salarygrade sg ON e.salary BETWEEN sg.losalary AND sg.hisalary

4.查詢經(jīng)理的信息银酬。顯示員工姓名,工資筐钟,職務(wù)名稱揩瞪,職務(wù)描述,部門名稱篓冲,部門位置壮韭,工資等級(jí)

SELECT * FROM emp e JOIN JOB j ON e.job_id = j.id AND j.jname='經(jīng)理'
JOIN dept d ON e.dept_id= d.id
JOIN salarygrade sg ON e.salary BETWEEN sg.losalary AND sg.hisalary

5.查詢出部門編號(hào)、部門名稱纹因、部門位置、部門人數(shù)

-- a.簡(jiǎn)單粗暴連接表:dept , emp
-- 1.直接到員工表根據(jù)部門id分組查詢
SELECT COUNT() , dept_id FROM emp GROUP BY dept_id;
-- 2.拿著部門員工的信息數(shù)據(jù)與部門表實(shí)現(xiàn)右連接
SELECT * FROM (SELECT COUNT(
) , dept_id FROM emp GROUP BY dept_id) new_emp_nums RIGHT JOIN
dept d ON new_emp_nums.dept_id = d.id;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末琳拨,一起剝皮案震驚了整個(gè)濱河市瞭恰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狱庇,老刑警劉巖惊畏,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異密任,居然都是意外死亡颜启,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門浪讳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)缰盏,“玉大人,你說(shuō)我怎么就攤上這事】诓拢” “怎么了负溪?”我有些...
    開(kāi)封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)济炎。 經(jīng)常有香客問(wèn)我川抡,道長(zhǎng),這世上最難降的妖魔是什么须尚? 我笑而不...
    開(kāi)封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任崖堤,我火速辦了婚禮,結(jié)果婚禮上耐床,老公的妹妹穿的比我還像新娘密幔。我一直安慰自己,他們只是感情好咙咽,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布老玛。 她就那樣靜靜地躺著,像睡著了一般钧敞。 火紅的嫁衣襯著肌膚如雪蜡豹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天溉苛,我揣著相機(jī)與錄音镜廉,去河邊找鬼。 笑死愚战,一個(gè)胖子當(dāng)著我的面吹牛娇唯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寂玲,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼塔插,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了拓哟?” 一聲冷哼從身側(cè)響起想许,我...
    開(kāi)封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎断序,沒(méi)想到半個(gè)月后流纹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡违诗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年漱凝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诸迟。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茸炒,死狀恐怖愕乎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扣典,我是刑警寧澤妆毕,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站贮尖,受9級(jí)特大地震影響笛粘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜湿硝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一薪前、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧关斜,春花似錦示括、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至丁稀,卻和暖如春吼拥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背线衫。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工凿可, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人授账。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓枯跑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親白热。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敛助,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1. 了解SQL 1.1 數(shù)據(jù)庫(kù)基礎(chǔ) ? 學(xué)習(xí)到目前這個(gè)階段,我們就需要以某種方式與數(shù)據(jù)庫(kù)打交道屋确。在深入學(xué)習(xí)MyS...
    鋒享前端閱讀 1,042評(píng)論 0 1
  • mysql數(shù)據(jù)庫(kù)中 :database : 文件夾table : 數(shù)據(jù)表(數(shù)據(jù)文件) 進(jìn)入mysqlmysql -...
    賦閑閱讀 558評(píng)論 0 0
  • 5.多表查詢 多表查詢 目的:從多張表獲取數(shù)據(jù) 前提:進(jìn)行連接的多張表中有共同的列 等連接 通過(guò)兩個(gè)表具有相同意義...
    喬震閱讀 1,198評(píng)論 0 0
  • 數(shù)據(jù)庫(kù)的概述 1.數(shù)據(jù)庫(kù)的作用:倉(cāng)庫(kù)辜腺,存儲(chǔ)數(shù)據(jù)。 2.關(guān)系型的數(shù)據(jù)庫(kù)乍恐,保存實(shí)體與實(shí)體之間的關(guān)系。 3.常見(jiàn)的數(shù)據(jù)庫(kù)...
    三萬(wàn)_chenbing閱讀 896評(píng)論 0 3
  • 【1223打卡話題】 今天的文章《格局》 你有什么感悟测砂? 奇才 剛剛看了一段視頻茵烈,一個(gè)美國(guó)人,20多歲了砌些,學(xué)會(huì)20...
    石三英語(yǔ)閱讀 155評(píng)論 0 1