成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

mysql - 一個(gè)sql查詢(xún)的題目,望路過(guò)大神看下

瀏覽:146日期:2022-06-17 11:59:44

問(wèn)題描述

mysql - 一個(gè)sql查詢(xún)的題目,望路過(guò)大神看下

1.上圖兩個(gè)表,要求找出掌握Skills中全部3個(gè)技能的員工,即神崎和相田,要求用mysql的語(yǔ)句實(shí)現(xiàn)

2.剛學(xué)sql,不是很會(huì),想了好久

3.下面是書(shū)里面用sql server寫(xiě)的,我也不是很理解,另外mysql中沒(méi)有except

SELECT DISTINCT emp FROM EmpSkills ES1 WHERE NOT EXISTS(SELECT skill FROM Skills EXCEPT SELECT skill FROM EmpSkills ES2 WHERE ES1.emp = ES2.emp);

問(wèn)題解答

回答1:

SELECT DISTINCT emp FROM EmpSkills s WHERE NOT exists(SELECT skill FROM skills WHERE skill NOT IN (SELECT skill FROM EmpSkills Es2 WHERE Es2.emp = s.emp));

對(duì)應(yīng)的數(shù)據(jù)替換一下就可以了.

回答2:

那段SQL所表達(dá)的意思大概是:

如果一個(gè)員工他所掌握的那些skill,從Skills列表里刨除后列表為空了,那么選出這個(gè)員工。

注意except后面是這個(gè)員工掌握的所有skill。

回答3:

1.無(wú)論是SQL書(shū)籍,還是網(wǎng)上的資料,都喜歡寫(xiě)很長(zhǎng)、很復(fù)雜的SQL語(yǔ)句,這樣做其實(shí)是不對(duì)的。因?yàn)檫^(guò)長(zhǎng)、過(guò)于復(fù)雜的SQL語(yǔ)句,不利于結(jié)構(gòu)設(shè)計(jì)、代碼書(shū)寫(xiě)、調(diào)試、維護(hù)、項(xiàng)目移交等。

2.正確的思路,應(yīng)該是保證每條語(yǔ)句盡量簡(jiǎn)單,長(zhǎng)度盡量少。多使用變量、表變量、臨時(shí)表來(lái)降低復(fù)雜度,多使用函數(shù)、存儲(chǔ)過(guò)程、視圖來(lái)增加復(fù)用性與減少耦合及代碼冗余。

回答4:

個(gè)人疑問(wèn):題目描述是不是不太準(zhǔn)確?要求找出會(huì)Skills中3個(gè)技能的員工 如果存在某員工不僅掌握這3個(gè)技能還掌握了其他技能這樣的員工會(huì)被書(shū)中的sql語(yǔ)句篩選出去或者題目是不是應(yīng)該修改為 掌握并只掌握skills表中所有技能的員工?

回答5:

問(wèn)題的核心是,如何在SQL中表示集合A的所有成員都在集合B中。用的是否定之否定的邏輯:不存在集合A的成員不在集合B中

集合A:Skills表的所有記錄集合B: EmpSkills表是每個(gè)員工對(duì)應(yīng)的記錄

SQL的邏輯變類(lèi)的過(guò)程:1、找出EmpSkill的所有員工

去除每個(gè)員工在EmpSkill表中對(duì)應(yīng)的skill

按照上面所說(shuō)的“否定之否定”條件,判斷員工是否擁有Skills表中的所有skill

另外一個(gè)思路,先構(gòu)建出員工、技能對(duì)矩陣,然后看是否在EmpSkill表中,如果存在的話(huà)說(shuō)明技能不全,作為排除條件,sql大概是這樣的:

select distinct empfrom EmpSkillswhere emp not in ( select distinct t1.emp from (select distinct emp from EmpSkills) t1 inner join Skills t2 where not exists (select 1 from EmpSkills t3 where t3.emp = t1.emp and t2.skill))回答6:

SELECT a.emp,SUM((CASE WHEN a.skill=’Oracle’ THEN 1 ELSE 0 END) + (CASE WHEN a.skill=’UNIX’ THEN 1 ELSE 0 END) + (CASE WHEN a.skill=’Java’ THEN 1 ELSE 0 END)) AS count FROM empskills a JOIN skills b ON a.skill = b.skill GROUP BY a.emp HAVING count = 3